Skip to main content

[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



Back to the top