[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| [platform-swt-dev] ComboAutoComplete | 
Hello,
If someone is interested, you can take a look at finished(? ;D) auto
complete combo class.
Current errata: if incorrect char is inserted within middle of text it don't
resets to the character, but removes it, deselects and jumps to end of text.
Code: ----------------------------------------------------------------------
-------
package lv.raksta.swt.widgets;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
/**
 * Created by IntelliJ IDEA.
 * User: karlisz
 * Date: 2003.3.12
 * Time: 13:19:34
 * To change this template use Options | File Templates.
 */
public class ComboAutoComplete extends Combo {
    public ComboAutoComplete(Composite composite, int i) {
        super(composite, i);
        this.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent event) {
                updateText();
            }
        });
    }
    private void updateText() {
        //empty autocomplete boxes should be disabled, so no unpleasant
errors can happen.
        int count = getItemCount();
        if (count == 0) {
            setEnabled(false);
            return;
        } else {
            setEnabled(true);
        }
        //if no data selected/entered let's activate first one
        if (getText().equalsIgnoreCase("")) {
            select(0);
            return;
        }
        String[] entries = getItems();
        String text = getText();
        //first check, case sensitive (avoids hiding values with different
cases)
        for (int i = 0; i < entries.length; i++) {
            //search for match
            if (entries[i].startsWith(text)) {
                select(i);
                Point selection = new Point(text.length(),
entries[i].length());
                setSelection(selection);
                redraw();
                return;
            }
        }
        //second - case insensitive
        for (int i = 0; i < entries.length; i++) {
            //search for match
            if (entries[i].toLowerCase().startsWith(text.toLowerCase())) {
                select(i);
                Point selection = new Point(text.length(),
entries[i].length());
                setSelection(selection);
                redraw();
                return;
            }
        }
        //third - fallback to previous character
        String oldString = getText();
        String newString = oldString.substring(0, oldString.length() - 1);
        setText(newString);
        Point point = new Point(newString.length(), newString.length());
        setSelection(point);
    }
    protected void checkSubclass() {
        //nah, disable subclass check.
    }
}
------------------------------------------------------
Karlis Zigurs