package com.uvigo.mhp.looks;

import java.awt.*;
import org.havi.ui.*;

// La posicion de dibujado se actualiza aqui para que el movimiento
// no depende de cuando se llama al metodo repaint del objeto.
public class HTextLook2Thread extends Thread
{
    private HTextLook2 look;
    private HVisible visible;
    private int c;
    
    public HTextLook2Thread(HTextLook2 look, HVisible visible)
    {
        c=0;
        this.look=look;
        this.visible=visible;
    }
    
    public void run()
    {
        try
        {
            while(true)
            {
                try
                {
                    sleep(look.delay);
                    if (visible.getLook()==look)
                    {
                        int hpos=0;
                        if (visible.getLookData(look)!=null)
                        {
                            hpos=((Integer) visible.getLookData(look)).intValue();
                            hpos-=look.displacement;
                        }
                        
                        Font f=visible.getFont();
                        FontMetrics fm=visible.getGraphics().getFontMetrics(f);
                        int stringWidth=fm.stringWidth(visible.getTextContent(HState.NORMAL_STATE)+look.separator);
                        
                        if (look.displacement>0)
                        {
                            if (hpos<=(-stringWidth))
                                hpos+=stringWidth;
                        }
                        else
                        {
                            if (hpos>0)
                                hpos-=stringWidth;
                        }
                        
                        visible.setLookData(look, new Integer(hpos));
                        if (isVisible())
                        {
                            visible.repaint();
                        }
                        else
                        {
                            //System.out.println("HTextLook2Thread: el objeto ha dejado de ser visible");
                            look.removeManagedObject(visible);
                            // habria que eliminar los datos almacenados via setLookData,
                            // pero lo hace automaticamente la superclase.
                            break;
                        }
                    }
                    else
                    {
                        look.removeManagedObject(visible);
                        break;
                    }
                }
                catch(InterruptedException ie)
                {
                    ie.printStackTrace();
                }
            }
        }
        catch (Exception ex) // cualquier excepcion termina el thread
        {}
    }
    
    private boolean isVisible()
    {
        Component c=visible;
        while (c!=null)
        {
            if (!(c.isVisible()))
                return false;
            c=c.getParent();
        }
        return true;
    }
}