Package org.bndtools.core.ui.wizards.ds

Source Code of org.bndtools.core.ui.wizards.ds.NewDSComponentWizardPage

package org.bndtools.core.ui.wizards.ds;

import java.util.EnumSet;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.SelectionButtonDialogFieldGroup;
import org.eclipse.jdt.ui.CodeGeneration;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.PlatformUI;

public class NewDSComponentWizardPage extends NewTypeWizardPage {

    static enum ActivateSignature {
        NoActivate("No activate/deactivate methods"), NoArg("Activate without arguments"), ConfigMap("Activate with configuration map"), ComponentContext("Activate with ComponentContext"), BundleContext("Activate with BundleContext");

        String label;

        ActivateSignature(String label) {
            this.label = label;
        }
    }

    private static final String PAGE_NAME = "NewDSComponentWizardPage";

    private final static String SETTINGS_CREATECONSTR = "create_constructor"; //$NON-NLS-1$
    private final static String SETTINGS_CREATEUNIMPLEMENTED = "create_unimplemented"; //$NON-NLS-1$

    private final SelectionButtonDialogFieldGroup fMethodStubsButtons;
    private ComboViewer vwrActivateStub;

    private ActivateSignature activateSignature = ActivateSignature.NoActivate;
    private IStatus activateSignatureStatus = Status.OK_STATUS;

    private IType fCreatedType;

    public NewDSComponentWizardPage() {
        super(CLASS_TYPE, PAGE_NAME);
        setTitle("Declarative Services Component Class");
        setDescription("Create a new Declarative Services component class.");

        String[] buttonNames3 = new String[] {
                NewWizardMessages.NewClassWizardPage_methods_constructors, NewWizardMessages.NewClassWizardPage_methods_inherited
        };
        fMethodStubsButtons = new SelectionButtonDialogFieldGroup(SWT.CHECK, buttonNames3, 1);
        fMethodStubsButtons.setLabelText(NewWizardMessages.NewClassWizardPage_methods_label);
    }

    @Override
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (visible) {
            setFocus();
        }
    }

    @Override
    protected String getSuperInterfacesLabel() {
        return "Service Interfaces:";
    }

    public void createControl(Composite parent) {
        initializeDialogUnits(parent);

        Composite composite = new Composite(parent, SWT.NONE);
        composite.setFont(parent.getFont());

        int nColumns = 4;

        GridLayout layout = new GridLayout();
        layout.numColumns = nColumns;
        composite.setLayout(layout);

        // pick & choose the wanted UI components

        createContainerControls(composite, nColumns);
        createPackageControls(composite, nColumns);
        createEnclosingTypeControls(composite, nColumns);

        createSeparator(composite, nColumns);

        createTypeNameControls(composite, nColumns);
        createLifecycleMethodStubControls(composite, nColumns);
        createSuperInterfacesControls(composite, nColumns);
        createSuperClassControls(composite, nColumns);
        createMethodStubSelectionControls(composite, nColumns);

        setControl(composite);

        Dialog.applyDialogFont(composite);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.NEW_CLASS_WIZARD_PAGE);
    }

    public void init(IStructuredSelection selection) {
        IJavaElement jelem = getInitialJavaElement(selection);
        initContainerPage(jelem);
        initTypePage(jelem);
        doStatusUpdate();

        boolean createConstructors = false;
        boolean createUnimplemented = true;
        IDialogSettings dialogSettings = getDialogSettings();
        if (dialogSettings != null) {
            IDialogSettings section = dialogSettings.getSection(PAGE_NAME);
            if (section != null) {
                createConstructors = section.getBoolean(SETTINGS_CREATECONSTR);
                createUnimplemented = section.getBoolean(SETTINGS_CREATEUNIMPLEMENTED);
            }
        }

        setMethodStubSelection(createConstructors, createUnimplemented, true);
    }

    @Override
    protected void handleFieldChanged(String fieldName) {
        super.handleFieldChanged(fieldName);

        doStatusUpdate();
    }

    private void doStatusUpdate() {
        // status of all used components
        IStatus[] status = new IStatus[] {
                fContainerStatus, isEnclosingTypeSelected() ? fEnclosingTypeStatus : fPackageStatus, fTypeNameStatus, fSuperClassStatus, fSuperInterfacesStatus, activateSignatureStatus
        };

        // the mode severe status will be displayed and the OK button enabled/disabled.
        updateStatus(status);
    }

    public void setMethodStubSelection(boolean createConstructors, boolean createInherited, boolean canBeModified) {
        fMethodStubsButtons.setSelection(0, createConstructors);
        fMethodStubsButtons.setSelection(1, createInherited);

        fMethodStubsButtons.setEnabled(canBeModified);
    }

    protected void createLifecycleMethodStubControls(Composite composite, int nColumns) {
        // Create stubs for lifecycle methods (activate and deactivate)
        Label lblLifecycleMethods = new Label(composite, SWT.NONE);
        lblLifecycleMethods.setText("Lifecycle Methods:");
        LayoutUtil.setHorizontalSpan(lblLifecycleMethods, 1);

        Combo cmbActivateStub = new Combo(composite, SWT.READ_ONLY);
        vwrActivateStub = new ComboViewer(cmbActivateStub);
        vwrActivateStub.setContentProvider(ArrayContentProvider.getInstance());
        vwrActivateStub.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                return ((ActivateSignature) element).label;
            }
        });
        vwrActivateStub.setInput(EnumSet.allOf(ActivateSignature.class));
        vwrActivateStub.setSelection(new StructuredSelection(activateSignature), true);
        vwrActivateStub.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                ISelection sel = event.getSelection();
                if (!sel.isEmpty() && sel instanceof IStructuredSelection) {
                    activateSignature = (ActivateSignature) ((IStructuredSelection) sel).getFirstElement();
                } else {
                    activateSignature = ActivateSignature.NoActivate;
                }
                activateSignatureStatus = activateSignatureChanged();
                handleFieldChanged("activateSignature");
            }
        });
        //        LayoutUtil.setHorizontalSpan(cmbActivateStub, nColumns - 1);
        GridData gd = new GridData(SWT.LEFT, SWT.FILL, false, false, nColumns - 1, 1);
        gd.horizontalIndent = -4; // counteract the weird additional space added to combos
        cmbActivateStub.setLayoutData(gd);
    }

    protected IStatus activateSignatureChanged() {
        return Status.OK_STATUS;
    }

    protected void createMethodStubSelectionControls(Composite composite, int nColumns) {
        // Create stubs for constructors and abstract methods
        Control labelControl = fMethodStubsButtons.getLabelControl(composite);
        LayoutUtil.setHorizontalSpan(labelControl, nColumns);

        DialogField.createEmptySpace(composite);

        Control buttonGroup = fMethodStubsButtons.getSelectionButtonsGroup(composite);
        LayoutUtil.setHorizontalSpan(buttonGroup, nColumns - 1);
    }

    @Override
    public int getModifiers() {
        return F_PUBLIC;
    }

    public boolean isCreateConstructors() {
        return fMethodStubsButtons.isSelected(0);
    }

    public boolean isCreateInherited() {
        return fMethodStubsButtons.isSelected(1);
    }

    @Override
    public IType getCreatedType() {
        return fCreatedType;
    }

    @Override
    protected void constructTypeAnnotationStubs(StringBuffer buf, ImportsManager imports, String lineDelimiter) {
        buf.append("@").append(imports.addImport("aQute.bnd.annotation.component.Component")).append(lineDelimiter);
    }

    @Override
    protected void createTypeMembers(IType newType, ImportsManager imports, IProgressMonitor monitor) throws CoreException {
        boolean doConstr = isCreateConstructors();
        boolean doInherited = isCreateInherited();

        createInheritedMethods(newType, doConstr, doInherited, imports, new SubProgressMonitor(monitor, 1));

        if (activateSignature != null && activateSignature != ActivateSignature.NoActivate) {
            StringBuilder builder;
            String content;
            final String lineDelim = "\n";

            // Generate activate method
            builder = new StringBuilder();
            builder.append("@").append(imports.addImport("aQute.bnd.annotation.component.Activate")).append(lineDelim);
            builder.append("void activate(");

            switch (activateSignature) {
            case NoActivate :
            case NoArg :
                // Nothing to do
                break;
            case ConfigMap :
                builder.append(imports.addImport("java.util.Map")).append("<").append(imports.addImport("java.lang.String")).append(",").append(imports.addImport("java.lang.Object")).append(">").append(" ").append("configProps");
                break;
            case ComponentContext :
                builder.append(imports.addImport("org.osgi.service.component.ComponentContext")).append(" ").append("componentContext");
                break;
            case BundleContext :
                builder.append(imports.addImport("org.osgi.framework.BundleContext")).append(" ").append("bundleContext");
                break;
            }

            builder.append(") {").append(lineDelim);
            content = CodeGeneration.getMethodBodyContent(newType.getCompilationUnit(), newType.getTypeQualifiedName('.'), "activate", false, "", lineDelim);
            if (content != null && content.length() > 0)
                builder.append(content);
            builder.append("}");
            newType.createMethod(builder.toString(), null, false, null);

            // Generate deactivate method
            builder = new StringBuilder();
            builder.append("@").append(imports.addImport("aQute.bnd.annotation.component.Deactivate")).append(lineDelim);
            builder.append("void deactivate() {").append(lineDelim);
            content = CodeGeneration.getMethodBodyContent(newType.getCompilationUnit(), newType.getTypeQualifiedName('.'), "activate", false, "", lineDelim);
            if (content != null && content.length() > 0)
                builder.append(content);
            builder.append("}");
            newType.createMethod(builder.toString(), null, false, null);

        }

        if (monitor != null)
            monitor.done();
    }
}
TOP

Related Classes of org.bndtools.core.ui.wizards.ds.NewDSComponentWizardPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.