zoukankan      html  css  js  c++  java
  • 【转】Eclipse Plugin 在 Console上打印出message

    org.eclipse.ui.console

     转自:http://blog.csdn.net/rujielaisusan/article/details/4505188

    首先这里主要用到的是org.eclipse.ui.console这个包,所以现在顺道先来了解一下:

    org.eclipse.ui.console是一个可扩展的console视图插件,利用它可以实现各种console,并把它们显示出来。该插件本身就实现了一个Message Console,对于只需要进行消息输出的RCP应用来说,其功能已经足够:

    • 调用ConsolePlugin.getDefault().getConsoleManager()得到一个IConsoleManager引用
    • 创建所需的MessageConsole,并把它(们)加入到上一步得到的Console Manager里
    • 调用MessageConsole.newMessageStream()得到连接这个Console的输出流(MessageConsoleStream)
    • 通过MessageConsoleStream的print,println方法进行消息的输出。当然需要把Console View打开才能看到输出,可以利用Window/Show View来打开,或者把该View在放到自己实现的Perspective的初始布局中

    下面简要列举其设计及实现要点:

    • 作为一个通用的console及其显示的框架,org.eclipse.ui.console定义了以下几个接口:
      • IConsole. 代表一个Console,主要方法是createPage,用来创建该Console在Console View中的分页
      • IConsole Manager. 代表一个Console Manager,对Console进行管理
      • IConsoleListener. 代表一个Console Listener,当Console被加进Console Manager中或从中删除时会得到通知
      • IConsoleView. 代表Console View,用来显示各个Console
    • org.eclipse.ui.console 本身实现了一个Console View,通过在org.eclipse.ui.views扩展点上扩展的方式。该实现已经相当一般化,一般情况下是不需要实现自己的Console View的.它的实现类是ConsoleView,是一个 PageBookView,每个Console以一个Page的方式呈现,效果就是我们在eclipse里看到的那个Console标签页。
    • Console 和PageBookView Page的关系。简言之,就是MVC中Model和View的关系,Model是Console,Page负责把它显示出来。对于TextConsole 和TextConsolePage,这种Model-View关系是通过TextConsole和(TextConsolePage所关联的)TextConsoleViewer之间的 Model-View关系来实现的,如图所示。再看TextConsole和TextConsoleViewer的Model-View关系的实现:TextConsole关联一个 ConsoleDocument,实现了IDoucment接口,而 TextConsoleViewer是一个TextViewer,在其构造函数中设置其Document为TextConsole关联的 Document(ConsoleDocument),由此可以看出,TextConsole和TextConsolePage之间的Model-View关系最终还是由jface text框架的IDocument和TextViewer之间的Model-View 关系来实现的。Console和其Page的关系是通过IConsole的createPage方法来建立的,比如,TextConsole的 createPage创建的TextConsolePage对象保存了相应TextConsole对象的引用;对于MessageConsole来说,由于它没有覆盖IOConsole的createPage方法,因此创建的是一个IOConsolePage对象, 该IOConsolePage对象保存的虽然是一个TextConsole引用,但其实际类型是MessageConsole。
    • 当向第1步得到的Console Manager里加Console时,如果此时ConsoleView已经实例化,则它会是该Console Manager 的一个Console Listener,因此会受到consolesAdded的事件通知,ConsoleView对此事件的处理是调用相应 Console的createPage方法创建一个IPageBookViewPage并显示它。如果ConsoleView是以后实例化的,则它实例化时会从Console Manager取到当前在Console Manager中的所有Console,对每个Console创建一个 IPageBookViewPage。
    • MessgaeConsole是一个IOConsole,IOConsole用于显示I/O流里的Text;而IOConsole又是一个TextConsole,TextConsole是一个抽象的文本Console,支持正则表达式匹配和超级链接,它包含一个Document,概念上就是 jface text框架中的文档概念,其实现类是ConsoleDocument。MessageConsole.createPage返回的实际上是一个 IOConsolePage,其createControl方法的实现创建了一个IOConsoleViewer,该viewer是jface text框架的TextViewer,其Document被设置为这个MessageConsole的Document,因此当MessageConsole的 Document改变时, 其Page上的TextViewer将反映该变化。
    • IOConsole关联一个Doucment Partitioner(IConsoleDocumentPartitioner),该接口扩展自jface text框架中的 IDocumentPartitioner,其实现类是IOConsolePartitioner.当通过MessageConsoleStream往 MessageConsole上输出消息时,消息实际进入了这个IOConsolePartitioner内部保存的一个消息列表里。IOConsolePartitioner里实现了一个Job Scheduling,其效果就是不断检查该消息列表,把其中的消息添加到MessageConsole的Document的末尾,当然这个工作是在另外的 线程中作的。此时如果ConsoleView已实例化,则该MessageConsole会和其Page上IOConsoleViewer相关联,因此消息便能在该Console的Page中显示出来了。
    =============================================================================================
    按照上面的方法 我们有如下的代码予以实现

     
    1. // 新建一个MessageConsole  
    2. MessageConsole console = new MessageConsole("My Console"null);  
    3.   
    4. // 通过ConsolePlugin得到ConsoleManager,并添加新的MessageConsole ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { console });  
    5.   
    6. // 新建一个MessageConsoleStream  
    7. MessageConsoleStream consoleStream = console.newMessageStream();  
    8.   
    9. // 使用MessageConsoleStream来打印信息到Console View  
    10. consoleStream.println(source);  
    display.getSystemColor(SWT.COLOR_RED)
    但是这样做 需要记住一件事情,由于你是需要发布成一个plugin的,所以需要配置好它的runtime classpath,不然就会像我之前一直做的那样,虽然已经加入了classpath,但是运行依旧没有任何作用:

    打开plugins.xml,

    在Dependencies项中,点击add,加入org.eclipse.ui.console依赖项。

    ==========================================================================================

    如果希望在console上面添加颜色字体的话,需要用到的是IOConsoleOutputStream

    IOConsoleOutputStream有个setColor的方法。在Console输出的时候,会调用这个方法设置字体的颜色。
    用户还可以扩展一些控制台一些特殊字符串的属性:
    如颜色、字体、连接等

    例子:



    1. // 新建一个MessageConsole  
    2. MessageConsole console = new MessageConsole("My Console"null);  
    3.   
    4. // 通过ConsolePlugin得到ConsoleManager,并添加新的MessageConsole ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { console });  
    5.   
    6. // 新建一个IOConsoleOutputStream   
    7. IOConsoleOutputStream consoleStream =   
    8.   console.getIOConsoleOutputStream();  
    9.   
    10. Display display = Display.getCurrent();  
    11. // 使用IOConsoleOutputStream来打印信息到Console View  
    12. consoleStream.setColor(display.getSystemColor(SWT.COLOR_RED));  
    13. consoleStream.write(message);  

     

     

    http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-comm/

    http://salever.iteye.com/blog/882923

  • 相关阅读:
    写代码实现两个 goroutine,其中一个产生随机数并写入到 go channel 中,另外一 个从 channel 中读取数字并打印到标准输出。最终输出五个随机数。
    05| RWMutex:读写锁的实现原理及避坑指南
    go 面试题
    go 局部变量在哪
    12 _ atomic:要保证原子操作,一定要使用这几种方法
    11 _ Context:信息穿透上下文
    什么是线程
    go面试题
    redis连接池 go
    docker 指定版本rpm包安装
  • 原文地址:https://www.cnblogs.com/dorothychai/p/3450222.html
Copyright © 2011-2022 走看看