blob: 4de2ec2bde3d3e182cdbcff9c3deb32e7ab7158d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 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.ui.internal.xml.details;
import org.eclipse.core.resources.IProject;
import org.eclipse.emf.common.command.CommandStack;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper;
import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaPackageCompletionProcessor;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.window.Window;
import org.eclipse.jpt.core.internal.XmlEObject;
import org.eclipse.jpt.core.internal.content.orm.EntityMappings;
import org.eclipse.jpt.core.internal.content.orm.EntityMappingsInternal;
import org.eclipse.jpt.core.internal.content.orm.OrmPackage;
import org.eclipse.jpt.ui.internal.JptUiPlugin;
import org.eclipse.jpt.ui.internal.details.BaseJpaController;
import org.eclipse.jpt.ui.internal.xml.JpaUiXmlMessages;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
public class XmlPackageChooser extends BaseJpaController
{
private EntityMappingsInternal entityMappings;
private Adapter entityMappingsListener;
private IContentAssistProcessor contentAssistProcessor;
private Composite composite;
private Text text;
public XmlPackageChooser(Composite parent, CommandStack theCommandStack, TabbedPropertySheetWidgetFactory widgetFactory) {
super(parent, theCommandStack, widgetFactory);
buildSchemaHolderListener();
}
private void buildSchemaHolderListener() {
this.entityMappingsListener = new AdapterImpl() {
public void notifyChanged(Notification notification) {
entityMappingsChanged(notification);
}
};
}
@Override
protected void buildWidget(Composite parent) {
this.composite = getWidgetFactory().createComposite(parent);
GridLayout gridLayout = new GridLayout();
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 1;
gridLayout.numColumns = 2;
this.composite.setLayout(gridLayout);
this.text = getWidgetFactory().createText(this.composite, "");
GridData data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
this.text.setLayoutData(data);
this.contentAssistProcessor = new JavaPackageCompletionProcessor(new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_ROOT));
ControlContentAssistHelper.createTextContentAssistant(this.text, this.contentAssistProcessor);
this.text.addModifyListener(
new ModifyListener() {
public void modifyText(ModifyEvent e) {
textModified(e);
}
});
Button browseButton = getWidgetFactory().createButton(this.composite, "Browse...", SWT.FLAT);
data = new GridData();
browseButton.setLayoutData(data);
browseButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
IPackageFragment packageFragment = choosePackage();
if (packageFragment != null) {
text.setText(packageFragment.getElementName());
}
}
public void widgetDefaultSelected(SelectionEvent e) {
IPackageFragment packageFragment = choosePackage();
if (packageFragment != null) {
text.setText(packageFragment.getElementName());
}
}
});
}
private void textModified(ModifyEvent e) {
if (isPopulating()) {
return;
}
String text = ((Text) e.getSource()).getText();
this.entityMappings.setPackage(text);
//TODO set a JEM Package??
//.setJavaClass(JavaRefFactory.eINSTANCE.createClassRef(text));
// TODO Does this need to be done?
//this.editingDomain.getCommandStack().execute(SetCommand.create(this.editingDomain, this.entity, MappingsPackage.eINSTANCE.getEntity_SpecifiedName(), text));
}
private void entityMappingsChanged(Notification notification) {
if (notification.getFeatureID(EntityMappings.class) ==
OrmPackage.ENTITY_MAPPINGS__PACKAGE) {
Display.getDefault().asyncExec(
new Runnable() {
public void run() {
populate();
}
});
}
}
@Override
protected void engageListeners() {
if (this.entityMappings != null) {
entityMappings.eAdapters().add(this.entityMappingsListener);
}
}
@Override
protected void disengageListeners() {
if (this.entityMappings != null) {
this.entityMappings.eAdapters().remove(this.entityMappingsListener);
}
}
@Override
public void doPopulate(EObject obj) {
this.entityMappings = (EntityMappingsInternal) obj;
populateText();
}
@Override
protected void doPopulate() {
populateText();
}
private void populateText() {
if (entityMappings == null) {
text.clearSelection();
return;
}
IPackageFragmentRoot root = getPackageFragmentRoot();
if (root != null) {
((JavaPackageCompletionProcessor)this.contentAssistProcessor).setPackageFragmentRoot(root);
}
String package_ = this.entityMappings.getPackage();
if (package_ == null) {
setTextData("");
}
else {
setTextData(package_);
}
}
private IPackageFragmentRoot getPackageFragmentRoot() {
IProject project = ((XmlEObject) this.entityMappings).getJpaProject().getProject();
IJavaProject root = JavaCore.create(project);
try {
return root.getAllPackageFragmentRoots()[0];
}
catch (JavaModelException e) {
JptUiPlugin.log(e);
}
return null;
}
private void setTextData(String textData) {
if (! textData.equals(text.getText())) {
text.setText(textData);
}
}
@Override
public Control getControl() {
return this.composite;
}
/**
* Opens a selection dialog that allows to select a package.
*
* @return returns the selected package or <code>null</code> if the dialog has been canceled.
* The caller typically sets the result to the package input field.
* <p>
* Clients can override this method if they want to offer a different dialog.
* </p>
*
* @since 3.2
*/
protected IPackageFragment choosePackage() {
SelectionDialog selectionDialog;
try {
selectionDialog = JavaUI.createPackageDialog(text.getShell(), getPackageFragmentRoot());
}
catch (JavaModelException e) {
JptUiPlugin.log(e);
throw new RuntimeException(e);
}
selectionDialog.setTitle(JpaUiXmlMessages.XmlPackageChooser_PackageDialog_title);
selectionDialog.setMessage(JpaUiXmlMessages.XmlPackageChooser_PackageDialog_message);
selectionDialog.setHelpAvailable(false);
IPackageFragment pack= getPackageFragment();
if (pack != null) {
selectionDialog.setInitialSelections(new Object[] { pack });
}
if (selectionDialog.open() == Window.OK) {
return (IPackageFragment) selectionDialog.getResult()[0];
}
return null;
}
/**
* Returns the package fragment corresponding to the current input.
*
* @return a package fragment or <code>null</code> if the input
* could not be resolved.
*/
public IPackageFragment getPackageFragment() {
String packageString = this.text.getText();
return getPackageFragmentRoot().getPackageFragment(packageString);
}
}