/*! * 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.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.ChangeListener; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.MouseListener; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Tree; import com.google.gwt.user.client.ui.TreeItem; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback; import org.pentaho.gwt.widgets.client.utils.ElementUtils; import org.pentaho.gwt.widgets.client.utils.string.StringUtils; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; /** * Entry point classes define <code>onModuleLoad()</code>. */ @SuppressWarnings( "deprecation" ) public class FileChooser extends VerticalPanel { public enum FileChooserMode { OPEN, OPEN_READ_ONLY, SAVE } public static final String ETC_FOLDER = "etc"; FileChooserMode mode = FileChooserMode.OPEN; String selectedPath; ListBox navigationListBox; Tree repositoryTree; TreeItem selectedTreeItem; boolean showHiddenFiles = false; boolean showLocalizedFileNames = true; com.google.gwt.user.client.Element lastSelectedFileElement; TextBox fileNameTextBox = new TextBox(); DateTimeFormat dateFormat = DateTimeFormat.getMediumDateTimeFormat(); RepositoryFileTree fileTree; ArrayList<FileChooserListener> listeners = new ArrayList<FileChooserListener>(); private String actualFileName; boolean fileSelected = false; private FileFilter fileFilter; private boolean submitOnEnter = true; public FileChooser() { super(); fileNameTextBox.getElement().setId( "fileNameTextBox" ); //$NON-NLS-1$ // workaround webkit browsers quirk of not being able to set focus in a widget by clicking on it fileNameTextBox.addClickHandler( new ClickHandler() { public void onClick( ClickEvent event ) { fileNameTextBox.setFocus( true ); } } ); fileNameTextBox.addKeyUpHandler( new KeyUpHandler() { public void onKeyUp( KeyUpEvent event ) { actualFileName = fileNameTextBox.getText(); if ( event.getNativeKeyCode() == KeyCodes.KEY_ENTER && isSubmitOnEnter() ) { if ( mode != FileChooserMode.SAVE ) { fireFileSelected( search( fileTree, actualFileName ) ); } else { fireFileSelected(); } } } } ); setSpacing( 3 ); } public FileChooser( boolean showHiddenFiles ) { this(); this.showHiddenFiles = showHiddenFiles; } private RepositoryFile search( RepositoryFileTree tree, String actualFileName ) { try { RepositoryFile file = tree.getFile(); if ( file != null && !file.isFolder() && file.getPath().equals( actualFileName ) ) { return file; } if ( file != null ) { for ( RepositoryFileTree treeItem : tree.getChildren() ) { file = search( treeItem, actualFileName ); if ( file != null ) { return file; } } } } catch ( Exception e ) { return null; } return null; } public FileChooser( FileChooserMode mode, String selectedPath, boolean showLocalizedFileNames ) { this( mode, selectedPath, showLocalizedFileNames, null ); } public FileChooser( FileChooserMode mode, String selectedPath, boolean showLocalizedFileNames, RepositoryFileTree fileTree ) { this(); this.mode = mode; this.selectedPath = selectedPath; this.fileTree = fileTree; this.showLocalizedFileNames = showLocalizedFileNames; if ( null != fileTree ) { repositoryTree = TreeBuilder.buildSolutionTree( fileTree, showHiddenFiles, showLocalizedFileNames, fileFilter ); selectedTreeItem = repositoryTree.getItem( 0 ); initUI(); } } public FileChooser( FileChooserMode mode, String selectedPath, IDialogCallback callback ) { this(); this.mode = mode; this.selectedPath = selectedPath; try { fetchRepository( callback ); } catch ( RequestException e ) { Window.alert( e.toString() ); } } private native String getFullyQualifiedURL() /*-{ return $wnd.location.protocol + "//" + $wnd.location.host + $wnd.CONTEXT_PATH }-*/; public void fetchRepository( final IDialogCallback completedCallback ) throws RequestException { RequestBuilder builder = null; builder = new RequestBuilder( RequestBuilder.GET, getFullyQualifiedURL() + "api/repo/files/:/tree?showHidden=" + showHiddenFiles + "&depth=-1&filter=*" ); //$NON-NLS-1$ builder.setHeader( "accept", "application/json" ); //$NON-NLS-1$ //$NON-NLS-2$ RequestCallback callback = new RequestCallback() { public void onError( Request request, Throwable exception ) { Window.alert( exception.toString() ); } public void onResponseReceived( Request request, Response response ) { if ( response.getStatusCode() == Response.SC_OK ) { String jsonData = response.getText(); JsonToRepositoryFileTreeConverter converter = new JsonToRepositoryFileTreeConverter( jsonData ); repositoryTree = TreeBuilder.buildSolutionTree( converter.getTree(), showHiddenFiles, showLocalizedFileNames, fileFilter ); selectedTreeItem = repositoryTree.getItem( 0 ); initUI(); if ( completedCallback != null ) { completedCallback.okPressed(); } } else { Window.alert( "Solution Repository not found." ); //$NON-NLS-1$ } } }; builder.sendRequest( null, callback ); } public void initUI() { if ( mode == FileChooserMode.OPEN_READ_ONLY ) { fileNameTextBox.setReadOnly( true ); } // We are here because we are initiating a fresh UI for a new directory // Since there is no file selected currently, we are setting file selected to false. setFileSelected( false ); String path = this.selectedPath; // find the selected item from the list List<String> pathSegments = new ArrayList<String>(); if ( path != null ) { int index = path.indexOf( "/", 0 ); //$NON-NLS-1$ while ( index >= 0 ) { int oldIndex = index; index = path.indexOf( "/", oldIndex + 1 ); //$NON-NLS-1$ if ( index >= 0 ) { pathSegments.add( path.substring( oldIndex + 1, index ) ); } } pathSegments.add( path.substring( path.lastIndexOf( "/" ) + 1 ) ); //$NON-NLS-1$ } selectedTreeItem = getTreeItem( pathSegments ); navigationListBox = new ListBox(); navigationListBox.getElement().setId( "navigationListBox" ); //$NON-NLS-1$ navigationListBox.setWidth( "350px" ); //$NON-NLS-1$ // now we can find the tree nodes who match the path segments navigationListBox.addItem( "/", "/" ); //$NON-NLS-1$ //$NON-NLS-2$ for ( int i = 0; i < pathSegments.size(); i++ ) { String segment = pathSegments.get( i ); String fullPath = ""; //$NON-NLS-1$ for ( int j = 0; j <= i; j++ ) { String segmentPath = pathSegments.get( j ); if ( segmentPath != null && segmentPath.length() > 0 ) { fullPath += "/" + segmentPath; //$NON-NLS-1$ } } if ( !fullPath.equals( "/" ) ) { //$NON-NLS-1$ navigationListBox.addItem( fullPath, segment ); } } navigationListBox.setSelectedIndex( navigationListBox.getItemCount() - 1 ); navigationListBox.addChangeListener( new ChangeListener() { public void onChange( Widget sender ) { changeToPath( navigationListBox.getItemText( navigationListBox.getSelectedIndex() ) ); } } ); clear(); VerticalPanel locationBar = new VerticalPanel(); locationBar.add( new Label( FileChooserEntryPoint.messages.getString( "location" ) ) ); //$NON-NLS-1$ HorizontalPanel navigationBar = new HorizontalPanel(); final Image upDirImage = new Image(); upDirImage.setUrl( GWT.getModuleBaseURL() + "images/spacer.gif" ); //$NON-NLS-1$ upDirImage.addStyleName( "pentaho-filechooseupbutton" ); //$NON-NLS-1$ upDirImage.setTitle( FileChooserEntryPoint.messages.getString( "upOneLevel" ) ); //$NON-NLS-1$ upDirImage.addMouseListener( new MouseListener() { public void onMouseDown( Widget sender, int x, int y ) { } public void onMouseEnter( Widget sender ) { } public void onMouseLeave( Widget sender ) { } public void onMouseMove( Widget sender, int x, int y ) { } public void onMouseUp( Widget sender, int x, int y ) { } } ); upDirImage.addClickListener( new ClickListener() { public void onClick( Widget sender ) { // go up a dir TreeItem tmpItem = selectedTreeItem; List<String> parentSegments = new ArrayList<String>(); while ( tmpItem != null ) { RepositoryFileTree tree = (RepositoryFileTree) tmpItem.getUserObject(); if ( tree.getFile() != null && tree.getFile().getName() != null ) { parentSegments.add( tree.getFile().getName() ); } tmpItem = tmpItem.getParentItem(); } Collections.reverse( parentSegments ); String myPath = ""; //$NON-NLS-1$ // If we have a file selected then we need to go one lesser level deep final int loopCount = isFileSelected() ? parentSegments.size() - 2 : parentSegments.size() - 1; for ( int i = 0; i < loopCount; i++ ) { String pathSegment = parentSegments.get( i ); if ( pathSegment != null && pathSegment.length() > 0 ) { myPath += "/" + pathSegment; //$NON-NLS-1$ } } if ( myPath.equals( "" ) ) { //$NON-NLS-1$ myPath = "/"; //$NON-NLS-1$ } selectedTreeItem = selectedTreeItem.getParentItem(); if ( selectedTreeItem == null ) { selectedTreeItem = repositoryTree.getItem( 0 ); } changeToPath( myPath ); } } ); navigationBar.setHorizontalAlignment( HasHorizontalAlignment.ALIGN_LEFT ); navigationBar.add( navigationListBox ); navigationBar.setHorizontalAlignment( HasHorizontalAlignment.ALIGN_LEFT ); navigationBar.add( upDirImage ); navigationBar.setCellWidth( upDirImage, "100%" ); //$NON-NLS-1$ DOM.setStyleAttribute( upDirImage.getElement(), "marginLeft", "4px" ); navigationBar.setWidth( "100%" ); //$NON-NLS-1$ locationBar.add( navigationBar ); locationBar.setWidth( "100%" ); //$NON-NLS-1$ Label filenameLabel = new Label( FileChooserEntryPoint.messages.getString( "filename" ) ); //$NON-NLS-1$ filenameLabel.setWidth( "550px" ); //$NON-NLS-1$ add( filenameLabel ); fileNameTextBox.setWidth( "300px" ); //$NON-NLS-1$ add( fileNameTextBox ); add( locationBar ); add( buildFilesList( selectedTreeItem ) ); } public Widget buildFilesList( TreeItem parentTreeItem ) { VerticalPanel filesListPanel = new VerticalPanel(); filesListPanel.setWidth( "100%" ); //$NON-NLS-1$ ScrollPanel filesScroller = new ScrollPanel(); filesScroller.setStyleName( "fileChooser-scrollPanel" ); //$NON-NLS-1$ FlexTable filesListTable = new FlexTable(); filesListTable.setWidth( "100%" ); //$NON-NLS-1$ filesListTable.setCellSpacing( 0 ); Label nameLabel = new Label( FileChooserEntryPoint.messages.getString( "name" ), false ); //$NON-NLS-1$ nameLabel.setStyleName( "fileChooserHeader" ); //$NON-NLS-1$ Label typeLabel = new Label( FileChooserEntryPoint.messages.getString( "type" ), false ); //$NON-NLS-1$ typeLabel.setStyleName( "fileChooserHeader" ); //$NON-NLS-1$ Label dateLabel = new Label( FileChooserEntryPoint.messages.getString( "dateModified" ), false ); //$NON-NLS-1$ dateLabel.setStyleName( "fileChooserHeader" ); //$NON-NLS-1$ ElementUtils.preventTextSelection( nameLabel.getElement() ); ElementUtils.preventTextSelection( typeLabel.getElement() ); ElementUtils.preventTextSelection( dateLabel.getElement() ); filesListTable.setWidget( 0, 0, nameLabel ); filesListTable.getCellFormatter().setWidth( 0, 0, "100%" ); //$NON-NLS-1$ filesListTable.setWidget( 0, 1, typeLabel ); filesListTable.setWidget( 0, 2, dateLabel ); List<TreeItem> treeItems = new ArrayList<TreeItem>(); for ( int i = 0; i < parentTreeItem.getChildCount(); i++ ) { treeItems.add( parentTreeItem.getChild( i ) ); } Collections.sort( treeItems, new TreeItemComparator() ); // BISERVER-9599 - custom sort int row = 0; for ( final TreeItem childItem : treeItems ) { RepositoryFileTree repositoryFileTree = (RepositoryFileTree) childItem.getUserObject(); RepositoryFile repositoryFile = repositoryFileTree.getFile(); if ( repositoryFile.isFolder() && !( repositoryFile.getName() != null && repositoryFile.getName().equals( ETC_FOLDER ) ) ) { addFileToList( repositoryFileTree, childItem, filesListTable, row++ ); } } for ( final TreeItem childItem : treeItems ) { RepositoryFileTree repositoryFileTree = (RepositoryFileTree) childItem.getUserObject(); RepositoryFile repositoryFile = repositoryFileTree.getFile(); if ( !repositoryFile.isFolder() ) { addFileToList( repositoryFileTree, childItem, filesListTable, row++ ); } } filesListTable.setWidth( "100%" ); //$NON-NLS-1$ filesScroller.setWidget( filesListTable ); filesListTable.setWidth( "100%" ); //$NON-NLS-1$ filesListPanel.add( filesScroller ); return filesListPanel; } private void addFileToList( final RepositoryFileTree repositoryFileTree, final TreeItem item, final FlexTable filesListTable, int row ) { Label myDateLabel = null; RepositoryFile file = repositoryFileTree.getFile(); Date lastModDate = file.getLastModifiedDate(); String fileName = file.getName(); final Boolean isDir = file.isFolder(); if ( lastModDate != null ) { myDateLabel = new Label( dateFormat.format( lastModDate ), false ); } String finalFileName; if ( showLocalizedFileNames ) { finalFileName = file.getTitle(); } else { finalFileName = fileName; } final Label myNameLabel = new Label( finalFileName, false ) { public void onBrowserEvent( Event event ) { switch ( event.getTypeInt() ) { case Event.ONCLICK: case Event.ONDBLCLICK: handleFileClicked( item, isDir, event, this.getElement() ); break; case Event.ONMOUSEOVER: this.addStyleDependentName( "over" ); //$NON-NLS-1$ break; case Event.ONMOUSEOUT: this.removeStyleDependentName( "over" ); //$NON-NLS-1$ break; } } }; // biserver-2719: concatenate the name with fileChooser_ so the ids are unique in Mantle myNameLabel.getElement().setAttribute( "id", "fileChooser_".concat( file.getId() ) ); //$NON-NLS-1$ //$NON-NLS-2$ myNameLabel.sinkEvents( Event.ONDBLCLICK | Event.ONCLICK ); myNameLabel.sinkEvents( Event.ONMOUSEOVER | Event.ONMOUSEOUT ); myNameLabel.setTitle( file.getTitle() ); myNameLabel.setStyleName( "fileChooserCellLabel" ); //$NON-NLS-1$ HorizontalPanel fileNamePanel = new HorizontalPanel(); Image fileImage = new Image() { public void onBrowserEvent( Event event ) { handleFileClicked( item, isDir, event, myNameLabel.getElement() ); } }; fileImage.setUrl( GWT.getModuleBaseURL() + "images/spacer.gif" ); fileImage.addStyleName( "icon-small" ); fileImage.addStyleName( "clickable" ); fileImage.sinkEvents( Event.ONDBLCLICK | Event.ONCLICK ); if ( isDir ) { fileImage.addStyleName( "icon-folder" ); } else { if ( fileName.endsWith( "waqr.xaction" ) ) { //$NON-NLS-1$ fileImage.addStyleName( "icon-waqr-report" ); } else if ( fileName.endsWith( "analysisview.xaction" ) ) { //$NON-NLS-1$ fileImage.addStyleName( "icon-analysis" ); } else if ( fileName.endsWith( ".url" ) ) { //$NON-NLS-1$ fileImage.addStyleName( "icon-url" ); } else if ( fileName.endsWith( "xanalyzer" ) ) { //$NON-NLS-1$ fileImage.addStyleName( "icon-analyzer" ); } else if ( fileName.endsWith( "prpti" ) ) { //$NON-NLS-1$ fileImage.addStyleName( "icon-pir-report" ); } else if ( fileName.endsWith( "prpt" ) ) { //$NON-NLS-1$ fileImage.addStyleName( "icon-prpt-report" ); } else if ( fileName.endsWith( "xdash" ) ) { //$NON-NLS-1$ fileImage.addStyleName( "icon-dashboard" ); } else { fileImage.addStyleName( "icon-xaction" ); } } fileNamePanel.add( fileImage ); fileNamePanel.add( myNameLabel ); DOM.setStyleAttribute( myNameLabel.getElement(), "cursor", "default" ); //$NON-NLS-1$ //$NON-NLS-2$ Label typeLabel = new Label( isDir ? FileChooserEntryPoint.messages.getString( "folder" ) : FileChooserEntryPoint.messages.getString( "file" ), false ); //$NON-NLS-1$ //$NON-NLS-2$ ElementUtils.preventTextSelection( myNameLabel.getElement() ); ElementUtils.preventTextSelection( typeLabel.getElement() ); if ( myDateLabel != null ) { ElementUtils.preventTextSelection( myDateLabel.getElement() ); } fileNamePanel.setStyleName( "fileChooserCell" ); //$NON-NLS-1$ typeLabel.setStyleName( "fileChooserCell" ); //$NON-NLS-1$ if ( myDateLabel != null ) { myDateLabel.setStyleName( "fileChooserCell" ); //$NON-NLS-1$ } filesListTable.setWidget( row + 1, 0, fileNamePanel ); filesListTable.setWidget( row + 1, 1, typeLabel ); if ( myDateLabel != null ) { filesListTable.setWidget( row + 1, 2, myDateLabel ); } } private void handleFileClicked( final TreeItem item, final boolean isDir, final Event event, com.google.gwt.user.client.Element sourceElement ) { boolean eventWeCareAbout = false; TreeItem tmpItem = null; if ( ( DOM.eventGetType( event ) & Event.ONDBLCLICK ) == Event.ONDBLCLICK ) { eventWeCareAbout = true; } else if ( ( DOM.eventGetType( event ) & Event.ONCLICK ) == Event.ONCLICK ) { eventWeCareAbout = true; } if ( eventWeCareAbout ) { setFileSelected( true ); selectedTreeItem = tmpItem = item; List<String> parentSegments = new ArrayList<String>(); while ( tmpItem != null ) { RepositoryFileTree tree = (RepositoryFileTree) tmpItem.getUserObject(); RepositoryFile file = tree.getFile(); if ( file != null && file.getName() != null ) { parentSegments.add( file.getName() ); } tmpItem = tmpItem.getParentItem(); } Collections.reverse( parentSegments ); String myPath = ""; //$NON-NLS-1$ for ( int i = 0; isDir ? i < parentSegments.size() : i < parentSegments.size() - 1; i++ ) { String segment = parentSegments.get( i ); if ( segment != null && segment.length() > 0 ) { myPath += "/" + segment; //$NON-NLS-1$ } } setSelectedPath( myPath ); if ( !isDir ) { RepositoryFileTree tree = (RepositoryFileTree) selectedTreeItem.getUserObject(); if ( tree.getFile() != null ) { fileNameTextBox.setText( tree.getFile().getTitle() ); actualFileName = tree.getFile().getName(); } } } // double click if ( ( DOM.eventGetType( event ) & Event.ONDBLCLICK ) == Event.ONDBLCLICK ) { if ( isDir ) { initUI(); } else { fireFileSelected(); } } else if ( ( DOM.eventGetType( event ) & Event.ONCLICK ) == Event.ONCLICK ) { fireFileSelectionChanged(); // single click // highlight row if ( lastSelectedFileElement != null ) { com.google.gwt.dom.client.Element parentRow = ElementUtils.findElementAboveByTagName( lastSelectedFileElement, "table" ); //$NON-NLS-1$ parentRow.removeClassName( "pentaho-file-chooser-selection" ); } com.google.gwt.dom.client.Element parentRow = ElementUtils.findElementAboveByTagName( sourceElement, "table" ); //$NON-NLS-1$ parentRow.addClassName( "pentaho-file-chooser-selection" ); //$NON-NLS-1$ lastSelectedFileElement = sourceElement; } } private void setFileSelected( boolean selected ) { fileSelected = selected; } public boolean isFileSelected() { return fileSelected; } public TreeItem getTreeItem( List<String> pathSegments ) { // find the tree node whose location matches the pathSegment paths TreeItem selectedItem = repositoryTree.getItem( 0 ); for ( String segment : pathSegments ) { for ( int i = 0; i < selectedItem.getChildCount(); i++ ) { TreeItem item = selectedItem.getChild( i ); RepositoryFileTree tree = (RepositoryFileTree) item.getUserObject(); if ( segment.equals( tree.getFile().getName() ) ) { selectedItem = item; } } } return selectedItem; } public FileChooserMode getMode() { return mode; } public void setMode( FileChooserMode mode ) { this.mode = mode; } public String getSelectedPath() { return selectedPath; } public void setSelectedPath( String selectedPath ) { this.selectedPath = selectedPath; } public void setFileChooserRepositoryFileTree( RepositoryFileTree fileChooserRepositoryFileTree ) { this.fileTree = fileChooserRepositoryFileTree; repositoryTree = TreeBuilder.buildSolutionTree( fileChooserRepositoryFileTree, showHiddenFiles, showLocalizedFileNames, fileFilter ); initUI(); } public void fireFileSelected( RepositoryFile file ) { for ( FileChooserListener listener : listeners ) { listener.fileSelected( file, file.getPath(), ( mode != null && mode.equals( FileChooserMode.SAVE ) ? actualFileName : file.getName() ), file.getTitle() ); } } public void fireFileSelected() { for ( FileChooserListener listener : listeners ) { RepositoryFileTree tree = (RepositoryFileTree) selectedTreeItem.getUserObject(); RepositoryFile file = tree.getFile(); listener.fileSelected( file, file.getPath(), ( mode != null && mode.equals( FileChooserMode.SAVE ) ? actualFileName : file.getName() ), file.getTitle() ); } } public void fireFileSelectionChanged() { for ( FileChooserListener listener : listeners ) { RepositoryFileTree tree = (RepositoryFileTree) selectedTreeItem.getUserObject(); RepositoryFile file = tree.getFile(); listener.fileSelectionChanged( file, file.getPath(), ( mode != null && mode.equals( FileChooserMode.SAVE ) ? actualFileName : file.getName() ), file.getTitle() ); } } public String getSolution() { if ( getSelectedPath().indexOf( "/", 1 ) == -1 ) { //$NON-NLS-1$ return getSelectedPath().substring( 1 ); } else { return getSelectedPath().substring( 1, getSelectedPath().indexOf( "/", 1 ) ); //$NON-NLS-1$ } } /** * Get the names of all files in the given path. * * @param path * Path to query for files * @return List of file names in the given path. */ public List<String> getFilesInPath( final RepositoryFileTree fileTreeItem ) { List<String> fileNames = new ArrayList<String>(); for ( RepositoryFileTree treeItem : fileTreeItem.getChildren() ) { RepositoryFile file = treeItem.getFile(); if ( file != null && !file.isFolder() ) { fileNames.add( file.getName() ); } } return fileNames; } public boolean doesFileExist( final String path ) { if ( search( this.fileTree, path ) != null ) { return true; } return false; } public String getActualFileName() { return actualFileName; } public String getLocalizedFileName() { return fileNameTextBox.getText(); } public void addFileChooserListener( FileChooserListener listener ) { listeners.add( listener ); } public void removeFileChooserListener( FileChooserListener listener ) { listeners.remove( listener ); } public FileFilter getFileFilter() { return fileFilter; } public void setFileFilter( FileFilter fileFilter ) { this.fileFilter = fileFilter; repositoryTree = TreeBuilder.buildSolutionTree( fileTree, showHiddenFiles, showLocalizedFileNames, fileFilter ); initUI(); } public boolean doesSelectedFileExist() { return doesSelectedFileExist( null ); } public boolean doesSelectedFileExist( String ext ) { String fileName = this.selectedPath + "/" + this.actualFileName; //$NON-NLS-1$ if ( !StringUtils.isEmpty( ext ) && !fileName.endsWith( ext ) ) { fileName = fileName + ext; } return search( fileTree, fileName ) != null; } public void setShowLocalizedFileNames( boolean showLocalizedFileNames ) { this.showLocalizedFileNames = showLocalizedFileNames; initUI(); } public void changeToPath( String path ) { setSelectedPath( path ); initUI(); fireFileSelectionChanged(); } public void setSubmitOnEnter( boolean submitOnEnter ) { this.submitOnEnter = submitOnEnter; } public boolean isSubmitOnEnter() { return submitOnEnter; } /** * Safari Mobile behaves differently than browsers on a computer. These rules may extend to other mobile browsers. * * @return */ public native boolean isMobileSafari()/*-{ return (window.orientation !== undefined); }-*/; public native String getWebAppRoot()/*-{ if($wnd.CONTEXT_PATH){ return $wnd.CONTEXT_PATH; } return ""; }-*/; }