net.leboxondelex.daplomb.ui.viewers.FileViewer.java Source code

Java tutorial

Introduction

Here is the source code for net.leboxondelex.daplomb.ui.viewers.FileViewer.java

Source

/*************************************************************************************************
 * Copyright (c) 2013, Lex @ le boxon de Lex: http://le-boxon-de-lex.fr
 *
 * This program is free software; you can redistribute it and/or modify it under the terms
 * of the GNU General Public License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program;
 * if not, see <http://www.gnu.org/licenses>.
 *
 * Additional permission under GNU GPL version 3 section 7
 *
 * If you modify this Program, or any covered work, by linking or combining it with Eclipse (or
 * a modified version of that library), containing parts covered by the terms of Eclipse Public
 * License (EPL), the licensors of this Program grant you additional permission to convey the
 * resulting work. Corresponding Source for a non-source form of such a combination shall include
 * the source code for the parts of D'Aplomb used as well as that of the covered work.
 ***************************************************************************************************/

package net.leboxondelex.daplomb.ui.viewers;

import java.io.File;

import net.leboxondelex.daplomb.managers.ResourceRegistry;
import net.leboxondelex.daplomb.translations.Messages;
import net.leboxondelex.daplomb.utils.LogUtils;
import net.leboxondelex.daplomb.utils.StringUtils;
import net.leboxondelex.daplomb.utils.Utils;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.TableColumn;

/**
 * @author Lex
 */
public class FileViewer {

    private TableViewer tableViewer;
    private String filter = ""; //$NON-NLS-1$
    private boolean sortByName = true, sortNameAscending = true, sortSizeAscending = true;

    /**
     * Constructor.
     * @param container
     * @param verticalIndent
     */
    public FileViewer(final Composite container, int verticalIndent) {

        this.tableViewer = new TableViewer(container, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
        GridData layoutData = new GridData(GridData.FILL_BOTH);
        layoutData.verticalIndent = verticalIndent;
        this.tableViewer.getTable().setLayoutData(layoutData);
        this.tableViewer.getTable().setHeaderVisible(true);

        // Editing support on double-click
        TableViewerEditor.create(this.tableViewer,
                new DoubleClickColumnViewerEditorActivationStrategy(this.tableViewer), ColumnViewerEditor.DEFAULT);

        // Columns
        new TableColumn(this.tableViewer.getTable(), SWT.CENTER).setText(""); //$NON-NLS-1$
        TableViewerColumn col = new TableViewerColumn(this.tableViewer, SWT.LEFT);
        col.getColumn().setText(Messages.getString("FileViewer.2")); //$NON-NLS-1$
        col.setEditingSupport(new FileNameEditingSupport(this.tableViewer));
        col.getColumn().addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                if (FileViewer.this.sortByName)
                    switchSortingDirection();
                else
                    setSortByName(true);
            }
        });

        col = new TableViewerColumn(this.tableViewer, SWT.CENTER);
        col.getColumn().setText(Messages.getString("FileViewer.3")); //$NON-NLS-1$
        col.getColumn().addListener(SWT.Selection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                if (!FileViewer.this.sortByName)
                    switchSortingDirection();
                else
                    setSortByName(false);
            }
        });

        // Define the layout of the table
        TableLayout tlayout = new TableLayout();
        tlayout.addColumnData(new ColumnPixelData(25, true));
        tlayout.addColumnData(new ColumnWeightData(55, 300, true));
        tlayout.addColumnData(new ColumnWeightData(40, 100, true));
        this.tableViewer.getTable().setLayout(tlayout);

        // Content provider
        this.tableViewer.setContentProvider(new ArrayContentProvider());

        // Label provider
        this.tableViewer.setLabelProvider(new ITableLabelProvider() {
            @Override
            public void removeListener(ILabelProviderListener arg0) {
                // nothing
            }

            @Override
            public boolean isLabelProperty(Object arg0, String arg1) {
                return false;
            }

            @Override
            public void dispose() {
                // nothing
            }

            @Override
            public void addListener(ILabelProviderListener arg0) {
                // nothing
            }

            @Override
            public String getColumnText(Object element, int colmnIndex) {
                String result;
                if (colmnIndex == 1)
                    result = ((File) element).getName();
                else {
                    long size = ((File) element).length();
                    result = Utils.formatFileSize(size) + Messages.getString("FileViewer.4"); //$NON-NLS-1$
                }

                return result;
            }

            @Override
            public Image getColumnImage(Object element, int colmnIndex) {
                Image result = null;
                if (colmnIndex == 0 && element instanceof File) {
                    String ext = StringUtils.getFileExtension((File) element);
                    result = ResourceRegistry.findFileImage(ext);
                }

                return result;
            }
        });

        // Sorter
        this.tableViewer.setSorter(new ViewerSorter() {
            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {

                int result;
                boolean f1 = e1 instanceof File;
                boolean f2 = e2 instanceof File;
                if (!f1)
                    result = -1;
                else if (!f2)
                    result = 1;
                else {
                    if (FileViewer.this.sortByName) {
                        if (FileViewer.this.sortNameAscending)
                            result = ((File) e1).getName().compareTo(((File) e2).getName());
                        else
                            result = ((File) e2).getName().compareTo(((File) e1).getName());
                    } else {
                        if (FileViewer.this.sortSizeAscending)
                            result = (int) (((File) e1).length() - ((File) e2).length());
                        else
                            result = (int) (((File) e2).length() - ((File) e1).length());
                    }
                }

                return result;
            }
        });

        // Filter
        this.tableViewer.addFilter(new ViewerFilter() {
            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                boolean shown = true;
                if (!StringUtils.isEmpty(FileViewer.this.filter))
                    shown = ((File) element).getName().toLowerCase().contains(FileViewer.this.filter);

                return shown;
            }
        });

        // Pop-up menu
        final IAction renameAction = new Action(Messages.getString("FileViewer.5")) { //$NON-NLS-1$
            @Override
            public void run() {
                Object o = ((IStructuredSelection) FileViewer.this.tableViewer.getSelection()).getFirstElement();
                final File imgFile = (File) o;
                if (Utils.openRenameDialog(imgFile, container.getShell()))
                    FileViewer.this.tableViewer.update(imgFile, null);
            }
        };

        final IAction deleteAction = new Action(Messages.getString("FileViewer.12")) { //$NON-NLS-1$
            @Override
            public void run() {
                boolean del = Utils.showQuestion(container.getShell(), Messages.getString("FileViewer.13"), //$NON-NLS-1$
                        Messages.getString("FileViewer.14")); //$NON-NLS-1$

                Object o = ((IStructuredSelection) FileViewer.this.tableViewer.getSelection()).getFirstElement();
                final File imgFile = (File) o;
                if (del && imgFile.exists() && !imgFile.delete()) {

                    StringBuilder sb = new StringBuilder();
                    sb.append("Could not delete file "); //$NON-NLS-1$
                    sb.append(imgFile);
                    LogUtils.log(sb.toString());
                }
            }
        };

        MenuManager popupMenu = new MenuManager();
        popupMenu.add(renameAction);
        popupMenu.add(deleteAction);

        Menu menu = popupMenu.createContextMenu(this.tableViewer.getTable());
        this.tableViewer.getTable().setMenu(menu);
    }

    /**
     * @return the tableViewer
     */
    public TableViewer getTableViewer() {
        return this.tableViewer;
    }

    /**
     * @param directory
     */
    public void setDirectory(File directory) {
        this.tableViewer.setInput(Utils.findImageFiles(directory));
        this.tableViewer.refresh();
    }

    /**
     * @param filter the filter to set
     */
    public void setFilter(String filter) {
        this.filter = filter;
        this.tableViewer.refresh();
    }

    /**
     * @param sortByName the sortByName to set
     */
    public void setSortByName(boolean sortByName) {
        this.sortByName = sortByName;
        this.tableViewer.refresh();
    }

    /**
     *
     */
    public void switchSortingDirection() {
        if (this.sortByName)
            this.sortNameAscending = !this.sortNameAscending;
        else
            this.sortSizeAscending = !this.sortSizeAscending;

        this.tableViewer.refresh();
    }

    /**
     * Editing support to rename files in the table.
     */
    private static class FileNameEditingSupport extends EditingSupport {

        private final TableViewer viewer;

        public FileNameEditingSupport(TableViewer viewer) {
            super(viewer);
            this.viewer = viewer;
        }

        @Override
        protected CellEditor getCellEditor(Object element) {
            return new TextCellEditor(this.viewer.getTable());
        }

        @Override
        protected boolean canEdit(Object element) {
            return true;
        }

        @Override
        protected Object getValue(Object element) {
            return ((File) element).getName();
        }

        @Override
        protected void setValue(Object element, Object value) {
            File currentFile = ((File) element);
            String s = String.valueOf(value);
            if (!Utils.hasImageExtension(s))
                return;

            File targetFile = new File(currentFile.getParent(), s);
            if (!targetFile.exists() && currentFile.renameTo(targetFile))
                this.viewer.update(element, null);
        }
    }

    /**
     * Make editing support work on double-click and not a simple one.
     */
    private static class DoubleClickColumnViewerEditorActivationStrategy
            extends ColumnViewerEditorActivationStrategy {
        public DoubleClickColumnViewerEditorActivationStrategy(ColumnViewer viewer) {
            super(viewer);
        }

        @Override
        protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
            return ((IStructuredSelection) getViewer().getSelection()).size() == 1
                    && (event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                            || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
                            || event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL);
        }
    }
}