org.eclipse.jpt.jpa.ui.internal.dialogs.AddPersistentClassDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jpt.jpa.ui.internal.dialogs.AddPersistentClassDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2007, 2013 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.jpa.ui.internal.dialogs;

import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper;
import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaTypeCompletionProcessor;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jpt.common.utility.internal.ArrayTools;
import org.eclipse.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.common.utility.internal.iterable.IterableTools;
import org.eclipse.jpt.jpa.core.JpaProject;
import org.eclipse.jpt.jpa.core.context.orm.EntityMappings;
import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentType;
import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
import org.eclipse.jpt.jpa.ui.JptJpaUiMessages;
import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
import org.eclipse.jpt.jpa.ui.internal.plugin.JptJpaUiPlugin;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
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.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;

public class AddPersistentClassDialog extends StatusDialog {
    private EntityMappings entityMappings;

    private Text classText;

    private Button classBrowseButton;

    private ComboViewer mappingCombo;

    private OrmPersistentType addedType;

    public AddPersistentClassDialog(Shell parentShell, EntityMappings entityMappings) {
        super(parentShell);
        this.entityMappings = entityMappings;
        setTitle(JptJpaUiMessages.AddPersistentClassDialog_title);
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite dialogArea = (Composite) super.createDialogArea(parent);

        Composite composite = new Composite(dialogArea, SWT.NULL);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
        composite.setLayout(new GridLayout(3, false));

        createLabel(composite, JptJpaUiMessages.AddPersistentClassDialog_classLabel);

        this.classText = createText(composite);
        this.classText.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                validate();
            }
        });

        this.classBrowseButton = createButton(composite, JptJpaUiMessages.General_browse);
        this.classBrowseButton.addSelectionListener(new SelectionListener() {
            public void widgetSelected(SelectionEvent e) {
                IType type = chooseType();
                if (type != null) {
                    classText.setText(type.getFullyQualifiedName('$'));
                }
            }

            public void widgetDefaultSelected(SelectionEvent e) {
                widgetSelected(e);
            }
        });

        createLabel(composite, JptJpaUiMessages.AddPersistentClassDialog_mappingLabel);

        this.mappingCombo = new ComboViewer(createCombo(composite, 2));
        this.mappingCombo.setContentProvider(new IStructuredContentProvider() {
            public void dispose() {
                //nothing to dispose
            }

            public Object[] getElements(Object inputElement) {
                return ArrayTools.array(getTypeMappingUiDefinitions((EntityMappings) inputElement));
            }

            protected Iterable<MappingUiDefinition> getTypeMappingUiDefinitions(EntityMappings entityMappings) {
                JpaPlatformUi ui = getJpaPlatformUi();
                return (ui != null) ? ui.getTypeMappingUiDefinitions(entityMappings.getResourceType())
                        : IterableTools.<MappingUiDefinition>emptyIterable();
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                //NOP
            }
        });
        this.mappingCombo.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                return ((MappingUiDefinition) element).getLabel();
            }
        });
        this.mappingCombo.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                validate();
            }
        });
        this.mappingCombo.setInput(this.entityMappings);
        //TODO maybe use JpaPlatformUi.getDefaultTypeMappingDefintion() to do this? currently that returns null for orm.xml
        this.mappingCombo.getCombo().select(0); // select Entity to begin 

        // TODO - F1 Help
        // PlatformUI.getWorkbench().getHelpSystem().setHelp(group, IDaliHelpContextIds.NEW_JPA_PROJECT_CONTENT_PAGE_DATABASE);

        //getButton(IDialogConstants.OK_ID).setEnabled(false);  // disabled to start
        applyDialogFont(dialogArea);

        validate();

        return dialogArea;
    }

    private Label createLabel(Composite container, String text) {
        Label label = new Label(container, SWT.NONE);
        label.setText(text);
        return label;
    }

    private Text createText(Composite container) {
        // TODO bug 156185 - when this is fixed there should be api for this
        JavaTypeCompletionProcessor javaTypeCompletionProcessor = new JavaTypeCompletionProcessor(false, false);
        IPackageFragmentRoot pfr = getPackageFragmentRoot();
        if (pfr != null) {
            javaTypeCompletionProcessor.setPackageFragment(pfr.getPackageFragment(""));
        }

        Text text = new Text(container, SWT.BORDER | SWT.SINGLE);

        ControlContentAssistHelper.createTextContentAssistant(text, javaTypeCompletionProcessor);

        text.setLayoutData(getFieldGridData());
        return text;
    }

    protected GridData getFieldGridData() {
        int margin = FieldDecorationRegistry.getDefault().getMaximumDecorationWidth();
        GridData data = new GridData();
        data.horizontalAlignment = SWT.FILL;
        data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH + margin;
        data.horizontalIndent = margin;
        data.grabExcessHorizontalSpace = true;
        return data;
    }

    protected IPackageFragmentRoot getPackageFragmentRoot() {
        try {
            return this.getJpaProject().getJavaProject().getPackageFragmentRoots()[0];
        } catch (JavaModelException ex) {
            JptJpaUiPlugin.instance().logError(ex);
            return null;
        }
    }

    private Button createButton(Composite container, String text) {
        Button button = new Button(container, SWT.NONE);
        button.setText(text);
        return button;
    }

    private Combo createCombo(Composite container, int span) {
        Combo combo = new Combo(container, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY);
        GridData gd = getFieldGridData();
        gd.horizontalSpan = span;
        combo.setLayoutData(gd);
        return combo;
    }

    protected JpaPlatformUi getJpaPlatformUi() {
        return (JpaPlatformUi) this.entityMappings.getJpaPlatform().getAdapter(JpaPlatformUi.class);
    }

    private JpaProject getJpaProject() {
        return this.entityMappings.getJpaProject();
    }

    public String getClassName() {
        return this.classText.getText();
    }

    public String getMappingKey() {
        StructuredSelection selection = (StructuredSelection) this.mappingCombo.getSelection();
        return (selection.isEmpty()) ? null : ((MappingUiDefinition) selection.getFirstElement()).getKey();
    }

    protected IType chooseType() {
        SelectionDialog dialog;
        try {
            dialog = JavaUI.createTypeDialog(getShell(), PlatformUI.getWorkbench().getProgressService(),
                    SearchEngine.createJavaSearchScope(new IJavaElement[] { getJpaProject().getJavaProject() }),
                    IJavaElementSearchConstants.CONSIDER_CLASSES, false, getClassName());
        } catch (JavaModelException ex) {
            JptJpaUiPlugin.instance().logError(ex);
            return null;
        }

        dialog.setTitle(JptJpaUiMessages.AddPersistentClassDialog_classDialog_title);
        dialog.setMessage(JptJpaUiMessages.AddPersistentClassDialog_classDialog_message);

        return (dialog.open() == Window.OK) ? (IType) dialog.getResult()[0] : null;
    }

    private void validate() {
        String className = getClassName();

        if (StringTools.isBlank(className)) {
            updateStatus(JptJpaUiPlugin.instance()
                    .buildErrorStatus(JptJpaUiMessages.AddPersistentClassDialog_noClassError));
            return;
        }
        className = className.replace('$', '.');

        IType type;
        try {
            type = getJpaProject().getJavaProject().findType(className);
        } catch (JavaModelException jme) {
            type = null;
        }

        if (type == null) {
            updateStatus(JptJpaUiPlugin.instance()
                    .buildWarningStatus(JptJpaUiMessages.AddPersistentClassDialog_classNotFoundWarning));
            return;
        }

        if (this.entityMappings.containsManagedType(className)) {
            updateStatus(JptJpaUiPlugin.instance()
                    .buildWarningStatus(JptJpaUiMessages.AddPersistentClassDialog_duplicateClassWarning));
            return;
        }

        String mappingKey = getMappingKey();
        if (mappingKey == null) {
            updateStatus(JptJpaUiPlugin.instance()
                    .buildErrorStatus(JptJpaUiMessages.AddPersistentClassDialog_noMappingKeyError));
            return;
        }

        updateStatus(Status.OK_STATUS);
    }

    @Override
    protected void okPressed() {
        this.addedType = this.entityMappings.addPersistentType(getMappingKey(), getClassName());
        super.okPressed();
    }

    public OrmPersistentType openAndReturnType() {
        super.open();
        return this.addedType;
    }
}