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

/** <i>Matrixklasse als Basis f&uuml;r Tabelle und Clipboard-Objekte</i> */
 
public class Matrix
{
   // Attribute
   protected int Spalten;
   protected int Zeilen;

	 // Objektreferenzen
   protected Zelle[][] Inhalt;

	 // Methoden
   /** liefert die Anzahl der Spalten in der Matrix */
	 int getSpalten()  { return Spalten; }

	 /** liefert die Anzahl der Zeilen in der Matrix */
   int getZeilen()  { return Zeilen; }

   /** setzt die angegebene Zelle auf die angegebene Position */   
   public void setZelle( int Zeile, int Spalte, Zelle z)
   {
      Inhalt[Zeile][Spalte] = z;
   }

   /** liefert eine Objektreferenz auf die Zelle an der angebenen Position */
	 public Zelle getZelle(int Zeile, int Spalte)
   {
      return Inhalt[Zeile][Spalte];
   }

   /** setzt die angegebene Zelle auf die angegebene Position */	 
   public void setZelle(Position p, Zelle z)
   {
      Inhalt[p.Y()][p.X()] = z;
   }

	 /** liefert eine Objektreferenz auf die Zelle an der angebenen Position */
	 public Zelle getZelle(Position p)
   {
      return Inhalt[p.Y()][p.X()];
   }
  
   /** kopiert die Referenzen aus einer Matrix im Bereich (LinksOben,RechtsUnten) in
       eine andere Matrix. Dabei werden die Koordinaten um (LinksObenNeu) verschoben
     */ 
   public void bewegeZellen(Matrix Clipboard, Position LinksOben, Position RechtsUnten, Position LinksObenNeu)
   {
      int x,y;
  
      int offsetX = LinksObenNeu.X() - LinksOben.X();
      int offsetY = LinksObenNeu.Y() - LinksOben.Y();

      for(x=LinksOben.X();x<=RechtsUnten.X();x++)
         for(y=LinksOben.Y();y<=RechtsUnten.Y();y++)
         {
            if ((y + offsetY < Zeilen) && (y + offsetY >= 0)
            && (x + offsetX < Spalten) && (x + offsetX >= 0))
               Clipboard.Inhalt[y+offsetY][x+offsetX] = Inhalt [y][x];
         }
   }

   /** kopiert die Referenzen aus einer Matrix im Bereich (LinksOben,RechtsUnten) in
       eine andere Matrix. Dabei werden die Referenzen auf [0,0] verschoben.
     */
	 public void kopiereZellen(Matrix Clipboard, Position LinksOben, Position RechtsUnten)
   {
      int offsetY = - LinksOben.Y();
      int offsetX = - LinksOben.X();
  
      for(int x=LinksOben.X();x<=RechtsUnten.X();x++)
         for(int y=LinksOben.Y();y<=RechtsUnten.Y();y++)
         {
            if ((y + offsetY < Zeilen) && (y + offsetY >= 0)
            && (x + offsetX < Spalten) && (x + offsetX >= 0))
               Clipboard.Inhalt[y-LinksOben.Y()][x-LinksOben.X()] = Inhalt [y][x];
         }
   }


   /** setzt die Referenzen in einem Bereich der Tabelle auf die angegebene Zelle */
	 public void setzeZellen(Zelle z, Position LinksOben, Position RechtsUnten)
   {
      int x,y;
  
      for(x=LinksOben.X();x<=RechtsUnten.X();x++)
         for(y=LinksOben.Y();y<=RechtsUnten.Y();y++)
               Inhalt[y][x] = z;
   }   

	 // Konstruktor
   public Matrix (int Zeilen, int Spalten)
   {
      this.Zeilen = Zeilen;
      this.Spalten = Spalten;
      Inhalt = new Zelle[Zeilen][Spalten];
   }
}