All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.huberlin.wbi.cuneiform.taskview.FileBrowser Maven / Gradle / Ivy

The newest version!
package de.huberlin.wbi.cuneiform.taskview;

import java.awt.BorderLayout;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

public class FileBrowser extends JPanel implements TreeSelectionListener {

	private static final long serialVersionUID = 3161764896005980182L;

	private final JTree tree;
	private final DefaultMutableTreeNode top;
	private final DefaultTreeModel treeModel;
	private final JTextArea contentArea;
	private final Path buildPath;
	
	public FileBrowser( Path buildPath ) {
		
		JSplitPane splitPane;
		JScrollPane scrollPane;
		
		if( buildPath == null )
			throw new IllegalArgumentException( "Build path must not be null." );
		
		this.buildPath = buildPath;
		top = new DefaultMutableTreeNode( "[Container]" );
		treeModel = new DefaultTreeModel( top );
		tree = new JTree( treeModel );
		tree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION );
		tree.addTreeSelectionListener( this );
		
		
		setLayout( new BorderLayout() );
		
		contentArea = new JTextArea();
		contentArea.setEditable( false );
		contentArea.setFont( new Font( Font.MONOSPACED, Font.PLAIN, 11 ) );
		
		scrollPane = new JScrollPane( tree );
		scrollPane.setHorizontalScrollBarPolicy( ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );
		
		splitPane = new JSplitPane(
			JSplitPane.HORIZONTAL_SPLIT,
			scrollPane,
			new JScrollPane ( contentArea ) );
		splitPane.setDividerLocation( 300 );
		
		add( splitPane, BorderLayout.CENTER );
	}
	
	public void blank() {
		
		int i;
		
		for( i = top.getChildCount()-1; i >= 0; i-- )
			treeModel.removeNodeFromParent( ( DefaultMutableTreeNode )top.getChildAt( i ) );
		
		
		
		contentArea.setText( null );
	}
	
	public void setInvocId( long invocId ) {

		Path currentPath;
		
		try {
		
			blank();
			currentPath = buildPath.resolve( String.valueOf( invocId ) );
			ls( currentPath, top );
			tree.expandPath( new TreePath( top.getPath() ) );
		}
		catch( IOException e ) {
			e.printStackTrace();
		}
	}
	
	private void ls( Path currentPath, DefaultMutableTreeNode currentNode ) throws IOException {
		
		DefaultMutableTreeNode node;
		
		for( Path path : Files.newDirectoryStream( currentPath ) ) {
			
			node = new FileMutableTreeNode( path );
			treeModel.insertNodeInto(
				node,
				currentNode,
				treeModel.getChildCount( currentNode ) );
			
			if( Files.isDirectory( path ) )
				ls( path, node );
		}
			
	}

	@Override
	public void valueChanged( TreeSelectionEvent e ) {
		
		JTree t;
		DefaultMutableTreeNode node;
		int i;
		StringBuffer buf;
		String line;
		
		t = ( JTree )e.getSource();
		node = ( DefaultMutableTreeNode )t.getLastSelectedPathComponent();
		
		if( node.isLeaf() )
			
			if( node != top ) {
				
			
				try( BufferedReader reader =
					Files.newBufferedReader( ( ( FileMutableTreeNode )node ).getFilePath(), Charset.forName( "UTF-8" ) ) ) {
					
					buf = new StringBuffer();
					for( i = 0; i < 1024; i++ ) {
						
						line = reader.readLine();
						if( line == null )
							break;
						
						buf.append( line ).append( '\n' );
					}
					contentArea.setText( buf.toString() );
				
					return;
				}
				catch( IOException x ) {
					contentArea.setText( "[binary]" );
					return;
				}
			}
		
		contentArea.setText( null );
		
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy