0

我正在使用 eclipse 插件开发开发一个向导。

要求:

我必须创建一个上下文菜单,只要用户右键单击 java 项目中的源文件夹,该菜单就需要填充。一旦用户执行了第一步,我的处理程序需要在我的向导中获取选定的 src 文件夹。我的向导包含一个 treeviewer,我需要在其中打包选定的 src 文件夹。

我的分析:

我有我的处理程序类,它获取选定的包

SampleHandler.java

public Object execute(ExecutionEvent event) throws ExecutionException {

    shell = HandlerUtil.getActiveShell(event);
    // Initializing workbench window object
    IWorkbenchWindow window = (IWorkbenchWindow) HandlerUtil.getActiveWorkbenchWindow(event);

    ISelection sel = HandlerUtil.getActiveMenuSelection(event);
    final IStructuredSelection selection = (IStructuredSelection) sel;

    Object firstElement = selection.getFirstElement();

    if (firstElement instanceof IPackageFragment) {
        // Get the selected fragment
        IPackageFragment packageFragment = (IPackageFragment) firstElement;
        modelPackage = packageFragment.getElementName();
        boolean a =!ProjectResourceHelper.isEntityBasePackage(modelPackage);
        if(a == true){

            MessageDialog.openInformation(shell, "Warning", "Please click from entity base package");
            Shell shell = HandlerUtil.getActiveShell(event);      
            GreenWizard wizard = new GreenWizard();
            WizardDialog dialog = new WizardDialog( part.getSite().getShell(), wizard);
            dialog.create();


            dialog.open();      
            return null;


        }

        try{            
            window.run(true, true, new IRunnableWithProgress(){                 
                @Override
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    monitor.beginTask("Layer codes are being generated...", 1);

                    // Invocation of generate layers method


                    monitor.worked(1);

                    // Done with operation completion. 
                    monitor.done();
                }

            });
        }
        catch(InvocationTargetException ite){
            MessageDialog.openError(shell, "Greenfield Code Generation Exception", ite.getMessage());
        }
        catch (InterruptedException ie) {
            MessageDialog.openError(shell, "Greenfield Code Generation Exception", ie.getMessage());
        }


    }

我有在此方法中调用的主要向导类。

GreenWizard wizard = new GreenWizard();

我的主向导反过来调用我的向导页面,我需要在用户右键单击时执行选择。

我的向导页面类

public GenerateGreenfieldLayer(IWorkbench workbench,
        IStructuredSelection selection) {
    super("Greenfield");
    setImageDescriptor(ResourceManager
            .getImageDescriptor("\\icons\\greenfield-new-wiz.png"));
    setTitle("GreenField Generate layer");
    setDescription("Select specfic class to grenerate Layers"); 
}

/**
 * Create contents of the wizard.
 * 
 * @param parent
 */
@Override
public void createControl(Composite parent) {

    Composite container = new Composite(parent, SWT.NULL);

    setControl(container);
    container.setLayout(new GridLayout(2, false));

    final CheckboxTreeViewer treeViewer = new CheckboxTreeViewer(container,
            SWT.BORDER);
    tree = treeViewer.getTree();
    tree.setToolTipText("Choose package");
    GridData gd_tree = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
    gd_tree.widthHint = 280;
    gd_tree.heightHint = 140;
    tree.setLayoutData(gd_tree);
    treeViewer.setContentProvider(new GreenfieldTreeContentProvider());
    treeViewer.setLabelProvider(new WorkbenchLabelProvider());
    treeViewer.addSelectionChangedListener(new ISelectionChangedListener () { 
        public void selectionChanged(SelectionChangedEvent event) {

        } 
        }); 


    }

谁能指导我如何从对象方法中获取选择并在我的向导页面中作为 treeviewer 初始输入传递。

如果我缺少任何步骤,请纠正我,因为我对此很陌生。

提前致谢

4

1 回答 1

0

您应该将代码分成以下部分和数据流:

  • 处理程序:获取选择并创建向导和向导对话框(就像您已经做的那样)
  • 处理程序->向导:使用向导的构造函数或自定义init(foo)方法(您从处理程序调用)从处理程序设置选定对象(或您想要作为初始数据传递的任何对象)
  • Wizard->WizardPage:创建向导时,实例化 WizardPage(s) 并将选择传递给向导页面。(如果您需要在向导及其页面之间共享的更复杂的模型,请考虑创建一个简单的值持有者类作为向导模型的实例化;即,一个带有您的数据和 getter/setter 的简单 java 类。然后该对象可以如果您将其传递给每个页面的构造函数,则在页面之间共享)
  • WizardPage:为向导页面创建UI,让用户修改模型
  • WizardPage->Wizard:如果你不通过值持有者类使用共享向导模型,有一个getXxx()方法让向导从页面访问用户的输入
  • 向导:实现Wizard.performFinish()在向导结束时使用getContainer().run()而不是window.run()在处理程序中调用来完成工作。
于 2013-07-23T12:10:37.550 回答