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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.browsing.ui.swt.contentassist;
\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
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
38 * @author Tuukka Lehtonen
\r
42 public class ContentAssistTextField extends Composite {
\r
44 private static final boolean DEBUG = false;
\r
47 INamedObject acceptedProposal;
\r
48 INamedObject result;
\r
49 OpenableContentAssistCommandAdapter contentAssist;
\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
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
59 GridLayoutFactory.fillDefaults().applyTo(this);
\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
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
70 contentAssist = new OpenableContentAssistCommandAdapter(text,
\r
71 new TextContentAdapter(),
\r
72 new NamedObjectContentProposalProvider<T>(allowedValues),
\r
77 contentAssist.addContentProposalListener(new IContentProposalListener() {
\r
79 public void proposalAccepted(IContentProposal proposal) {
\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
90 text.addModifyListener(new ModifyListener() {
\r
92 public void modifyText(ModifyEvent e) {
\r
93 String t = text.getText();
\r
95 System.out.println("text: " + t);
\r
96 System.out.println("value set: " + valueMap);
\r
98 INamedObject obj = valueMap.get(t);
\r
102 System.out.println("no result");
\r
103 contentAssist.open();
\r
107 System.out.println("result: " + result);
\r
111 text.addKeyListener(new KeyAdapter() {
\r
114 public void keyPressed(KeyEvent e) {
\r
115 if(e.keyCode == SWT.CR) {
\r
116 String name = text.getText();
\r
118 System.out.println("CR: " + name);
\r
119 if(name.isEmpty()) {
\r
122 if(acceptedProposal == null)
\r
123 acceptedProposal = FindExactMatch.exec(name, allowedValues);
\r
124 if(acceptedProposal == null)
\r
125 contentAssist.open();
\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
136 text.addFocusListener(new FocusListener() {
\r
138 TraverseListener listener = new TraverseListener() {
\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
149 public void focusLost(FocusEvent e) {
\r
150 parent.removeTraverseListener(listener);
\r
154 public void focusGained(FocusEvent e) {
\r
155 parent.addTraverseListener(listener);
\r
159 contentAssist.setPropagateKeys(true);
\r
162 public INamedObject getResult() {
\r
166 public Text getControl() {
\r
170 public void openAssist() {
\r
171 contentAssist.open();
\r