Eclipse插件开发--- PopupMenuCreation

时间:2013-07-22 04:51:47

标签: performance plugins eclipse-plugin eclipse-rcp m2eclipse

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

要求:

我必须创建一个上下文菜单,只要用户右键单击java项目中的源文件夹,就需要填充该菜单。一旦用户执行第一步,我的处理程序需要在我的向导中获取所选的src文件夹。我的向导包含一个树形图,我需要打包所选的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初始输入传递。

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

提前致谢

1 个答案:

答案 0 :(得分:0)

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

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