/*
* 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.workers;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
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.actions.TransactionSettings;
import org.teiid.designer.ui.common.AbstractUiPlugin;
import org.teiid.designer.ui.common.actions.IActionWorker;
import org.teiid.designer.ui.common.actions.WorkerProblem;
import org.teiid.designer.ui.common.eventsupport.SelectionUtilities;
import org.teiid.designer.ui.editors.ModelEditor;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* @since 8.0
*/
public class ModelObjectWorker implements
IActionWorker {
private Object currentSelection;
private boolean enabled = false;
private boolean enableAfterExecute = false;
private WorkerProblem workerProblem;
private Object workerSource;
private TransactionSettings txnSettings;
/**
*
* @since 4.2
*/
public ModelObjectWorker(boolean enableAfterExecute) {
super();
this.enableAfterExecute = enableAfterExecute;
}
/**
* @see org.teiid.designer.ui.common.actions.IActionWorker#getEnableState()
* @since 4.2
*/
@Override
public boolean setEnabledState() {
return false;
}
/**
* @see org.teiid.designer.ui.common.actions.IActionWorker#execute()
* @since 4.2
*/
@Override
public boolean execute() {
return false;
}
/**
* This method checks for licencing issues.
* @return
* @since 4.3
*/
protected boolean canLegallyEditResource() {
boolean canEdit = false;
if( currentSelection instanceof ISelection ) {
List allEObjects = SelectionUtilities.getSelectedEObjects((ISelection)currentSelection);
if( allEObjects != null && !allEObjects.isEmpty() ) {
canEdit = true;
} else {
// make sure only models selected and that they are licensed
List selectedObjs = SelectionUtilities.getSelectedObjects((ISelection)currentSelection);
if (!selectedObjs.isEmpty()) {
canEdit = true;
for (int size = selectedObjs.size(), i = 0; i < size; i++) {
Object obj = selectedObjs.get(i);
if ((obj instanceof IResource) && ModelUtilities.isModelFile((IResource)obj)) {
try {
if (ModelUtil.getModelResource(((IFile)obj), false) == null) {
canEdit = false;
break;
}
} catch (ModelWorkspaceException theException) {
canEdit = false;
UiConstants.Util.log(theException);
break;
}
} else {
canEdit = false;
break;
}
}
}
}
}
return canEdit;
}
/**
* This method provides modeler actions a quick way to determine whether the selected EObjects
* are in a model that is read-only. This is needed for enable/disable when selection changes.
* @param theSelection
* @return <code>true</code> if at least one of the selected EObjects or models is readonly;
* <code>false</code> otherwise.
*/
protected boolean isReadOnly() {
boolean isreadonly = true;
if( currentSelection instanceof ISelection ) {
List allEObjects = SelectionUtilities.getSelectedEObjects((ISelection)currentSelection);
if (!allEObjects.isEmpty()) {
isreadonly = false;
Iterator iter = allEObjects.iterator();
while( iter.hasNext() ) {
if( ModelObjectUtilities.isReadOnly((EObject)iter.next()) ) {
isreadonly = true;
break;
}
}
} else {
List selectedObjs = SelectionUtilities.getSelectedObjects((ISelection)currentSelection);
if (!selectedObjs.isEmpty()) {
isreadonly = false;
for (int size = selectedObjs.size(), i = 0; i < size; i++) {
Object obj = selectedObjs.get(i);
if (obj != null && (obj instanceof IResource) &&
((IResource)obj).getResourceAttributes() != null && ((IResource)obj).getResourceAttributes().isReadOnly()) {
isreadonly = true;
break;
} else if (obj != null && !(obj instanceof IResource)) {
isreadonly = true;
break;
}
}
}
}
}
return isreadonly;
}
/**
*
* @see org.teiid.designer.ui.common.actions.IActionWorker#getSelection()
* @since 4.2
*/
@Override
public Object getSelection() {
return currentSelection;
}
/**
*
* @see org.teiid.designer.ui.common.actions.IActionWorker#selectionChanged(java.lang.Object)
* @since 4.2
*/
@Override
public boolean selectionChanged(Object selection) {
currentSelection = selection;
enabled = setEnabledState();
return enabled;
}
/**
*
* @see org.teiid.designer.ui.common.actions.IActionWorker#getEnableAfterExecute()
* @since 4.2
*/
@Override
public boolean getEnableAfterExecute() {
return this.enableAfterExecute;
}
/**
*
* @see org.teiid.designer.ui.common.actions.IActionWorker#getWorkerProblem()
* @since 4.2
*/
@Override
public WorkerProblem getWorkerProblem() {
return this.workerProblem;
}
/**
*
* @param workerProblem
* @since 4.2
*/
public void setWorkerProblem(WorkerProblem workerProblem) {
this.workerProblem = workerProblem;
}
public Object getWorkerSource() {
return this.workerSource;
}
public void setWorkerSource(Object workerSource) {
this.workerSource = workerSource;
}
public void setTransactionSettings( TransactionSettings txnSettings ) {
this.txnSettings = txnSettings;
// set source to this
if ( this.txnSettings != null ) {
this.txnSettings.setSource( this );
}
}
public TransactionSettings getTransactionSettings() {
return txnSettings;
}
protected ModelEditor getActiveEditor() {
IWorkbenchPage page = UiPlugin.getDefault().getCurrentWorkbenchWindow().getActivePage();
// see if active page is available:
if (page == null) {
// not available, see if we have any reference to a page:
page = AbstractUiPlugin.getLastValidPage();
if (page == null) {
// still no page; exit:
return null;
} // endif
} // endif
IEditorPart editor = page.getActiveEditor();
if (editor instanceof ModelEditor) {
return (ModelEditor) editor;
}
return null;
}
}