EMMA Coverage Report (generated Wed Aug 16 18:51:55 GMT 2006)
[all classes][gnu.javax.print]

COVERAGE SUMMARY FOR SOURCE FILE [PrinterDialog.java]

nameclass, %method, %block, %line, %
PrinterDialog.java0%   (0/14)0%   (0/61)0%   (0/4249)0%   (0/816)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class PrinterDialog0%   (0/1)0%   (0/15)0%   (0/376)0%   (0/90)
<static initializer> 0%   (0/1)0%   (0/4)0%   (0/2)
PrinterDialog (GraphicsConfiguration, PrintService [], PrintService, DocFlavo... 0%   (0/1)0%   (0/11)0%   (0/3)
PrinterDialog (GraphicsConfiguration, PrintService [], PrintService, DocFlavo... 0%   (0/1)0%   (0/103)0%   (0/26)
PrinterDialog (GraphicsConfiguration, PrintService, DocFlavor, PrintRequestAt... 0%   (0/1)0%   (0/16)0%   (0/3)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/26)0%   (0/8)
attribute (Class): Attribute 0%   (0/1)0%   (0/5)0%   (0/1)
categorySupported (Class): boolean 0%   (0/1)0%   (0/5)0%   (0/2)
defaultValue (Class): Object 0%   (0/1)0%   (0/5)0%   (0/2)
getAttributes (): PrintRequestAttributeSet 0%   (0/1)0%   (0/3)0%   (0/1)
getLocalizedString (String): String 0%   (0/1)0%   (0/4)0%   (0/1)
getPrintServices (): PrintService [] 0%   (0/1)0%   (0/3)0%   (0/1)
getSelectedPrintService (): PrintService 0%   (0/1)0%   (0/3)0%   (0/1)
initUI (boolean): void 0%   (0/1)0%   (0/171)0%   (0/32)
setSelectedPrintService (PrintService): void 0%   (0/1)0%   (0/4)0%   (0/2)
updateAll (): void 0%   (0/1)0%   (0/13)0%   (0/5)
     
class PrinterDialog$AppearancePanel0%   (0/1)0%   (0/2)0%   (0/134)0%   (0/26)
PrinterDialog$AppearancePanel (PrinterDialog): void 0%   (0/1)0%   (0/121)0%   (0/21)
update (): void 0%   (0/1)0%   (0/13)0%   (0/5)
     
class PrinterDialog$AppearancePanel$Color0%   (0/1)0%   (0/3)0%   (0/220)0%   (0/40)
PrinterDialog$AppearancePanel$Color (PrinterDialog$AppearancePanel): void 0%   (0/1)0%   (0/92)0%   (0/21)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/21)0%   (0/4)
updateForSelectedService (): void 0%   (0/1)0%   (0/107)0%   (0/15)
     
class PrinterDialog$AppearancePanel$JobAttributes0%   (0/1)0%   (0/7)0%   (0/644)0%   (0/101)
PrinterDialog$AppearancePanel$JobAttributes (PrinterDialog$AppearancePanel): ... 0%   (0/1)0%   (0/213)0%   (0/49)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/20)0%   (0/4)
focusGained (FocusEvent): void 0%   (0/1)0%   (0/4)0%   (0/2)
focusLost (FocusEvent): void 0%   (0/1)0%   (0/4)0%   (0/2)
stateChanged (ChangeEvent): void 0%   (0/1)0%   (0/17)0%   (0/3)
updateForSelectedService (): void 0%   (0/1)0%   (0/353)0%   (0/37)
updateTextfields (FocusEvent): void 0%   (0/1)0%   (0/33)0%   (0/4)
     
class PrinterDialog$AppearancePanel$Quality0%   (0/1)0%   (0/3)0%   (0/289)0%   (0/54)
PrinterDialog$AppearancePanel$Quality (PrinterDialog$AppearancePanel): void 0%   (0/1)0%   (0/122)0%   (0/27)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/34)0%   (0/6)
updateForSelectedService (): void 0%   (0/1)0%   (0/133)0%   (0/21)
     
class PrinterDialog$AppearancePanel$SidesPanel0%   (0/1)0%   (0/3)0%   (0/285)0%   (0/54)
PrinterDialog$AppearancePanel$SidesPanel (PrinterDialog$AppearancePanel): void 0%   (0/1)0%   (0/118)0%   (0/27)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/34)0%   (0/6)
updateForSelectedService (): void 0%   (0/1)0%   (0/133)0%   (0/21)
     
class PrinterDialog$GeneralPanel0%   (0/1)0%   (0/2)0%   (0/96)0%   (0/19)
PrinterDialog$GeneralPanel (PrinterDialog): void 0%   (0/1)0%   (0/86)0%   (0/15)
update (): void 0%   (0/1)0%   (0/10)0%   (0/4)
     
class PrinterDialog$GeneralPanel$CopiesAndSorted0%   (0/1)0%   (0/4)0%   (0/306)0%   (0/49)
PrinterDialog$GeneralPanel$CopiesAndSorted (PrinterDialog$GeneralPanel): void 0%   (0/1)0%   (0/110)0%   (0/24)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/12)0%   (0/3)
stateChanged (ChangeEvent): void 0%   (0/1)0%   (0/49)0%   (0/6)
updateForSelectedService (): void 0%   (0/1)0%   (0/135)0%   (0/16)
     
class PrinterDialog$GeneralPanel$PrintRange0%   (0/1)0%   (0/6)0%   (0/404)0%   (0/83)
PrinterDialog$GeneralPanel$PrintRange (PrinterDialog$GeneralPanel): void 0%   (0/1)0%   (0/200)0%   (0/44)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/46)0%   (0/10)
focusGained (FocusEvent): void 0%   (0/1)0%   (0/3)0%   (0/2)
focusLost (FocusEvent): void 0%   (0/1)0%   (0/3)0%   (0/2)
updateForSelectedService (): void 0%   (0/1)0%   (0/114)0%   (0/17)
updatePageRanges (): void 0%   (0/1)0%   (0/38)0%   (0/8)
     
class PrinterDialog$GeneralPanel$PrintServices0%   (0/1)0%   (0/3)0%   (0/461)0%   (0/89)
PrinterDialog$GeneralPanel$PrintServices (PrinterDialog$GeneralPanel): void 0%   (0/1)0%   (0/268)0%   (0/65)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/24)0%   (0/5)
updateForSelectedService (): void 0%   (0/1)0%   (0/169)0%   (0/19)
     
class PrinterDialog$PageSetupPanel0%   (0/1)0%   (0/2)0%   (0/96)0%   (0/19)
PrinterDialog$PageSetupPanel (PrinterDialog): void 0%   (0/1)0%   (0/86)0%   (0/15)
update (): void 0%   (0/1)0%   (0/10)0%   (0/4)
     
class PrinterDialog$PageSetupPanel$Margins0%   (0/1)0%   (0/5)0%   (0/309)0%   (0/69)
PrinterDialog$PageSetupPanel$Margins (PrinterDialog$PageSetupPanel): void 0%   (0/1)0%   (0/216)0%   (0/46)
focusGained (FocusEvent): void 0%   (0/1)0%   (0/3)0%   (0/2)
focusLost (FocusEvent): void 0%   (0/1)0%   (0/3)0%   (0/2)
updateForSelectedService (): void 0%   (0/1)0%   (0/86)0%   (0/18)
updateMargins (): void 0%   (0/1)0%   (0/1)0%   (0/1)
     
class PrinterDialog$PageSetupPanel$MediaTypes0%   (0/1)0%   (0/3)0%   (0/279)0%   (0/55)
PrinterDialog$PageSetupPanel$MediaTypes (PrinterDialog$PageSetupPanel): void 0%   (0/1)0%   (0/132)0%   (0/32)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/21)0%   (0/5)
updateForSelectedService (): void 0%   (0/1)0%   (0/126)0%   (0/18)
     
class PrinterDialog$PageSetupPanel$Orientation0%   (0/1)0%   (0/3)0%   (0/350)0%   (0/68)
PrinterDialog$PageSetupPanel$Orientation (PrinterDialog$PageSetupPanel): void 0%   (0/1)0%   (0/144)0%   (0/33)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/47)0%   (0/8)
updateForSelectedService (): void 0%   (0/1)0%   (0/159)0%   (0/27)

1/* PrinterDialog.java --
2   Copyright (C)  2006  Free Software Foundation, Inc.
3 
4This file is part of GNU Classpath.
5 
6GNU Classpath is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10 
11GNU Classpath is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14General Public License for more details.
15 
16You should have received a copy of the GNU General Public License
17along with GNU Classpath; see the file COPYING.  If not, write to the
18Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
1902110-1301 USA.
20 
21Linking this library statically or dynamically with other modules is
22making a combined work based on this library.  Thus, the terms and
23conditions of the GNU General Public License cover the whole
24combination.
25 
26As a special exception, the copyright holders of this library give you
27permission to link this library with independent modules to produce an
28executable, regardless of the license terms of these independent
29modules, and to copy and distribute the resulting executable under
30terms of your choice, provided that you also meet, for each linked
31independent module, the terms and conditions of the license of that
32module.  An independent module is a module which is not derived from
33or based on this library.  If you modify this library, you may extend
34this exception to your version of the library, but you are not
35obligated to do so.  If you do not wish to do so, delete this
36exception statement from your version. */
37 
38package gnu.javax.print;
39 
40import java.awt.BorderLayout;
41import java.awt.Dimension;
42import java.awt.Frame;
43import java.awt.GraphicsConfiguration;
44import java.awt.GridBagConstraints;
45import java.awt.GridBagLayout;
46import java.awt.HeadlessException;
47import java.awt.Insets;
48import java.awt.event.ActionEvent;
49import java.awt.event.ActionListener;
50import java.awt.event.FocusEvent;
51import java.awt.event.FocusListener;
52import java.util.ArrayList;
53import java.util.ResourceBundle;
54 
55import javax.print.DocFlavor;
56import javax.print.PrintService;
57import javax.print.attribute.Attribute;
58import javax.print.attribute.HashPrintRequestAttributeSet;
59import javax.print.attribute.PrintRequestAttributeSet;
60import javax.print.attribute.standard.Chromaticity;
61import javax.print.attribute.standard.Copies;
62import javax.print.attribute.standard.Destination;
63import javax.print.attribute.standard.JobName;
64import javax.print.attribute.standard.JobPriority;
65import javax.print.attribute.standard.JobSheets;
66import javax.print.attribute.standard.Media;
67import javax.print.attribute.standard.MediaPrintableArea;
68import javax.print.attribute.standard.OrientationRequested;
69import javax.print.attribute.standard.PageRanges;
70import javax.print.attribute.standard.PrintQuality;
71import javax.print.attribute.standard.PrinterInfo;
72import javax.print.attribute.standard.PrinterIsAcceptingJobs;
73import javax.print.attribute.standard.PrinterMakeAndModel;
74import javax.print.attribute.standard.PrinterState;
75import javax.print.attribute.standard.RequestingUserName;
76import javax.print.attribute.standard.SheetCollate;
77import javax.print.attribute.standard.Sides;
78import javax.swing.BorderFactory;
79import javax.swing.Box;
80import javax.swing.BoxLayout;
81import javax.swing.ButtonGroup;
82import javax.swing.JButton;
83import javax.swing.JCheckBox;
84import javax.swing.JComboBox;
85import javax.swing.JDialog;
86import javax.swing.JLabel;
87import javax.swing.JPanel;
88import javax.swing.JRadioButton;
89import javax.swing.JSpinner;
90import javax.swing.JTabbedPane;
91import javax.swing.JTextField;
92import javax.swing.SpinnerNumberModel;
93import javax.swing.border.TitledBorder;
94import javax.swing.event.ChangeEvent;
95import javax.swing.event.ChangeListener;
96 
97/**
98 * Implementation of the PrinterDialog used by
99 * {@link javax.print.ServiceUI} for visual selection
100 * of print services and its attributes.
101 * 
102 * @author Wolfgang Baer (WBaer@gmx.de)
103 */
104public final class PrinterDialog extends JDialog implements ActionListener
105{
106  
107  /**
108   * The General Panel used in the printing dialog.
109   * @author Wolfgang Baer (WBaer@gmx.de)
110   */
111  final class GeneralPanel extends JPanel
112  {
113    /**
114     * Handles the copies attribute.
115     * @author Wolfgang Baer (WBaer@gmx.de)
116     */
117    final class CopiesAndSorted extends JPanel 
118      implements ChangeListener, ActionListener
119    {      
120      private JCheckBox sort;    
121      private JSpinner copies;
122      private JLabel copies_lb;
123      private SpinnerNumberModel copiesModel;
124    
125      CopiesAndSorted()
126      {
127        copies_lb = new JLabel(getLocalizedString("lb.copies"));        
128        sort = new JCheckBox(getLocalizedString("cb.sort"));
129        sort.addActionListener(this);
130    
131        copiesModel = new SpinnerNumberModel(1, 1, 9999, 1);
132        copies = new JSpinner(copiesModel);
133        copies.addChangeListener(this);
134        
135        GridBagLayout layout = new GridBagLayout();
136        GridBagConstraints c = new GridBagConstraints();
137        c.fill = GridBagConstraints.BOTH;
138        c.insets = new Insets(5, 5, 5, 5);
139    
140        setLayout(layout);
141        setBorder(new TitledBorder(getLocalizedString("title.copies")));
142    
143        c.anchor = GridBagConstraints.WEST;
144    
145        c.gridx = 0;
146        c.gridy = 0;
147        add(copies_lb, c);
148    
149        c.gridx = 1;
150        c.gridy = 0;
151        add(copies, c);
152    
153        c.gridx = 0;
154        c.gridy = 1;
155        add(sort, c);
156      }
157      
158      // copies jspinner state
159      public void stateChanged(ChangeEvent event)
160      {
161        int value = ((Integer) copies.getValue()).intValue();
162        atts.add(new Copies(value));
163            
164        if (value > 1 && categorySupported(SheetCollate.class))
165          sort.setEnabled(true);
166        else
167          sort.setEnabled(false);                
168      }
169 
170      // sorted checkbox state
171      public void actionPerformed(ActionEvent event)
172      {
173        if (sort.isSelected())
174          atts.add(SheetCollate.COLLATED);
175      }
176 
177      /**
178       * Called to update for new selected
179       * print service. Tests if currently
180       * selected attributes are supported.
181       */
182      void updateForSelectedService()
183      {        
184        if (categorySupported(Copies.class))
185          {
186            copies.setEnabled(true);
187            copies_lb.setEnabled(true);
188            
189            Copies copies = (Copies) attribute(Copies.class);
190            if (copies != null)
191              copiesModel.setValue(new Integer(copies.getValue()));
192            
193            if (((Integer)copiesModel.getValue()).intValue() > 1            
194                && categorySupported(SheetCollate.class))
195              {
196                sort.setEnabled(true);
197                Attribute collate = attribute(SheetCollate.class);
198                if (collate != null && collate.equals(SheetCollate.COLLATED))
199                  sort.setSelected(true); 
200              }
201            else
202              sort.setEnabled(false);
203          }
204        else
205          {
206            copies.setEnabled(false);            
207            copies_lb.setEnabled(false);
208          }
209      }
210    }
211 
212    /**
213     * Handles the print ranges attribute.
214     * @author Wolfgang Baer (WBaer@gmx.de)
215     */
216    final class PrintRange extends JPanel 
217      implements ActionListener, FocusListener
218    {    
219      private JLabel to;    
220      private JRadioButton all_rb, pages_rb;   
221      private JTextField from_tf, to_tf;
222          
223      PrintRange()
224      {        
225        to = new JLabel(getLocalizedString("lb.to"));
226        to.setEnabled(false);
227    
228        all_rb = new JRadioButton(getLocalizedString("rbt.all"));
229        all_rb.setSelected(true);
230        all_rb.setActionCommand("ALL");
231        all_rb.addActionListener(this);
232        pages_rb = new JRadioButton(getLocalizedString("rbt.pages"));
233        pages_rb.setActionCommand("PAGES");
234        pages_rb.setEnabled(false);
235        pages_rb.addActionListener(this);
236    
237        ButtonGroup group = new ButtonGroup();
238        group.add(all_rb);
239        group.add(pages_rb);
240    
241        from_tf = new JTextField("1", 4);
242        from_tf.setEnabled(false);
243        from_tf.addFocusListener(this);
244        to_tf = new JTextField("1", 4);
245        to_tf.setEnabled(false);
246        to_tf.addFocusListener(this);
247    
248        GridBagLayout layout = new GridBagLayout();
249        GridBagConstraints c = new GridBagConstraints();
250        c.fill = GridBagConstraints.BOTH;
251    
252        setLayout(layout);
253        setBorder(new TitledBorder(getLocalizedString("title.printrange")));
254    
255        c.insets = new Insets(15, 5, 5, 5);
256        c.gridx = 0;
257        c.gridy = 0;
258        add(all_rb, c);
259    
260        c.insets = new Insets(5, 5, 15, 5);
261        c.gridx = 0;
262        c.gridy = 1;
263        add(pages_rb, c);
264    
265        c.gridx = 1;
266        c.gridy = 1;
267        add(from_tf, c);
268    
269        c.gridx = 2;
270        c.gridy = 1;
271        add(to, c);
272    
273        c.insets = new Insets(5, 5, 15, 15);
274        c.gridx = 3;
275        c.gridy = 1;
276        add(to_tf, c);
277      }
278            
279      // focus pagerange
280      public void focusGained(FocusEvent event)
281      {
282        updatePageRanges();
283      }
284  
285      public void focusLost(FocusEvent event)
286      {
287        updatePageRanges();
288      }
289      
290      // updates the range after user changed it
291      private void updatePageRanges()
292      {
293        int lower = Integer.parseInt(from_tf.getText());
294        int upper = Integer.parseInt(to_tf.getText());
295        
296        if (lower > upper)
297          {
298            upper = lower;
299            to_tf.setText("" + lower);                
300          }
301        
302        PageRanges range = new PageRanges(lower, upper);
303        atts.add(range);
304      }
305 
306      // page range change
307      public void actionPerformed(ActionEvent e)
308      { 
309        // if ALL is selected we must use a full-range object
310        if (e.getActionCommand().equals("ALL"))
311          {
312            from_tf.setEnabled(false);
313            to.setEnabled(false);
314            to_tf.setEnabled(false);
315            
316            atts.add(new PageRanges(1, Integer.MAX_VALUE));
317          }
318        else
319          {
320            from_tf.setEnabled(true);
321            to.setEnabled(true);
322            to_tf.setEnabled(true);
323            all_rb.setSelected(false);
324          }       
325      }
326    
327      /**
328       * Called to update for new selected
329       * print service. Tests if currently
330       * selected attributes are supported.
331       */
332      void updateForSelectedService()
333      {
334        if (categorySupported(PageRanges.class))
335          {
336            pages_rb.setEnabled(true);
337            PageRanges range = (PageRanges) attribute(PageRanges.class);
338            if (range != null)
339              {
340                from_tf.setEnabled(true);
341                to.setEnabled(true);
342                to_tf.setEnabled(true);   
343                all_rb.setSelected(false);
344                pages_rb.setSelected(true);
345                
346                int[][] members = range.getMembers();
347                // Although passed in attributes may contain more than one 
348                // range we only take the first one
349                from_tf.setText("" + members[0][0]);
350                to_tf.setText("" + members[0][1]);
351              }
352          }
353        else
354          {
355            from_tf.setEnabled(false);
356            to.setEnabled(false);
357            to_tf.setEnabled(false);
358            all_rb.setSelected(true);
359          }
360       }
361    }
362 
363    /**
364     * Handles the selection of the print services
365     * and its location and description attributes.
366     * @author Wolfgang Baer (WBaer@gmx.de)
367     */
368    final class PrintServices extends JPanel 
369      implements ActionListener
370    {    
371      private JLabel name, status, typ, info;
372      private JLabel statusValue, typValue, infoValue;   
373      private JButton attributes;    
374      private JComboBox services_cob;    
375      private JCheckBox fileRedirection_cb;
376    
377      PrintServices()
378      {
379        name = new JLabel(getLocalizedString("lb.name"));
380        status = new JLabel(getLocalizedString("lb.status"));
381        typ = new JLabel(getLocalizedString("lb.typ"));
382        info = new JLabel(getLocalizedString("lb.info"));
383        typValue = new JLabel();
384        infoValue = new JLabel();
385        statusValue = new JLabel();
386    
387        attributes = new JButton(getLocalizedString("bt.attributes"));
388        attributes.setEnabled(false);
389        attributes.setActionCommand("ATTRIBUTES");
390        attributes.addActionListener(this);
391    
392        services_cob = new JComboBox(getPrintServices());
393        services_cob.setActionCommand("SERVICE");
394        services_cob.addActionListener(this);
395    
396        fileRedirection_cb = new JCheckBox(getLocalizedString("cb.output"));
397        fileRedirection_cb.setEnabled(false);
398    
399        GridBagLayout layout = new GridBagLayout();
400        GridBagConstraints c = new GridBagConstraints();
401    
402        setLayout(layout);
403        setBorder(new TitledBorder(getLocalizedString("title.printservice")));
404    
405        c.insets = new Insets(5, 5, 5, 5);
406        c.anchor = GridBagConstraints.LINE_END;
407        c.gridx = 0;
408        c.gridy = 0;
409        add(name, c);
410    
411        c.gridx = 0;
412        c.gridy = 1;
413        add(status, c);
414    
415        c.gridx = 0;
416        c.gridy = 2;
417        add(typ, c);
418    
419        c.gridx = 0;
420        c.gridy = 3;
421        add(info, c);
422    
423        c.gridx = 2;
424        c.gridy = 3;
425        c.weightx = 1;
426        add(fileRedirection_cb, c);
427    
428        c.anchor = GridBagConstraints.LINE_START;
429        c.fill = GridBagConstraints.HORIZONTAL;
430        c.gridx = 1;
431        c.gridy = 0;
432        c.weightx = 1.5;
433        add(services_cob, c);
434    
435        c.gridx = 1;
436        c.gridy = 1;
437        c.gridwidth = 2;
438        c.weightx = 1;
439        add(statusValue, c);
440        
441        c.gridx = 1;
442        c.gridy = 2;
443        c.gridwidth = 2;
444        c.weightx = 1;
445        add(typValue, c);
446    
447        c.gridx = 1;
448        c.gridy = 3;
449        c.gridwidth = 2;
450        c.weightx = 1;
451        add(infoValue, c);
452        
453        c.gridx = 2;
454        c.gridy = 0;
455        c.weightx = 1.5;
456        add(attributes, c);
457      }
458    
459      public void actionPerformed(ActionEvent e)
460      {
461        if (e.getActionCommand().equals("SERVICE"))
462          {
463            setSelectedPrintService((PrintService) services_cob.getSelectedItem());
464            updateAll();
465          }
466        else if (e.getActionCommand().equals("ATTRIBUTES"))
467          {
468            // TODO LowPriority-Enhancement: As tests have shown this button 
469            // is even gray and not enabled under Windows - Its a good place
470            // to provide a classpath specific browsing dialog for all 
471            // attributes not in the default printing dialog. 
472          }
473      }    
474    
475      /**
476       * Called to update for new selected
477       * print service. Tests if currently
478       * selected attributes are supported.
479       */
480      void updateForSelectedService()
481      {
482        PrinterMakeAndModel att1 = (PrinterMakeAndModel)
483          getSelectedPrintService().getAttribute(PrinterMakeAndModel.class);
484        typValue.setText(att1 == null ? "" : att1.getValue());
485        
486        PrinterInfo att2 = (PrinterInfo) 
487          getSelectedPrintService().getAttribute(PrinterInfo.class);
488        infoValue.setText(att2 == null ? "" : att2.getValue());
489        
490        PrinterIsAcceptingJobs att3 = (PrinterIsAcceptingJobs)
491          getSelectedPrintService().getAttribute(PrinterIsAcceptingJobs.class);
492        PrinterState att4 = (PrinterState)
493          getSelectedPrintService().getAttribute(PrinterState.class);
494        
495        String status = att4.toString();  
496        if (att3 == PrinterIsAcceptingJobs.ACCEPTING_JOBS)
497          status += " - " + getLocalizedString("lb.acceptingjobs");
498        else if (att3 == PrinterIsAcceptingJobs.NOT_ACCEPTING_JOBS)
499          status += " - " + getLocalizedString("lb.notacceptingjobs");
500        
501        statusValue.setText(status);
502        
503        if (categorySupported(Destination.class))
504          {
505            fileRedirection_cb.setEnabled(false);
506          }
507      }
508      
509    }
510 
511    private PrintServices printserv_panel;
512    private PrintRange printrange_panel;
513    private CopiesAndSorted copies;
514 
515    /**
516     * Constructs the General Panel.
517     */
518    public GeneralPanel()
519    {     
520      setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
521 
522      printserv_panel = new PrintServices();
523      printrange_panel = new PrintRange();
524      copies = new CopiesAndSorted();
525 
526      JPanel layout_panel = new JPanel();
527      layout_panel.setLayout(new BoxLayout(layout_panel, BoxLayout.LINE_AXIS));
528      layout_panel.add(printrange_panel);
529      layout_panel.add(Box.createRigidArea(new Dimension(10, 0)));
530      layout_panel.add(copies);
531 
532      setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
533      add(printserv_panel);
534      add(Box.createRigidArea(new Dimension(0, 12)));
535      add(layout_panel);
536    }
537    
538    /**
539     * Calls update on all internal panels to adjust
540     * for a new selected print service.
541     */
542    void update()
543    {
544      printserv_panel.updateForSelectedService();
545      printrange_panel.updateForSelectedService();
546      copies.updateForSelectedService();
547    }
548  }
549 
550  /**
551   * The Page setup Panel.
552   * @author Wolfgang Baer (WBaer@gmx.de)
553   */
554  final class PageSetupPanel extends JPanel
555  {
556    /**
557     * Handles the orientation attribute.
558     * @author Wolfgang Baer (WBaer@gmx.de)
559     */
560    final class Orientation extends JPanel implements ActionListener
561    {
562      private JRadioButton portrait, landscape, rev_portrait, rev_landscape;
563      
564      Orientation()
565      {
566        portrait = new JRadioButton(getLocalizedString("rbt.portrait"));
567        portrait.addActionListener(this);
568        landscape = new JRadioButton(getLocalizedString("rbt.landscape"));
569        landscape.addActionListener(this);
570        rev_portrait = new JRadioButton(getLocalizedString("rbt.revportrait"));
571        rev_portrait.addActionListener(this);
572        rev_landscape = new JRadioButton(getLocalizedString("rbt.revlandscape"));
573        rev_landscape.addActionListener(this);
574    
575        ButtonGroup group = new ButtonGroup();
576        group.add(portrait);
577        group.add(landscape);
578        group.add(rev_portrait);
579        group.add(rev_landscape);
580          
581        GridBagLayout layout = new GridBagLayout();
582        GridBagConstraints c = new GridBagConstraints();
583        c.fill = GridBagConstraints.BOTH;
584    
585        setLayout(layout);
586        setBorder(new TitledBorder(getLocalizedString("title.orientation")));
587    
588        c.insets = new Insets(5, 5, 5, 5);
589        c.gridx = 0;
590        c.gridy = 0;
591        add(portrait, c);
592    
593        c.gridx = 0;
594        c.gridy = 1;
595        add(landscape, c);
596    
597        c.gridx = 0;
598        c.gridy = 2;
599        add(rev_portrait, c);
600    
601        c.gridx = 0;
602        c.gridy = 3;
603        add(rev_landscape, c);
604      }
605    
606      // event handling orientation
607      public void actionPerformed(ActionEvent e)
608      {
609        if (e.getSource() == portrait)
610          atts.add(OrientationRequested.PORTRAIT);
611        else if (e.getSource() == landscape)
612          atts.add(OrientationRequested.LANDSCAPE);
613        else if (e.getSource() == rev_portrait)
614          atts.add(OrientationRequested.REVERSE_PORTRAIT);
615        else
616          atts.add(OrientationRequested.REVERSE_LANDSCAPE);      
617      }
618    
619      /**
620       * Called to update for new selected
621       * print service. Tests if currently
622       * selected attributes are supported.
623       */
624      void updateForSelectedService()
625      {
626        if (categorySupported(OrientationRequested.class))
627          {
628            portrait.setEnabled(true);
629            landscape.setEnabled(true);
630            rev_landscape.setEnabled(true);
631            rev_portrait.setEnabled(true);
632            
633            Attribute orientation = attribute(OrientationRequested.class);
634            if (orientation != null)
635              {
636                if (orientation.equals(OrientationRequested.LANDSCAPE))
637                  landscape.setSelected(true);
638                else if (orientation.equals(OrientationRequested.PORTRAIT))
639                  portrait.setSelected(true);
640                else if (orientation.equals(OrientationRequested.REVERSE_PORTRAIT))
641                  rev_portrait.setSelected(true);
642                else 
643                  rev_landscape.setSelected(true);
644              }
645            else
646              {
647                Object defaultValue = defaultValue(OrientationRequested.class);
648                if (defaultValue.equals(OrientationRequested.LANDSCAPE))
649                  landscape.setSelected(true);
650                else if (defaultValue.equals(OrientationRequested.PORTRAIT))
651                  portrait.setSelected(true);
652                else if (defaultValue.equals(OrientationRequested.REVERSE_PORTRAIT))
653                  rev_portrait.setSelected(true);
654                else 
655                  rev_landscape.setSelected(true);
656              }
657          }
658        else
659          {
660            portrait.setEnabled(false);
661            landscape.setEnabled(false);
662            rev_landscape.setEnabled(false);
663            rev_portrait.setEnabled(false);
664          }       
665      }
666    }
667 
668    /**
669     * Handles the media attribute.
670     * @author Wolfgang Baer (WBaer@gmx.de)
671     */
672    final class MediaTypes extends JPanel implements ActionListener
673    {
674      private JLabel size_lb, source_lb;
675      private JComboBox size, source;
676    
677      MediaTypes()
678      {
679        size_lb = new JLabel(getLocalizedString("lb.size"));
680        source_lb = new JLabel(getLocalizedString("lb.source"));
681    
682        size = new JComboBox();
683        size.setEditable(false);
684        size.addActionListener(this);
685        source = new JComboBox();
686        source.setEditable(false);
687        size.addActionListener(this);
688    
689        GridBagLayout layout = new GridBagLayout();
690        GridBagConstraints c = new GridBagConstraints();
691    
692        setLayout(layout);
693        setBorder(new TitledBorder(getLocalizedString("title.medias")));
694    
695        c.insets = new Insets(5, 5, 5, 5);
696        c.anchor = GridBagConstraints.LINE_END;
697        c.gridx = 0;
698        c.gridy = 0;
699        add(size_lb, c);
700    
701        c.gridx = 0;
702        c.gridy = 1;
703        add(source_lb, c);
704    
705        c.anchor = GridBagConstraints.LINE_START;
706        c.fill = GridBagConstraints.HORIZONTAL;
707        c.gridx = 1;
708        c.gridy = 0;
709        c.weightx = 1.5;
710        add(size, c);
711    
712        c.gridx = 1;
713        c.gridy = 1;
714        c.weightx = 1.5;
715        add(source, c);
716      }
717    
718      public void actionPerformed(ActionEvent event)
719      {        
720        if (event.getSource() == size)
721          {
722            Object obj = size.getSelectedItem();
723            if (obj instanceof Media)
724              atts.add((Media) obj);    
725          }
726        
727        // we ignore source events currently
728        // as only the automatic selection is used.       
729      }
730    
731      /**
732       * Called to update for new selected
733       * print service. Tests if currently
734       * selected attributes are supported.
735       */
736      void updateForSelectedService()
737      { 
738        if (categorySupported(Media.class))
739          {
740            Media[] medias = (Media[]) getSelectedPrintService()
741              .getSupportedAttributeValues(Media.class, flavor, null);
742            
743            size.removeAllItems();
744            if (medias.length == 0)
745              size.addItem(getLocalizedString("lb.automatically"));     
746            else
747              for (int i=0; i < medias.length; i++)
748                size.addItem(medias[i]);
749            
750            Media media = (Media) attribute(Media.class);
751            if (media != null)
752              size.setSelectedItem(media);
753            
754            // this is currently ignored
755            source.removeAllItems();
756            source.addItem(getLocalizedString("lb.automatically"));
757          }
758        else
759          {
760            size.removeAllItems();
761            source.removeAllItems();
762            
763            size.addItem(getLocalizedString("lb.automatically"));
764            source.addItem(getLocalizedString("lb.automatically"));
765          }
766       }
767    }
768 
769    /**
770     * Handles the media printable area attribute.
771     * @author Wolfgang Baer (WBaer@gmx.de)
772     */
773    final class Margins extends JPanel implements FocusListener
774    {
775      private JLabel left, right, top, bottom;
776      private JTextField left_tf, right_tf, top_tf, bottom_tf;
777    
778      Margins()
779      {
780        left = new JLabel(getLocalizedString("lb.left"));
781        right = new JLabel(getLocalizedString("lb.right"));
782        top = new JLabel(getLocalizedString("lb.top"));
783        bottom = new JLabel(getLocalizedString("lb.bottom"));
784    
785        left_tf = new JTextField(7);
786        left_tf.addFocusListener(this);
787        right_tf = new JTextField(7);
788        right_tf.addFocusListener(this);
789        top_tf = new JTextField(7);
790        top_tf.addFocusListener(this);
791        bottom_tf = new JTextField(7);
792        bottom_tf.addFocusListener(this);
793    
794        GridBagLayout layout = new GridBagLayout();
795        GridBagConstraints c = new GridBagConstraints();
796    
797        setLayout(layout);
798        setBorder(new TitledBorder(getLocalizedString("title.margins")));
799    
800        c.insets = new Insets(5, 5, 5, 5);
801        c.gridx = 0;
802        c.gridy = 0;
803        add(left, c);
804    
805        c.gridx = 1;
806        c.gridy = 0;
807        add(right, c);
808    
809        c.insets = new Insets(5, 5, 5, 5);
810        c.gridx = 0;
811        c.gridy = 1;
812        add(left_tf, c);
813    
814        c.gridx = 1;
815        c.gridy = 1;
816        add(right_tf, c);
817    
818        c.insets = new Insets(10, 5, 5, 5);
819        c.gridx = 0;
820        c.gridy = 2;
821        add(top, c);
822    
823        c.gridx = 1;
824        c.gridy = 2;
825        add(bottom, c);
826    
827        c.insets = new Insets(0, 5, 5, 5);
828        c.gridx = 0;
829        c.gridy = 3;
830        add(top_tf, c);
831    
832        c.gridx = 1;
833        c.gridy = 3;
834        add(bottom_tf, c);
835      }
836      
837      public void focusGained(FocusEvent event)
838      {
839        updateMargins();
840      }
841  
842      public void focusLost(FocusEvent event)
843      {
844        updateMargins();
845      }
846      
847      // updates the margins after user changed it
848      private void updateMargins()
849      {
850        // We currently do not support this attribute
851        // as it is not in the IPP spec and therefore not in CUPS
852      }
853      
854      /**
855       * Called to update for new selected
856       * print service. Tests if currently
857       * selected attributes are supported.
858       */
859      void updateForSelectedService()
860      {
861        if (categorySupported(MediaPrintableArea.class))
862          {
863            left.setEnabled(true);
864            right.setEnabled(true);
865            top.setEnabled(true);
866            bottom.setEnabled(true);
867            left_tf.setEnabled(true);
868            right_tf.setEnabled(true);
869            top_tf.setEnabled(true);
870            bottom_tf.setEnabled(true);           
871          }
872        else
873          {
874            left.setEnabled(false);
875            right.setEnabled(false);
876            top.setEnabled(false);
877            bottom.setEnabled(false);
878            left_tf.setEnabled(false);
879            right_tf.setEnabled(false);
880            top_tf.setEnabled(false);
881            bottom_tf.setEnabled(false); 
882          }     
883       }
884    }
885 
886    private MediaTypes media_panel;
887    private Orientation orientation_panel;
888    private Margins margins_panel;
889 
890    /** 
891     * Constructs the page setup user interface. 
892     */
893    public PageSetupPanel()
894    {
895      setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
896 
897      media_panel = new MediaTypes();
898      orientation_panel = new Orientation();
899      margins_panel = new Margins();
900 
901      JPanel layout_panel = new JPanel();
902      layout_panel.setLayout(new BoxLayout(layout_panel, BoxLayout.LINE_AXIS));
903      layout_panel.add(orientation_panel);
904      layout_panel.add(Box.createRigidArea(new Dimension(10, 0)));
905      layout_panel.add(margins_panel);
906 
907      setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
908      add(media_panel);
909      add(Box.createRigidArea(new Dimension(0, 12)));
910      add(layout_panel);
911    }
912    
913    /**
914     * Calls update on all internal panels to adjust
915     * for a new selected print service.
916     */
917    void update()
918    {
919      media_panel.updateForSelectedService();
920      orientation_panel.updateForSelectedService();
921      margins_panel.updateForSelectedService();
922    }
923  }
924 
925  /**
926   * The Appearance panel for quality, color etc.
927   * @author Wolfgang Baer (WBaer@gmx.de)
928   */
929  final class AppearancePanel extends JPanel
930  {
931    /**
932     * Handles the print quality attribute.
933     * @author Wolfgang Baer (WBaer@gmx.de)
934     */
935    final class Quality extends JPanel implements ActionListener
936    {
937      private JRadioButton low, normal, high;
938      private ButtonGroup group;
939    
940      Quality()
941      {
942        low = new JRadioButton(getLocalizedString("rbt.low"));
943        low.addActionListener(this);
944        normal = new JRadioButton(getLocalizedString("rbt.normal"));
945        normal.addActionListener(this);
946        high = new JRadioButton(getLocalizedString("rbt.high"));
947        high.addActionListener(this);
948    
949        group = new ButtonGroup();
950        group.add(low);
951        group.add(normal);
952        group.add(high);
953    
954        GridBagLayout layout = new GridBagLayout();
955        GridBagConstraints c = new GridBagConstraints();
956    
957        setLayout(layout);
958        setBorder(new TitledBorder(getLocalizedString("title.quality")));
959    
960        c.fill = GridBagConstraints.HORIZONTAL;
961        c.insets = new Insets(5, 5, 5, 5);
962        c.gridx = 0;
963        c.gridy = 0;
964        add(low, c);
965    
966        c.gridx = 0;
967        c.gridy = 1;
968        add(normal, c);
969    
970        c.gridx = 0;
971        c.gridy = 2;
972        add(high, c);
973      }
974    
975      public void actionPerformed(ActionEvent e)
976      {
977        if (e.getSource() == low)
978          atts.add(PrintQuality.DRAFT);
979        else if (e.getSource() == normal)
980          atts.add(PrintQuality.NORMAL);
981        else
982          atts.add(PrintQuality.HIGH);   
983      }
984    
985      /**
986       * Called to update for new selected
987       * print service. Tests if currently
988       * selected attributes are supported.
989       */
990      void updateForSelectedService()
991      {
992        if (categorySupported(PrintQuality.class))
993          {
994            low.setEnabled(true);
995            normal.setEnabled(true);
996            high.setEnabled(true);
997            
998            Object defaultValue = defaultValue(PrintQuality.class);          
999            Attribute quality = attribute(PrintQuality.class);
1000            
1001            if (quality != null)
1002              {
1003                if (quality.equals(PrintQuality.DRAFT))
1004                  low.setSelected(true);
1005                else if (quality.equals(PrintQuality.NORMAL))
1006                  normal.setSelected(true);
1007                else 
1008                  high.setSelected(true);
1009              }
1010            else
1011              {
1012                if (defaultValue.equals(PrintQuality.DRAFT))
1013                  low.setSelected(true);
1014                else if (defaultValue.equals(PrintQuality.NORMAL))
1015                  normal.setSelected(true);
1016                else 
1017                  high.setSelected(true);
1018              }              
1019          }
1020        else
1021          {
1022            low.setEnabled(false);
1023            normal.setEnabled(false);
1024            high.setEnabled(false);
1025          }       
1026      }
1027    }
1028  
1029    /**
1030     * Handles the job attributes as requesting username, jobname etc.
1031     * @author Wolfgang Baer (WBaer@gmx.de)
1032     */
1033    final class JobAttributes extends JPanel
1034      implements ActionListener, ChangeListener, FocusListener
1035    {    
1036      private JLabel jobname, username, priority_lb;    
1037      private JTextField jobname_tf, username_tf;    
1038      private JCheckBox cover;    
1039      private JSpinner priority;
1040      private SpinnerNumberModel model;
1041    
1042      JobAttributes()
1043      {
1044        jobname = new JLabel(getLocalizedString("lb.jobname"));
1045        username = new JLabel(getLocalizedString("lb.username"));
1046        priority_lb = new JLabel(getLocalizedString("lb.priority"));
1047    
1048        cover = new JCheckBox(getLocalizedString("cb.cover"));
1049        cover.addActionListener(this);
1050    
1051        model = new SpinnerNumberModel(1, 1, 100, 1);
1052        priority = new JSpinner(model);
1053        priority.addChangeListener(this);
1054    
1055        jobname_tf = new JTextField();
1056        jobname_tf.addFocusListener(this);
1057        username_tf = new JTextField();
1058        username_tf.addFocusListener(this);
1059    
1060        GridBagLayout layout = new GridBagLayout();
1061        GridBagConstraints c = new GridBagConstraints();
1062    
1063        setLayout(layout);
1064        setBorder(new TitledBorder(getLocalizedString("title.jobattributes")));
1065    
1066        c.insets = new Insets(10, 5, 10, 5);
1067        c.gridx = 0;
1068        c.gridy = 0;
1069        add(cover, c);
1070    
1071        c.anchor = GridBagConstraints.LINE_END;
1072        c.gridx = 1;
1073        c.gridy = 0;
1074        c.weightx = 2;
1075        add(priority_lb, c);
1076    
1077        c.gridx = 2;
1078        c.gridy = 0;
1079        c.weightx = 0.5;
1080        add(priority, c);
1081    
1082        c.anchor = GridBagConstraints.LINE_END;
1083        c.gridx = 0;
1084        c.gridy = 1;
1085        add(jobname, c);
1086    
1087        c.gridx = 0;
1088        c.gridy = 2;
1089        add(username, c);
1090    
1091        c.anchor = GridBagConstraints.CENTER;
1092        c.fill = GridBagConstraints.HORIZONTAL;
1093        c.gridx = 1;
1094        c.gridy = 1;
1095        c.gridwidth = 2;
1096        c.weightx = 1.5;
1097        add(jobname_tf, c);
1098    
1099        c.insets = new Insets(10, 5, 15, 5);
1100        c.gridx = 1;
1101        c.gridy = 2;
1102        add(username_tf, c);
1103      }
1104      
1105      public void actionPerformed(ActionEvent event)
1106      {
1107        if (cover.isSelected())
1108          atts.add(JobSheets.STANDARD);
1109        else
1110          atts.add(JobSheets.NONE);
1111      }
1112      
1113      public void stateChanged(ChangeEvent event)
1114      {
1115        int value = ((Integer) priority.getValue()).intValue();
1116        atts.add(new JobPriority(value));  
1117      }
1118      
1119      public void focusGained(FocusEvent event)
1120      {        
1121        updateTextfields(event);
1122      }
1123  
1124      public void focusLost(FocusEvent event)
1125      {
1126        updateTextfields(event);
1127      }
1128      
1129      private void updateTextfields(FocusEvent event)
1130      {
1131        if (event.getSource() == jobname_tf)
1132            atts.add(new JobName(jobname_tf.getText(), null));
1133        else
1134            atts.add(new RequestingUserName(username_tf.getText(), null));
1135      }
1136 
1137      /**
1138       * Called to update for new selected
1139       * print service. Tests if currently
1140       * selected attributes are supported.
1141       */
1142      void updateForSelectedService()
1143      {
1144        // JobPriority       
1145        if (categorySupported(JobPriority.class))
1146          {
1147            JobPriority prio = (JobPriority) attribute(JobPriority.class);
1148            JobPriority value = (JobPriority) defaultValue(JobPriority.class);         
1149            priority.setEnabled(true);
1150            if (prio != null)
1151              model.setValue(new Integer(prio.getValue()));
1152            else
1153              model.setValue(new Integer(value.getValue()));
1154          }         
1155        else
1156          priority.setEnabled(false);  
1157        
1158        // Requesting username
1159        if (categorySupported(RequestingUserName.class))
1160          {
1161            Attribute user = attribute(RequestingUserName.class);
1162            Object value = defaultValue(RequestingUserName.class);
1163            username.setEnabled(true);            
1164            if (user != null)
1165              username_tf.setText(user.toString());
1166            else
1167              username_tf.setText(value.toString());
1168          }
1169        else
1170          username.setEnabled(false);  
1171        
1172        // Job Name
1173        if (categorySupported(JobName.class))
1174          {
1175            Attribute job = attribute(JobName.class);
1176            Object value = defaultValue(JobName.class);
1177            jobname.setEnabled(true);          
1178            if (job != null)
1179              jobname_tf.setText(job.toString());
1180            else
1181              jobname_tf.setText(value.toString());
1182          }
1183        else
1184          jobname.setEnabled(false);  
1185        
1186        // Job sheets
1187        if (categorySupported(JobSheets.class))
1188          {
1189            Attribute sheet = attribute(JobSheets.class);
1190            Object value = defaultValue(JobSheets.class);
1191            cover.setEnabled(true);       
1192            if (sheet != null)
1193              {
1194                if (sheet.equals(JobSheets.NONE))
1195                  cover.setSelected(false);
1196                else 
1197                  cover.setSelected(true);
1198              }
1199            else
1200              {
1201                if (value.equals(JobSheets.NONE))
1202                  cover.setSelected(false);
1203                else
1204                  cover.setSelected(true);
1205              }
1206          }
1207        else
1208          cover.setEnabled(false);      
1209      }
1210    }
1211  
1212    /**
1213     * Handles the sides attributes.
1214     * @author Wolfgang Baer (WBaer@gmx.de)
1215     */
1216    final class SidesPanel extends JPanel implements ActionListener
1217    {    
1218      private JRadioButton oneside, calendar, duplex;
1219    
1220      SidesPanel()
1221      { 
1222        oneside = new JRadioButton(getLocalizedString("rbt.onesided"));
1223        oneside.addActionListener(this);
1224        calendar = new JRadioButton(getLocalizedString("rbt.calendar"));
1225        calendar.addActionListener(this);
1226        duplex = new JRadioButton(getLocalizedString("rbt.duplex"));
1227        duplex.addActionListener(this);
1228    
1229        ButtonGroup group = new ButtonGroup();
1230        group.add(oneside);
1231        group.add(calendar);
1232        group.add(duplex);
1233    
1234        GridBagLayout layout = new GridBagLayout();
1235        GridBagConstraints c = new GridBagConstraints();
1236        c.fill = GridBagConstraints.BOTH;
1237    
1238        setLayout(layout);
1239        setBorder(new TitledBorder(getLocalizedString("title.sides")));
1240    
1241        c.insets = new Insets(5, 5, 5, 5);
1242        c.gridx = 0;
1243        c.gridy = 0;
1244        add(oneside, c);
1245    
1246        c.gridx = 0;
1247        c.gridy = 1;
1248        add(calendar, c);
1249    
1250        c.gridx = 0;
1251        c.gridy = 2;
1252        add(duplex, c);
1253      }
1254    
1255      public void actionPerformed(ActionEvent e)
1256      {
1257        if (e.getSource() == calendar)
1258          atts.add(Sides.TWO_SIDED_SHORT_EDGE);
1259        else if (e.getSource() == oneside)
1260          atts.add(Sides.ONE_SIDED);
1261        else
1262          atts.add(Sides.TWO_SIDED_LONG_EDGE);
1263      }
1264    
1265      /**
1266       * Called to update for new selected
1267       * print service. Tests if currently
1268       * selected attributes are supported.
1269       */
1270      void updateForSelectedService()
1271      {
1272        if (categorySupported(Sides.class))
1273          {
1274            oneside.setEnabled(true);
1275            calendar.setEnabled(true);
1276            duplex.setEnabled(true);
1277            
1278            Object defaultValue = defaultValue(Sides.class);           
1279            Attribute sides = attribute(Sides.class);
1280            if (sides != null)
1281              {
1282                if (sides.equals(Sides.TWO_SIDED_SHORT_EDGE))
1283                  calendar.setSelected(true);
1284                else if (sides.equals(Sides.ONE_SIDED))
1285                  oneside.setSelected(true);
1286                else
1287                  duplex.setSelected(true);
1288              }
1289            else
1290              {
1291                if (defaultValue.equals(Sides.TWO_SIDED_SHORT_EDGE))
1292                  calendar.setSelected(true);
1293                else if (defaultValue.equals(Sides.ONE_SIDED))
1294                  oneside.setSelected(true);
1295                else
1296                  duplex.setSelected(true);
1297              }
1298          }
1299        else
1300          {           
1301            oneside.setEnabled(false);
1302            calendar.setEnabled(false);
1303            duplex.setEnabled(false);
1304          }       
1305      }
1306    }
1307  
1308    /**
1309     * Handles the chromaticity attributes.
1310     * @author Wolfgang Baer (WBaer@gmx.de)
1311     */
1312    final class Color extends JPanel implements ActionListener
1313    {
1314      private JRadioButton bw, color;
1315    
1316      Color()
1317      {
1318        bw = new JRadioButton(getLocalizedString("rbt.blackwhite"));
1319        bw.addActionListener(this);
1320        color = new JRadioButton(getLocalizedString("rbt.color"));
1321        color.addActionListener(this);
1322    
1323        ButtonGroup group = new ButtonGroup();
1324        group.add(bw);
1325        group.add(color);
1326    
1327        GridBagLayout layout = new GridBagLayout();
1328        GridBagConstraints c = new GridBagConstraints();
1329    
1330        setLayout(layout);
1331        setBorder(new TitledBorder(getLocalizedString("title.color")));
1332    
1333        c.fill = GridBagConstraints.HORIZONTAL;
1334        c.insets = new Insets(5, 5, 5, 5);
1335        c.gridx = 0;
1336        c.gridy = 0;
1337        add(bw, c);
1338    
1339        c.gridx = 0;
1340        c.gridy = 1;
1341        add(color, c);
1342      }
1343    
1344      public void actionPerformed(ActionEvent e)
1345      {
1346        if (e.getSource() == bw)
1347          atts.add(Chromaticity.MONOCHROME);        
1348        else
1349          atts.add(Chromaticity.COLOR);
1350      }
1351    
1352      /**
1353       * Called to update for new selected
1354       * print service. Tests if currently
1355       * selected attributes are supported.
1356       */
1357      void updateForSelectedService()
1358      {
1359        if (categorySupported(Chromaticity.class))
1360          {
1361            bw.setEnabled(true);
1362            color.setEnabled(true);           
1363            
1364            Object defaultValue = defaultValue(Chromaticity.class);           
1365            Attribute chromaticity = attribute(Chromaticity.class);
1366            if (chromaticity != null)
1367              {
1368                if (chromaticity.equals(Chromaticity.MONOCHROME))
1369                  bw.setSelected(true);
1370                else 
1371                  color.setSelected(true);
1372              }
1373            else
1374              {
1375                if (defaultValue.equals(Chromaticity.MONOCHROME))
1376                  bw.setSelected(true);
1377                else               
1378                  color.setSelected(true);
1379              }
1380          }
1381        else
1382          {           
1383            bw.setEnabled(false);
1384            color.setEnabled(false);
1385          }
1386      }
1387    }
1388  
1389    private Quality quality_panel;
1390    private JobAttributes jobAttr_panel;
1391    private SidesPanel sides_panel;
1392    private Color chromaticy_panel;
1393  
1394    /**
1395     * Creates the panel for appearance attributes.
1396     */
1397    public AppearancePanel()
1398    {
1399      setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
1400  
1401      quality_panel = new Quality();
1402      jobAttr_panel = new JobAttributes();
1403      sides_panel = new SidesPanel();
1404      chromaticy_panel = new Color();
1405  
1406      JPanel layout_panel = new JPanel();
1407      layout_panel.setLayout(new BoxLayout(layout_panel, BoxLayout.LINE_AXIS));
1408      layout_panel.add(chromaticy_panel);
1409      layout_panel.add(Box.createRigidArea(new Dimension(10, 0)));
1410      layout_panel.add(quality_panel);
1411  
1412      JPanel layout2_panel = new JPanel();
1413      layout2_panel.setLayout(new BoxLayout(layout2_panel, BoxLayout.LINE_AXIS));
1414      layout2_panel.add(sides_panel);
1415      layout2_panel.add(Box.createRigidArea(new Dimension(10, 0)));
1416      layout2_panel.add(jobAttr_panel);
1417  
1418      setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
1419      add(layout_panel);
1420      add(Box.createRigidArea(new Dimension(0, 12)));
1421      add(layout2_panel);
1422    }
1423    
1424    /**
1425     * Calls update on all internal panels to adjust
1426     * for a new selected print service.
1427     */
1428    void update()
1429    {
1430      quality_panel.updateForSelectedService();
1431      jobAttr_panel.updateForSelectedService();
1432      sides_panel.updateForSelectedService();
1433      chromaticy_panel.updateForSelectedService();
1434    }
1435  }
1436 
1437  // on main contentpane
1438  private JButton ok_bt;
1439  private JButton cancel_bt;
1440 
1441  // the tabs
1442  private GeneralPanel general_panel;
1443  private PageSetupPanel pagesetup_panel;
1444  private AppearancePanel appearance_panel;
1445  
1446  private PrintService[] services;
1447  private PrintService defaultService;
1448  private PrintService selectedService;
1449  private DocFlavor flavor;
1450  private PrintRequestAttributeSet attributes;
1451  
1452  private boolean onlyPageDialog;  
1453  private PrintRequestAttributeSet atts; 
1454  
1455  private final static ResourceBundle messages;
1456 
1457  static
1458  {    
1459    messages = ResourceBundle.getBundle("gnu/javax/print/PrinterDialog");
1460  }
1461  
1462  // TODO LowPriority: Include checks so that if a specific value formerly
1463  // selected is no more supported by the new service changes to the default.
1464  
1465  /**
1466   * Class private constructs a printer dialog.
1467   * 
1468   * @param gc the screen to use. <code>null</code> is default screen.
1469   * @param services the print services to browse (not null).
1470   * @param defaultService the default service. If <code>null</code>
1471   * the first of the print services in the services array will be used.
1472   * @param flavor the flavours to be printed.
1473   * @param attributes the attributes requested. Will be updated 
1474   * by selections done by the user in the dialog.
1475   * @param onlyPageDialog if true a page settings only dialog is constructed.
1476   * 
1477   * @throws HeadlessException if GraphicsEnvironment is headless
1478   */
1479  private PrinterDialog(GraphicsConfiguration gc, PrintService[] services, 
1480    PrintService defaultService, DocFlavor flavor, 
1481    PrintRequestAttributeSet attributes, boolean onlyPageDialog, String title)
1482    throws HeadlessException
1483  {
1484    super((Frame)null, title, true, gc);
1485       
1486    setResizable(false);
1487    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
1488 
1489    // check and remove service not supporting the flavor
1490    if (flavor != null)
1491      {
1492        ArrayList list = new ArrayList(services.length);
1493        for(int i=0; i < services.length; i++)
1494          if (services[i].isDocFlavorSupported(flavor))
1495            list.add(services[i]);
1496        
1497        if (defaultService != null
1498            && (! list.contains(defaultService)))
1499          defaultService = (PrintService) list.get(0);
1500        
1501        PrintService[] newServices = new PrintService[list.size()];
1502        this.services = (PrintService[]) list.toArray(newServices);
1503      }
1504    else
1505      this.services = services;
1506    
1507    if (defaultService == null)
1508      this.defaultService = services[0];
1509    else
1510      this.defaultService = defaultService;
1511    
1512    this.selectedService = this.defaultService;
1513    this.flavor = flavor;
1514    
1515    // the attributes given by the user
1516    this.attributes = attributes;
1517    // the one to work with during browsing
1518    this.atts = new HashPrintRequestAttributeSet(attributes);
1519    
1520    this.onlyPageDialog = onlyPageDialog;
1521    
1522    initUI(onlyPageDialog);    
1523    pack();
1524    updateAll();
1525  }
1526  
1527  /**
1528   * Constructs a page settings only dialog.
1529   * 
1530   * @param gc the screen to use. <code>null</code> is default screen.
1531   * @param service the print service for the page dialog.
1532   * the first of the print services in the services array will be used.
1533   * @param flavor the flavours to be printed.
1534   * @param attributes the attributes requested. Will be updated 
1535   * by selections done by the user in the dialog. 
1536   * 
1537   * @throws HeadlessException if GraphicsEnvironment is headless
1538   */
1539  public PrinterDialog(GraphicsConfiguration gc, PrintService service, 
1540    DocFlavor flavor, PrintRequestAttributeSet attributes)
1541    throws HeadlessException
1542  {
1543    this(gc, new PrintService[] {service}, service, flavor, attributes, 
1544         true, getLocalizedString("title.pagedialog"));  
1545  }
1546  
1547  /**
1548   * Constructs a printer dialog.
1549   * 
1550   * @param gc the screen to use. <code>null</code> is default screen.
1551   * @param services the print services to browse (not null).
1552   * @param defaultService the default service. If <code>null</code>
1553   * the first of the print services in the services array will be used.
1554   * @param flavor the flavours to be printed.
1555   * @param attributes the attributes requested. Will be updated 
1556   * by selections done by the user in the dialog. 
1557   * 
1558   * @throws HeadlessException if GraphicsEnvironment is headless
1559   */
1560  public PrinterDialog(GraphicsConfiguration gc, PrintService[] services, 
1561    PrintService defaultService, DocFlavor flavor, 
1562    PrintRequestAttributeSet attributes)
1563    throws HeadlessException
1564  {
1565    this(gc, services, defaultService, flavor, attributes, 
1566         false, getLocalizedString("title.printdialog"));
1567  }
1568 
1569  // initializes the gui parts
1570  private void initUI(boolean onlyPageDialog)
1571  { 
1572    JPanel buttonPane = new JPanel();
1573    
1574    if (onlyPageDialog)
1575      {
1576        JPanel pane = new JPanel();
1577        pane.setLayout(new BorderLayout());
1578        pagesetup_panel = new PageSetupPanel();
1579        pane.add(pagesetup_panel, BorderLayout.CENTER);
1580            
1581        ok_bt = new JButton(getLocalizedString("bt.OK"));
1582        ok_bt.addActionListener(this);
1583        cancel_bt = new JButton(getLocalizedString("bt.cancel"));
1584        cancel_bt.addActionListener(this);     
1585        
1586        getContentPane().add(pane, BorderLayout.CENTER);        
1587      }
1588    else
1589      {
1590        general_panel = new GeneralPanel();
1591        pagesetup_panel = new PageSetupPanel();
1592        appearance_panel = new AppearancePanel();
1593 
1594        JTabbedPane pane = new JTabbedPane();
1595        pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
1596 
1597        ok_bt = new JButton(getLocalizedString("bt.print"));
1598        ok_bt.addActionListener(this);
1599        cancel_bt = new JButton(getLocalizedString("bt.cancel"));
1600        cancel_bt.addActionListener(this);
1601 
1602        // populate jtabbedpane
1603        pane.addTab(getLocalizedString("tab.general"), general_panel);
1604        pane.addTab(getLocalizedString("tab.pagesetup"), pagesetup_panel);
1605        pane.addTab(getLocalizedString("tab.appearance"), appearance_panel);
1606 
1607        // Put everything together
1608        getContentPane().add(pane, BorderLayout.CENTER);
1609      }
1610    
1611    buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
1612    buttonPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
1613    buttonPane.add(Box.createHorizontalGlue());
1614    buttonPane.add(ok_bt);
1615    buttonPane.add(Box.createRigidArea(new Dimension(5, 0)));
1616    buttonPane.add(cancel_bt);
1617    
1618    getContentPane().add(buttonPane, BorderLayout.PAGE_END);
1619  }
1620 
1621  /**
1622   * Returns the modified attributes set.
1623   * @return The attributes.
1624   */
1625  public PrintRequestAttributeSet getAttributes()
1626  {
1627    return attributes;
1628  }
1629 
1630  /**
1631   * Returns the print service selected by the user.
1632   * @return The selected print service.
1633   */
1634  public PrintService getSelectedPrintService()
1635  {
1636    return selectedService;
1637  }
1638  
1639  /**
1640   * Sets the currently selected print service.
1641   * 
1642   * @param service the service selected.
1643   */
1644  protected void setSelectedPrintService(PrintService service)
1645  {
1646    selectedService = service;
1647  }
1648  
1649  /**
1650   * Returns the print service array.
1651   * @return The print services.
1652   */
1653  protected PrintService[] getPrintServices()
1654  {
1655    return services;
1656  }
1657  
1658  /**
1659   * Calls update on all panels to adjust
1660   * for a new selected print service.
1661   */
1662  void updateAll()
1663  {
1664    pagesetup_panel.update();
1665    
1666    if (! onlyPageDialog)
1667      {
1668        general_panel.update();
1669        appearance_panel.update();
1670      }   
1671  }
1672  
1673  boolean categorySupported(Class category)
1674  {
1675    return getSelectedPrintService().
1676      isAttributeCategorySupported(category);
1677  }
1678  
1679  Object defaultValue(Class category)
1680  {
1681    return getSelectedPrintService().
1682      getDefaultAttributeValue(category);
1683  }
1684  
1685  Attribute attribute(Class category)
1686  {
1687    return atts.get(category);
1688  }
1689  
1690  /** 
1691   *  Action handler for Print/Cancel buttons.
1692   *  If cancel is pressed we reset the attributes
1693   *  and the selected service.
1694   *  
1695   *  @param e the ActionEvent
1696   */
1697  public void actionPerformed(ActionEvent e)
1698  {
1699    if (e.getSource() == ok_bt)
1700      {
1701        setVisible(false);       
1702        attributes.addAll(atts);
1703        dispose();
1704      }
1705    else
1706      {
1707        setVisible(false);     
1708        selectedService = null;
1709        dispose();
1710      }
1711  }
1712  
1713  /**
1714   * Retrieves localized messages from the resource bundle.
1715   * 
1716   * @param key the key
1717   * @return The localized value for the key.
1718   */
1719  static final String getLocalizedString(String key) {
1720    return messages.getString(key);
1721  }
1722}

[all classes][gnu.javax.print]
EMMA 2.0.6427 (unsupported private build) (C) Vladimir Roubtsov