
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;

public class WindowLayout {

  
    public static void mnPrevWindows(JDesktopPane desktopPane) {     
      JInternalFrame[] frames = desktopPane.getAllFrames();
      if(frames.length > 1)
     { 
         desktopPane.selectFrame(false);
     }
   }
	
   public static void mnNextWindows(JDesktopPane desktopPane) {
       JInternalFrame[] frames = desktopPane.getAllFrames();
        if(frames.length > 1)
       {
          desktopPane.selectFrame(true);
       }
   }


   // -----------------
 private static  void setCascadeFrame(JDesktopPane desktopPane) {
   final int w = 250;
   final int h = 150;
   JInternalFrame frame;     // the actual Clientwindow
   JInternalFrame[] ff;  // Array of all internal Clientwindow
   ff = desktopPane.getAllFrames();
   for (int pos = 0; pos<ff.length; pos++) {
      frame = (JInternalFrame)ff[pos];  // typecasting
      frame.setBounds(
     (pos*50 % (desktopPane.getWidth()-w) ),
     (pos*50 % (desktopPane.getHeight()-h) ), 
         w, h);
   } // for
  }  // setCascadeFrame()

   // -----------------
  public static void mnCascade(JDesktopPane desktopPane) {
      int i, j, p, Abstand, w, h, n;
      JInternalFrame f;     // the actual Clientwindow
      JInternalFrame[] ff;  // Array of all internal Clientwindow
      ff = desktopPane.getAllFrames();
      n = ff.length;  // Count of Frames
      // calc the distance of the frames, depends on the count of the frames
      if (n > 0) {
           if (n<=3)
             Abstand = 80;
           else {
             if (n>6)
               Abstand = 25;
             else
               Abstand = 40;
           }
           // calc the width and height of each frame
           w = desktopPane.getWidth() - (n-1)*Abstand;
           h = desktopPane.getHeight() - (n-1)*Abstand;
           if ( (w<80) || (h<80) || (n>20) ) {
             setCascadeFrame(desktopPane);
           }
           else {
             if (w<=0) w = 100;
             if (h<=0) h = 50;
             // the top frame has the index 0 !
             // index i is for the position
             // index j ist for the frames, the last is the top-frame !
             for (i = 0, j=n-1; i <n; i++,j--) {
                 f = (JInternalFrame)ff[j];  // typecasting
                 p = i*Abstand;
                 f.setLocation(p, p);        // position
                 f.setSize(w,h);             // width height
             }
           }
      }
  }   // MnCascade_click() {


  public static void mnTile(JDesktopPane desktopPane) {
    System.out.println("Menüeintrag Tile");
      JInternalFrame[] ff;    // Array for all internal frames
      JInternalFrame f; //
      int hoehe, anz, breite, left, top;
      int indexCol, anzCol, anzRow, anzRowUnten, n, i, h, b1, b2;
      boolean bZweiBreiten;

      ff = desktopPane.getAllFrames();
        // Count > 0 ?
      if (ff.length > 0) {
          // Quadratische Aufteilung

            /*
             5:
                 -
                - -
                - -

             11:
                 - -
                - - -
                - - -
                - - -

            */

          n = ff.length;
          if (n < 1) {
              return;
          }
          if (n == 1) {
              f = (JInternalFrame)ff[0];
              try {
                  f.setMaximum(true);
              }
              catch (Exception e1) {
                  e1.printStackTrace();
              }
              return;
          }
          
          anzCol = (int)Math.round(Math.sqrt(n)); // Wurzel aus Anzahl
          // bestimme Anzahl der unteren (vollen) Zeilen
          anzRowUnten = n / anzCol;  // trunc
            // Abfrage nach Rest
          if (n > (anzRowUnten * anzCol)) {
              anzRow = anzRowUnten + 1;
              bZweiBreiten = true;
          }
          else {
              anzRow = anzRowUnten;
              bZweiBreiten = false;
          }
          //  AnzRow zeigt die Anzahl aller Zeilen

          // nun werden zwei Breiten und eine Höhe ausgerechnet
          // 1. Breite  gilt für die vollen Reihen
          // 2. Breite  gilt für oberste  Reihe, falls sie nicht voll ist
          hoehe = desktopPane.getHeight();
          h = desktopPane.getHeight() / anzRow;
          b1 = desktopPane.getWidth() / anzCol; // volle Breite
          if (bZweiBreiten)
             b2 = desktopPane.getWidth() / (n - anzCol * anzRowUnten); // untere Breite
          else
             b2 = b1;

          // Rückwärts
          anz = 0;
          left = 0;
          top = hoehe - h;
          indexCol = 0;
          for (i = ff.length - 1; i >= 0; i--) {
              f = (JInternalFrame)ff[i];
              //f.setSize(100,100);
              try {
                  f.setMaximum(false);
              }
              catch (Exception e2) {
                  e2.printStackTrace();
              }
              anz++;
              indexCol++;
              if (indexCol > anzCol) {
                  // neue Reihe anfangen
                  left = 0;
                  top -= h;
                  indexCol = 1;
              }
              // Position im Fenster setzen
              f.setLocation(left, top);
              // Breite Höhe setzen
              // Check, ob man in der obersten Zeile sich befindet ?
              if (anz > (anzRowUnten * anzCol)) {
                  f.setSize(b2, h); // width height
                  left += b2;
              }
              else {
                  f.setSize(b1, h); // width height
                  left += b1;
              }
          }
      }
  } // MnTile



  public static void mnTileHorizontal(JDesktopPane desktopPane) {
      JInternalFrame[] ff;    // Array for all internal frames
      JInternalFrame f; //
      int hoehe, breite, top;
      int i, n;
      ff = desktopPane.getAllFrames();
        // Count > 0 ?
      if (ff.length > 0) {
          n = ff.length;
          breite = desktopPane.getWidth() ;
          hoehe = desktopPane.getHeight()/ n;
          if (ff.length==1 ) {
              f = (JInternalFrame)ff[0];
              try {
                  f.setMaximum(false);
                  f.setSize(desktopPane.getWidth(), hoehe);
                  f.setLocation(0,0);
                  return;
              }
              catch (Exception e2) {
                  e2.printStackTrace();
              }            
          }
          top=0;
          for (i = ff.length - 1; i >= 0; i--) {
              f = (JInternalFrame)ff[i];
              //f.setSize(100,100);
              try {
                  f.setMaximum(false);
                  f.setSize(breite, hoehe);
                  f.setLocation(0,top);  // x/y
                  top+=hoehe;
              }
              catch (Exception e2) {
                  e2.printStackTrace();
              }
          }
      }
    
  }



  public static void mnTileVertical(JDesktopPane desktopPane) {
      JInternalFrame[] ff;    // Array for all internal frames
      JInternalFrame f; //
      int hoehe, breite, left, top;
      int i, n;
      ff = desktopPane.getAllFrames();
        // Count > 0 ?
      if (ff.length > 0) {
          n = ff.length;
          breite = desktopPane.getWidth() / n;
          hoehe = desktopPane.getHeight();
          if (ff.length==1 ) {
              f = (JInternalFrame)ff[0];
              try {
                  f.setMaximum(false);
                  f.setSize(desktopPane.getWidth(), hoehe);
                  f.setLocation(0,0);
                  return;
              }
              catch (Exception e2) {
                  e2.printStackTrace();
              }            
          }
          left=0;
          for (i = ff.length - 1; i >= 0; i--) {
              f = (JInternalFrame)ff[i];
              //f.setSize(100,100);
              try {
                  f.setMaximum(false);
                  f.setSize(breite, hoehe);
                  f.setLocation(left,0);  // x/y
                  left+=breite;
              }
              catch (Exception e2) {
                  e2.printStackTrace();
              }
          }
      }
    
  }
  
  
}
