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