/**
* Created : Mar 23, 2012
*
* @author pquiring
*/
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javaforce.*;
public class BurnDialog extends javax.swing.JDialog {
/**
* Creates new form BurnDialog
*/
public BurnDialog(java.awt.Frame parent, boolean modal, String tracks[]) {
super(parent, modal);
initComponents();
this.tracks = tracks;
listDevices();
if (devs.size() == 0) {
JF.showError("Error", "No Compatible Burner found!");
burn.setEnabled(false);
}
setPosition();
}
/**
* 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();
target = new javax.swing.JComboBox();
burn = new javax.swing.JButton();
cancel = new javax.swing.JButton();
test = new javax.swing.JCheckBox();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Burn Disc");
jLabel1.setText("Target Device:");
burn.setText("Burn");
burn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
burnActionPerformed(evt);
}
});
cancel.setText("Cancel");
cancel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelActionPerformed(evt);
}
});
test.setText("Test Only");
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(layout.createSequentialGroup()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(target, 0, 287, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(test)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(cancel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(burn)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(target, 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)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(burn)
.addComponent(cancel)
.addComponent(test))
.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 burnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_burnActionPerformed
int idx = target.getSelectedIndex();
if (idx == -1) return;
String dev = devs.get(idx);
//must unmount dev
try {
Runtime.getRuntime().exec(new String[] {"umount", dev});
} catch (Exception e) {}
JF.sleep(1000); //wait 1 sec
String cmd[] = {"wodim", "dev=" + dev, "-v"};
if (test.isSelected()) {
cmd = Arrays.copyOf(cmd, cmd.length+1);
cmd[cmd.length-1] = "-dummy";
}
int cmdidx = cmd.length;
cmd = Arrays.copyOf(cmd, cmd.length + tracks.length);
System.arraycopy(tracks, 0, cmd, cmdidx, tracks.length);
JDialog dialog = new BurnProgressDialog(BurnApp.This, true, cmd);
this.setVisible(false);
dialog.setVisible(true);
dispose();
}//GEN-LAST:event_burnActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton burn;
private javax.swing.JButton cancel;
private javax.swing.JLabel jLabel1;
private javax.swing.JComboBox target;
private javax.swing.JCheckBox test;
// End of variables declaration//GEN-END:variables
private String tracks[];
private ArrayList<String> devs = new ArrayList<String>();
/* - sample output
wodim: Overview of accessible drives (1 found) :
-------------------------------------------------------------------------
0 dev='/dev/sg1' rwrw-- : 'HL-DT-ST' 'DVDRAM GSA-4120B'
-------------------------------------------------------------------------
*/
private void listDevices() {
//exec : wodim --devices
ShellProcess sp = new ShellProcess();
String cmd[] = {"wodim", "--devices"};
String output = sp.run(cmd, true);
target.removeAllItems();
devs.clear();
if (output == null) return;
String lns[] = output.split("\n");
boolean start = false;
for(int a=0;a<lns.length;a++) {
if (start) {
if (lns[a].startsWith("---")) return;
int i1 = lns[a].indexOf("dev");
int i2 = lns[a].indexOf("\t", i1+5);
int i3 = lns[a].indexOf(":");
String dev = lns[a].substring(i1+5, i2-1);
String name = lns[a].substring(i3+1);
devs.add(dev);
target.addItem(name);
} else {
if (lns[a].startsWith("---")) start = true;
}
}
}
private void setPosition() {
Rectangle s = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
Dimension d = getPreferredSize();
setLocation(s.width/2 - d.width/2, s.height/2 - (d.height/2));
}
}