blog220217.Eclipse JFace之Viewer

本文以eclipse 4.20为参考.

缘起

Jface viewer是对SWT widget的封装.
Viewer做为一个功能实体, 将显示, 数据和操作整合起来, 方便使用.
Viewer分两大类contentViewer和textViewer. 本文不讨论textViewer.

contentViewer采用model-content/labelProvider-widget的功能划分结构, 有4个部分组成,
*. input, 也称作model, 即viewer要展示的数据.
*. control, 即widget, 用于显示和交互.
*. contentProvider, 是viewer和input间的中介点, 提供dispose/inputChanged回调, 以及从input抽取content的功能.
*. labelProvider, 从content中计算text和image, widget显示中使用.

contentViewer通常用于list, table, 和tree等复合数据的呈现.

Viewer的主要类

abstract class Viewer implements IInputSelectionProvider;
	class TextViewer;
	abstract class ContentViewer;
		abstract class StructuredViewer implements IPostSelectionProvider;
			class TabbedPropertyViewer;
			abstract class StructuredViewer implements IPostSelectionProvider;
				abstract class AbstractListViewer;
					class ComboViewer;
					class ListViewer;
				abstract class ColumnViewer;
					abstract class AbstractTableViewer;
						class TableViewer;
					abstract class AbstractTreeViewer;
						class TreeViewer;

Viewer class

Viewer类实现了如下的功能,
*. 对input object的存取. 对应IInputProvider.
*. 支持selection的设置/获取, 和对selection变动的监听. 对应ISelectionProvider.
*. 支持properties.

//Viewer的重要methods
public abstract class Viewer implements IInputSelectionProvider {
	@Override
	public abstract Object getInput();
	public abstract void setInput(Object input);
	public abstract Control getControl();
	@Override
	public abstract ISelection getSelection();
	public abstract void setSelection(ISelection selection, boolean reveal);
	public abstract void refresh();


	@Override	
	public void setSelection(ISelection selection) {}
	@Override
	public void addSelectionChangedListener(ISelectionChangedListener listener) {}
	@Override
	public void removeSelectionChangedListener(}

	public void addHelpListener(HelpListener listener) {}
	public void removeHelpListener(HelpListener listener) {}

	public void setData(String key, Object value) {}
	public Object getData(String key) {}

	public Item scrollDown(int x, int y) {}
	public Item scrollUp(int x, int y) {}

ContentViewer class

ContentViewer引入contentProvider和labelProvider, 实现了widget与model的集成.
具体包括,
*. hookControl()支持widget dispose时, 自动重置contentViewer.
*. get/setContentProvider().
*. get/setlabelProvider(), 以及变动回调labelProviderChanged().
*. get/setInput()

contentViewer创建过程中, setInput()应当放在setContentProvider()和setLabelProvider()后面.

IContentProvider和ILabelProvider

contentProvider是viewer和input之间的中介点. 提供dispose和inputChanged回调.
structuredContentProvider负责由inputObj计算content, 处理的是1toN结构的情形, 包括list/table/tree结构.
treeContentProvider负责处理的是tree层次结构的情形, 包括tree结构.

public interface IContentProvider {
	//by contentViewer.handleDispose
	default void dispose() {}

	//by ContentViewer.setContentProvider()/setInput()/handleDispose().
	default void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
}


public interface IStructuredContentProvider extends IContentProvider {
	//viewer用来从inputObj得到要显示的子项objects, 这些objects会经ILabelProvider进一步求出各自的label和image
	//1 ==> n 关系, 例如list和table中还有多个item, tree中节点的父子关系等
	//by StructuredViewer.getRawChildren()
	public Object[] getElements(Object inputElement);		
}				

public interface ITreeContentProvider extends IStructuredContentProvider {
	@Override
	public Object[] getElements(Object inputElement);

	public Object[] getChildren(Object parentElement);
	public Object getParent(Object element);
	public boolean hasChildren(Object element);
}

labelProvider负责为viewer提供input的text和image, 通常用于在widget显示.

public interface IBaseLabelProvider {
	public void addListener(ILabelProviderListener listener);
	public void dispose();
	public boolean isLabelProperty(Object element, String property);
	public void removeListener(ILabelProviderListener listener);
}

public interface ILabelProvider extends IBaseLabelProvider {
	public Image getImage(Object element);
	public String getText(Object element);
}

StructuredViewer, AbstractListViewer, AbstractTableViewer和AbstractTreeViewer class

所谓structured是指viewer input(即model)中包含多个子元素, 每个子元素都可以借助labelProvider求得要显示的text和image.
例如1个list中可以显示多个子项.

此外StructuredViewer也支持DnD

StructuredViewer的重要派生类,
*. AbstractListViewer的子类ComboViewer和ListViewer针对的是combo和list widget.
*. AbstractTableViewer的子类TableViewer针对的是table widget.
*. AbstractTreeViewer的子类TreeViewer针对的是tree widget.

Viewer的listeners

Viewer支持的listeners,
*. selection
*. help
StructuredViewer增加的listeners,
*. double click
*. open
*. post selection changed

AbstractTreeViewer增加的listeners,
*. tree collapsed
*. tree expanded

驽马一架 一花一世界 2022/2/17

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
org.xml.sax.SAXParseException; systemId: file:/D:/app.uix; lineNumber: 1; columnNumber: 1; 文件提前结束。 at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327) at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1437) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1019) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327) at javax.xml.parsers.SAXParser.parse(SAXParser.java:328) at com.android.uiautomator.tree.UiHierarchyXmlLoader.parseXml(UiHierarchyXmlLoader.java:130) at com.android.uiautomator.UiAutomatorModel.<init>(UiAutomatorModel.java:51) at com.android.uiautomator.actions.OpenFilesAction.run(OpenFilesAction.java:55) at org.eclipse.jface.action.Action.runWithEvent(Action.java:498) at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584) at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501) at org.eclipse.jface.action.ActionContributionItem$6.handleEvent(ActionContributionItem.java:452) at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source) at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source) at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source) at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source) at org.eclipse.jface.window.Window.runEventLoop(Window.java:825) at org.eclipse.jface.window.Window.open(Window.java:801) at com.android.uiautomator.UiAutomatorViewer.main(UiAutomatorViewer.java:78) null rootnode after parsing.
最新发布
07-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值