org.eclipse.pde.internal.ds.ui.editor.dialogs.DSEditReferenceDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.pde.internal.ds.ui.editor.dialogs.DSEditReferenceDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2008, 2009 Code 9 Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Code 9 Corporation - initial API and implementation
 *     Chris Aniszczyk <caniszczyk@gmail.com>
 *     Rafael Oliveira Nobrega <rafael.oliveira@gmail.com> - bug 242028
 *******************************************************************************/

package org.eclipse.pde.internal.ds.ui.editor.dialogs;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.pde.internal.ds.core.IDSConstants;
import org.eclipse.pde.internal.ds.core.IDSReference;
import org.eclipse.pde.internal.ds.ui.Activator;
import org.eclipse.pde.internal.ds.ui.Messages;
import org.eclipse.pde.internal.ds.ui.SWTUtil;
import org.eclipse.pde.internal.ds.ui.editor.FormEntryAdapter;
import org.eclipse.pde.internal.ds.ui.editor.FormLayoutFactory;
import org.eclipse.pde.internal.ds.ui.editor.sections.DSReferenceSection;
import org.eclipse.pde.internal.ds.ui.parts.ComboPart;
import org.eclipse.pde.internal.ds.ui.parts.FormEntry;
import org.eclipse.pde.internal.ds.ui.wizards.DSNewClassCreationWizard;
import org.eclipse.pde.internal.ui.editor.PDEFormEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.forms.FormDialog;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;

public class DSEditReferenceDialog extends FormDialog {

    private IDSReference fReference;
    private FormEntry fNameEntry;
    private FormEntry fInterfaceEntry;
    private FormEntry fBindEntry;
    private FormEntry fUnBindEntry;
    private FormEntry fTargetEntry;
    private ComboPart fCardinality;
    private Label fLabelCardinality;
    private ComboPart fPolicy;
    private Label fLabelPolicy;
    private DSReferenceSection fReferenceSection;

    public DSEditReferenceDialog(Shell parentShell, IDSReference reference, DSReferenceSection referenceSection) {
        super(parentShell);
        fReference = reference;
        fReferenceSection = referenceSection;
    }

    protected void createFormContent(IManagedForm mform) {
        mform.getForm().setText(Messages.DSEditReferenceDialog_dialog_title);

        Composite container = mform.getForm().getBody();
        container.setLayout(new GridLayout());
        container.setLayoutData(new GridData(GridData.FILL_BOTH));
        FormToolkit toolkit = mform.getToolkit();
        toolkit.decorateFormHeading(mform.getForm().getForm());

        Composite entryContainer = toolkit.createComposite(container);
        entryContainer.setLayout(FormLayoutFactory.createSectionClientGridLayout(false, 3));
        entryContainer.setLayoutData(new GridData(GridData.FILL_BOTH));

        // Attribute: name
        fNameEntry = new FormEntry(entryContainer, toolkit, Messages.DSReferenceDetails_nameEntry, SWT.NONE);

        // Attribute: Interface
        fInterfaceEntry = new FormEntry(entryContainer, toolkit, Messages.DSReferenceDetails_interfaceEntry,
                Messages.DSReferenceDetails_browse, false, 0);

        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        gd.horizontalIndent = 3;

        // Attribute: Cardinality
        addCardinalityEntry(toolkit, entryContainer, gd);

        // Attribute: Policy
        addPolicyEntry(toolkit, entryContainer, gd);

        // Attribute: Target
        fTargetEntry = new FormEntry(entryContainer, toolkit, Messages.DSReferenceDetails_targetEntry, SWT.NONE);

        // Attribute: Bind
        fBindEntry = new FormEntry(entryContainer, toolkit, Messages.DSReferenceDetails_bindEntry, SWT.NONE);

        // Attribute: UnBind
        fUnBindEntry = new FormEntry(entryContainer, toolkit, Messages.DSReferenceDetails_unbindEntry, SWT.NONE);

        // Update Fields with fReference`s attributes values
        toolkit.paintBordersFor(entryContainer);
        updateFields();

        setInterfaceEntryListeners();
        toolkit.paintBordersFor(entryContainer);
    }

    private void addCardinalityEntry(FormToolkit toolkit, Composite container3, GridData gd) {
        fLabelCardinality = toolkit.createLabel(container3, Messages.DSReferenceDetails_cardinalityLabel, SWT.WRAP);
        fLabelCardinality.setForeground(toolkit.getColors().getForeground());
        fCardinality = new ComboPart();
        fCardinality.createControl(container3, toolkit, SWT.READ_ONLY);

        String[] itemsCard = new String[] { IDSConstants.VALUE_REFERENCE_CARDINALITY_ZERO_ONE,
                IDSConstants.VALUE_REFERENCE_CARDINALITY_ZERO_N, IDSConstants.VALUE_REFERENCE_CARDINALITY_ONE_ONE,
                IDSConstants.VALUE_REFERENCE_CARDINALITY_ONE_N };
        fCardinality.setItems(itemsCard);
        fCardinality.getControl().setLayoutData(gd);
    }

    private void addPolicyEntry(FormToolkit toolkit, Composite container3, GridData gd) {
        fLabelPolicy = toolkit.createLabel(container3, Messages.DSReferenceDetails_policeLabel, SWT.WRAP);
        fLabelPolicy.setForeground(toolkit.getColors().getForeground());
        fPolicy = new ComboPart();
        fPolicy.createControl(container3, toolkit, SWT.READ_ONLY);
        String[] itemsPolicy = new String[] { IDSConstants.VALUE_REFERENCE_POLICY_STATIC,
                IDSConstants.VALUE_REFERENCE_POLICY_DYNAMIC };
        fPolicy.setItems(itemsPolicy);
        fPolicy.getControl().setLayoutData(gd);
    }

    public boolean isHelpAvailable() {
        return false;
    }

    protected void buttonPressed(int buttonId) {
        switch (buttonId) {
        case 0:
            handleOKPressed();
            break;
        }
        super.buttonPressed(buttonId);
    }

    private void handleOKPressed() {
        fNameEntry.commit();
        if (!(fNameEntry.getValue().equals("") && fReference.getReferenceName() == null)) { //$NON-NLS-1$
            if (!fNameEntry.getValue().equals(fReference.getReferenceName())) {
                fReference.setReferenceName(fNameEntry.getValue());
            }
        }

        fInterfaceEntry.commit();
        if (!(fInterfaceEntry.getValue().equals("") && fReference.getReferenceInterface() == null)) { //$NON-NLS-1$
            if (!fInterfaceEntry.getValue().equals(fReference.getReferenceInterface())) {
                fReference.setReferenceInterface(fInterfaceEntry.getValue());
            }
        }

        fBindEntry.commit();
        if (!(fBindEntry.getValue().equals("") && fReference.getReferenceBind() == null)) { //$NON-NLS-1$
            if (!fBindEntry.getValue().equals(fReference.getReferenceBind())) {
                fReference.setReferenceBind(fBindEntry.getValue());
            }
        }

        fUnBindEntry.commit();
        if (!(fUnBindEntry.getValue().equals("") && fReference.getReferenceUnbind() == null)) { //$NON-NLS-1$
            if (!fUnBindEntry.getValue().equals(fReference.getReferenceUnbind())) {
                fReference.setReferenceUnbind(fUnBindEntry.getValue());
            }
        }

        fTargetEntry.commit();
        if (!(fTargetEntry.getValue().equals("") && fReference.getReferenceTarget() == null)) { //$NON-NLS-1$
            if (!fTargetEntry.getValue().equals(fReference.getReferenceTarget())) {
                fReference.setReferenceTarget(fTargetEntry.getValue());
            }
        }

        if (fCardinality.getSelection() != null) {
            if (!fCardinality.getSelection().equals(fReference.getReferenceCardinality())) {
                fReference.setReferenceCardinality(fCardinality.getSelection());
            }
        }

        if (fPolicy.getSelection() != null) {
            if (!fPolicy.getSelection().equals(fReference.getReferencePolicy())) {
                fReference.setReferencePolicy(fPolicy.getSelection());
            }
        }
    }

    private void updateFields() {
        if (fReference == null) {
            return;
        }

        if (fReference.getReferenceName() == null) {
            fNameEntry.setValue(""); //$NON-NLS-1$
        } else {
            // Attribute: name
            fNameEntry.setValue(fReference.getReferenceName(), true);
        }
        fNameEntry.setEditable(true);

        if (fReference.getReferenceInterface() == null) {
            fInterfaceEntry.setValue(""); //$NON-NLS-1$
        } else {
            // Attribute: Interface
            fInterfaceEntry.setValue(fReference.getReferenceInterface(), true);
        }
        fInterfaceEntry.setEditable(true);

        // Attribute: Target
        fTargetEntry.setValue(fReference.getReferenceTarget(), true);
        fTargetEntry.setEditable(true);

        // Attribute: Bind
        fBindEntry.setValue(fReference.getReferenceBind(), true);
        fBindEntry.setEditable(true);

        // Attribute: Unbind
        fUnBindEntry.setValue(fReference.getReferenceUnbind(), true);
        fUnBindEntry.setEditable(true);

        // Attribute: Cardinality
        if (fReference.getReferenceCardinality() != null)
            fCardinality.setText(fReference.getReferenceCardinality());

        // Attribute: Policy
        if (fReference.getReferencePolicy() != null)
            fPolicy.setText(fReference.getReferencePolicy());

    }

    public void setInterfaceEntryListeners() {
        // Attribute: Interface
        fInterfaceEntry.setFormEntryListener(new FormEntryAdapter(this.fReferenceSection) {
            public void textValueChanged(FormEntry entry) {
                // no op due to OK Button
            }

            public void textDirty(FormEntry entry) {
                // no op due to OK Button
            }

            public void linkActivated(HyperlinkEvent e) {
                String value = fInterfaceEntry.getValue();
                value = handleLinkActivated(value, false);
                if (value != null)
                    fInterfaceEntry.setValue(value);
            }

            public void browseButtonSelected(FormEntry entry) {
                doOpenSelectionDialog(IJavaElementSearchConstants.CONSIDER_CLASSES_AND_INTERFACES, fInterfaceEntry);
            }

        });

    }

    private String handleLinkActivated(String value, boolean isInter) {
        IProject project = getProject();
        try {
            if (project != null && project.hasNature(JavaCore.NATURE_ID)) {
                IJavaProject javaProject = JavaCore.create(project);
                IJavaElement element = javaProject.findType(value.replace('$', '.'));
                if (element != null)
                    JavaUI.openInEditor(element);
                else {
                    // TODO create our own wizard for reuse here
                    DSNewClassCreationWizard wizard = new DSNewClassCreationWizard(project, isInter, value);
                    WizardDialog dialog = new WizardDialog(Activator.getActiveWorkbenchShell(), wizard);
                    dialog.create();
                    SWTUtil.setDialogSize(dialog, 400, 500);
                    if (dialog.open() == Window.OK) {
                        return wizard.getQualifiedName();
                    }
                }
            }
        } catch (PartInitException e1) {
        } catch (CoreException e1) {
        }
        return null;
    }

    private IProject getProject() {
        PDEFormEditor editor = (PDEFormEditor) this.fReferenceSection.getPage().getEditor();
        return editor.getCommonProject();
    }

    private void doOpenSelectionDialog(int scopeType, FormEntry entry) {
        try {
            String filter = entry.getValue();
            filter = filter.substring(filter.lastIndexOf(".") + 1); //$NON-NLS-1$
            SelectionDialog dialog = JavaUI.createTypeDialog(Activator.getActiveWorkbenchShell(),
                    PlatformUI.getWorkbench().getProgressService(), SearchEngine.createWorkspaceScope(), scopeType,
                    false, filter);
            dialog.setTitle(Messages.DSReferenceDetails_selectType);
            if (dialog.open() == Window.OK) {
                IType type = (IType) dialog.getResult()[0];
                entry.setValue(type.getFullyQualifiedName('$'));
                entry.commit();
            }
        } catch (CoreException e) {
        }
    }

}