| /* PrinterDialog.java -- |
| Copyright (C) 2006 Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Classpath 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 for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 02110-1301 USA. |
| |
| Linking this library statically or dynamically with other modules is |
| making a combined work based on this library. Thus, the terms and |
| conditions of the GNU General Public License cover the whole |
| combination. |
| |
| As a special exception, the copyright holders of this library give you |
| permission to link this library with independent modules to produce an |
| executable, regardless of the license terms of these independent |
| modules, and to copy and distribute the resulting executable under |
| terms of your choice, provided that you also meet, for each linked |
| independent module, the terms and conditions of the license of that |
| module. An independent module is a module which is not derived from |
| or based on this library. If you modify this library, you may extend |
| this exception to your version of the library, but you are not |
| obligated to do so. If you do not wish to do so, delete this |
| exception statement from your version. */ |
| |
| package gnu.javax.print; |
| |
| import java.awt.BorderLayout; |
| import java.awt.Dimension; |
| import java.awt.Frame; |
| import java.awt.GraphicsConfiguration; |
| import java.awt.GridBagConstraints; |
| import java.awt.GridBagLayout; |
| import java.awt.HeadlessException; |
| import java.awt.Insets; |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| import java.awt.event.FocusEvent; |
| import java.awt.event.FocusListener; |
| import java.util.ArrayList; |
| import java.util.ResourceBundle; |
| |
| import javax.print.DocFlavor; |
| import javax.print.PrintService; |
| import javax.print.attribute.Attribute; |
| import javax.print.attribute.HashPrintRequestAttributeSet; |
| import javax.print.attribute.PrintRequestAttributeSet; |
| import javax.print.attribute.standard.Chromaticity; |
| import javax.print.attribute.standard.Copies; |
| import javax.print.attribute.standard.Destination; |
| import javax.print.attribute.standard.JobName; |
| import javax.print.attribute.standard.JobPriority; |
| import javax.print.attribute.standard.JobSheets; |
| import javax.print.attribute.standard.Media; |
| import javax.print.attribute.standard.MediaPrintableArea; |
| import javax.print.attribute.standard.OrientationRequested; |
| import javax.print.attribute.standard.PageRanges; |
| import javax.print.attribute.standard.PrintQuality; |
| import javax.print.attribute.standard.PrinterInfo; |
| import javax.print.attribute.standard.PrinterIsAcceptingJobs; |
| import javax.print.attribute.standard.PrinterMakeAndModel; |
| import javax.print.attribute.standard.PrinterState; |
| import javax.print.attribute.standard.RequestingUserName; |
| import javax.print.attribute.standard.SheetCollate; |
| import javax.print.attribute.standard.Sides; |
| import javax.swing.BorderFactory; |
| import javax.swing.Box; |
| import javax.swing.BoxLayout; |
| import javax.swing.ButtonGroup; |
| import javax.swing.JButton; |
| import javax.swing.JCheckBox; |
| import javax.swing.JComboBox; |
| import javax.swing.JDialog; |
| import javax.swing.JLabel; |
| import javax.swing.JPanel; |
| import javax.swing.JRadioButton; |
| import javax.swing.JSpinner; |
| import javax.swing.JTabbedPane; |
| import javax.swing.JTextField; |
| import javax.swing.SpinnerNumberModel; |
| import javax.swing.border.TitledBorder; |
| import javax.swing.event.ChangeEvent; |
| import javax.swing.event.ChangeListener; |
| |
| /** |
| * Implementation of the PrinterDialog used by |
| * {@link javax.print.ServiceUI} for visual selection |
| * of print services and its attributes. |
| * |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| public final class PrinterDialog extends JDialog implements ActionListener |
| { |
| |
| /** |
| * The General Panel used in the printing dialog. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class GeneralPanel extends JPanel |
| { |
| /** |
| * Handles the copies attribute. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class CopiesAndSorted extends JPanel |
| implements ChangeListener, ActionListener |
| { |
| private JCheckBox sort; |
| private JSpinner copies; |
| private JLabel copies_lb; |
| private SpinnerNumberModel copiesModel; |
| |
| CopiesAndSorted() |
| { |
| copies_lb = new JLabel(getLocalizedString("lb.copies")); |
| sort = new JCheckBox(getLocalizedString("cb.sort")); |
| sort.addActionListener(this); |
| |
| copiesModel = new SpinnerNumberModel(1, 1, 9999, 1); |
| copies = new JSpinner(copiesModel); |
| copies.addChangeListener(this); |
| |
| GridBagLayout layout = new GridBagLayout(); |
| GridBagConstraints c = new GridBagConstraints(); |
| c.fill = GridBagConstraints.BOTH; |
| c.insets = new Insets(5, 5, 5, 5); |
| |
| setLayout(layout); |
| setBorder(new TitledBorder(getLocalizedString("title.copies"))); |
| |
| c.anchor = GridBagConstraints.WEST; |
| |
| c.gridx = 0; |
| c.gridy = 0; |
| add(copies_lb, c); |
| |
| c.gridx = 1; |
| c.gridy = 0; |
| add(copies, c); |
| |
| c.gridx = 0; |
| c.gridy = 1; |
| add(sort, c); |
| } |
| |
| // copies jspinner state |
| public void stateChanged(ChangeEvent event) |
| { |
| int value = ((Integer) copies.getValue()).intValue(); |
| atts.add(new Copies(value)); |
| |
| if (value > 1 && categorySupported(SheetCollate.class)) |
| sort.setEnabled(true); |
| else |
| sort.setEnabled(false); |
| } |
| |
| // sorted checkbox state |
| public void actionPerformed(ActionEvent event) |
| { |
| if (sort.isSelected()) |
| atts.add(SheetCollate.COLLATED); |
| } |
| |
| /** |
| * Called to update for new selected |
| * print service. Tests if currently |
| * selected attributes are supported. |
| */ |
| void updateForSelectedService() |
| { |
| if (categorySupported(Copies.class)) |
| { |
| copies.setEnabled(true); |
| copies_lb.setEnabled(true); |
| |
| Copies copies = (Copies) attribute(Copies.class); |
| if (copies != null) |
| copiesModel.setValue(new Integer(copies.getValue())); |
| |
| if (((Integer)copiesModel.getValue()).intValue() > 1 |
| && categorySupported(SheetCollate.class)) |
| { |
| sort.setEnabled(true); |
| Attribute collate = attribute(SheetCollate.class); |
| if (collate != null && collate.equals(SheetCollate.COLLATED)) |
| sort.setSelected(true); |
| } |
| else |
| sort.setEnabled(false); |
| } |
| else |
| { |
| copies.setEnabled(false); |
| copies_lb.setEnabled(false); |
| } |
| } |
| } |
| |
| /** |
| * Handles the print ranges attribute. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class PrintRange extends JPanel |
| implements ActionListener, FocusListener |
| { |
| private JLabel to; |
| private JRadioButton all_rb, pages_rb; |
| private JTextField from_tf, to_tf; |
| |
| PrintRange() |
| { |
| to = new JLabel(getLocalizedString("lb.to")); |
| to.setEnabled(false); |
| |
| all_rb = new JRadioButton(getLocalizedString("rbt.all")); |
| all_rb.setSelected(true); |
| all_rb.setActionCommand("ALL"); |
| all_rb.addActionListener(this); |
| pages_rb = new JRadioButton(getLocalizedString("rbt.pages")); |
| pages_rb.setActionCommand("PAGES"); |
| pages_rb.setEnabled(false); |
| pages_rb.addActionListener(this); |
| |
| ButtonGroup group = new ButtonGroup(); |
| group.add(all_rb); |
| group.add(pages_rb); |
| |
| from_tf = new JTextField("1", 4); |
| from_tf.setEnabled(false); |
| from_tf.addFocusListener(this); |
| to_tf = new JTextField("1", 4); |
| to_tf.setEnabled(false); |
| to_tf.addFocusListener(this); |
| |
| GridBagLayout layout = new GridBagLayout(); |
| GridBagConstraints c = new GridBagConstraints(); |
| c.fill = GridBagConstraints.BOTH; |
| |
| setLayout(layout); |
| setBorder(new TitledBorder(getLocalizedString("title.printrange"))); |
| |
| c.insets = new Insets(15, 5, 5, 5); |
| c.gridx = 0; |
| c.gridy = 0; |
| add(all_rb, c); |
| |
| c.insets = new Insets(5, 5, 15, 5); |
| c.gridx = 0; |
| c.gridy = 1; |
| add(pages_rb, c); |
| |
| c.gridx = 1; |
| c.gridy = 1; |
| add(from_tf, c); |
| |
| c.gridx = 2; |
| c.gridy = 1; |
| add(to, c); |
| |
| c.insets = new Insets(5, 5, 15, 15); |
| c.gridx = 3; |
| c.gridy = 1; |
| add(to_tf, c); |
| } |
| |
| // focus pagerange |
| public void focusGained(FocusEvent event) |
| { |
| updatePageRanges(); |
| } |
| |
| public void focusLost(FocusEvent event) |
| { |
| updatePageRanges(); |
| } |
| |
| // updates the range after user changed it |
| private void updatePageRanges() |
| { |
| int lower = Integer.parseInt(from_tf.getText()); |
| int upper = Integer.parseInt(to_tf.getText()); |
| |
| if (lower > upper) |
| { |
| upper = lower; |
| to_tf.setText("" + lower); |
| } |
| |
| PageRanges range = new PageRanges(lower, upper); |
| atts.add(range); |
| } |
| |
| // page range change |
| public void actionPerformed(ActionEvent e) |
| { |
| // if ALL is selected we must use a full-range object |
| if (e.getActionCommand().equals("ALL")) |
| { |
| from_tf.setEnabled(false); |
| to.setEnabled(false); |
| to_tf.setEnabled(false); |
| |
| atts.add(new PageRanges(1, Integer.MAX_VALUE)); |
| } |
| else |
| { |
| from_tf.setEnabled(true); |
| to.setEnabled(true); |
| to_tf.setEnabled(true); |
| all_rb.setSelected(false); |
| } |
| } |
| |
| /** |
| * Called to update for new selected |
| * print service. Tests if currently |
| * selected attributes are supported. |
| */ |
| void updateForSelectedService() |
| { |
| if (categorySupported(PageRanges.class)) |
| { |
| pages_rb.setEnabled(true); |
| PageRanges range = (PageRanges) attribute(PageRanges.class); |
| if (range != null) |
| { |
| from_tf.setEnabled(true); |
| to.setEnabled(true); |
| to_tf.setEnabled(true); |
| all_rb.setSelected(false); |
| pages_rb.setSelected(true); |
| |
| int[][] members = range.getMembers(); |
| // Although passed in attributes may contain more than one |
| // range we only take the first one |
| from_tf.setText("" + members[0][0]); |
| to_tf.setText("" + members[0][1]); |
| } |
| } |
| else |
| { |
| from_tf.setEnabled(false); |
| to.setEnabled(false); |
| to_tf.setEnabled(false); |
| all_rb.setSelected(true); |
| } |
| } |
| } |
| |
| /** |
| * Handles the selection of the print services |
| * and its location and description attributes. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class PrintServices extends JPanel |
| implements ActionListener |
| { |
| private JLabel name, status, typ, info; |
| private JLabel statusValue, typValue, infoValue; |
| private JButton attributes; |
| private JComboBox services_cob; |
| private JCheckBox fileRedirection_cb; |
| |
| PrintServices() |
| { |
| name = new JLabel(getLocalizedString("lb.name")); |
| status = new JLabel(getLocalizedString("lb.status")); |
| typ = new JLabel(getLocalizedString("lb.typ")); |
| info = new JLabel(getLocalizedString("lb.info")); |
| typValue = new JLabel(); |
| infoValue = new JLabel(); |
| statusValue = new JLabel(); |
| |
| attributes = new JButton(getLocalizedString("bt.attributes")); |
| attributes.setEnabled(false); |
| attributes.setActionCommand("ATTRIBUTES"); |
| attributes.addActionListener(this); |
| |
| services_cob = new JComboBox(getPrintServices()); |
| services_cob.setActionCommand("SERVICE"); |
| services_cob.addActionListener(this); |
| |
| fileRedirection_cb = new JCheckBox(getLocalizedString("cb.output")); |
| fileRedirection_cb.setEnabled(false); |
| |
| GridBagLayout layout = new GridBagLayout(); |
| GridBagConstraints c = new GridBagConstraints(); |
| |
| setLayout(layout); |
| setBorder(new TitledBorder(getLocalizedString("title.printservice"))); |
| |
| c.insets = new Insets(5, 5, 5, 5); |
| c.anchor = GridBagConstraints.LINE_END; |
| c.gridx = 0; |
| c.gridy = 0; |
| add(name, c); |
| |
| c.gridx = 0; |
| c.gridy = 1; |
| add(status, c); |
| |
| c.gridx = 0; |
| c.gridy = 2; |
| add(typ, c); |
| |
| c.gridx = 0; |
| c.gridy = 3; |
| add(info, c); |
| |
| c.gridx = 2; |
| c.gridy = 3; |
| c.weightx = 1; |
| add(fileRedirection_cb, c); |
| |
| c.anchor = GridBagConstraints.LINE_START; |
| c.fill = GridBagConstraints.HORIZONTAL; |
| c.gridx = 1; |
| c.gridy = 0; |
| c.weightx = 1.5; |
| add(services_cob, c); |
| |
| c.gridx = 1; |
| c.gridy = 1; |
| c.gridwidth = 2; |
| c.weightx = 1; |
| add(statusValue, c); |
| |
| c.gridx = 1; |
| c.gridy = 2; |
| c.gridwidth = 2; |
| c.weightx = 1; |
| add(typValue, c); |
| |
| c.gridx = 1; |
| c.gridy = 3; |
| c.gridwidth = 2; |
| c.weightx = 1; |
| add(infoValue, c); |
| |
| c.gridx = 2; |
| c.gridy = 0; |
| c.weightx = 1.5; |
| add(attributes, c); |
| } |
| |
| public void actionPerformed(ActionEvent e) |
| { |
| if (e.getActionCommand().equals("SERVICE")) |
| { |
| setSelectedPrintService((PrintService) services_cob.getSelectedItem()); |
| updateAll(); |
| } |
| else if (e.getActionCommand().equals("ATTRIBUTES")) |
| { |
| // TODO LowPriority-Enhancement: As tests have shown this button |
| // is even gray and not enabled under Windows - Its a good place |
| // to provide a classpath specific browsing dialog for all |
| // attributes not in the default printing dialog. |
| } |
| } |
| |
| /** |
| * Called to update for new selected |
| * print service. Tests if currently |
| * selected attributes are supported. |
| */ |
| void updateForSelectedService() |
| { |
| PrinterMakeAndModel att1 = (PrinterMakeAndModel) |
| getSelectedPrintService().getAttribute(PrinterMakeAndModel.class); |
| typValue.setText(att1 == null ? "" : att1.getValue()); |
| |
| PrinterInfo att2 = (PrinterInfo) |
| getSelectedPrintService().getAttribute(PrinterInfo.class); |
| infoValue.setText(att2 == null ? "" : att2.getValue()); |
| |
| PrinterIsAcceptingJobs att3 = (PrinterIsAcceptingJobs) |
| getSelectedPrintService().getAttribute(PrinterIsAcceptingJobs.class); |
| PrinterState att4 = (PrinterState) |
| getSelectedPrintService().getAttribute(PrinterState.class); |
| |
| String status = att4.toString(); |
| if (att3 == PrinterIsAcceptingJobs.ACCEPTING_JOBS) |
| status += " - " + getLocalizedString("lb.acceptingjobs"); |
| else if (att3 == PrinterIsAcceptingJobs.NOT_ACCEPTING_JOBS) |
| status += " - " + getLocalizedString("lb.notacceptingjobs"); |
| |
| statusValue.setText(status); |
| |
| if (categorySupported(Destination.class)) |
| { |
| fileRedirection_cb.setEnabled(false); |
| } |
| } |
| |
| } |
| |
| private PrintServices printserv_panel; |
| private PrintRange printrange_panel; |
| private CopiesAndSorted copies; |
| |
| /** |
| * Constructs the General Panel. |
| */ |
| public GeneralPanel() |
| { |
| setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); |
| |
| printserv_panel = new PrintServices(); |
| printrange_panel = new PrintRange(); |
| copies = new CopiesAndSorted(); |
| |
| JPanel layout_panel = new JPanel(); |
| layout_panel.setLayout(new BoxLayout(layout_panel, BoxLayout.LINE_AXIS)); |
| layout_panel.add(printrange_panel); |
| layout_panel.add(Box.createRigidArea(new Dimension(10, 0))); |
| layout_panel.add(copies); |
| |
| setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); |
| add(printserv_panel); |
| add(Box.createRigidArea(new Dimension(0, 12))); |
| add(layout_panel); |
| } |
| |
| /** |
| * Calls update on all internal panels to adjust |
| * for a new selected print service. |
| */ |
| void update() |
| { |
| printserv_panel.updateForSelectedService(); |
| printrange_panel.updateForSelectedService(); |
| copies.updateForSelectedService(); |
| } |
| } |
| |
| /** |
| * The Page setup Panel. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class PageSetupPanel extends JPanel |
| { |
| /** |
| * Handles the orientation attribute. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class Orientation extends JPanel implements ActionListener |
| { |
| private JRadioButton portrait, landscape, rev_portrait, rev_landscape; |
| |
| Orientation() |
| { |
| portrait = new JRadioButton(getLocalizedString("rbt.portrait")); |
| portrait.addActionListener(this); |
| landscape = new JRadioButton(getLocalizedString("rbt.landscape")); |
| landscape.addActionListener(this); |
| rev_portrait = new JRadioButton(getLocalizedString("rbt.revportrait")); |
| rev_portrait.addActionListener(this); |
| rev_landscape = new JRadioButton(getLocalizedString("rbt.revlandscape")); |
| rev_landscape.addActionListener(this); |
| |
| ButtonGroup group = new ButtonGroup(); |
| group.add(portrait); |
| group.add(landscape); |
| group.add(rev_portrait); |
| group.add(rev_landscape); |
| |
| GridBagLayout layout = new GridBagLayout(); |
| GridBagConstraints c = new GridBagConstraints(); |
| c.fill = GridBagConstraints.BOTH; |
| |
| setLayout(layout); |
| setBorder(new TitledBorder(getLocalizedString("title.orientation"))); |
| |
| c.insets = new Insets(5, 5, 5, 5); |
| c.gridx = 0; |
| c.gridy = 0; |
| add(portrait, c); |
| |
| c.gridx = 0; |
| c.gridy = 1; |
| add(landscape, c); |
| |
| c.gridx = 0; |
| c.gridy = 2; |
| add(rev_portrait, c); |
| |
| c.gridx = 0; |
| c.gridy = 3; |
| add(rev_landscape, c); |
| } |
| |
| // event handling orientation |
| public void actionPerformed(ActionEvent e) |
| { |
| if (e.getSource() == portrait) |
| atts.add(OrientationRequested.PORTRAIT); |
| else if (e.getSource() == landscape) |
| atts.add(OrientationRequested.LANDSCAPE); |
| else if (e.getSource() == rev_portrait) |
| atts.add(OrientationRequested.REVERSE_PORTRAIT); |
| else |
| atts.add(OrientationRequested.REVERSE_LANDSCAPE); |
| } |
| |
| /** |
| * Called to update for new selected |
| * print service. Tests if currently |
| * selected attributes are supported. |
| */ |
| void updateForSelectedService() |
| { |
| if (categorySupported(OrientationRequested.class)) |
| { |
| portrait.setEnabled(true); |
| landscape.setEnabled(true); |
| rev_landscape.setEnabled(true); |
| rev_portrait.setEnabled(true); |
| |
| Attribute orientation = attribute(OrientationRequested.class); |
| if (orientation != null) |
| { |
| if (orientation.equals(OrientationRequested.LANDSCAPE)) |
| landscape.setSelected(true); |
| else if (orientation.equals(OrientationRequested.PORTRAIT)) |
| portrait.setSelected(true); |
| else if (orientation.equals(OrientationRequested.REVERSE_PORTRAIT)) |
| rev_portrait.setSelected(true); |
| else |
| rev_landscape.setSelected(true); |
| } |
| else |
| { |
| Object defaultValue = defaultValue(OrientationRequested.class); |
| if (defaultValue.equals(OrientationRequested.LANDSCAPE)) |
| landscape.setSelected(true); |
| else if (defaultValue.equals(OrientationRequested.PORTRAIT)) |
| portrait.setSelected(true); |
| else if (defaultValue.equals(OrientationRequested.REVERSE_PORTRAIT)) |
| rev_portrait.setSelected(true); |
| else |
| rev_landscape.setSelected(true); |
| } |
| } |
| else |
| { |
| portrait.setEnabled(false); |
| landscape.setEnabled(false); |
| rev_landscape.setEnabled(false); |
| rev_portrait.setEnabled(false); |
| } |
| } |
| } |
| |
| /** |
| * Handles the media attribute. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class MediaTypes extends JPanel implements ActionListener |
| { |
| private JLabel size_lb, source_lb; |
| private JComboBox size, source; |
| |
| MediaTypes() |
| { |
| size_lb = new JLabel(getLocalizedString("lb.size")); |
| source_lb = new JLabel(getLocalizedString("lb.source")); |
| |
| size = new JComboBox(); |
| size.setEditable(false); |
| size.addActionListener(this); |
| source = new JComboBox(); |
| source.setEditable(false); |
| size.addActionListener(this); |
| |
| GridBagLayout layout = new GridBagLayout(); |
| GridBagConstraints c = new GridBagConstraints(); |
| |
| setLayout(layout); |
| setBorder(new TitledBorder(getLocalizedString("title.medias"))); |
| |
| c.insets = new Insets(5, 5, 5, 5); |
| c.anchor = GridBagConstraints.LINE_END; |
| c.gridx = 0; |
| c.gridy = 0; |
| add(size_lb, c); |
| |
| c.gridx = 0; |
| c.gridy = 1; |
| add(source_lb, c); |
| |
| c.anchor = GridBagConstraints.LINE_START; |
| c.fill = GridBagConstraints.HORIZONTAL; |
| c.gridx = 1; |
| c.gridy = 0; |
| c.weightx = 1.5; |
| add(size, c); |
| |
| c.gridx = 1; |
| c.gridy = 1; |
| c.weightx = 1.5; |
| add(source, c); |
| } |
| |
| public void actionPerformed(ActionEvent event) |
| { |
| if (event.getSource() == size) |
| { |
| Object obj = size.getSelectedItem(); |
| if (obj instanceof Media) |
| atts.add((Media) obj); |
| } |
| |
| // we ignore source events currently |
| // as only the automatic selection is used. |
| } |
| |
| /** |
| * Called to update for new selected |
| * print service. Tests if currently |
| * selected attributes are supported. |
| */ |
| void updateForSelectedService() |
| { |
| if (categorySupported(Media.class)) |
| { |
| Media[] medias = (Media[]) getSelectedPrintService() |
| .getSupportedAttributeValues(Media.class, flavor, null); |
| |
| size.removeAllItems(); |
| if (medias.length == 0) |
| size.addItem(getLocalizedString("lb.automatically")); |
| else |
| for (int i=0; i < medias.length; i++) |
| size.addItem(medias[i]); |
| |
| Media media = (Media) attribute(Media.class); |
| if (media != null) |
| size.setSelectedItem(media); |
| |
| // this is currently ignored |
| source.removeAllItems(); |
| source.addItem(getLocalizedString("lb.automatically")); |
| } |
| else |
| { |
| size.removeAllItems(); |
| source.removeAllItems(); |
| |
| size.addItem(getLocalizedString("lb.automatically")); |
| source.addItem(getLocalizedString("lb.automatically")); |
| } |
| } |
| } |
| |
| /** |
| * Handles the media printable area attribute. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class Margins extends JPanel implements FocusListener |
| { |
| private JLabel left, right, top, bottom; |
| private JTextField left_tf, right_tf, top_tf, bottom_tf; |
| |
| Margins() |
| { |
| left = new JLabel(getLocalizedString("lb.left")); |
| right = new JLabel(getLocalizedString("lb.right")); |
| top = new JLabel(getLocalizedString("lb.top")); |
| bottom = new JLabel(getLocalizedString("lb.bottom")); |
| |
| left_tf = new JTextField(7); |
| left_tf.addFocusListener(this); |
| right_tf = new JTextField(7); |
| right_tf.addFocusListener(this); |
| top_tf = new JTextField(7); |
| top_tf.addFocusListener(this); |
| bottom_tf = new JTextField(7); |
| bottom_tf.addFocusListener(this); |
| |
| GridBagLayout layout = new GridBagLayout(); |
| GridBagConstraints c = new GridBagConstraints(); |
| |
| setLayout(layout); |
| setBorder(new TitledBorder(getLocalizedString("title.margins"))); |
| |
| c.insets = new Insets(5, 5, 5, 5); |
| c.gridx = 0; |
| c.gridy = 0; |
| add(left, c); |
| |
| c.gridx = 1; |
| c.gridy = 0; |
| add(right, c); |
| |
| c.insets = new Insets(5, 5, 5, 5); |
| c.gridx = 0; |
| c.gridy = 1; |
| add(left_tf, c); |
| |
| c.gridx = 1; |
| c.gridy = 1; |
| add(right_tf, c); |
| |
| c.insets = new Insets(10, 5, 5, 5); |
| c.gridx = 0; |
| c.gridy = 2; |
| add(top, c); |
| |
| c.gridx = 1; |
| c.gridy = 2; |
| add(bottom, c); |
| |
| c.insets = new Insets(0, 5, 5, 5); |
| c.gridx = 0; |
| c.gridy = 3; |
| add(top_tf, c); |
| |
| c.gridx = 1; |
| c.gridy = 3; |
| add(bottom_tf, c); |
| } |
| |
| public void focusGained(FocusEvent event) |
| { |
| updateMargins(); |
| } |
| |
| public void focusLost(FocusEvent event) |
| { |
| updateMargins(); |
| } |
| |
| // updates the margins after user changed it |
| private void updateMargins() |
| { |
| // We currently do not support this attribute |
| // as it is not in the IPP spec and therefore not in CUPS |
| } |
| |
| /** |
| * Called to update for new selected |
| * print service. Tests if currently |
| * selected attributes are supported. |
| */ |
| void updateForSelectedService() |
| { |
| if (categorySupported(MediaPrintableArea.class)) |
| { |
| left.setEnabled(true); |
| right.setEnabled(true); |
| top.setEnabled(true); |
| bottom.setEnabled(true); |
| left_tf.setEnabled(true); |
| right_tf.setEnabled(true); |
| top_tf.setEnabled(true); |
| bottom_tf.setEnabled(true); |
| } |
| else |
| { |
| left.setEnabled(false); |
| right.setEnabled(false); |
| top.setEnabled(false); |
| bottom.setEnabled(false); |
| left_tf.setEnabled(false); |
| right_tf.setEnabled(false); |
| top_tf.setEnabled(false); |
| bottom_tf.setEnabled(false); |
| } |
| } |
| } |
| |
| private MediaTypes media_panel; |
| private Orientation orientation_panel; |
| private Margins margins_panel; |
| |
| /** |
| * Constructs the page setup user interface. |
| */ |
| public PageSetupPanel() |
| { |
| setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); |
| |
| media_panel = new MediaTypes(); |
| orientation_panel = new Orientation(); |
| margins_panel = new Margins(); |
| |
| JPanel layout_panel = new JPanel(); |
| layout_panel.setLayout(new BoxLayout(layout_panel, BoxLayout.LINE_AXIS)); |
| layout_panel.add(orientation_panel); |
| layout_panel.add(Box.createRigidArea(new Dimension(10, 0))); |
| layout_panel.add(margins_panel); |
| |
| setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); |
| add(media_panel); |
| add(Box.createRigidArea(new Dimension(0, 12))); |
| add(layout_panel); |
| } |
| |
| /** |
| * Calls update on all internal panels to adjust |
| * for a new selected print service. |
| */ |
| void update() |
| { |
| media_panel.updateForSelectedService(); |
| orientation_panel.updateForSelectedService(); |
| margins_panel.updateForSelectedService(); |
| } |
| } |
| |
| /** |
| * The Appearance panel for quality, color etc. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class AppearancePanel extends JPanel |
| { |
| /** |
| * Handles the print quality attribute. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class Quality extends JPanel implements ActionListener |
| { |
| private JRadioButton low, normal, high; |
| private ButtonGroup group; |
| |
| Quality() |
| { |
| low = new JRadioButton(getLocalizedString("rbt.low")); |
| low.addActionListener(this); |
| normal = new JRadioButton(getLocalizedString("rbt.normal")); |
| normal.addActionListener(this); |
| high = new JRadioButton(getLocalizedString("rbt.high")); |
| high.addActionListener(this); |
| |
| group = new ButtonGroup(); |
| group.add(low); |
| group.add(normal); |
| group.add(high); |
| |
| GridBagLayout layout = new GridBagLayout(); |
| GridBagConstraints c = new GridBagConstraints(); |
| |
| setLayout(layout); |
| setBorder(new TitledBorder(getLocalizedString("title.quality"))); |
| |
| c.fill = GridBagConstraints.HORIZONTAL; |
| c.insets = new Insets(5, 5, 5, 5); |
| c.gridx = 0; |
| c.gridy = 0; |
| add(low, c); |
| |
| c.gridx = 0; |
| c.gridy = 1; |
| add(normal, c); |
| |
| c.gridx = 0; |
| c.gridy = 2; |
| add(high, c); |
| } |
| |
| public void actionPerformed(ActionEvent e) |
| { |
| if (e.getSource() == low) |
| atts.add(PrintQuality.DRAFT); |
| else if (e.getSource() == normal) |
| atts.add(PrintQuality.NORMAL); |
| else |
| atts.add(PrintQuality.HIGH); |
| } |
| |
| /** |
| * Called to update for new selected |
| * print service. Tests if currently |
| * selected attributes are supported. |
| */ |
| void updateForSelectedService() |
| { |
| if (categorySupported(PrintQuality.class)) |
| { |
| low.setEnabled(true); |
| normal.setEnabled(true); |
| high.setEnabled(true); |
| |
| Object defaultValue = defaultValue(PrintQuality.class); |
| Attribute quality = attribute(PrintQuality.class); |
| |
| if (quality != null) |
| { |
| if (quality.equals(PrintQuality.DRAFT)) |
| low.setSelected(true); |
| else if (quality.equals(PrintQuality.NORMAL)) |
| normal.setSelected(true); |
| else |
| high.setSelected(true); |
| } |
| else |
| { |
| if (defaultValue.equals(PrintQuality.DRAFT)) |
| low.setSelected(true); |
| else if (defaultValue.equals(PrintQuality.NORMAL)) |
| normal.setSelected(true); |
| else |
| high.setSelected(true); |
| } |
| } |
| else |
| { |
| low.setEnabled(false); |
| normal.setEnabled(false); |
| high.setEnabled(false); |
| } |
| } |
| } |
| |
| /** |
| * Handles the job attributes as requesting username, jobname etc. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class JobAttributes extends JPanel |
| implements ActionListener, ChangeListener, FocusListener |
| { |
| private JLabel jobname, username, priority_lb; |
| private JTextField jobname_tf, username_tf; |
| private JCheckBox cover; |
| private JSpinner priority; |
| private SpinnerNumberModel model; |
| |
| JobAttributes() |
| { |
| jobname = new JLabel(getLocalizedString("lb.jobname")); |
| username = new JLabel(getLocalizedString("lb.username")); |
| priority_lb = new JLabel(getLocalizedString("lb.priority")); |
| |
| cover = new JCheckBox(getLocalizedString("cb.cover")); |
| cover.addActionListener(this); |
| |
| model = new SpinnerNumberModel(1, 1, 100, 1); |
| priority = new JSpinner(model); |
| priority.addChangeListener(this); |
| |
| jobname_tf = new JTextField(); |
| jobname_tf.addFocusListener(this); |
| username_tf = new JTextField(); |
| username_tf.addFocusListener(this); |
| |
| GridBagLayout layout = new GridBagLayout(); |
| GridBagConstraints c = new GridBagConstraints(); |
| |
| setLayout(layout); |
| setBorder(new TitledBorder(getLocalizedString("title.jobattributes"))); |
| |
| c.insets = new Insets(10, 5, 10, 5); |
| c.gridx = 0; |
| c.gridy = 0; |
| add(cover, c); |
| |
| c.anchor = GridBagConstraints.LINE_END; |
| c.gridx = 1; |
| c.gridy = 0; |
| c.weightx = 2; |
| add(priority_lb, c); |
| |
| c.gridx = 2; |
| c.gridy = 0; |
| c.weightx = 0.5; |
| add(priority, c); |
| |
| c.anchor = GridBagConstraints.LINE_END; |
| c.gridx = 0; |
| c.gridy = 1; |
| add(jobname, c); |
| |
| c.gridx = 0; |
| c.gridy = 2; |
| add(username, c); |
| |
| c.anchor = GridBagConstraints.CENTER; |
| c.fill = GridBagConstraints.HORIZONTAL; |
| c.gridx = 1; |
| c.gridy = 1; |
| c.gridwidth = 2; |
| c.weightx = 1.5; |
| add(jobname_tf, c); |
| |
| c.insets = new Insets(10, 5, 15, 5); |
| c.gridx = 1; |
| c.gridy = 2; |
| add(username_tf, c); |
| } |
| |
| public void actionPerformed(ActionEvent event) |
| { |
| if (cover.isSelected()) |
| atts.add(JobSheets.STANDARD); |
| else |
| atts.add(JobSheets.NONE); |
| } |
| |
| public void stateChanged(ChangeEvent event) |
| { |
| int value = ((Integer) priority.getValue()).intValue(); |
| atts.add(new JobPriority(value)); |
| } |
| |
| public void focusGained(FocusEvent event) |
| { |
| updateTextfields(event); |
| } |
| |
| public void focusLost(FocusEvent event) |
| { |
| updateTextfields(event); |
| } |
| |
| private void updateTextfields(FocusEvent event) |
| { |
| if (event.getSource() == jobname_tf) |
| atts.add(new JobName(jobname_tf.getText(), null)); |
| else |
| atts.add(new RequestingUserName(username_tf.getText(), null)); |
| } |
| |
| /** |
| * Called to update for new selected |
| * print service. Tests if currently |
| * selected attributes are supported. |
| */ |
| void updateForSelectedService() |
| { |
| // JobPriority |
| if (categorySupported(JobPriority.class)) |
| { |
| JobPriority prio = (JobPriority) attribute(JobPriority.class); |
| JobPriority value = (JobPriority) defaultValue(JobPriority.class); |
| priority.setEnabled(true); |
| if (prio != null) |
| model.setValue(new Integer(prio.getValue())); |
| else |
| model.setValue(new Integer(value.getValue())); |
| } |
| else |
| priority.setEnabled(false); |
| |
| // Requesting username |
| if (categorySupported(RequestingUserName.class)) |
| { |
| Attribute user = attribute(RequestingUserName.class); |
| Object value = defaultValue(RequestingUserName.class); |
| username.setEnabled(true); |
| if (user != null) |
| username_tf.setText(user.toString()); |
| else |
| username_tf.setText(value.toString()); |
| } |
| else |
| username.setEnabled(false); |
| |
| // Job Name |
| if (categorySupported(JobName.class)) |
| { |
| Attribute job = attribute(JobName.class); |
| Object value = defaultValue(JobName.class); |
| jobname.setEnabled(true); |
| if (job != null) |
| jobname_tf.setText(job.toString()); |
| else |
| jobname_tf.setText(value.toString()); |
| } |
| else |
| jobname.setEnabled(false); |
| |
| // Job sheets |
| if (categorySupported(JobSheets.class)) |
| { |
| Attribute sheet = attribute(JobSheets.class); |
| Object value = defaultValue(JobSheets.class); |
| cover.setEnabled(true); |
| if (sheet != null) |
| { |
| if (sheet.equals(JobSheets.NONE)) |
| cover.setSelected(false); |
| else |
| cover.setSelected(true); |
| } |
| else |
| { |
| if (value.equals(JobSheets.NONE)) |
| cover.setSelected(false); |
| else |
| cover.setSelected(true); |
| } |
| } |
| else |
| cover.setEnabled(false); |
| } |
| } |
| |
| /** |
| * Handles the sides attributes. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class SidesPanel extends JPanel implements ActionListener |
| { |
| private JRadioButton oneside, calendar, duplex; |
| |
| SidesPanel() |
| { |
| oneside = new JRadioButton(getLocalizedString("rbt.onesided")); |
| oneside.addActionListener(this); |
| calendar = new JRadioButton(getLocalizedString("rbt.calendar")); |
| calendar.addActionListener(this); |
| duplex = new JRadioButton(getLocalizedString("rbt.duplex")); |
| duplex.addActionListener(this); |
| |
| ButtonGroup group = new ButtonGroup(); |
| group.add(oneside); |
| group.add(calendar); |
| group.add(duplex); |
| |
| GridBagLayout layout = new GridBagLayout(); |
| GridBagConstraints c = new GridBagConstraints(); |
| c.fill = GridBagConstraints.BOTH; |
| |
| setLayout(layout); |
| setBorder(new TitledBorder(getLocalizedString("title.sides"))); |
| |
| c.insets = new Insets(5, 5, 5, 5); |
| c.gridx = 0; |
| c.gridy = 0; |
| add(oneside, c); |
| |
| c.gridx = 0; |
| c.gridy = 1; |
| add(calendar, c); |
| |
| c.gridx = 0; |
| c.gridy = 2; |
| add(duplex, c); |
| } |
| |
| public void actionPerformed(ActionEvent e) |
| { |
| if (e.getSource() == calendar) |
| atts.add(Sides.TWO_SIDED_SHORT_EDGE); |
| else if (e.getSource() == oneside) |
| atts.add(Sides.ONE_SIDED); |
| else |
| atts.add(Sides.TWO_SIDED_LONG_EDGE); |
| } |
| |
| /** |
| * Called to update for new selected |
| * print service. Tests if currently |
| * selected attributes are supported. |
| */ |
| void updateForSelectedService() |
| { |
| if (categorySupported(Sides.class)) |
| { |
| oneside.setEnabled(true); |
| calendar.setEnabled(true); |
| duplex.setEnabled(true); |
| |
| Object defaultValue = defaultValue(Sides.class); |
| Attribute sides = attribute(Sides.class); |
| if (sides != null) |
| { |
| if (sides.equals(Sides.TWO_SIDED_SHORT_EDGE)) |
| calendar.setSelected(true); |
| else if (sides.equals(Sides.ONE_SIDED)) |
| oneside.setSelected(true); |
| else |
| duplex.setSelected(true); |
| } |
| else |
| { |
| if (defaultValue.equals(Sides.TWO_SIDED_SHORT_EDGE)) |
| calendar.setSelected(true); |
| else if (defaultValue.equals(Sides.ONE_SIDED)) |
| oneside.setSelected(true); |
| else |
| duplex.setSelected(true); |
| } |
| } |
| else |
| { |
| oneside.setEnabled(false); |
| calendar.setEnabled(false); |
| duplex.setEnabled(false); |
| } |
| } |
| } |
| |
| /** |
| * Handles the chromaticity attributes. |
| * @author Wolfgang Baer (WBaer@gmx.de) |
| */ |
| final class Color extends JPanel implements ActionListener |
| { |
| private JRadioButton bw, color; |
| |
| Color() |
| { |
| bw = new JRadioButton(getLocalizedString("rbt.blackwhite")); |
| bw.addActionListener(this); |
| color = new JRadioButton(getLocalizedString("rbt.color")); |
| color.addActionListener(this); |
| |
| ButtonGroup group = new ButtonGroup(); |
| group.add(bw); |
| group.add(color); |
| |
| GridBagLayout layout = new GridBagLayout(); |
| GridBagConstraints c = new GridBagConstraints(); |
| |
| setLayout(layout); |
| setBorder(new TitledBorder(getLocalizedString("title.color"))); |
| |
| c.fill = GridBagConstraints.HORIZONTAL; |
| c.insets = new Insets(5, 5, 5, 5); |
| c.gridx = 0; |
| c.gridy = 0; |
| add(bw, c); |
| |
| c.gridx = 0; |
| c.gridy = 1; |
| add(color, c); |
| } |
| |
| public void actionPerformed(ActionEvent e) |
| { |
| if (e.getSource() == bw) |
| atts.add(Chromaticity.MONOCHROME); |
| else |
| atts.add(Chromaticity.COLOR); |
| } |
| |
| /** |
| * Called to update for new selected |
| * print service. Tests if currently |
| * selected attributes are supported. |
| */ |
| void updateForSelectedService() |
| { |
| if (categorySupported(Chromaticity.class)) |
| { |
| bw.setEnabled(true); |
| color.setEnabled(true); |
| |
| Object defaultValue = defaultValue(Chromaticity.class); |
| Attribute chromaticity = attribute(Chromaticity.class); |
| if (chromaticity != null) |
| { |
| if (chromaticity.equals(Chromaticity.MONOCHROME)) |
| bw.setSelected(true); |
| else |
| color.setSelected(true); |
| } |
| else |
| { |
| if (defaultValue.equals(Chromaticity.MONOCHROME)) |
| bw.setSelected(true); |
| else |
| color.setSelected(true); |
| } |
| } |
| else |
| { |
| bw.setEnabled(false); |
| color.setEnabled(false); |
| } |
| } |
| } |
| |
| private Quality quality_panel; |
| private JobAttributes jobAttr_panel; |
| private SidesPanel sides_panel; |
| private Color chromaticy_panel; |
| |
| /** |
| * Creates the panel for appearance attributes. |
| */ |
| public AppearancePanel() |
| { |
| setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); |
| |
| quality_panel = new Quality(); |
| jobAttr_panel = new JobAttributes(); |
| sides_panel = new SidesPanel(); |
| chromaticy_panel = new Color(); |
| |
| JPanel layout_panel = new JPanel(); |
| layout_panel.setLayout(new BoxLayout(layout_panel, BoxLayout.LINE_AXIS)); |
| layout_panel.add(chromaticy_panel); |
| layout_panel.add(Box.createRigidArea(new Dimension(10, 0))); |
| layout_panel.add(quality_panel); |
| |
| JPanel layout2_panel = new JPanel(); |
| layout2_panel.setLayout(new BoxLayout(layout2_panel, BoxLayout.LINE_AXIS)); |
| layout2_panel.add(sides_panel); |
| layout2_panel.add(Box.createRigidArea(new Dimension(10, 0))); |
| layout2_panel.add(jobAttr_panel); |
| |
| setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); |
| add(layout_panel); |
| add(Box.createRigidArea(new Dimension(0, 12))); |
| add(layout2_panel); |
| } |
| |
| /** |
| * Calls update on all internal panels to adjust |
| * for a new selected print service. |
| */ |
| void update() |
| { |
| quality_panel.updateForSelectedService(); |
| jobAttr_panel.updateForSelectedService(); |
| sides_panel.updateForSelectedService(); |
| chromaticy_panel.updateForSelectedService(); |
| } |
| } |
| |
| // on main contentpane |
| private JButton ok_bt; |
| private JButton cancel_bt; |
| |
| // the tabs |
| private GeneralPanel general_panel; |
| private PageSetupPanel pagesetup_panel; |
| private AppearancePanel appearance_panel; |
| |
| private PrintService[] services; |
| private PrintService defaultService; |
| private PrintService selectedService; |
| private DocFlavor flavor; |
| private PrintRequestAttributeSet attributes; |
| |
| private boolean onlyPageDialog; |
| private PrintRequestAttributeSet atts; |
| |
| private final static ResourceBundle messages; |
| |
| static |
| { |
| messages = ResourceBundle.getBundle("gnu/javax/print/PrinterDialog"); |
| } |
| |
| // TODO LowPriority: Include checks so that if a specific value formerly |
| // selected is no more supported by the new service changes to the default. |
| |
| /** |
| * Class private constructs a printer dialog. |
| * |
| * @param gc the screen to use. <code>null</code> is default screen. |
| * @param services the print services to browse (not null). |
| * @param defaultService the default service. If <code>null</code> |
| * the first of the print services in the services array will be used. |
| * @param flavor the flavours to be printed. |
| * @param attributes the attributes requested. Will be updated |
| * by selections done by the user in the dialog. |
| * @param onlyPageDialog if true a page settings only dialog is constructed. |
| * |
| * @throws HeadlessException if GraphicsEnvironment is headless |
| */ |
| private PrinterDialog(GraphicsConfiguration gc, PrintService[] services, |
| PrintService defaultService, DocFlavor flavor, |
| PrintRequestAttributeSet attributes, boolean onlyPageDialog, String title) |
| throws HeadlessException |
| { |
| super((Frame)null, title, true, gc); |
| |
| setResizable(false); |
| setDefaultCloseOperation(DISPOSE_ON_CLOSE); |
| |
| // check and remove service not supporting the flavor |
| if (flavor != null) |
| { |
| ArrayList list = new ArrayList(services.length); |
| for(int i=0; i < services.length; i++) |
| if (services[i].isDocFlavorSupported(flavor)) |
| list.add(services[i]); |
| |
| if (defaultService != null |
| && (! list.contains(defaultService))) |
| defaultService = (PrintService) list.get(0); |
| |
| PrintService[] newServices = new PrintService[list.size()]; |
| this.services = (PrintService[]) list.toArray(newServices); |
| } |
| else |
| this.services = services; |
| |
| if (defaultService == null) |
| this.defaultService = services[0]; |
| else |
| this.defaultService = defaultService; |
| |
| this.selectedService = this.defaultService; |
| this.flavor = flavor; |
| |
| // the attributes given by the user |
| this.attributes = attributes; |
| // the one to work with during browsing |
| this.atts = new HashPrintRequestAttributeSet(attributes); |
| |
| this.onlyPageDialog = onlyPageDialog; |
| |
| initUI(onlyPageDialog); |
| pack(); |
| updateAll(); |
| } |
| |
| /** |
| * Constructs a page settings only dialog. |
| * |
| * @param gc the screen to use. <code>null</code> is default screen. |
| * @param service the print service for the page dialog. |
| * the first of the print services in the services array will be used. |
| * @param flavor the flavours to be printed. |
| * @param attributes the attributes requested. Will be updated |
| * by selections done by the user in the dialog. |
| * |
| * @throws HeadlessException if GraphicsEnvironment is headless |
| */ |
| public PrinterDialog(GraphicsConfiguration gc, PrintService service, |
| DocFlavor flavor, PrintRequestAttributeSet attributes) |
| throws HeadlessException |
| { |
| this(gc, new PrintService[] {service}, service, flavor, attributes, |
| true, getLocalizedString("title.pagedialog")); |
| } |
| |
| /** |
| * Constructs a printer dialog. |
| * |
| * @param gc the screen to use. <code>null</code> is default screen. |
| * @param services the print services to browse (not null). |
| * @param defaultService the default service. If <code>null</code> |
| * the first of the print services in the services array will be used. |
| * @param flavor the flavours to be printed. |
| * @param attributes the attributes requested. Will be updated |
| * by selections done by the user in the dialog. |
| * |
| * @throws HeadlessException if GraphicsEnvironment is headless |
| */ |
| public PrinterDialog(GraphicsConfiguration gc, PrintService[] services, |
| PrintService defaultService, DocFlavor flavor, |
| PrintRequestAttributeSet attributes) |
| throws HeadlessException |
| { |
| this(gc, services, defaultService, flavor, attributes, |
| false, getLocalizedString("title.printdialog")); |
| } |
| |
| // initializes the gui parts |
| private void initUI(boolean onlyPageDialog) |
| { |
| JPanel buttonPane = new JPanel(); |
| |
| if (onlyPageDialog) |
| { |
| JPanel pane = new JPanel(); |
| pane.setLayout(new BorderLayout()); |
| pagesetup_panel = new PageSetupPanel(); |
| pane.add(pagesetup_panel, BorderLayout.CENTER); |
| |
| ok_bt = new JButton(getLocalizedString("bt.OK")); |
| ok_bt.addActionListener(this); |
| cancel_bt = new JButton(getLocalizedString("bt.cancel")); |
| cancel_bt.addActionListener(this); |
| |
| getContentPane().add(pane, BorderLayout.CENTER); |
| } |
| else |
| { |
| general_panel = new GeneralPanel(); |
| pagesetup_panel = new PageSetupPanel(); |
| appearance_panel = new AppearancePanel(); |
| |
| JTabbedPane pane = new JTabbedPane(); |
| pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); |
| |
| ok_bt = new JButton(getLocalizedString("bt.print")); |
| ok_bt.addActionListener(this); |
| cancel_bt = new JButton(getLocalizedString("bt.cancel")); |
| cancel_bt.addActionListener(this); |
| |
| // populate jtabbedpane |
| pane.addTab(getLocalizedString("tab.general"), general_panel); |
| pane.addTab(getLocalizedString("tab.pagesetup"), pagesetup_panel); |
| pane.addTab(getLocalizedString("tab.appearance"), appearance_panel); |
| |
| // Put everything together |
| getContentPane().add(pane, BorderLayout.CENTER); |
| } |
| |
| buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS)); |
| buttonPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); |
| buttonPane.add(Box.createHorizontalGlue()); |
| buttonPane.add(ok_bt); |
| buttonPane.add(Box.createRigidArea(new Dimension(5, 0))); |
| buttonPane.add(cancel_bt); |
| |
| getContentPane().add(buttonPane, BorderLayout.PAGE_END); |
| } |
| |
| /** |
| * Returns the modified attributes set. |
| * @return The attributes. |
| */ |
| public PrintRequestAttributeSet getAttributes() |
| { |
| return attributes; |
| } |
| |
| /** |
| * Returns the print service selected by the user. |
| * @return The selected print service. |
| */ |
| public PrintService getSelectedPrintService() |
| { |
| return selectedService; |
| } |
| |
| /** |
| * Sets the currently selected print service. |
| * |
| * @param service the service selected. |
| */ |
| protected void setSelectedPrintService(PrintService service) |
| { |
| selectedService = service; |
| } |
| |
| /** |
| * Returns the print service array. |
| * @return The print services. |
| */ |
| protected PrintService[] getPrintServices() |
| { |
| return services; |
| } |
| |
| /** |
| * Calls update on all panels to adjust |
| * for a new selected print service. |
| */ |
| void updateAll() |
| { |
| pagesetup_panel.update(); |
| |
| if (! onlyPageDialog) |
| { |
| general_panel.update(); |
| appearance_panel.update(); |
| } |
| } |
| |
| boolean categorySupported(Class category) |
| { |
| return getSelectedPrintService(). |
| isAttributeCategorySupported(category); |
| } |
| |
| Object defaultValue(Class category) |
| { |
| return getSelectedPrintService(). |
| getDefaultAttributeValue(category); |
| } |
| |
| Attribute attribute(Class category) |
| { |
| return atts.get(category); |
| } |
| |
| /** |
| * Action handler for Print/Cancel buttons. |
| * If cancel is pressed we reset the attributes |
| * and the selected service. |
| * |
| * @param e the ActionEvent |
| */ |
| public void actionPerformed(ActionEvent e) |
| { |
| if (e.getSource() == ok_bt) |
| { |
| setVisible(false); |
| attributes.addAll(atts); |
| dispose(); |
| } |
| else |
| { |
| setVisible(false); |
| selectedService = null; |
| dispose(); |
| } |
| } |
| |
| /** |
| * Retrieves localized messages from the resource bundle. |
| * |
| * @param key the key |
| * @return The localized value for the key. |
| */ |
| static final String getLocalizedString(String key) { |
| return messages.getString(key); |
| } |
| } |