Invokatron的歷史
首先
· 哪些細節數據需要保存?
· 這些數據在內存中用什麼來表現?POJO
· 這些數據的存儲格式是怎樣的?數據庫表
· 輸入數據的方式有哪幾種?用
在我們繼續工作之前必須回答這些問題
· 一個Java類
· 我將把數據表現為擴展Properties類的類
· 我將使用的格式是屬性文件
· 在
Document(文檔)類
下一步是編寫文檔類
public class InvokatronDocument
extends Properties
{
public static final String PACKAGE =
public static final String SUPERCLASS =
public static final String INTERFACES =
}
使用Properties類可以更簡單地分析和保存我們的數據
有了這個類之後
String package =document
定制向導
請看一看前面的文章中所出現的向導
圖
它只有一個頁面
我們來分析一下這個向導
生命周期方法
我們應該重載這些方法
· Constructor(構造函數)
· init(IWorkbench workbench
· dispose()
· finalize()
美化方法
這些方法都是用於裝飾向導窗體的
· setWindowTitle(String title)
· setDefaultPageImageDescriptor(ImageDescriptor image)
· setTitleBarColor(RGB color)
按鈕方法
這些方法控制著向導按鈕的實用性和行為
· boolean canFinish()
· boolean performFinish()
· boolean performCancel()
· boolean isHelpAvailable()
· boolean needsPreviousAndNextButtons()
· boolean needsProgressMonitor()
頁面方法
這些方法控制著頁面的外觀
· addPages()
· createPageControls(Composite pageContainer)
· IWizardPage getStartingPage()
· IWizardPage getNextPage(IWizardPage nextPage)
· IWizardPage getPreviousPage(IWizardPage previousPage)
· int getPageCount()
其它有用的方法
這些都是有用的輔助方法
· setDialogSettings(IDialogSettings settings)
· IDialogSettings getDialogSettings()
· IWizardContainer getContainer()
向導頁面方法
你已經看到了
· Constructor
· dispose()
· createControl(Composite parent)
· IWizard getWizard()
· setTitle(String title)
· setDescription(String description)
· setImageDescriptor(ImageDescriptor image)
· setMessage(String message)
· setErrorMessage(String error)
· setPageComplete(boolean complete)
· performHelp()
編寫向導的代碼
有了這些方法之後
public class InvokatronWizard extends Wizard
implements INewWizard {
private InvokatronWizardPage page;
private InvokatronWizardPage
private ISelection selection;
public InvokatronWizard() {
super();
setNeedsProgressMonitor(true);
ImageDescriptor image =AbstractUIPlugin
setDefaultPageImageDescriptor(image);
}
public void init(IWorkbench workbench
this
}
在構造函數中
請把這個圖片保存在Invokatron/icons文件夾之下
請注意
下面是addPages()方法
public void addPages() {
page=new InvokatronWizardPage(selection);
addPage(page);
page
addPage(page
}
在這個方法中
public boolean performFinish() {
//首先把所有的頁面數據保存在變量中
final String containerName = page
final String fileName =page
final InvokatronDocument properties = new InvokatronDocument();
properties
properties
properties
//現在調用完成(finish)方法
IRunnableWithProgress op =new IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InvocationTargetException {
try {
doFinish(containerName
} catch (CoreException e) {
throw new InvocationTargetException(e);
} finally {
monitor
}
}
};
try {
getContainer()
} catch (InterruptedException e) {
return false;
} catch (InvocationTargetException e) {
Throwable realException =e
MessageDialog
return false;
}
return true;
}
為了保存數據
private void doFinish(String containerName
IProgressMonitor monitor)
throws CoreException {
// 建立一個示例文件
monitor
IWorkspaceRoot root = ResourcesPlugin
IResource resource = root
if (!resource
throwCoreException(
}
IContainer container =(IContainer)resource;
final IFile iFile = container
final File file =iFile
try {
OutputStream os = new FileOutputStream(file
properties
os
} catch (IOException e) {
e
throwCoreException(
}
//確保項目已經刷新了
container
monitor
monitor
getShell()
public void run() {
IWorkbenchPage page =PlatformUI
try {
IDE
} catch (PartInitException e) {
}
}
});
monitor
}
我們還做了很多工作
· 我們檢索了自己希望保存文件的位置(用Eclipse的IFile類)
· 我們還獲取了該File
· 我們把屬性保存到了這個位置
· 接著我們讓Eclipse工作台刷新項目
· 我們最後調度了一個事務
· 在整個過程中
最後一個方法是一個輔助的方法
private void throwCoreException(String message) throws CoreException {
IStatus status =new Status(IStatus
throw new CoreException(status);
}
}
向導可以捕獲CoreException異常
編寫新的向導頁面的代碼
下一步
public class InvokatronWizardPage
private Text packageText;
private Text superclassText;
private Text interfacesText;
private ISelection selection;
public InvokatronWizardPage
super(
setTitle(
setDescription(
this
}
private void updateStatus(String message) {
setErrorMessage(message);
setPageComplete(message == null);
}
public String getPackage() {
return packageText
}
public String getSuperclass() {
return superclassText
}
public String getInterfaces() {
return interfacesText
}
上面的構造函數設置了頁面的標題(在標題欄下方高亮度顯示)和描述(在頁面標題的下方顯示)
public void createControl(Composite parent) {
Composite controls =new Composite(parent
GridLayout layout = new GridLayout();
controls
layout
layout
Label label =new Label(controls
label
packageText = new Text(controls
GridData gd = new GridData(GridData
packageText
packageText
new ModifyListener() {
public void modifyText(ModifyEvent e) {
dialogChanged();
}
});
label = new Label(controls
label
label = new Label(controls
label
superclassText = new Text(controls
gd = new GridData(GridData
superclassText
superclassText
public void modifyText(ModifyEvent e) {
dialogChanged();
}
});
label = new Label(controls
label
label = new Label(controls
label
interfacesText = new Text(controls
gd = new GridData(GridData
interfacesText
interfacesText
new ModifyListener() {
public void modifyText(ModifyEvent e) {
dialogChanged();
}
});
label = new Label(controls
label
dialogChanged();
setControl(controls);
}
為了編寫這段代碼
private void dialogChanged() {
String aPackage = getPackage();
String aSuperclass = getSuperclass();
String interfaces = getInterfaces();
String status = new PackageValidator()
if(status != null) {updateStatus(status);
return;
}
status = new SuperclassValidator()
if(status != null) {updateStatus(status);
return;
}
status = new InterfacesValidator()
if(status != null) {updateStatus(status);
return;
}
updateStatus(null);
}
}
這個工作是在三個工具類
驗證類
驗證可以在插件的用戶輸入數據的任何部分中進行
public class InterfacesValidator implements ICellEditorValidator
{
public String isValid(Object value)
{
if( !( value instanceof String) )
return null;
String interfaces = ((String)value)
if( interfaces
return null;
String[] interfaceArray = interfaces
for (int i =
{
IStatus status = JavaConventions
if (status
return
}
return null;
}
}
其它的驗證類與它非常類似
Eclipse類庫中的另外一個極好的類是JavaConventions
· validateJavaTypeName() 檢查類和接口的名稱
· validatePackageName() 檢查程序包的名稱
· validateFieldName() 檢查數據成員的名稱
· validateMethodName() 檢查方法的名稱
· validateIdentifierName() 檢查變量的名稱
現在我們不需要ICellEditorValidator接口
結果
到目前為止
閃亮的發明
我們可以看到
在本文中
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28130.html