`
zhongkem
  • 浏览: 151473 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

RCP程序中从数据库中读取XML内容后显示在Editor中

阅读更多

这两天花了不少时间在如何把从数据库中读到的内容显示在一个Editor中,因此总结下吧。

需求:数据库中保存了服务对应的wsdl文档,现在需要根据服务ID从数据库中读取该文档内容,然后显示在一个编辑器中,要求对xml文档能着色

    应该说想明白后很简单,只需要两三步就可以了。

1.编写一个类实现IStorage接口,我程序中取名为WsdlStorage,具体如下

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.PlatformObject;

/**
 * 包装wsdl文档,使之能在编辑器中打开*
 *
 */
public class WsdlStorage extends PlatformObject  implements IStorage  {

	private InputStream inputStream;//wsdl文档对应的输入流
	private String  wsdlName;//wsdl对应的名字
	
	public WsdlStorage(InputStream inputStream, String wsdlName) {
		super();
		this.inputStream = inputStream;
		this.wsdlName = wsdlName;
	}

	/**
	 * 返回要显示 的具体内容
	 */
	@Override
	public InputStream getContents() throws CoreException {
		// TODO Auto-generated method stub		
		return  inputStream;
	}

	@Override
	public IPath getFullPath() {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * 返回在编辑器中显示的名字
	 */
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return wsdlName;
	}

	/**
	 * 设置成只读
	 */
	@Override
	public boolean isReadOnly() {
		// TODO Auto-generated method stub
		return true;
	}

}

2. 编写一个类实现IStorageEditorInput接口,我程序中是WsdlEditorInput,具体内容如下:

import java.io.InputStream;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.IStorageEditorInput;

public class WsdlEditorInput extends PlatformObject  implements IStorageEditorInput {

	private IStorage storage;
	
	public WsdlEditorInput(IStorage storage) {
		super();
		this.storage=storage;
	}

	/**
	 * 重点是这个方法
	 */
	@Override
	public IStorage getStorage() throws CoreException {
		// TODO Auto-generated method stub
		return storage;
	}

	@Override
	public boolean exists() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public ImageDescriptor getImageDescriptor() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return storage.getName();
	}

	@Override
	public IPersistableElement getPersistable() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getToolTipText() {
		// TODO Auto-generated method stub
		return "toolTip:"+storage.getName();
	}

}

 

    如果你只是用一般的文本编辑器打开,可以直接跳到第4步。

     要用xml编辑器打开具体内容,还要实现着色功能,这里要做的事会稍微多些

3.我这里准备从eclipse plugin中自带的XMLEditor进行一些修改,使之符合我的要求

   把例子中的代码都拷到自己工程下,只要修改一个类即可为我所用。

    XMLDocumentProvider修改如下 :

//继承自StorageDocumentProvider
public class XMLDocumentProvider extends StorageDocumentProvider {
    //这个方法一定要改,其实只需加入输入参数Object element,其它不用动
	protected void setupDocument(Object element,IDocument document) {
		if (document != null) {
			IDocumentPartitioner partitioner =
				new FastPartitioner(
					new XMLPartitionScanner(),
					new String[] {
						XMLPartitionScanner.XML_TAG,
						XMLPartitionScanner.XML_COMMENT });
			partitioner.connect(document);
			document.setDocumentPartitioner(partitioner);
		}
	}

	protected IAnnotationModel createAnnotationModel(Object element) throws CoreException {
		return null;
	}
}

 4.写个上下文菜单,获得wsdl内容,然后在编辑器中打开 吧

/**
 * 用户选择一个服务时,打开该服务对应的wsdl文档
 */
public class ShowWsdlCommandHandler extends AbstractHandler {


	int sid = -1;
	String serviceName = "";
	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
		IWorkbenchPage page = window.getActivePage();
		// 获得当前选择的服务id和名字
		ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event)
				.getActivePage().getSelection();
		if (selection != null && selection instanceof IStructuredSelection) {
			IStructuredSelection selections = (IStructuredSelection) selection;
			Object obj = selections.getFirstElement();
			if (obj instanceof ServiceModel) {
				sid = ((ServiceModel) obj).getSid();
				serviceName = ((ServiceModel) obj).getServiceName();
			}
		}
		// 获得需要打开的wsdl内容
		InputStream in = null;		
		in = ServiceDAO.getWsdlContent(sid);//从数据库中读取wsdl文档
		//在Editor中打开 
		IStorage storage = new WsdlStorage(in, serviceName);		
		IStorageEditorInput input = new WsdlEditorInput(storage);
		if (page != null)
			try {
				//用xml编辑器打开
				page.openEditor(input,XMLEditor.ID);
				//如果只想用普通编辑器打开,则直接调用下面代码 更简单
				//page.openEditor(input,EditorsUI.DEFAULT_TEXT_EDITOR_ID);
				} catch (PartInitException e) {				
				e.printStackTrace();
			}

		return null;
	}

}

 

大家关心的应该没几行,从第24行开始看就行了,只要你的程序能获得一个InputStream,替换掉我的代码应该就可以用了。

 

前面说过,如果你只想用一般的编辑器打开一些内容,那么省略到第三步,第四步中直接 调用

page.openEditor(input,EditorsUI.DEFAULT_TEXT_EDITOR_ID);
即可,应该很简单的。

 

如果大家觉得第三步看不懂,不妨先想想如何实现打开一个外部的xml文件。。。这个会了,打开非文件的内容也就会了。

 

 

附1:如果运行中会出现问题,不妨试试在plugin.xml中的dependencies中加上下面三个:

       org.eclipse.ui.workbench.texteditor;
        org.eclipse.jface.text;
        org.eclipse.ui.editors;

分享到:
评论

相关推荐

    rcp的文本编辑器的实例

    在Eclipse中,可以通过“Export” -> “Eclipse Product”完成此步骤,生成可执行的RCP应用程序。 在“TextEditor”这个子文件中,很可能包含了实现上述功能的源代码和资源文件。通过分析这些代码,初学者可以学习...

    RCP 开发自学教程

    - 允许应用程序在操作系统任务栏中显示图标。 - 用于通知用户应用程序的状态或提供快速访问的功能。 #### 五、视图 **5.1 添加示例视图** - **示例视图**: - 通过简单的例子展示如何创建视图。 - 可以展示...

    rcp开发小知识

    根据给定文件中的标题、描述、标签以及部分内容,下面将详细阐述有关Eclipse RCP(Rich Client Platform)的基础知识及关键技术点。 ### Eclipse RCP基础知识概述 #### 1. Workbench工作台 - **概念**: 工作台是...

    Eclipse SWT开发点滴

    - 重写SWT控件在普通的Java程序中是可以实现的,但在RCP环境中可能会遇到字节码验证错误。 #### 八、SWT的Dialog 1. **Dialog的设计** - SWT的Dialog不支持可视化开发,但可以在Dialog内部放置一个Composite控件...

    eclipse3.4的可视化开发VE

    EMF 在 Eclipse 3.4 中的应用,使得开发者可以定义数据模型,这些模型可以是 XML 文件,也可以是数据库结构,甚至可以是业务对象。EMF 提供了丰富的 API 来操作这些模型,包括读取、写入、验证和转换。此外,EMF 还...

    Eclipse从入门到精通

    本书《Eclipse从入门到精通》不仅涵盖了Eclipse的基本使用,还深入介绍了SWT/JFace、插件开发、RCP平台开发等高级主题,并且包含了Web开发方面的内容。通过学习本书,读者不仅可以掌握Eclipse的基本操作,还能深入...

    ODF accessibility validation tool-开源

    在项目中,`org.odf.xmleditor` 可能是一个负责编辑和查看 ODF 文档的模块,它可能包含对 ODF 格式解析和展示的实现。`org.odf.rcp` 很可能是这个工具的主应用程序模块,整合了 Eclipse RCP 框架,并且可能包含了...

Global site tag (gtag.js) - Google Analytics