com.bdaum.zoom.ui.internal.views.TrashcanView.java Source code

Java tutorial

Introduction

Here is the source code for com.bdaum.zoom.ui.internal.views.TrashcanView.java

Source

/*
 * This file is part of the ZoRa project: http://www.photozora.org.
 *
 * ZoRa 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 2 of the License, or
 * (at your option) any later version.
 *
 * ZoRa 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 ZoRa; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * (c) 2009-2018 Berthold Daum  
 */

package com.bdaum.zoom.ui.internal.views;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.nebula.widgets.gallery.GalleryItem;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;

import com.bdaum.zoom.cat.model.asset.Asset;
import com.bdaum.zoom.core.Core;
import com.bdaum.zoom.core.QueryField;
import com.bdaum.zoom.core.trash.HistoryItem;
import com.bdaum.zoom.core.trash.Trash;
import com.bdaum.zoom.job.OperationJob;
import com.bdaum.zoom.operations.internal.EmptyTrashOperation;
import com.bdaum.zoom.operations.internal.RestoreOperation;
import com.bdaum.zoom.ui.dialogs.AcousticMessageDialog;
import com.bdaum.zoom.ui.internal.HelpContextIds;
import com.bdaum.zoom.ui.internal.Icons;
import com.bdaum.zoom.ui.internal.UiActivator;
import com.bdaum.zoom.ui.internal.UiConstants;
import com.bdaum.zoom.ui.internal.actions.ZoomActionFactory;

@SuppressWarnings("restriction")
public class TrashcanView extends LightboxView {

    private final class TrashGalleryPaintListener implements Listener {
        private final LightboxGalleryItemRenderer ir;

        private TrashGalleryPaintListener(LightboxGalleryItemRenderer ir) {
            this.ir = ir;
        }

        public void handleEvent(Event e) {
            GalleryItem item = (GalleryItem) e.item;
            if (item.isDisposed() || item.getImage() == null)
                return;
            Trash trash = (Trash) item.getData(UiConstants.TRASH);
            if (trash == null)
                return;
            if (item.getImage().isDisposed())
                item.setImage(getImage(trash.getAsset()));
            boolean isSelected = false;
            if (selection != null)
                for (Iterator<?> iterator = selection.iterator(); !isSelected && iterator.hasNext();)
                    isSelected = iterator.next() == trash;
            ir.setSelected(isSelected);
            ir.draw(e.gc, item, e.index, e.x, e.y, e.width, e.height);
        }
    }

    public static final String ID = "com.bdaum.zoom.ui.views.TrashcanView"; //$NON-NLS-1$

    private static final GalleryItem[] EMPTYITEMS = new GalleryItem[0];

    private Action restoreAction;
    private Action emptyTrashcanAction;
    private List<Trash> trashSet;
    private IAction sortModeAction;
    protected boolean sortMode;

    private Action removeAction;

    public TrashcanView() {
        thumbsize = 96;
        folding = false;
    }

    @Override
    protected void addGalleryPaintListener() {
        gallery.addListener(SWT.PaintItem, new TrashGalleryPaintListener(itemRenderer));
    }

    @Override
    public boolean assetsChanged() {
        return true;
    }

    @Override
    protected void setHelp(int orientation) {
        PlatformUI.getWorkbench().getHelpSystem().setHelp(gallery, HelpContextIds.TRASHCAN_VIEW);
    }

    @Override
    protected void hookSelectionService() {
        // do nothing
    }

    @Override
    protected void addDragDropSupport() {
        // do nothing
    }

    @Override
    protected void hookDoubleClickAction(Control control) {
        // do nothing
    }

    @Override
    protected void addMouseListener() {
        // do nothing
    }

    @Override
    public void assetsModified(Collection<? extends Asset> assets, QueryField node) {
        if (node == null) {
            Shell shell = getSite().getShell();
            if (!shell.isDisposed())
                shell.getDisplay().asyncExec(() -> {
                    if (!shell.isDisposed())
                        refresh();
                });
        }
    }

    @Override
    public void catalogModified() {
        Shell shell = getSite().getShell();
        if (!shell.isDisposed())
            shell.getDisplay().asyncExec(() -> {
                if (!shell.isDisposed()) {
                    refresh();
                    updateActions(false);
                }
            });
    }

    @Override
    public void keyReleased(KeyEvent e) {
        switch (e.character) {
        case SWT.TAB:
        case '+':
        case '-':
            super.keyReleased(e);
            break;
        }
    }

    @Override
    protected void makeActions(IActionBars bars) {
        createScaleContributionItem(MINTHUMBSIZE, MAXTHUMBSIZE);
        selectionActionCluster = ZoomActionFactory.createSelectionActionCluster(this, this);

        sortModeAction = new Action(Messages.getString("TrashcanView.sort_by_name"), IAction.AS_CHECK_BOX) { //$NON-NLS-1$
            @Override
            public void run() {
                sortMode = isChecked();
                if (isChecked()) {
                    sortModeAction.setText(Messages.getString("TrashcanView.sort_by_date")); //$NON-NLS-1$
                    sortModeAction.setToolTipText(Messages.getString("TrashcanView.sort_items_by_deletion_date")); //$NON-NLS-1$
                } else {
                    sortModeAction.setText(Messages.getString("TrashcanView.sort_by_name")); //$NON-NLS-1$
                    sortModeAction.setToolTipText(Messages.getString("TrashcanView.sort_items_by_name")); //$NON-NLS-1$
                }
                redrawCollection(null, null);
            }
        };
        sortModeAction.setToolTipText(Messages.getString("TrashcanView.sort_items_by_name")); //$NON-NLS-1$
        sortModeAction.setImageDescriptor(Icons.alphab_sort.getDescriptor());

        restoreAction = new Action(Messages.getString("TrashcanView.restore"), //$NON-NLS-1$
                Icons.trashrestoreSmall.getDescriptor()) {
            @Override
            public void run() {
                if (selection != null && selection.getFirstElement() instanceof HistoryItem)
                    OperationJob.executeOperation(
                            new RestoreOperation(selection2Trash(),
                                    UiActivator.getDefault().createImportConfiguration(TrashcanView.this)),
                            TrashcanView.this);
            }
        };
        restoreAction.setToolTipText(Messages.getString("TrashcanView.restore_selected_items")); //$NON-NLS-1$
        removeAction = new Action(Messages.getString("TrashcanView.remove"), Icons.delete.getDescriptor()) { //$NON-NLS-1$
            @Override
            public void run() {
                if (selection != null && selection.getFirstElement() instanceof HistoryItem)
                    if (AcousticMessageDialog.openQuestion(getViewSite().getShell(),
                            Messages.getString("TrashcanView.remove_trash"), //$NON-NLS-1$
                            Messages.getString("TrashcanView.really_remove"))) //$NON-NLS-1$
                        OperationJob.executeOperation(new EmptyTrashOperation(selection2Trash()),
                                TrashcanView.this);
            }

        };
        removeAction.setToolTipText(Messages.getString("TrashcanView.remove_tooltip")); //$NON-NLS-1$

        emptyTrashcanAction = new Action(Messages.getString("TrashcanView.empty_trashcan"), Icons.cleartrash //$NON-NLS-1$
                .getDescriptor()) {
            @Override
            public void run() {
                OperationJob.executeOperation(new EmptyTrashOperation(), TrashcanView.this);
            }
        };
        emptyTrashcanAction.setToolTipText(Messages.getString("TrashcanView.clear_trashcan_and_delete_all")); //$NON-NLS-1$
    }

    protected Trash[] selection2Trash() {
        Trash[] hist = new Trash[selection.size()];
        int i = 0;
        for (Iterator<?> it = selection.iterator(); it.hasNext();)
            hist[i++] = (Trash) it.next();
        return hist;
    }

    @Override
    public void updateActions(boolean force) {
        if (restoreAction != null && (isVisible() || force)) {
            restoreAction.setEnabled(gallery.getSelection().length > 0 && !dbIsReadonly());
            emptyTrashcanAction.setEnabled(trashSet != null && !trashSet.isEmpty());
        }
    }

    @Override
    public void fillLocalToolBar(IToolBarManager manager) {
        manager.add(sortModeAction);
        manager.add(new Separator());
        manager.add(restoreAction);
        manager.add(emptyTrashcanAction);
        manager.add(scaleContributionItem);
    }

    @Override
    protected void fillLocalPullDown(IMenuManager manager) {
        manager.add(sortModeAction);
        manager.add(new Separator());
        manager.add(restoreAction);
        manager.add(emptyTrashcanAction);
        manager.add(new Separator());
        selectionActionCluster.addToMenuManager(manager);
    }

    @Override
    protected void fillContextMenu(IMenuManager manager) {
        updateActions(true);
        if (!dbIsReadonly()) {
            manager.add(restoreAction);
            manager.add(removeAction);
        }
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    @Override
    public void widgetSelected(SelectionEvent e) {
        GalleryItem[] sel = gallery.getSelection();
        HistoryItem[] items = new HistoryItem[sel.length];
        for (int i = 0; i < sel.length; i++)
            items[i] = (HistoryItem) sel[i].getData(UiConstants.TRASH);
        selection = new StructuredSelection(items);
        fireSelection();
    }

    @Override
    public void selectAll() {
        BusyIndicator.showWhile(getSite().getShell().getDisplay(), () -> {
            GalleryItem group = gallery.getItem(0);
            GalleryItem[] items = group.getItems();
            HistoryItem[] hist = new HistoryItem[items.length];
            for (int i = 0; i < items.length; i++)
                hist[i] = (HistoryItem) items[i].getData(UiConstants.TRASH);
            gallery.setSelection(items);
            if (items.length > 0)
                gallery.showItem(items[0]);
            selection = new StructuredSelection(hist);
        });
    }

    @Override
    public void selectNone() {
        gallery.setSelection(EMPTYITEMS);
        selection = StructuredSelection.EMPTY;
    }

    @Override
    public void revertSelection() {
        GalleryItem[] selectedItems = gallery.getSelection();
        GalleryItem group = gallery.getItem(0);
        GalleryItem[] items = group.getItems();
        Set<GalleryItem> all = new HashSet<>(Arrays.asList(items));
        for (GalleryItem galleryItem : selectedItems)
            all.remove(galleryItem);
        GalleryItem[] newItems = all.toArray(new GalleryItem[all.size()]);
        HistoryItem[] hist = new HistoryItem[newItems.length];
        for (int i = 0; i < newItems.length; i++)
            hist[i] = (HistoryItem) newItems[i].getData(UiConstants.TRASH);
        gallery.setSelection(newItems);
        if (newItems.length > 0)
            gallery.showItem(newItems[0]);
        selection = new StructuredSelection(hist);
    }

    @Override
    public void select(int type, boolean shift, boolean alt) {
        GalleryItem[] newItems;
        if (alt || shift) {
            GalleryItem[] selectedItems = gallery.getSelection();
            Set<GalleryItem> currentSelection = new HashSet<>(Arrays.asList(selectedItems));
            if (alt)
                currentSelection.removeAll(select(type));
            else
                currentSelection.addAll(select(type));
            newItems = currentSelection.toArray(new GalleryItem[currentSelection.size()]);
        } else {
            List<GalleryItem> select = select(type);
            newItems = select.toArray(new GalleryItem[select.size()]);
        }
        HistoryItem[] hist = new HistoryItem[newItems.length];
        for (int i = 0; i < newItems.length; i++)
            hist[i] = (HistoryItem) newItems[i].getData(UiConstants.TRASH);
        gallery.setSelection(newItems);
        if (newItems.length > 0)
            gallery.showItem(newItems[0]);
        selection = new StructuredSelection(hist);
    }

    private List<GalleryItem> select(int type) {
        GalleryItem group = gallery.getItem(0);
        GalleryItem[] items = group.getItems();
        List<GalleryItem> result = new ArrayList<>(items.length);
        for (GalleryItem item : items) {
            Trash trash = (Trash) item.getData(UiConstants.TRASH);
            Asset asset = trash.getAsset();
            if (asset != null && testAsset(type, asset))
                result.add(item);
        }
        return result;
    }

    @Override
    public boolean redrawCollection(Collection<? extends Asset> assets, QueryField node) {
        if (gallery == null || gallery.isDisposed())
            return false;
        trashSet = Core.getCore().getDbManager().obtainTrash(sortMode);
        gallery.clearAll();
        gallery.redraw();
        return true;
    }

    @Override
    public void handleEvent(Event event) {
        final GalleryItem item = (GalleryItem) event.item;
        if (item.getParentItem() == null)
            // It's a group
            item.setItemCount(trashSet == null ? 0 : trashSet.size());
        else {
            // It's an item
            int index = item.getParentItem().indexOf(item);
            Trash trashItem = trashSet.get(index);
            item.setImage(getImage(trashItem.getAsset()));
            item.setText(trashItem.getName());
            item.setData(UiConstants.TRASH, trashItem);
        }
    }

    @Override
    protected void updateStatusLine() {
        if (trashSet != null)
            setStatusMessage(NLS.bind(Messages.getString("AbstractGalleryView.n_images"), String //$NON-NLS-1$
                    .valueOf(trashSet.size()), String.valueOf(selection == null ? 0 : selection.size())), false);
    }

    @Override
    protected void editTitleArea(GalleryItem item, Rectangle bounds) {
        // Do nothing
    }

}