import java.applet.*;
import java.awt.*;
import java.awt.event.*;

import java.util.Vector;

public class Helligkeit extends Applet implements MouseMotionListener, MouseListener {

  private Vector p;        // Datenstruktur zum Speichern des Polygons
  private boolean fertig;  // Signalisiert Abgeschlossenheit

  int groese = 5;

    int[] grauschema = {0, 1, 3, 6, 13, 20};
boolean logarithmisch=false;

int breite=5;
int hoehe=4;
int offsetx=2;
int offsety=1;

int ggg=2;

///////////////////////
//  Initialisierung  //
///////////////////////

// init() wird vor allen anderen Methoden aufgerufen

  public void init()
  {
    addMouseListener(this);         // Das PolygonDrag-Objekt "erledigt"
    addMouseMotionListener(this);   //  Mauseingaben und -bewegungen

    p = new Vector();   // Wir brauchen den Vector p
    fertig=false;       // fertig ist nicht (wir haben nicht einmal angefangen)
  }

// Bei Beendigung wird destroy() aufgerufen

  public void destroy() {

    removeMouseListener(this);         // Abschluss der Maus-Ueberwachung
    removeMouseMotionListener(this);
  }


////////////////////////////
//  Ausgabe (Bildschirm)  //
////////////////////////////

  // Zeichne Fleck auf Stelle a
  private void drawFleck(Graphics g,int x, int y)
  { g.fillRect(x*groese,y*groese,groese,groese); }

    private void drawgrauFleck(Graphics g,int a, int b, int grau)
    {
	g.setColor(Color.black);
	g.fillRect(a*breite*groese,b*hoehe*groese,breite*groese,hoehe*groese);
	g.setColor(Color.white);
	for(int i=0, x=0, y=0; i<grau;
	               i++, x=(x+offsetx)%breite, y=(y+offsety)%hoehe)
	    g.fillRect((a*breite+x)*groese,(b*hoehe+y)*groese,groese,groese);
 }

    void drawgrauBlockFleck(Graphics g,int a, int b, int br, int h, int grau)
    {
	for(int i=0; i<br; i++)
	for(int j=0; j<h; j++)
	    drawgrauFleck(g, a*br+i, b*h+j, grau);
    }

// Der Browser ruft paint() zum Zeichen des Applets auf

  public void paint(Graphics g)
  {
      g.setColor(Color.gray);
      Dimension d=getSize();                          // lösche die Anzeige
      g.fillRect(0,0,d.width-1,d.height-1);

      if(logarithmisch) {
	  int rbreite = d.width/breite/groese/grauschema.length;
	  int rhoehe  = d.height/hoehe/groese;
	  
	  int grau=0;
	  for(int xblock=0; xblock<grauschema.length; xblock++)
	      drawgrauBlockFleck(g, xblock,0,rbreite,rhoehe,grauschema[xblock]);      
      }
      else {

	  int rbreite = d.width/breite/groese/5;
	  int rhoehe  = d.height/hoehe/groese/5;
	  
	  int grau=0;
      bl:
	  for(int yblock=0; yblock<5; yblock++)
	      for(int xblock=0; xblock<5; xblock++)
		  {
		      drawgrauBlockFleck(g, xblock,yblock,rbreite,rhoehe,grau);      
		      if(grau<20) grau++; else break bl;
		  }
	  
      }
  }

//////////////////////
//  Eingabe (Maus)  //
//////////////////////


  public void mouseReleased(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
  public void mouseClicked(MouseEvent e) {}
  public void mouseMoved(MouseEvent e) {}
  public void mouseDragged(MouseEvent e) {}

// mousePressed(): Mausknopf wurde betätigt
// Hier: ggf. neuen Punkt aufnehmen oder Polygon schließen

  public void mousePressed(MouseEvent e) {
      if(e.getModifiers()!=MouseEvent.BUTTON2_MASK &&
         e.getModifiers()!=MouseEvent.BUTTON3_MASK) {
	  groese = e.getX()/50;
	  if (groese==0) groese=1;
//	  System.out.println(groese);
      }
      else logarithmisch = ! logarithmisch;
      repaint();
  }

}
