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;
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();
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);
}
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();
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);
}
public JPanel buildFilePanel()
{
JPanel localPanel = new JPanel();
final JFileChooser fc = new JFileChooser();
localPanel.setBackground(GLPcolors.backgroundColor);
localPanel.setLayout(new BorderLayout());
fileTextField = new JTextField(50);
fileTextField.addActionListener(this);
JLabel fileFieldLabel = new JLabel(" File to print: ");
fileFieldLabel.setForeground(GLPcolors.foregroundColor);
localPanel.add( fileFieldLabel, BorderLayout.WEST );
localPanel.add( fileTextField, BorderLayout.CENTER );
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());
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();
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;
jobSheetsNames = printer.getJobSheetsSupported();
if (printer.getJobSheetsDefault() != "none")
{
for (i=0; i < jobSheetsNames.length; i++)
if (jobSheetsNames[i] == printer.getJobSheetsDefault())
selectedJobSheets = i;
}
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);
}
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
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();
}
}
else if (source == pageUpperField)
{
String s = pageUpperField.getText();
if (s.length() > 1)
{
pageUpperOption = new Integer(s).intValue();
}
}
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();
}
}
}
}
}