8042713: [macosx] Print dialog does not update attribute set with page range

Reviewed-by: prr, jdv
This commit is contained in:
Prasanta Sadhukhan 2016-03-30 17:17:00 +05:30
parent 61f9911480
commit dfbe023cec
3 changed files with 137 additions and 8 deletions

View File

@ -36,6 +36,7 @@ import java.security.PrivilegedAction;
import javax.print.*;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.Media;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.MediaSize;
@ -194,10 +195,37 @@ public final class CPrinterJob extends RasterPrinterJob {
// setPageRange will set firstPage and lastPage as called in getFirstPage
// and getLastPage
setPageRange(range[0][0] - 1, range[0][1] - 1);
} else {
// if rangeSelect is SunPageSelection.ALL
// then setPageRange appropriately
setPageRange(-1, -1);
}
}
}
private void setPageRangeAttribute(int from, int to, boolean isRangeSet) {
if (attributes != null) {
// since native Print use zero-based page indices,
// we need to store in 1-based format in attributes set
// but setPageRange again uses zero-based indices so it should be
// 1 less than pageRanges attribute
if (isRangeSet) {
attributes.add(new PageRanges(from+1, to+1));
attributes.add(SunPageSelection.RANGE);
setPageRange(from, to);
} else {
attributes.add(SunPageSelection.ALL);
}
}
}
private void setCopiesAttribute(int copies) {
if (attributes != null) {
attributes.add(new Copies(copies));
super.setCopies(copies);
}
}
volatile boolean onEventThread;
@Override
@ -691,9 +719,15 @@ public final class CPrinterJob extends RasterPrinterJob {
if (pageFormat != null) {
Printable printable = pageable.getPrintable(pageIndex);
if (printable != null) {
BufferedImage bimg = new BufferedImage((int)Math.round(pageFormat.getWidth()), (int)Math.round(pageFormat.getHeight()), BufferedImage.TYPE_INT_ARGB_PRE);
PeekGraphics peekGraphics = createPeekGraphics(bimg.createGraphics(), printerJob);
Rectangle2D pageFormatArea = getPageFormatArea(pageFormat);
BufferedImage bimg =
new BufferedImage(
(int)Math.round(pageFormat.getWidth()),
(int)Math.round(pageFormat.getHeight()),
BufferedImage.TYPE_INT_ARGB_PRE);
PeekGraphics peekGraphics =
createPeekGraphics(bimg.createGraphics(), printerJob);
Rectangle2D pageFormatArea =
getPageFormatArea(pageFormat);
initPrinterGraphics(peekGraphics, pageFormatArea);
// Do the assignment here!

View File

@ -312,9 +312,9 @@ static void javaPageFormatToNSPrintInfo(JNIEnv* env, jobject srcPrintJob, jobjec
static void nsPrintInfoToJavaPrinterJob(JNIEnv* env, NSPrintInfo* src, jobject dstPrinterJob, jobject dstPageable)
{
static JNF_MEMBER_CACHE(jm_setService, sjc_CPrinterJob, "setPrinterServiceFromNative", "(Ljava/lang/String;)V");
static JNF_MEMBER_CACHE(jm_setCopies, sjc_CPrinterJob, "setCopies", "(I)V");
static JNF_MEMBER_CACHE(jm_setCopiesAttribute, sjc_CPrinterJob, "setCopiesAttribute", "(I)V");
static JNF_MEMBER_CACHE(jm_setCollated, sjc_CPrinterJob, "setCollated", "(Z)V");
static JNF_MEMBER_CACHE(jm_setPageRange, sjc_CPrinterJob, "setPageRange", "(II)V");
static JNF_MEMBER_CACHE(jm_setPageRangeAttribute, sjc_CPrinterJob, "setPageRangeAttribute", "(IIZ)V");
// get the selected printer's name, and set the appropriate PrintService on the Java side
NSString *name = [[src printer] name];
@ -327,7 +327,7 @@ static void nsPrintInfoToJavaPrinterJob(JNIEnv* env, NSPrintInfo* src, jobject d
NSNumber* nsCopies = [printingDictionary objectForKey:NSPrintCopies];
if ([nsCopies respondsToSelector:@selector(integerValue)])
{
JNFCallVoidMethod(env, dstPrinterJob, jm_setCopies, [nsCopies integerValue]); // AWT_THREADING Safe (known object)
JNFCallVoidMethod(env, dstPrinterJob, jm_setCopiesAttribute, [nsCopies integerValue]); // AWT_THREADING Safe (known object)
}
NSNumber* nsCollated = [printingDictionary objectForKey:NSPrintMustCollate];
@ -340,6 +340,7 @@ static void nsPrintInfoToJavaPrinterJob(JNIEnv* env, NSPrintInfo* src, jobject d
if ([nsPrintAllPages respondsToSelector:@selector(boolValue)])
{
jint jFirstPage = 0, jLastPage = java_awt_print_Pageable_UNKNOWN_NUMBER_OF_PAGES;
jboolean isRangeSet = false;
if (![nsPrintAllPages boolValue])
{
NSNumber* nsFirstPage = [printingDictionary objectForKey:NSPrintFirstPage];
@ -353,9 +354,12 @@ static void nsPrintInfoToJavaPrinterJob(JNIEnv* env, NSPrintInfo* src, jobject d
{
jLastPage = [nsLastPage integerValue] - 1;
}
}
isRangeSet = true;
}
JNFCallVoidMethod(env, dstPrinterJob, jm_setPageRangeAttribute,
jFirstPage, jLastPage, isRangeSet);
// AWT_THREADING Safe (known object)
JNFCallVoidMethod(env, dstPrinterJob, jm_setPageRange, jFirstPage, jLastPage); // AWT_THREADING Safe (known object)
}
}

View File

@ -0,0 +1,91 @@
/*
* Copyright (c) 2016, 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 8042713
@summary Print Dialog does not update attribute set with page range
@run main/manual PrintAttributeUpdateTest
*/
import java.awt.Component;
import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.Pageable;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;
import javax.print.attribute.Attribute;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.DialogTypeSelection;
import javax.print.attribute.standard.PageRanges;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class PrintAttributeUpdateTest implements Pageable, Printable {
public static void main(String args[]) throws Exception {
String[] instructions
= {
"Select Pages Range From instead of All in print dialog. ",
"Then select Print"
};
SwingUtilities.invokeAndWait(() -> {
JOptionPane.showMessageDialog((Component) null,
instructions, "Instructions",
JOptionPane.INFORMATION_MESSAGE);
});
HashPrintRequestAttributeSet as = new HashPrintRequestAttributeSet();
PrinterJob j = PrinterJob.getPrinterJob();
j.setPageable(new PrintAttributeUpdateTest());
as.add(DialogTypeSelection.NATIVE);
j.printDialog(as);
if (as.containsKey(PageRanges.class) == false) {
throw new RuntimeException("Print Dialog did not update "
+ " attribute set with page range");
}
Attribute attrs[] = as.toArray();
for (int i = 0; i < attrs.length; i++) {
System.out.println("attr " + attrs[i]);
}
j.print(as);
}
public int getNumberOfPages() {
return UNKNOWN_NUMBER_OF_PAGES;
}
public PageFormat getPageFormat(int pageIndex) {
PageFormat pf = new PageFormat();
return pf;
}
public Printable getPrintable(int pageIndex) {
return this;
}
public int print(Graphics g, PageFormat pgFmt, int pi) {
g.drawString("Page : " + (pi + 1), 200, 200);
return PAGE_EXISTS;
}
}