com.laex.cg2d.entityeditor.action.MoveEntityAction.java Source code

Java tutorial

Introduction

Here is the source code for com.laex.cg2d.entityeditor.action.MoveEntityAction.java

Source

/*
 * Copyright (c) 2012, 2013 Hemanta Sapkota.
 * All rights reserved. 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
 *
 * Contributors:
 * Hemanta Sapkota (laex.pearl@gmail.com)
 */
package com.laex.cg2d.entityeditor.action;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
import org.eclipse.ui.dialogs.ListSelectionDialog;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;

import com.laex.cg2d.entityeditor.Activator;
import com.laex.cg2d.model.ICGCProject;
import com.laex.cg2d.model.ScreenModel;
import com.laex.cg2d.model.ScreenModel.CGEntity;
import com.laex.cg2d.model.ScreenModel.CGEntity.Builder;
import com.laex.cg2d.model.ScreenModel.CGEntityAnimation;
import com.laex.cg2d.model.ScreenModel.CGResourceFile;
import com.laex.cg2d.model.model.ResourceFile;
import com.laex.cg2d.model.util.EntitiesUtil;

/**
 * The Class MoveEntityAction.
 */
public class MoveEntityAction implements IObjectActionDelegate {

    /** The target part. */
    private IWorkbenchPart targetPart;

    /** The selected files. */
    private Object[] selectedFiles;

    /**
     * Instantiates a new move entity action.
     */
    public MoveEntityAction() {
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
     */
    @Override
    public void run(IAction action) {
        if (!action.isEnabled()) {
            return;
        }

        ListSelectionDialog dlg = new ListSelectionDialog(targetPart.getSite().getShell(),
                ResourcesPlugin.getWorkspace().getRoot(), new BaseWorkbenchContentProvider(),
                new WorkbenchLabelProvider(), "Select the Project:");
        dlg.setTitle("Project Selection");
        int resp = dlg.open();
        if (resp == ContainerSelectionDialog.CANCEL | (dlg.getResult() == null || dlg.getResult().length == 0)) {
            return;
        }

        Map<String, CGEntity> models = makeEntityModelsFromSelection(selectedFiles);

        IProject prj = ResourcesPlugin.getWorkspace().getRoot().getProject();

        for (Object dp : dlg.getResult()) {
            /* Destination path is the path to the projects in the workspace */
            IProject destinationProject = (IProject) dp;

            /* Dont copy if the destination project is same as source project */
            if (dp != prj) {
                copyEntityModels(models, destinationProject);
            }

        }

    }

    /**
     * Copy entity models.
     *
     * @param models the models
     * @param destinationProject the destination project
     */
    private void copyEntityModels(Map<String, CGEntity> models, IProject destinationProject) {
        for (String entityName : models.keySet()) {

            CGEntity emodel = models.get(entityName);

            IPath entitiesFolderPath = destinationProject.getFullPath().append(ICGCProject.ENTITIES_FOLDER);
            IPath texturesFolderPath = destinationProject.getFullPath().append(ICGCProject.TEXTURES_FOLDER);

            Builder newEntityBuilder = CGEntity.newBuilder(emodel);

            /*
             * Step 1: Go through all the animations and copy the animation sprite
             * sheet file and fixture file.
             */
            for (int i = 0; i < emodel.getAnimationsCount(); i++) {

                CGEntityAnimation animToCopy = emodel.getAnimations(i);

                CGResourceFile spriteSheetResourceFile = animToCopy.getSpritesheetFile();

                CGResourceFile fixtureRsourceFile = animToCopy.getFixtureFile();

                /* Work with sprite sheet path */
                IPath spriteSheetPath = copyAnimationResource(texturesFolderPath, spriteSheetResourceFile);
                CGResourceFile.Builder spriteSheetResourceBuilder = CGResourceFile
                        .newBuilder(animToCopy.getSpritesheetFile());

                /*
                 * If sprite sheet path is null, then most likely fixture file will also
                 * be. So just move on to next animation
                 */
                if (spriteSheetPath == null) {
                    continue;
                }

                String spriteSheetPathAbsolute = ResourcesPlugin.getWorkspace().getRoot().getFile(spriteSheetPath)
                        .getLocation().makeAbsolute().toString();
                spriteSheetResourceBuilder.setResourceFile(spriteSheetPath.toString());
                spriteSheetResourceBuilder.setResourceFileAbsolute(spriteSheetPathAbsolute);

                /* Work with fixture file path */
                IPath fixtureFilePath = copyAnimationResource(texturesFolderPath, fixtureRsourceFile);
                CGResourceFile.Builder fixtureResourceBuilder = CGResourceFile
                        .newBuilder(animToCopy.getFixtureFile());

                if (fixtureFilePath != null) {
                    String fixturePathAbsolute = ResourcesPlugin.getWorkspace().getRoot().getFile(fixtureFilePath)
                            .getLocation().makeAbsolute().toString();

                    fixtureResourceBuilder.setResourceFile(fixtureFilePath.toString());
                    fixtureResourceBuilder.setResourceFileAbsolute(fixturePathAbsolute);
                }

                CGEntityAnimation finalAnimation = newEntityBuilder.getAnimationsBuilder(i)
                        .setSpritesheetFile(spriteSheetResourceBuilder.build())
                        .setFixtureFile(fixtureResourceBuilder.build()).build();

                newEntityBuilder.setAnimations(i, finalAnimation);

            }

            /* Looks like all the animation and fixtures have been copied */
            CGEntity e = newEntityBuilder.build();

            IPath ePath = entitiesFolderPath.append(entityName).addFileExtension(ICGCProject.ENTITIES_EXTENSION);
            IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(ePath);
            ByteArrayInputStream bais = new ByteArrayInputStream(e.toByteArray());

            try {

                if (file.exists()) {
                    file.setContents(bais, true, false, new NullProgressMonitor());
                } else {
                    file.create(bais, true, new NullProgressMonitor());
                }

            } catch (CoreException ce) {
                Activator.log(ce);
            }

        }
    }

    /**
     * Copy animation resource.
     *
     * @param destinationPath the destination path
     * @param resourceFile the resource file
     * @return the i path
     */
    private IPath copyAnimationResource(IPath destinationPath, CGResourceFile resourceFile) {
        if (ResourceFile.isEmpty(resourceFile)) {
            return null;
        }

        IPath srcResPath = new Path(resourceFile.getResourceFile());

        IFile srcResFile = ResourcesPlugin.getWorkspace().getRoot().getFile(srcResPath);

        IPath destPath = destinationPath.removeLastSegments(1).append("textures").append(srcResPath.lastSegment());

        if (srcResFile.exists()) {

            try {

                boolean destFileAlreadyExists = ResourcesPlugin.getWorkspace().getRoot().getFile(destPath).exists();

                if (!destFileAlreadyExists) {

                    srcResFile.copy(destPath, true, new NullProgressMonitor());

                }

            } catch (CoreException e) {

                Activator.getDefault().getLog()
                        .log(new Status(Status.WARNING, Activator.PLUGIN_ID, e.getMessage()));

            }
        }

        return destPath;

    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
     */
    @Override
    public void selectionChanged(IAction action, ISelection selection) {
        IStructuredSelection strucSel = (IStructuredSelection) selection;
        selectedFiles = strucSel.toArray();

    }

    /**
     * Make entity models from selection.
     *
     * @param selecObjects the selec objects
     * @return the map
     */
    private Map<String, CGEntity> makeEntityModelsFromSelection(Object[] selecObjects) {
        Map<String, CGEntity> entityModels = new HashMap<String, ScreenModel.CGEntity>();
        for (Object sel : selecObjects) {
            IFile file = (IFile) sel;

            try {
                CGEntity entity = CGEntity.parseFrom(file.getContents());
                String entityName = EntitiesUtil.getDisplayName(file.getFullPath());
                System.err.println(entityName);
                entityModels.put(entityName, entity);
            } catch (IOException e) {
                Activator.log(e);
            } catch (CoreException e) {
                Activator.log(e);
            }
        }

        return entityModels;
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
     */
    @Override
    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
        this.targetPart = targetPart;
    }

}