Package net.cis.common.model.diagram.shipdevice.navigator

Source Code of net.cis.common.model.diagram.shipdevice.navigator.CismodelNavigatorContentProvider

package net.cis.common.model.diagram.shipdevice.navigator;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;

import net.cis.common.model.diagram.shipdevice.edit.parts.BeamEditPart;
import net.cis.common.model.diagram.shipdevice.edit.parts.EnergyTorpedoEditPart;
import net.cis.common.model.diagram.shipdevice.edit.parts.EngineDeviceEditPart;
import net.cis.common.model.diagram.shipdevice.edit.parts.MassDriverEditPart;
import net.cis.common.model.diagram.shipdevice.edit.parts.MissileEditPart;
import net.cis.common.model.diagram.shipdevice.edit.parts.ModelerEditPart;
import net.cis.common.model.diagram.shipdevice.edit.parts.PulseEditPart;
import net.cis.common.model.diagram.shipdevice.edit.parts.ShieldDeviceEditPart;
import net.cis.common.model.diagram.shipdevice.part.CismodelVisualIDRegistry;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.ICommonContentProvider;

/**
* @generated
*/
public class CismodelNavigatorContentProvider implements ICommonContentProvider {

  /**
   * @generated
   */
  private static final Object[] EMPTY_ARRAY = new Object[0];

  /**
   * @generated
   */
  private Viewer myViewer;

  /**
   * @generated
   */
  private AdapterFactoryEditingDomain myEditingDomain;

  /**
   * @generated
   */
  private WorkspaceSynchronizer myWorkspaceSynchronizer;

  /**
   * @generated
   */
  private Runnable myViewerRefreshRunnable;

  /**
   * @generated
   */
  @SuppressWarnings({ "unchecked", "serial", "rawtypes" })
  public CismodelNavigatorContentProvider() {
    TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE
        .createEditingDomain();
    myEditingDomain = (AdapterFactoryEditingDomain) editingDomain;
    myEditingDomain.setResourceToReadOnlyMap(new HashMap() {
      public Object get(Object key) {
        if (!containsKey(key)) {
          put(key, Boolean.TRUE);
        }
        return super.get(key);
      }
    });
    myViewerRefreshRunnable = new Runnable() {
      public void run() {
        if (myViewer != null) {
          myViewer.refresh();
        }
      }
    };
    myWorkspaceSynchronizer = new WorkspaceSynchronizer(editingDomain,
        new WorkspaceSynchronizer.Delegate() {
          public void dispose() {
          }

          public boolean handleResourceChanged(final Resource resource) {
            unloadAllResources();
            asyncRefresh();
            return true;
          }

          public boolean handleResourceDeleted(Resource resource) {
            unloadAllResources();
            asyncRefresh();
            return true;
          }

          public boolean handleResourceMoved(Resource resource,
              final URI newURI) {
            unloadAllResources();
            asyncRefresh();
            return true;
          }
        });
  }

  /**
   * @generated
   */
  public void dispose() {
    myWorkspaceSynchronizer.dispose();
    myWorkspaceSynchronizer = null;
    myViewerRefreshRunnable = null;
    myViewer = null;
    unloadAllResources();
    ((TransactionalEditingDomain) myEditingDomain).dispose();
    myEditingDomain = null;
  }

  /**
   * @generated
   */
  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    myViewer = viewer;
  }

  /**
   * @generated
   */
  void unloadAllResources() {
    for (Resource nextResource : myEditingDomain.getResourceSet()
        .getResources()) {
      nextResource.unload();
    }
  }

  /**
   * @generated
   */
  void asyncRefresh() {
    if (myViewer != null && !myViewer.getControl().isDisposed()) {
      myViewer.getControl().getDisplay()
          .asyncExec(myViewerRefreshRunnable);
    }
  }

  /**
   * @generated
   */
  public Object[] getElements(Object inputElement) {
    return getChildren(inputElement);
  }

  /**
   * @generated
   */
  public void restoreState(IMemento aMemento) {
  }

  /**
   * @generated
   */
  public void saveState(IMemento aMemento) {
  }

  /**
   * @generated
   */
  public void init(ICommonContentExtensionSite aConfig) {
  }

  /**
   * @generated
   */
  public Object[] getChildren(Object parentElement) {
    if (parentElement instanceof IFile) {
      IFile file = (IFile) parentElement;
      URI fileURI = URI.createPlatformResourceURI(file.getFullPath()
          .toString(), true);
      Resource resource = myEditingDomain.getResourceSet().getResource(
          fileURI, true);
      ArrayList<CismodelNavigatorItem> result = new ArrayList<CismodelNavigatorItem>();
      ArrayList<View> topViews = new ArrayList<View>(resource
          .getContents().size());
      for (EObject o : resource.getContents()) {
        if (o instanceof View) {
          topViews.add((View) o);
        }
      }
      return result.toArray();
    }

    if (parentElement instanceof CismodelNavigatorGroup) {
      CismodelNavigatorGroup group = (CismodelNavigatorGroup) parentElement;
      return group.getChildren();
    }

    if (parentElement instanceof CismodelNavigatorItem) {
      CismodelNavigatorItem navigatorItem = (CismodelNavigatorItem) parentElement;
      if (navigatorItem.isLeaf() || !isOwnView(navigatorItem.getView())) {
        return EMPTY_ARRAY;
      }
      return getViewChildren(navigatorItem.getView(), parentElement);
    }

    /*
     * Due to plugin.xml restrictions this code will be called only for views representing
     * shortcuts to this diagram elements created on other diagrams.
     */
    if (parentElement instanceof IAdaptable) {
      View view = (View) ((IAdaptable) parentElement)
          .getAdapter(View.class);
      if (view != null) {
        return getViewChildren(view, parentElement);
      }
    }

    return EMPTY_ARRAY;
  }

  /**
   * @generated
   */
  private Object[] getViewChildren(View view, Object parentElement) {
    switch (CismodelVisualIDRegistry.getVisualID(view)) {

    case ModelerEditPart.VISUAL_ID: {
      LinkedList<CismodelAbstractNavigatorItem> result = new LinkedList<CismodelAbstractNavigatorItem>();
      Diagram sv = (Diagram) view;
      Collection<View> connectedViews;
      connectedViews = getChildrenByType(Collections.singleton(sv),
          CismodelVisualIDRegistry
              .getType(EngineDeviceEditPart.VISUAL_ID));
      result.addAll(createNavigatorItems(connectedViews, parentElement,
          false));
      connectedViews = getChildrenByType(Collections.singleton(sv),
          CismodelVisualIDRegistry
              .getType(ShieldDeviceEditPart.VISUAL_ID));
      result.addAll(createNavigatorItems(connectedViews, parentElement,
          false));
      connectedViews = getChildrenByType(Collections.singleton(sv),
          CismodelVisualIDRegistry.getType(BeamEditPart.VISUAL_ID));
      result.addAll(createNavigatorItems(connectedViews, parentElement,
          false));
      connectedViews = getChildrenByType(Collections.singleton(sv),
          CismodelVisualIDRegistry
              .getType(EnergyTorpedoEditPart.VISUAL_ID));
      result.addAll(createNavigatorItems(connectedViews, parentElement,
          false));
      connectedViews = getChildrenByType(Collections.singleton(sv),
          CismodelVisualIDRegistry
              .getType(MassDriverEditPart.VISUAL_ID));
      result.addAll(createNavigatorItems(connectedViews, parentElement,
          false));
      connectedViews = getChildrenByType(Collections.singleton(sv),
          CismodelVisualIDRegistry.getType(MissileEditPart.VISUAL_ID));
      result.addAll(createNavigatorItems(connectedViews, parentElement,
          false));
      connectedViews = getChildrenByType(Collections.singleton(sv),
          CismodelVisualIDRegistry.getType(PulseEditPart.VISUAL_ID));
      result.addAll(createNavigatorItems(connectedViews, parentElement,
          false));
      return result.toArray();
    }
    }
    return EMPTY_ARRAY;
  }

  /**
   * @generated
   */
  private Collection<View> getLinksSourceByType(Collection<Edge> edges,
      String type) {
    LinkedList<View> result = new LinkedList<View>();
    for (Edge nextEdge : edges) {
      View nextEdgeSource = nextEdge.getSource();
      if (type.equals(nextEdgeSource.getType())
          && isOwnView(nextEdgeSource)) {
        result.add(nextEdgeSource);
      }
    }
    return result;
  }

  /**
   * @generated
   */
  private Collection<View> getLinksTargetByType(Collection<Edge> edges,
      String type) {
    LinkedList<View> result = new LinkedList<View>();
    for (Edge nextEdge : edges) {
      View nextEdgeTarget = nextEdge.getTarget();
      if (type.equals(nextEdgeTarget.getType())
          && isOwnView(nextEdgeTarget)) {
        result.add(nextEdgeTarget);
      }
    }
    return result;
  }

  /**
   * @generated
   */
  private Collection<View> getOutgoingLinksByType(
      Collection<? extends View> nodes, String type) {
    LinkedList<View> result = new LinkedList<View>();
    for (View nextNode : nodes) {
      result.addAll(selectViewsByType(nextNode.getSourceEdges(), type));
    }
    return result;
  }

  /**
   * @generated
   */
  private Collection<View> getIncomingLinksByType(
      Collection<? extends View> nodes, String type) {
    LinkedList<View> result = new LinkedList<View>();
    for (View nextNode : nodes) {
      result.addAll(selectViewsByType(nextNode.getTargetEdges(), type));
    }
    return result;
  }

  /**
   * @generated
   */
  private Collection<View> getChildrenByType(
      Collection<? extends View> nodes, String type) {
    LinkedList<View> result = new LinkedList<View>();
    for (View nextNode : nodes) {
      result.addAll(selectViewsByType(nextNode.getChildren(), type));
    }
    return result;
  }

  /**
   * @generated
   */
  private Collection<View> getDiagramLinksByType(
      Collection<Diagram> diagrams, String type) {
    ArrayList<View> result = new ArrayList<View>();
    for (Diagram nextDiagram : diagrams) {
      result.addAll(selectViewsByType(nextDiagram.getEdges(), type));
    }
    return result;
  }

  // TODO refactor as static method
  /**
   * @generated
   */
  private Collection<View> selectViewsByType(Collection<View> views,
      String type) {
    ArrayList<View> result = new ArrayList<View>();
    for (View nextView : views) {
      if (type.equals(nextView.getType()) && isOwnView(nextView)) {
        result.add(nextView);
      }
    }
    return result;
  }

  /**
   * @generated
   */
  private boolean isOwnView(View view) {
    return ModelerEditPart.MODEL_ID.equals(CismodelVisualIDRegistry
        .getModelID(view));
  }

  /**
   * @generated
   */
  private Collection<CismodelNavigatorItem> createNavigatorItems(
      Collection<View> views, Object parent, boolean isLeafs) {
    ArrayList<CismodelNavigatorItem> result = new ArrayList<CismodelNavigatorItem>(
        views.size());
    for (View nextView : views) {
      result.add(new CismodelNavigatorItem(nextView, parent, isLeafs));
    }
    return result;
  }

  /**
   * @generated
   */
  public Object getParent(Object element) {
    if (element instanceof CismodelAbstractNavigatorItem) {
      CismodelAbstractNavigatorItem abstractNavigatorItem = (CismodelAbstractNavigatorItem) element;
      return abstractNavigatorItem.getParent();
    }
    return null;
  }

  /**
   * @generated
   */
  public boolean hasChildren(Object element) {
    return element instanceof IFile || getChildren(element).length > 0;
  }

}
TOP

Related Classes of net.cis.common.model.diagram.shipdevice.navigator.CismodelNavigatorContentProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.