org.pentaho.gwt.widgets.client.filechooser.TreeBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.gwt.widgets.client.filechooser.TreeBuilder.java

Source

/*!
 * This program is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
 * Foundation.
 *
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
 * or from the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * 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 Lesser General Public License for more details.
 *
 * Copyright (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.gwt.widgets.client.filechooser;

import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;

import java.util.ArrayList;
import java.util.List;

public class TreeBuilder {

    public static Tree buildSolutionTree(RepositoryFileTree fileTree, boolean showHiddenFiles,
            boolean showLocalizedFileNames, FileFilter filter) {
        // build a tree structure to represent the document
        Tree repositoryTree = new Tree();
        // get document root item
        RepositoryFile rootFile = fileTree.getFile();
        TreeItem rootItem = new TreeItem();
        rootItem.setText(rootFile.getPath());
        rootItem.setUserObject(fileTree);
        repositoryTree.addItem(rootItem);

        // default file filter that accepts anything
        if (filter == null) {
            filter = new DefaultFileFilter();
        }
        buildSolutionTree(rootItem, fileTree, showHiddenFiles, showLocalizedFileNames, filter);
        return repositoryTree;
    }

    private static void buildSolutionTree(TreeItem parentTreeItem, RepositoryFileTree fileTree,
            boolean showHiddenFiles, boolean showLocalizedFileNames, FileFilter filter) {
        for (RepositoryFileTree repositoryFileTree : fileTree.getChildren()) {
            RepositoryFile file = repositoryFileTree.getFile();
            boolean isVisible = !file.isHidden();
            boolean isDirectory = file.isFolder();

            if (isVisible || showHiddenFiles) {
                String fileTitle = file.getTitle(), fileName = file.getName();

                if (filter.accept(fileName, isDirectory, (isVisible || showHiddenFiles)) == false) {
                    continue;
                }

                TreeItem childTreeItem = new TreeItem();
                // TODO There is no concept of filename and a localized filename in the repository. Do we need this ?
                if (showLocalizedFileNames) {
                    childTreeItem.setText(fileTitle);
                    childTreeItem.setTitle(fileTitle);
                } else {
                    childTreeItem.setText(fileTitle);
                    childTreeItem.setTitle(fileTitle);
                }

                // ElementUtils.preventTextSelection(childTreeItem.getElement());

                childTreeItem.setUserObject(repositoryFileTree);

                // find the spot in the parentTreeItem to insert the node (based on showLocalizedFileNames)
                if (parentTreeItem.getChildCount() == 0) {
                    parentTreeItem.addItem(childTreeItem);
                } else {
                    // this does sorting
                    boolean inserted = false;
                    for (int j = 0; j < parentTreeItem.getChildCount(); j++) {
                        TreeItem kid = (TreeItem) parentTreeItem.getChild(j);
                        if (showLocalizedFileNames) {
                            if (childTreeItem.getText().compareTo(kid.getText()) <= 0) {
                                // leave all items ahead of the insert point
                                // remove all items between the insert point and the end
                                // add the new item
                                // add back all removed items
                                List<TreeItem> removedItems = new ArrayList<TreeItem>();
                                for (int x = j; x < parentTreeItem.getChildCount(); x++) {
                                    TreeItem removedItem = (TreeItem) parentTreeItem.getChild(x);
                                    removedItems.add(removedItem);
                                }
                                for (TreeItem removedItem : removedItems) {
                                    parentTreeItem.removeItem(removedItem);
                                }
                                parentTreeItem.addItem(childTreeItem);
                                inserted = true;
                                for (TreeItem removedItem : removedItems) {
                                    parentTreeItem.addItem(removedItem);
                                }
                                break;
                            }
                        } else {
                            parentTreeItem.addItem(childTreeItem);
                        }
                    }
                    if (!inserted) {
                        parentTreeItem.addItem(childTreeItem);
                    }
                }

                if (isDirectory) {
                    buildSolutionTree(childTreeItem, repositoryFileTree, showHiddenFiles, showLocalizedFileNames,
                            filter);
                }
            }
        }
    }

    private static class DefaultFileFilter implements FileFilter {
        public boolean accept(String name, boolean isDirectory, boolean isVisible) {
            return true;
        }
    }
}