import java.util.ArrayList;

public class ThinkCombo {

    /**
     * @author zwb
     */
    static List<String> list = new ArrayList<String>();
    static {
        list.add("one");
        list.add("two");
        list.add("three");
        list.add("four");
        list.add("five");
        list.add("six");
        list.add("seven");
        list.add("eight");
        list.add("nine");
        list.add("ten");
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        Display display = Display.getDefault();
        Shell shell = new Shell(display);
        shell.setText("ThinkComboDemo");
        shell.setLayout(new GridLayout(2, false));

        Label label = new Label(shell, SWT.CENTER);
        label.setText("select");

        final Combo combo = new Combo(shell, SWT.BORDER);
        GridData com_data = new GridData();
        com_data.widthHint = 204;
        com_data.horizontalAlignment = GridData.FILL;
        com_data.grabExcessVerticalSpace = true;
        combo.setLayoutData(com_data);

        combo.setVisibleItemCount(5);
        combo.clearSelection();

        for (int k = 0; k < list.size(); k++) {
            combo.add(list.get(k));
        }

        // 注册事件
        combo.addListener(SWT.KeyUp, new Listener() {
            @Override
            public void handleEvent(Event event) {
                if (event.keyCode == 13) {
                    combo.setListVisible(false);
                } else if (event.keyCode != SWT.ARROW_DOWN && event.keyCode != SWT.ARROW_UP) {
                    // 添加延迟
                    try {
                        Thread.sleep(500);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    if (null != combo.getText() && !combo.getText().trim().equalsIgnoreCase("")) {
                        String temp_str = combo.getText();
                        List<String> val_result = validate(temp_str);

                        combo.removeAll();

                        // combo.setText(temp_str);

                        for (int k = 0; k < val_result.size(); k++) {
                            combo.add(val_result.get(k));
                        }

                        combo.setListVisible(true);

                        //位置不能改变
                        combo.setText(temp_str);
                        // 控制光标的位置
                        int y = combo.getSelection().y;

                        combo.setSelection(new Point(temp_str.length() + 1, y));
                        combo.clearSelection();
                    } else {
                        combo.setListVisible(false);
                        combo.removeAll();
                        for (int k = 0; k < list.size(); k++) {
                            combo.add(list.get(k));
                        }
                    }
                }
            }
        });

        shell.setSize(300, 300);
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
    }

    // 验证是否匹配
    public static List<String> validate(String text) {
        String val_str = null;

        if ('*' != text.charAt(text.length() - 1)) {
            text = text + "*";
        }

        if (text.indexOf("*") > -1) {
            // 此处进行替换*o
            val_str = text.replace("*", "\\w*");
        }

        // 防止有.的出现
        val_str = val_str.replace(".", "\\.");

        Pattern pattern = Pattern.compile(val_str);

        // 验证list中是否匹配
        List<String> temp_list = new ArrayList<String>();
        for (int k = 0; k < list.size(); k++) {
            Matcher mat = pattern.matcher(list.get(k).trim());
            if (mat.matches()) {
                temp_list.add(list.get(k));
            }
        }
        return temp_list;
    }
}