/*-
* Copyright (C) 2008 Erik Larsson
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.catacombae.jparted.app;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.LinkedList;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import org.catacombae.io.ReadableRandomAccessStream;
import org.catacombae.storage.io.DataLocator;
import org.catacombae.storage.ps.PartitionSystemType;
import org.catacombae.storage.io.RandomAccessFileDataLocator;
import org.catacombae.storage.ps.Partition;
import org.catacombae.storage.ps.PartitionSystemRecognizer;
import org.catacombae.storage.ps.PartitionSystemHandler;
import org.catacombae.storage.ps.PartitionSystemHandlerFactory;
import org.catacombae.storage.ps.apm.types.APMPartition;
/**
* @author <a href="http://www.catacombae.org/" target="_top">Erik Larsson</a>
*/
public class MainController {
private MainWindow mainWindow;
private MainPanel mainPanel;
// Model variables
LinkedList<PartitionSystemHandler> psHandlers =
new LinkedList<PartitionSystemHandler>();
public MainController() {
this.mainPanel = new MainPanel();
this.mainWindow = new MainWindow(this.mainPanel);
mainWindow.setLoadFileItemListener(new LoadFileItemListener());
mainWindow.setLoadPathItemListener(new LoadPathItemListener());
mainWindow.setExitItemListener(new ExitItemListener());
mainWindow.setAboutItemListener(new AboutItemListener());
mainPanel.setPartitionSystemsBoxListener(new PartitionSystemsBoxListener());
mainPanel.setSynchronizeButtonListener(new SynchronizeButtonListener());
mainWindow.setDefaultCloseOperation(MainWindow.EXIT_ON_CLOSE);
}
public JPanel getPanel() {
return mainPanel;
}
public void showMainWindow() {
// Initialize
mainPanel.setPartitionSystemsBoxContents(new LinkedList<String>());
mainPanel.setPartitionSystemsBoxEnabled(false);
mainPanel.setSynchronizeButtonEnabled(false);
mainWindow.setVisible(true);
}
private void exitProgram() {
mainWindow.setVisible(false);
System.exit(0);
}
private void loadPartitionSystem(DataLocator loc) {
LinkedList<PartitionSystemHandler> detectedPartitionSystems =
new LinkedList<PartitionSystemHandler>();
LinkedList<String> detectedPartitionSystemDescriptions = new LinkedList<String>();
for (PartitionSystemType curType : PartitionSystemType.values()) {
if (curType.isTopLevelCapable()) {
PartitionSystemHandlerFactory fac =
curType.createDefaultHandlerFactory();
if (fac != null) {
PartitionSystemRecognizer recognizer =
fac.getRecognizer();
ReadableRandomAccessStream stream = loc.createReadOnlyFile();
long streamLength = -1;
try {
streamLength = stream.length();
} catch (Exception e) {
}
//fac.createDetector(loc);
if (recognizer.detect(stream, 0, streamLength)) {
PartitionSystemHandler handler = fac.createHandler(loc);
detectedPartitionSystems.add(fac.createHandler(loc));
detectedPartitionSystemDescriptions.add(
fac.getInfo().getPartitionSystemName() +
" (" + handler.getPartitionCount() +
" partitions)");
}
}
}
}
if (detectedPartitionSystemDescriptions.size() > 0) {
mainPanel.setPartitionSystemsBoxEnabled(true);
mainPanel.setPartitionSystemsBoxContents(detectedPartitionSystemDescriptions);
} else {
mainPanel.setPartitionSystemsBoxEnabled(false);
}
mainPanel.clearPartitionList();
if (detectedPartitionSystems.size() > 0) {
PartitionSystemHandler handler =
detectedPartitionSystems.getFirst();
Partition[] partitions = handler.getPartitions();
int i = 0;
for (Partition p : partitions) {
String name = "";
if(p instanceof APMPartition)
name = ((APMPartition)p).getPmPartNameAsString();
mainPanel.addPartition("" + ((i++) + 1), p.getType().toString(),
name, "" + p.getStartOffset(),
(p.getStartOffset() + p.getLength()) + "");
}
} else {
JOptionPane.showMessageDialog(mainPanel,
"No partition systems found.", "Info",
JOptionPane.INFORMATION_MESSAGE);
}
}
private class LoadFileItemListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(false);
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
if(fileChooser.showOpenDialog(mainPanel) == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
mainWindow.setCurrentFilename(selectedFile.getPath());
RandomAccessFileDataLocator loc =
new RandomAccessFileDataLocator(selectedFile);
loadPartitionSystem(loc);
}
}
}
private class LoadPathItemListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
String path = JOptionPane.showInputDialog(mainPanel, "Path:",
"Enter path to partition system",
JOptionPane.PLAIN_MESSAGE);
if(path != null) {
File selectedFile = new File(path);
if(!selectedFile.exists())
JOptionPane.showMessageDialog(mainPanel, "Path:\n " +
path + "\ndoes not seem to exist.");
else if(!selectedFile.canRead())
JOptionPane.showMessageDialog(mainPanel, "Can not read:\n" +
" " + path);
else {
mainWindow.setCurrentFilename(selectedFile.getPath());
RandomAccessFileDataLocator loc =
new RandomAccessFileDataLocator(selectedFile);
loadPartitionSystem(loc);
}
}
}
}
private class ExitItemListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
exitProgram();
}
}
private class AboutItemListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
JOptionPane.showMessageDialog(mainPanel, "jParted 0.1", "About",
JOptionPane.INFORMATION_MESSAGE);
}
}
private class PartitionSystemsBoxListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
}
}
private class SynchronizeButtonListener implements ActionListener {
public void actionPerformed(ActionEvent evt) {
}
}
}