精华内容
下载资源
问答
  • Eclipse插件开发

    千次阅读 2019-03-16 23:10:47
    1 概要 Eclipse依然是开发java的主流IDE之一, 技术公司如要提升开发侧的效率...本文将介绍Eclipse插件开发的一些点。 2 插件开发 2.1 按钮扩展 2.1.1 扩展菜单 扩展菜单扩展点org.eclipse.ui.menus,指定命令id。 ...

    1 概要

    Eclipse依然是开发java的主流IDE之一, 技术公司如要提升开发侧的效率或者为产品吸引开发者,可以开发Eclipse插件。
    本文将介绍Eclipse插件开发的一些点。

    2 插件开发

    2.1 按钮扩展

    2.1.1 扩展菜单

    扩展菜单扩展点org.eclipse.ui.menus,指定命令id。
    在这里插入图片描述

    2.1.2 实现命令

    在这里插入图片描述
    处理类继承AbstractHandler
    在这里插入图片描述

    2.2 偏好扩展

    2.2.1 扩展页面

    偏好页面扩展点:org.eclipse.ui.preferencePages。
    在这里插入图片描述

    2.2.2 页面实现

    在这里插入图片描述

    2.2.3 初始化偏好

    插件激活的时候初始化:
    在这里插入图片描述
    在这里插入图片描述

    2.3 向导扩展

    向导提供创建项目或文件的指引式操作。

    2.3.1 扩展配置

    在扩展点配置org.eclipse.ui.newWizards。
    在这里插入图片描述

    2.3.2 实现向导

    继承向导父类,实现向导接口。
    在这里插入图片描述

    2.3.3 实现页面

    在这里插入图片描述
    在这里插入图片描述

    2.4 编辑器扩展

    2.4.1 扩展配置

    在扩展点配置org.eclipse.ui.editors。
    在这里插入图片描述

    2.4.2 编辑器实现

    在这里插入图片描述

    2.5 右键菜单

    2.5.1 扩展配置

    扩展扩展点 org.eclipse.ui.popupMenus, 配置如下,注意几个点,objectClass 指定项目结构资源树每个节点的对象的所属类,nameFilter 可以过滤后缀。action 配置多个,i就出现多个右键菜单。

    <extension point="org.eclipse.ui.popupMenus"> 
          <objectContribution 
             id="rcp.actions" 
             objectClass="org.eclipse.core.resources.IFile" 
             nameFilter="*.html"> 
           <action
                id="actions.OpenUrlAction" 
                label="打开页面" 
                class="actions.OpenUrlAction"
                 menubarPath="additions" 
                 enablesFor="1">          
                </action> 
            <action
                id="actions.CopyUrlAction" 
                label="复制地址" 
                icon="icons/copy_url.png" 
                class="ctions.CopyUrlAction"
                 menubarPath="additions" 
                 enablesFor="1">          
                </action> 
          </objectContribution> 
       </extension> 
    

    2.5.2 实现处理类

    右键菜单的逻辑实现接口 IObjectActionDelegate ,处理run方法。如下:

    public class OpenUrlAction implements IObjectActionDelegate {
    
    	private TreeSelection selection;
    
    	/**
    	 * 获取selection.
    	 * 
    	 * @return the selection
    	 */
    	public TreeSelection getSelection() {
    		return selection;
    	}
    
    	/**
    	 * {@inheritDoc}
    	 * 
    	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
    	 */
    	@SuppressWarnings("unused")
    	@Override
    	public void run(IAction action) {
    
    		TreePath[] paths = this.getSelection().getPaths();
    		IFile file = (IFile) this.getSelection().getFirstElement();
    		String url = HtmlUrlBuilder.getUrl(file);
    
    		IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
    		try {
    			IWebBrowser browser = browserSupport.createBrowser(file.getFullPath().toString());
    			browser.openURL(new URL(url));
    		} catch (PartInitException | MalformedURLException e) {
    			e.printStackTrace();
    		}
    
    	}
    
    	/**
    	 * {@inheritDoc}
    	 * 
    	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
    	 *      org.eclipse.jface.viewers.ISelection)
    	 */
    	@Override
    	public void selectionChanged(IAction action, ISelection selection) {
    		this.selection = (TreeSelection) selection;
    	}
    
    	/**
    	 * {@inheritDoc}
    	 * 
    	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction,
    	 *      org.eclipse.ui.IWorkbenchPart)
    	 */
    	@Override
    	public void setActivePart(IAction action, IWorkbenchPart part) {
    		// TODO Auto-generated method stub
    
    	}
    
    }
    

    2.6 获取浏览器支持

    通过平台ui获取工作台,再获取浏览器支持,创建浏览器,打开url地址。

    		IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
    			try {
    			IWebBrowser browser = browserSupport.createBrowser(file.getFullPath().toString());
    			browser.openURL(new URL(url));
    		} catch (PartInitException | MalformedURLException e) {
    			e.printStackTrace();
    		}
    

    2.7 控制台扩展

    在控制台管理添加新建立的 MessageConsole 消息控制台,使用消息流MessageConsoleStream 输出文本信息和错误堆栈信息。

    public class Console {
    
    	private static MessageConsole console = findConsole();
    
    	private static MessageConsoleStream stream;
    
    	public static void println(String msg, Throwable e) {
    		println(msg);
    		try {
    			OutputStreamWriter writer = new OutputStreamWriter(stream);
    			PrintWriter s = new PrintWriter(writer);
    			e.printStackTrace(s);
    			writer.flush();// 刷才会输出
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
    	}
    
    	public static void println(String msg) {
    		if (stream == null) {
    			stream = console.newMessageStream();
    			stream.setEncoding("utf-8");
    		}
    		stream.println(msg);
    	}
    
    	/**
    	 * 
    	 * @return
    	 */
    	public static MessageConsole findConsole() {
    		String name = "xxx";
    
    		IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
    		IConsole[] consoles = consoleManager.getConsoles();
    		for (IConsole console : consoles) {
    			if (name.equals(console.getName())) {
    				return (MessageConsole) console;
    			}
    		}
    
    		MessageConsole console = new MessageConsole(name, null);
    		consoleManager.addConsoles(new IConsole[] { console });
    		return console;
    	}
    
    	public static void close() {
    		if (stream != null) {
    			IOUtils.closeQuietly(stream);
    		}
    		stream = null;
    	}
    
    }
    
    展开全文
  • Eclipse 插件开发

    万次阅读 2016-10-10 21:02:47
    Eclipse 是一个很让人着迷的开发环境,它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。目前网上流传相当丰富且全面的开发工具方面的插件,但是 Eclipse 已经超越了开发环境的概念...

    Eclipse 是一个很让人着迷的开发环境,它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。目前网上流传相当丰富且全面的开发工具方面的插件,但是 Eclipse 已经超越了开发环境的概念,可以想象 Eclipse 将成为未来的集成的桌面环境。目前的 Eclipse 本身就具备资源管理和外部程序的功能,加上无所不能的插件,将构成一个丰富多彩的工作环境而不仅仅是一个 IDE。


    1.Eclipse 简介和插件开发

    Eclipse 是一个很让人着迷的开发环境,它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的想象和创造空间。目前网上流传相当丰富且全面的开发工具方面的插件,但是 Eclipse 已经超越了开发环境的概念,可以想象 Eclipse 将成为未来的集成的桌面环境。目前的 Eclipse 本身就具备资源管理和外部程序的功能,加上无所不能的插件,将构成一个丰富多彩的工作环境而不仅仅是一个 IDE。对于程序员来说,没有什么比可以随心所欲的定制的工作环境更重要,你的决心,勇气和创造力在与别人分享成果的过程中一览无余。好了,你是不是心动了,如果你已经对 Eclipse 有一定的认识,那么,和我一起打造自己的个性化工作环境吧,首先我们一起开发一个天气预报的插件,然后我们打造属于自己的邮件快速监控功能。

    以下的工作基于一定的前提,那就是你是一名 Java 程序员,你很欣赏并正开始使用 Eclipse 这个超酷的工作环境,别忘了下载最新版的 Eclipse3.0,本文基于 Eclipse3.0 开发。

    2. 天气预报插件

    如果你已经厌倦了总是要登录某些网站从相关网页上获取信息,这里有一个让你通过 Eclipse 快速获取信息的新方法。让我们从头开始,做一个属于自己的天气预报插件吧,你的 Eclipse 将具有天气预报功能,是不是很酷呢?

    在这一部分,我们将要实现一个 Eclipse 插件,他可以在任何我们想知道的时候通过简单的点击鼠标告诉我们本地区的天气预报,这当然很刺激。对于一个程序员而言,事情就应该如此。让我们开始吧,我们首先要定义一个插件,把他加到菜单和工具栏中。对于没有插件开发经验的你,可以参考《 开发 Eclipse 插件》,树立基本的插件开发意识,当然,本文将详细的辅助你完成这一创造性的工作。

    2.1 最基础的插件

    你可以完全参考《 开发 Eclipse 插件》的插件示例,制作你的第一个 hello Eclipse 插件,幸运的是,Eclipse3.0 完全考虑到你的需求,通过菜单 File -> New-> Other ->Plug-in Project,输入项目名称,next 出现对话框,只要在插件名处输入"muplugin",next 以后选择 "Hello,World"的插件模板你可以直接新建一个名为 myplugin 的最简单的插件,但其实我们的天气预报并不比它复杂多少,建完改插件以后的效果如下图。

    现在,将项目作为运行时工作台运行(run - run as runtime workbench),在一个全新的 Eclipse 窗口中,通过点击菜单 sample menu 的 sample Action 或者工具栏中的圆形 Eclipse 图标,你将看到如下效果的对话框。

    到此为止,天气预报插件的原始版做成了,通过修改 plugin.xml,我们将菜单改成中文形式,需要修改的地方就 2 处,详见表格。

                   <actionSet 
                label="Sample Action Set"
                visible="true"
                id="myplugin.actionSet"> 
             <menu 
                   label="我的空间"
                   id="sampleMenu"> 
                <separator 
                      name="sampleGroup"> 
                </separator> 
             </menu> 
             <action 
                   label="天气预报"
                   icon="icons/sample.gif"
                   class="myplugin.actions.SampleAction"
                   tooltip="Hello, Eclipse world"
                   menubarPath="sampleMenu/sampleGroup"
                   toolbarPath="sampleGroup"
                   id="myplugin.actions.SampleAction"> 
             </action>

    此时在运行时工作台,我们的菜单已经改变。

    2.2 用 VisualEditer 制作天气预报对话框

    虽然菜单是天气预报,但是我们需要的不是 hello Eclispe 对话框,我们需要的是告诉我们天气的对话框,当然需要我们从头开始,于是我们需要重新构建一个对话框,这个就需要 Visual Editor 来帮助进行界面的开发(关于 Visual Editer 参考《 Build GUIs with the Eclipse Visual Editor project》) 。我们将使用 Visual Editor 实现一个 Swing 对话框,当然只用 VE 做一个对话框是有点大材小用,但是作为起点,已经合适了。

    首先参考《 Build GUIs with the Eclipse Visual Editor project》构建 Visual Editer 开发环境,当一切准备齐全,鼠标右键点击 PackgeExpoler 中的 "muplugin.actions"java 文件,从弹出式菜单中选择 new->other->VisualClass,新建一个可视化的类,弹出界面如下图:

    选择 next,然后在 name 中输入 WeatherDialog,这个就是我们用来显示天气预报的 dialog

    选择该对话框的超类为 javax.swing.JDiaog, 点击 Finish 按钮。 等待一段时间后,我们的对话框就基本生成了,鼠标点击左上角图标,直接输入天气预报就是对话框的标题,同时 我们可以看到左侧的 VisualEditor 面板。

    然后我们将该对话框于与刚才的天气预报菜单连接 找到 SampleAction 的 run 函数,如下所示:

    		 public void run(IAction action) { 
    		 MessageDialog.openInformation( 
    			 window.getShell(), 
    			"Myplugin Plug-in", 
    			"Hello, Eclipse world"); 
    	 }

    替换成如下代码

        	 public void run(IAction action) 
        { 
            WeatherDialog wd=new WeatherDialog(); 
            wd.setSize(400, 335); 
            wd.show();        
        }

    此时,点击菜单运行,我们的对话框看起来象这个样子,在此基础上我们还要在上面增加天气预报信息

    2.3 增加天气预报功能

    下面的部分是重点,我们将使用具有解析 Html 功能的 Swing 组件 JEditPane,来获取网络上的现成的天气预报信息,根据上图,从 VisualEditor 的面板中 Swing Components 组点击 JEditPane,加入到对话框中。并修改对话框代码使得最终的代码如下:

     /* 
     * Created on 2004-9-23 
     * */ 
     package myplugin; 
     import java.io.BufferedReader; 
     import java.io.InputStreamReader; 
     import java.net.URL; 
     import javax.swing.JDialog; 
     import javax.swing.JEditorPane; 
     /** 
     * <p>Title: WatherDialog</p> 
     * <p>Description: 这个是对话框类,用于显示指定城市的当天的天气预报 </p>
     * <p>Copyright: Copyright (c) 2004</p> 
     * <p>Company:UF SOFT</p> 
     * @author 赵勇
     * @version 1.0 
     */ 
     public class WatherDialog extends JDialog 
     { 
        String city="北京"; 
        
        private JEditorPane jEditorPane = null; 
        /** 
         * This method initializes 
         * / 
        public WatherDialog(String city) 
        { 
            super(); 
            this.city=city; 
            initialize(); 
        } 
        /** 
         * This method initializes this 
         * @return void 
         */ 
        private void initialize() 
        { 
            this.setContentPane(getJEditorPane()); 
            try 
            { 
                // 构建 URL 对象
                URL url =
    new URL("http://weather.news.sina.com.cn//cgi-bin/figureWeather/simpleSearch.cgi?city="
    +city); 
                String temp=""; 
                BufferedReader in 
                     = new BufferedReader(new InputStreamReader(url.openStream()));
                // 使用 openStream 得到一输入流并由此构造一个 BufferedReader 对象
                String inputLine; 
                // 从输入流不断的读数据,直到读完为止
                while ((inputLine = in.readLine()) != null) 
                    temp=temp+inputLine+"\n"; 
                // 关闭输入流
                in.close();  
                String  weather     
                     =temp.substring ( temp.indexOf( "<body"), 
                                      temp.lastIndexOf( "body>")+5); 
                
                this.jEditorPane .setText(weather); 
            } 
            catch (Exception e) 
            { 
                e.printStackTrace(); 
            } 
            this.setTitle("天气预报"); 
            this.setSize(400, 166); 
            
        } 
        /** 
         * This method initializes jEditorPane     
         *     
         * @return javax.swing.JEditorPane     
         */    
        private JEditorPane getJEditorPane() 
        { 
            if (jEditorPane == null) 
            { 
                jEditorPane = new JEditorPane(); 
                jEditorPane.setContentType( "text/html"); 
            } 
            return jEditorPane; 
        } 
     }  //  @jve:decl-index=0:visual-constraint="70,19"

    以上代码中最关键的部分就是对话框中的 JEditorPane 对象,在初始化时,从一个 URL 获取天气预报信息,表现为 Html 标记片段,不用解析,直接调用 JEditorPane 的 setText 方法,就可以将 Html 格式的信息直接按解析过的方式显示,也就是天气预报信息了,

    此时 Action 中的调用需要做修改

        	 public void run(IAction action) 
        { 
            WeatherDialog wd=new WeatherDialog("北京"); 
            wd.setSize(400, 335); 
            wd.show();        
        }

    现在以运行时工作台的方式运行,点击天气预报菜单,可以看到下图:

    如果你在上海或者其他城市,试着修改 city 参数为"上海",再次运行,你将发现,你仍然能够得到该城市的天气预报(这里我们从网站上提取的信息,有点投机取巧了)。值得注意的是,Xmethod 网站提供了一个天气预报的 WebService,可惜只有美国的城市,不然我们可以使用 Web Service 调用获取天气预报,将会更酷。

    现在运行是工作台已经具备了天气预报的功能,还需要更进一步,将改插件导出发布,拷贝到 Eclipse 根目录的 plugins 目录中,重新启动(具体参见 Eclipse 帮助)。现在你自己的 Eclipse,就具备了天气预报的功能,只要你点击鼠标,就可以在编程之余轻松的获取天气信息。 除非你的老板认为你在工作时间随时了解天气情况不是一个好主意,我认为你完全可以将这个插件纳入个人收藏的插件之列。你也可以在此基础上扩展,增加一些配置文件和属性设置,定制出满足自己要求的插件。如果能够增加信息的自动过滤和筛选,那将是一次很愉快的体验,如果你有时间和兴趣,不妨一试。

    3. 邮件快速监控插件

    现在你的工作因为 Eclipse 而更加惬意,更具创造力,那么你还有什么不满?你是否厌倦了各种邮件客户端随时随地的骚扰你呢?你希望你在高兴的时候适时的了解一下邮件的概况?好了,既然想到了为什么犹豫呢,因为你是程序员,你就是要用 Eclipse 享受完全 DIY 的乐趣。

    3.1 生成插件

    本部分我们将在以上 myplugin 插件的基础上增加一个邮件过滤显示的对话框,类似的我们通过 VisualEditer 创建一个名为 MailDialog 的对话框,并增加一个 JEditPane 用来显示邮箱中我们关注的信息。

    修改 plugin.xml,增加一个"我的邮件"菜单

                 <action 
                   label="邮件信息"
                   icon="icons/sample.gif"
                   class="myplugin.actions.MailAction"
                   tooltip="邮件信息"
                   menubarPath="sampleMenu/sampleGroup"
                   toolbarPath="sampleGroup"
                   id="myplugin.actions.MailAction"> 
             </action>

    现在,你知道要创建一个 MailAction 的 Action 类,并在 在 Run 中增加如下代码

                  MailConfig mail=new MailConfig(); 
            
            String popServer="server"; 
            String popUser="zhaoyong"; 
            String popPassword="1234"; 
            
            // 设置需要过滤的关键字:发件人和邮件主题
            String [] strFrom=new String[] {"zhaoyong"}; 
            String [] strSubject=new String[] {"测试"}; 
            
            MailConfig[] mc =new MailConfig [] { mail }; 
            MailDialog md=new MailDialog(mc); 
            System.err.println("run run run ") ; 
            md.setSize(400, 335); 
             md.show();

    以上的代码编译不会通过,但是别着急,慢慢来,很快了。

    3.2 构建邮件监控对话框

    当然你需要建立一个 MailConfig 类用来表示一个邮箱的具体设置已及相关信息,这里就不在累述说明,详情参见参考资料中的代码。需要说明的式 MailConfig 除了要记录一个邮箱的地址,用户名和密码外,还提供 2 个关键字数组,如果为空,不加过滤,如果关键字有值,系统会根据发件人和邮件标题中是否包含关键字来进行显示邮件信息,已保证你的绝对自由。

    首先我们需要实现一个 MailConfig 类,表示邮件配置,每个 MailConfig 的对象代表一个邮件帐户,我们的系统将能显示多个邮箱的配置,每个 MailConfig 中使用一个数组来保存需要过滤的收件人和邮件地址。

    MailConfig 类的中的变量如下:

            String popServer; 
        String popUser; 
        String popPassword; 
        
     // 设 置 需 要 过 滤 的 关 键 字 : 发 件 人 和 邮 件 主 题
        String [] strFrom; 
        String [] strSubject;    
        
        // 是 否 显 示 邮 件 内 容 
     boolean isViewContent=false;

    同样,我们将使用一个对话框来显示邮件信息,MailDialog 需要引用 javaMail.jar, 和 activation.jar 这两个类包,确保已经有这两个类包并加入到项目的类路径中。最后的 MailDialog 代码如下:

     package myplugin; 
     import java.io.IOException; 
     import java.util.Properties; 
     import javax.mail.Folder; 
     import javax.mail.Message; 
     import javax.mail.MessagingException; 
     import javax.mail.Session; 
     import javax.mail.Store; 
     import javax.mail.internet.InternetAddress; 
     import javax.swing.JDialog; 
     import javax.swing.JEditorPane; 
     import javax.swing.JTextPane; 
     /** 
     * @author zhaoyong 
     * 
     * TODO To change the template for this generated type comment go to 
     * Window - Preferences - Java - Code Style - Code Templates 
     */ 
     public class MailDialog extends JDialog 
     { 
        
        private JEditorPane jEditorPane = null; 
        private JTextPane jTextPane = null; 
        
        // 可以显示多个邮件配置
        MailConfig[]  mc= null; 
       
        
        /** 
         * This method initializes 
         * 构造函数
         * @param mc : 需要显示的多个邮箱配置对象。
         */ 
        public MailDialog(MailConfig[] mc) 
        { 
        	
            super(); 
          
            if(mc!=null) 
                this.mc = mc; 
            else 
                System.err.println("邮件配置错误!") ; 
            
            initialize(); 
        } 
        /** 
         * This method initializes this 
         * 初始化
         * @return void 
         */ 
        private void initialize() 
        { 
            try 
            { 
                // 设定显示内容的面板
                this.setContentPane(getJTextPane()); 
                // 取得所有的新邮件信息
                String s= getAllMailInfo();            
                // 将信息显示在对话框中
                this.jTextPane .setText(s); 
               
                this.setTitle("邮件信息"); 
                this.setSize(251, 100); 
            } 
            catch (Exception e) 
            {           
            	 // 发生错误显示错误信息
            	 this.jTextPane .setText(e.toString()); 
                e.printStackTrace(); 
            } 
            
        } 
        /** 取得所有的邮箱的需要监控的邮件信息
    	 * 
    	 * @return String 
    	 */ 
        private String getAllMailInfo() 
        { 
        	 String allMailInfo=""; 
        	
        	 if (mc.length <1) 
        		 allMailInfo="没有配置邮箱!"; 
        	 else 
        	 { 
        		 for(int i=0;i<mc.length;i++) 
        		 { 
        			 // 循环获取每个邮箱的邮件信息
        			 allMailInfo=allMailInfo+getMailInfo(mc[i]); 
        		 } 
        	 } 
        	 // 还没有收到相关的邮件
        	 if (allMailInfo.trim().length() ==0) 
        		 allMailInfo="未检测到相关新邮件!"; 
        	 return allMailInfo; 
        	
        } 
        /* 
         * 得到一个邮箱中满足条件的所有新邮件的字符串形式
         **/ 
        private String getMailInfo(MailConfig mc) 
        { 
        	 // 最终输出的邮件信息
            String mailInfo=""; 
        	
            // 每个邮箱服务器上的 Store 和 Folder 对象
        	 Store store=null; 
            Folder folder=null; 
            
            try 
            { 
               
                Properties props = System.getProperties(); 
                // 与邮件服务器生成一个 Session 
                Session session = Session.getDefaultInstance( props,null); 
         
               // 给出服务器,用户名,密码连接服务器
                store = session.getStore("pop3"); 
                store.connect(mc.getPopServer(), mc.getPopUser(),mc.getPopPassword()); 
                
                // 取得默认的邮件 Folder 
                folder = store.getDefaultFolder(); 
                if (folder == null) 
                    throw new Exception("No default folder"); 
                
                // 取得收件箱
                folder = folder.getFolder("INBOX"); 
                if (folder == null) 
                    throw new Exception("No POP3 INBOX"); 
                
                // 以只读方式打开收件箱
                folder.open(Folder.READ_ONLY); 
                
                // 获取所有新邮件并处理
                Message[] msgs = folder.getMessages(); 
               
                for (int i = 0; i < msgs.length; i++) 
                { 
                    Message message= msgs[i]; 
                    // 取得每封邮件的信息,需要引用 MailConfig 对象进行关键字过滤
                    mailInfo = mailInfo+ getMessageInfo( message,mc);                
                } 
                
            } 
            catch (Exception ex) 
            { 
                ex.printStackTrace(); 
            } 
            finally 
            { 
                // 安全的关闭邮件服务器资源
                try 
                { 
                    if (folder!=null) folder.close(true); 
                    if (store!=null) store.close(); 
                } 
                catch (Exception ex2) {ex2.printStackTrace();} 
            } 
            return mailInfo; 
        } 
        
        /** 
         * 得到一封邮件的信息,需要根据 MailConfig 过滤
    	 * @param mailInfo 
    	 * @param message 
    	 * @return 邮件信息
    	 * @throws MessagingException 
    	 * @throws IOException 
    	 */ 
    	 private String getMessageInfo( final Message message ,final MailConfig mc) 
    		 throws MessagingException, IOException 
    	 { 
    		 // 返回的改邮件信息
    		 String mailInfo=""; 
    		
    		 String from=((InternetAddress)message.getFrom()[0]).getPersonal(); 
                
    		 if (from==null) 
    		    from=((InternetAddress)message.getFrom()[0]).getAddress(); 
    		
    		 String subject=message.getSubject(); 
    		
    		 // 如果满足过滤信息则显示,否则返回空
            if(isElementinString(from,mc.getStrFrom()) 
            		 ||isElementinString(subject,mc.getStrSubject()) )   
            {        	
            	 mailInfo=mailInfo+"发件人 : "+from+"\n";                
            	 mailInfo=mailInfo+"邮件主题 : "+subject+"\n"; 
            	 mailInfo=mailInfo+"发送时间 : "+message.getSentDate() +"\n"; 
            	
            	 // 如果显示内容,则打印内容
            	 if(mc.isViewContent) 
            		 mailInfo=mailInfo+message.getContent() +"\n"; 
            	
            	 mailInfo=mailInfo+"------------------------------------\n"; 
            } 
    		 return mailInfo; 
    	 } 
    	
    	 private JTextPane getJTextPane() 
        { 
            if (jTextPane == null) 
            { 
                jTextPane = new JTextPane(); 
            } 
            
            return jTextPane; 
        } 
       
    	 /** 
         * 判断目标关键字数组中是否有指定的字符串 , 进行过滤
    	 * @param targetStr :
    	 * @param keys :
    	 * @return 	如果有,返回 true, 否则返回 false 
    	 */ 
     
        private boolean isElementinString(String targetStr,String [] keys) 
        { 
        	 // 没指定过滤条件,显示所有
        	 if (keys==null) 
        		 return true; 
        	 // 指定字符串为空,直接返回 false 
        	 if (targetStr==null) 
        		 return false; 
        	 for(int i=0;i<keys.length ;i++) 
        	 { 
        		 if (targetStr.indexOf(keys[i])>-1) 
        			 return true; 
        	 } 
        	 return false; 
        } 
     
     }  
     //  @jve:decl-index=0:visual-constraint="10,10"--说明,这是 Visual Editor 添加的控制信息

    以上代码的注释已经保证你能够看清楚,这里就不加累述,有兴趣的可以自己试试,体验一切尽在掌握的快感。当然这个例子做的实在简单,因此也为你的进一步开发留有足够的余地。

    3.3 打包和发布

    到此,在 mypulgin 中增加了邮件信息菜单和对话框,系统的 plugin.xml 如下:

     <?xml version="1.0" encoding="UTF-8"?> 
     <?eclipse version="3.0"?> 
     <plugin 
       id="myplugin"
       name="Myplugin Plug-in"
       version="1.0.0"
       provider-name=""
       class="myplugin.MypluginPlugin"> 
       <runtime> 
          <library name="myplugin.jar"> 
             <export name="*"/> 
          </library> 
          <library name="lib/javaMail.jar"> 
             <export name="*"/> 
          </library> 
          <library name="lib/activation.jar"> 
             <export name="*"/> 
          </library> 
       </runtime> 
       <requires> 
          <import plugin="org.eclipse.ui"/> 
          <import plugin="org.eclipse.core.runtime"/> 
       </requires> 
       <extension 
             point="org.eclipse.ui.actionSets"> 
          <actionSet 
                label="Sample Action Set"
                visible="true"
                id="myplugin.actionSet"> 
             <menu 
                   label="我的空间"
                   id="sampleMenu"> 
                <separator 
                      name="sampleGroup"> 
                </separator> 
             </menu> 
             <action 
                   label="天气预报"
                   icon="icons/sample.gif"
                   class="myplugin.actions.SampleAction"
                   tooltip="Hello, Eclipse world"
                   menubarPath="sampleMenu/sampleGroup"
                   toolbarPath="sampleGroup"
                   id="myplugin.actions.SampleAction"> 
             </action> 
              <action 
                   label="邮件信息"
                   icon="icons/sample.gif"
                   class="myplugin.actions.MailAction"
                   tooltip="邮件信息"
                   menubarPath="sampleMenu/sampleGroup"
                   toolbarPath="sampleGroup"
                   id="myplugin.actions.MailAction"> 
             </action> 
          </actionSet> 
       </extension> 
     </plugin>

    实际上,我们在一个插件中加入了 2 个功能,因此就实现了我们的开发环境的自我扩展和定制。 同样,参考 Eclipse 的帮助,你可以轻松的再次将插件打包导出,并将其加入自己的 Eclipse 的 plugins 目录(可能需要解压缩),或通过 help 菜单的 Update 选项进行安装,注意导出时需要选定相关的类包。重新启动,你将发现自己的 IDE 已经多了自己的菜单,开发环境已经随着自己的意愿在改变了,程序员天生的满足感油然而生。

    现在,你可以在需要的时候点击菜单,了解你希望监控的邮件情况或者最近的天气情况,一切轻松的尽在掌握,Eclipse 的插件,就是这样全能。

    4. 总结

    那么,聪明的你有没有发现什么问题,对,上面的东西太粗糙,太简单了,你可以做进一步的优化设计和功能加强,比如,自己增加邮件配置文件而不是写在代码里面,动态监控弹出邮件预警(通过事先设定的紧急状态),你也许还会想起来很多的新的主意,比如我为什么不能有个能看电影的插件?或是 Eclipse 中飘出动听的音乐?别急,这些不一定需要你亲手去做, http://sourceforge.net/projects/rocexwang/有一个播放器插件,但是现在仅能播放音乐,国外已经有人用 Eclipse 开发游戏,也有人用 Eclipse 来做 MIS 系统的。http://www.matrix.org.cn/forum_view.asp?forum_id=25&view_id=10510 有一个国人开发的俄罗斯方块游戏,虽然简单了一点。当然,通过网址http://eclipse-plugins.2y.net/eclipse/index.jsp和 http://www.eclipseplugincentral.com/你可以找到很多的插件,如果你知道什么更好的插件,请告诉我。

    Eclipse 提供了一个纯的框架和插件结构,使得开发任何功能的插件都能成为现实。本文介绍了 2 个有趣的 Eclipse 插件的开发,可以使我们的工作环境增加了两个可爱的小功能,同时也使得你具备了基础的插件开发能力,借助 Eclipse 的强大功能,从此你可以把你的任何想法变为现实。同时请保持与别人的交流,我会很乐意了解你的新奇的插件,并收藏和学习任何好的插件,打造一个完全属于自己的个性化的开发环境。Eclipse 将在不久的将来成为一个全能的 Platform,这一点在全世界数以万计的开发人员的手中,正一点一点变为现实。

    在这里下载代码: myplugin.rar,这里打包的是整个 myplugin 项目,解压缩后导入 Eclipse,你可能需要重新配置类路径等工作。

    参考资料


    展开全文
  • eclipse插件开发

    2018-01-25 16:13:22
    假设目前存在一个成熟的Eclipse插件A,A有一个输入框和一个按钮,在输入框中输入一个邮箱地址,点击按钮可以向该邮箱中...写的比较混乱,大致意思就是Eclipse插件开发能不能实现一个插件向另一个插件的输入框输入东西
  • eclipse插件开发5——时间插件Timer开发过程及步骤

     Eclipse插件开发5——时间插件Timer开发实例详解


            这里做的TimeHelper插件设定为在菜单栏、工具栏提供快捷方式,需要在相应地方设置扩展点,最后弹出窗体显示时间。

            在上一篇文章里创建好了Time工程,在MANIFEST.MF的“扩展”选项卡里可以看到基本的插件扩展,当然这里最开始只有org.eclipse.core.runtime.application和org.eclipse.ui.perspectives,如下图所示:



            下面我们就要添加插件扩展,首先要说明几个东西:

    1.      commands:通过这个扩展可以自定义添加事件处理类(例如TimeHandler.java);

    2.      menu:在菜单栏里扩展插件,并且这个之后是要绑定到commands上的,commands的事件处理类用以处理相应事件;

    3.      toolbar:在工具栏里扩展插件,这个之后也需要绑定到commands上,commands的事件处理类用以处理相应事件;

            在右侧点击“添加”按钮,即可添加相应扩展,这里添加三个东西:org.eclipse.ui.commands、org.eclipse.ui.menus(之后要在工具栏用)、org.eclipse.ui.menus(之后要在菜单栏用),添加好后如下图所示:




    step1:新建commands并添加事件处理函数TimeHandler

            在org.eclipse.ui.commands上右键→新建command,在右侧里设定名称name为Time,id设为rcpproject.commands.Time(这个id只是一个区分,怎么写都可以,只要不重复,之后就是通过这个id来找到相应的commands的)。



            最主要的defaultHandler,这里双击defaultHandler超链接,就会提示创建一个新的处理类,这里在timer包下创建TimeHandler类,继承自org.eclipse.core.commands.AbstractHandler,接口为IHandler。代码如下:

    package timer;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import org.eclipse.core.commands.AbstractHandler;
    import org.eclipse.core.commands.ExecutionEvent;
    import org.eclipse.core.commands.ExecutionException;
    import org.eclipse.core.commands.IHandler;
    import org.eclipse.jface.dialogs.MessageDialog;
    import org.eclipse.ui.handlers.HandlerUtil;
    
    public class TimeHandler extends AbstractHandler implements IHandler {	
    	Date date = new Date(System.currentTimeMillis());
    	String str = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
    	
    	public Object execute(ExecutionEvent event) throws ExecutionException {
    			MessageDialog.openInformation(HandlerUtil.getActiveWorkbenchWindow(event).getShell(), 
    					"Time Helper", "Current time is " + str);
    		return null;
    	}
    }
    

            这里创建一个窗体,得到工作台事件.getActiveWorkbenchWindow(event),窗口标题为TimeHelper,对话框里显示当前时间。


    step2:添加事件到工具栏

            在org.eclipse.ui.menus上右键新建menuContribution,然后再右键新建toolbar(id设为SayTime),再右键新建commands,此时把commands绑定到之前写的处理类上,通过设定好的commandId来关联:此处设定为rcpproject.commands.Time(就是之前的org.eclipse.ui.commands的id)。当然,这里还可以添加icon,把图标添加上去,前提是之前你在icon文件夹下已经放好了相应图标元素。另外还可以设定tooltip,设置提示语为StartAlarm。




    step3:添加事件到菜单栏

    同样的方式,在下面第二个org.eclipse.ui.menus上右键新建menuContribution,然后再右键新建menu(id设为timeMenu),再右键新建commands,把commands绑定到之前写的处理类上,设定commandId关联:此处设定为rcpproject.commands.Time,同上操作。



            运行程序,这里需要在运行配置里设置一下“Run a product”:org.eclipse.app.package.rcp.product




           最后导出jar包,安装到plugins文件夹下,重启eclipse最终效果图:


            该项目源码我已经commit到github,有兴趣的可以去看一下:https://github.com/DianaCody/Time.git,并且插件的jar包下载也在README.md文档里有下载链接,把jar包放到plugin目录下即可安装,jar包也可以到我的csdn资源页下载:http://download.csdn.net/detail/dianacody/7659081

    展开全文
  • eclipse插件开发6——翻译小助手Translator开发实例  在上一篇文章中讲到了一个简单的eclipse插件开发实例,主要是对插件工程的基本创建步骤进行了讲解,这篇文章当中给出一个翻译小插件的实例,调用有道...

    Eclipse插件开发6——eclipse在线翻译插件Translator开发实例详解


            在上一篇文章中讲到了一个简单的eclipse插件开发实例,主要是对插件工程的基本创建步骤进行了讲解,这篇文章当中给出一个翻译小插件的实例,调用有道翻译API实现实时取词查询。


    一、项目中需要引用的库

    httpclient-4.1.3.jar

    httpclient-cache-4.1.3.jar

    httpcore-4.1.4.jar

    commons-io-2.1.jar

    commons-logging-1.1.1.jar

    httpmine-4.1.3.jar

    org.jdom-1.1.1.jar


    二、窗体设计

            先说明一下,API的key可以自行申请以获取链接。

            下面先看主要代码,这里为QueryDialog.java,通过添加文本框、按钮等,最后响应事件:

    import org.eclipse.jface.dialogs.Dialog;
    import org.eclipse.jface.dialogs.IDialogConstants;
    import org.eclipse.jface.dialogs.MessageDialog;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.MouseAdapter;
    import org.eclipse.swt.events.MouseEvent;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Control;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Group;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Monitor;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;
    import org.jdom.Document;
    import org.trans.fanyi.Activator;
    import org. trans.fanyi.httpclient.HttpClientUtil;
    import org. trans.fanyi.model.ResultModel;
    
    public class QueryDialog extends Dialog{
    	
    	private Text queryText;
    	private Text resultTextText;
    	private Button queryButton;
    	
        private Group infoGroup;
    
    	protected QueryDialog(Shell parentShell) {
    		super(parentShell);
    	}
    
    	@Override
    	protected Control createContents(Composite parent) {
    		  Shell shell = this.getShell(); 
    		  shell.setSize(400, 300);
    		  Monitor primary = shell.getMonitor(); 
    		  Rectangle bounds = primary.getBounds(); 
    		  Rectangle rect = shell.getBounds(); 
    		  int x = bounds.x + (bounds.width - rect.width) / 2; 
    		  int y = bounds.y + (bounds.height - rect.height) / 2 - 50;
    		  shell.setText("翻译小助手");
    		  shell.setLocation (x, y);
    		  shell.setImage(Activator.getImageDescriptor("/icon/menu.png").createImage());
    		  /*布局开始*/
    		  Composite composite = new Composite(parent, SWT.NONE);
    		  GridLayout layout = new GridLayout(3, false);
    		  layout.marginBottom = 10;
    		  layout.marginTop = 10;
    		  layout.marginLeft = 10;
    		  layout.marginRight = -30;
    		  layout.horizontalSpacing = 30;
    		  layout.verticalSpacing = 0;
    		  composite.setLayout(layout);
    		  composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		  /*headerComposite...*/
    		  Composite headerComposite = new Composite(composite, SWT.NONE);
    		  headerComposite.setLayout(new GridLayout(3, false));
    		  headerComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		  new Label(headerComposite, SWT.NONE).setText("请输入:");
    		  queryText = new Text(headerComposite, SWT.BORDER | SWT.MULTI);
    		  queryText.setText(DialogUtil.getSelecedTextFromEditor());//设置选中的文字
    		  queryText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		  queryButton = new Button(headerComposite, SWT.NONE);
    		  queryButton.setText("查询");
    		  //给Button添加事件
    		  addListenerToButton();
    		  //******************************//
    		  //***GROUP START***//
    		  Composite infoComposite = new Composite(parent, SWT.NONE);
    		  infoComposite.setLayout(new GridLayout(1, true));
    		  infoComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		  infoGroup = new Group(infoComposite, SWT.NONE);
    		  infoGroup.setText("查询结果");
    		  GridLayout groupLayout = new GridLayout(1, false);
    		  groupLayout.marginBottom = 5;
    		  groupLayout.marginTop = 5;
    		  groupLayout.marginLeft = 10;
    		  groupLayout.marginRight = 10;
    		  infoGroup.setLayout(groupLayout);
    		  infoGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		  infoGroup.pack();
    		  resultTextText = new Text(infoGroup, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.READ_ONLY);
    		  resultTextText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		  resultTextText.setText("" + System.getProperty("line.separator") + 
    		  		""+ System.getProperty("line.separator") + 
    		  		""+ System.getProperty("line.separator") + 
    		  		""+ System.getProperty("line.separator") + 
    		  		""+ System.getProperty("line.separator") + 
    		  		""+ System.getProperty("line.separator") + 
    		  		""+ System.getProperty("line.separator") + 
    		  		""+ System.getProperty("line.separator") + 
    //		  		""+ System.getProperty("line.separator") + 
    		  		"");
    		  return super.createContents(parent);
    	}
    
    	@Override
    	protected Button createButton(Composite parent, int id,
    	        String label, boolean defaultButton) {
    	    if (id == IDialogConstants.CANCEL_ID || id == IDialogConstants.OK_ID) {
    	    	return null;
    	    }
    	    return super.createButton(parent, id, label, defaultButton);
    	}
    	
    	public void addListenerToButton(){
    		queryButton.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseDown(MouseEvent e) {
    				String qtext = queryText.getText();
    				if(qtext.isEmpty()){
    					MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "提示", "请输入或选择查询");
    				} else {
    					Document doc = HttpClientUtil.getDocumentByQuery(qtext);
    					if(doc != null){
    						ResultModel rm = HttpClientUtil.convertDocToModel(doc);
    						resultTextText.setText(ResultModel.getFormattedDisplatString(rm));
    					}
    				}
    				super.mouseDown(e);
    			}
    		});
    	}
    }
    


           把导出的jar包安装到plugins下,最终运行效果图:



            项目源码已经commit在github上,有兴趣的可以去看一下:https://github.com/DianaCody/Translator.git,并且插件的jar包下载也在README.md文档里有下载链接,把jar包放到plugin目录下即可安装,jar包也可以到我的csdn资源页下载http://download.csdn.net/detail/dianacody/7659093
    展开全文
  • Eclipse插件开发2——SWT cdsv
  • Eclipse插件开发7——插件发布jar包 最省事的方式就是直接导出jar包,然后放到eclipse的plugins目录下,重启eclipse即可。 step1:对需要打包的插件工程右击→导出(Export)
  • Eclipse插件开发1——eclipse内核、扩展点机制 一、Eclipse内核结构 Eclipse是一个称作插件加载器的小内核,有上百个插件,eclipse最重要的特征就是它的插件架构,其核心非常小,而由许多功能插件组合而成...
  • Eclipse插件开发3——OSGi、RCP 一、OSGi 1. 什么是OSGi框架  OSGi(Open Service Gateway Initiative)框架是运行在JavaVM环境里的服务平台。框架提供的主要功能是对应用和组件的生命周期管理,系统可以在...
  • Eclipse插件开发4——插件JDE、PDE开发方式及plugin.xml配置文件结构
  • Eclipse插件开发流程

    千次阅读 2017-03-31 10:05:38
    Eclipse插件开发流程 最近工作比较繁忙,都没有时间写技术博客了,最近工作中用gradle管理项目,每次更改了模块关系或者更新了SVN,都要重新gradle和重新刷新和编译,每次要做这些操作都要切换到工作空间的文件夹中...
  • Eclipse插件开发方法与实战

    热门讨论 2010-07-01 00:38:51
    Eclipse插件开发方法与实战,一本不错的eclipse的插件开发参考书,感兴趣的可以下下看看!
  • Eclipse插件开发作为Java开发的一种,因此调试也和Java远程调试相似,需要设置JVM参数。普通的Java程序会在启动脚本中编写远程调试端口,而Eclipse插件需要在Eclipse.ini文件中配置。具体配置如下:-startupplugins/...
  • Eclipse插件开发 原书第3版中文版.pdf

    千次下载 热门讨论 2011-12-15 13:28:09
    Eclipse插件开发 原书第3版中文版.pdf 想学eclipse插件开发的童鞋,相信这本书对你一定非常有用,不信可以去搜索一下这本书的评价就知道了。 亲,记得给个评价哦!
  • Eclipse插件开发HelloWorld篇

    千次阅读 2016-06-20 10:42:46
    Eclipse插件开发初体验,通过下面的步骤,可以很快地得到一个HelloWorld版本的Eclipse插件。该示例的最终效果,是会通过点击新增加的一个按钮或者菜单弹出一个提示框(内容是HelloWorld)。 这是一篇Eclipse插件...
  • 最近需要开发一个Eclipse插件,Google了一下,在IBM developerWorks找到很多精彩的文章,对Eclipse插件开发也有了初步的了解,特此分享~ 1、开发 Eclipse 插件 2、利用 Eclipse Visual Editor 项目构建 GUI 3、...
  • Eclipse插件开发之拖拽功能

    千次阅读 2018-02-11 18:02:35
    Eclipse插件开发也可支持用户自定义的拖拽行为。平时我们见到的拖动eclipse的各个视图窗口,调整布局,将java文件直接拖动到本地某个目录。这些都是eclipse拖拽支持的表现。要想实现拖拽,可以对eclipse预先设定好的...
  • Eclipse插件开发之新建向导

    千次阅读 2018-12-03 12:05:45
    Eclipse插件开发之新建向导   添加向导入口...
  • 如题 eclipse插件开发 结合svn 但是现在需要对项目资源管理器中的文件进行权限管理,文件分配到人,没有权限的用户无法上传至svn。 现有思路参照svn仓库,但是略微麻烦,我的思路是在编辑提交时弹出密码校验,或者是...
  • 有没有哪位大神搞eclipse插件开发的,小弟最近在搞这个,需要获取一下就是eclipse左边项目工程的目录,也就是路径啥的,有没有完整的插件包可以供参考一下,或者哪位大神指导一下,跪谢。
  • 【eclipse】eclipse插件开发(一)

    千次阅读 2019-07-01 01:21:57
    我们完全可以开发属于自己的一套插件,安装在eclipse插件目录下,即可使用我们的插件。 下面说下eclipse插件的快速开发。 1、在eclipse中创建plugin工程 (如果没有找到Plug-in Development 或 Plug-ins,看这个文章...
  • eclipse插件开发流程

    千次阅读 2011-04-22 16:15:00
    eclipse插件开发流程 1. menu file>new >plug in project >xxxx>finish 2. 文件夹结构 xxxaction.java 具体的一个动作 plugin.xml 3.RUN DEBGU RUN>RUN AS >ECLIPSE APPLICATION ...
  • eclipse插件开发总结

    千次阅读 2011-04-22 16:16:00
    eclipse插件开发总结 1. 在 ECLIPSE主菜单上增加菜单 在plugin.xml 中,增加 2. 在ECLISPE上增加工具栏图标 --- toolbarPath="sampleGroup" 3.将菜单与ACTION结合起来 menubarPath="sampleMenu/...
  • Eclipse插件开发WEB项目

    万次阅读 2012-12-23 22:03:28
    Eclipse插件开发JAVAEE项目    很多朋友在开发WEB应用时常使用MyEclipse,MyEclipse是一个强大的IDE不可否认。但是在很多情况下   MyEclipse很慢,原因是MyEclipse集成了很多插件而这些插件在启动时就会加载...
  • Eclipse插件开发学习笔记【1】—Eclipse环境搭建 - 石头de春风 - 博客园 石头de春风 博客园 首页 新随笔 联系 订阅管理 随笔 - 0  文章 - 0  评论 - 0 Eclipse插件开发学习笔记
  • 进行Eclipse插件开发时,有时需要为插件开发自己的控制台,以便在必要输出提示信息,本文介绍进行Eclipse插件开发时,如何实现自己的控制台。 1. 扩展控制台扩展点。 对org.eclipse.ui.console.consoleFactories...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,499
精华内容 8,199
关键字:

eclipse插件开发