// This applet was manufactured by © 2000 Juergen Giesen

import java.awt.*;
import java.applet.Applet;

public class RGBColorApplet10 extends Applet
{
	Image bild;
	int x0=10, y0=10;
	int w=10;
	int h=25;
	int xL=10, xR=267;
	int left=38;
	// circle center coordinates
	int xRedStart=105, yRedStart=165;
	int xRed=xRedStart, yRed=yRedStart;	
	int xGreenStart=225, yGreenStart=165;
	int xGreen=xGreenStart, yGreen=yGreenStart;	
	int xBlueStart=165, yBlueStart=270;
	int xBlue=xBlueStart, yBlue=yBlueStart;
	
	int radius=50;
	int r2=radius*radius;
	boolean red=true, green=true, blue=true;	
	boolean both=false;
	int valRed=255, valGreen=255, valBlue=255;
	Button myButton;
	boolean control=false;
		
	public void init() {
		
		setBackground(Color.white);
		bild = getImage(getDocumentBase(),"applet/schieber.gif");				
		myButton = new Button("reset");
		BorderLayout bl = new BorderLayout();
		setLayout(bl);
		add("South",myButton);	
	}
//--------------------------------------------------------	
	public boolean mouseDown(Event event, int x, int y) {
	
		control=false;
		
		// select circle
		if (distance(x,xRed,y,yRed)<r2) {red=true; control=false;} else red=false;
		if (distance(x,xGreen,y,yGreen)<r2) {green=true;control=false;} else green=false;
		if (distance(x,xBlue,y,yBlue)<r2) {blue=true; control=false;} else blue=false;
		
		both=false;

		if (distance(x,xRed,y,yRed)<r2 && distance(x,xGreen,y,yGreen)<r2) both=true;
		if (distance(x,xRed,y,yRed)<r2 && distance(x,xBlue,y,yBlue)<r2) both=true;
		if (distance(x,xGreen,y,yGreen)<r2 && distance(x,xBlue,y,yBlue)<r2) both=true;
						
		// red controll bar
		if ((x<xL)  && (y>y0) && (y<y0+h)) {
			valRed=0;			
			repaint();
		}
		if ((x>xR)  && (y>y0) && (y<y0+h)) {
			valRed=255;			
			repaint();
		}
		if ((x>xL) && (x<xR) && (y>y0) && (y<y0+h)) {
			x0=x-w/2;
			valRed=x-xL-1;
			control=true;			
			repaint();
		}
		// green controll bar
		if ((x<xL)  && (y>y0+30) && (y<y0+h+30)) {
			valGreen=0;			
			repaint();
		}							
		if ((x>xR)  && (y>y0+30) && (y<y0+h+30)) {
			valGreen=255;			
			repaint();
		}
		if ((x>xL) && (x<xR) && (y>y0+30) && (y<y0+h+30)) {
			x0=x-w/2;
			valGreen=x-xL-1;
			control=true;						
			repaint();
		}
		// blue controll bar							
		if ((x<xL)  && (y>y0+60) && (y<y0+h+60)) {
			valBlue=0;			
			repaint();
		}
		if ((x>xR)  && (y>y0+60) && (y<y0+h+60)) {
			valBlue=255;			
			repaint();
		}		
		if ((x>xL) && (x<xR) && (y>y0+60) && (y<y0+h+60)) {
			x0=x-w/2;
			valBlue=x-xL-1;
			control=true;
			repaint();
		}					
		return true;		
	}
//--------------------------------------------------------	
	public boolean mouseDrag(Event event, int x, int y) {
	
		// red controll bar
		if ((x>xL) && (x<xR) && (y>y0) && (y<y0+h) && (control)) {
			x0=x-w/2;
			valRed=x-xL-1;
			repaint();
		}
		// green controll bar
		if ((x>xL) && (x<xR) && (y>y0+30) && (y<y0+h+30) && (control)) {
			x0=x-w/2;
			valGreen=x-xL-1;
			control=true;																		
			repaint();
		}
		// blue controll bar		
		if ((x>xL) && (x<xR) && (y>y0+60) && (y<y0+h+60) && (control)) {
			x0=x-w/2;
			valBlue=x-xL-1;
			repaint();
		}		

		if (both) return true;
		
		// drag circles
		if (distance(x,xRed,y,yRed)<r2 && x>left && x<left+255 && y>100 && y<335 && (red)) {					
			xRed=x;
			yRed=y;
			repaint();			
			return true;
		}				
		if (distance(x,xGreen,y,yGreen)<r2 && x>left && x<left+255 && y>100 && y<335 && (green)) {						
			xGreen=x;
			yGreen=y;
			repaint();			
			return true;			
		}		
		if (distance(x,xBlue,y,yBlue)<r2 && x>left && x<left+255 && y>100 && y<335 && (blue)) {					
			xBlue=x;
			yBlue=y;
			control=false;
			repaint();			
			return true;			
		}				
		repaint();				
		return true;	
	}
//--------------------------------------------------------		
	public boolean action(Event event, Object eventobject) {
											
		if (event.target instanceof Button) {		
			xRed=xRedStart; yRed=yRedStart;
			xGreen=xGreenStart; yGreen=yGreenStart;
			xBlue=xBlueStart; yBlue=yBlueStart;
			valRed=255; valGreen=255; valBlue=255;
			repaint();
		}
		return true;
	}
	
//--------------------------------------------------------	
	public int distance(int x1,int x2, int y1, int y2) {
		return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
		}
//--------------------------------------------------------	
	public String hex(int n) {
		String str="0123456789ABCDEF";
		int n1 = (int)(n/16);
		int n2 = n % 16;
		return "" + str.charAt(n1) + str.charAt(n2);
		}
//--------------------------------------------------------	
	public void paint( Graphics g ) {
	
		g.setColor(Color.red);
		g.drawString("Drag circles !",125,347);
		Font f = new Font("Helvetica", Font.PLAIN, 9);
		g.setColor(Color.black);		
		g.setFont(f);
		g.drawString("RGB 1.0  -  © 2000 Juergen Giesen  -  www.sweethome.de/giesen/",30,359);
		f = new Font("Helvetica", Font.PLAIN, 10);
		g.setFont(f);
				
		g.setColor(Color.black);
		g.fillRect(left,100,255,235);
		g.drawRect(1,1,size().width-2,size().height-2);
					
		// draw control bars
		g.setColor(Color.red);
		g.fillRect(xL,17,255,10);
		g.drawImage(bild,valRed+xL-5,y0,this);
		g.drawString(""+valRed, 280, 25);
		g.drawString(hex(valRed), 310, 25);
						
		g.setColor(Color.green);
		g.fillRect(xL,17+30,255,10);
		g.drawImage(bild,valGreen+xL-5,y0+30,this);
		g.drawString(""+valGreen, 280, 25+30);
		g.drawString(hex(valGreen), 310, 25+30);				

		g.setColor(Color.blue);
		g.fillRect(xL,17+60,255,10);
		g.drawImage(bild,valBlue+xL-5,y0+60,this);
		g.drawString(""+valBlue, 280, 25+60);
		g.drawString(hex(valBlue), 310, 25+60);				
						
		// draw scroll bar marks
		g.setColor(Color.white);				
		g.drawLine(xL+50,15,xL+50,28);
		g.drawLine(xL+100,15,xL+100,28);
		g.drawLine(xL+150,15,xL+150,28);
		g.drawLine(xL+200,15,xL+200,28);
		
		g.drawLine(xL+50,45,xL+50,58);
		g.drawLine(xL+100,45,xL+100,58);
		g.drawLine(xL+150,45,xL+150,58);
		g.drawLine(xL+200,45,xL+200,58);
		
		g.drawLine(xL+50,75,xL+50,88);
		g.drawLine(xL+100,75,xL+100,88);
		g.drawLine(xL+150,75,xL+150,88);
		g.drawLine(xL+200,75,xL+200,88);						
				
		// draw circles		
		g.setColor(new Color(valRed,0,0));		
		g.fillOval(xRed-radius,yRed-radius,2*radius,2*radius);		
		g.setColor(new Color(0,valGreen,0));		
		g.fillOval(xGreen-radius,yGreen-radius,2*radius,2*radius);		
		g.setColor(new Color(0,0,valBlue));		
		g.fillOval(xBlue-radius,yBlue-radius,2*radius,2*radius);				
		
		// draw intersections if necessary 
		if (distance(xRed,xGreen,yRed,yGreen)<4*r2 || distance(xRed,xBlue,yRed,yBlue)<4*r2 || distance(xGreen,xBlue,yGreen,yBlue)<4*r2)
		for (int i=left; i<left+255; i++ )
			for (int j=100; j<335; j++)
			 {
				if (distance(xRed,i,yRed,j)<=r2 && distance(xGreen,i,yGreen,j)<=r2) {g.setColor(new Color(valRed,valGreen,0));g.drawLine(i,j,i,j);}		
				if (distance(xRed,i,yRed,j)<=r2 && distance(xBlue,i,yBlue,j)<=r2) {g.setColor(new Color(valRed,0,valBlue));g.drawLine(i,j,i,j);}
				if (distance(xGreen,i,yGreen,j)<=r2 && distance(xBlue,i,yBlue,j)<=r2) {g.setColor(new Color(0,valGreen,valBlue));g.drawLine(i,j,i,j);}
				if (distance(xRed,i,yRed,j)<=r2 && distance(xGreen,i,yGreen,j)<=r2 && distance(xBlue,i,yBlue,j)<=r2) {g.setColor(new Color(valRed,valGreen,valBlue));g.drawLine(i,j,i,j);}
			}
	}

}

