/*
* 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.extension.ui.actions;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.teiid.designer.core.workspace.ModelFileUtil;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.extension.ExtensionConstants;
import org.teiid.designer.extension.ExtensionPlugin;
import org.teiid.designer.extension.definition.ModelExtensionAssistant;
import org.teiid.designer.extension.definition.ModelExtensionDefinition;
import org.teiid.designer.extension.registry.ModelExtensionRegistry;
import org.teiid.designer.extension.ui.Messages;
import org.teiid.designer.extension.ui.wizards.ManageModelExtensionDefnsWizard;
import org.teiid.designer.ui.UiPlugin;
import org.teiid.designer.ui.actions.SortableSelectionAction;
import org.teiid.designer.ui.common.eventsupport.SelectionUtilities;
import org.teiid.designer.ui.editors.ModelEditor;
import org.teiid.designer.ui.editors.ModelEditorManager;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
public class ManageModelExtensionDefnsAction extends SortableSelectionAction {
private final ModelExtensionRegistry registry;
/**
* @since 7.6
*/
public ManageModelExtensionDefnsAction() {
super(Messages.manageModelExtensionDefnsActionTitle, SWT.DEFAULT);
// setImageDescriptor(DatatoolsUiPlugin.getDefault().getImageDescriptor(DatatoolsUiConstants.Images.VIEW_CONNECTION_ICON));
// providerFactory = new ConnectionInfoProviderFactory();
this.registry = (Platform.isRunning() ? ExtensionPlugin.getInstance().getRegistry() : null);
}
/**
* @see org.teiid.designer.ui.actions.SortableSelectionAction#isValidSelection(org.eclipse.jface.viewers.ISelection)
* @since 7.6
*/
@Override
public boolean isValidSelection( ISelection selection ) {
// Enable for single/multiple Virtual Tables
return canManageModelSelected(selection);
}
/**
* @see org.eclipse.jface.action.IAction#run()
* @since 7.6
*/
@Override
public void run() {
ModelResource modelResource = null;
if (!getSelection().isEmpty()) {
IFile modelFile = (IFile)SelectionUtilities.getSelectedObjects(getSelection()).get(0);
modelResource = ModelUtilities.getModelResource(modelFile);
}
if (modelResource != null) {
IStructuredSelection structuredSelection = new StructuredSelection(modelResource);
final ManageModelExtensionDefnsWizard wizard = new ManageModelExtensionDefnsWizard();
// Warn User and do not allow Wizard to open with a 'dirty' model.
IFile file = (IFile)modelResource.getResource();
ModelEditor editor = ModelEditorManager.getModelEditorForFile(file, true);
if (editor != null && editor.isDirty()) {
boolean doContinue = MessageDialog.openQuestion(wizard.getShell(),
Messages.manageModelExtensionDefnsActionModelDirtyTitle,
Messages.manageModelExtensionDefnsActionModelDirtyMsg);
if (!doContinue) {
return;
}
ModelEditorManager.save(file);
}
wizard.init(UiPlugin.getDefault().getCurrentWorkbenchWindow().getWorkbench(), structuredSelection);
final WizardDialog dialog = new WizardDialog(wizard.getShell(), wizard);
dialog.open();
}
}
/**
* @see org.teiid.designer.ui.actions.ISelectionAction#isApplicable(org.eclipse.jface.viewers.ISelection)
* @since 7.6
*/
@Override
public boolean isApplicable( ISelection selection ) {
return canManageModelSelected(selection);
}
/**
* Determine if the selection is allowed to have a Model Extension Definition
*
* @param theSelection the selected object
* @return 'true' if the selection is an extendable model
* @since 7.6
*/
private boolean canManageModelSelected( ISelection theSelection ) {
boolean result = false;
List allObjs = SelectionUtilities.getSelectedObjects(theSelection);
// Must be a single selection
if (!allObjs.isEmpty() && allObjs.size() == 1) {
Object selectedObj = allObjs.get(0);
// For Model Selection, get IFile instance
if (isModelFile(selectedObj)) {
// Get all the MEDs currently registered
Collection<ModelExtensionDefinition> meds = this.registry.getAllDefinitions();
// If any of the MEDs can be added or removed, action is valid
for (ModelExtensionDefinition med : meds) {
ModelExtensionAssistant assistant = med.getModelExtensionAssistant();
if (assistant.supportsMedOperation(ExtensionConstants.MedOperations.ADD_MED_TO_MODEL, selectedObj)
|| assistant.supportsMedOperation(ExtensionConstants.MedOperations.DELETE_MED_FROM_MODEL, selectedObj)) {
result = true;
break;
}
}
}
}
return result;
}
private boolean isModelFile( Object obj ) {
if (obj instanceof IFile) {
final IPath path = ((IFile)obj).getLocation();
if (path != null) return ModelFileUtil.isModelFile(path.toFile());
}
return false;
}
}