/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.diagram.ui.notation.uml.part;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ListDialog;
import org.teiid.core.designer.ModelerCoreException;
import org.teiid.core.designer.util.I18nUtil;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.association.AbstractAssociationDescriptor;
import org.teiid.designer.core.association.AssociationDescriptor;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.DiagramUiPlugin;
import org.teiid.designer.ui.common.util.UiUtil;
import org.teiid.designer.ui.editors.ModelEditorManager;
import org.teiid.designer.ui.wizards.NewModelObjectWizardManager;
/**
* SetAssociationCommand
*
* @since 8.0
*/
public class SetAssociationCommand extends org.eclipse.gef.commands.Command implements DiagramUiConstants {
private static final String PREFIX = I18nUtil.getPropertyPrefix(SetAssociationCommand.class);
private List selectedEObjects;
public SetAssociationCommand( List selectedEObjects ) {
super("Set Foreign Key"); //$NON-NLS-1$
this.selectedEObjects = selectedEObjects;
}
@Override
public void execute() {
if (selectedEObjects != null) {
Collection descriptors = null;
try {
descriptors = ModelerCore.getModelEditor().getNewAssociationDescriptors(selectedEObjects);
} catch (ModelerCoreException theException) {
Util.log(theException);
}
if ((descriptors != null) && !descriptors.isEmpty()) {
AssociationDescriptor descriptor = null;
if (descriptors.size() == 1) {
descriptor = (AssociationDescriptor)descriptors.iterator().next();
} else {
LabelProvider provider = new AssociationDescriptorLabelProvider();
// display dialog to let user determine the association type
ListDialog dialog = new ListDialog(UiUtil.getWorkbenchShellOnlyIfUiThread());
dialog.setLabelProvider(provider);
// Defect 18296 the content provider Interface changed. Adapted the
// AssociationDescriptorLabelProvider to do both content and label....
dialog.setContentProvider((IStructuredContentProvider)provider);
// ListContentProvider.inputChanged() is look/checking for a input of
// type "List", so we need to create one from the Collection.
// Goutam chanaged it the other day to be a HashSet collection, which
// busted it.
dialog.setInput(new ArrayList(descriptors));
dialog.setTitle(Util.getString(PREFIX + "dialog.title")); //$NON-NLS-1$
dialog.setMessage(Util.getString(PREFIX + "dialog.msg")); //$NON-NLS-1$
dialog.setInitialSelections(new Object[] {descriptors.iterator().next()});
if (dialog.open() == Window.OK) {
Object[] result = dialog.getResult();
if ((result != null) && (result.length > 0)) {
// should only be one
descriptor = (AssociationDescriptor)result[0];
}
}
}
// create the association
if (descriptor != null) {
Shell shell = DiagramUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
ISelection selection = new StructuredSelection(selectedEObjects);
if (NewModelObjectWizardManager.isAssociationDescriptorValid(shell, descriptor, selection)) {
if (!descriptor.creationComplete()) {
String undoText = Util.getString(PREFIX + "undoText", new Object[] {descriptor.getText()}); //$NON-NLS-1$
boolean requiredStart = ModelerCore.startTxn(false, false, undoText, this);
boolean succeeded = false;
try {
EObject newAssociation = ModelerCore.getModelEditor().createNewAssociationFromDescriptor(descriptor);
// Let's call ModelWorkspaceManager and force open an editor?
ModelEditorManager.open(newAssociation, true);
succeeded = true;
} catch (ModelerCoreException theException) {
Util.log(IStatus.ERROR, theException, Util.getString(PREFIX + "msg.createDescriptorProblem", //$NON-NLS-1$
new Object[] {descriptor}));
} finally {
if (requiredStart) {
if (succeeded) {
ModelerCore.commitTxn();
} else {
ModelerCore.rollbackTxn();
}
}
}
} else {
EObject newAssociation = ((AbstractAssociationDescriptor)descriptor).getNewAssociation();
if (newAssociation != null) {
ModelEditorManager.open(newAssociation, true);
}
}
}
}
}
}
}
@Override
public void redo() {
}
@Override
public void undo() {
}
/**
* The <code>AssociationDescriptorLabelProvider</code> provides text and images for {@link AssociationDescriptor}s.
*/
class AssociationDescriptorLabelProvider extends LabelProvider implements IStructuredContentProvider {
/**
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object,
* java.lang.Object)
* @since 4.3
*/
@Override
public void inputChanged( Viewer viewer,
Object oldInput,
Object newInput ) {
}
/**
* @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
*/
@Override
public String getText( Object theElement ) {
String result = null;
if ((theElement != null) && (theElement instanceof AssociationDescriptor)) {
result = ((AssociationDescriptor)theElement).getText();
} else {
result = super.getText(theElement);
}
return result;
}
/**
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
* @since 4.3
*/
@Override
public Object[] getElements( Object inputElement ) {
// We have a list
return ((List)inputElement).toArray();
}
}
}