当视图之间有联系时,当关掉某个视图时,其他视图怎样知道并作出一些动作,找了很久,找到一些资料,加上自己的总结,放上来。
先转载这篇资料,来自:http://blog.csdn.net/starshus/archive/2006/01/04/570540.aspx
-----------------------------------------------------------------------------------------------
1.判断这个view当前是否为active的好方法:
 

 private boolean isActivePart()
private boolean isActivePart()  {
{
 IWorkbenchPart part = getViewSite().getPage().getActivePart();
        IWorkbenchPart part = getViewSite().getPage().getActivePart();
 return part != null && part.equals(this);
        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()
private void initPartListener()  {
{

 getSite().getPage().addPartListener(new IPartListener()
getSite().getPage().addPartListener(new IPartListener()  {
{


 public void partOpened(IWorkbenchPart part)
    public void partOpened(IWorkbenchPart part)  {
{

 if (part != YourPartView.this)
        if (part != YourPartView.this)  {
{
 return;
            return;

 } else
        } else  {
{
 // your logics
            // your logics
 }
        }
 }
    }


 public void partDeactivated(IWorkbenchPart part)
    public void partDeactivated(IWorkbenchPart part)  {
{

 if (part != YourPartView.this)
        if (part != YourPartView.this)  {
{
 return;
            return;

 } else
        } else  {
{
 // your logics
        // your logics
 }
        }
 }
    }


 public void partClosed(IWorkbenchPart part)
    public void partClosed(IWorkbenchPart part)  {
{

 if (part != YourPartView.this)
        if (part != YourPartView.this)  {
{
 return;
            return;

 } else
        } else  {
{
 // your logics
            // your logics
 }
        }
 }
    }


 public void partBroughtToTop(IWorkbenchPart part)
    public void partBroughtToTop(IWorkbenchPart part)  {
{

 if (part != YourPartView.this)
        if (part != YourPartView.this)  {
{
 return;
            return;

 } else
        } else  {
{
 // your logics
            // your logics
 }
        }
 }
    }


 public void partActivated(IWorkbenchPart part)
    public void partActivated(IWorkbenchPart part)  {
{

 if (part != YourPartView.this)
        if (part != YourPartView.this)  {
{
 return;
            return;

 } else
        } else  {
{
 // your logics
            // your logics
 }
        }
 }
        }
 });
    });
 }
}


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

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

 public void dispose()
public void dispose()  {
{ 
 getSite().getWorkbenchWindow(). getPartService().removePartListener(this);
           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
public class MenuHandler extends AbstractHandler implements ISelectionChangedListener , IPartListener  {
{

 /** *//**
    /** *//**
 * The constructor.
     * The constructor.
 *
     * 
 * @throws EngineException
     * @throws EngineException
 */
     */

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

 @Override
    @Override

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


 @Override
@Override

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

 @Override
    @Override

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

 @Override
    @Override

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

 }
    }

 @Override
    @Override

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

 }
    }

 @Override
    @Override

 public void partOpened(IWorkbenchPart part)
    public void partOpened(IWorkbenchPart part)  {
{
 // TODO Auto-generated method stub
        // TODO Auto-generated method stub

 if (part instanceof MyShootView)
        if (part instanceof MyShootView)  {
{
 ((MyShootView) part)
            ((MyShootView) part)
 .addSelectionChangedListener(this);
                    .addSelectionChangedListener(this);

 }
    }






 }
}
不过需要注意,eclipse里面有些视图,例如 ContentOutline视图即大纲视图,当你第一次打开它,会触发partOpen 事件,然后立刻触发 partVisible 事件,当你再关掉它,则只会触发 partHidden 事件,而不会触发close。所以他们实际上是没有真正的关闭,当第一次打开以后,都会一直存在,知道eclipse退出。
而用户自己建立的view,好像就不是这样运作的,当第一次打开的时候,会触发open和visible事件,当关闭时,会触发hidden和close事件。
这种情况,就要使用IPartListener2来实现了。