程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> RCP客戶端實現保存不同用戶的界面狀態

RCP客戶端實現保存不同用戶的界面狀態

編輯:關於JAVA

在一個多用戶的系統中,每個用戶都有自己的喜好例如,視圖的位置、大小、以及顯隱狀態,都要對 其進行保存,我們可以在工作台初始化的方法進行設置:

Java代碼

@Override
  public void initialize(IWorkbenchConfigurer configurer)
  {
  super.initialize(configurer);
  configurer.setSaveAndRestore(true);
  }

但是保存的都是最後一個用戶登錄以後設置的界面,這樣之前用戶保存的狀態就被覆蓋了,

本來想研究一下Eclipse是如何獲取到這些信息並且保存的,但是時間緊迫,急於實現效果,

所以出此下策,把自己的想法實踐了一下,目的達到了,但是似乎有些山寨,拿來和大家分享一下吧 ,望請高手指教!

設計思路:

當Application的start方法運行的時候,這裡是我們寫登錄的代碼,在用戶登成功,用戶名便獲取到 ,我們以用戶名加上"_workbench.xml"作為該用戶的配置文件名稱,用一個File對象判斷其是否存在,如 果存在將它讀入到內存中,然後不管默認的 workbench.xml是否存在都將其覆蓋, ApplicationWorkbenchAdvisor被創建的時候,才會去加載用戶的配置文件,用戶的配置順理成章的被工 程所加載,說道這裡前提是先保存用戶的配置文件。

Java代碼

int returnCode = PlatformUI.createAndRunWorkbench(display, new  ApplicationWorkbenchAdvisor());

這段代碼是start方法中默認的一行代碼,在中行代碼結束時,也就是工程關閉時候,具體的說是 workbench.xml文件已經被改寫完畢的時候,我們將內容讀取到內存中,根據當前登錄的用戶名加 上"_workbench.xml"做為新的配置文件,將默認配置文件中的數據寫入到該文件中進行保存,然後將默認 的配置文件刪除(如果不刪除也可以,後果是當一個從來沒有登錄過系統的用戶來說,第一次登錄的時候 ,享用的是上一次用戶配置的界面)。

具體實施:

Java代碼

package rcptest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;

/**
  * This class controls all aspects of the application's execution
  */
public class Application implements IApplication
{

     /*
      * (non-Javadoc)
      *
      * @seeorg.eclipse.equinox.app.IApplication#start (org.eclipse.equinox.app.
      * IApplicationContext)
      */
     public Object start(IApplicationContext context) throws Exception
     {
         Display display = PlatformUI.createDisplay();
         try
         {
             //默認配置文件名
                   String defaultName = "workbench.xml";
             //配置文件所在路徑,可以根據產品插件所在路徑動態獲取,為了方 便硬編碼實現
             String workBenchPath = "D:/runtime- rcptest.application/.metadata/.plugins/org.eclipse.ui.workbench/";
             //路徑全名稱
             String absolutePath = workBenchPath + defaultName;
             //登錄的用戶名,啟動第一次後嘗試更換名稱看效果
             String loginUser = "SystemManager";
             //用戶專有的配置文件名稱
             String userCfgPath  = workBenchPath + loginUser +"_"+  defaultName;

             File f = new File(userCfgPath);
             if (f.isFile())
             {
                 // 文件存在則將用戶的配置文件中的數據,寫入到默認的配 置文件中
                 FileInputStream fis = new FileInputStream(f);
                 byte[] data = new byte[fis.available()];
                 fis.read(data);
                 FileOutputStream fos = new FileOutputStream (absolutePath);
                 fos.write(data);
                 fos.close();
             }
             int returnCode = PlatformUI.createAndRunWorkbench(display,  new ApplicationWorkbenchAdvisor());

             //工程關閉後改變配置文件名
             f = new File(absolutePath);
             if(f.isFile())
             {
                 //如果默認的配置文件存在(肯定是存在的,判斷一下安全), 將默認的配置文件數據寫入到用戶配置文件中
                 FileInputStream fis = new FileInputStream(f);
                 byte[] data = new byte[fis.available()];
                 fis.read(data);
                 FileOutputStream fos = new FileOutputStream (userCfgPath);
                 fos.write(data);
                 fos.close();
                 //刪除默認的配置文件,如果不刪除則當一個沒有登錄過系 統的用戶來說,第一次登錄享用的是上一次用戶配置的界面  
                 f.deleteOnExit();
             }
             if (returnCode == PlatformUI.RETURN_RESTART)
                 return IApplication.EXIT_RESTART;
             else
                 return IApplication.EXIT_OK;
         }
         finally
         {
             display.dispose();
         }

     }

     /*
      * (non-Javadoc)
      *
      * @see org.eclipse.equinox.app.IApplication#stop()
      */
     public void stop()
     {
         final IWorkbench workbench = PlatformUI.getWorkbench();
         if (workbench == null)
             return;
         final Display display = workbench.getDisplay();
         display.syncExec(new Runnable()
         {
             public void run()
             {
                 if (!display.isDisposed())
                     workbench.close();
             }
         });
     }

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved