Eclipse插件开发之定制向导
>}
}
向导可以捕获CoreException异常,接着可以把它所包含的Status对象显示给用户看。向导不会被关闭。
编写新的向导页面的代码
下一步,我们编写InvokatronWizardPage2。它的整个类都是全新的:
public class InvokatronWizardPage2 extends WizardPage {
private Text packageText;
private Text superclassText;
private Text interfacesText;
private ISelection selection;
public InvokatronWizardPage2(ISelection selection) {
super("wizardPage2");
setTitle("Invokatron Wizard");
setDescription("This wizard creates a new"+" file with *.invokatron extension.");
this.selection = selection;
}
private void updateStatus(String message) {
setErrorMessage(message);
setPageComplete(message == null);
}
public String getPackage() {
return packageText.getText();
}
public String getSuperclass() {
return superclassText.getText();
}
public String getInterfaces() {
return interfacesText.getText();
}
上面的构造函数设置了页面的标题(在标题栏下方高亮度显示)和描述(在页面标题的下方显示)。我们还有一些辅助方法。 updateStatus处理页面特定的错误信息的显示。如果没有错误信息,就意味着页面完成了;因此,"下一步"按钮就可以使用了。还有数据字段内容的getter(获取)方法。下面是createControl()方法,它建立了页面的所有可视化组件:
public void createControl(Composite parent) {
Composite controls =new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
controls.setLayout(layout);
layout.numColumns = 3;
layout.verticalSpacing = 9;
Label label =new Label(controls, SWT.NULL);
label.setText("&Package:");
packageText = new Text(controls,SWT.BORDER | SWT.SINGLE);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
packageText.setLayoutData(gd);
packageText.addModifyListener(
new ModifyListener() {
public void modifyText(ModifyEvent e) {
dialogChanged();
}
});
label = new Label(controls, SWT.NULL);
label.setText("Blank = default package");
label = new Label(controls, SWT.NULL);
label.setText("&Superclass:");
superclassText = new Text(controls,SWT.BORDER | SWT.SINGLE);
gd = new GridData(GridData.FILL_HORIZONTAL);
superclassText.setLayoutData(gd);
superclassText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
dialogChanged();
}
});
label = new Label(controls, SWT.NULL);
label.setText("Blank = Object");
label = new Label(controls, SWT.NULL);
label.setText("&Interfaces:");
interfacesText = new Text(controls,SWT.BORDER | SWT.SINGLE);
gd = new GridData(GridData.FILL_HORIZONTAL);
interfacesText.setLayoutData(gd);
interfacesText.addModifyListener(
new ModifyListener() {
public void modifyText(ModifyEvent e) {
dialogChanged();
}
});
label = new Label(controls, SWT.NULL);
label.setText("Separated by ','");
dialogChanged();
setControl(controls);
}
为了编写这段代码,你必须了解SWT(请你自己查看一些这方面的资料)。基本上,这个方法建立了标签和字段,并把它们放置到网格布局上。字段发生改变的时候,就调用dialogChanged()来验证它的数据:
private void dialogChanged() {
String aPackage = getPackage();
String aSuperclass = getSuperclass();
String interfaces = getInterfaces();
String status = new PackageValidator().isValid(aPackage);
if(status != null) {updateStatus(status);
return;
}
status = new SuperclassValidator().isValid(aSuperclass);
if(status != null) {updateStatus(status);
return;
}
status = new InterfacesValidator().isValid(interfaces);
if(status != null) {updateStatus(status);
return;
}
updateStatus(null);
}
}
这个工作是在三个工具类--PackageValidator、SuperclassValidator和 InterfacesValidator的帮助下完成的。接下来我们编写这些类。
验证类
验证可以在插件的用户输入数据的任何部分中进行。因此,把验证代码放入可重复使用的类中是有意义的,这样就不用把它复制到多个位置。下面是一个验证类的例子。
public class InterfacesValidator implements ICellEditorValidator
{
public String isValid(Object value)
{
if( !( value instanceof String) )
return null;
String interfaces = ((String)value).trim();
if( interfaces.equals(""))
return null;
String[] interfaceArray = interfaces.split(",");
for (int i = 0; i < interfaceArray.length; i++)
{
IStatus status = JavaConventions.validateJavaTypeName(interfaceArray[i]);
if (status.getCode() != IStatus.OK)
return "Validation of interface " + interfaceArray[i] + ": " + status.getMessage();
}
return null;
}
}
其它的验证类与它非常类似。
Eclipse类库中的另外一个极好的类是JavaConventions,它为我们验证数据!它包含了很多验证方法,例如:
· validateJavaTypeName() 检查类和接口的名称。
· validatePackageName() 检查程序包的名称。
· validateFieldName() 检查数据成员的名称。
· validateMethodName() 检查方法的名称。
· validateIdentifierName() 检查变量的名称。
现在我们不需要ICellEditorValidator接口,但是在以后的文章中,我们是需要它的。
结果 到目前为止,我们拥有了一个可以工作的向导,它拥有一张图片和两个页面,第二个页面建立了原来的Invokatron文档。图2显示了结果:

图2:定制的向导
闪亮的发明 我们可以看到,通常是数据驱动应用程序的。外表(Presentation)也是很重要的。丑陋的发明难以出售,但是闪亮的发明可能容易出售。但是数据是我们这些程序员实现的非常本质的东西。
在本文中,我们首先决定了自己将处理的数据。然后,我们以定制向导的方式来获取这些数据。下一篇文章将继续讲解显示的问题,包括定制的编辑器和属性页面。
上一页 [1] [2]
进入问吧