rcp嵌入Eclipse自带的console

来源:互联网 发布:澳大利亚移民知乎 编辑:程序博客网 时间:2024/05/21 14:04

原文:http://blog.csdn.net/salc3k/article/details/6938750

参考地址:http://blog.csdn.net/by84788186/article/details/6332299

要使用Rcp嵌入Eclipse自带的console,首先,在plugin.xml的dependencies依赖关系中添加org.eclipse.ui.console


然后在plugin.xml中扩展consoleFactories

其中ConsoleFactory.java代码如下:


  1. public class ConsoleFactory implements IConsoleFactory {  
  2.     static MessageConsole console = new MessageConsole("Console Info:",  
  3.             null);  
  4.       
  5.     @Override  
  6.     public void openConsole() {  
  7.         showConsole();  
  8.     }  
  9.     public static void showConsole() {  
  10.           
  11.         if (console != null) {     
  12.                IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();     
  13.                IConsole[] existing = manager.getConsoles();     
  14.                boolean exists = false;     
  15.                //add the new MessageConsole instance into the control manager and show     
  16.                for (int i = 0; i < existing.length; i++) {     
  17.                    if (console == existing[i])     
  18.                        exists = true;     
  19.                }         
  20.                if(!exists){      
  21.                    manager.addConsoles(new IConsole[] { console });     
  22.                }     
  23.                manager.showConsoleView(console);    
  24.            }    
  25.     }  
  26.     public static void closeConsole(){  
  27.         IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();  
  28.         if (console != null){  
  29.             manager.removeConsoles(new IConsole[]{ console });  
  30.         }  
  31.     }  
  32.     public static MessageConsole getConsole(){  
  33.         return console;  
  34.     }  
  35.   
  36. }  

然后在Perspective.java透视图中将其显示出来

[java] view plaincopyprint?
  1. public class Perspective implements IPerspectiveFactory {  
  2.   
  3.     public void createInitialLayout(IPageLayout layout) {  
  4.         ConsoleFactory cf = new ConsoleFactory();  
  5.         layout.addView(IConsoleConstants.ID_CONSOLE_VIEW, IPageLayout.BOTTOM,  
  6.                 0.70f, layout.getEditorArea());  
  7.   
  8.         cf.openConsole();  
  9.     }  
  10. }  

现在该console就会显示在透视图的下半部分了。但是这样加入的控制台显示的显示的信息条数是不限制的,输出的内容多了就会把RCP应用跑死,可以调用MessageConsole.setWaterMarks(5000, 8000);来限制输出条数。

定制Console View的ToolBar:

去掉RCP Console View 中的Open Console和Select Console按钮。

代码如下:

view plain
  1. IWorkbenchPage page = PlatformUI.getWorkbench().getWorkbenchWindows()[0].getPages()[0];  
  2. IViewPart viewpart = page.findView(IConsoleConstants.ID_CONSOLE_VIEW);  
  3. IActionBars actionBar = viewpart.getViewSite().getActionBars();  
  4. IToolBarManager toolbarMgr = actionBar.getToolBarManager();  
  5. IContributionItem[] items = toolbarMgr.getItems();  
  6. for (IContributionItem item : items) {  
  7.     if (item instanceof ActionContributionItem) {  
  8.         IAction action = ((ActionContributionItem) item).getAction();  
  9.         String text = action.getText();  
  10.         if (text.equals("Open Console") || text.equals("Select Console")) {  
  11.             toolbarMgr.remove(item);  
  12.         }  
  13.     }  
  14. }  
  15. actionBar.updateActionBars();  

如果不需要toobar中的任何东西,可以直接

view plain
  1. toolbarMgr.removeAll();  

在console中打印日志信息

新建ConsoleHandler类:

[java] view plaincopyprint?
  1. public class ConsoleHandler{    
  2.     private static MessageConsoleStream consoleStream;    
  3.       
  4.     public static void info(final String _message){    
  5.         Display.getDefault().asyncExec(new Runnable(){    
  6.             @Override    
  7.             public void run() {    
  8.                 consoleStream = ConsoleFactory.getConsole().newMessageStream();    
  9.                 consoleStream.println(new SimpleDateFormat("HH:mm:ss").format(new Date())+ "(INFO)" +     
  10.                          " " + _message);    
  11.             }    
  12.         });    
  13.     }    
  14.     public static void error(final String _message){    
  15.         Display.getDefault().asyncExec(new Runnable(){    
  16.             @Override    
  17.             public void run() {    
  18.                 consoleStream = ConsoleFactory.getConsole().newMessageStream();    
  19.                 consoleStream.setColor(new Color(null,255,0,0));    
  20.                 consoleStream.println(new SimpleDateFormat("HH:mm:ss").format(new Date())+ "(ERROR)" +     
  21.                          " " + _message);    
  22.             }           
  23.         });    
  24.     }          
  25. }    

然后随时可以使用ConsoleHandler的静态方法输入日志。

可以看到现在的rcp上有很多menubar,这些是我们所不需要的,可以通过在代码中添加下列代码来简化menubar

view plain
  1. IWorkbenchPage page = PlatformUI.getWorkbench().getWorkbenchWindows()[0]  
  2.                 .getPages()[0];  
  3.         IViewPart viewpart = page.findView(IConsoleConstants.ID_CONSOLE_VIEW);  
  4.         // IActionBars actionBar = viewpart.getViewSite().getActionBars();  
  5.         IToolBarManager toolbarMgr = viewpart.getViewSite().getActionBars()  
  6.                 .getToolBarManager();  
  7.         // IToolBarManager toolbarMgr = actionBar.getToolBarManager();  
  8.         IContributionItem[] items = toolbarMgr.getItems();  
  9.         for (IContributionItem item : items) {  
  10.             if (item instanceof ActionContributionItem) {  
  11.                 IAction action = ((ActionContributionItem) item).getAction();  
  12.                 String text = action.getText();  
  13.                 if (text.equals("Open Console")  
  14.                         || text.equals("Select Console")) {  
  15.                     toolbarMgr.remove(item);  
  16.                 }  
  17.             }  
  18.         }  
  19.         viewpart.getViewSite().getActionBars().updateActionBars();  

  但是这些代码如果添加在ConsoleFactory.java中,要么出现透视图无法显示,也有会出现nullpoint的错误,后来将这些代码添加到该透视图中另外一个viewpart的构造函数中,问题得到解

决。

0 0