001package polaris.sdk.ui.controls;
002import polaris.sdk.ui.*;
003
004import java.util.*;
005public class CommandPalette extends Modal {
006 private static final class Command{String name;Runnable action;Command(String n,Runnable r){name=n;action=r;}}
007 private final java.util.List<Command> commands=new ArrayList<Command>(),filtered=new ArrayList<Command>();private final ListBox choices=new ListBox();private final SearchField query;
008 public CommandPalette(){super("命令面板");w=570;h=400;query=new SearchField(){@Override public void event(UiEvent e){if(e.type==UiEvent.Type.KEY&&(e.key==38||e.key==40)){choices.event(e);return;}super.event(e);}};query.placeholder("搜索命令…");query.bounds(22,67,526,38);query.onChange(w->filter());query.onSubmit(s->execute());add(query);choices.bounds(22,119,526,253);choices.onClick(w->execute());choices.onDoubleClick(i->execute());add(choices);}
009 public CommandPalette command(String title,Runnable action){commands.add(new Command(title,action));filter();return this;}
010 public int resultCount(){return filtered.size();}public void search(String text){query.value(text);filter();}
011 private void filter(){String term=query.value().toLowerCase(Locale.ROOT);filtered.clear();java.util.List<String> names=new ArrayList<String>();for(Command c:commands)if(c.name.toLowerCase(Locale.ROOT).contains(term)){filtered.add(c);names.add(c.name);}choices.items(names);}
012 private void execute(){int i=choices.selectedIndex();if(i>=0&&i<filtered.size()){Runnable action=filtered.get(i).action;close();if(action!=null)action.run();}}
013 @Override public void attach(Ui context){super.attach(context);if(context!=null){query.value("");filter();}}
014}