|
TarTool example source code file (ArchiveTreePanel.java)
The TarTool ArchiveTreePanel.java source code/* ** This code has been placed into the Public Domain. ** This code was written by Timothy Gerard Endres in 1999. ** */ package com.ice.tartool; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import java.util.zip.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; import javax.swing.tree.*; import javax.activation.*; import com.ice.tar.*; import com.ice.util.AWTUtilities; import com.ice.util.MenuProperties; public class ArchiveTreePanel extends JPanel implements TreeSelectionListener, ActionListener { protected String fileDlgDir = null; protected File archiveFile = null; protected JTree tree = null; protected ArchiveTreeModel model = null; protected JScrollPane treeScroller = null; protected Vector actListeners = new Vector(); protected ActionEvent actEvent = null; protected JPopupMenu treePopup = null; public ArchiveTreePanel() { this.setLayout( new BorderLayout() ); this.setBorder( new EmptyBorder( 5, 5, 5, 5 ) ); this.model = new ArchiveTreeModel ( new ArchiveTreeNode ( "<No Archive>", new TarEntry( "./" ) ) ); this.tree = new JTree( this.model ); this.tree.addTreeSelectionListener( this ); this.tree.setShowsRootHandles( true ); this.tree.setRootVisible( true ); this.treePopup = MenuProperties.loadPopupMenu( "treePopup", this ); this.tree.addMouseListener ( this.new TreeMouseAdapter( this.tree, this.tree, this.treePopup ) ); this.treeScroller = new JScrollPane( this.tree ); this.add( treeScroller ); } private TarInputStream openTarInputStream( File archiveFile ) throws IOException { String path = archiveFile.getPath(); // First, read four magic bytes. This is enough to decide if we // have a GZIP or ZIP archive. If so, we will wrap the input stream... InputStream in = new FileInputStream( archiveFile ); byte[] magic = new byte[4]; int numRead = in.read( magic ); in.close(); if ( numRead < magic.length ) throw new IOException ( "unexpected end of file reading " + magic.length + " 'magic' bytes" ); // UNDONE // Can we recognize and handle other compression formats? // if ( magic[0] == (byte)0x1F && magic[1] == (byte)0x8B ) { // This is a GZIP archive. // // Reopen the archive as a GZIPInputStream. // in = new GZIPInputStream ( new FileInputStream( archiveFile ) ); } else if ( magic[0] == (byte)'P' && magic[1] == (byte)'K' && magic[2] == (byte)0x03 && magic[3] == (byte)0x04 ) { // This is a ZIP archive. // // Reopen the archive as a ZIPInputStream, and // position to the first entry. We only handle // the case where the tar archive is the first // entry in the ZIP archive. // ZipInputStream zin = new ZipInputStream ( new FileInputStream( archiveFile ) ); // REVIEW // UNDONE // Could/should we use this ZipEntry to set the name // displayed for the root entry of the tree? // ZipEntry zipEnt = zin.getNextEntry(); in = zin; } else { // We do not know what this is! // // So, we will assume it is a simple tar archive // and reopen the file as a FileInputStream. // in = new FileInputStream( archiveFile ); } return new TarInputStream( in ); } ArchiveTreeNode getRootNode() { return ( this.model == null ? null : (ArchiveTreeNode)this.model.getRoot() ); } public void closeArchive() throws IOException { this.model = new ArchiveTreeModel ( new ArchiveTreeNode ( "<No Archive>", new TarEntry( "./" ) ) ); this.tree.setModel( this.model ); this.repaint( 250 ); } public void openArchive( File archiveFile ) throws IOException { this.archiveFile = archiveFile; TarInputStream tarIn = this.openTarInputStream( archiveFile ); ArchiveTreeNode root = new ArchiveTreeNode ( archiveFile.getName(), new TarEntry( archiveFile.getName() + "/" ) ); try { TarEntry entry = tarIn.getNextEntry(); for ( ; entry != null ; ) { root.addPath( entry ); entry = tarIn.getNextEntry(); // if ( this.progressDisplay != null ) // this.progressDisplay.showTarProgressMessage // ( entry.getName() ); } } catch ( InvalidHeaderException ex ) { String title = "Invalid Archive"; String msg = "The file does not contain a valid tar archive.\n" + "The reported problem was:\n\n" + ex.getMessage(); JOptionPane.showMessageDialog ( this, msg, title, JOptionPane.WARNING_MESSAGE ); } tarIn.close(); root.computeArchiveTotals(); this.model = new ArchiveTreeModel( root ); this.tree.setModel( this.model ); this.tree.expandRow( 0 ); this.repaint( 250 ); } private Frame findFrame() { Frame result = null; Container par = this; for ( ; ; ) { par = par.getParent(); if ( par == null ) break; if ( par instanceof Frame ) { result = (Frame) par; break; } } return result; } private void extractFile( TarEntry entry, File destFile, boolean dirExtract, boolean ascii, boolean mimed ) throws IOException { FileOutputStream out = null; TarInputStream tarIn = null; try { tarIn = this.openTarInputStream( this.archiveFile ); for ( ; ; ) { TarEntry e = tarIn.getNextEntry(); if ( e == null ) break; boolean doIt = false; if ( dirExtract ) { if ( e.equals( entry ) ) doIt = false; else doIt = e.getName().startsWith( entry.getName() ); if ( doIt ) { String subPath = e.getName().substring( entry.getName().length() ); if ( subPath.length() > 0 ) { if ( e.isDirectory() ) { File subDir = new File( destFile, subPath ); subDir.mkdirs(); doIt = false; } else { File oFile = new File( destFile, subPath ); out = new FileOutputStream( oFile ); } } } } else { doIt = e.equals( entry ); if ( doIt ) { out = new FileOutputStream( destFile ); } } if ( mimed && doIt ) { ascii = false; String contentType = FileTypeMap.getDefaultFileTypeMap().getContentType ( dirExtract ? e.getName() : destFile.getName() ); try { MimeType mime = new MimeType( contentType ); if ( mime.getPrimaryType().equalsIgnoreCase( "text" ) ) ascii = true; } catch ( MimeTypeParseException ex ) { } } if ( doIt ) { byte[] buf = new byte[ 32 * 1024 ]; byte[] lineSep = System.getProperty( "line.separator", "\n" ).getBytes(); for ( ; ; ) { int numRead = tarIn.read( buf ); if ( numRead == -1 ) break; if ( ascii ) { int beg = 0; int off = 0; for ( ; off < numRead ; ) { if ( buf[off] == 10 ) { if ( (off - 1) > beg ) { out.write( buf, beg, ((off - 1) - beg ) ); } out.write( lineSep ); beg = ++off; } else { ++off; } } if ( off > beg ) { out.write( buf, beg, ( off - beg ) ); } } else { out.write( buf, 0, numRead ); } } if ( out != null ) { out.close(); out = null; } if ( ! dirExtract ) break; } } } finally { if ( out != null ) out.close(); if ( tarIn != null ) tarIn.close(); } } public void actionPerformed( ActionEvent event ) { String command = event.getActionCommand(); if ( command.startsWith( "EXTRACT" ) ) { boolean mimed = command.equals( "EXTRACT_MIME" ); boolean ascii = command.equals( "EXTRACT_ASCII" ); ArchiveTreeNode node = (ArchiveTreeNode) tree.getLastSelectedPathComponent(); if ( node != null ) { TarEntry entry = node.getEntry(); FileDialog fdlg = new FileDialog ( this.findFrame(), "Extract Into", FileDialog.SAVE ); String fName = node.getName(); if ( fName.endsWith( ".tar" ) ) fName = fName.substring( 0, fName.length() - 4 ); if ( fName.endsWith( ".tgz" ) ) fName = fName.substring( 0, fName.length() - 4 ); if ( fName.endsWith( ".tar.gz" ) ) fName = fName.substring( 0, fName.length() - 7 ); fdlg.setFile( fName ); if ( this.fileDlgDir != null ) fdlg.setDirectory( this.fileDlgDir ); fdlg.show(); String fStr = fdlg.getFile(); this.fileDlgDir = fdlg.getDirectory(); if ( fStr != null && this.fileDlgDir != null ) { boolean proceed = true; if ( entry.isDirectory() ) { File dirF = new File( this.fileDlgDir ); File destDir = new File( dirF, fStr ); if ( ! destDir.exists() ) { destDir.mkdirs(); } if ( proceed ) { try { this.extractFile ( entry, destDir, true, ascii, mimed ); } catch ( IOException ex ) { ex.printStackTrace(); } } } else { File dirF = new File( this.fileDlgDir ); File destFile = new File( dirF, fStr ); if ( destFile.exists() ) { if ( destFile.isDirectory() ) { } else { } } if ( proceed ) { try { this.extractFile ( entry, destFile, false, ascii, mimed ); } catch ( IOException ex ) { ex.printStackTrace(); } } } } } } } public void addActionListener( ActionListener l ) { this.actListeners.addElement( l ); } public void removeActionListener( ActionListener l ) { this.actListeners.removeElement( l ); } private void performAction( ActionEvent event ) { Enumeration enum = this.actListeners.elements(); for ( ; enum.hasMoreElements() ; ) { ((ActionListener) enum.nextElement()).actionPerformed( event ); } } public void valueChanged( TreeSelectionEvent event ) { Object source = tree.getLastSelectedPathComponent(); if ( source != null ) this.performAction ( new ActionEvent ( source, ActionEvent.ACTION_PERFORMED, "NODE_SELECTED" ) ); } public String treePath( TreePath treePath ) { ArchiveTreeNode node; Object[] list = treePath.getPath(); StringBuffer path = new StringBuffer(); for ( int i = 1 ; i < list.length ; i++ ) { node = (ArchiveTreeNode) list[i]; if ( i > 1 ) path.append("/"); path.append( node.getName() ); } return path.toString(); } private class TreeMouseAdapter extends MouseAdapter { private JTree tree; private JPopupMenu popupMenu; private JComponent popupParent; private boolean isPopupClick = false; public TreeMouseAdapter( JComponent parent, JTree tree, JPopupMenu menu ) { super(); this.tree = tree; this.popupMenu = menu; this.popupParent = parent; } public void mousePressed( MouseEvent event ) { this.isPopupClick = false; if ( event.isPopupTrigger() ) { int selRow = this.tree.getRowForLocation ( event.getX(), event.getY() ); if ( selRow != -1 ) { this.tree.setSelectionRow( selRow ); } this.isPopupClick = true; this.popupMenu.show ( this.popupParent, event.getX(), event.getY() ); } } public void mouseReleased( MouseEvent event ) { if ( this.isPopupClick ) return; if ( event.isPopupTrigger() ) { int selRow = this.tree.getRowForLocation ( event.getX(), event.getY() ); if ( selRow != -1 ) { this.tree.setSelectionRow( selRow ); } this.isPopupClick = true; this.popupMenu.show ( this.popupParent, event.getX(), event.getY() ); } } public void mouseClicked( MouseEvent event ) { if ( this.isPopupClick ) { this.isPopupClick = false; return; } if ( event.getClickCount() == 2 ) { this.processDoubleClick(); } } private void processDoubleClick() { } } } Other TarTool examples (source code examples)Here is a short list of links related to this TarTool ArchiveTreePanel.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.