/*!
* 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.mantle.client.solutionbrowser.filelist;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArrayString;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TreeItem;
import org.pentaho.gwt.widgets.client.filechooser.FileChooserListener;
import org.pentaho.gwt.widgets.client.filechooser.RepositoryFile;
import org.pentaho.gwt.widgets.client.filechooser.RepositoryFileTree;
import org.pentaho.gwt.widgets.client.toolbar.Toolbar;
import org.pentaho.mantle.client.dialogs.FileDialog;
import org.pentaho.mantle.client.solutionbrowser.IRepositoryFileProvider;
import org.pentaho.mantle.client.solutionbrowser.IRepositoryFileTreeListener;
import org.pentaho.mantle.client.solutionbrowser.PluginOptionsHelper;
import org.pentaho.mantle.client.solutionbrowser.PluginOptionsHelper.ContentTypePlugin;
import org.pentaho.mantle.client.solutionbrowser.RepositoryFileTreeManager;
import org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel;
import org.pentaho.mantle.client.solutionbrowser.filelist.FileCommand.COMMAND;
import org.pentaho.mantle.client.solutionbrowser.toolbars.FilesToolbar;
import org.pentaho.mantle.client.solutionbrowser.tree.SolutionTree;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author wseyler
*
*/
public class FilesListPanel extends FlowPanel implements IRepositoryFileTreeListener, IRepositoryFileProvider {
protected String FILES_LABEL_STYLE_NAME = "filesPanelMenuLabel"; //$NON-NLS-1$
private FlexTable filesList = new FlexTable();
private FilesToolbar toolbar;
private List<FileItem> selectedFileItems = new ArrayList<FileItem>();
private boolean showHiddenFiles = false;
public FilesListPanel() {
super();
// Create the toolbar
toolbar = new FilesToolbar();
SimplePanel toolbarWrapper = new SimplePanel();
toolbarWrapper.add( toolbar );
toolbarWrapper.setStyleName( "files-toolbar" ); //$NON-NLS-1$
add( toolbarWrapper );
SimplePanel filesListWrapper = new SimplePanel();
FocusPanel fp = new FocusPanel( filesList ) {
public void onBrowserEvent( Event event ) {
if ( ( DOM.eventGetType( event ) & Event.ONKEYDOWN ) == Event.ONKEYDOWN ) {
if ( event.getKeyCode() == KeyCodes.KEY_UP ) {
selectPreviousItem( selectedFileItems );
} else if ( event.getKeyCode() == KeyCodes.KEY_DOWN ) {
selectNextItem( selectedFileItems );
} else if ( event.getKeyCode() == KeyCodes.KEY_ENTER ) {
SolutionBrowserPanel sbp = SolutionBrowserPanel.getInstance();
FilesListPanel flp = sbp.getFilesListPanel();
List<FileItem> items = flp.getSelectedFileItems();
if ( items != null && items.size() == 1 ) {
sbp.openFile( items.get( 0 ).getRepositoryFile(), COMMAND.RUN );
}
}
}
super.onBrowserEvent( event );
}
};
filesList.setCellPadding( 1 );
filesList.setWidth( "100%" );
AbsolutePanel bounderyPanel = new AbsolutePanel();
bounderyPanel.add( fp );
fp.sinkEvents( Event.KEYEVENTS );
filesListWrapper.add( bounderyPanel );
fp.getElement().getStyle().setProperty( "margin", "29px 0px 10px 0px" ); //$NON-NLS-1$ //$NON-NLS-2$
filesListWrapper.setStyleName( "files-list-panel" ); //$NON-NLS-1$
add( filesListWrapper );
setStyleName( "panelWithTitledToolbar" ); //$NON-NLS-1$
setWidth( "100%" ); //$NON-NLS-1$
getElement().setId( "filesListPanel" );
setupNativeHooks( this );
}
public void beforeFetchRepositoryFileTree() {
filesList.clear();
}
public boolean isShowHiddenFiles() {
return showHiddenFiles;
}
public void setShowHiddenFiles( boolean showHiddenFiles ) {
this.showHiddenFiles = showHiddenFiles;
}
private void showOpenFileDialog( final JavaScriptObject callback, final String path, final String title,
final String okText, final String fileTypes, final Boolean showHidden ) {
RepositoryFileTreeManager.getInstance().fetchRepositoryFileTree( new AsyncCallback<RepositoryFileTree>() {
public void onFailure( Throwable caught ) {
}
public void onSuccess( RepositoryFileTree repositoryFileTree ) {
FileDialog dialog = new FileDialog( repositoryFileTree, path, title, okText, fileTypes.split( "," ) );
dialog.addFileChooserListener( new FileChooserListener() {
public void fileSelected( RepositoryFile repositoryFile, String filePath, String fileName, String title ) {
notifyOpenFileCallback( callback, repositoryFile, filePath, fileName, title );
}
public void fileSelectionChanged( RepositoryFile repositoryFile, String filePath, String fileName,
String title ) {
}
public void dialogCanceled() {
}
} );
dialog.show();
}
}, false, null, null, showHidden );
}
private native void notifyOpenFileCallback( JavaScriptObject obj, RepositoryFile repositoryFile, String filePath,
String fileName, String title )
/*-{
obj.fileSelected(repositoryFile, filePath, fileName, title);
}-*/;
private static native void setupNativeHooks( FilesListPanel filesListPanel )
/*-{
$wnd.openFileDialog = function(callback,title, okText, fileTypes) {
//CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
filesListPanel.@org.pentaho.mantle.client.solutionbrowser.filelist.FilesListPanel::showOpenFileDialog(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;)(callback, null, title, okText, fileTypes, null);
}
$wnd.openFileDialogWithPath = function(callback, path, title, okText, fileTypes) {
//CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES
filesListPanel.@org.pentaho.mantle.client.solutionbrowser.filelist.FilesListPanel::showOpenFileDialog(Lcom/google/gwt/core/client/JavaScriptObject;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;)(callback, path, title, okText, fileTypes, null);
}
}-*/;
public void populateFilesList( SolutionBrowserPanel perspective, SolutionTree solutionTree, TreeItem item,
JsArrayString filters ) {
filesList.clear();
List<RepositoryFile> files;
if ( item == solutionTree.getTrashItem() ) { // If we're populating from the trash then
files = solutionTree.getTrashItems();
} else {
files = new ArrayList<RepositoryFile>();
// Get the user object.
RepositoryFileTree tree = (RepositoryFileTree) item.getUserObject();
// Since we are only listing the files here. Get to each item of the tree and get the file from it
for ( RepositoryFileTree treeItem : tree.getChildren() ) {
String fileName = treeItem.getFile().getName();
if ( filters != null ) {
for ( int i = 0; i < filters.length(); i++ ) {
if ( fileName.endsWith( filters.get( i ) ) ) {
files.add( treeItem.getFile() );
}
}
}
}
}
// let's sort this list based on localized name
Collections.sort( files, new RepositoryFileComparator() ); // BISERVER-9599 - Custom Sort
if ( files != null ) {
int rowCounter = 0;
for ( RepositoryFile file : files ) {
if ( ( item == solutionTree.getTrashItem() )
|| ( !file.isFolder() && ( isShowHiddenFiles() || !file.isHidden() ) ) ) {
// TODO Currently Old solution repository stores url type files. New repository does not have that
// concept. What do we need to do here
//String url = fileElement.getAttribute("url"); //$NON-NLS-1$
ContentTypePlugin plugin = PluginOptionsHelper.getContentTypePlugin( file.getName() );
String icon = null;
if ( plugin != null ) {
icon = plugin.getFileIcon();
}
if ( item == solutionTree.getTrashItem() && file.isFolder() ) {
icon = "mantle/images/folderIcon.png"; //$NON-NLS-1$
}
final FileItem fileLabel =
new FileItem( file, this, PluginOptionsHelper.getEnabledOptions( file.getName() ), true, icon );
// BISERVER-2317: Request for more IDs for Mantle UI elements
// set element id as the filename
fileLabel.getElement().setId( file.getPath() ); //$NON-NLS-1$
fileLabel.addFileSelectionChangedListener( toolbar );
fileLabel.setWidth( "100%" ); //$NON-NLS-1$
try {
perspective.getDragController().makeDraggable( fileLabel );
} catch ( Throwable e ) {
Throwable throwable = e;
String text = "Uncaught exception: ";
while ( throwable != null ) {
StackTraceElement[] stackTraceElements = throwable.getStackTrace();
text += throwable.toString() + "\n";
for ( int ii = 0; ii < stackTraceElements.length; ii++ ) {
text += " at " + stackTraceElements[ii] + "\n";
}
throwable = throwable.getCause();
if ( throwable != null ) {
text += "Caused by: ";
}
}
DialogBox dialogBox = new DialogBox( true );
DOM.setStyleAttribute( dialogBox.getElement(), "backgroundColor", "#ABCDEF" );
System.err.print( text );
text = text.replaceAll( " ", " " );
dialogBox.setHTML( "<pre>" + text + "</pre>" );
dialogBox.center();
}
fileLabel.setRepositoryFile( file );
filesList.setWidget( rowCounter++, 0, fileLabel );
if ( selectedFileItems != null && selectedFileItems.size() > 0 ) {
for ( FileItem fileItem : selectedFileItems ) {
if ( fileItem.getRepositoryFile().equals( fileLabel.getRepositoryFile() ) ) {
if ( file.isHidden() ) {
fileLabel.setStyleName( "hiddenFileLabelSelected" );
} else {
fileLabel.setStyleName( "fileLabelSelected" ); //$NON-NLS-1$
}
selectedFileItems.add( fileLabel );
// if we do not break this loop, it will go forever! (we added an item)
break;
}
}
} else {
if ( file.isHidden() ) {
fileLabel.setStyleName( "hiddenFileLabel" ); //$NON-NLS-1$
} else {
fileLabel.setStyleName( "fileLabel" ); //$NON-NLS-1$
}
}
}
}
}
}
public void deselect() {
for ( int i = 0; i < filesList.getRowCount(); i++ ) {
FileItem item = (FileItem) filesList.getWidget( i, 0 );
RepositoryFile file = item.getRepositoryFile();
if ( file.isHidden() ) {
item.setStyleName( "hiddenFileLabel" ); //$NON-NLS-1$
} else {
item.setStyleName( "fileLabel" ); //$NON-NLS-1$
}
}
}
public List<FileItem> getSelectedFileItems() {
return selectedFileItems;
}
public void setSelectedFileItems( List<FileItem> fileItems ) {
// Deselect all prior selections
for ( FileItem fileItem : selectedFileItems ) {
RepositoryFile file = fileItem.getRepositoryFile();
if ( file.isHidden() ) {
fileItem.setStyleName( "hiddenFileLabel" );
} else {
fileItem.setStyleName( "fileLabel" );
}
}
// clear the prior selections list
selectedFileItems.clear();
// Add all the new items
selectedFileItems.addAll( fileItems );
// and make sure they're selected
for ( FileItem fileItem : selectedFileItems ) {
RepositoryFile file = fileItem.getRepositoryFile();
if ( file.isHidden() ) {
fileItem.setStyleName( "hiddenFileLabelSelected" );
} else {
fileItem.setStyleName( "fileLabelSelected" );
}
}
}
public void selectNextItem( List<FileItem> currentItems ) {
if ( currentItems == null || currentItems.size() < 1 ) {
return;
}
FileItem currentItem = currentItems.get( currentItems.size() - 1 );
RepositoryFile currentRepositoryFile = currentItem.getRepositoryFile();
int myIndex = -1;
for ( int i = 0; i < getFileCount(); i++ ) {
FileItem fileItem = getFileItem( i );
if ( fileItem == currentItem ) {
myIndex = i;
}
}
if ( myIndex >= 0 && myIndex < getFileCount() - 1 ) {
if ( currentRepositoryFile.isHidden() ) {
currentItem.setStyleName( "hiddenFileLabel" ); //$NON-NLS-1$
} else {
currentItem.setStyleName( "fileLabel" ); //$NON-NLS-1$
}
FileItem nextItem = getFileItem( myIndex + 1 );
RepositoryFile nextRepositoryFile = nextItem.getRepositoryFile();
if ( nextRepositoryFile.isHidden() ) {
nextItem.setStyleName( "hiddenFileLabelSelected" ); //$NON-NLS-1$
} else {
nextItem.setStyleName( "fileLabelSelected" ); //$NON-NLS-1$
}
List<FileItem> fileItems = new ArrayList<FileItem>();
fileItems.add( nextItem );
setSelectedFileItems( fileItems );
nextItem.fireFileSelectionEvent();
}
}
public void selectPreviousItem( List<FileItem> currentItems ) {
if ( currentItems == null || currentItems.size() < 1 ) {
return;
}
FileItem currentItem = currentItems.get( 0 );
RepositoryFile currentRepositoryFile = currentItem.getRepositoryFile();
int myIndex = -1;
for ( int i = 0; i < getFileCount(); i++ ) {
FileItem fileItem = getFileItem( i );
if ( fileItem == currentItem ) {
myIndex = i;
}
}
if ( myIndex > 0 && myIndex < getFileCount() ) {
if ( currentRepositoryFile.isHidden() ) {
currentItem.setStyleName( "hiddenFileLabel" ); //$NON-NLS-1$
} else {
currentItem.setStyleName( "fileLabel" ); //$NON-NLS-1$
}
FileItem previousItem = getFileItem( myIndex - 1 );
RepositoryFile previousCurrentRepositoryFile = previousItem.getRepositoryFile();
if ( previousCurrentRepositoryFile.isHidden() ) {
previousItem.setStyleName( "hiddenFileLabelSelected" ); //$NON-NLS-1$
} else {
previousItem.setStyleName( "fileLabelSelected" ); //$NON-NLS-1$
}
List<FileItem> fileItems = new ArrayList<FileItem>();
fileItems.add( previousItem );
setSelectedFileItems( fileItems );
previousItem.fireFileSelectionEvent();
}
}
public FileItem getFileItem( int index ) {
return (FileItem) filesList.getWidget( index, 0 );
}
public List<FileItem> getAllFileItems() {
List<FileItem> value = new ArrayList<FileItem>();
for ( int i = 0; i < getFileCount(); i++ ) {
FileItem fileItem = getFileItem( i );
if ( fileItem != null ) {
value.add( getFileItem( i ) );
}
}
return value;
}
public int getFileItemIndex( FileItem fileItem ) {
int value = -1; // default to not found
for ( int i = 0; i < getFileCount(); i++ ) {
FileItem testItem = getFileItem( i );
if ( fileItem == testItem ) {
value = i;
break;
}
}
return value;
}
/**
* @return
*/
public int getFileCount() {
return filesList.getRowCount();
}
/**
* @return
*/
public Toolbar getToolbar() {
return toolbar;
}
public void onFetchRepositoryFileTree( RepositoryFileTree fileTree, List<RepositoryFile> trashItems ) {
// TODO Auto-generated method stub
}
public List<RepositoryFile> getRepositoryFiles() {
List<FileItem> fileItems = getSelectedFileItems();
List<RepositoryFile> values = new ArrayList<RepositoryFile>();
if ( fileItems != null && fileItems.size() > 0 ) {
for ( FileItem fileItem : fileItems ) {
values.add( fileItem.getRepositoryFile() );
}
}
return values;
}
}