注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

隐龙 为了一生的信念

今日默默沉于水,他日飞腾在九天...

 
 
 

日志

 
 

Eclipse插件开发Nature篇  

2017-04-07 13:02:47|  分类: Eclipse PDE |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  • 介绍

本文将介绍如何创建自己的项目特性(nature)。什么是项目特性呢?比如你新建一个Java工程,这个项目的图标右上角就会有个J的标志;如果是个Maven工程呢,在左上角还有有一个M标志。简单来说,项目特性就是用来对不同项目的区分。Nature会关联Builder,那什么是Builder呢?

当你保存Java源文件的同时,就会触发编译动作。这个事情就是Builder来做的。所以说,你的Java工程到底能不能成功编译,责任都落在了Nature和Builder的配合上。比如:你导入了Maven工程,却始终无法生成Maven的依赖,所以也无法编译,这时候你就可以看看你的工程上有没有关联Maven对应的Nature。

  • 步骤

在plugin.xml文件中添加如下配置:

<extension
point="org.eclipse.core.resources.natures">
 <runtime>
    <run class="org.suren.littlebird.SuRenProjectNature" />
 </runtime>
</extension>
<extension id="suren.builder" name="SuRenBuilder"
point="org.eclipse.core.resources.builders">
 <builder>
    <run class="org.suren.littlebird.builder.SuRenBuilder" />
 </builder>
</extension>

实现org.eclipse.core.resources.IProjectNature接口中的方法

package org.suren.littlebird.nature;

import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.runtime.CoreException;

/**
 * @author suren
 * @date 2015-4-2
 *
 * http://surenpi.com
 */

public class SuRenProjectNature implements IProjectNature
{
    private static final String SUREN_BUILDER_ID = "suren.builder";

    /**
     * 工程对象
     */

    private IProject project;

    /**
     * 当nature被添加到工程中时调用,配置当前工程
     */

    @Override
    public void configure() throws CoreException
    {
        if(project == null)
        {
            System.err.println("can not get project object when nature configure.");

            return;
        }

        IProjectDescription projectDesc = project.getDescription();
        ICommand[] buildSpec = projectDesc.getBuildSpec();

        boolean builderSetup = false;
        for(ICommand cmd : buildSpec)
        {
            if(cmd.getBuilderName().equals(SUREN_BUILDER_ID))
            {
                builderSetup = true;
                break;
            }
        }

        if(!builderSetup)
        {
            ICommand newCmd = projectDesc.newCommand();
            newCmd.setBuilderName(SUREN_BUILDER_ID);

            ICommand[] newBuildSpec = new ICommand[buildSpec.length + 1];
            newBuildSpec[0] = newCmd;

            System.arraycopy(buildSpec, 0, newBuildSpec, 1, buildSpec.length);
            projectDesc.setBuildSpec(newBuildSpec);
            project.setDescription(projectDesc, null);
        }
    }

    /**
     * 当nature从当前工程中取消时,删除配置
     */

    @Override
    public void deconfigure() throws CoreException
    {
        if(project == null)
        {
            System.err.println("can not get project object when nature deconfigure.");

            return;
        }

        IProjectDescription projectDesc = project.getDescription();
        ICommand[] buildSpec = projectDesc.getBuildSpec();

        int prepareToRemove = -1;
        for(int i = 0; i < buildSpec.length; i++)
        {
            ICommand cmd = buildSpec[i];
            if(cmd.getBuilderName().equals(SUREN_BUILDER_ID))
            {
                prepareToRemove = i;
                break;
            }
        }

        if(prepareToRemove != -1)
        {
            ICommand[] newBuildSpec = new ICommand[buildSpec.length - 1];

            System.arraycopy(buildSpec, 0, newBuildSpec, 0, prepareToRemove + 1);
            System.arraycopy(buildSpec, prepareToRemove + 1,
                    newBuildSpec, prepareToRemove, buildSpec.length - prepareToRemove - 1);
            projectDesc.setBuildSpec(newBuildSpec);
            project.setDescription(projectDesc, null);
        }
    }

    /**
     * 从nature中获取当前工程
     */

    @Override
    public IProject getProject()
    {
        return this.project;
    }

    /**
     * 在nature中保存当工程
     */

    @Override
    public void setProject(IProject project)
    {
        this.project = project;
    }

}

继承org.eclipse.core.resources.IncrementalProjectBuilder

package org.suren.littlebird.builder;

import java.util.Map;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;

/**
 * @author suren
 * @date 2015-4-2
 *
 * http://surenpi.com
 */

public class SuRenBuilder extends IncrementalProjectBuilder
{

    @Override
    protected IProject[] build(int kind, Map<String, String> args,
            IProgressMonitor pro) throws CoreException
    {
        System.out.println("prepare to suren build.");

        switch(kind)
        {
            case IncrementalProjectBuilder.FULL_BUILD:
                System.out.println("full suren build.");
                getProject().accept(new SuRenVistor());

                break;
            default:
                IResourceDelta delta = getDelta(getProject());
                if(delta == null)
                {
                    getProject().accept(new SuRenVistor());
                }
                else
                {
                    delta.accept(new SuRenDeltaVisitor());
                }

                break;
        }

        System.out.println("suren build done.");

        return null;
    }

    private class SuRenVistor implements IResourceVisitor
    {

        @Override
        public boolean visit(IResource resource) throws CoreException
        {
            System.out.println("SuRenVistor");

            switch(resource.getType())
            {
                case IResource.PROJECT:
                    System.out.println("PROJECT added: " + resource.getName());
                    break;
                case IResource.FOLDER:
                    System.out.println("FOLDER added: " + resource.getName());
                    break;
                case IResource.FILE:
                    System.out.println("FILE added: " + resource.getName());
                    break;
            }

            return true;
        }
    }

    private class SuRenDeltaVisitor implements IResourceDeltaVisitor
    {

        @Override
        public boolean visit(IResourceDelta delta) throws CoreException
        {
            IResource resource = delta.getResource();
            switch(resource.getType())
            {
                case IResource.PROJECT:
                    System.out.println("PROJECT added: " + resource.getName());
                    break;
                case IResource.FOLDER:
                    System.out.println("FOLDER added: " + resource.getName());
                    break;
                case IResource.FILE:
                    System.out.println("FILE added: " + resource.getName());
                    break;
            }

            switch(delta.getKind())
            {
                case IResourceDelta.ADDED:
                    System.out.println("ADDED : " + resource.getName());
                    break;
                case IResourceDelta.CHANGED:
                    System.out.println("CHANGED : " + resource.getName());
                    break;
                case IResourceDelta.REMOVED:
                    System.out.println("REMOVED : " + resource.getName());
                    break;
            }

            return true;
        }
    }

}
  • 工程特性图标
<extension
    point="org.eclipse.ui.ide.projectNatureImages">
    <image
        id="suren.nature.image"
        icon="icons/suren.gif"
        natureId="suren.nature">
    </image>
</extension>

图标尺寸:7*6

在plugin.xml中加入上面的代码后,工程图标的右上角就会显示你的图标。

  评论这张
 
阅读(74)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017