一、开发需求
1、读取文件中的数据,用树形结构视图展现。
2、添加一个过滤器,可以过滤所需的数据,可以模糊查询。
二、构建树形视图需要:
视图查看器:TreeViewer,内容提供器:ContentProvider ,标签提供器:LabelProvider;
建立树的模型:包括树的父节点,树的子节点。
代码如下:
父节点:
Class ComponentTreeParent extends ComponentTreeObject {
private ArrayList<ComponentTreeObject > children ;
public ConponentTreeParent (String name){
super(name);
children =new ArrayList<ComponentTreeObject >();
}
public void addChild(ComponentTreeObject child ){
children.add(child);
child.setParent(this);
child.setType(this.getName() );
}
public void removeChild( ComponentTreeObject child ){
children.remove(child);
children.setParent(null);
}
public ComponentTreeObject [ ] getChildren () {
return (ComponentTreeObject [ ] ) children.toArray( new ComponentTreeObject [children.size( )]);
}
public boolean hasChildren () {
return children.size()>0;
}
}
子节点:
Class ComponentTreeObject implements IAdaptable {
private String name;
private String type;
private String desp ;
private ComponentTreeParent parent ;
public ComponentTreeObject (String name ){
this.name = name;
}
public String getType () {
return this.type;
}
public void setType (String type) {
this.type = type;
}
public String getName () {
return name ;
}
public String getDesp(){
return desp;
}
public void setDesp(){
this.desp =desp;
}
public void setParent (ComponentTreeParent parent){
this.parent = parent ;
}
public ComponentTreeParent getParent () {
return parent ;
}
public String toString () {
return getName () ;
}
public <T> T getAdapter (Class <T> key ){
return null;
}
}
内容提供器:ViewContentProvider
Class ViewContentProvider implements ITreeContentProvider {
private ComponentTreeParent invidibleRoot;
public Object[ ] getElements (Object parent ) {
if (parent .equals (getViewSite ( ))) {
if (invisibleRoot == null ;
initialize ();
return getChildren ( invisibleRoot );
}
return getChildren(parent );
}
public Object getParent (Object child) {
if (child instanceof ComponentTreeObject ){
return ((ComponentTreeObject )child ) .getParent( );
}
return null ;
}
public Object [ ] getChildren (Object parent ) {
if (parent instanceof ComponentTreeParent ){
return ((ComponentTreeParent )parent.getChildren() ;
}
return new Object[0] ;
}
public boolean hasChildren (Object parent ) {
if (parent instanceof ComponentTreeParent ){
return ((ComponentTreeParent )parent.hasChildren() ;
}
return false;
}
private void initialize () {
Tree tree = viewer.getTree();
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
TreeColumn column =new TreeColumn (tree,SWT.LEFT);
column .setText("名称");
column.setWidth(300);
column =new TreeColumn (tree,SWT.LEFT);
column .setText("描述");
column.setWidth(500);
ComponentTreeParent tp = null;
ComponentTreeObject to = null;
invisibleRoot = new ComponentTreeParent (" ");
Map<String , ComponentTreeParent> map = new HashMap<String , Component>();
//按相对路径读取文件
try {
URL url = Activator.getDefault().getBundle().getEntry(FILE_URL);
URL fileUrl = FileLocator.toFileURL(url);
URI fileURI = new URI( fileUrl.getProtocol ( ), fileUrl.getPath(),null);
BufferedReader bufr = new BufferedReader( new InputStreamReader
(new FileInputStream(new File(fileURI)), "UTF-8"));
for( String line = bufr.readLine(); line != null; line = bufr.readLine()) {
String [ ] str = line.split("/");
for (int i = 0;i<str.length; i++){
str[i] = str[i].trim();
}
if (!map.containsKey(str[0])){
tp = new ComponentTreeParent(str[0]);
map.put(str[0],tp);
invisibleRoot.addChild(tp);
tp.setParent(invisibleRoot);
to = new ComonentTreeObject(str[1]);
if(str.length>2 ){
to.setDesp(str[2]);
if(str.length>3){
tp.setDesp(str[3]);
}
}
tp.addChild(to);
to.setParent(tp);
}else{
tp = map.get(str[0]);
to = new ComonentTreeObject(str[1]);
if(str.length>2 ){
to.setDesp(str[2]);
}
tp.addChild(to);
to.setParent(tp);
}
}
bufr.close();
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (URISyntaxException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
标签提供者 :ViewLableProvider
Class ViewLableProvider extends LableProvider implements ITableLableProvider {
@override
public Image getColumnImage(Object obj,int columnIndex) {
switch (columnIndex){
case 0:
String imagKey = ISharedImages.IMG_OBJ_ELEMENT;
if(obj instanceof ComponentTreeParent)
imageKey = IShareImages.IMG_OBJ_FOLDER;
return PlatformUI.getWorkbench().getSharedImages().getImage(imagekey);
case 1:
return null;
default:
return null;
}
}
@override
public String getColumnText(Object obj,int columnIndex){
ComponentTreeObject treeObject = (ComponentTreeObject)obj;
switch(columnIndex){
case 0:
return treeObject.getName();
case 1:
return treeObject.getDesp();
default:
return "";
}
}
}
创建视图
public void createPartControl(Composite parent){
//视图过滤器
FilteredTree filterTree = new FilteredTree(parent,SWT.MULTI|SWT.V_SCROLL|SWT.H_SCROLL|SWT.SINGLE),new PattrenFilter(),true);
viewer = filterTree.getViewer();
drillDownAdapter = new DrillDownAdapter (viewer);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLableProvider(new ViewLablePsrovider());
viewer.setInput(getViewSite());
PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(),"ComponentView.viewer");
getSite().getSelectionProvider(viewer);
makeActions();
hookContextMenu();
hookDoubleClickAction();
contributeToActionBars();
}