/*-
* Copyright (C) 2007 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.hfsexplorer;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingConstants;
import org.catacombae.hfsexplorer.fs.ResourceForkReader;
import org.catacombae.hfsexplorer.gui.FileInfoPanel;
import org.catacombae.hfsexplorer.gui.FSEntrySummaryPanel;
import org.catacombae.hfsexplorer.gui.FolderInfoPanel;
import org.catacombae.hfsexplorer.gui.ResourceForkViewPanel;
import org.catacombae.hfsexplorer.gui.StructViewPanel;
import org.catacombae.hfs.types.hfscommon.CommonHFSCatalogFile;
import org.catacombae.hfs.types.hfscommon.CommonHFSCatalogFolder;
import org.catacombae.hfsexplorer.fs.ResourceForkReader.
MalformedResourceForkException;
import org.catacombae.hfsexplorer.gui.HFSExplorerJFrame;
import org.catacombae.io.FileStream;
import org.catacombae.io.ReadableRandomAccessStream;
import org.catacombae.storage.fs.FSEntry;
import org.catacombae.storage.fs.FSFile;
import org.catacombae.storage.fs.FSFork;
import org.catacombae.storage.fs.FSForkType;
import org.catacombae.storage.fs.hfscommon.HFSCommonFSFile;
import org.catacombae.storage.fs.hfscommon.HFSCommonFSFolder;
import org.catacombae.storage.fs.hfscommon.HFSCommonFSLink;
public class FileInfoWindow extends HFSExplorerJFrame {
public FileInfoWindow(final FSEntry fsEntry, String[] parentPath) {
super("Info - " + fsEntry.getName());
JScrollPane summaryPanelScroller = null;
JScrollPane infoPanelScroller = null;
JTabbedPane tabs = new JTabbedPane();
// Summary panel
try {
final FSEntrySummaryPanel summaryPanel = new FSEntrySummaryPanel(this, fsEntry, parentPath);
summaryPanelScroller = new JScrollPane(summaryPanel,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
tabs.addTab("Summary", summaryPanelScroller);
} catch(Exception e) {
GUIUtil.displayExceptionDialog(e, 20, this, "Exception while " +
"creating FSEntrySummaryPanel.");
e.printStackTrace();
}
// Details panel
try {
JPanel infoPanel = null;
if(fsEntry instanceof HFSCommonFSFile || fsEntry instanceof HFSCommonFSLink) {
CommonHFSCatalogFile hfsFile;
if(fsEntry instanceof HFSCommonFSFile)
hfsFile = ((HFSCommonFSFile) fsEntry).getInternalCatalogFile();
else if(fsEntry instanceof HFSCommonFSLink)
hfsFile = ((HFSCommonFSLink) fsEntry).getInternalCatalogFileRecord().getData();
else
throw new RuntimeException();
if(hfsFile instanceof CommonHFSCatalogFile.HFSPlusImplementation) {
FileInfoPanel fip = new FileInfoPanel();
fip.setFields(((CommonHFSCatalogFile.HFSPlusImplementation) hfsFile).getUnderlying());
infoPanel = fip;
}
else {
StructViewPanel svp = new StructViewPanel("File", hfsFile.getStructElements());
infoPanel = svp;
}
}
else if(fsEntry instanceof HFSCommonFSFolder) {
CommonHFSCatalogFolder fld = ((HFSCommonFSFolder) fsEntry).getInternalCatalogFolder();
if(fld instanceof CommonHFSCatalogFolder.HFSPlusImplementation) {
FolderInfoPanel fip = new FolderInfoPanel();
fip.setFields(((CommonHFSCatalogFolder.HFSPlusImplementation) fld).getUnderlying());
infoPanel = fip;
}
else {
StructViewPanel svp = new StructViewPanel("Folder", fld.getStructElements());
infoPanel = svp;
}
}
if(infoPanel != null) {
infoPanelScroller = new JScrollPane(infoPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
tabs.addTab("Detailed", infoPanelScroller);
}
} catch(Exception e) { e.printStackTrace(); }
// Resource fork panel
JPanel resffPanel = null;
try {
if(fsEntry instanceof FSFile) {
FSFile fsFile = (FSFile) fsEntry;
FSFork resourceFork = fsFile.getForkByType(FSForkType.MACOS_RESOURCE);
if(resourceFork != null && resourceFork.getLength() > 0) {
ReadableRandomAccessStream s =
resourceFork.getReadableRandomAccessStream();
ResourceForkReader resffReader = null;
try {
resffReader = new ResourceForkReader(s);
resffPanel = new ResourceForkViewPanel(resffReader);
} finally {
if(resffReader != null) {
resffReader.close();
}
else if(s != null) {
s.close();
}
}
}
}
} catch(MalformedResourceForkException e) {
System.err.println("Malformed resource fork:");
e.printStackTrace(System.err);
resffPanel = new JPanel();
resffPanel.setLayout(new BorderLayout());
resffPanel.add(new JLabel("Invalid resource fork data",
SwingConstants.CENTER), BorderLayout.CENTER);
JButton saveDataButton = new JButton("Save data...");
saveDataButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
final JFileChooser fc = new JFileChooser();
if(fc.showSaveDialog(fc) == JFileChooser.APPROVE_OPTION)
{
final ReadableRandomAccessStream rs =
((FSFile) fsEntry).
getForkByType(FSForkType.MACOS_RESOURCE).
getReadableRandomAccessStream();
final FileStream fs =
new FileStream(fc.getSelectedFile());
IOUtil.streamCopy(rs, fs, 1024*1024);
}
} catch(Throwable t) {
System.err.println("Exception while extracting " +
"resource fork to file:");
t.printStackTrace(System.err);
GUIUtil.displayExceptionDialog(t, 20,
FileInfoWindow.this,
"Exception while extracting resource fork to " +
"file:");
}
}
});
resffPanel.add(saveDataButton, BorderLayout.SOUTH);
} catch(Exception e) {
e.printStackTrace();
GUIUtil.displayExceptionDialog(e, 20, this, "Exception while creating ResourceForkViewPanel.");
}
if(resffPanel != null) {
tabs.addTab("Resource fork", resffPanel);
}
add(tabs, BorderLayout.CENTER);
if(summaryPanelScroller != null)
summaryPanelScroller.getVerticalScrollBar().setUnitIncrement(10);
if(infoPanelScroller != null)
infoPanelScroller.getVerticalScrollBar().setUnitIncrement(10);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
pack();
int width = getSize().width;
int height = getSize().height;
int adjustedHeight = width + width / 2;
if(adjustedHeight < height)
setSize(width, adjustedHeight);
setLocationRelativeTo(null);
}
/*
public void setFields(FSFile file) {
if(file instanceof HFSCommonFSFile) {
CommonHFSCatalogFile hfsFile = ((HFSCommonFSFile) file).getInternalCatalogFile();
if(hfsFile instanceof CommonHFSCatalogFile.HFSPlusImplementation) {
FileInfoPanel infoPanel = new FileInfoPanel();
infoPanel.setFields(((CommonHFSCatalogFile.HFSPlusImplementation)hfsFile).getUnderlying());
infoPanelScroller.setViewportView(infoPanel);
}
else {
StructViewPanel svp = new StructViewPanel("Folder:", hfsFile.getStructElements());
infoPanelScroller.setViewportView(svp);
}
}
else
throw new RuntimeException("FSFolder type " + file.getClass() +
" not yet supported!");
}
* */
/*
public void setFields(HFSPlusCatalogFile vh) {
infoPanel.setFields(vh);
}
* */
// public void setJournalFields(JournalInfoBlock jib) {
// journalInfoPanel.setFields(jib);
// }
}