import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.awt.Image.*;
import java.awt.image.*;
import java.awt.Graphics.*;
import java.lang.*;
import java.lang.Character.*;
public class Bu extends LP
 {
  long tympa,tympb;
  long tymra,tymrb;
  long dtyme=300;
  long dtp=0;
  long dtr=0;
  boolean edok=false;
  CC cc;
  int i=0;
  int centery;
  boolean lb=false;
  static FontMetrics ftm;
  static Font ft;
  static int ftsize=10;
  static int ftstyle=ivoftstyle("plain");
  static String ftname="Default";
  Img img;
  //Rec body;
  int enabled=2;
  Rec labelbutton=new Rec(5,0,22,16,new K(Color.black),new K(240,240,0));
  //Te te;
  dP labeldp;
  K ftk=new K(Color.yellow);
  String type;
  String[] labels;
  K[] ka,kb;
  String label,labelb;
  public Bu() { super(); }
  public Bu(String name,LP lp,String type,String[] labels,int i,boolean lb,dP tl)
   {
    super();
    hostlp=lp;
    hosttype="LP";
    this.labels=labels;
    this.i=i;
    if(tl.eq(new dP(-1000,-1000))) this.tl=new dP(0,hostlp.nexty);
    else this.tl=tl;
    if(type.equals("hugerotary"))
     {
      body=new Rec(0,0,hostlp.getSize().width,sixty,new K(220,200,150),new K(125,50,10));
      labelbutton=new Rec(5,0,36,24,new K(Color.black),new K(240,240,0));
     }
    else body=new Rec(0,0,hostlp.getSize().width,thirty,new K(220,200,150),new K(125,50,10));
    hostlp.nextx=0;
    rec=new Rec(tl.x,tl.y,body.wi,body.hi);
    //tta("name:"+name+"  type:"+type+" labels:"+Te.Svo(labels)+" lb:"+lb); 
    labelcomm(name,type,labels[i],lb);
   }
  public void labelcomm(String name,String type,String label,boolean lb)
   {
    this.name=name;
    this.label=label;
    host=hostlp.name;
    this.type=type;
    this.lb=lb;
    ftsize=14;
    ftname="Default";
    ftstyle=ivoftstyle("plain");
    labelbutton.sety(body.hi/2-labelbutton.hi/2);
    this.body=body;
    setlabeldp();
    te=parent.te;
    setBackground(body.fk.c);
    rec=new Rec(tl.x,tl.y,body.wi,body.hi);
    Te.Buh.put(name,this);
    attach();
    setBounds(rec.xi,rec.yi,rec.wi,rec.hi);
    setLayout(null);
    addMouseListener(this);
    addMouseMotionListener(this);
    pw=1;
    init();
    onsg=(Graphics2D)getGraphics();
    setft(true);
    hostlp.nexty+=body.hi;
    hostlp.nextx+=body.wi;
    render();
    tympa=System.currentTimeMillis();
    tymra=tympa;
   }
  public void reset()
   {
    attach();
    addMouseListener(this);
    addMouseMotionListener(this);
    render();
   }
  public void settl(dP tl)
   {
    this.tl=tl;
    rec=new Rec(tl.x,tl.y,body.wi,body.hi);
    setBounds(rec.xi,rec.yi,rec.wi,rec.hi);
    onsg=(Graphics2D)getGraphics();
    render();
   }
  public void setlabeldp()
   {
    if(lb) labeldp=new dP(labelbutton.xi+labelbutton.wi+8,body.hi/2+labelbutton.hi/2);
    else labeldp=new dP(8,body.hi/2+ftsize/2-3);
   }
  public void setlabel(String label,boolean lb)
   {
    this.label=label;
    this.lb=lb;
    setlabeldp();
    render();
    hostlp.repaint();
   }
  public void paintComponent(Graphics g)
   {
    if(hostlp.getSize().width != body.wi)
     {
      body.setw(hostlp.getSize().width);
      rec.setw(hostlp.getSize().width);
      setSize(new Dimension(rec.wi,rec.hi));
      setBounds(rec.xi,rec.yi,rec.wi,rec.hi);
      init();
      render();
     }
    if(offsimg != null) g.drawImage(offsimg,0,0,this);
   }
  public void render()
   {
    if(img != null) drawImg(img);
    else if(label != null)
     {
      body.fill3Dfk(offsg);
      setft(true);
      drawString(label,labeldp);
      if(lb) labelbutton.fill3Dfk(offsg);
     }
    repaint();
   }
  static void schleep(long zzz)
   {
    Thread thr=new Thread("main");
    try { thr.sleep(zzz); }
    catch(InterruptedException e) { }
   }
  public void mousePressed(MouseEvent e) 
   {
    mp=MEtodP(e);
    tldrgoff=mp;
    if(labelbutton.rect.contains(mp))
     {
      tympb=System.currentTimeMillis();
      dtp=tympb-tympa;
      tympa=tympb;
      if(dtp < dtyme) return;
      if(type.equals("momentary"))
       {
        runBuTrig(name+"mp");
        swender();
       }
      else if(type.equals("rotary") || type.equals("hugerotary") )
       {
        runBuTrig(name+"mp");
        swender();
       }
      else if(type.equals("chat")) cc.mp();
      else if(label !=null && lb)
       {
        runBuTrig(name+"mp");
        swender();
       }
     }
    else edok=true;
   }
  public void mouseDragged(MouseEvent e)
   {
    md=MEtodP(e);
    if(LP.edpos && edok)
     {
      int cx=0;
      int cy=0;
      if(md.x-tldrgoff.x>45)  cx=45;
      else if(tldrgoff.x - md.x>45) cx=-45;
      if(md.y-tldrgoff.y >= 36)  cy=36;
      else if(md.y-tldrgoff.y>=27)  cy=36;
      else if(md.y-tldrgoff.y>=18)  cy=27;
      else if(md.y-tldrgoff.y>=9)  cy=18;
      else if(md.y-tldrgoff.y>=0)  cy=9;
      else if(md.y-tldrgoff.y<= -9) cy=-9;
      else if(md.y-tldrgoff.y<= -18) cy=-18;
      else if(md.y-tldrgoff.y<= -27) cy=-27;
      if(cx !=0 || cy != 0)
       {
        tl.ae(cx,cy);
        settl(tl);
       }
     }
    else if(enabled>1)runBuTrig(name+"md");
   }
  public void mouseReleased(MouseEvent e) 
   {
    if(! edok)
     {
      tymrb=System.currentTimeMillis();
      dtr=tymrb-tymra;
      tymra=tymrb;
      if(dtr < dtyme)
       {
        if(dtp> dtyme) swender(); 
        return;
       }
      if(type.equals("momentary"))
       {
        runBuTrig(name+"mr");
        runBuTrig(name);
        if(dtp> dtyme) swender();
       }
      else if( type.equals("rotary") || type.equals("hugerotary"))
       {
        i++;
        if(i==labels.length) i=0;
        label=labels[i];
        runBuTrig(name+"mr");
        runBuTrig(name+i);
        runBuTrig(name);
        if(dtp> dtyme) swender();
       }
      else if(type.equals("chat")) cc.mr();
     }
    edok=false;
   }
  void swapk()
   {
    labelbutton.swapk();
    body.swapk();
   }
  void swender()
   {
    swapk();
    render();
   }
  void seti(int ji)
   {
    if( i==ji) return;
    this.i=ji;
    label=labels[i];
    render();
    tta("i:"+i+" ji:"+ji+" new label:"+label);
   }
  void setlabel(String label)
   {
    this.label=label;
    labels[i]=label;
    render();
   }
  void setlabels(String[] labels)
   {
    this.labels=labels;
    i=0;
    label=labels[i];
    render();
   }
  public void runBuTrig(String s) { if(enabled>1) te.runBuTrig(s); }
  void ed()
   {
    tta1(name+".type "+type);
    tta1(name+".tl "+Te.Svo(tl));
    tta1(name+".labels "+Te.Svo(labels));
    tta1(name+".i "+Te.Svo(i));
    if(label != null)
     {
      tta1(name+".ftname "+ftname);
      tta1(name+".ftstyle "+Svoftstyle(ftstyle));
      tta1(name+".ftsize "+ftsize);
     }
    tta1(name+".edpos "+Te.Svo(LP.edpos));
   }
  void setfk(K ftk) { this.ftk=ftk; }
  public void drawString(String s,dP tl)
   {
    if (offsimg != null) 
     {
      offsg.setColor(labelbutton.fk.c);
      offsg.drawString(s,tl.xi,tl.yi);
     }
   }
  public void drawImg(Img img)
   {
    if (offsimg != null) offsg.drawImage(img,0,0,this);
   }
  static int ivoftstyle(String s)
   {
    if(s.equals("bold")) return Font.BOLD;
    else if(s.equals("plain")) return Font.PLAIN;
    return -1;
   }
  static String Svoftstyle(Font f)
   {
    return Svoftstyle(f.getStyle());
   }
  static String Svoftstyle(int j)
   {
    if(j==Font.BOLD) return "bold";
    else if(j==Font.PLAIN) return "plain";
    return "unknown font style";
   }
  void setftname(String f)
   {
    ftname=f;
    setft(false);
   }
  void setftstyle(String s)
   {
    ftstyle=ivoftstyle(s);
    setft(false);
   }
  void setftsize(double d)
   {
    ftsize=(int)d;
    setft(false);
   }
  void setft() { setFont(ft); }
  void setft(boolean sf)
   {
    ft=new Font(ftname,ftstyle,ftsize);
    if(sf && offsg != null) offsg.setFont(ft);
   }
 }
