Eclipse 插件开发之 树形视图展示要点

一、开发需求
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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值