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;

你可能感兴趣的:(eclipse,xml,UI)