/*
 * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/**
 * @test
 * @bug 4271596
 * @bug 4460699
 * @summary Rotated text printing
 * @author prr
 * @run main/manual PrintRotatedText
 */

/* Text is drawn as spokes of a wheel with both a uniform scale and
 * a non-uniform scale.
 * The test is checking whether the implementation properly handles this
 * and in particular that asking win32 GDI to draw text rotated works
 * properly.
 *
 */
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;

public class PrintRotatedText extends Frame implements ActionListener {
 static String fontname="Lucida Sans Regular"; // our font
 private TextCanvas c;

 public static void main(String args[]) {

    PrintRotatedText f = new PrintRotatedText();
    f.show();
 }

 public PrintRotatedText() {
    super("JDK 1.2 Text Printing");

    String []fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    for (int i=0;i<fonts.length;i++) {
       if (fonts[i].equals("Times New Roman")) {
         fontname = "Times New Roman";
       }
    }
    c = new TextCanvas();
    add("Center", c);

    Button printButton = new Button("Print");
    printButton.addActionListener(this);
    add("South", printButton);

    addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
             System.exit(0);
            }
    });

    pack();
 }

 public void actionPerformed(ActionEvent e) {

   PrinterJob pj = PrinterJob.getPrinterJob();

   if (pj != null && pj.printDialog()) {

       pj.setPageable(c);
       try {
            pj.print();
      } catch (PrinterException pe) {
      } finally {
         System.err.println("PRINT RETURNED");
      }
   }
 }

 class TextCanvas extends Panel implements Pageable, Printable {

    public static final int MAXPAGE = 8;
    // public static final String extra ="\u0391A\u2200B\u2702C\u2778D";
    public static final String extra ="\u0394\u03A9ABCD";
    public String estr=extra;

    public int getNumberOfPages() {
        return MAXPAGE;
    }

    public PageFormat getPageFormat(int pageIndex) {
       if (pageIndex > MAXPAGE) throw new IndexOutOfBoundsException();
       PageFormat pf = new PageFormat();
       Paper p = pf.getPaper();
       p.setImageableArea(36, 36, p.getWidth()-72, p.getHeight()-72);
       pf.setPaper(p);

/*
       if (pageIndex==1)
         pf.setOrientation(PageFormat.LANDSCAPE);
       else if (pageIndex==2)
         pf.setOrientation(PageFormat.REVERSE_LANDSCAPE);
*/

       return pf;
    }

    public Printable getPrintable(int pageIndex) {
       if (pageIndex > MAXPAGE) throw new IndexOutOfBoundsException();
       return this;
    }

    public int print(Graphics g, PageFormat pgFmt, int pgIndex) {
System.out.println("****"+pgIndex);
        double iw = pgFmt.getImageableWidth();
        double ih = pgFmt.getImageableHeight();
        Graphics2D g2d = (Graphics2D)g;
        g2d.translate(pgFmt.getImageableX(), pgFmt.getImageableY());
        //g2d.drawString("top left of page format",20,20 );
        int modulo = pgIndex % 4;
        int divvy = pgIndex / 4;
        if (divvy != 0 ) {
           g2d.setFont(new Font(fontname,Font.PLAIN, 18));
           estr = "";
        } else {
           estr = extra;
        }

        int xs = 1;
        int ys = 1;

        if (modulo == 1) {
            xs = -1;
        }
        if (modulo == 2) {
            ys = -1;
        }
        if (modulo == 3) {
            xs = -1;
            ys = -1;
        }

        g2d.translate(iw*0.25, ih*0.2);
        drawTheText((Graphics2D)g2d.create(), xs*1.0,ys* 1.0);
        g2d.translate(iw*0.25, ih*0.2);
        drawTheText((Graphics2D)g2d.create(), xs*1.0,ys* 1.5);
        g2d.translate(-iw*0.2, ih*0.3);
        drawTheText((Graphics2D)g2d.create(), xs*1.5, ys*1.0);

        return Printable.PAGE_EXISTS;
    }

   private void drawTheText(Graphics2D g2d, double sx, double sy) {
      double mat[]= new double[6];

      g2d.drawOval(-75,-75,150,150);
      int degrees = 30;
      for (int i=0;i<360;i=i+degrees) {
          AffineTransform saveXfm = g2d.getTransform();
          g2d.scale(sx, sy);
          int ttype = g2d.getTransform().getType();
          String s = "ANGLE="+i;
          s +=estr;
          g2d.drawString(s, 20, 0);
          FontRenderContext frc = g2d.getFontRenderContext();
          Font f = g2d.getFont();
          Rectangle2D r2d = f.getStringBounds(s, frc);
          g2d.drawLine(20, 1, 20+(int)r2d.getWidth(), 1);
          g2d.scale(1.0/sx, 1.0/sy);
          g2d.setTransform(saveXfm);

          g2d.rotate(Math.toRadians(degrees));
      }
   }

    public void paint(Graphics g) {
      g.translate(200,200);
      g.setFont(new Font("serif", Font.PLAIN, 12));
      drawTheText((Graphics2D)g, 1.0, 1.5);
    }

     public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }
 }

}