自定义Eclipse中点击Propertyies弹出的首选项对话框,我们可以将其用在我们自己的RCP中。
步骤如下:
1.定义PreferenceDialog,如:
public class PropertyPreferenceDialog extends PreferenceDialog
2.完成构造方法。如:
private ITreeEntry entry;//传一个树结点类型进来
public PropertyPreferenceDialog(Shell parentShell,ITreeEntry entry) {
super(parentShell, new PreferenceManager());//这里直接new了一个PreferenceManager对象传给构造方法
this.entry = entry;
GeneralPage generalPage = new GeneralPage(entry);//通用设置页面
getPreferenceManager().addToRoot(new PreferenceNode("general",generalPage));//注意这里的PreferenceNode
getPreferenceManager().addToRoot(new PreferenceNode("editor",new EditorPage(entry)));
PreferenceNode node = new PreferenceNode("feed",new PreferencePage("综合") {//结点,PreferenceNode是一个抽象类
@Override
protected Control createContents(Composite parent) {
noDefaultAndApplyButton();//这句话放在这里也可以,放在构造方法也是一样,当然这里没必要再定义一个构造方法了,用默认的即可
return new Composite(parent, SWT.NONE);
}
});
node.add(new PreferenceNode("general",generalPage));
node.add(new PreferenceNode("editor",new EditorPage(entry)));
getPreferenceManager().addToRoot(node);
}
3.定义各个preferencePage。如:
public class GeneralPage extends PreferencePage implements
IWorkbenchPreferencePage {
private ITreeEntry entry;
private Text textId;
/**
* Create the preference page
*/
public GeneralPage(ITreeEntry entry) {
super("通用");
this.entry = entry;
noDefaultAndApplyButton();//不显示恢复默认和取消按钮
}
/**
* Create contents of the preference page
* @param parent
*/
@Override
public Control createContents(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
container.setLayout(new GridLayout(2,false));
final Label idLabel = new Label(container, SWT.NONE);
idLabel.setText("ID:");
textId = new Text(container, SWT.BORDER);
final GridData gd_textId = new GridData(SWT.FILL, SWT.CENTER, true, false);
textId.setLayoutData(gd_textId);
if(entry != null ){
textId.setText(String.valueOf(entry.getId()));
}
return container;
}
/**
* Initialize the preference page
*/
public void init(IWorkbench workbench) {
}
}
//当然,视使用情况,不实现IWorkbenchPreferencePage也是可以的。
4.弹出属性对话框
public class PropertyAction extends Action {
private TreeViewer treeViewer;
public PropertyAction(TreeViewer treeViewer){
this.treeViewer = treeViewer;
this.setText("属性");
}
@Override
public void run(){
IStructuredSelection selectNode = (IStructuredSelection) treeViewer.getSelection();
if(selectNode.isEmpty()){
return;
}
ITreeEntry entry = (ITreeEntry) selectNode.getFirstElement();
if(entry==null){
return;
}
PropertyPreferenceDialog ppd = new PropertyPreferenceDialog(treeViewer.getControl().getShell(),entry);
ppd.setSelectedNode("editor");//这个功能倒是蛮好的。可以定位到某一页,这样对用户来说也是很友好的
ppd.open();
}
}