private void hookContextMenu() {
   MenuManager menuMgr = new MenuManager("#PopupMenu");
   menuMgr.setRemoveAllWhenShown(true);
   menuMgr.addMenuListener(
       new IMenuListener() {
         public void menuAboutToShow(IMenuManager manager) {
           ResultModelTreeView.this.fillContextMenu(manager);
         }
       });
   Menu menu = menuMgr.createContextMenu(viewer.getControl());
   viewer.getControl().setMenu(menu);
   getSite().registerContextMenu(menuMgr, viewer);
 }
 @SuppressWarnings("unchecked")
 public IEditorPart openEditor(IStructuredSelection selection) {
   Object o = selection.getFirstElement();
   EObject obj = null;
   if (o instanceof EObject) {
     obj = (EObject) o;
   }
   if (o instanceof EObjectGroup) {
     EObjectGroup group = (EObjectGroup) o;
     if (!group.getEObjects().isEmpty()) {
       obj = group.getEObjects().getFirst();
     }
   }
   if (obj != null) {
     //			URI uri = obj.eResource().getURI();
     //			String fileString = URI.decode(uri.path());
     //			fileString = fileString.replaceFirst("/resource", "");
     //			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fileString));
     //			IWorkbench workbench = PlatformUI.getWorkbench();
     IFile file = ((LinkedList<ResultModel>) viewer.getInput()).get(0).getIFile();
     IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
     IWorkbenchPage page = workbenchWindow.getActivePage();
     try {
       if (file.exists()) {
         return IDE.openEditor(page, file);
       }
     } catch (PartInitException exception) {
       return null;
     }
   }
   return null;
 }
  @Override
  public void createPartControl(Composite parent) {
    this.parent = parent;
    this.viewer =
        new ResultModelTreeViewer(parent); // TODO: add link between viewer and EMFModelSmells
    viewer.setContentProvider(new ResultModelTreeViewerContentProvider());
    viewer.setLabelProvider(new ResultModelTreeViewerLabelProvider());
    viewer.addSelectionChangedListener(
        new ISelectionChangedListener() {

          @Override
          public void selectionChanged(SelectionChangedEvent event) {
            if (event.getSelection().isEmpty()) {
              return;
            }
            //				 if (event.getSelection() instanceof StructuredSelection) {
            //					 StructuredSelection ss = (StructuredSelection) event.getSelection();
            //					 System.out.println("StructuredSelection: " + ss);
            //					 Object selection = ss.getFirstElement();
            //					 System.out.println("Selection: " + selection);
            //					 ArrayList<EObject> eObjectList = new ArrayList<EObject>();
            //					 System.out.println("eObjectList: " + eObjectList);
            //					 if (selection instanceof EObject) {
            //						 String path = ((EObject)
            // selection).eResource().getURI().toPlatformString(false);
            //						 System.out.println("Path: " + path);
            //						 eObjectList.add((EObject) selection);
            //					 }
            //					 if (selection instanceof EObjectGroup) {
            //						 eObjectList.addAll(((EObjectGroup) selection).getEObjects());
            //					 }
            //					 System.out.println("eObjectList: " + eObjectList);
            //					 Object[] objects = eObjectList.toArray();
            //					 RuntimeManager.selectModelObjects(objects);
            //				 }
            IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
            IEditorPart editorPart = workbenchWindow.getActivePage().getActiveEditor();
            if (event.getSelection() instanceof IStructuredSelection) {
              //					 editorPart = openEditor((IStructuredSelection)event.getSelection());
              StructuredSelection ss = (StructuredSelection) event.getSelection();
              Object selection = ss.getFirstElement();
              //					 if (selection instanceof EObject || selection instanceof EObjectGroup) {
              doAdditionalHighlightings(selection);
              //					 }
            }
            if (editorPart != null && editorPart instanceof IViewerProvider) {
              setSelectionInModel(
                  (IViewerProvider) editorPart, (IStructuredSelection) event.getSelection());
              //						 ((IViewerProvider)editorPart).getViewer().setSelection(event.getSelection(),
              // true);
            }
          }

          private void setSelectionInModel(
              IViewerProvider provider, IStructuredSelection selection) {
            ArrayList<EObject> eObjectList = new ArrayList<EObject>();
            for (Object selectedObject : selection.toList()) {
              if (selectedObject instanceof EObjectGroup) {
                for (EObject currentEObject : ((EObjectGroup) selectedObject).getEObjects()) {
                  EObject modelInstanceObject = getModelObjectInstance(provider, currentEObject);
                  eObjectList.add(modelInstanceObject);
                }
                ((EObjectGroup) selectedObject).setEObjects(eObjectList);
              } else if (selectedObject instanceof EObject) {
                eObjectList.add(getModelObjectInstance(provider, (EObject) selectedObject));
              }
            }
            provider.getViewer().setSelection(new StructuredSelection(eObjectList));
            //				Object o = selection.getFirstElement();
            //				if(o instanceof EObject){
            //					Object input = provider.getViewer().getInput();
            //					provider.getViewer().setSelection(selection);
            //				}else if(o instanceof EObjectGroup){
            //					StructuredSelection s = new StructuredSelection(((EObjectGroup)o).getEObjects());
            //					provider.getViewer().setSelection(s);
            //				}

          }

          private EObject getModelObjectInstance(IViewerProvider provider, EObject eObject) {
            Viewer viewer = provider.getViewer();
            TreeViewer treeViewer = (TreeViewer) viewer;
            Tree tree = treeViewer.getTree();
            TreeItem treeItem = tree.getItem(0);
            Resource o = (Resource) treeItem.getData();
            ResourceSet set = o.getResourceSet();
            EObject ob = set.getEObject(EcoreUtil.getURI(eObject), true);
            //				String uri = o.getURIFragment(eObject);
            return ob;
            //				return o.getEObject(uri);
            //				EObject equalObject = o.getEObject(eObject.eResource().getURIFragment(eObject));
            //				return equalObject;

            //				if(provider instanceof IEditingDomainProvider){
            //					IEditingDomainProvider prov = (IEditingDomainProvider)provider;
            //					TreeIterator iterator =
            // prov.getEditingDomain().treeIterator(viewer.getCurrentRoot());
            //					while(iterator.hasNext()){
            //						Object itObj = iterator.next();
            //						if(itObj.equals(eObject)){
            //							return (EObject) itObj;
            //						}
            //					}
            //				}
            //				return eObject;
          }

          //			@SuppressWarnings("unchecked")
          //			private IEditorPart openEditor(IStructuredSelection selection){
          //				Object o = selection.getFirstElement();
          //				EObject obj = null;
          //				if(o instanceof EObject){
          //					obj = (EObject)o;
          //				}else if(o instanceof EObjectGroup){
          //					EObjectGroup group = (EObjectGroup)o;
          //					if(!group.getEObjects().isEmpty()){
          //						obj = group.getEObjects().getFirst();
          //					}
          //				}
          //				if(obj != null){
          ////					URI uri = obj.eResource().getURI();
          ////					String fileString = URI.decode(uri.path());
          ////					fileString = fileString.replaceFirst("/resource", "");
          ////					IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new
          // Path(fileString));
          ////					IWorkbench workbench = PlatformUI.getWorkbench();
          //					IFile file = ((LinkedList<ResultModel>)viewer.getInput()).get(0).getIFile();
          //					IWorkbenchWindow workbenchWindow=
          // PlatformUI.getWorkbench().getActiveWorkbenchWindow();
          //					IWorkbenchPage page = workbenchWindow.getActivePage();
          //					try {
          //						if(file.exists()){
          //							return IDE.openEditor(page, file);
          //						}
          //					}catch (PartInitException exception) {
          //						return null;
          //					}
          //				}
          //		        return null;
          //		     }
          //

        });
    RuntimeManager.setResultModelTreeViewer(viewer);
    LinkedList<ResultModel> result = RuntimeManager.getResultModels();
    if (result != null) {
      viewer.setInput(result);
    }
    makeActions();
    hookContextMenu();
    contributeToActionBars();
  }
 @Override
 public void setFocus() {
   viewer.getControl().setFocus();
 }