Eclipse New Wizard的Wizard

来源:互联网 发布:怎么看淘宝订单排名 编辑:程序博客网 时间:2024/05/16 18:43
Eclipse点击New-->Other以后出来一个新建的向导页面. 是一颗树, 选择某个节点以后就可以Next下去了.

其实后面的页面也是Wizard. 也就是说本身也可以独立成为一个WizardDialog, 那么如何将其嵌入到这个总开头页面之后呢?

Eclipse的实现方法看了很久都没有看懂, 最后决定自己尝试其他思路.

看代码:
IWizard wizard = new NewObjectWizard();
WizardDialog dialog 
= new WizardDialog(window.getShell(), wizard);
dialog.create();
dialog.open();
这是呼出第一个页面的Action的代码, 出来的页面就是一棵树的样子, 当然那棵树是在NewObjectWizard里面实现的.

public class NewObjectWizard extends Wizard implements IWizard {
    
private IWizard currentWizard = null;

    
private Composite pageContainer;

    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#addPages()
     
*/

    @Override
    
public void addPages() {
        super.addPage(
new NewObjectWizardPage());
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#performFinish()
     
*/

    @Override
    
public boolean performFinish() {
        
return false;
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#getWindowTitle()
     
*/

    @Override
    
public String getWindowTitle() {
        
return StingIDEMessages.NewWizardDialog_title;
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#needsPreviousAndNextButtons()
     
*/

    @Override
    
public boolean needsPreviousAndNextButtons() {
        
return true;
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#needsProgressMonitor()
     
*/

    @Override
    
public boolean needsProgressMonitor() {
        
return false;
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
     
*/

    @Override
    
public IWizardPage getNextPage(IWizardPage page) {
        
if (page.getName().equals(
                NewObjectWizardPage.NEW_OBJECT_WIZARD_PAGE_NAME)) 
{
            
if (currentWizard == null{
                
return null;
            }
 else {
                
return currentWizard.getStartingPage();
            }

        }
 else {
            
return page.getNextPage();
        }

    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#getPreviousPage(org.eclipse.jface.wizard.IWizardPage)
     
*/

    @Override
    
public IWizardPage getPreviousPage(IWizardPage page) {
        
if (page.getName().equals(
                NewObjectWizardPage.NEW_OBJECT_WIZARD_PAGE_NAME))
            
return null;

        IWizardPage previous 
= page.getPreviousPage();
        
if (previous == null{
            
return getPage(NewObjectWizardPage.NEW_OBJECT_WIZARD_PAGE_NAME);
        }
 else {
            
return previous;
        }

    }


    
/**
     * 设置当前得向导
     
*/

    
void setCurrentWizard(IWizard wizard) {
        
this.currentWizard = wizard;
        
if (wizard != null{
            wizard.addPages();
            wizard.createPageControls(pageContainer);
        }

        getContainer().updateButtons();
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#createPageControls(org.eclipse.swt.widgets.Composite)
     
*/

    @Override
    
public void createPageControls(Composite pageContainer) {
        super.createPageControls(pageContainer);
        
this.pageContainer = pageContainer;
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#canFinish()
     
*/

    @Override
    
public boolean canFinish() {
        
return currentWizard != null && currentWizard.canFinish();
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#dispose()
     
*/

    @Override
    
public void dispose() {
        
this.currentWizard = null;
        
this.pageContainer = null;
        super.dispose();
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#getPage(java.lang.String)
     
*/

    @Override
    
public IWizardPage getPage(String name) {
        
if (name.equals(NewObjectWizardPage.NEW_OBJECT_WIZARD_PAGE_NAME)) {
            
return super.getPage(name);
        }
 else if (this.currentWizard != null{
            
return currentWizard.getPage(name);
        }
 else
            
return null;
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#getPageCount()
     
*/

    @Override
    
public int getPageCount() {
        
if (currentWizard != null{
            
return currentWizard.getPageCount() + super.getPageCount();
        }

        
return super.getPageCount();
    }


    
/**
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.wizard.Wizard#getPages()
     
*/

    @Override
    
public IWizardPage[] getPages() {
        
if (getPageCount() == 1)
            
return super.getPages();
        
else {
            IWizardPage[] pages 
= new IWizardPage[getPageCount()];
            IWizardPage[] myPages 
= super.getPages();
            System.arraycopy(myPages, 
0, pages, 0, myPages.length);
            IWizardPage[] dynamicPages 
= currentWizard.getPages();
            System.arraycopy(dynamicPages, 
0, pages, 1, dynamicPages.length);
            
return pages;
        }

    }

}

可以看到很多方法都被重写掉了, 主要就是控制当前这个Wizard到底有多少个Page, 当然物理上是只有一个的, 通过重写方法来将其和树上选择的Wizard结合起来看.
public class NewObjectWizardPage extends WizardPage {
    
static final String NEW_OBJECT_WIZARD_PAGE_NAME = "#NewObjectWizardPage";

    
protected NewObjectWizardPage() {
        
super(NEW_OBJECT_WIZARD_PAGE_NAME);

        setPageComplete(
false);
    }


    
/**
     * (non-Javadoc)
     * 
     * 
@see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
     
*/

    
public void createControl(Composite parent) {
        
// create the top level composite for the dialog area
        Composite comp = new Composite(parent, SWT.NONE);
        GridLayout layout 
= new GridLayout();
        layout.marginHeight 
= 10;
        layout.marginWidth 
= 10;
        layout.verticalSpacing 
= 10;
        layout.horizontalSpacing 
= 10;
        comp.setLayout(layout);
        comp.setLayoutData(
new GridData(GridData.FILL_BOTH));
        comp.setFont(parent.getFont());

        Label label 
= new Label(comp, SWT.NONE);
        label.setText(StingIDEMessages.NewWizardDialog_wizardLabel);
        label.setLayoutData(
new GridData(GridData.FILL, GridData.CENTER, true,
                
false11));

        createTreeViewer(comp);

        setTitle(StingIDEMessages.NewWizardDialog_subhead);

        setControl(comp);
    }


    
/**
     * 创建树视图
     * 
     * 
@param comp
     
*/

    
private TreeViewer createTreeViewer(Composite comp) {
        TreeViewer viewer 
= new TreeViewer(comp, SWT.SINGLE | SWT.V_SCROLL
                
| SWT.H_SCROLL | SWT.BORDER);
        viewer.getControl().setLayoutData(
                
new GridData(GridData.FILL, GridData.FILL, truetrue11));
        viewer.setContentProvider(
new TreeContentProvider());
        viewer.setLabelProvider(
new TreeLabelProvider());
        viewer.setSorter(
new ViewerSorter() {
            
/**
             * (non-Javadoc)
             * 
             * 
@see org.eclipse.jface.viewers.ViewerComparator#category(java.lang.Object)
             
*/

            @Override
            
public int category(Object element) {
                
return element instanceof IWizardCategory ? 1 : 0;
            }

        }
);
        IWizardRegistry registry 
= StingPlugin.getDefault().getWorkbench()
                .getNewWizardRegistry();
        viewer.setInput(registry);
        viewer.addSelectionChangedListener(
new ISelectionChangedListener() {
            
/**
             * (non-Javadoc)
             * 
             * 
@see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
             
*/

            
public void selectionChanged(SelectionChangedEvent event) {
                NewObjectWizard parentWizard 
= (NewObjectWizard) NewObjectWizardPage.this
                        .getWizard();

                IStructuredSelection iss 
= (IStructuredSelection) event
                        .getSelection();
                
if (iss.isEmpty()) {
                    setPageComplete(
false);
                    setMessage(
"");
                    parentWizard.setCurrentWizard(
null);
                }
 else {
                    Object object 
= iss.getFirstElement();
                    
if (object instanceof IWizardCategory) {
                        setPageComplete(
false);
                        setMessage(
"");
                        parentWizard.setCurrentWizard(
null);
                    }
 else {
                        setPageComplete(
true);
                        IWizardDescriptor descriptor 
= (IWizardDescriptor) object;
                        setMessage(descriptor.getDescription());
                        
try {
                            IWizard wizard 
= descriptor.createWizard();
                            parentWizard.setCurrentWizard(wizard);
                        }
 catch (CoreException e) {
                        }

                    }

                }

            }

        }
);

        
return viewer;
    }


    
/**
     * Create at 2007-7-16,下午01:58:17<br>
     * 树内容提供器
     * 
     * 
@author Brad.Wu
     * 
@version 1.0
     
*/

    
class TreeContentProvider implements ITreeContentProvider {
        
/**
         * (non-Javadoc)
         * 
         * 
@see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
         
*/

        
public Object[] getElements(Object inputElement) {
            Object[] ret 
= null;

            IWizardRegistry registry 
= (IWizardRegistry) inputElement;
            IWizardCategory rootCategory 
= registry.getRootCategory();
            Object[] objects 
= getChildrenOfCategory(rootCategory);
            IWizardDescriptor[] primaryWizards 
= registry.getPrimaryWizards();
            
if (primaryWizards != null{
                ret 
= new Object[primaryWizards.length + objects.length];
                System.arraycopy(primaryWizards, 
0, ret, 0,
                        primaryWizards.length);
                System.arraycopy(objects, 
0, ret, primaryWizards.length,
                        objects.length);
            }
 else {
                ret 
= objects;
            }


            
return ret;
        }


        
/**
         * 获取指定分类的所有儿子
         * 
         * 
@param category
         * 
@return
         
*/

        
private Object[] getChildrenOfCategory(IWizardCategory category) {
            IWizardDescriptor[] descs 
= category.getWizards();
            IWizardCategory[] categories 
= category.getCategories();

            
// 过滤掉不需要的向导和向导分类
            List<Object> list = new ArrayList<Object>();
            
if (descs != null{
                
for (IWizardDescriptor wizard : descs) {
                    list.add(wizard);
                }

            }

            
if (categories != null{
                
for (IWizardCategory wizardCategory : categories) {
                    list.add(wizardCategory);
                }

            }

            Object[] objects 
= new Object[list.size()];
            list.toArray(objects);
            
return objects;
        }


        
/**
         * (non-Javadoc)
         * 
         * 
@see org.eclipse.jface.viewers.IContentProvider#dispose()
         
*/

        
public void dispose() {
        }


        
/**
         * (non-Javadoc)
         * 
         * 
@see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
         *      java.lang.Object, java.lang.Object)
         
*/

        
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }


        
/**
         * (non-Javadoc)
         * 
         * 
@see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
         
*/

        
public Object[] getChildren(Object parentElement) {
            
if (parentElement instanceof IWizardCategory) {
                
return getChildrenOfCategory((IWizardCategory) parentElement);
            }
 else {
                
return CommonConstants.EMPTY_OBJECTS;
            }

        }


        
/**
         * (non-Javadoc)
         * 
         * 
@see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
         
*/

        
public Object getParent(Object element) {
            
if (element instanceof IWizardCategory) {
                
return ((IWizardCategory) element).getParent();
            }
 else {
                
return ((IWizardDescriptor) element).getCategory();
            }

        }


        
/**
         * (non-Javadoc)
         * 
         * 
@see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
         
*/

        
public boolean hasChildren(Object element) {
            
if (element instanceof IWizardCategory) {
                IWizardDescriptor[] descs 
= ((IWizardCategory) element)
                        .getWizards();
                IWizardCategory[] categories 
= ((IWizardCategory) element)
                        .getCategories();
                
return (descs != null && descs.length != 0)
                        
|| (categories != null && categories.length != 0);
            }
 else {
                
return false;
            }

        }

    }


    
/**
     * Create at 2007-7-16,下午02:18:12<br>
     * 树标签提供器
     * 
     * 
@author Brad.Wu
     * 
@version 1.0
     
*/

    
public class TreeLabelProvider extends LabelProvider {
        
/**
         * (non-Javadoc)
         * 
         * 
@see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
         
*/

        @Override
        
public Image getImage(Object element) {
            
if (element instanceof IWizardCategory) {
                
return StingPlugin.getImageDescriptor(
                        
"icons/objects/folder.gif").createImage();
            }
 else {
                IWizardDescriptor desc 
= (IWizardDescriptor) element;
                
if (desc.getImageDescriptor() != null)
                    
return desc.getImageDescriptor().createImage();
                
return null;
            }

        }


        
/**
         * (non-Javadoc)
         * 
         * 
@see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
         
*/

        @Override
        
public String getText(Object element) {
            
if (element instanceof IWizardCategory) {
                
return ((IWizardCategory) element).getLabel();
            }
 else {
                
return ((IWizardDescriptor) element).getLabel();
            }

        }

    }

}

这是WizardPage, 也是NewObjectWizard里面唯一的页面. 树是通过读取IWizardRegistry来构造的. 每个叶子节点实际上都是一个Wizard.

这样就行了, 个人认为还是比较简单的. 但是可以肯定的是Eclipse不是这么做的...... 我看不懂, 如果哪位大哥知道真相还请指点一下.

另, 这个可能在RCP当中会用到的吧. 如果仅仅是Plugin的话也不用这么复杂, 声明好Wizard就行了.
原创粉丝点击