gt: 									if (resource != null) {
context: /**
   */
  package de.dfki.iui.basys.model.runtime.component.presentation;
  
  
  import java.io.IOException;
  import java.io.InputStream;
  
  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.Collections;
  import java.util.EventObject;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.LinkedHashMap;
  import java.util.List;
  import java.util.Map;
  
  import org.eclipse.core.resources.IFile;
  import org.eclipse.core.resources.IMarker;
  import org.eclipse.core.resources.IResource;
  import org.eclipse.core.resources.IResourceChangeEvent;
  import org.eclipse.core.resources.IResourceChangeListener;
  import org.eclipse.core.resources.IResourceDelta;
  import org.eclipse.core.resources.IResourceDeltaVisitor;
  import org.eclipse.core.resources.ResourcesPlugin;
  
  import org.eclipse.core.runtime.CoreException;
  import org.eclipse.core.runtime.IPath;
  import org.eclipse.core.runtime.IProgressMonitor;
  import org.eclipse.core.runtime.NullProgressMonitor;
  
  import org.eclipse.jface.action.IMenuListener;
  import org.eclipse.jface.action.IMenuManager;
  import org.eclipse.jface.action.IStatusLineManager;
  import org.eclipse.jface.action.IToolBarManager;
  import org.eclipse.jface.action.MenuManager;
  import org.eclipse.jface.action.Separator;
  
  import org.eclipse.jface.dialogs.MessageDialog;
  import org.eclipse.jface.dialogs.ProgressMonitorDialog;
  
  import org.eclipse.jface.util.LocalSelectionTransfer;
  
  import org.eclipse.jface.viewers.ColumnWeightData;
  import org.eclipse.jface.viewers.ISelection;
  import org.eclipse.jface.viewers.ISelectionChangedListener;
  import org.eclipse.jface.viewers.ISelectionProvider;
  import org.eclipse.jface.viewers.IStructuredSelection;
  import org.eclipse.jface.viewers.ListViewer;
  import org.eclipse.jface.viewers.SelectionChangedEvent;
  import org.eclipse.jface.viewers.StructuredSelection;
  import org.eclipse.jface.viewers.StructuredViewer;
  import org.eclipse.jface.viewers.TableLayout;
  import org.eclipse.jface.viewers.TableViewer;
  import org.eclipse.jface.viewers.TreeViewer;
  import org.eclipse.jface.viewers.Viewer;
  
  import org.eclipse.swt.SWT;
  
  import org.eclipse.swt.custom.CTabFolder;
  
  import org.eclipse.swt.dnd.DND;
  import org.eclipse.swt.dnd.FileTransfer;
  import org.eclipse.swt.dnd.Transfer;
  
  import org.eclipse.swt.events.ControlAdapter;
  import org.eclipse.swt.events.ControlEvent;
  
  import org.eclipse.swt.graphics.Point;
  
  import org.eclipse.swt.layout.FillLayout;
  
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.swt.widgets.Menu;
  import org.eclipse.swt.widgets.Table;
  import org.eclipse.swt.widgets.TableColumn;
  import org.eclipse.swt.widgets.Tree;
  import org.eclipse.swt.widgets.TreeColumn;
  
  import org.eclipse.ui.IActionBars;
  import org.eclipse.ui.IEditorInput;
  import org.eclipse.ui.IEditorPart;
  import org.eclipse.ui.IEditorSite;
  import org.eclipse.ui.IPartListener;
  import org.eclipse.ui.IWorkbenchPart;
  import org.eclipse.ui.PartInitException;
  
  import org.eclipse.ui.dialogs.SaveAsDialog;
  
  import org.eclipse.ui.ide.IGotoMarker;
  
  import org.eclipse.ui.part.FileEditorInput;
  import org.eclipse.ui.part.MultiPageEditorPart;
  
  import org.eclipse.ui.views.contentoutline.ContentOutline;
  import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
  import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
  
  import org.eclipse.ui.views.properties.IPropertySheetPage;
  import org.eclipse.ui.views.properties.PropertySheet;
  import org.eclipse.ui.views.properties.PropertySheetPage;
  
  import org.eclipse.emf.common.command.BasicCommandStack;
  import org.eclipse.emf.common.command.Command;
  import org.eclipse.emf.common.command.CommandStack;
  import org.eclipse.emf.common.command.CommandStackListener;
  
  import org.eclipse.emf.common.notify.AdapterFactory;
  import org.eclipse.emf.common.notify.Notification;
  
  import org.eclipse.emf.common.ui.MarkerHelper;
  import org.eclipse.emf.common.ui.ViewerPane;
  
  import org.eclipse.emf.common.ui.editor.ProblemEditorPart;
  
  import org.eclipse.emf.common.ui.viewer.IViewerProvider;
  
  import org.eclipse.emf.common.util.BasicDiagnostic;
  import org.eclipse.emf.common.util.Diagnostic;
  import org.eclipse.emf.common.util.URI;
  
  
  import org.eclipse.emf.ecore.resource.Resource;
  import org.eclipse.emf.ecore.resource.ResourceSet;
  
  import org.eclipse.emf.ecore.util.EContentAdapter;
  import org.eclipse.emf.ecore.util.EcoreUtil;
  
  import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
  import org.eclipse.emf.edit.domain.EditingDomain;
  import org.eclipse.emf.edit.domain.IEditingDomainProvider;
  
  import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
  import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
  import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
  
  import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
  
  import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
  
  import org.eclipse.emf.edit.ui.celleditor.AdapterFactoryTreeEditor;
  
  import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;
  import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
  import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
  
  import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
  import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
  import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;
  
  import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper;
  import org.eclipse.emf.edit.ui.util.EditUIUtil;
  
  import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
  
  import de.dfki.iui.basys.model.runtime.component.provider.ComponentItemProviderAdapterFactory;
  
  import de.dfki.iui.basys.model.base.provider.BaseItemProviderAdapterFactory;
  
  import de.dfki.iui.basys.model.data.provider.DataItemProviderAdapterFactory;
  import de.dfki.iui.basys.model.domain.capability.provider.CapabilityItemProviderAdapterFactory;
  import de.dfki.iui.basys.model.domain.material.provider.MaterialItemProviderAdapterFactory;
  import de.dfki.iui.basys.model.domain.productdefinition.provider.ProductdefinitionItemProviderAdapterFactory;
  import de.dfki.iui.basys.model.domain.resourceinstance.provider.ResourceinstanceItemProviderAdapterFactory;
  import de.dfki.iui.basys.model.domain.resourcetype.provider.ResourcetypeItemProviderAdapterFactory;
  import de.dfki.iui.basys.model.domain.topology.provider.TopologyItemProviderAdapterFactory;
  import de.dfki.iui.basys.model.pattern.provider.PatternItemProviderAdapterFactory;
  import de.dfki.iui.basys.model.runtime.communication.presentation.RuntimeEditorPlugin;
  
  import de.dfki.iui.basys.model.runtime.communication.provider.CommunicationItemProviderAdapterFactory;
  
  import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
  
  import org.eclipse.ui.actions.WorkspaceModifyOperation;
  
  
  /**
   * This is an example of a Component model editor.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public class ComponentEditor
  	extends MultiPageEditorPart
  	implements IEditingDomainProvider, ISelectionProvider, IMenuListener, IViewerProvider, IGotoMarker {
  	/**
  	 * This keeps track of the editing domain that is used to track all changes to the model.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected AdapterFactoryEditingDomain editingDomain;
  
  	/**
  	 * This is the one adapter factory used for providing views of the model.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected ComposedAdapterFactory adapterFactory;
  
  	/**
  	 * This is the content outline page.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected IContentOutlinePage contentOutlinePage;
  
  	/**
  	 * This is a kludge...
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected IStatusLineManager contentOutlineStatusLineManager;
  
  	/**
  	 * This is the content outline page's viewer.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected TreeViewer contentOutlineViewer;
  
  	/**
  	 * This is the property sheet page.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected List<PropertySheetPage> propertySheetPages = new ArrayList<PropertySheetPage>();
  
  	/**
  	 * This is the viewer that shadows the selection in the content outline.
  	 * The parent relation must be correctly defined for this to work.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected TreeViewer selectionViewer;
  
  	/**
  	 * This inverts the roll of parent and child in the content provider and show parents as a tree.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected TreeViewer parentViewer;
  
  	/**
  	 * This shows how a tree view works.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected TreeViewer treeViewer;
  
  	/**
  	 * This shows how a list view works.
  	 * A list viewer doesn't support icons.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected ListViewer listViewer;
  
  	/**
  	 * This shows how a table view works.
  	 * A table can be used as a list with icons.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected TableViewer tableViewer;
  
  	/**
  	 * This shows how a tree view with columns works.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected TreeViewer treeViewerWithColumns;
  
  	/**
  	 * This keeps track of the active viewer pane, in the book.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected ViewerPane currentViewerPane;
  
  	/**
  	 * This keeps track of the active content viewer, which may be either one of the viewers in the pages or the content outline viewer.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected Viewer currentViewer;
  
  	/**
  	 * This listens to which ever viewer is active.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected ISelectionChangedListener selectionChangedListener;
  
  	/**
  	 * This keeps track of all the {@link org.eclipse.jface.viewers.ISelectionChangedListener}s that are listening to this editor.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected Collection<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();
  
  	/**
  	 * This keeps track of the selection of the editor as a whole.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected ISelection editorSelection = StructuredSelection.EMPTY;
  
  	/**
  	 * The MarkerHelper is responsible for creating workspace resource markers presented
  	 * in Eclipse's Problems View.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected MarkerHelper markerHelper = new EditUIMarkerHelper();
  
  	/**
  	 * This listens for when the outline becomes active
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected IPartListener partListener =
  		new IPartListener() {
  			public void partActivated(IWorkbenchPart p) {
  				if (p instanceof ContentOutline) {
  					if (((ContentOutline)p).getCurrentPage() == contentOutlinePage) {
  						getActionBarContributor().setActiveEditor(ComponentEditor.this);
  
  						setCurrentViewer(contentOutlineViewer);
  					}
  				}
  				else if (p instanceof PropertySheet) {
  					if (propertySheetPages.contains(((PropertySheet)p).getCurrentPage())) {
  						getActionBarContributor().setActiveEditor(ComponentEditor.this);
  						handleActivate();
  					}
  				}
  				else if (p == ComponentEditor.this) {
  					handleActivate();
  				}
  			}
  			public void partBroughtToTop(IWorkbenchPart p) {
  				// Ignore.
  			}
  			public void partClosed(IWorkbenchPart p) {
  				// Ignore.
  			}
  			public void partDeactivated(IWorkbenchPart p) {
  				// Ignore.
  			}
  			public void partOpened(IWorkbenchPart p) {
  				// Ignore.
  			}
  		};
  
  	/**
  	 * Resources that have been removed since last activation.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected Collection<Resource> removedResources = new ArrayList<Resource>();
  
  	/**
  	 * Resources that have been changed since last activation.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected Collection<Resource> changedResources = new ArrayList<Resource>();
  
  	/**
  	 * Resources that have been saved.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected Collection<Resource> savedResources = new ArrayList<Resource>();
  
  	/**
  	 * Map to store the diagnostic associated with a resource.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected Map<Resource, Diagnostic> resourceToDiagnosticMap = new LinkedHashMap<Resource, Diagnostic>();
  
  	/**
  	 * Controls whether the problem indication should be updated.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected boolean updateProblemIndication = true;
  
  	/**
  	 * Adapter used to update the problem indication when resources are demanded loaded.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected EContentAdapter problemIndicationAdapter =
  		new EContentAdapter() {
  			protected boolean dispatching;
  
  			@Override
  			public void notifyChanged(Notification notification) {
  				if (notification.getNotifier() instanceof Resource) {
  					switch (notification.getFeatureID(Resource.class)) {
  						case Resource.RESOURCE__IS_LOADED:
  						case Resource.RESOURCE__ERRORS:
  						case Resource.RESOURCE__WARNINGS: {
  							Resource resource = (Resource)notification.getNotifier();
  							Diagnostic diagnostic = analyzeResourceProblems(resource, null);
  							if (diagnostic.getSeverity() != Diagnostic.OK) {
  								resourceToDiagnosticMap.put(resource, diagnostic);
  							}
  							else {
  								resourceToDiagnosticMap.remove(resource);
  							}
  							dispatchUpdateProblemIndication();
  							break;
  						}
  					}
  				}
  				else {
  					super.notifyChanged(notification);
  				}
  			}
  
  			protected void dispatchUpdateProblemIndication() {
  				if (updateProblemIndication && !dispatching) {
  					dispatching = true;
  					getSite().getShell().getDisplay().asyncExec
  						(new Runnable() {
  							 public void run() {
  								 dispatching = false;
  								 updateProblemIndication();
  							 }
  						 });
  				}
  			}
  
  			@Override
  			protected void setTarget(Resource target) {
  				basicSetTarget(target);
  			}
  
  			@Override
  			protected void unsetTarget(Resource target) {
  				basicUnsetTarget(target);
  				resourceToDiagnosticMap.remove(target);
  				dispatchUpdateProblemIndication();
  			}
  		};
  
  	/**
  	 * This listens for workspace changes.
  	 * <!-- begin-user-doc -->
  	 * <!-- end-user-doc -->
  	 * @generated
  	 */
  	protected IResourceChangeListener resourceChangeListener =
  		new IResourceChangeListener() {
  			public void resourceChanged(IResourceChangeEvent event) {
  				IResourceDelta delta = event.getDelta();
  				try {
  					class ResourceDeltaVisitor implements IResourceDeltaVisitor {
  						protected ResourceSet resourceSet = editingDomain.getResourceSet();
  						protected Collection<Resource> changedResources = new ArrayList<Resource>();
  						protected Collection<Resource> removedResources = new ArrayList<Resource>();
  
  						public boolean visit(IResourceDelta delta) {
  							if (delta.getResource().getType() == IResource.FILE) {
  								if (delta.getKind() == IResourceDelta.REMOVED ||
  								    delta.getKind() == IResourceDelta.CHANGED && delta.getFlags() != IResourceDelta.MARKERS) {
  									Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(delta.getFullPath().toString(), true), false);
  