/*
 * TabellenCursor.java	01.07.99
 *
 *
 * Beilage zum Buch "Software-Entwurf mit UML"
 * von J.Seemann & J. Wolff von Gudenberg,
 * Springer-Verlag, 1999
 * 
 */

/** <i>Der Tabellen-Cursor ist das Objekt, das der Benutzer &uuml;ber die Tabelle bewegt</i> */
 
public class TabellenCursor
{
   // Attribute
	 protected boolean MoveMode = true;
   
	 // Objektreferenzen 
	 protected AnzeigeTabelle T;
   protected Position altPosition = new Position (0,0);
   protected Position neuPosition = new Position (0,0);
   protected Position MarkierObenLinks = new Position (0,0); 
   protected Position MarkierUntenRechts = new Position (0,0); 

	 // Methoden
	 /** bewegt den Zell-Cursor &uuml;ber die Tabelle  */
   protected void bewege(boolean shiftPressed)
   {
      AnzeigeZelle c = T.getZelleAnzeige(altPosition.getX(),altPosition.getY());
      T.setColor(c,0);
      c = T.getZelleAnzeige(neuPosition.getX(),neuPosition.getY());

      if (shiftPressed)
      {
         if (MoveMode == true)
         {
            T.resetMarkierung();
            MoveMode = false;
            MarkierObenLinks.setX(altPosition.getX());
            MarkierObenLinks.setY(altPosition.getY());
            MarkierUntenRechts.setX(altPosition.getX());
            MarkierUntenRechts.setY(altPosition.getY());
         }
         if (altPosition.getX() < MarkierObenLinks.getX())  MarkierObenLinks.setX(altPosition.getX());
         if (altPosition.getY() < MarkierObenLinks.getY())  MarkierObenLinks.setY(altPosition.getY());
         if (altPosition.getX() > MarkierUntenRechts.getX())  MarkierUntenRechts.setX(altPosition.getX());
         if (altPosition.getY() > MarkierUntenRechts.getY())  MarkierUntenRechts.setY(altPosition.getY());
         T.setMarkierung(MarkierObenLinks,MarkierUntenRechts);
      }            
      else
      {
         MarkierObenLinks.setX(neuPosition.getX());
         MarkierObenLinks.setY(neuPosition.getY());
         MarkierUntenRechts.setX(neuPosition.getX());
         MarkierUntenRechts.setY(neuPosition.getY());
         MoveMode = true;
      }

      T.setColor(c,1);
      altPosition.setX(neuPosition.getX());
      altPosition.setY(neuPosition.getY());
      zeigeAdresse();
      aktualisiereZellEditor();
   }     

   /** informiert den Zellen-Editor &uuml;ber die neue ausgew&auml;hlte Zelle */
	 public void aktualisiereZellEditor()
   {
      Tabkalk.ZellenEditor().setZelle(T.getZelleAnzeige(neuPosition.getX(),neuPosition.getY()));
   }

   /** setzt die Markierung von Zellenbl&ouml;cken zur&uuml;ck */
	 public void resetMarkierung()
   {
            T.resetMarkierung();
            MoveMode = false;
            MarkierObenLinks.setX(altPosition.getX());
            MarkierObenLinks.setY(altPosition.getY());
            MarkierUntenRechts.setX(altPosition.getX());
            MarkierUntenRechts.setY(altPosition.getY());
   }
      
   /** Bewegung nach links */
	 public void links(boolean shiftPressed)  
   { 
      if (altPosition.X > 0) 
      {
         neuPosition.setX(altPosition.getX() - 1);
         neuPosition.setY(altPosition.getY());
      }
      bewege(shiftPressed);
   }

   /** Bewegung nach rechts */
   public void rechts(boolean shiftPressed)  
   { 
      if (altPosition.X < T.getSpalten()) 
      {
         neuPosition.setX(altPosition.getX() + 1);
         neuPosition.setY(altPosition.getY());
      }
      bewege(shiftPressed);
   }

   /** Bewegung nach oben */
   public void oben(boolean shiftPressed)  
   { 
      if (altPosition.Y > 0) 
      {
         neuPosition.setY(altPosition.getY() - 1);
         neuPosition.setX(altPosition.getX());
      }
      bewege(shiftPressed);
   }

   /** Bewegung nach unten */
   public void unten(boolean shiftPressed)  
   { 
      if (altPosition.Y < T.getZeilen()) 
      {
         neuPosition.setY(altPosition.getY() + 1);
         neuPosition.setX(altPosition.getX());
      }
      bewege(shiftPressed);
   }

   /** setzt den Cursor auf die Zelle, deren Referenz direkt &uuml;bergeben wurde */
	 public void setToZelle(AnzeigeZelle c)
   {
      neuPosition.setX(T.getXIndex(c));
      neuPosition.setY(T.getYIndex(c));
      bewege(false);
   }

   /** meldet die Position des Cursors an das &uuml;bergebene Positionsobjekt */
   public void getPosition(Position P)
   {
      P.setX(altPosition.getX());
      P.setY(altPosition.getY());
   }

   /** setzt den Cursor auf die angegebene Position */
	 public void setPosition(Position p)
   {
      neuPosition = p;
      bewege(false);
   }

   /** liefert den markierten Bereich */
   public void getMarkierung(Position ObenLinks,Position UntenRechts)
   {
      ObenLinks.X(MarkierObenLinks.X());
      ObenLinks.Y(MarkierObenLinks.Y());
      UntenRechts.X(MarkierUntenRechts.X());
      UntenRechts.Y(MarkierUntenRechts.Y());
   }

	 /** zeige die momentane Position in der Tabelle im Hauptfenster an */
   protected void zeigeAdresse()
   {
       Tabkalk.anzeigeAdresse(T.getZelleAnzeige(altPosition.getY(),altPosition.getX()).getSymName());
   }


	 // Konstruktor
   TabellenCursor(AnzeigeTabelle T)
   {
      this.T = T;
      T.setColor(T.getZelleAnzeige(0,0),1);      
      Tabkalk.ZellenEditor().setZelle(T.getZelleAnzeige(0,0));
      zeigeAdresse();
   }
}