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

Java tutorial

Introduction

Here is the source code for org.pentaho.mantle.client.solutionbrowser.filelist.FileItem.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.event.dom.client.HasAllMouseHandlers;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseMoveHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.event.dom.client.MouseWheelHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PopupPanel;
import org.pentaho.gwt.widgets.client.filechooser.RepositoryFile;
import org.pentaho.gwt.widgets.client.utils.ElementUtils;
import org.pentaho.mantle.client.images.ImageUtil;
import org.pentaho.mantle.client.solutionbrowser.FileTypeEnabledOptions;
import org.pentaho.mantle.client.solutionbrowser.IFileSummary;
import org.pentaho.mantle.client.solutionbrowser.MantlePopupPanel;
import org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel;
import org.pentaho.mantle.client.solutionbrowser.filelist.FileCommand.COMMAND;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

public class FileItem extends FlexTable implements HasAllMouseHandlers, IFileSummary {

    public static final String ANALYSIS_VIEW_SUFFIX = ".analysisview.xaction"; //$NON-NLS-1$
    public static final String XACTION_SUFFIX = ".xaction"; //$NON-NLS-1$
    public static final String URL_SUFFIX = ".url"; //$NON-NLS-1$

    // by creating a single popupMenu, we're reducing total # of widgets used
    // and we can be sure to hide any existing ones by calling hide
    static PopupPanel popupMenu = new MantlePopupPanel(true);

    private Label fileLabel = new Label();
    private FilesListPanel filesListPanel;
    private RepositoryFile repositoryFile;
    private ArrayList<IFileItemListener> listeners = new ArrayList<IFileItemListener>();
    private FileTypeEnabledOptions options;
    private String url;
    private String iconStr;
    private Image dropIndicator = ImageUtil.getThemeableImage("icon-small", "icon-drop-invalid");
    private boolean canDrop = false;

    public FileItem(RepositoryFile repositoryFile, FilesListPanel filesListPanel, FileTypeEnabledOptions options,
            boolean supportsACLs, String fileIconStr) {

        this.filesListPanel = filesListPanel;
        this.iconStr = fileIconStr;

        sinkEvents(Event.ONCLICK | Event.ONDBLCLICK | Event.ONMOUSEUP);
        DOM.setElementAttribute(getElement(), "oncontextmenu", "return false;"); //$NON-NLS-1$ //$NON-NLS-2$
        DOM.setElementAttribute(popupMenu.getElement(), "oncontextmenu", "return false;"); //$NON-NLS-1$ //$NON-NLS-2$

        fileLabel.setWordWrap(false);
        fileLabel.setText(repositoryFile.getTitle());
        String description = repositoryFile.getDescription();
        if (description == null) {
            description = repositoryFile.getTitle();
        }
        fileLabel.setTitle(description);
        if (repositoryFile.isHidden()) {
            setStyleName("hiddenFileLabel"); //$NON-NLS-1$
        } else {
            setStyleName("fileLabel"); //$NON-NLS-1$
        }

        setCellPadding(0);
        setCellSpacing(0);
        ElementUtils.preventTextSelection(fileLabel.getElement());
        String name = repositoryFile.getName();
        Image fileIcon = new Image();
        if (fileIconStr != null) {
            fileIcon.setUrl(fileIconStr);
        } else if (name.endsWith(ANALYSIS_VIEW_SUFFIX)) {
            fileIcon = ImageUtil.getThemeableImage("icon-small", "icon-analysis");
        } else if (name.endsWith(XACTION_SUFFIX)) {
            fileIcon = ImageUtil.getThemeableImage("icon-small", "icon-xaction");
        } else if (name.endsWith(URL_SUFFIX)) {
            fileIcon = ImageUtil.getThemeableImage("icon-small", "icon-url");
        } else {
            fileIcon = ImageUtil.getThemeableImage("icon-small", "icon-file");
        }
        fileIcon.setWidth("16px"); //$NON-NLS-1$
        fileLabel.setWidth("100%"); //$NON-NLS-1$
        setWidget(0, 0, fileIcon);
        getCellFormatter().setWidth(0, 0, "16px"); //$NON-NLS-1$
        setWidget(0, 1, fileLabel);
        getCellFormatter().setWidth(0, 1, "100%"); //$NON-NLS-1$
        this.options = options;
        this.repositoryFile = repositoryFile;
    }

    public void select() {
        if (filesListPanel.getSelectedFileItems().contains(this)) {
            return;
        } else {
            if (this.getStyleName().equalsIgnoreCase("fileLabelCut")) {
                this.setStyleName("fileLabelCutSelected");
            } else {
                if (repositoryFile.isHidden()) {
                    this.setStyleName("hiddenFileLabelSelected"); //$NON-NLS-1$
                } else {
                    this.setStyleName("fileLabelSelected"); //$NON-NLS-1$
                }
            }
            filesListPanel.getSelectedFileItems().add(this); // and add it to the list of selected files.
        }
    }

    public void deselect() {
        if (!filesListPanel.getSelectedFileItems().contains(this)) {
            return;
        } else {
            if (this.getStyleName().equalsIgnoreCase("fileLabelCutSelected")) {
                this.setStyleName("fileLabelCut");
            } else {
                if (repositoryFile.isHidden()) {
                    this.setStyleName("hiddenFileLabel"); //$NON-NLS-1$
                } else {
                    this.setStyleName("fileLabel"); //$NON-NLS-1$
                }
            }
            filesListPanel.getSelectedFileItems().remove(this); // Remove it from the selected list
        }
    }

    public void toggleSelect(Boolean addSelection, Boolean extendSelection) {
        if (extendSelection) {
            extendSelection();
            return;
        }
        if (addSelection) {
            Boolean isSelected = filesListPanel.getSelectedFileItems().contains(this);
            if (isSelected) { // then toggle it to not selected
                deselect();
            } else {
                select();
            }
        } else {
            for (FileItem fileItem : filesListPanel.getAllFileItems()) { // Set all the file Items to a unselected
                                                                         // style
                fileItem.deselect();
            }
            filesListPanel.getSelectedFileItems().clear(); // Remove all the files from the selected list
            select();
        }
    }

    private void extendSelection() {
        if (filesListPanel.getSelectedFileItems() == null || filesListPanel.getSelectedFileItems().size() < 1) { // nothing is selected so do a simple select
            toggleSelect(false, false);
        } else {
            int currentItemIndex = filesListPanel.getFileItemIndex(this);
            int maxSelectedIndex = -1;
            int minSelectedIndex = filesListPanel.getFileCount() - 1;

            for (int i = 0; i < filesListPanel.getSelectedFileItems().size(); i++) {
                FileItem testItem = filesListPanel.getSelectedFileItems().get(i);
                int textIdx = filesListPanel.getFileItemIndex(testItem);
                maxSelectedIndex = Math.max(maxSelectedIndex, textIdx);
                minSelectedIndex = Math.min(minSelectedIndex, textIdx);
            }

            boolean forwardSelect = currentItemIndex > maxSelectedIndex;
            int startIdx;
            int endIdx;
            if (forwardSelect) {
                startIdx = maxSelectedIndex + 1;
                endIdx = currentItemIndex;
            } else {
                startIdx = currentItemIndex;
                endIdx = minSelectedIndex - 1;
            }
            for (int i = startIdx; i <= endIdx; i++) {
                filesListPanel.getFileItem(i).toggleSelect(true, false);
            }
        }
    }

    public void onBrowserEvent(Event event) {
        Boolean metaKeyDown = DOM.eventGetMetaKey(event) || DOM.eventGetCtrlKey(event);
        Boolean shiftKeyDown = DOM.eventGetShiftKey(event);
        if ((DOM.eventGetType(event) & Event.ONDBLCLICK) == Event.ONDBLCLICK) {
            toggleSelect(false, false);
            FileItem selectedFileItem = filesListPanel.getSelectedFileItems().get(0);
            if (!selectedFileItem.isInTrash()) {
                SolutionBrowserPanel.getInstance()
                        .openFile(filesListPanel.getSelectedFileItems().get(0).getRepositoryFile(), COMMAND.RUN);
            }
        } else if ((DOM.eventGetType(event) & Event.ONCLICK) == Event.ONCLICK) {
            toggleSelect(metaKeyDown, shiftKeyDown);
            fireFileSelectionEvent();
        }
        super.onBrowserEvent(event);
    }

    public boolean isCommandEnabled(COMMAND command, HashMap<String, String> metadataPerms) {
        return options != null && options.isCommandEnabled(command, metadataPerms);
    }

    public String getName() {
        return this.repositoryFile.getName();
    }

    public void setName(String name) {
        this.repositoryFile.setName(name);
    }

    public Date getLastModifiedDate() {
        return this.repositoryFile.getLastModifiedDate();
    }

    public void setLastModifiedDate(Date lastModifiedDate) {
        this.repositoryFile.setLastModifiedDate(lastModifiedDate);
    }

    // TODO LocalizedName and NonLocalizedName is the same. Do we need this extra method in there

    public String getLocalizedName() {
        return repositoryFile.getTitle();
    }

    public void setLocalizedName(String localizedName) {
        this.repositoryFile.setTitle(localizedName);
    }

    public RepositoryFile getRepositoryFile() {
        return repositoryFile;
    }

    public void setRepositoryFile(RepositoryFile repositoryFile) {
        this.repositoryFile = repositoryFile;
    }

    public void fireFileSelectionEvent() {
        for (IFileItemListener listener : listeners) {
            listener.itemSelected(this);
        }
    }

    public void addFileSelectionChangedListener(IFileItemListener listener) {
        listeners.add(listener);
    }

    public void removeFileSelectionChangedListener(IFileItemListener listener) {
        listeners.remove(listener);
    }

    public String getPath() {
        return this.repositoryFile.getPath();
    }

    public String getURL() {
        return url;
    }

    public void setURL(String url) {
        this.url = url;
    }

    public String getIcon() {
        return this.iconStr;
    }

    /**
     * DND required methods below
     */
    public HandlerRegistration addMouseUpHandler(MouseUpHandler handler) {
        return addDomHandler(handler, MouseUpEvent.getType());
    }

    public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) {
        return addDomHandler(handler, MouseOutEvent.getType());
    }

    public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) {
        return addDomHandler(handler, MouseMoveEvent.getType());
    }

    public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) {
        return addDomHandler(handler, MouseWheelEvent.getType());
    }

    public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) {
        return addDomHandler(handler, MouseOverEvent.getType());
    }

    public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
        return addDomHandler(handler, MouseDownEvent.getType());
    }

    public FileItem makeDragProxy() {
        FileItem f = new FileItem(getRepositoryFile(), filesListPanel, options, false, getIcon());
        f.enableDrag();
        return f;
    }

    public void enableDrag() {
        setWidget(0, 0, dropIndicator);
        addStyleName("fileItemDragProxy"); //$NON-NLS-1$
        setDroppable(false);
        dropIndicator.removeStyleName("icon-drop-valid");
        dropIndicator.addStyleName("icon-drop-invalid");

    }

    public void setDroppable(boolean canDrop) {
        if (this.canDrop == canDrop) {
            return;
        }
        if (canDrop) {

            dropIndicator.addStyleName("icon-drop-valid");
            dropIndicator.removeStyleName("icon-drop-invalid");
            addStyleName("validDrop"); //$NON-NLS-1$
        } else {
            dropIndicator.removeStyleName("icon-drop-valid");
            dropIndicator.addStyleName("icon-drop-invalid");
            removeStyleName("validDrop"); //$NON-NLS-1$
        }

        this.canDrop = canDrop;
    }

    public boolean isInTrash() {
        return repositoryFile.getPath().contains("/.trash/pho:");
    }

}