--- /dev/null
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.filechooser.*;
+import java.net.URL;
+import java.net.*;
+import java.io.*;
+import com.easysw.cups.*;
+
+public class GLPoptions implements ActionListener
+{
+ Cups cups = null;
+ CupsJob job = null;
+ CupsPrinter printer = null;
+
+ String fileName = "";
+
+ JPanel mainPanel;
+ JTextField fileTextField;
+ JButton printButton;
+ GridBagLayout mainLayout;
+ GridBagConstraints mainConst;
+
+ //
+ // Print options;
+ //
+ String[] jobSheetsNames;
+ String[] orientationNames;
+ int[] orientationValues;
+ String[] qualityNames;
+ int[] qualityValues;
+
+ String jobSheetsOption = "";
+ int orientationOption = -1;
+ int qualityOption = -1;
+
+ int pageLowerOption = 0;
+ int pageUpperOption = 0;
+ boolean pagePrintAll = true;
+
+ int numCopiesOption = 1;
+ int numLowerCopiesOption = -1;
+ int numUpperCopiesOption = -1;
+
+ int selectedJobSheets = 0;
+ int selectedOrientation = 0;
+ int selectedQuality = 0;
+
+ JComboBox orientationBox;
+ JComboBox jobSheetsBox;
+ JTextField numCopiesField;
+ JCheckBox printAllCheckBox;
+ JTextField pageLowerField;
+ JTextField pageUpperField;
+ MyTextListener textListener = new MyTextListener();
+
+
+ // Constructor
+ public GLPoptions()
+ {
+ mainPanel = new JPanel();
+ mainPanel.setLayout(new BorderLayout());
+ mainPanel.setBackground(GLPcolors.backgroundColor);
+ JLabel label = new JLabel("No printer selected");
+ label.setForeground(GLPcolors.foregroundColor);
+ mainPanel.add(label,BorderLayout.CENTER);
+ }
+
+ // Constructor
+ public GLPoptions(CupsPrinter cp)
+ {
+ printer = cp;
+ if (printer != null)
+ {
+ load(printer);
+ }
+ else
+ {
+ mainPanel = new JPanel();
+ mainPanel.setLayout(new BorderLayout());
+ mainPanel.setBackground(GLPcolors.backgroundColor);
+ JLabel label = new JLabel("No printer selected");
+ label.setForeground(GLPcolors.foregroundColor);
+ mainPanel.add(label,BorderLayout.CENTER);
+ }
+ }
+
+
+ private void load( CupsPrinter cp )
+ {
+
+ fillOptionValues();
+
+ // Create the main panel to contain the two sub panels.
+ mainPanel = new JPanel();
+ mainLayout = new GridBagLayout();
+ mainConst = new GridBagConstraints();
+
+ mainPanel.setLayout(mainLayout);
+ mainPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+ mainPanel.setBackground(GLPcolors.backgroundColor);
+
+ String tmp_s = "Printing to " + printer.getPrinterName() +
+ " on " + GLPvars.cupsServerName;
+ JLabel printerNameText = new JLabel(tmp_s);
+ printerNameText.setForeground(GLPcolors.foregroundColor);
+ mainConst.gridwidth = GridBagConstraints.RELATIVE;
+ mainConst.gridx = 0;
+ mainConst.gridy = 0;
+ mainConst.fill = GridBagConstraints.NONE;
+ mainConst.weightx = 0.0;
+ mainConst.weighty = 0.0;
+ mainConst.ipady = 4;
+ mainLayout.setConstraints( printerNameText, mainConst );
+ mainPanel.add(printerNameText);
+
+ JPanel filePanel = buildFilePanel();
+ mainConst.gridwidth = GridBagConstraints.RELATIVE;
+ mainConst.gridx = 0;
+ mainConst.gridy = 1;
+ mainConst.fill = GridBagConstraints.HORIZONTAL;
+ mainConst.weightx = 1.0;
+ mainConst.weighty = 0.1;
+ mainConst.ipady = 4;
+ mainLayout.setConstraints( filePanel, mainConst );
+ mainPanel.add(filePanel);
+
+ JPanel orientationPanel = buildOrientationComboBox();
+ mainConst.gridwidth = GridBagConstraints.RELATIVE;
+ mainConst.gridx = 0;
+ mainConst.gridy = 2;
+ mainConst.fill = GridBagConstraints.NONE;
+ mainConst.weightx = 0.8;
+ mainConst.weighty = 0.1;
+ mainConst.ipady = 4;
+ mainLayout.setConstraints( orientationPanel, mainConst );
+ mainPanel.add(orientationPanel);
+
+ JPanel jobSheetsPanel = buildJobSheetsComboBox();
+ mainConst.gridwidth = GridBagConstraints.RELATIVE;
+ mainConst.gridx = 0;
+ mainConst.gridy = 3;
+ mainConst.fill = GridBagConstraints.NONE;
+ mainConst.weightx = 0.8;
+ mainConst.weighty = 0.1;
+ mainConst.ipady = 4;
+ mainLayout.setConstraints( jobSheetsPanel, mainConst );
+ mainPanel.add(jobSheetsPanel);
+
+ JPanel numCopiesPanel = buildNumCopiesPanel();
+ mainConst.gridwidth = GridBagConstraints.RELATIVE;
+ mainConst.gridx = 0;
+ mainConst.gridy = 4;
+ mainConst.fill = GridBagConstraints.HORIZONTAL;
+ mainConst.weightx = 1.0;
+ mainConst.weighty = 0.1;
+ mainConst.ipady = 4;
+ mainLayout.setConstraints( numCopiesPanel, mainConst );
+ mainPanel.add(numCopiesPanel);
+
+ JPanel pageRangePanel = buildPageRangePanel();
+ mainConst.gridwidth = GridBagConstraints.RELATIVE;
+ mainConst.gridx = 0;
+ mainConst.gridy = 5;
+ mainConst.fill = GridBagConstraints.HORIZONTAL;
+ mainConst.weightx = 1.0;
+ mainConst.weighty = 0.1;
+ mainConst.ipady = 4;
+ mainLayout.setConstraints( pageRangePanel, mainConst );
+ mainPanel.add(pageRangePanel);
+
+ JPanel buttonPanel = buildButtonPanel();
+ mainConst.gridwidth = GridBagConstraints.RELATIVE;
+ mainConst.gridx = 0;
+ mainConst.gridy = 6;
+ mainConst.fill = GridBagConstraints.NONE;
+ mainConst.weightx = 1.0;
+ mainConst.weighty = 0.1;
+ mainConst.ipady = 4;
+ mainLayout.setConstraints( buttonPanel, mainConst );
+ mainPanel.add(buttonPanel);
+
+ }
+
+
+ // --------------------------------------------------------------
+ //
+ // Filename / Browse panel
+ //
+ public JPanel buildFilePanel()
+ {
+ JPanel localPanel = new JPanel();
+ final JFileChooser fc = new JFileChooser();
+
+ localPanel.setBackground(GLPcolors.backgroundColor);
+ localPanel.setLayout(new BorderLayout());
+
+ //Create a regular text field.
+ fileTextField = new JTextField(50);
+ fileTextField.addActionListener(this);
+
+ //Create some labels for the fields.
+ JLabel fileFieldLabel = new JLabel(" File to print: ");
+ fileFieldLabel.setForeground(GLPcolors.foregroundColor);
+ // fileFieldLabel.setLabelFor(fileTextField);
+
+ localPanel.add( fileFieldLabel, BorderLayout.WEST );
+ localPanel.add( fileTextField, BorderLayout.CENTER );
+
+ //Create the open button
+ JButton openButton = new JButton("Browse ..." );
+ openButton.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ int returnVal = fc.showOpenDialog(mainPanel);
+ if (returnVal == JFileChooser.APPROVE_OPTION)
+ {
+ File file = fc.getSelectedFile();
+ // fileTextField.setText(file.getPath() + file.getName());
+ fileTextField.setText(file.getPath());
+ fileName = file.getPath();
+ }
+ }
+ });
+ openButton.setBackground(GLPcolors.buttonBackgroundColor);
+ openButton.setForeground(GLPcolors.buttonForegroundColor);
+ localPanel.add(openButton, BorderLayout.EAST );
+ return(localPanel);
+ }
+
+
+
+ public JPanel buildOrientationComboBox()
+ {
+ JPanel localPanel = new JPanel();
+ localPanel.setLayout(new BorderLayout());
+ localPanel.setBackground(GLPcolors.backgroundColor);
+
+ JLabel localLabel = new JLabel("Page Orientation: ");
+ localLabel.setBackground(GLPcolors.backgroundColor);
+ localLabel.setForeground(GLPcolors.foregroundColor);
+
+ orientationBox = new JComboBox(orientationNames);
+ if (selectedOrientation > 0)
+ orientationBox.setSelectedIndex(selectedOrientation);
+ orientationBox.addActionListener(this);
+ orientationBox.setBackground(GLPcolors.backgroundColor);
+
+ localPanel.add(localLabel,BorderLayout.WEST);
+ localPanel.add(orientationBox,BorderLayout.CENTER);
+
+ return(localPanel);
+ }
+
+
+ public JPanel buildJobSheetsComboBox()
+ {
+ JPanel localPanel = new JPanel();
+ localPanel.setLayout(new BorderLayout());
+ localPanel.setBackground(GLPcolors.backgroundColor);
+
+ JLabel localLabel = new JLabel("Job Sheets: ");
+ localLabel.setBackground(GLPcolors.backgroundColor);
+ localLabel.setForeground(GLPcolors.foregroundColor);
+
+ jobSheetsBox = new JComboBox(jobSheetsNames);
+ if (selectedJobSheets > 0)
+ jobSheetsBox.setSelectedIndex(selectedJobSheets);
+ jobSheetsBox.addActionListener(this);
+ jobSheetsBox.setBackground(GLPcolors.backgroundColor);
+
+ localPanel.add(localLabel,BorderLayout.WEST);
+ localPanel.add(jobSheetsBox,BorderLayout.CENTER);
+
+ return(localPanel);
+ }
+
+ public JPanel buildNumCopiesPanel()
+ {
+ JPanel localPanel = new JPanel();
+ localPanel.setLayout(new FlowLayout());
+ localPanel.setBackground(GLPcolors.backgroundColor);
+
+ JLabel localLabel = new JLabel("Number of copies: ");
+ localLabel.setBackground(GLPcolors.backgroundColor);
+ localLabel.setForeground(GLPcolors.foregroundColor);
+
+ numCopiesField = new JTextField(3);
+ if (numCopiesOption > 0)
+ numCopiesField.setText(new Integer(numCopiesOption).toString());
+ numCopiesField.addActionListener(this);
+ numCopiesField.addFocusListener(textListener);
+ numCopiesField.setBackground(GLPcolors.backgroundColor);
+
+ localPanel.add(localLabel);
+ localPanel.add(numCopiesField);
+
+ return(localPanel);
+ }
+
+
+ public JPanel buildPageRangePanel()
+ {
+ JPanel localPanel = new JPanel();
+ localPanel.setLayout(new FlowLayout());
+ localPanel.setBackground(GLPcolors.backgroundColor);
+
+ printAllCheckBox = new JCheckBox("Print all", pagePrintAll );
+ printAllCheckBox.setBackground(GLPcolors.backgroundColor);
+ printAllCheckBox.setForeground(GLPcolors.foregroundColor);
+ printAllCheckBox.addActionListener(this);
+
+ JLabel localLabel = new JLabel("-or- pages: ");
+ localLabel.setBackground(GLPcolors.backgroundColor);
+ localLabel.setForeground(GLPcolors.foregroundColor);
+
+ JLabel localLabel2 = new JLabel(" to ");
+ localLabel2.setBackground(GLPcolors.backgroundColor);
+ localLabel2.setForeground(GLPcolors.foregroundColor);
+
+ pageLowerField = new JTextField(4);
+ pageUpperField = new JTextField(4);
+
+ pageLowerField.addActionListener(this);
+ pageUpperField.addActionListener(this);
+ pageLowerField.addFocusListener(textListener);
+ pageUpperField.addFocusListener(textListener);
+
+ pageLowerField.setBackground(GLPcolors.backgroundColor);
+ pageUpperField.setBackground(GLPcolors.backgroundColor);
+ pageLowerField.setEnabled(false);
+ pageUpperField.setEnabled(false);
+
+ localPanel.add(printAllCheckBox);
+ localPanel.add(localLabel);
+ localPanel.add(pageLowerField);
+ localPanel.add(localLabel2);
+ localPanel.add(pageUpperField);
+
+ return(localPanel);
+ }
+
+
+
+
+ public JPanel buildTextPanel()
+ {
+ JPanel localPanel = new JPanel();
+ return(localPanel);
+ }
+
+ public JPanel buildButtonPanel()
+ {
+ JPanel localPanel = new JPanel();
+ localPanel.setLayout(new BorderLayout());
+ printButton = new JButton(" Print ");
+ printButton.setBackground(GLPcolors.buttonBackgroundColor);
+ printButton.setForeground(GLPcolors.buttonForegroundColor);
+ printButton.addActionListener( this );
+ localPanel.add(printButton, BorderLayout.WEST );
+ return(localPanel);
+ }
+
+
+
+ public void updateOptions(CupsPrinter cp)
+ {
+ printer = cp;
+ if (printer != null)
+ {
+ load(printer);
+ }
+ else
+ {
+ mainPanel = new JPanel();
+ mainPanel.setLayout(new BorderLayout());
+ mainPanel.setBackground(GLPcolors.backgroundColor);
+ JLabel label = new JLabel("No printer selected");
+ label.setForeground(GLPcolors.foregroundColor);
+ mainPanel.add(label,BorderLayout.CENTER);
+ }
+ }
+
+ public JPanel getPanel()
+ {
+ return(mainPanel);
+ }
+
+
+
+
+ public CupsJob printFile( String filename )
+ {
+ Cups cups;
+ CupsJob job;
+ URL u;
+ IPPAttribute attrs[];
+
+ attrs = buildPrintAttributes();
+
+ // for (int i=0; i < attrs.length; i++)
+ // attrs[i].dump_values();
+
+ try
+ {
+ u = new URL("http://" + GLPvars.getServerName() +
+ ":631/printers/" + printer.getPrinterName() );
+ cups = new Cups(u);
+ cups.setUser(GLPvars.cupsUser);
+ cups.setPasswd(GLPvars.cupsPasswd);
+
+ job = cups.cupsPrintFile(filename,attrs);
+ return(job);
+ }
+ catch (IOException e)
+ {
+ return(null);
+ }
+ }
+
+
+
+
+ private void fillOptionValues()
+ {
+ IPPAttribute a;
+ int i, n;
+
+ //
+ // Job sheets ....
+ //
+ jobSheetsNames = printer.getJobSheetsSupported();
+ if (printer.getJobSheetsDefault() != "none")
+ {
+ for (i=0; i < jobSheetsNames.length; i++)
+ if (jobSheetsNames[i] == printer.getJobSheetsDefault())
+ selectedJobSheets = i;
+ }
+
+ //
+ // Orientation ....
+ //
+ orientationNames = new String[printer.getOrientationSupported().length];
+ orientationValues = printer.getOrientationSupported();
+ for (i=0; i < printer.getOrientationSupported().length; i++)
+ {
+ if (orientationValues[i] == printer.getOrientationDefault())
+ selectedOrientation = i;
+ switch( orientationValues[i] )
+ {
+ case IPPDefs.PORTRAIT:
+ orientationNames[i] = "Portrait";
+ break;
+ case IPPDefs.LANDSCAPE:
+ orientationNames[i] = "Landscape";
+ break;
+ case IPPDefs.REVERSE_LANDSCAPE:
+ orientationNames[i] = "Reverse Landscape";
+ break;
+ case IPPDefs.REVERSE_PORTRAIT:
+ orientationNames[i] = "Reverse Portrait";
+ break;
+ }
+ }
+
+ if (printer.getLowerCopiesSupported() ==
+ printer.getUpperCopiesSupported())
+ {
+ numCopiesOption = printer.getCopiesDefault();
+ }
+ else
+ {
+ numCopiesOption = printer.getLowerCopiesSupported();
+ numLowerCopiesOption = printer.getLowerCopiesSupported();
+ numUpperCopiesOption = printer.getUpperCopiesSupported();
+ }
+ }
+
+
+ private IPPAttribute[] buildPrintAttributes()
+ {
+ IPPAttribute a;
+ IPPAttribute[] attrs;
+ int num_attrs = 0;
+
+ if (orientationOption >= 0)
+ num_attrs++;
+ if (jobSheetsOption.length() > 0)
+ num_attrs++;
+ if (numCopiesOption > 1)
+ num_attrs++;
+ if ((pageLowerOption > 0) && (pageUpperOption > 0) && (!pagePrintAll))
+ num_attrs++;
+
+ if (num_attrs > 0)
+ attrs = new IPPAttribute[num_attrs];
+ else
+ return(null);
+
+ int i = 0;
+ if (jobSheetsOption.length() > 0)
+ {
+ attrs[i] = new IPPAttribute( IPPDefs.TAG_JOB,
+ IPPDefs.TAG_NAME,
+ "job-sheets" );
+ attrs[i].addString( "", jobSheetsOption );
+ i++;
+ }
+ if (orientationOption >= IPPDefs.PORTRAIT)
+ {
+ attrs[i] = new IPPAttribute( IPPDefs.TAG_JOB,
+ IPPDefs.TAG_ENUM,
+ "orientation-requested" );
+ attrs[i].addEnum( orientationOption );
+ i++;
+ }
+ if (numCopiesOption > 1)
+ {
+ attrs[i] = new IPPAttribute( IPPDefs.TAG_JOB,
+ IPPDefs.TAG_INTEGER,
+ "copies" );
+ attrs[i].addInteger( numCopiesOption );
+ i++;
+ }
+ if ((pageLowerOption > 0) && (pageUpperOption > 0) && (!pagePrintAll))
+ {
+ attrs[i] = new IPPAttribute( IPPDefs.TAG_JOB,
+ IPPDefs.TAG_RANGE,
+ "page-ranges" );
+ attrs[i].addRange( pageLowerOption, pageUpperOption );
+ i++;
+ }
+ return(attrs);
+ }
+
+
+
+ // Implementation of ActionListener interface.
+ public void actionPerformed(ActionEvent e)
+ {
+ Object source = e.getSource();
+
+ //
+ // Name typed in
+ //
+ if (source == printAllCheckBox)
+ {
+ JCheckBox cb = (JCheckBox)source;
+ pagePrintAll = cb.isSelected();
+ pageLowerField.setEnabled(!pagePrintAll);
+ pageUpperField.setEnabled(!pagePrintAll);
+ }
+ else if (source == pageLowerField)
+ {
+ String s = pageLowerField.getText();
+ if (s.length() > 1)
+ {
+ pageLowerOption = new Integer(s).intValue();
+ // if (pageLowerOption > 0)
+ // printAllCheckBox.setChecked(false);
+ }
+ }
+ else if (source == pageUpperField)
+ {
+ String s = pageUpperField.getText();
+ if (s.length() > 1)
+ {
+ pageUpperOption = new Integer(s).intValue();
+ // if (pageUpperOption > 0)
+ // printAllCheckBox.setChecked(false);
+ }
+ }
+ else if (source == orientationBox)
+ {
+ JComboBox cb = (JComboBox)source;
+ selectedOrientation = cb.getSelectedIndex();
+ orientationOption = orientationValues[selectedOrientation];
+ }
+ else if (source == jobSheetsBox)
+ {
+ JComboBox cb = (JComboBox)source;
+ selectedJobSheets = cb.getSelectedIndex();
+ jobSheetsOption = jobSheetsNames[selectedJobSheets];
+ }
+ else if (source == numCopiesField)
+ {
+ String s = numCopiesField.getText();
+ if (s.length() >= 1)
+ {
+ numCopiesOption = new Integer(s).intValue();
+ }
+ }
+ else if (source == fileTextField)
+ {
+ String s = fileTextField.getText();
+ if (s.length() > 1)
+ {
+ fileName = s;
+ }
+ }
+ else if (source == printButton)
+ {
+ if (fileName.length() > 1)
+ {
+ job = printFile( fileName );
+ if (job != null)
+ {
+ fileName = "";
+ fileTextField.setText("");
+ JOptionPane.showMessageDialog(mainPanel,
+ "Job " + printer.getPrinterName() + "-" +
+ new Integer(job.job_id).toString() +
+ " queued.");
+ }
+ }
+ }
+ }
+
+
+
+
+
+ public class MyTextListener implements FocusListener
+ {
+
+ public void focusGained(FocusEvent e)
+ {
+ }
+
+ public void focusLost(FocusEvent e)
+ {
+ JTextField txtField = (JTextField)e.getSource();
+ if (txtField == numCopiesField)
+ {
+ String s = numCopiesField.getText();
+ if (s.length() >= 1)
+ {
+ numCopiesOption = new Integer(s).intValue();
+ }
+ }
+ else if (txtField == pageLowerField)
+ {
+ String s = pageLowerField.getText();
+ if (s.length() >= 1)
+ {
+ pageLowerOption = new Integer(s).intValue();
+ }
+ }
+ else if (txtField == pageUpperField)
+ {
+ String s = pageUpperField.getText();
+ if (s.length() >= 1)
+ {
+ pageUpperOption = new Integer(s).intValue();
+ }
+ }
+ }
+ }
+
+}