< prev index next >

src/java.desktop/share/classes/sun/print/RasterPrinterJob.java

Print this page

        

@@ -789,16 +789,19 @@
             }
             updateAttributesWithPageFormat(pservice, page, attributes);
             return page;
         }
 
-        final GraphicsConfiguration gc =
-            GraphicsEnvironment.getLocalGraphicsEnvironment().
+        GraphicsConfiguration grCfg = null;
+        Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
+        if (w != null) {
+            grCfg = w.getGraphicsConfiguration();
+        } else {
+            grCfg = GraphicsEnvironment.getLocalGraphicsEnvironment().
             getDefaultScreenDevice().getDefaultConfiguration();
-        Rectangle bounds = gc.getBounds();
-        int x = bounds.x+bounds.width/3;
-        int y = bounds.y+bounds.height/3;
+        }
+        final GraphicsConfiguration gc = grCfg; 
 
         PrintService service = java.security.AccessController.doPrivileged(
                                new java.security.PrivilegedAction<PrintService>() {
                 public PrintService run() {
                     PrintService service = getPrintService();

@@ -812,13 +815,48 @@
 
         if (service == null) {
             return null;
         }
 
+        // we position the dialog a little beyond the upper-left corner of the window
+        // which is consistent with the NATIVE page dialog
+        Rectangle gcBounds = gc.getBounds();
+        int x = gcBounds.x+50;
+        int y = gcBounds.y+50;
         ServiceDialog pageDialog = new ServiceDialog(gc, x, y, service,
                                        DocFlavor.SERVICE_FORMATTED.PAGEABLE,
                                        attributes, (Frame)null);
+        
+        Rectangle dlgBounds = pageDialog.getBounds();        
+
+        // if portion of dialog is not within the gc boundary
+        if (!gcBounds.contains(dlgBounds)) {
+            
+            int dlgWidth = 0;
+            int dlgHeight = 0;
+            
+            // if dialog bounds exceed window bounds, check if 
+            // positioning the dialog by moving it (bounds.x + bounds.width) - dlgBound.width 
+            // will result in moving it beyond the window bounds, then 
+            // position it at window top-left
+            // so that dialog is entirely on-screen
+            if ((gcBounds.x + gcBounds.width - dlgBounds.width) > gcBounds.x) {
+                x = (gcBounds.x + gcBounds.width) - dlgBounds.width;
+                dlgWidth = dlgBounds.width;;
+            } else {
+                x = gcBounds.x;
+                dlgWidth = gcBounds.width;
+            }
+            if ((gcBounds.y + gcBounds.height - dlgBounds.height) > gcBounds.y) {
+                y = (gcBounds.y + gcBounds.height) - dlgBounds.height;
+                dlgHeight = dlgBounds.height;
+            } else {
+                y = gcBounds.y;
+                dlgHeight = gcBounds.height;
+            }           
+            pageDialog.setBounds(x, y, dlgWidth, dlgHeight);
+        }
         pageDialog.show();
 
         if (pageDialog.getStatus() == ServiceDialog.APPROVE) {
             PrintRequestAttributeSet newas =
                 pageDialog.getAttributes();

@@ -891,13 +929,19 @@
          * to a chosen printer.
          *
          * We raise privilege when we put up the dialog, to avoid
          * the "warning applet window" banner.
          */
-        final GraphicsConfiguration gc =
-            GraphicsEnvironment.getLocalGraphicsEnvironment().
+        GraphicsConfiguration grCfg = null;
+        Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow();
+        if (w != null) {
+            grCfg = w.getGraphicsConfiguration();
+        } else {
+            grCfg = GraphicsEnvironment.getLocalGraphicsEnvironment().
             getDefaultScreenDevice().getDefaultConfiguration();
+        }
+        final GraphicsConfiguration gc = grCfg;   
 
         PrintService service = java.security.AccessController.doPrivileged(
                                new java.security.PrivilegedAction<PrintService>() {
                 public PrintService run() {
                     PrintService service = getPrintService();

@@ -938,13 +982,14 @@
                 services = new PrintService[1];
                 services[0] = service;
             }
         }
 
-        Rectangle bounds = gc.getBounds();
-        int x = bounds.x+bounds.width/3;
-        int y = bounds.y+bounds.height/3;
+        // we position the dialog a little beyond the upper-left corner of the window
+        // which is consistent with the NATIVE print dialog
+        int x = 50;
+        int y = 50;
         PrintService newService;
         // temporarily add an attribute pointing back to this job.
         PrinterJobWrapper jobWrapper = new PrinterJobWrapper(this);
         attributes.add(jobWrapper);
         try {
< prev index next >