org.eclipse.ptp.internal.ui.views.AbstractParallelSetView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ptp.internal.ui.views.AbstractParallelSetView.java

Source

/*******************************************************************************
 * Copyright (c) 2005 The Regents of the University of California. 
 * This material was produced under U.S. Government contract W-7405-ENG-36 
 * for Los Alamos National Laboratory, which is operated by the University 
 * of California for the U.S. Department of Energy. The U.S. Government has 
 * rights to use, reproduce, and distribute this software. NEITHER THE 
 * GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR 
 * ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified 
 * to produce derivative works, such modified software should be clearly marked, 
 * so as not to confuse it with the version available from LANL.
 * 
 * Additionally, this program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * LA-CC 04-115
 *******************************************************************************/
package org.eclipse.ptp.internal.ui.views;

import java.util.ArrayList;
import java.util.BitSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.ptp.internal.ui.IElementManager;
import org.eclipse.ptp.internal.ui.IPTPUIConstants;
import org.eclipse.ptp.internal.ui.actions.ChangeSetAction;
import org.eclipse.ptp.internal.ui.actions.CreateSetAction;
import org.eclipse.ptp.internal.ui.actions.DeleteSetAction;
import org.eclipse.ptp.internal.ui.actions.DisplayRulerAction;
import org.eclipse.ptp.internal.ui.actions.ParallelAction;
import org.eclipse.ptp.internal.ui.actions.RemoveElementAction;
import org.eclipse.ptp.internal.ui.actions.ZoomInAction;
import org.eclipse.ptp.internal.ui.actions.ZoomOutAction;
import org.eclipse.ptp.internal.ui.model.IElementHandler;
import org.eclipse.ptp.internal.ui.model.IElementSet;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchActionConstants;

/**
 * @author Clement chu
 * 
 */
public abstract class AbstractParallelSetView extends AbstractParallelElementView {
    protected List<BitSet> clipboard = new ArrayList<BitSet>();

    // selected element
    protected String cur_selected_element_id = IElementManager.EMPTY_ID;
    // default actions
    protected ParallelAction createSetAction = null;
    protected ParallelAction deleteSetAction = null;
    protected ParallelAction deleteProcessAction = null;
    protected ParallelAction changeSetAction = null;
    protected ParallelAction zoomInAction = null;
    protected ParallelAction zoomOutAction = null;

    // zoom
    protected int zoom_depth = 0;
    protected Zoom zoom = new Zoom();

    // last action
    protected int last_action = -1;
    protected IElementSet last_element_set = null;

    public AbstractParallelSetView(IElementManager manager) {
        super(manager);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IWorkbenchPart#dispose()
     */
    @Override
    public void dispose() {
        clipboard.clear();
        super.dispose();
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets
     * .Composite)
     */
    @Override
    public void createPartControl(Composite parent) {
        super.createPartControl(parent);
        IToolBarManager toolBarMgr = getViewSite().getActionBars().getToolBarManager();
        createToolBarActionGroup(toolBarMgr);
        createToolBarActions(toolBarMgr);
        IMenuManager menuMgr = getViewSite().getActionBars().getMenuManager();
        createMenuActions(menuMgr);
        createContextMenu();
        initialView();
    }

    protected void createToolBarActionGroup(IToolBarManager toolBarMgr) {
        toolBarMgr.add(new Separator(IPTPUIConstants.IUIZOOMGROUP));
        toolBarMgr.add(new Separator(IPTPUIConstants.IUINAVIGATORGROUP));
        toolBarMgr.add(new Separator(IPTPUIConstants.IUIACTIONGROUP));
        toolBarMgr.add(new Separator(IPTPUIConstants.IUIEMPTYGROUP));

        toolBarMgr.add(new Separator(IPTPUIConstants.IUISETGROUP));
        toolBarMgr.add(new Separator(IPTPUIConstants.IUICHANGESETGROUP));
    }

    /**
     * Build-in Toolbar actions
     * 
     * @param toolBarMgr
     */
    protected void buildInToolBarActions(IToolBarManager toolBarMgr) {
        zoomOutAction = new ZoomOutAction(this);
        zoomInAction = new ZoomInAction(this);
        createSetAction = new CreateSetAction(this);
        deleteSetAction = new DeleteSetAction(this);
        deleteProcessAction = new RemoveElementAction(this);
        changeSetAction = new ChangeSetAction(this);

        toolBarMgr.appendToGroup(IPTPUIConstants.IUIZOOMGROUP, zoomOutAction);
        toolBarMgr.appendToGroup(IPTPUIConstants.IUIZOOMGROUP, zoomInAction);
        toolBarMgr.appendToGroup(IPTPUIConstants.IUISETGROUP, createSetAction);
        toolBarMgr.appendToGroup(IPTPUIConstants.IUISETGROUP, deleteSetAction);
        toolBarMgr.appendToGroup(IPTPUIConstants.IUISETGROUP, deleteProcessAction);
        toolBarMgr.appendToGroup(IPTPUIConstants.IUICHANGESETGROUP, changeSetAction);
    }

    /**
     * Create toolbar actions
     * 
     * @param toolBarMgr
     */
    protected void createToolBarActions(IToolBarManager toolBarMgr) {
        buildInToolBarActions(toolBarMgr);
    }

    /**
     * Create menu actions
     * 
     * @param menuMgr
     */
    protected void createMenuActions(IMenuManager menuMgr) {
    }

    /**
     * Create context menu
     * 
     */
    protected void createContextMenu() {
        MenuManager menuMgr = new MenuManager("#popupmenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(IMenuManager manager) {
                fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(canvas);
        canvas.setMenu(menu);
        // Be sure to register it so that other plug-ins can add actions.
        getSite().registerContextMenu(menuMgr, canvas);
    }

    /**
     * Create context menu
     * 
     * @param manager
     */
    protected void fillContextMenu(IMenuManager manager) {
        manager.add(new Separator(IPTPUIConstants.IUIACTIONGROUP));
        manager.add(new Separator(IPTPUIConstants.IUIEMPTYGROUP));
        manager.add(new Separator(IPTPUIConstants.IUIZOOMGROUP));
        manager.add(zoomOutAction);
        manager.add(zoomInAction);
        manager.add(new Separator(IPTPUIConstants.IUICHANGESETGROUP));
        manager.add(changeSetAction);
        manager.add(new Separator(IPTPUIConstants.IUIVIEWGROUP));
        manager.add(new DisplayRulerAction(this));
        // Other plug-ins can contribute there actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ptp.ui.views.AbstractParallelElementView#update()
     */
    @Override
    public void update() {
        updateAction();
        updateTitle();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ptp.ui.views.AbstractParallelElementView#updateTitle()
     */
    @Override
    public void updateTitle() {
        if (cur_element_set != null) {
            changeTitle(manager.getFullyQualifiedName(getCurrentID()), cur_element_set.getID(), cur_set_size);
        } else {
            changeTitle(manager.getFullyQualifiedName(getCurrentID()));
        }
    }

    /**
     * Update action
     * 
     */
    @Override
    public void updateAction() {
        boolean deleteActionEnable = (manager.getCurrentSetId().length() == 0
                || manager.getCurrentSetId().equals(IElementHandler.SET_ROOT_ID));
        deleteSetAction.setEnabled(!deleteActionEnable);
        deleteProcessAction.setEnabled(!deleteActionEnable);
        createSetAction.setEnabled(cur_set_size > 0);
        IElementHandler elementHandler = getCurrentElementHandler();
        changeSetAction.setEnabled(!(elementHandler == null || elementHandler.size() == 0));

        zoomInAction.setEnabled(cur_set_size > 0 && zoom_depth > 0);
        zoomOutAction.setEnabled(cur_set_size > 0 && zoom_depth < Zoom.max_depth);
    }

    /*******************************************************************************************************************************************************************************************************************************************************************************************************
     * IIconCanvasActionListener
     * 
     * @since 7.0
     ******************************************************************************************************************************************************************************************************************************************************************************************************/
    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ptp.ui.views.IIconCanvasActionListener#handleAction(int, java.util.BitSet)
     */
    @Override
    public void handleAction(int type, BitSet elements) {
        if (cur_element_set == null) {
            return;
        }

        switch (type) {
        case IIconCanvasActionListener.COPY_ACTION:
            if (!elements.isEmpty()) {
                clipboard.clear();
                clipboard.add(elements);
            }
            break;
        case IIconCanvasActionListener.CUT_ACTION:
            if (!elements.isEmpty()) {
                if (!cur_element_set.isRootSet()) {
                    clipboard.clear();
                    clipboard.add(elements);
                    last_action = type;
                    last_element_set = cur_element_set;
                }
            }
            break;
        case IIconCanvasActionListener.PASTE_ACTION:
            if (clipboard.size() > 0) {
                BitSet clipElements = clipboard.get(0);
                if (last_action == IIconCanvasActionListener.CUT_ACTION) {
                    if (last_element_set != null && !last_element_set.getID().equals(cur_element_set.getID())) {
                        if (last_element_set.size() == clipElements.cardinality()) {
                            manager.removeSet(last_element_set.getID(), getCurrentElementHandler());
                        } else {
                            last_element_set.removeElements(clipElements);
                        }
                    }
                }

                if (cur_element_set.isRootSet()) {
                    createSetAction.run(clipElements);
                } else {
                    cur_element_set.addElements(clipElements);
                    selectSet(cur_element_set);
                    // update();
                    refresh(false);
                }
                type = -1;
                last_element_set = null;
            }
            break;
        case IIconCanvasActionListener.DELETE_ACTION:
            if (!elements.isEmpty()) {
                if (!cur_element_set.isRootSet()) {
                    deleteProcessAction.run(elements);
                }
            }
            break;
        }
    }

    /*****************************************************************
     * Zoom
     *****************************************************************/
    public void zoomOut() {
        if (zoom_depth < Zoom.max_depth) {
            zoom_depth++;
            update();
            if (!canvas.isDisposed()) {
                canvas.setIconSize(zoom.scaled(IPTPUIConstants.DEFAULT_VIEW_ICON_WIDTH, zoom_depth),
                        zoom.scaled(IPTPUIConstants.DEFAULT_VIEW_ICON_HEIGHT, zoom_depth));
                canvas.setIconSpace(IPTPUIConstants.DEFAULT_VIEW_ICON_SPACING_X - zoom_depth,
                        IPTPUIConstants.DEFAULT_VIEW_ICON_SPACING_Y);
                canvas.setFontSizeSmaller();
                canvas.resetCanvas();
            }
        }
    }

    public void zoomIn() {
        if (zoom_depth > 0) {
            zoom_depth--;
            update();
            if (!canvas.isDisposed()) {
                canvas.setIconSize(zoom.scaled(IPTPUIConstants.DEFAULT_VIEW_ICON_WIDTH, zoom_depth),
                        zoom.scaled(IPTPUIConstants.DEFAULT_VIEW_ICON_HEIGHT, zoom_depth));
                canvas.setIconSpace(IPTPUIConstants.DEFAULT_VIEW_ICON_SPACING_X - zoom_depth,
                        IPTPUIConstants.DEFAULT_VIEW_ICON_SPACING_Y);
                canvas.setFontSizeBigger();
                canvas.resetCanvas();
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ptp.ui.views.AbstractParallelElementView#getStatusIcon(int, boolean)
     */
    @Override
    public Image getStatusIcon(int index, boolean isSelected) {
        Image img = super.getStatusIcon(index, isSelected);
        if (img != null) {
            return zoom.getImage(img, zoom_depth);
        }
        return null;
    }

    private class Zoom {
        protected static final int max_depth = 3;
        protected Map<Image, Image[]> zoomImageMap = new HashMap<Image, Image[]>();

        public void cleanup() {
            zoomImageMap.clear();
        }

        public Image getImage(Image image, int depth) {
            if (depth == 0) {
                return image;
            }

            Image[] images = zoomImageMap.get(image);
            if (images == null) {
                images = new Image[max_depth];
                zoomImageMap.put(image, images);
            }
            return getZoomImage(images, image, depth);
        }

        public Image getZoomImage(Image[] images, Image orgImg, int depth) {
            if (images[depth - 1] == null) {
                images[depth - 1] = scaledImage(orgImg, depth);
            }
            return images[depth - 1];
        }

        public double getScale(int depth) {
            double fix_factor = 0.2;
            return (1 - (fix_factor * depth));
        }

        public int scaled(int measure, int depth) {
            return (int) (measure * getScale(depth));
        }

        public Image scaledImage(Image image, int depth) {
            return new Image(image.getDevice(),
                    image.getImageData().scaledTo(scaled(IPTPUIConstants.DEFAULT_VIEW_ICON_WIDTH, depth),
                            scaled(IPTPUIConstants.DEFAULT_VIEW_ICON_HEIGHT, depth)));
        }
    }
}