0
点赞
收藏
分享

微信扫一扫

blog220217.Eclipse JFace之Viewer

爱喝酒的幸福人 2022-02-18 阅读 26

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