org.pentaho.mantle.client.solutionbrowser.filelist.FilesListPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.solutionbrowser.filelist.FilesListPanel.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.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(" ", "&nbsp;");
                        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;
    }

}