posts - 20, comments - 16, trackbacks - 0, articles - 0

当视图之间有联系时,当关掉某个视图时,其他视图怎样知道并作出一些动作,找了很久,找到一些资料,加上自己的总结,放上来。

先转载这篇资料,来自:http://blog.csdn.net/starshus/archive/2006/01/04/570540.aspx
-----------------------------------------------------------------------------------------------

1.判断这个view当前是否为active的好方法:

 

private boolean isActivePart() {
        IWorkbenchPart part 
= getViewSite().getPage().getActivePart();
        
return part != null && part.equals(this);        
}


2.自己的rcp程序里有多个view,它们之间是有联系的,如果关掉其中一个view时,
要做些事,怎么知道它是什么时候关掉的呢?我在rcp的新闻组上找到了答案:

关掉Editor或Viewer时调用自己逻辑的方法:

1)如果是editor,那么让它实现org.eclipse.ui.ISaveablePart2接口.

2)如果是view,在view class里面加上下面这个方法,并且调用它,比如:
在ViewPart#init()里面:

private void initPartListener() {
getSite().getPage().addPartListener(
new IPartListener() {

    
public void partOpened(IWorkbenchPart part) {
        
if (part != YourPartView.this{
            
return;
        }
 else {
            
// your logics
        }

    }


    
public void partDeactivated(IWorkbenchPart part) {
        
if (part != YourPartView.this{
            
return;
        }
 else {
        
// your logics
        }

    }


    
public void partClosed(IWorkbenchPart part) {
        
if (part != YourPartView.this{
            
return;
        }
 else {
            
// your logics
        }

    }


    
public void partBroughtToTop(IWorkbenchPart part) {
        
if (part != YourPartView.this{
            
return;
        }
 else {
            
// your logics
        }

    }


    
public void partActivated(IWorkbenchPart part) {
        
if (part != YourPartView.this{
            
return;
        }
 else {
            
// your logics
        }

        }

    }
);
}





或者这样写也可以:
让这个view类实现PartListener接口
然后在这个view的createPartControl()里加上:
getViewSite().getPage().addPartListener(this);

或是这样写:

 

public void createPartControl(Composite parent) {
                
            getSite().getWorkbenchWindow(). getPartService().addPartListener(
this);
}

public void dispose() 
           getSite().getWorkbenchWindow(). getPartService().removePartListener(
this);
}




注意:

1)Views也能实现ISaveablePart2

2)在view关闭时要做什么事时,建议就用IPartListener2

3)View上的X是与关闭动作关联在一起的,要用别的方法达到目的你只有写自己的
关闭动作.

4)ISaveablePart有意义吗?
当然有,有些程序的data model在view上,它们能被修改,所以它们必须有在view
关闭时保存的能力.(所以用户的修改不会丢失)
有些时候editors不适合展示数据model.

-----------------------------------------------------------------------------------------------
以上文章转载自:http://blog.csdn.net/starshus/archive/2006/01/04/570540.aspx 感谢原作者。

实际使用中,发现其实有两个,IPartListener 和 IPartListener2 ,都在包org.eclipse.ui中。他们的区别在于IPartListener2 更加丰富一些,多了 Hidden,Visible,InputChanged 这三个事件,而且参数也有区别。
IPartListener 里面的方法的参数为 :IWorkbenchPart part
IPartListener2 里面的方法的参数为:IWorkbenchPartReference partRef

当使用 IPartListener2 时,要获取到part,这样就行: partRef.getPart(false)

关于IPartListener(2)结合view或action使用的方式,转载的文章已经讲得很清楚了,感觉不错,谢谢原作者。

在action中,我是在构造函数和dispose函数中分别加入和取消的,代码如下:

 

public class MenuHandler extends AbstractHandler implements ISelectionChangedListener , IPartListener {
    
/**
     * The constructor.
     * 
     * 
@throws EngineException
     
*/

    
public MenuHandler() {
        AuditPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow()
                .getActivePage().addPartListener(
this);
    }


    @Override
    
public void dispose() {
        AuditPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow()
                .getActivePage().removePartListener(
this);
        
super.dispose();
    }



@Override
    
public void partActivated(IWorkbenchPart part) {
        System.out.println();
    }

    
    

    @Override
    
public void partBroughtToTop(IWorkbenchPart part) {
        
// TODO Auto-generated method stub
        System.out.println();
    }


    @Override
    
public void partClosed(IWorkbenchPart part) {
        
// TODO Auto-generated method stub

    }


    @Override
    
public void partDeactivated(IWorkbenchPart part) {
        
// TODO Auto-generated method stub

    }


    @Override
    
public void partOpened(IWorkbenchPart part) {
        
// TODO Auto-generated method stub
        if (part instanceof MyShootView) {
            ((MyShootView) part)
                    .addSelectionChangedListener(
this);

    }





}


不过需要注意,eclipse里面有些视图,例如 ContentOutline视图即大纲视图,当你第一次打开它,会触发partOpen 事件,然后立刻触发 partVisible 事件,当你再关掉它,则只会触发 partHidden 事件,而不会触发close。所以他们实际上是没有真正的关闭,当第一次打开以后,都会一直存在,知道eclipse退出。

而用户自己建立的view,好像就不是这样运作的,当第一次打开的时候,会触发open和visible事件,当关闭时,会触发hidden和close事件。


这种情况,就要使用IPartListener2来实现了。




 


只有注册用户登录后才能发表评论。


网站导航: