/** (C) 1999 World Xiangqi League, Confidential, All Rights Reserved */

import java.awt.*;
import java.awt.image.*;
import java.util.*;

// GamePanel / ChatPanel horizontal resize button.
class SliderCanvas extends Canvas {
  private Club club;
  private Image offScreenImage=null;
  private int width;
  private int cursor; // x position
  private boolean moving=false;
  private final int height=10;
  
  SliderCanvas(Club club) {
    this.club = club;
    this.width = ((Frame)club).size().width;
    resize(this.width,this.height);
    prepareImage();
  }

  private int min() {
    return club.size().width/8;
  }
  private int max() {
    return club.size().width - (16+200+32); // vcr/2 ad >    
  }
  public void handleReshape() { // called by club.reshape()
    cursor = adjust(cursor);
    club.slider(cursor);
    club.slider(cursor);
  }
  private int adjust(int pos) {
    int w = min();
    if (pos<w) pos=w;
    w = max();
    if (pos>w) pos=w;
    return pos;
  }

  public boolean mouseEnter(Event event, int x, int y) {
    hotZone = false;
    hotZone(event);
    return true;
  }
  public boolean mouseExit(Event event, int x, int y) {
    //club.cursorReset("SliderCanvas");
    return true;
  }

  private boolean hotZone = false;
  private boolean hotZone(Event event) {
    int delta = event.x - cursor;
    boolean retval = ( delta<5 && delta>-5 );
    if (retval!=hotZone)	// changed zones
      club.cursor("SliderCanvas",
		  retval ? Frame.HAND_CURSOR : Frame.DEFAULT_CURSOR);
    return(hotZone = retval);
  }

  public boolean handleEvent(Event event) {
    //Club.debugEvent("SliderCanvas",event);
    if (event.id==Event.KEY_ACTION || event.id==Event.KEY_PRESS)
      return club.handleKey(event);
    if (event.id==Event.MOUSE_DOWN ) {
      if (!hotZone(event))
	return true;
      moving = true;
      cursor = adjust(event.x);
      prepareImage();
      repaint();
    } else if (event.id==Event.MOUSE_DRAG) {
      hotZone(event);
      if (moving==false)
	return true;
      cursor = adjust(event.x);
      prepareImage();
      repaint();
    } else if (event.id==Event.MOUSE_UP) {
      if (moving==false)
	return true;
      moving = false;
      cursor = adjust(event.x);
      club.slider(cursor);
      club.slider(cursor); // witchcraft hack bugfix
      //Club.debug("SliderCanvas: "+cursor);
      prepareImage();
      repaint();
    } else {
      hotZone(event);
    }
    return super.handleEvent(event);
  }

  private void prepareImage() {
    if (getPeer()==null || !isShowing())
      return;
    Dimension d = size();
    if (offScreenImage==null || d.width!=width) {
      this.width = d.width;
      if (offScreenImage!=null)
	offScreenImage.flush();
      offScreenImage = createImage(this.width,this.height);
      cursor = club.slider(0);
    }
    Graphics g = offScreenImage.getGraphics();
    g.setColor(getBackground());
    g.fillRect(0,0,this.width,this.height);
    g.setColor(Club.CONTROLS_COLOR);
    int min=min(), max=max();
    g.drawLine(min,this.height/2, max,this.height/2);
    g.drawLine(min,2, min,this.height-2);
    g.drawLine(max,2, max,this.height-2);
    int diam = this.height-2; // diameter of the slider oval
    g.fillOval(cursor - diam/2 + (moving?1:0),(moving?1:0), diam,diam);

    g.dispose();
  }

  public void update(Graphics g) { paint(g); }
  public void paint(Graphics g) {
    Dimension d = size();
    if (offScreenImage==null ||	width!=d.width)
      prepareImage();
    if (offScreenImage!=null)
      g.drawImage(offScreenImage,0,0,this);
  }
}
