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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值