1 /*
2  * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /**
25  * @test
26  * @bug 4197377
27  * @bug 4299145
28  * @bug 6358747
29  * @bug 6574633
30  * @summary Page setup dialog settings
31  * @author prr
32  * @run main/manual PageSetupDialog
33  */
34 
35 import java.awt.*;
36 import java.awt.event.*;
37 import java.awt.print.*;
38 
39 public class PageSetupDialog extends Frame implements Printable {
40 
41   PrinterJob myPrinterJob;
42   PageFormat myPageFormat;
43   Label pw, ph, pglm, pgiw, pgrm, pgtm, pgih, pgbm;
44   Label myWidthLabel;
45   Label myHeightLabel;
46   Label myImageableXLabel;
47   Label myImageableYLabel;
48   Label myImageableRightLabel;
49   Label myImageableBottomLabel;
50   Label myImageableWidthLabel;
51   Label myImageableHeightLabel;
52   Label myOrientationLabel;
53   Checkbox reverseCB;
54   boolean alpha = false;
55   boolean reverse = false;
56 
displayPageFormatAttributes()57   protected void displayPageFormatAttributes() {
58 
59     myWidthLabel.setText("Format Width = " + (float)myPageFormat.getWidth());
60     myHeightLabel.setText("Format Height = " + (float)myPageFormat.getHeight());
61     myImageableXLabel.setText
62         ("Format Left Margin = " + (float)myPageFormat.getImageableX());
63     myImageableRightLabel.setText
64         ("Format Right Margin = " + (float)(myPageFormat.getWidth() -
65         (myPageFormat.getImageableX() + myPageFormat.getImageableWidth())));
66     myImageableWidthLabel.setText
67         ("Format ImageableWidth = " + (float)myPageFormat.getImageableWidth());
68     myImageableYLabel.setText
69         ("Format Top Margin = " + (float)myPageFormat.getImageableY());
70     myImageableBottomLabel.setText
71         ("Format Bottom Margin = " + (float)(myPageFormat.getHeight() -
72         (myPageFormat.getImageableY() + myPageFormat.getImageableHeight())));
73     myImageableHeightLabel.setText
74         ("Format ImageableHeight = " + (float)myPageFormat.getImageableHeight());
75     int o = myPageFormat.getOrientation();
76     if (o == PageFormat.LANDSCAPE && reverse) {
77         o = PageFormat.REVERSE_LANDSCAPE;
78         myPageFormat.setOrientation(PageFormat.REVERSE_LANDSCAPE);
79     } else if (o == PageFormat.REVERSE_LANDSCAPE && !reverse) {
80         o = PageFormat.LANDSCAPE;
81         myPageFormat.setOrientation(PageFormat.LANDSCAPE);
82     }
83     myOrientationLabel.setText
84         ("Format Orientation = " +
85                 (o == PageFormat.PORTRAIT ? "PORTRAIT" :
86                  o == PageFormat.LANDSCAPE ? "LANDSCAPE" :
87                  o == PageFormat.REVERSE_LANDSCAPE ? "REVERSE_LANDSCAPE" :
88                  "<invalid>"));
89     Paper p = myPageFormat.getPaper();
90     pw.setText("Paper Width = " + (float)p.getWidth());
91     ph.setText("Paper Height = " + (float)p.getHeight());
92     pglm.setText("Paper Left Margin = " + (float)p.getImageableX());
93     pgiw.setText("Paper Imageable Width = " + (float)p.getImageableWidth());
94     pgrm.setText("Paper Right Margin = " +
95          (float)(p.getWidth() - (p.getImageableX()+p.getImageableWidth())));
96     pgtm.setText("Paper Top Margin = " + (float)p.getImageableY());
97     pgih.setText("Paper Imageable Height = " + (float)p.getImageableHeight());
98     pgbm.setText("Paper Bottom Margin = " +
99        (float)(p.getHeight() - (p.getImageableY()+p.getImageableHeight())));
100   }
101 
PageSetupDialog()102   public PageSetupDialog() {
103     super ("Page Dialog Test");
104     myPrinterJob = PrinterJob.getPrinterJob();
105     myPageFormat = new PageFormat();
106     Paper p = new Paper();
107     double margin = 1.5*72;
108     p.setImageableArea(margin, margin,
109                        p.getWidth()-2*margin, p.getHeight()-2*margin);
110     myPageFormat.setPaper(p);
111     Panel c = new Panel();
112     c.setLayout (new GridLayout (9, 2, 0, 0));
113     c.add (reverseCB = new Checkbox("reverse if landscape"));
114     c.add (myOrientationLabel = new Label());
115     c.add (myWidthLabel = new Label());
116     c.add (pw = new Label());
117     c.add (myImageableXLabel = new Label());
118     c.add (pglm = new Label());
119     c.add (myImageableRightLabel = new Label());
120     c.add (pgrm = new Label());
121     c.add (myImageableWidthLabel = new Label());
122     c.add (pgiw = new Label());
123     c.add (myHeightLabel = new Label());
124     c.add (ph = new Label());
125     c.add (myImageableYLabel = new Label());
126     c.add (pgtm = new Label());
127     c.add (myImageableHeightLabel = new Label());
128     c.add (pgih = new Label());
129     c.add (myImageableBottomLabel = new Label());
130     c.add (pgbm = new Label());
131 
132     reverseCB.addItemListener(new ItemListener() {
133                 public void itemStateChanged(ItemEvent e) {
134                        reverse = e.getStateChange() == ItemEvent.SELECTED;
135                        int o = myPageFormat.getOrientation();
136                        if (o == PageFormat.LANDSCAPE ||
137                            o == PageFormat.REVERSE_LANDSCAPE) {
138                            displayPageFormatAttributes();
139                        }
140                 }
141     });
142 
143     add("Center", c);
144     displayPageFormatAttributes();
145     Panel panel = new Panel();
146     Button pageButton = new Button ("Page Setup...");
147     pageButton.addActionListener(new ActionListener() {
148                 public void actionPerformed (ActionEvent e) {
149                         myPageFormat = myPrinterJob.pageDialog (myPageFormat);
150                         displayPageFormatAttributes();
151                 }
152     });
153     Button printButton = new Button ("Print ...");
154     printButton.addActionListener(new ActionListener() {
155                 public void actionPerformed (ActionEvent e) {
156                     try {
157                          if (myPrinterJob.printDialog()) {
158                              myPrinterJob.setPrintable(PageSetupDialog.this,
159                                                        myPageFormat);
160                              alpha = false;
161                              myPrinterJob.print();
162                     }
163                     } catch (PrinterException pe ) {
164                     }
165                 }
166     });
167     Button printAlphaButton = new Button ("Print w/Alpha...");
168     printAlphaButton.addActionListener(new ActionListener() {
169            public void actionPerformed (ActionEvent e) {
170                     try {
171                          if (myPrinterJob.printDialog()) {
172                              myPrinterJob.setPrintable(PageSetupDialog.this,
173                                                        myPageFormat);
174                              alpha = true;
175                              myPrinterJob.print();
176                     }
177                     } catch (PrinterException pe ) {
178                     }
179            }
180     });
181     panel.add (pageButton);
182     panel.add (printButton);
183     panel.add (printAlphaButton);
184     add("South", panel);
185     addWindowListener (new WindowAdapter() {
186          public void windowClosing (WindowEvent e) {
187             dispose();
188             System.exit (0);
189          }
190 
191       });
192       //setSize (280, 550);
193       pack();
194       setVisible (true);
195   }
196 
print(Graphics graphics, PageFormat pageFormat, int pageIndex)197   public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
198 
199      if (pageIndex > 0) {
200         return Printable.NO_SUCH_PAGE;
201      }
202 
203      Graphics2D g2d = (Graphics2D)graphics;
204      g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
205      g2d.drawString("ORIGIN("+pageFormat.getImageableX()+","+
206                              pageFormat.getImageableY()+")", 20, 20);
207      g2d.drawString("X THIS WAY", 200, 50);
208      g2d.drawString("Y THIS WAY", 60 , 200);
209      g2d.drawString("Graphics is " + g2d.getClass().getName(), 100, 100);
210      g2d.drawRect(0,0,(int)pageFormat.getImageableWidth(),
211                       (int)pageFormat.getImageableHeight());
212      if (alpha) {
213        g2d.setColor(new Color(0,0,255,192));
214      } else {
215         g2d.setColor(Color.blue);
216      }
217      g2d.drawRect(1,1,(int)pageFormat.getImageableWidth()-2,
218                       (int)pageFormat.getImageableHeight()-2);
219 
220      return  Printable.PAGE_EXISTS;
221   }
222 
main( String[] args)223   public static void main( String[] args) {
224 
225   String[] instructions =
226         {
227          "You must have a printer available to perform this test",
228          "This test is very flexible and requires much interaction.",
229          "If the platform print dialog supports it, adjust orientation",
230          "and margins and print pages and compare the results with the",
231          "request."
232        };
233       Sysout.createDialog( );
234       Sysout.printInstructions( instructions );
235 
236      new PageSetupDialog();
237   }
238 
239 }
240 
241 class Sysout {
242    private static TestDialog dialog;
243 
createDialogWithInstructions( String[] instructions )244    public static void createDialogWithInstructions( String[] instructions )
245     {
246       dialog = new TestDialog( new Frame(), "Instructions" );
247       dialog.printInstructions( instructions );
248       dialog.show();
249       println( "Any messages for the tester will display here." );
250     }
251 
createDialog( )252    public static void createDialog( )
253     {
254       dialog = new TestDialog( new Frame(), "Instructions" );
255       String[] defInstr = { "Instructions will appear here. ", "" } ;
256       dialog.printInstructions( defInstr );
257       dialog.show();
258       println( "Any messages for the tester will display here." );
259     }
260 
261 
printInstructions( String[] instructions )262    public static void printInstructions( String[] instructions )
263     {
264       dialog.printInstructions( instructions );
265     }
266 
267 
println( String messageIn )268    public static void println( String messageIn )
269     {
270       dialog.displayMessage( messageIn );
271     }
272 
273 }// Sysout  class
274 
275 /**
276   This is part of the standard test machinery.  It provides a place for the
277    test instructions to be displayed, and a place for interactive messages
278    to the user to be displayed.
279   To have the test instructions displayed, see Sysout.
280   To have a message to the user be displayed, see Sysout.
281   Do not call anything in this dialog directly.
282   */
283 class TestDialog extends Dialog {
284 
285    TextArea instructionsText;
286    TextArea messageText;
287    int maxStringLength = 80;
288 
289    //DO NOT call this directly, go through Sysout
TestDialog( Frame frame, String name )290    public TestDialog( Frame frame, String name )
291     {
292       super( frame, name );
293       int scrollBoth = TextArea.SCROLLBARS_BOTH;
294       instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
295       add( "North", instructionsText );
296 
297       messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
298       add("Center", messageText);
299 
300       pack();
301 
302       show();
303     }// TestDialog()
304 
305    //DO NOT call this directly, go through Sysout
printInstructions( String[] instructions )306    public void printInstructions( String[] instructions )
307     {
308       //Clear out any current instructions
309       instructionsText.setText( "" );
310 
311       //Go down array of instruction strings
312 
313       String printStr, remainingStr;
314       for( int i=0; i < instructions.length; i++ )
315        {
316          //chop up each into pieces maxSringLength long
317          remainingStr = instructions[ i ];
318          while( remainingStr.length() > 0 )
319           {
320             //if longer than max then chop off first max chars to print
321             if( remainingStr.length() >= maxStringLength )
322              {
323                //Try to chop on a word boundary
324                int posOfSpace = remainingStr.
325                   lastIndexOf( ' ', maxStringLength - 1 );
326 
327                if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
328 
329                printStr = remainingStr.substring( 0, posOfSpace + 1 );
330                remainingStr = remainingStr.substring( posOfSpace + 1 );
331              }
332             //else just print
333             else
334              {
335                printStr = remainingStr;
336                remainingStr = "";
337              }
338 
339             instructionsText.append( printStr + "\n" );
340 
341           }// while
342 
343        }// for
344 
345     }//printInstructions()
346 
347    //DO NOT call this directly, go through Sysout
displayMessage( String messageIn )348    public void displayMessage( String messageIn )
349     {
350       messageText.append( messageIn + "\n" );
351     }
352 
353  }// TestDialog  class
354