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