如何将新输入附加到现有JFace TreeViewer

时间:2014-11-16 18:38:32

标签: java eclipse-plugin eclipse-rcp jface

我想模拟java包浏览器视图,将新项目附加到现有资源管理器视图中。我尝试使用setInputrefresh方法,但它为新输入创建TreeView,旧输入消失了。如何将新输入附加到TreeViewer中的现有元素。有没有办法在inputChanged方法中处理这个问题。

代码段:

    public class FileTree extends ApplicationWindow {
    /**
     * FileTree constructor
     */
    public FileTree() {
        super(null);
    }

    /**
     * Runs the application
     */
    public void run() {
        // Don't return from open() until window closes
        setBlockOnOpen(true);

        // Open the main window
        open();

        // Dispose the display
        Display.getCurrent().dispose();
    }

    /**
     * Configures the shell
     * 
     * @param shell
     *            the shell
     */
    protected void configureShell(Shell shell) {
        super.configureShell(shell);

        // Set the title bar text and the size
        shell.setText("File Tree");
        shell.setSize(400, 400);
    }

    /**
     * Creates the main window's contents
     * 
     * @param parent
     *            the main window
     * @return Control
     */
    protected Control createContents(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(new GridLayout(1, false));

        // Add a checkbox to toggle whether the labels preserve case
        Button preserveCase = new Button(composite, SWT.CHECK);
        preserveCase.setText("&Preserve case");

        // Create the tree viewer to display the file tree
        final TreeViewer tv = new TreeViewer(composite);
        tv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
        tv.setContentProvider(new FileTreeContentProvider());
        tv.setLabelProvider(new FileTreeLabelProvider());

        tv.setInput("C:\\Auto"); // pass a non-null that will be ignored

        final Action a = new Action("") {
        };
        final MenuManager mgr = new MenuManager();
        mgr.setRemoveAllWhenShown(true);

        mgr.addMenuListener(new IMenuListener() {

            @Override
            public void menuAboutToShow(IMenuManager manager) {
                IStructuredSelection selection = (IStructuredSelection) tv
                        .getSelection();
                if (!selection.isEmpty()) {
                    try {
                        a.setImageDescriptor(ImageDescriptor
                                .createFromImage(new Image(null,
                                        new FileInputStream(
                                                "icons/action_refresh.gif"))));
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    a.setText("Refresh Action for "
                            + (selection.getFirstElement()).toString());
                    mgr.add(a);
                }
            }
        });
        tv.getControl().setMenu(mgr.createContextMenu(tv.getControl()));

        tv.addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(DoubleClickEvent event) {
                TreeViewer viewer = (TreeViewer) event.getViewer();
                IStructuredSelection thisSelection = (IStructuredSelection) event
                        .getSelection();
                Object selectedNode = thisSelection.getFirstElement();
                System.out.println(selectedNode.toString());
            }
        });

        // When user checks the checkbox, toggle the preserve case attribute
        // of the label provider
        preserveCase.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                boolean preserveCase = ((Button) event.widget).getSelection();
                FileTreeLabelProvider ftlp = (FileTreeLabelProvider) tv
                        .getLabelProvider();
                ftlp.setPreserveCase(preserveCase);
                tv.setInput("C:\\Users\\amrit\\GreenLamba");
                tv.refresh();
            }
        });
        return composite;
    }

    /**
     * The application entry point
     * 
     * @param args
     *            the command line arguments
     */
    public static void main(String[] args) {
        new FileTree().run();
    }
}

/**
 * This class provides the content for the tree in FileTree
 */

class FileTreeContentProvider implements ITreeContentProvider {
    /**
     * Gets the children of the specified object
     * 
     * @param arg0
     *            the parent object
     * @return Object[]
     */
    public Object[] getChildren(Object arg0) {
        // Return the files and subdirectories in this directory
        File base = (File) arg0;
        Object obj[] = null;
        if (base.isFile()) {
            if (base.getName().endsWith(".xls")) {
                try {
                    Workbook scriptWorkbook = Workbook.getWorkbook(base);
                    obj = scriptWorkbook.getSheetNames();
                } catch (Exception E) {

                }
            }
        } else {
            obj = base.listFiles();
        }

        return obj;
    }

    /**
     * Gets the parent of the specified object
     * 
     * @param arg0
     *            the object
     * @return Object
     */
    public Object getParent(Object arg0) {
        // Return this file's parent file
        return ((File) arg0).getParentFile();
    }

    /**
     * Returns whether the passed object has children
     * 
     * @param arg0
     *            the parent object
     * @return boolean
     */
    public boolean hasChildren(Object arg0) {
        // Get the children
        Object[] obj = getChildren(arg0);

        // Return whether the parent has children
        return obj == null ? false : obj.length > 0;
    }

    /**
     * Gets the root element(s) of the tree
     * 
     * @param arg0
     *            the input data
     * @return Object[]
     */
    public Object[] getElements(Object arg0) {
        // These are the root elements of the tree
        // We don't care what arg0 is, because we just want all
        // the root nodes in the file system
        System.out.println("get elements called " + arg0);
        return new File((String) arg0).listFiles();
    }

    /**
     * Disposes any created resources
     */
    public void dispose() {
        // Nothing to dispose
    }

    /**
     * Called when the input changes
     * 
     * @param arg0
     *            the viewer
     * @param arg1
     *            the old input
     * @param arg2
     *            the new input
     */
    public void inputChanged(Viewer arg0, Object arg1, Object arg2) {

        System.out.println("input changed called !!");

        System.out.println("input 1" + arg1);

        System.out.println("input 1" + arg2);

        // Nothing to change
    }
}


     class FileTreeLabelProvider implements ILabelProvider {
    // The listeners
    private List listeners;

    // Images for tree nodes
    private Image file;

    private Image dir;

    // Label provider state: preserve case of file names/directories
    boolean preserveCase;

    /**
     * Constructs a FileTreeLabelProvider
     */
    public FileTreeLabelProvider() {
        // Create the list to hold the listeners
        listeners = new ArrayList();

        // Create the images
        try {
            file = new Image(null, new FileInputStream("icons/page.gif"));
            dir = new Image(null, new FileInputStream("icons/folder.gif"));
        } catch (FileNotFoundException e) {
            // Swallow it; we'll do without images
        }
    }

    /**
     * Sets the preserve case attribute
     * 
     * @param preserveCase
     *            the preserve case attribute
     */
    public void setPreserveCase(boolean preserveCase) {
        this.preserveCase = preserveCase;

        // Since this attribute affects how the labels are computed,
        // notify all the listeners of the change.
        LabelProviderChangedEvent event = new LabelProviderChangedEvent(this);
        for (int i = 0, n = listeners.size(); i < n; i++) {
            ILabelProviderListener ilpl = (ILabelProviderListener) listeners
                    .get(i);
            ilpl.labelProviderChanged(event);
        }
    }

    /**
     * Gets the image to display for a node in the tree
     * 
     * @param arg0
     *            the node
     * @return Image
     */
    public Image getImage(Object arg0) {
        // If the node represents a directory, return the directory image.
        // Otherwise, return the file image.
        return ((File) arg0).isDirectory() ? dir : file;
    }

    /**
     * Gets the text to display for a node in the tree
     * 
     * @param arg0
     *            the node
     * @return String
     */
    public String getText(Object arg0) {
        // Get the name of the file
        String text = null;
        if (arg0 instanceof File) {
            text = ((File) arg0).getName();
        } else {
            text = (String) arg0;
        }

        // If name is blank, get the path
        if (text.length() == 0) {
            text = ((File) arg0).getPath();
        }

        // Check the case settings before returning the text
        return preserveCase ? text : text.toUpperCase();
    }

    /**
     * Adds a listener to this label provider
     * 
     * @param arg0
     *            the listener
     */
    public void addListener(ILabelProviderListener arg0) {
        listeners.add(arg0);
    }

    /**
     * Called when this LabelProvider is being disposed
     */
    public void dispose() {
        // Dispose the images
        if (dir != null)
            dir.dispose();
        if (file != null)
            file.dispose();
    }

    /**
     * Returns whether changes to the specified property on the specified
     * element would affect the label for the element
     * 
     * @param arg0
     *            the element
     * @param arg1
     *            the property
     * @return boolean
     */
    public boolean isLabelProperty(Object arg0, String arg1) {
        return false;
    }

    /**
     * Removes the listener
     * 
     * @param arg0
     *            the listener to remove
     */
    public void removeListener(ILabelProviderListener arg0) {
        listeners.remove(arg0);
    }
}

0 个答案:

没有答案