001package polaris.sdk.ui.controls; 002import polaris.sdk.ui.*; 003 004public class Tabs extends Panel {private int selected;public Tabs(){h=220;w=400;focusable=true;clipChildren=true;} 005 public Tabs page(TabPage page){add(page);return this;}public int selectedIndex(){return selected;} 006 public void select(int index){if(index<0||index>=children.size())throw new IllegalArgumentException("tab index");boolean change=selected!=index;selected=index;if(change)children.get(index).appear();changed();} 007 @Override protected void layoutChildren(){for(int i=0;i<children.size();i++){Widget c=children.get(i);c.visible(i==selected);c.bounds(padding,Spacing.COMPACT_INSET+32+gap,Math.max(0,w-2*padding),Math.max(0,h-(Spacing.COMPACT_INSET+32+gap)-padding));}} 008 @Override protected void paint(Painter p){super.paint(p);if(children.isEmpty())return;float tw=w/children.size(),xx=ax+motion("tabX",selected*tw,25,.72f);glassPart(p,xx+5,ay+5,tw-10,32,theme().radius,theme().selectedTint,theme().accent,.26f,theme().blur);for(int i=0;i<children.size();i++){String s=children.get(i).text();p.textWeight(s,ax+i*tw+(tw-p.textWidth(s,13,500))/2,ay+14,13,i==selected?theme().text:theme().muted,500);}p.line(ax+13,ay+43,ax+w-13,ay+43,1,theme().border);} 009 @Override public void event(UiEvent e){if(children.isEmpty())return;if(e.type==UiEvent.Type.UP&&e.y<ay+42){select(Math.max(0,Math.min(children.size()-1,(int)((e.x-ax)/(w/children.size())))));}else if(e.type==UiEvent.Type.KEY&&(e.key==37||e.key==39)){select((selected+(e.key==39?1:children.size()-1))%children.size());e.handled=true;}} 010}