package jfconfig;
/**
* Created : May 17, 2012
*
* @author pquiring
*/
import java.awt.*;
import java.util.*;
import javaforce.*;
public class PrintersAddDialog extends javax.swing.JDialog {
/**
* Creates new form PrintersAddDialog
*/
public PrintersAddDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
setPosition();
listMakes();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
scanLocal = new javax.swing.JButton();
localPrinters = new javax.swing.JComboBox();
addLocal = new javax.swing.JButton();
jLabel4 = new javax.swing.JLabel();
ipAddr = new javax.swing.JTextField();
addIP = new javax.swing.JButton();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
server = new javax.swing.JTextField();
share = new javax.swing.JTextField();
addShare = new javax.swing.JButton();
cancel = new javax.swing.JButton();
jLabel7 = new javax.swing.JLabel();
make = new javax.swing.JComboBox();
jLabel8 = new javax.swing.JLabel();
model = new javax.swing.JComboBox();
jLabel9 = new javax.swing.JLabel();
jLabel10 = new javax.swing.JLabel();
pass = new javax.swing.JPasswordField();
user = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
jLabel1.setText("Add Local Printer");
jLabel2.setText("Add IP Printer");
jLabel3.setText("Add Shared Printer");
scanLocal.setText("Scan");
scanLocal.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
scanLocalActionPerformed(evt);
}
});
addLocal.setText("Add");
addLocal.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addLocalActionPerformed(evt);
}
});
jLabel4.setText("IP Address");
addIP.setText("Add");
addIP.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addIPActionPerformed(evt);
}
});
jLabel5.setText("Server");
jLabel6.setText("Share");
addShare.setText("Add");
addShare.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addShareActionPerformed(evt);
}
});
cancel.setText("Cancel");
cancel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelActionPerformed(evt);
}
});
jLabel7.setText("Make");
make.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Auto" }));
make.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
makeItemStateChanged(evt);
}
});
jLabel8.setText("Model");
model.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Auto" }));
jLabel9.setText("User");
jLabel10.setText("Password");
user.setText("guest");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(cancel))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel1)
.addComponent(jLabel2)
.addComponent(jLabel3))
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel7)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(make, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel8)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(model, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
.addGap(12, 12, 12)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(scanLocal)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(localPrinters, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ipAddr))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel10)
.addComponent(jLabel9)
.addComponent(jLabel6)
.addComponent(jLabel5))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(server)
.addComponent(share)
.addComponent(pass)
.addComponent(user, javax.swing.GroupLayout.DEFAULT_SIZE, 215, Short.MAX_VALUE))))))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(addLocal)
.addComponent(addIP))
.addComponent(addShare, javax.swing.GroupLayout.Alignment.TRAILING))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(scanLocal)
.addComponent(localPrinters, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(addLocal))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel4)
.addComponent(ipAddr, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(addIP))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jLabel3)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel5)
.addComponent(server, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel6)
.addComponent(share, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel9)
.addComponent(user, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel10)
.addComponent(pass, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(addShare))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel7)
.addComponent(make, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel8)
.addComponent(model, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(cancel)
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed
dispose();
}//GEN-LAST:event_cancelActionPerformed
private void scanLocalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_scanLocalActionPerformed
scan();
}//GEN-LAST:event_scanLocalActionPerformed
private void addLocalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addLocalActionPerformed
addLocalPrinter();
}//GEN-LAST:event_addLocalActionPerformed
private void addIPActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addIPActionPerformed
addIPPrinter();
}//GEN-LAST:event_addIPActionPerformed
private void makeItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_makeItemStateChanged
listModels();
}//GEN-LAST:event_makeItemStateChanged
private void addShareActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addShareActionPerformed
addSharedPrinter();
}//GEN-LAST:event_addShareActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addIP;
private javax.swing.JButton addLocal;
private javax.swing.JButton addShare;
private javax.swing.JButton cancel;
private javax.swing.JTextField ipAddr;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JComboBox localPrinters;
private javax.swing.JComboBox make;
private javax.swing.JComboBox model;
private javax.swing.JPasswordField pass;
private javax.swing.JButton scanLocal;
private javax.swing.JTextField server;
private javax.swing.JTextField share;
private javax.swing.JTextField user;
// End of variables declaration//GEN-END:variables
private String mm[]; //almost 14,000 lines
private ArrayList<String> ppdList = new ArrayList<String>();
private void listMakes() {
JFTask task = new JFTask() {
public boolean work() {
this.setLabel("Building drivers list...");
this.setProgress(-1);
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"lpinfo", "-m"}, false);
mm = output.split("\n");
String lastMake = "";
for(int a=0;a<mm.length;a++) {
String f[] = mm[a].split(" "); //ppd Make Model ...
if (!f[1].equalsIgnoreCase(lastMake)) {
lastMake = f[1];
make.addItem(lastMake);
}
}
return true;
}
};
ProgressDialog dialog = new ProgressDialog(null, true, task);
dialog.setAutoClose(true);
dialog.setVisible(true);
}
private void listModels() {
model.removeAllItems();
ppdList.clear();
String currentMake = (String)make.getSelectedItem();
if (currentMake.equals("Auto")) {
model.addItem("Auto");
return;
}
for(int a=0;a<mm.length;a++) {
String f[] = mm[a].split(" "); //ppd Make Model ...
if (f[0].indexOf("ppds:1") != -1) continue; //repeat ???
if (f[1].equalsIgnoreCase(currentMake)) {
String pm = f[2];
for(int b=3;b<f.length;b++) {
if (f[b].equals("-")) break;
if (f[b].startsWith("Foomatic/")) break;
pm += " " + f[b];
}
model.addItem(pm);
ppdList.add(f[0]);
}
}
}
private void scan() {
localPrinters.removeAllItems();
JFTask task = new JFTask() {
public boolean work() {
setProgress(-1);
setLabel("Scanning for local printers...");
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"lpinfo", "-v"}, false);
String lns[] = output.split("\n");
for(int a=0;a<lns.length;a++) {
if (lns[a].indexOf(":") == -1) continue;
int idx = lns[a].indexOf(" ");
localPrinters.addItem(lns[a].substring(idx+1));
}
return true;
}
};
ProgressDialog dialog = new ProgressDialog(null, true, task);
dialog.setAutoClose(true);
dialog.setVisible(true);
}
private String getPrinterName(String uri) {
String name = "Printer1";
int i1 = uri.indexOf("//");
if (i1 == -1) return name;
i1 += 2;
int i2 = uri.indexOf("/", i1);
if (i2 == -1) return name;
name = uri.substring(i1, i2);
return name;
}
private String getPPD() {
String ppd = ppdList.get(model.getSelectedIndex());
return ppd;
}
private void addLocalPrinter() {
int idx = localPrinters.getSelectedIndex();
if (idx == -1) return;
String uri = (String)localPrinters.getSelectedItem();
String name = JF.getString("Enter Printer Name", getPrinterName(uri));
ShellProcess sp = new ShellProcess();
String output = null;
if (ppdList.isEmpty() || ppdList.get(model.getSelectedIndex()).equals("Auto")) {
output = sp.run(new String[] {"sudo", "lpadmin", "-E", "-p", name, "-v", uri}, false);
} else {
String ppd = getPPD();
output = sp.run(new String[] {"sudo", "lpadmin", "-E", "-p", name, "-v", uri, "-m", ppd}, false);
}
if (sp.getErrorLevel() != 0) {
JFLog.log("cmd=" + sp.command);
JF.showError("Error", "Unable to add printer:\n"+output);
}
dispose();
}
private void addIPPrinter() {
String ip = ipAddr.getText();
if (ip.length() == 0) return;
if (ppdList.isEmpty()) {
JF.showError("Error", "Must specify a printer make/model");
return;
}
String uri = "socket://" + ip;
String name = JF.getString("Enter Printer Name", getPrinterName(""));
ShellProcess sp = new ShellProcess();
String ppd = getPPD();
if (ppd.equals("Auto")) {
JF.showError("Error", "Must specify a printer make/model");
return;
}
String output = sp.run(new String[] {"sudo", "lpadmin", "-E", "-p", name, "-v", uri, "-m", ppd}, false);
if (sp.getErrorLevel() != 0) {
JFLog.log("cmd=" + sp.command);
JF.showError("Error", "Unable to add printer:\n"+output);
}
dispose();
}
private void addSharedPrinter() {
String ip = ipAddr.getText();
if (ip.length() == 0) return;
if (ppdList.isEmpty()) {
JF.showError("Error", "Must specify a printer make/model");
return;
}
String uri = "smb://" + user.getText();
String password = new String(pass.getPassword());
if (password.length() > 0) uri += ":" + password;
uri += "@" + server.getText() + "/" + share.getText();
String name = JF.getString("Enter Printer Name", getPrinterName(""));
ShellProcess sp = new ShellProcess();
String ppd = getPPD();
if (ppd.equals("Auto")) {
JF.showError("Error", "Must specify a printer make/model");
return;
}
String output = sp.run(new String[] {"sudo", "lpadmin", "-E", "-p", name, "-v", uri, "-m", ppd}, false);
if (sp.getErrorLevel() != 0) {
JFLog.log("cmd=" + sp.command);
JF.showError("Error", "Unable to add printer:\n"+output);
}
dispose();
}
private void setPosition() {
Rectangle s = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
Dimension d = getSize();
setLocation(s.width/2 - d.width/2, s.height/2 - (d.height/2));
}
}