/**
*
* @author pquiring
*/
import java.util.*;
import javax.swing.table.*;
import jfparted.*;
import javaforce.*;
public class GuidedPartitioning extends IPanel {
/**
* Creates new form GuidedPartitioning
*/
public GuidedPartitioning() {
initComponents();
calcDevicePartitioning();
showDeviceImage();
showPartitionTable();
status.setText("Review proposed partitioning and continue.");
}
/**
* 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() {
image = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
table = new javax.swing.JTable();
status = new javax.swing.JTextField();
image.setPreferredSize(new java.awt.Dimension(256, 32));
image.setLayout(new java.awt.GridLayout());
table.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"Device", "Type", "Mount", "Size"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
};
boolean[] canEdit = new boolean [] {
false, false, false, false
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
jScrollPane1.setViewportView(table);
status.setEditable(false);
status.setText("status");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
.addComponent(status))
.addContainerGap())
.addComponent(image, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(image, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(status, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel image;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField status;
private javax.swing.JTable table;
// End of variables declaration//GEN-END:variables
public Data.Device device;
public boolean error = false;
public void calcDevicePartitioning() {
Data.getPartitions();
device = Data.getDevice(Data.guidedTarget.dev).clone();
Data.ops1 = new ArrayList<String>(); //removes
Data.ops2 = new ArrayList<String>(); //adds
Data.ops1.add("select " + device.dev + "\n");
if (Data.installType == Data.installTypes.ALL) {
//delete ALL partitions
for(int a=0;a<device.parts.size();a++) {
Data.Partition part = device.parts.get(a);
if (part.number == -1) continue;
if (part.type.equals("logical")) continue; //deleting the extended part will do this one already
Data.ops1.add("rm " + part.number + "\n");
part.delete = true;
}
Data.deletePartitions(device);
} else {
//delete Linux partitions
boolean hasLogical = false; //has logical partitions that will NOT be deleted
Data.Partition ext = null;
for(int a=0;a<device.parts.size();a++) {
Data.Partition part = device.parts.get(a);
if (part.number == -1) continue;
String filesys = part.filesys;
boolean ok = false;
if (filesys.equals("ext2")) ok = true;
if (filesys.equals("ext3")) ok = true;
if (filesys.equals("ext4")) ok = true;
if (filesys.equals("swap")) ok = true;
if (!ok) {
if (part.type.equals("logical")) hasLogical = true;
if (part.type.equals("extended")) ext = part;
continue;
}
Data.ops1.add("rm " + part.number + "\n");
part.delete = true;
}
if (ext != null && !hasLogical) {
Data.ops1.add("rm " + ext.number + "\n");
ext.delete = true;
}
Data.deletePartitions(device);
}
Data.ops1.add("quit\n");
//calc smallest block for 4GB swap area (near end of device if possible)
Data.swap = Data.findPartition(device, "4GB", "swap");
if (Data.swap == null) {
error = true;
JF.showError("Error", "Unable to find space for a swap partition.\nPlease use Custom Partitioning.");
return;
}
Data.swap.mount = "swap";
Data.ops2.add("select " + device.dev + "\n");
Data.ops2.add("mkpart primary linux-swap(v1) " + Data.swap.start + " " + Data.swap.end + "\n");
//calc largest block for "/" file system (near start of device if possible)
Data.root = Data.findPartition(device, null, "ext4");
if (Data.root == null) {
error = true;
JF.showError("Error", "Unable to find space for the root partition.\nPlease use Custom Partitioning.");
return;
}
Data.root.mount = "/";
Data.ops2.add("mkpart primary ext4 " + Data.root.start + " " + Data.root.end + "\n");
Data.ops2.add("quit\n");
//generate fstab records
Data.clearfstab();
Data.addfstab(Data.root.device.dev + Data.root.number, Data.root.mount, Data.root.filesys,
"errors=remount-ro", 0, 1);
Data.addfstab(Data.swap.device.dev + Data.swap.number, Data.swap.mount, Data.swap.filesys,
"sw", 0, 0);
}
public void showDeviceImage() {
image.add(new DeviceImage(device));
image.revalidate();
image.repaint();
}
public void showPartitionTable() {
DefaultTableModel tableModel = (DefaultTableModel)table.getModel();
while (tableModel.getRowCount() > 0) tableModel.removeRow(0);
tableModel.addRow(new Object[] {device.dev,"","",device.size});
for(int p=0;p<device.parts.size();p++) {
Data.Partition part = device.parts.get(p);
tableModel.addRow(
new Object[] {(part.number == -1) ? "" : part.device.dev + part.number,
part.filesys,part.mount,part.size});
}
}
public IPanel next() {
ShellProcess sp;
ArrayList<String> cmd;
String output;
if ((Data.swap == null) || (Data.root == null) || error) {
JF.showError("Error", "An error occured, please go back and try again.");
return null;
}
return new Install();
}
public IPanel prev() {
if (Data.getDeviceCount() > 1) {
return new GuidedPartSelectDevice();
}
return new InstallTypes();
}
public IPanel getThis() {return this;}
}