com.nokia.tools.s60.editor.actions.AddToGroupAction.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.tools.s60.editor.actions.AddToGroupAction.java

Source

/*
* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
package com.nokia.tools.s60.editor.actions;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;

import com.nokia.tools.content.core.IContentData;
import com.nokia.tools.media.color.ColorUtil;
import com.nokia.tools.media.image.RenderedImageDescriptor;
import com.nokia.tools.media.utils.IFileConstants;
import com.nokia.tools.media.utils.layers.IColorAdapter;
import com.nokia.tools.media.utils.layers.ILayer;
import com.nokia.tools.media.utils.svg.ColorGroup;
import com.nokia.tools.media.utils.svg.ColorGroups;
import com.nokia.tools.media.utils.svg.ColorizeSVGFilter;
import com.nokia.tools.resource.util.FileUtils;
import com.nokia.tools.s60.editor.commands.AddToGroupCommand;
import com.nokia.tools.s60.editor.ui.views.Messages;
import com.nokia.tools.s60.views.ColorsView;
import com.nokia.tools.screen.core.JEMUtil;
import com.nokia.tools.screen.ui.ISkinnableEntityAdapter;
import com.nokia.tools.theme.editing.BasicImageLayer;

/**
 * 
 * Adds items containing given color to the group, if the color of the items is
 * different from group, the color is changed to correspond with group color.
 * 
 */

public class AddToGroupAction extends AbstractMultipleSelectionAction implements IMenuCreator {

    public static final String ID = "addToGroup"; // ActionFactory.COPY.getId();

    private String targetGroupName;

    private RGB colorBeforeAddingToGroup;

    private ColorGroups grps;

    private Map<RGB, ColorGroup> createdGroups;

    // private ILayer layer;

    public AddToGroupAction(IWorkbenchPart part) {
        super(part);
    }

    @Override
    public void runWithEvent(Event event) {
        run();
    }

    public AddToGroupAction(IStructuredSelection selection, ISelectionProvider provider,
            CommandStack commandStack) {
        super(null);
        setSelectionProvider(provider);
        this.stack = commandStack;
        this.selection = selection;
    }

    public AddToGroupAction(ISelectionProvider provider, CommandStack stack) {
        super(null);
        setSelectionProvider(provider);
        this.stack = stack;
        setGroupName(null);

    }

    @Override
    protected void init() {
        setId(ID);
        setText("Create New");
        setLazyEnablementCalculation(true);
        super.init();

    }

    @Override
    protected boolean doCalculateEnabled(Object sel) {

        IContentData data = getContentData(sel);
        if (data == null) {
            return false;
        }

        if (data.getAllChildren().length > 0) {
            ISkinnableEntityAdapter skAdapter = (ISkinnableEntityAdapter) data.getAllChildren()[0]
                    .getAdapter(ISkinnableEntityAdapter.class);
            if (skAdapter != null && (skAdapter.isColour() || skAdapter.isColourIndication()))
                return true;
        }

        // for Colors
        if (null == colorBeforeAddingToGroup) {
            if (data != null) {
                ISkinnableEntityAdapter skAdapter = (ISkinnableEntityAdapter) data
                        .getAdapter(ISkinnableEntityAdapter.class);
                if (skAdapter != null && !(skAdapter.isColour() || skAdapter.isColourIndication())) {
                    return false;
                }
            }

            colorBeforeAddingToGroup = getColor(data);
        }

        if (null == grps) {
            grps = BasicImageLayer.getAvailableColors(data);
        }

        if (data != null) {
            ILayer layer;

            layer = getLayer(false, sel);

            if (layer != null) {

                if (layer.isBackground()) {
                    return false;
                }

                String id = layer.getParent().getId();
                if (targetGroupName != null) {
                    ColorGroup group = grps.getGroupByName(targetGroupName);

                    if (group != null) {
                        if (layer.getParent().getLayerCount() > 1) {
                            if (group.containsItemWithIdAndLayerName(id, layer.getName())
                                    && group.getGroupColor().equals(colorBeforeAddingToGroup)) {
                                return false; // layer already exists in group
                            }
                        } else if (group.containsItemWithIdAndLayerName(id, null)
                                && group.getGroupColor().equals(colorBeforeAddingToGroup)) {
                            return false; // image already exists in group
                        }
                    }
                } else {

                }
                return true;

            }

        }
        return false;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.nokia.tools.s60.editor.actions.AbstractMultipleSelectionAction#doRun(java.util.List)
     */
    @Override
    protected void doRun(List<Object> element) {
        // checks the already created group in order to avoid create multiple
        // groups referencing the same color
        createdGroups = new HashMap<RGB, ColorGroup>();
        try {
            super.doRun(element);
        } finally {
            createdGroups = null;
        }
    }

    @Override
    protected void doRun(Object sel) {
        IContentData data = getContentData(sel);
        boolean isAColor = false;

        IContentData[] elements = null;
        CompoundCommand groupcommand = new CompoundCommand(Messages.Colors_Reference2Color);
        boolean colorCategory = false;
        if (data.getAllChildren().length > 0) {

            elements = data.getAllChildren();
            ISkinnableEntityAdapter skAdapter = (ISkinnableEntityAdapter) elements[0]
                    .getAdapter(ISkinnableEntityAdapter.class);

            if (skAdapter != null && (skAdapter.isColour() || skAdapter.isColourIndication())) {
                colorCategory = true;
            }

        }
        if (!colorCategory) {
            elements = new IContentData[1];
            elements[0] = data;
        }

        if (null == grps) {
            grps = BasicImageLayer.getAvailableColors(data);
        }
        ColorGroup group = null;

        for (int i = 0; i < elements.length; i++) {
            IContentData data1 = elements[elements.length - i - 1];
            RGB layerColor = null;
            RGB formerColor = colorBeforeAddingToGroup;

            if (colorCategory || null == colorBeforeAddingToGroup) {
                formerColor = getColor(data1);
            }

            if (data1 != null) {
                ILayer layer = null;

                if (colorCategory) {
                    layer = getLayer(false, data1);
                } else if (layer == null) {
                    layer = getLayer(false, sel);
                }

                if (layer != null) {

                    if (layer.isBackground()) {
                        return;
                    }

                    try {

                        String id = layer.getParent().getId();

                        boolean isMultiLayer = false;
                        String layerName = null;
                        if (layer.getParent().getLayerCount() > 1) {
                            isMultiLayer = true;
                        }

                        if (targetGroupName != null) {
                            group = grps.getGroupByName(targetGroupName);
                        } else {

                        }

                        if (isMultiLayer) {
                            layerName = layer.getName();
                        }

                        boolean removeIfExists = false;
                        if (data1 != null) {
                            ISkinnableEntityAdapter skAdapter = (ISkinnableEntityAdapter) data1
                                    .getAdapter(ISkinnableEntityAdapter.class);
                            if (skAdapter != null && (skAdapter.isColour() || skAdapter.isColourIndication())) {

                                if (colorBeforeAddingToGroup.equals(layerColor)) {
                                    removeIfExists = true;
                                }
                                isAColor = true;

                            }
                        }

                        // open colors view when creating new color group
                        if (group == null) {
                            if (createdGroups != null) {
                                group = createdGroups.get(formerColor);
                            }
                            if (group == null) {
                                PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                                        .showView(ColorsView.ID, null, IWorkbenchPage.VIEW_VISIBLE);
                            }
                        }

                        IColorAdapter adapterColor = (IColorAdapter) data1.getAdapter(IColorAdapter.class);
                        if ((adapterColor != null) && (adapterColor.getColor() != null))
                            layerColor = ColorUtil.toRGB(adapterColor.getColor());

                        AddToGroupCommand cmd = new AddToGroupCommand(id, layerName, group, formerColor, grps,
                                removeIfExists);
                        if ((layerColor == null) || colorBeforeAddingToGroup.equals(layerColor))
                            groupcommand.add(cmd);

                        if (group == null) {
                            group = cmd.getCreatedGroup();
                            if (createdGroups != null) {
                                createdGroups.put(formerColor, group);
                            }
                        }

                        RGB groupColor = group.getGroupColor();

                        //if (!formerColor.equals(groupColor)) {
                        final ISkinnableEntityAdapter skAdapter = (ISkinnableEntityAdapter) data1
                                .getAdapter(ISkinnableEntityAdapter.class);
                        if (skAdapter.isColour() || skAdapter.isColourIndication()) {
                            IColorAdapter adapter = (IColorAdapter) data1.getAdapter(IColorAdapter.class);
                            Command c = adapter.getApplyColorCommand(ColorUtil.toColor(groupColor), true);
                            layerColor = ColorUtil.toRGB(adapter.getColor());
                            if (isAColor && formerColor.equals(layerColor))
                                groupcommand.add(c);

                        } else {
                            boolean canProceedWithSkinning = true;
                            if ((layer != null) && (layer.getColors() != null)) {
                                boolean isSelectedFormerColorUsed = layer.getColors().containsKey(formerColor);
                                if (!isSelectedFormerColorUsed)
                                    canProceedWithSkinning = false;
                            }

                            if (canProceedWithSkinning) {
                                // returns absolute path
                                String imageAbsolutePath = layer.getFileName(true);
                                String outputFile = FileUtils.generateUniqueFileName(layer.getParent().getId(),
                                        IFileConstants.FILE_EXT_SVG);

                                // colorize using SVGColorizeFilter
                                ColorizeSVGFilter.colorizeSVGChangeSingleColor2(new File(imageAbsolutePath),
                                        new File(outputFile), groupColor, formerColor, 100);
                                layer.paste(outputFile);
                                updateGraphicWithCommand(layer, sel);
                            }
                        }

                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        groupcommand.setLabel(Messages.Colors_Reference2Color);
        if (!groupcommand.isEmpty())
            execute(groupcommand, null);
    }

    public void setColor(RGB color) {
        this.colorBeforeAddingToGroup = color;
    }

    public void setGroupName(String groupName) {
        this.targetGroupName = groupName;
        setText(((null == groupName) ? Messages.Colors_CreateNewLogicalColor : groupName));
    }

    public void setColorGroups(ColorGroups grps) {
        this.grps = grps;
        // adding the color icon in the menu
        ImageDescriptor desc = null;
        ColorGroup cg = grps == null ? null : grps.getGroupByName(targetGroupName);
        if (cg == null) {
            // otherwise npe destroys the context menu of layers page
            return;
        }
        RGB rgb = cg.getGroupColor();
        PaletteData paletteData = new PaletteData(new RGB[] { rgb });
        ImageData imageData = new ImageData(10, 10, 1, paletteData);
        desc = ((ImageDescriptor.createFromImageData(imageData)));

        if (grps.getGroupByName(targetGroupName).getGroupItems().size() == 0) {// unused
            // color
            setImageDescriptor(desc);
        } else {// used(linked) colour
            setImageDescriptor(getDescriptorForOvalImage(rgb));

        }

    }

    private RGB getColor(IContentData cdata) {
        // only regular skinnable entities can be shown in store
        IColorAdapter color = (IColorAdapter) cdata.getAdapter(IColorAdapter.class);
        if (color != null)
            return ColorUtil.toRGB(color.getColor());
        return null;

    }

    private ImageDescriptor getDescriptorForOvalImage(RGB rgb) {
        int transparentPixel = 0;
        int minSize = 0;
        int maxSize = 15;
        BufferedImage image = getOvalImage(rgb, minSize, maxSize);
        ImageDescriptor desc = new RenderedImageDescriptor(image, image.getWidth(), image.getHeight(),
                BufferedImage.TYPE_INT_RGB, transparentPixel);
        return desc;
    }

    private BufferedImage getOvalImage(RGB rgb, int minSize, int maxSize) {
        BufferedImage image = new BufferedImage(maxSize, maxSize, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = (Graphics2D) image.getGraphics();
        // draw an oval with color having the given rgb combination
        graphics.setColor(new Color(rgb.red, rgb.green, rgb.blue));
        graphics.fillOval(minSize, minSize, maxSize - 3, maxSize - 3);
        return image;
    }

    public Menu getMenu(Control parent) {
        return null;
    }

    /**
     * Fill menu with created colors.
     */
    public Menu getMenu(Menu parent) {
        addActions(parent);
        return null;
    }

    private void addActions(Menu menu) {

        IContentData data = JEMUtil.getContentData(getSelection());
        ColorGroups grps = BasicImageLayer.getAvailableColors(data);
        if (grps != null) {
            if (grps.getGroups().size() > 0) {
                new MenuItem(menu, SWT.SEPARATOR);
                for (ColorGroup group : grps.getGroups()) {
                    AddToGroupAction addAction = new AddToGroupAction(getWorkbenchPart());
                    addAction.setGroupName(group == null ? null : group.getName());
                    addAction.setColorGroups(grps);
                    addAction(menu, addAction);
                }

                RemoveFromGroupAction removeAction = new RemoveFromGroupAction(null, getSelectionProvider(), stack);
                removeAction.setColorGroups(grps);

                if (removeAction.isEnabled()) {
                    new MenuItem(menu, SWT.SEPARATOR);
                    addAction(menu, removeAction);
                }
                new MenuItem(menu, SWT.SEPARATOR);
            }

        }
    }

    private void addAction(Menu menu, AbstractMultipleSelectionAction action) {
        ActionContributionItem item = new ActionContributionItem(action);
        action.setMenuCreator(null);
        item.fill(menu, -1);
    }

}