Auto complétion dans un ComboViewer
Bonjour,
Je cherche à faire une sorte d'autocomplétion sur un comboViewer.
Par défaut, pour un ComboViwer, à chaque caractère tapé, la recherche se réinitialise.
J'ai essayé de faire un nouveau ComboViewer, qui marche bien à la saisie, mais lorsque je change de focus, la valeur affichée n'est pas la bonne (il met la valeur trouvée pour le dernier caractère tapé :cry:).
Voici mon code, si quelqu'un a une idée pour que la sélection soit bonne, ou si une personne a un meilleur code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
/**
* AutoCompleteComboViewer
* permet une meilleur gestion de l'autocomplétion clavier
* Forcé en read only
* *
*/
public class AutoCompleteComboViewer extends ComboViewer {
private Combo combo;
private String selection;
private int maxLength = 0;
public AutoCompleteComboViewer(Composite parent) {
this(parent, SWT.READ_ONLY | SWT.BORDER);
}
/**
*
* @param parent
* @param style => forcé en READ_ONLY
*/
public AutoCompleteComboViewer(Composite parent, int style) {
super(parent, SWT.READ_ONLY );
combo = getCombo();
selection="";
combo.setVisibleItemCount( 40 );
combo.addKeyListener( new KeyListener(){
public void keyPressed( KeyEvent pArg0 ) {
if(!"".equals( selection ))
{
for(String item : combo.getItems())
{
if (item.length() > maxLength){
maxLength = item.length();
}
}
if (selection.length() >= maxLength){
selection = "";
}
}
selection=(selection+pArg0.character).toUpperCase();
}
public void keyReleased( KeyEvent pArg0 ) {
if(!"".equals( selection ))
{
int i = 0 ;
for(String item : combo.getItems())
{
if(item.startsWith( selection ))
{
combo.select( i );
listSetSelection(new int[]{i});
return;
}
i++;
}
//si non trouvé, on réinit
selection = (""+pArg0.character).toUpperCase();
int j = 0 ;
for(String item : combo.getItems())
{
if(item.startsWith( selection ))
{
combo.select( j );
return;
}
j++;
}
}
}
});
combo.addFocusListener( new FocusListener(){
public void focusGained( FocusEvent pArg0 ) {
selection="";
}
public void focusLost( FocusEvent pArg0 ) {
}
});
}
} |
Merci