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來實現了。




           

          主站蜘蛛池模板: 宁波市| 东丰县| 阿城市| 宝坻区| 甘孜| 鸡东县| 武威市| 大悟县| 新竹县| 淅川县| 丘北县| 墨竹工卡县| 芦山县| 黔西县| 梅州市| 泸水县| 板桥市| 名山县| 梁山县| 安国市| 成安县| 曲周县| 陆川县| 金坛市| 彭山县| 望江县| 庆阳市| 富裕县| 平乐县| 阿拉尔市| 桂东县| 图木舒克市| 高要市| 石阡县| 和田市| 阿尔山市| 峡江县| 临武县| 西华县| 宾阳县| 濮阳市|