]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.browsing.ui.swt/src/org/simantics/browsing/ui/swt/contentassist/ContentAssistTextField.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.browsing.ui.swt / src / org / simantics / browsing / ui / swt / contentassist / ContentAssistTextField.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2012 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.browsing.ui.swt.contentassist;\r
13 \r
14 import java.util.Arrays;\r
15 import java.util.Collection;\r
16 import java.util.Map;\r
17 import java.util.TreeMap;\r
18 \r
19 import org.eclipse.jface.fieldassist.IContentProposal;\r
20 import org.eclipse.jface.fieldassist.IContentProposalListener;\r
21 import org.eclipse.jface.fieldassist.TextContentAdapter;\r
22 import org.eclipse.jface.layout.GridDataFactory;\r
23 import org.eclipse.jface.layout.GridLayoutFactory;\r
24 import org.eclipse.swt.SWT;\r
25 import org.eclipse.swt.events.FocusEvent;\r
26 import org.eclipse.swt.events.FocusListener;\r
27 import org.eclipse.swt.events.KeyAdapter;\r
28 import org.eclipse.swt.events.KeyEvent;\r
29 import org.eclipse.swt.events.ModifyEvent;\r
30 import org.eclipse.swt.events.ModifyListener;\r
31 import org.eclipse.swt.events.TraverseEvent;\r
32 import org.eclipse.swt.events.TraverseListener;\r
33 import org.eclipse.swt.widgets.Composite;\r
34 import org.eclipse.swt.widgets.Text;\r
35 \r
36 \r
37 /**\r
38  * @author Tuukka Lehtonen\r
39  *\r
40  * @param <T>\r
41  */\r
42 public class ContentAssistTextField extends Composite {\r
43 \r
44     private static final boolean DEBUG = false;\r
45     \r
46     Text text;\r
47     INamedObject acceptedProposal;\r
48     INamedObject result;\r
49     OpenableContentAssistCommandAdapter contentAssist;\r
50 \r
51     public <T extends INamedObject> ContentAssistTextField(final Composite parent, T initialValue, final T[] allowedValues, int style) {\r
52         this(parent, initialValue, Arrays.asList(allowedValues), style);\r
53     }\r
54 \r
55     public <T extends INamedObject> ContentAssistTextField(final Composite parent, T initialValue, final Collection<T> allowedValues, int style) {\r
56         super(parent, style);\r
57         this.result = initialValue;\r
58 \r
59         GridLayoutFactory.fillDefaults().applyTo(this);\r
60 \r
61         text = new Text(this, style);\r
62         text.setText(initialValue == null ? "" : initialValue.getName());\r
63         GridDataFactory.fillDefaults().grab(true, true).applyTo(text);\r
64 \r
65         final Map<String, INamedObject> valueMap = new TreeMap<String, INamedObject>(String.CASE_INSENSITIVE_ORDER);\r
66         for (T t : allowedValues) {\r
67             valueMap.put(t.getName(), t);\r
68         }\r
69 \r
70         contentAssist = new OpenableContentAssistCommandAdapter(text,\r
71                 new TextContentAdapter(),\r
72                 new NamedObjectContentProposalProvider<T>(allowedValues),\r
73                 (String) null,\r
74                 (char[]) null,\r
75                 true\r
76         );\r
77         contentAssist.addContentProposalListener(new IContentProposalListener() {\r
78             @Override\r
79             public void proposalAccepted(IContentProposal proposal) {\r
80                 if (DEBUG)\r
81                     System.out.println("accepted: " + proposal);\r
82                 acceptedProposal = ((INamedObjectContentProposal) proposal).getNamedObject();\r
83                 ContentAssistTextField.this.result = acceptedProposal;\r
84                 text.setText(acceptedProposal.getName());\r
85                 text.setSelection(acceptedProposal.getName().length());\r
86                 //text.selectAll();\r
87             }\r
88         });\r
89 \r
90         text.addModifyListener(new ModifyListener() {\r
91             @Override\r
92             public void modifyText(ModifyEvent e) {\r
93                 String t = text.getText();\r
94                 if (DEBUG) {\r
95                     System.out.println("text: " + t);\r
96                     System.out.println("value set: " + valueMap);\r
97                 }\r
98                 INamedObject obj = valueMap.get(t);\r
99                 if (obj == null) {\r
100                     result = null;\r
101                     if (DEBUG)\r
102                         System.out.println("no result");\r
103                     contentAssist.open();\r
104                 } else {\r
105                     result = obj;\r
106                     if (DEBUG)\r
107                         System.out.println("result: " + result);\r
108                 }\r
109             }\r
110         });\r
111         text.addKeyListener(new KeyAdapter() {\r
112 \r
113             @Override\r
114             public void keyPressed(KeyEvent e) {\r
115                 if(e.keyCode == SWT.CR) {\r
116                     String name = text.getText();\r
117                     if (DEBUG)\r
118                         System.out.println("CR: " + name);\r
119                     if(name.isEmpty()) {\r
120                         return;\r
121                     }\r
122                     if(acceptedProposal == null)\r
123                         acceptedProposal = FindExactMatch.exec(name, allowedValues);\r
124                     if(acceptedProposal == null)\r
125                         contentAssist.open();\r
126                     else {\r
127                         ContentAssistTextField.this.result = acceptedProposal;\r
128                         //text.setText(acceptedProposal.getName());\r
129                         //text.traverse(SWT.TRAVERSE_TAB_NEXT);\r
130                         //text.traverse(SWT.TRAVERSE_RETURN);\r
131                     }\r
132                 }\r
133             }\r
134 \r
135         });\r
136         text.addFocusListener(new FocusListener() {\r
137 \r
138             TraverseListener listener = new TraverseListener() {\r
139                 @Override\r
140                 public void keyTraversed(TraverseEvent e) {\r
141 //                    System.out.println("CA TraverseListener PARENT TRAVERSE: " + e.detail);\r
142                     if (e.detail == SWT.TRAVERSE_RETURN) {\r
143                         e.doit = false;\r
144                     }\r
145                 }\r
146             };\r
147 \r
148             @Override\r
149             public void focusLost(FocusEvent e) {\r
150                 parent.removeTraverseListener(listener);\r
151             }\r
152 \r
153             @Override\r
154             public void focusGained(FocusEvent e) {\r
155                 parent.addTraverseListener(listener);\r
156             }\r
157         });\r
158 \r
159         contentAssist.setPropagateKeys(true);\r
160     }\r
161 \r
162     public INamedObject getResult() {\r
163         return result;\r
164     }\r
165 \r
166     public Text getControl() {\r
167         return text;\r
168     }\r
169 \r
170     public void openAssist() {\r
171         contentAssist.open();\r
172     }\r
173 \r
174 }\r