SWT Jface Eclipse Java

/*******************************************************************************
 * All Right Reserved. Copyright (c) 1998, 2004 Jackwind Li Guojie
 * 
 * Created on Mar 9, 2004 7:07:16 PM by JACK $Id$
 *  
 ******************************************************************************/
import java.io.File;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TreeEvent;
import org.eclipse.swt.events.TreeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class FileBrowserSample {
  Display display = new Display();
  Shell shell = new Shell(display);
  Tree tree;
  File rootDir;
  public FileBrowserSample() {
    Action actionSetRootDir = new Action("Set Root Dir") {
      public void run() {
        DirectoryDialog dialog = new DirectoryDialog(shell);
        String path = dialog.open();
        if (path != null) {
          setRootDir(new File(path));
        }
      }
    };
    ToolBar toolBar = new ToolBar(shell, SWT.FLAT);
    ToolBarManager manager = new ToolBarManager(toolBar);
    manager.add(actionSetRootDir);
    manager.update(true);
    shell.setLayout(new GridLayout());
    tree = new Tree(shell, SWT.BORDER);
    tree.setLayoutData(new GridData(GridData.FILL_BOTH));
    setRootDir(new File("C:/"));
    tree.addTreeListener(new TreeListener() {
      public void treeCollapsed(TreeEvent e) {
      }
      public void treeExpanded(TreeEvent e) {
        TreeItem item = (TreeItem) e.item;
        TreeItem[] children = item.getItems();
        for (int i = 0; i < children.length; i++)
          if (children[i].getData() == null)
            children[i].dispose();
          else // Child files already added to the tree.
            return;
        File[] files = ((File) item.getData()).listFiles();
        for (int i = 0; files != null && i < files.length; i++)
          addFileToTree(item, files[i]);
      }
    });
    tree.addSelectionListener(new SelectionListener() {
      public void widgetSelected(SelectionEvent e) {
      }
      // Gets called when a tree item is double-clicked.
      public void widgetDefaultSelected(SelectionEvent e) {
        TreeItem item = (TreeItem) e.item;
        File file = (File) item.getData();
        if (Program.launch(file.getAbsolutePath())) {
          System.out.println("File has been launched: " + file);
        } else {
          System.out.println("Unable to launch file: " + file);
        }
      }
    });
    final TreeEditor editor = new TreeEditor(tree);
    tree.addListener(SWT.MouseDown, new Listener() {
      public void handleEvent(Event event) {
        // Locate the cell position.
        Point point = new Point(event.x, event.y);
        final TreeItem item = tree.getItem(point);
        if (item == null)
          return;
        
        final Text text = new Text(tree, SWT.NONE);
        text.setText(item.getText());
        text.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_YELLOW));
        editor.horizontalAlignment = SWT.LEFT;
        editor.grabHorizontal = true;
        editor.setEditor(text, item);
        Listener textListener = new Listener() {
          public void handleEvent(final Event e) {
            switch (e.type) {
              case SWT.FocusOut :
                File renamed =
                  renameFile(
                    (File) item.getData(),
                    text.getText());
                if (renamed != null) {
                  item.setText(text.getText());
                  item.setData(renamed);
                }
                text.dispose();
                break;
              case SWT.Traverse :
                switch (e.detail) {
                  case SWT.TRAVERSE_RETURN :
                    renamed =
                      renameFile(
                        (File) item.getData(),
                        text.getText());
                    if (renamed != null) {
                      item.setText(text.getText());
                      item.setData(renamed);
                    }
                    //FALL THROUGH
                  case SWT.TRAVERSE_ESCAPE :
                    text.dispose();
                    e.doit = false;
                }
                break;
            }
          }
        };
        text.addListener(SWT.FocusOut, textListener);
        text.addListener(SWT.Traverse, textListener);
        text.setFocus();
      }
    });
    shell.setSize(400, 260);
    shell.open();
    //textUser.forceFocus();
    // Set up the event loop.
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        // If no more entries in event queue
        display.sleep();
      }
    }
    display.dispose();
  }
  /**
   * Renames a file.
   * 
   * @param file
   * @param newName
   * @return the after after being renamed or null if renaming
   *         fails.
   */
  private File renameFile(File file, String newName) {
    File dest = new File(file.getParentFile(), newName);
    if (file.renameTo(dest)) {
      return dest;
    } else {
      return null;
    }
  }
  /**
   * Sets the root directory to browse from.
   * 
   * @param root
   */
  private void setRootDir(File root) {
    // validates the root first. 
    if( (!root.isDirectory()) || (!root.exists()))
      throw new IllegalArgumentException("Invalid root: " + root);
    
    this.rootDir = root;
    shell.setText("Now browsing: " + root.getAbsolutePath());
    // Remove all the items in the tree.
    if (tree.getItemCount() > 0) {
      TreeItem[] items = tree.getItems();
      for (int i = 0; i < items.length; i++) {
        items[i].dispose();
        // Dispose itself and all of its descendants.
      }
    }
    // Adds files under the root to the tree. 
    File[] files = root.listFiles();
    for(int i=0; files != null && i < files.length; i++)
      addFileToTree(tree, files[i]);
  }
  /**
   * Adds the given file to the tree.
   * 
   * @param parent
   * @param file
   */
  private void addFileToTree(Object parent, File file) {
    TreeItem item = null;
    if (parent instanceof Tree)
      item = new TreeItem((Tree) parent, SWT.NULL);
    else if (parent instanceof TreeItem)
      item = new TreeItem((TreeItem) parent, SWT.NULL);
    else
      throw new IllegalArgumentException(
        "parent should be a tree or a tree item: " + parent);
    item.setText(file.getName());
    item.setImage(getIcon(file));
    item.setData(file);
    if (file.isDirectory()) {
      //      // recursively adds all the children of this file.
      //      File[] files = file.listFiles();
      //      for(int i=0; i      //        buildTree(item, files[i]);
      if (file.list() != null && file.list().length > 0)
        new TreeItem(item, SWT.NULL);
    }
  }
  private ImageRegistry imageRegistry;
  Image iconFolder = new Image(shell.getDisplay(), "rntsoft.gif");
  Image iconFile = new Image(shell.getDisplay(), "rntsoft.gif");
  /**
   * Returns an icon representing the specified file.
   * 
   * @param file
   * @return
   */
  private Image getIcon(File file) {
    if (file.isDirectory())
      return iconFolder;
    int lastDotPos = file.getName().indexOf('.');
    if (lastDotPos == -1)
      return iconFile;
    Image image = getIcon(file.getName().substring(lastDotPos + 1));
    return image == null ? iconFile : image;
  }
  /**
   * Returns the icon for the file type with the specified extension.
   * 
   * @param extension
   * @return
   */
  private Image getIcon(String extension) {
    if (imageRegistry == null)
      imageRegistry = new ImageRegistry();
    Image image = imageRegistry.get(extension);
    if (image != null)
      return image;
    Program program = Program.findProgram(extension);
    ImageData imageData = (program == null ? null : program.getImageData());
    if (imageData != null) {
      image = new Image(shell.getDisplay(), imageData);
      imageRegistry.put(extension, image);
    } else {
      image = iconFile;
    }
    return image;
  }
  public static void main(String[] args) {
    new FileBrowserSample();
  }
}