通常用 IPartFactory 和 IPartFactory 所建立的視圖和編輯器,只能建立用視圖或編輯器延伸點來登錄的組件。 用 IPartFactory 所建立的組件視 IWorkbenchPage 而定,而且存在時間不能比 IWorkbenchPage 還久。IPartFactory 用 ID 來建立組件,且組件的實作類別不需要是 API。您可以從 IWorkbenchPage 取得 IPartFactory。 組件也會在它們的建構子中採用 IPartFactory,以建立巢狀子項。
本範例示範如何使用 IPartFactory 來建立視圖。
/**
* 用來建立編輯器和視圖的實例。
*
* @自 3.1
*/
public interface IPartFactory {
/**
* 建立視圖的實例。傳回新建視圖的 <code>ISite</code>。
* 用組件完成呼叫程式時,呼叫程式應除去組件的主要控制。
* 做法是呼叫 <code>ISite.getControl().dispose()</code>,
* 或除去母項組合。
*
* 視圖的 @param viewId ID,以 org.eclipse.ui.views 延伸點登錄
* @param parentComposite 視圖的母項組合。如果已順利完成建立視圖,
* 它會在這個組合中建立一個完新的子項控制項。
* @param context 視圖的本端環境定義。這個物件可以置換視圖的所有相依關係。
* 如果視圖有一個在本端環境定義中找不到的相依關係,
* org.eclipse.core.component.types 延伸點便會提供預設實作。
* @param savedState 前次儲存的組件狀態,如果沒有的話,就是空值
* @傳回新建視圖的 ISite
* @如果無法建立組件,便會擲出 CoreException
*/
public ISite createView(String viewId, Composite parentComposite,
IContainerContext context, IMemento savedState) throws CoreException;
/**
* 建立編輯器的實例。傳回新建編輯器的 <code>ISite</code>。
* 用組件完成呼叫程式時,呼叫程式應除去組件的主要控制。
* 做法是呼叫 <code>ISite.getControl().dispose()</code>,
* 或除去母項組合。
*
* 編輯器的 @param editorId ID,以 org.eclipse.ui.editors 延伸點登錄
* @param parentComposite 編輯器的母項組合。如果已順利完成建立編輯器,
* 它會在這個組合中建立一個完新的子項控制項。
* @param context 編輯器的本端環境定義。這個物件可以置換組件的所有相依關係。
* 如果組件有一個在本端環境定義中找不到的相依關係,
* org.eclipse.core.component.types 延伸點便會提供預設實作。
* @param input 這個編輯器的 IEditorInput
* @param savedState 前次儲存的組件狀態,如果沒有的話,就是空值
* @傳回新建編輯器的 ISite
* @如果無法建立組件,便會擲出 CoreException
*/
public ISite createEditor(String editorId, Composite parentComposite,
IContainerContext context, IEditorInput input, IMemento savedState) throws
CoreException;
}
下列是使用 IPartFactory 來建立視圖的動作範例
/**
* 示範如何從 IWorkbenchPage 利用視圖 ID 來開啟視圖。
*/
public class CreateViewByIdAction implements IWorkbenchWindowActionDelegate
{
private IWorkbenchWindow window;
public void run(IAction action) {
IWorkbenchPage page = window.getActivePage();
if (page == null) {
//
...已移除不想要的錯誤處理程式碼...
return;
}
final Shell tempShell = new Shell(window.getShell(),
SWT.DIALOG_TRIM | SWT.RESIZE);
tempShell.setLayout(new FillLayout());
tempShell.setText("Problems");
IPartFactory factory = page.getPartFactory();
try {
factory.createView(IPageLayout.ID_PROBLEM_VIEW, tempShell, new ContainerContext(),
null);
} catch (CoreException e) {
//
...已移除不想要的錯誤處理程式碼...
}
// 開啟對話框
tempShell.open();
Display d = tempShell.getDisplay();
while (!tempShell.isDisposed())
{
if (!d.readAndDispatch())
d.sleep();
}
}
public void init(IWorkbenchWindow window) {
this.window = window;
}
// ...已移除其餘的(空白)方法...
}
/**
* 示範如何依程式的方式用「網站」類別來開啟組件。
*/
public class ProgrammaticViewCreationExampleAction implements IWorkbenchWindowActionDelegate
{
private IWorkbenchWindow window;
public void run(IAction action) {
// 建立 Shell
final Shell tempShell =
new Shell(window.getShell(), SWT.DIALOG_TRIM | SWT.RESIZE);
tempShell.setLayout(new
FillLayout());
tempShell.setText("Name
test view");
Bundle thisPlugin = ComponentExamplesPlugin.getDefault().getBundle();
try {
// 建立 NameTestView 組件的實例(這一行是這個範例的重點)
// 它示範了如何在不呼叫 NameTestView 的建構子的情況下,使用「網站」類別。
Site testPart = new Site(tempShell, new ContainerContext(),
thisPlugin,
NameTestView.class);
} catch (CoreException
e) {
// ...已移除不想要的錯誤處理程式碼...
}
// 開啟限制模式的對話框
tempShell.open();
Display d = tempShell.getDisplay();
while (!tempShell.isDisposed())
{
if (!d.readAndDispatch())
d.sleep();
}
}
public void init(IWorkbenchWindow window) {
this.window = window;
}
// ...已移除其餘的(空白)方法...
}