/*! * 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; } } }