blob: 078173f54c700857ddff9c5febe582489b866198 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 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.eclipselink.ui.internal.dialogs;
import java.util.Comparator;
import org.eclipse.core.runtime.IStatus;
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.IJavaSearchScope;
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.core.JptResourceType;
import org.eclipse.jpt.common.utility.internal.ArrayTools;
import org.eclipse.jpt.common.utility.internal.CollectionTools;
import org.eclipse.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.jpa.core.JpaProject;
import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute;
import org.eclipse.jpt.jpa.eclipselink.core.context.orm.EclipseLinkOrmPersistentType;
import org.eclipse.jpt.jpa.eclipselink.ui.JptJpaEclipseLinkUiPlugin;
import org.eclipse.jpt.jpa.eclipselink.ui.internal.EclipseLinkUiMessages;
import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
import org.eclipse.jpt.jpa.ui.details.MappingUiDefinition;
import org.eclipse.jpt.jpa.ui.internal.JptUiMessages;
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;
import org.eclipse.ui.progress.IProgressService;
import com.ibm.icu.text.Collator;
public class AddVirtualAttributeDialog extends StatusDialog
{
private EclipseLinkOrmPersistentType persistentType;
protected Text nameText;
protected ComboViewer mappingCombo;
protected Text attributeTypeText;
private Button attributeTypeBrowseButton;
private OrmPersistentAttribute addedAttribute;
public AddVirtualAttributeDialog(Shell parentShell, EclipseLinkOrmPersistentType persistentType) {
super(parentShell);
this.persistentType = persistentType;
setTitle(EclipseLinkUiMessages.AddVirtualAttributeDialog_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, 1, EclipseLinkUiMessages.AddVirtualAttributeDialog_nameLabel);
this.nameText = createText(composite, 2);
this.nameText.addModifyListener(
new ModifyListener() {
public void modifyText(ModifyEvent e) {
validate();
}
}
);
createLabel(composite, 1, EclipseLinkUiMessages.AddVirtualAttributeDialog_mappingLabel);
this.mappingCombo = new ComboViewer(createCombo(composite, 2));
this.mappingCombo.getCombo().setFocus();
this.mappingCombo.setContentProvider(this.buildComboContentProvider());
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.getJpaPlatformUi());
createLabel(composite, 1, EclipseLinkUiMessages.AddVirtualAttributeDialog_attributeTypeLabel);
this.attributeTypeText = createAttributeTypeText(composite);
this.attributeTypeText.addModifyListener(
new ModifyListener() {
public void modifyText(ModifyEvent e) {
validate();
}
}
);
this.attributeTypeBrowseButton = createButton(composite, JptUiMessages.General_browse);
this.attributeTypeBrowseButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
IType type = chooseType();
if (type != null) {
attributeTypeText.setText(type.getFullyQualifiedName('$'));
}
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
this.nameText.setFocus();
applyDialogFont(dialogArea);
validate();
return dialogArea;
}
protected JpaPlatformUi getJpaPlatformUi() {
return (JpaPlatformUi) this.getJpaProject().getJpaPlatform().getAdapter(JpaPlatformUi.class);
}
protected IStructuredContentProvider buildComboContentProvider() {
return new IStructuredContentProvider() {
public void dispose() {
//nothing to dispose
}
public Object[] getElements(Object inputElement) {
return ArrayTools.array(
CollectionTools.sort(
((JpaPlatformUi) inputElement).attributeMappingUiDefinitions(AddVirtualAttributeDialog.this.getJptResourceType()),
getProvidersComparator()));
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
//input will not change
}
};
}
protected JptResourceType getJptResourceType() {
return this.persistentType.getResourceType();
}
protected Comparator<MappingUiDefinition<?,?>> getProvidersComparator() {
return new Comparator<MappingUiDefinition<?,?>>() {
public int compare(MappingUiDefinition<?,?> item1, MappingUiDefinition<?,?> item2) {
String displayString1 = item1.getLabel();
String displayString2 = item2.getLabel();
return Collator.getInstance().compare(displayString1, displayString2);
}
};
}
private Label createLabel(Composite container, int span, String text) {
Label label = new Label(container, SWT.NONE);
label.setText(text);
GridData gd = new GridData();
gd.horizontalSpan = span;
label.setLayoutData(gd);
return label;
}
private Text createText(Composite container, int span) {
Text text = new Text(container, SWT.BORDER | SWT.SINGLE);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = span;
gd.widthHint = 250;
text.setLayoutData(gd);
return text;
}
private Text createAttributeTypeText(Composite container) {
// TODO bug 156185 - when this is fixed there should be api for this
JavaTypeCompletionProcessor javaTypeCompletionProcessor = new JavaTypeCompletionProcessor(true/*enableBaseTypes*/, 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) {
JptJpaEclipseLinkUiPlugin.log(ex);
return null;
}
}
private Combo createCombo(Composite container, int span) {
Combo combo = new Combo(container, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = span;
combo.setLayoutData(gd);
return combo;
}
private Button createButton(Composite container, String text) {
Button button = new Button(container, SWT.NONE);
button.setText(text);
return button;
}
protected JpaProject getJpaProject() {
return this.persistentType.getJpaProject();
}
public String getAttributeType() {
return this.attributeTypeText.getText();
}
public String getAttributeName() {
return this.nameText.getText();
}
public String getMappingKey() {
StructuredSelection selection = (StructuredSelection) this.mappingCombo.getSelection();
return (selection.isEmpty()) ? null : ((MappingUiDefinition<?,?>) selection.getFirstElement()).getKey();
}
protected IType chooseType() {
IJavaElement[] elements= new IJavaElement[] { getJpaProject().getJavaProject() };
IJavaSearchScope scope= SearchEngine.createJavaSearchScope(elements);
IProgressService service = PlatformUI.getWorkbench().getProgressService();
SelectionDialog typeSelectionDialog;
try {
typeSelectionDialog =
JavaUI.createTypeDialog(
getShell(), service, scope,
IJavaElementSearchConstants.CONSIDER_ALL_TYPES,
false, getAttributeType());
}
catch (JavaModelException e) {
JptJpaEclipseLinkUiPlugin.log(e);
throw new RuntimeException(e);
}
typeSelectionDialog.setTitle(JptUiMessages.AddPersistentClassDialog_classDialog_title);
typeSelectionDialog.setMessage(JptUiMessages.AddPersistentClassDialog_classDialog_message);
if (typeSelectionDialog.open() == Window.OK) {
return (IType) typeSelectionDialog.getResult()[0];
}
return null;
}
private void validate() {
if (StringTools.stringIsEmpty(this.getAttributeName())) {
updateStatus(
new Status(
IStatus.ERROR, JptJpaEclipseLinkUiPlugin.PLUGIN_ID,
EclipseLinkUiMessages.AddVirtualAttributeDialog_noNameError));
return;
}
if (this.getMappingKey() == null) {
updateStatus(
new Status(
IStatus.ERROR, JptJpaEclipseLinkUiPlugin.PLUGIN_ID,
EclipseLinkUiMessages.AddVirtualAttributeDialog_noMappingKeyError));
return;
}
if (StringTools.stringIsEmpty(this.getAttributeType())) {
updateStatus(
new Status(
IStatus.ERROR, JptJpaEclipseLinkUiPlugin.PLUGIN_ID,
EclipseLinkUiMessages.AddVirtualAttributeDialog_noAttributeTypeError));
return;
}
updateStatus(Status.OK_STATUS);
}
@Override
protected void okPressed() {
this.addedAttribute = this.persistentType.addVirtualAttribute(getAttributeName(), getMappingKey(), getAttributeType());
super.okPressed();
}
public OrmPersistentAttribute openAndReturnAttribute() {
super.open();
return this.addedAttribute;
}
}