當(dāng)視圖之間有聯(lián)系時(shí),當(dāng)關(guān)掉某個(gè)視圖時(shí),其他視圖怎樣知道并作出一些動作,找了很久,找到一些資料,加上自己的總結(jié),放上來。
先轉(zhuǎn)載這篇資料,來自:http://blog.csdn.net/starshus/archive/2006/01/04/570540.aspx
-----------------------------------------------------------------------------------------------
1.判斷這個(gè)view當(dāng)前是否為active的好方法:

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

2.自己的rcp程序里有多個(gè)view,它們之間是有聯(lián)系的,如果關(guān)掉其中一個(gè)view時(shí),
要做些事,怎么知道它是什么時(shí)候關(guān)掉的呢?我在rcp的新聞組上找到了答案:
關(guān)掉Editor或Viewer時(shí)調(diào)用自己邏輯的方法:
1)如果是editor,那么讓它實(shí)現(xiàn)org.eclipse.ui.ISaveablePart2接口.
2)如果是view,在view class里面加上下面這個(gè)方法,并且調(diào)用它,比如:
在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
}
}
});
}


或者這樣寫也可以:
讓這個(gè)view類實(shí)現(xiàn)PartListener接口
然后在這個(gè)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也能實(shí)現(xiàn)ISaveablePart2
2)在view關(guān)閉時(shí)要做什么事時(shí),建議就用IPartListener2
3)View上的X是與關(guān)閉動作關(guān)聯(lián)在一起的,要用別的方法達(dá)到目的你只有寫自己的
關(guān)閉動作.
4)ISaveablePart有意義嗎?
當(dāng)然有,有些程序的data model在view上,它們能被修改,所以它們必須有在view
關(guān)閉時(shí)保存的能力.(所以用戶的修改不會丟失)
有些時(shí)候editors不適合展示數(shù)據(jù)model.
-----------------------------------------------------------------------------------------------
以上文章轉(zhuǎn)載自:http://blog.csdn.net/starshus/archive/2006/01/04/570540.aspx 感謝原作者。
實(shí)際使用中,發(fā)現(xiàn)其實(shí)有兩個(gè),IPartListener 和 IPartListener2 ,都在包org.eclipse.ui中。他們的區(qū)別在于IPartListener2 更加豐富一些,多了 Hidden,Visible,InputChanged 這三個(gè)事件,而且參數(shù)也有區(qū)別。
IPartListener 里面的方法的參數(shù)為 :IWorkbenchPart part
IPartListener2 里面的方法的參數(shù)為:IWorkbenchPartReference partRef
當(dāng)使用 IPartListener2 時(shí),要獲取到part,這樣就行: partRef.getPart(false)
關(guān)于IPartListener(2)結(jié)合view或action使用的方式,轉(zhuǎn)載的文章已經(jīng)講得很清楚了,感覺不錯(cuò),謝謝原作者。
在action中,我是在構(gòu)造函數(shù)和dispose函數(shù)中分別加入和取消的,代碼如下:

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視圖即大綱視圖,當(dāng)你第一次打開它,會觸發(fā)partOpen 事件,然后立刻觸發(fā) partVisible 事件,當(dāng)你再關(guān)掉它,則只會觸發(fā) partHidden 事件,而不會觸發(fā)close。所以他們實(shí)際上是沒有真正的關(guān)閉,當(dāng)?shù)谝淮未蜷_以后,都會一直存在,知道eclipse退出。
而用戶自己建立的view,好像就不是這樣運(yùn)作的,當(dāng)?shù)谝淮未蜷_的時(shí)候,會觸發(fā)open和visible事件,當(dāng)關(guān)閉時(shí),會觸發(fā)hidden和close事件。
這種情況,就要使用IPartListener2來實(shí)現(xiàn)了。