/*
* 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.ui.actions;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.actions.ActionDelegate;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelUtil;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.ui.UiConstants;
import org.teiid.designer.ui.UiPlugin;
import org.teiid.designer.ui.common.eventsupport.SelectionUtilities;
import org.teiid.designer.ui.editors.ModelEditorManager;
import org.teiid.designer.ui.event.ModelResourceEvent;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* CloseModelAction
*
* @since 8.0
*/
public class CloseModelAction extends ActionDelegate implements IWorkbenchWindowActionDelegate,
IViewActionDelegate {
private Collection selectedModelResources;
/**
* Construct an instance of RebuildImportsAction.
*/
public CloseModelAction() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
@Override
public void run(IAction action) {
if (selectedModelResources != null) {
try {
for ( Iterator iter = selectedModelResources.iterator() ; iter.hasNext() ; ) {
ModelResource modelResource = (ModelResource) iter.next();
IFile modelFile = (IFile) modelResource.getResource();
// defect 11675 - make sure user didn't cancel closing unsaved changes
boolean doClose = true;
if (ModelEditorManager.isOpen(modelFile)) {
// make sure the user didn't cancel the close:
doClose = ModelEditorManager.close(modelFile, true);
} // endif -- open in editor
if (doClose) {
ModelResourceEvent event = new ModelResourceEvent(modelResource,
ModelResourceEvent.CLOSING, this);
UiPlugin.getDefault().getEventBroker().processEvent(event);
modelResource.close();
event = new ModelResourceEvent(modelResource, ModelResourceEvent.CLOSED,
this);
UiPlugin.getDefault().getEventBroker().processEvent(event);
} // endif
}
} catch (ModelWorkspaceException e) {
UiConstants.Util.log(IStatus.ERROR, e, e.getMessage());
}
}
// Defect 11675 - leave the action enabled until the selection changes
// action.setEnabled(false);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
*/
@Override
public void selectionChanged(IAction action, ISelection selection) {
selectedModelResources = Collections.EMPTY_LIST;
boolean enable = SelectionUtilities.isAllIResourceObjects(selection);
if ( enable ) {
// can only enable if all selected objects have open ModelResources
Collection selectedObjects = SelectionUtilities.getSelectedObjects(selection);
if ( selectedObjects != null && ! selectedObjects.isEmpty() ) {
selectedModelResources = new ArrayList(selectedObjects.size());
for ( Iterator iter = selectedObjects.iterator() ; iter.hasNext() && enable ; ) {
Object obj = iter.next();
// must be a model
if ( obj instanceof IResource && ModelUtilities.isModelFile((IResource) obj)) {
try {
ModelResource modelResource = ModelUtil.getModelResource((IFile) obj, false);
// defect 11675 - ModelResource does not need to be open, just present
if ( modelResource!=null ) {
selectedModelResources.add(modelResource);
} else {
enable = false;
}
} catch (Exception e) {
UiConstants.Util.log(IStatus.ERROR, e, e.getMessage());
enable = false;
}
} else {
enable = false;
}
}
}
}
action.setEnabled(enable);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
*/
@Override
public void init(IWorkbenchWindow window) {
}
/* (non-Javadoc)
* @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
*/
@Override
public void init(IViewPart view) {
}
}