/* There's some inefficiency here as the job set is created even though * it may never be requested. */ private synchronized void initializeAttributeSets(Doc doc, PrintRequestAttributeSet reqSet) { reqAttrSet = new HashPrintRequestAttributeSet(); jobAttrSet = new HashPrintJobAttributeSet(); Attribute[] attrs; if (reqSet != null) { reqAttrSet.addAll(reqSet); attrs = reqSet.toArray(); for (int i = 0; i < attrs.length; i++) { if (attrs[i] instanceof PrintJobAttribute) { jobAttrSet.add(attrs[i]); } } } DocAttributeSet docSet = doc.getAttributes(); if (docSet != null) { attrs = docSet.toArray(); for (int i = 0; i < attrs.length; i++) { if (attrs[i] instanceof PrintRequestAttribute) { reqAttrSet.add(attrs[i]); } if (attrs[i] instanceof PrintJobAttribute) { jobAttrSet.add(attrs[i]); } } } /* add the user name to the job */ String userName = ""; try { userName = System.getProperty("user.name"); } catch (SecurityException se) { } if (userName == null || userName.equals("")) { RequestingUserName ruName = (RequestingUserName) reqSet.get(RequestingUserName.class); if (ruName != null) { jobAttrSet.add(new JobOriginatingUserName(ruName.getValue(), ruName.getLocale())); } else { jobAttrSet.add(new JobOriginatingUserName("", null)); } } else { jobAttrSet.add(new JobOriginatingUserName(userName, null)); } /* if no job name supplied use doc name (if supplied), if none and * its a URL use that, else finally anything .. */ if (jobAttrSet.get(JobName.class) == null) { JobName jobName; if (docSet != null && docSet.get(DocumentName.class) != null) { DocumentName docName = (DocumentName) docSet.get(DocumentName.class); jobName = new JobName(docName.getValue(), docName.getLocale()); jobAttrSet.add(jobName); } else { String str = "JPS Job:" + doc; try { Object printData = doc.getPrintData(); if (printData instanceof URL) { str = ((URL) (doc.getPrintData())).toString(); } } catch (IOException e) { } jobName = new JobName(str, null); jobAttrSet.add(jobName); } } jobAttrSet = AttributeSetUtilities.unmodifiableView(jobAttrSet); }
private void getAttributeValues(DocFlavor flavor) throws PrintException { if (reqAttrSet.get(Fidelity.class) == Fidelity.FIDELITY_TRUE) { fidelity = true; } else { fidelity = false; } Class category; Attribute[] attrs = reqAttrSet.toArray(); for (int i = 0; i < attrs.length; i++) { Attribute attr = attrs[i]; category = attr.getCategory(); if (fidelity == true) { if (!service.isAttributeCategorySupported(category)) { notifyEvent(PrintJobEvent.JOB_FAILED); throw new PrintJobAttributeException("unsupported category: " + category, category, null); } else if (!service.isAttributeValueSupported(attr, flavor, null)) { notifyEvent(PrintJobEvent.JOB_FAILED); throw new PrintJobAttributeException("unsupported attribute: " + attr, null, attr); } } if (category == Destination.class) { URI uri = ((Destination) attr).getURI(); if (!"file".equals(uri.getScheme())) { notifyEvent(PrintJobEvent.JOB_FAILED); throw new PrintException("Not a file: URI"); } else { try { mDestination = (new File(uri)).getPath(); } catch (Exception e) { throw new PrintException(e); } // check write access SecurityManager security = System.getSecurityManager(); if (security != null) { try { security.checkWrite(mDestination); } catch (SecurityException se) { notifyEvent(PrintJobEvent.JOB_FAILED); throw new PrintException(se); } } } } else if (category == JobName.class) { jobName = ((JobName) attr).getValue(); } else if (category == Copies.class) { copies = ((Copies) attr).getValue(); } else if (category == Media.class) { if (attr instanceof MediaSizeName) { mediaName = (MediaSizeName) attr; // If requested MediaSizeName is not supported, // get the corresponding media size - this will // be used to create a new PageFormat. if (!service.isAttributeValueSupported(attr, null, null)) { mediaSize = MediaSize.getMediaSizeForName(mediaName); } } } else if (category == OrientationRequested.class) { orient = (OrientationRequested) attr; } } }
/** * Presents a dialog to the user for selecting a print service (printer). It is displayed at the * location specified by the application and is modal. If the specification is invalid or would * make the dialog not visible it will be displayed at a location determined by the * implementation. The dialog blocks its calling thread and is application modal. * * <p>The dialog may include a tab panel with custom UI lazily obtained from the PrintService's * ServiceUIFactory when the PrintService is browsed. The dialog will attempt to locate a * MAIN_UIROLE first as a JComponent, then as a Panel. If there is no ServiceUIFactory or no * matching role the custom tab will be empty or not visible. * * <p>The dialog returns the print service selected by the user if the user OK's the dialog and * null if the user cancels the dialog. * * <p>An application must pass in an array of print services to browse. The array must be non-null * and non-empty. Typically an application will pass in only PrintServices capable of printing a * particular document flavor. * * <p>An application may pass in a PrintService to be initially displayed. A non-null parameter * must be included in the array of browsable services. If this parameter is null a service is * chosen by the implementation. * * <p>An application may optionally pass in the flavor to be printed. If this is non-null choices * presented to the user can be better validated against those supported by the services. An * application must pass in a PrintRequestAttributeSet for returning user choices. On calling the * PrintRequestAttributeSet may be empty, or may contain application-specified values. * * <p>These are used to set the initial settings for the initially displayed print service. Values * which are not supported by the print service are ignored. As the user browses print services, * attributes and values are copied to the new display. If a user browses a print service which * does not support a particular attribute-value, the default for that service is used as the new * value to be copied. * * <p>If the user cancels the dialog, the returned attributes will not reflect any changes made by * the user. * * <p>A typical basic usage of this method may be : * * <pre>{@code * PrintService[] services = PrintServiceLookup.lookupPrintServices( * DocFlavor.INPUT_STREAM.JPEG, null); * PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); * if (services.length > 0) { * PrintService service = ServiceUI.printDialog(null, 50, 50, * services, services[0], * null, * attributes); * if (service != null) { * ... print ... * } * } * }</pre> * * <p> * * @param gc used to select screen. null means primary or default screen. * @param x location of dialog including border in screen coordinates * @param y location of dialog including border in screen coordinates * @param services to be browsable, must be non-null. * @param defaultService - initial PrintService to display. * @param flavor - the flavor to be printed, or null. * @param attributes on input is the initial application supplied preferences. This cannot be null * but may be empty. On output the attributes reflect changes made by the user. * @return print service selected by the user, or null if the user cancelled the dialog. * @throws HeadlessException if GraphicsEnvironment.isHeadless() returns true. * @throws IllegalArgumentException if services is null or empty, or attributes is null, or the * initial PrintService is not in the list of browsable services. */ public static PrintService printDialog( GraphicsConfiguration gc, int x, int y, PrintService[] services, PrintService defaultService, DocFlavor flavor, PrintRequestAttributeSet attributes) throws HeadlessException { int defaultIndex = -1; if (GraphicsEnvironment.isHeadless()) { throw new HeadlessException(); } else if ((services == null) || (services.length == 0)) { throw new IllegalArgumentException("services must be non-null " + "and non-empty"); } else if (attributes == null) { throw new IllegalArgumentException("attributes must be non-null"); } if (defaultService != null) { for (int i = 0; i < services.length; i++) { if (services[i].equals(defaultService)) { defaultIndex = i; break; } } if (defaultIndex < 0) { throw new IllegalArgumentException("services must contain " + "defaultService"); } } else { defaultIndex = 0; } // For now we set owner to null. In the future, it may be passed // as an argument. Window owner = null; Rectangle gcBounds = (gc == null) ? GraphicsEnvironment.getLocalGraphicsEnvironment() .getDefaultScreenDevice() .getDefaultConfiguration() .getBounds() : gc.getBounds(); ServiceDialog dialog; if (owner instanceof Frame) { dialog = new ServiceDialog( gc, x + gcBounds.x, y + gcBounds.y, services, defaultIndex, flavor, attributes, (Frame) owner); } else { dialog = new ServiceDialog( gc, x + gcBounds.x, y + gcBounds.y, services, defaultIndex, flavor, attributes, (Dialog) owner); } Rectangle dlgBounds = dialog.getBounds(); // get union of all GC bounds GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice[] gs = ge.getScreenDevices(); for (int j = 0; j < gs.length; j++) { gcBounds = gcBounds.union(gs[j].getDefaultConfiguration().getBounds()); } // if portion of dialog is not within the gc boundary if (!gcBounds.contains(dlgBounds)) { // put in the center relative to parent frame/dialog dialog.setLocationRelativeTo(owner); } dialog.show(); if (dialog.getStatus() == ServiceDialog.APPROVE) { PrintRequestAttributeSet newas = dialog.getAttributes(); Class dstCategory = Destination.class; Class amCategory = SunAlternateMedia.class; Class fdCategory = Fidelity.class; if (attributes.containsKey(dstCategory) && !newas.containsKey(dstCategory)) { attributes.remove(dstCategory); } if (attributes.containsKey(amCategory) && !newas.containsKey(amCategory)) { attributes.remove(amCategory); } attributes.addAll(newas); Fidelity fd = (Fidelity) attributes.get(fdCategory); if (fd != null) { if (fd == Fidelity.FIDELITY_TRUE) { removeUnsupportedAttributes(dialog.getPrintService(), flavor, attributes); } } } return dialog.getPrintService(); }