Bug 569548 - [PrivacyDesigner] add a view to see related requirements

Change-Id: Ibda243fd3ba823173bd04e2d8adba49dff581793
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/GDPRRequiementHelper.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/GDPRRequiementHelper.java
new file mode 100644
index 0000000..47bba3f
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/GDPRRequiementHelper.java
@@ -0,0 +1,40 @@
+package org.eclipse.papyrus.pdp4eng.req.profile.constraints;
+
+import java.util.Iterator;
+
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.Stereotype;
+
+public class GDPRRequiementHelper {
+	
+	public static boolean isGDPR_Requirement(Element element) {
+		
+		for (Iterator<Stereotype> iterator = element.getAppliedStereotypes().iterator(); iterator.hasNext();) {
+			Stereotype type = (Stereotype) iterator.next();
+			if(isGDPRRequirementStereotype(type)) {
+				return true;
+			}
+			
+		}
+		return false;
+	}
+
+	/**
+	 * test if the stereotype is a SysML Requirement Stereotype
+	 * @param stereotype a given stereotype
+	 * @return return true if this is a SysML stereotype or inherits directly or indirectly from requirement
+	 */
+	public static boolean isGDPRRequirementStereotype(Stereotype stereotype) {
+		if( "GDPRPrinciple".equals(stereotype.getName())){
+			return true;
+		}
+		for(org.eclipse.uml2.uml.Class superStereotype : stereotype.getSuperClasses()) {
+			if( superStereotype instanceof Stereotype){
+				if(isGDPRRequirementStereotype((Stereotype)superStereotype)){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java
index c1dede8..f84a6e0 100644
--- a/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.profile/src/org/eclipse/papyrus/pdp4eng/req/profile/constraints/TraceabilityIndexer.java
@@ -23,13 +23,17 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.papyrus.sysml14.requirements.Requirement;
 import org.eclipse.uml2.uml.DirectedRelationship;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.resource.UMLResource;
+import org.eclipse.uml2.uml.util.UMLUtil;
 
 public class TraceabilityIndexer {
 	private HashMap<Element,ArrayList<DirectedRelationship> > upwardTraceability= new HashMap<Element, ArrayList<DirectedRelationship>>();
 	private HashMap<Element,ArrayList<DirectedRelationship> > downwardTraceability= new HashMap<Element, ArrayList<DirectedRelationship>>();
+	private HashMap<Element,Element > ownerRequirement= new HashMap<Element, Element>();
+	private HashMap<Element,ArrayList<Element> > subRequirements= new HashMap<Element, ArrayList<Element>>();
 	private static TraceabilityIndexer instance=null;
 	public static TraceabilityIndexer getInstance() {
 		if( instance==null) {
@@ -43,14 +47,16 @@
 	public void loadTraceability(Element context) {
 		upwardTraceability.clear();
 		downwardTraceability.clear();
+		ownerRequirement.clear();
+		subRequirements.clear();
 		ResourceSet resourceSet=context.eResource().getResourceSet();
 		for(int i=0; i< resourceSet.getResources().size();i++) {
 			Resource resource = (Resource) resourceSet.getResources().get(i);
 			if( resource instanceof UMLResource) {
 				for (Iterator<EObject> iteratorObject = resource.getAllContents(); iteratorObject.hasNext();) {
-					EObject ownedElement = (EObject) iteratorObject.next();
-					if(ownedElement instanceof DirectedRelationship) {
-						DirectedRelationship directedRelationship= (DirectedRelationship)ownedElement;
+					EObject currentEobject = (EObject) iteratorObject.next();
+					if(currentEobject instanceof DirectedRelationship) {
+						DirectedRelationship directedRelationship= (DirectedRelationship)currentEobject;
 						for (Iterator<Element> iterator = directedRelationship.getSources().iterator(); iterator.hasNext();) {
 							Element currentSource = (Element) iterator.next();
 							if( upwardTraceability.get(currentSource)!=null) {
@@ -74,11 +80,30 @@
 							}
 						}
 					}
+
+					// add also Owner and composed Requirements
+					if( currentEobject instanceof org.eclipse.uml2.uml.Class) {
+						if(UMLUtil.getStereotypeApplication((org.eclipse.uml2.uml.Class)currentEobject, Requirement.class)!=null) {
+							org.eclipse.uml2.uml.Class currentReq=(org.eclipse.uml2.uml.Class)currentEobject;
+							if( currentReq.eContainer() instanceof org.eclipse.uml2.uml.Class) {
+								if(UMLUtil.getStereotypeApplication((org.eclipse.uml2.uml.Class)currentReq.eContainer(), Requirement.class)!=null) {
+									org.eclipse.uml2.uml.Class parentReq=(org.eclipse.uml2.uml.Class)currentReq.eContainer();
+									ownerRequirement.put(currentReq, (org.eclipse.uml2.uml.Class)currentEobject.eContainer());
+
+									if( subRequirements.get(parentReq)==null) {
+										ArrayList<Element> subElements= new ArrayList<Element>();
+										subRequirements.put(parentReq, subElements);
+									}
+									subRequirements.get(parentReq).add(currentReq);
+								}
+							}	
+						}
+					}
 				}
 			}
 		}
 	}
-	
+
 	public ArrayList<DirectedRelationship> getUpwardTraceabiltiy(Element context){
 		return upwardTraceability.get(context);
 	}
@@ -86,4 +111,11 @@
 	public ArrayList<DirectedRelationship> getDownwardTraceabiltiy(Element context){
 		return downwardTraceability.get(context);
 	}
+	public Element getParentRequirement(Element currentElement) {
+		return ownerRequirement.get(currentElement);
+	}
+	
+	public ArrayList<Element> getsubRequirements(Element currentElement) {
+		return subRequirements.get(currentElement);
+	}
 }
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF
index 8e8f087..87e6ba4 100644
--- a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/META-INF/MANIFEST.MF
@@ -14,7 +14,8 @@
  org.eclipse.papyrus.pdp4eng.req.gdprananalysis;bundle-version="[1.0.0,2.0.0)",
  org.eclipse.ui.workbench;bundle-version="[3.119.0,4.0.0)",
  org.eclipse.papyrus.infra.gmfdiag.css;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.papyrus.pdp4eng.req.profile
+ org.eclipse.papyrus.pdp4eng.req.profile;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.papyrus.sysml14;bundle-version="[1.3.0,2.0.0)"
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.papyrus.pdp4eng.req.ui
 Bundle-Activator: org.eclipse.papyrus.pdp4eng.req.ui.Activator
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml
index 0795287..279f196 100644
--- a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/plugin.xml
@@ -84,6 +84,18 @@
           stylesheetPath="styles/RequirementsModel.css">
     </stylesheet>
  </extension>
+  <extension
+         point="org.eclipse.ui.views">
+      <view
+            allowMultiple="false"
+            category="org.eclipse.papyrus.views.category"
+            class="org.eclipse.papyrus.pdp4eng.req.ui.view.RequirementView"
+            icon="icons/working.png"
+            id="org.eclipse.papyrus.pdp4eng.req.ui.RequirementView"
+            name="Requirements View"
+            restorable="true">
+      </view>
+   </extension>
 
 </plugin>
    
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementAction.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementAction.java
new file mode 100644
index 0000000..d0b0f30
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementAction.java
@@ -0,0 +1,47 @@
+/**
+ *  Copyright (c)2020 CEA LIST, Committer Name, and others.
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License 2.0
+ *  which accompanies this distribution, and is available at
+ *  https://www.eclipse.org/legal/epl-2.0/
+ *
+ *  SPDX-License-Identifier: EPL-2.0
+ *
+ *  Contributors:
+ *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr   - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+
+/** this class is used to display as a menu if the stereotype shall filtered **/
+
+public class RequirementAction extends Action {
+
+	private Class<?> stereotype;
+	ArrayList<Class<?>> steretotypeFilter;
+
+	public RequirementAction(Class<?> stereotype, ArrayList<Class<?>> steretotypeFilter) {
+		super(stereotype.getSimpleName(), IAction.AS_CHECK_BOX);
+		this.setChecked(true);
+		this.stereotype = stereotype;
+		this.steretotypeFilter = steretotypeFilter;
+	}
+
+	@Override
+	public void run() {
+		if (this.isChecked()) {
+			if (!steretotypeFilter.contains(stereotype)) {
+				steretotypeFilter.add(stereotype);
+			}
+		} else {
+			steretotypeFilter.remove(stereotype);
+		}
+		System.out.println(steretotypeFilter);
+	}
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementView.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementView.java
new file mode 100644
index 0000000..291e447
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/RequirementView.java
@@ -0,0 +1,227 @@
+/**
+ *  Copyright (c)2020 CEA LIST, Committer Name, and others.
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License 2.0
+ *  which accompanies this distribution, and is available at
+ *  https://www.eclipse.org/legal/epl-2.0/
+ *
+ *  SPDX-License-Identifier: EPL-2.0
+ *
+ *  Contributors:
+ *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr   - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.papyrus.infra.ui.editor.IMultiDiagramEditor;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Accuracy;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.DataMinimisation;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Fairly;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Lawful;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByConsent;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByContract;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByLegalObligation;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByPublicInterest;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.LawfulByVitalInterest;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.PurposeLimitation;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.SecuritySafety;
+import org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.StorageLimitation;
+import org.eclipse.papyrus.sysml14.requirements.Requirement;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+
+/**
+ * This class is the requirements view that displays requirements that are associated to the selected element.
+ *
+ */
+public class RequirementView extends ViewPart implements ITabbedPropertySheetPageContributor {
+
+	private TreeViewer viewer;
+	// list of stereotype to filter
+	private ArrayList<Class<?>> steretotypeFilter = new ArrayList<>();
+	private List<IPropertySheetPage> propertySheetPages = new ArrayList<>();
+
+	private static FontData[] getModifiedFontData(FontData[] originalData, int additionalStyle) {
+		FontData[] styleData = new FontData[originalData.length];
+		for (int i = 0; i < styleData.length; i++) {
+			FontData base = originalData[i];
+			styleData[i] = new FontData(base.getName(), base.getHeight(), base.getStyle() | additionalStyle);
+		}
+		return styleData;
+	}
+
+	public RequirementView() {
+		steretotypeFilter.add(Requirement.class);
+		steretotypeFilter.add(Lawful.class);
+		steretotypeFilter.add(LawfulByConsent.class);
+		steretotypeFilter.add(LawfulByContract.class);
+		steretotypeFilter.add(LawfulByLegalObligation.class);
+		steretotypeFilter.add(LawfulByPublicInterest.class);
+		steretotypeFilter.add(LawfulByVitalInterest.class);
+		steretotypeFilter.add(Fairly.class);
+		steretotypeFilter.add(org.eclipse.papyrus.pdp4eng.req.profile.pdp4engReqGDPR.Transparency.class);
+		steretotypeFilter.add(Accuracy.class);
+		steretotypeFilter.add(DataMinimisation.class);
+		steretotypeFilter.add(PurposeLimitation.class);
+		steretotypeFilter.add(StorageLimitation.class);
+		steretotypeFilter.add(SecuritySafety.class);
+
+
+	}
+
+	/**
+	 * create action in the view in order to filter stereotypes
+	 */
+	public void createActions() {
+		IMenuManager mainMenu = getViewSite().getActionBars().getMenuManager();
+		MenuManager GDPRmenu = new MenuManager("GDPR requirement", "GDPR.requirement.menu"); //$NON-NLS-1$ //$NON-NLS-2$
+		for (int i = 0; i < steretotypeFilter.size(); i++) {
+			GDPRmenu.add(new RequirementAction(steretotypeFilter.get(i), steretotypeFilter));
+			mainMenu.add(GDPRmenu);
+		}
+	}
+
+
+
+	@Override
+	public void createPartControl(Composite parent) {
+		viewer = new TreeViewer(parent, SWT.MULTI | SWT.FULL_SELECTION);
+		viewer.setContentProvider(new ReviewsTreeContentProvider(steretotypeFilter));
+
+		// useful for the label provider
+		FontData[] boldFontData = getModifiedFontData(viewer.getTree().getFont().getFontData(), SWT.BOLD);
+		FontData[] italicFontData = getModifiedFontData(viewer.getTree().getFont().getFontData(), SWT.ITALIC);
+		Font boldFont = new Font(Display.getCurrent(), boldFontData);
+		Font italicFont = new Font(Display.getCurrent(), italicFontData);
+		// set label provider
+		viewer.setLabelProvider(new ReviewsTreeLabelProvider(boldFont, italicFont));
+		createActions();
+
+		Listener paintListener = makeTreeItemMultiline();
+		viewer.getTree().addListener(SWT.MeasureItem, paintListener);
+		viewer.getTree().addListener(SWT.EraseItem, paintListener);
+
+		// used to synchronize the selection on this view
+		getSite().setSelectionProvider(viewer);
+		ISelectionListener mylistener = new ISelectionListener() {
+			@Override
+			public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection) {
+				if (sourcepart != RequirementView.this && selection instanceof IStructuredSelection) {
+					viewer.setInput(((IStructuredSelection) selection).getFirstElement());
+				}
+			}
+		};
+		getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(mylistener);
+
+	}
+
+	private Listener makeTreeItemMultiline() {
+		// this code comes from eclipse in oder to display multi line in a tree
+		Listener paintListener = new Listener() {
+			@Override
+			public void handleEvent(Event event) {
+				switch (event.type) {
+				case SWT.MeasureItem: {
+					TreeItem item = (TreeItem) event.item;
+					String text = item.getText();
+					Point size = event.gc.textExtent(text);
+					event.width = size.x + 20;
+					event.height = Math.max(event.height, size.y);
+					break;
+				}
+				case SWT.PaintItem: {
+					TreeItem item = (TreeItem) event.item;
+					String text = item.getText();
+					Point size = event.gc.textExtent(text);
+					int offset2 = event.index == 0 ? Math.max(0, (event.height - size.y) / 2) : 0;
+					event.gc.drawText(text, event.x, event.y + offset2, true);
+					break;
+				}
+				case SWT.EraseItem: {
+					event.detail &= ~SWT.FOREGROUND;
+					break;
+				}
+				}
+			}
+		};
+		return paintListener;
+	}
+
+	@Override
+	public String getContributorId() {
+		return "org.eclipse.papyrus.pdp4eng.req.ui.RequirementView"; //$NON-NLS-1$
+	}
+
+	@Override
+	public void setFocus() {
+	}
+
+	@Override
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	public Object getAdapter(Class adapter) {
+		if ((IPropertySheetPage.class.equals(adapter))) {
+			return getPropertySheetPage();
+		}
+
+		else {
+			return super.getAdapter(adapter);
+		}
+	}
+
+	/**
+	 * Retrieves the {@link IPropertySheetPage} that his Model Explorer uses.
+	 *
+	 * @return
+	 */
+	private IPropertySheetPage getPropertySheetPage() {
+		IWorkbenchPart part = null;
+		try {
+			IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+			if (activeWorkbenchWindow != null) {
+				IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
+				if (activePage != null) {
+					part = activePage.getActiveEditor();
+				}
+			}
+		} catch (NullPointerException e) {
+			// An element is not active yet
+			return null;
+		}
+
+
+		if (part instanceof IMultiDiagramEditor) {
+			if (part instanceof ITabbedPropertySheetPageContributor) {
+				ITabbedPropertySheetPageContributor contributor = (ITabbedPropertySheetPageContributor) part;
+				IPropertySheetPage propertySheetPage = new TabbedPropertySheetPage(contributor);
+				this.propertySheetPages.add(propertySheetPage);
+				return propertySheetPage;
+			}
+		}
+		return null;
+	}
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeContentProvider.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeContentProvider.java
new file mode 100644
index 0000000..a31c46f
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeContentProvider.java
@@ -0,0 +1,133 @@
+/**
+ *  Copyright (c)2020 CEA LIST, Committer Name, and others.
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License 2.0
+ *  which accompanies this distribution, and is available at
+ *  https://www.eclipse.org/legal/epl-2.0/
+ *
+ *  SPDX-License-Identifier: EPL-2.0
+ *
+ *  Contributors:
+ *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr   - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.pdp4eng.req.profile.constraints.TraceabilityIndexer;
+import org.eclipse.uml2.uml.DirectedRelationship;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.util.UMLUtil;
+
+/**
+ * This is the content provider to display reviews in the review editor
+ *
+ */
+public class ReviewsTreeContentProvider implements ITreeContentProvider {
+
+	private static Object[] EMPTY = {};
+	private ArrayList<Class<?>> stereotypeFilter;
+
+	public ReviewsTreeContentProvider(ArrayList<Class<?>> stereotypeFilter) {
+		this.stereotypeFilter = stereotypeFilter;
+	}
+
+	@Override
+	public void dispose() {
+
+	}
+
+	@Override
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+	}
+
+	@Override
+	public Object[] getElements(Object inputElement) {
+
+		EObject eobject = EMFHelper.getEObject(inputElement);
+
+		if (eobject instanceof Element) {
+			TraceabilityIndexer.getInstance().loadTraceability((Element) eobject);
+			ArrayList<Element> result = new ArrayList<>();
+			if (TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) eobject) != null) {
+
+				ArrayList<DirectedRelationship> links = TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) eobject);
+				for (Iterator<DirectedRelationship> iterator = links.iterator(); iterator.hasNext();) {
+					DirectedRelationship directedRelationship = iterator.next();
+					result.addAll(directedRelationship.getTargets());
+				}
+			}
+			if (TraceabilityIndexer.getInstance().getParentRequirement((Element) eobject) != null) {
+				result.add(TraceabilityIndexer.getInstance().getParentRequirement((Element) eobject));
+			}
+			// return result.toArray();
+			return filter(result).toArray();
+
+		}
+
+		return EMPTY;
+	}
+
+	@Override
+	public Object[] getChildren(Object parentElement) {
+		return computeChildreen(parentElement);
+	}
+
+	private Object[] computeChildreen(Object parentElement) {
+		ArrayList<Element> result = new ArrayList<>();
+		if (parentElement instanceof Element) {
+			if (TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) parentElement) != null) {
+				ArrayList<DirectedRelationship> links = TraceabilityIndexer.getInstance().getUpwardTraceabiltiy((Element) parentElement);
+				for (Iterator<DirectedRelationship> iterator = links.iterator(); iterator.hasNext();) {
+					DirectedRelationship directedRelationship = iterator.next();
+					result.addAll(directedRelationship.getTargets());
+
+				}
+			}
+			if (TraceabilityIndexer.getInstance().getParentRequirement((Element) parentElement) != null) {
+				result.add(TraceabilityIndexer.getInstance().getParentRequirement((Element) parentElement));
+			}
+		}
+		// return result.toArray();
+		return filter(result).toArray();
+	}
+
+	@Override
+	public Object getParent(Object element) {
+		return null;
+	}
+
+	@Override
+	public boolean hasChildren(Object element) {
+
+		return computeChildreen(element).length > 0;
+	}
+
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	protected HashSet<Element> filter(Collection<Element> collection) {
+		HashSet<Element> result = new HashSet<>();
+		for (Iterator<Element> iterElement = collection.iterator(); iterElement.hasNext();) {
+			Element currentElement = iterElement.next();
+			for (Iterator<Class<?>> iterator = stereotypeFilter.iterator(); iterator.hasNext();) {
+				Class<?> stereoClass = iterator.next();
+				if (UMLUtil.getStereotypeApplication(currentElement, (Class) stereoClass) != null) {
+					result.add(currentElement);
+				}
+
+			}
+
+		}
+		return result;
+	}
+
+}
diff --git a/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeLabelProvider.java b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeLabelProvider.java
new file mode 100644
index 0000000..6bb7ef4
--- /dev/null
+++ b/plugins/req/org.eclipse.papyrus.pdp4eng.req.ui/src/org/eclipse/papyrus/pdp4eng/req/ui/view/ReviewsTreeLabelProvider.java
@@ -0,0 +1,106 @@
+/**
+ *  Copyright (c)2020 CEA LIST, Committer Name, and others.
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License 2.0
+ *  which accompanies this distribution, and is available at
+ *  https://www.eclipse.org/legal/epl-2.0/
+ *
+ *  SPDX-License-Identifier: EPL-2.0
+ *
+ *  Contributors:
+ *  Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr   - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.pdp4eng.req.ui.view;
+
+import org.eclipse.jface.viewers.StyledCellLabelProvider;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.StyledString.Styler;
+import org.eclipse.jface.viewers.ViewerCell;
+import org.eclipse.papyrus.pdp4eng.req.profile.constraints.GDPRRequiementHelper;
+import org.eclipse.papyrus.sysml14.requirements.Requirement;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.TextStyle;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.util.UMLUtil;
+
+/**
+ *
+ * This is the label provider to display requirements in the view
+ */
+public class ReviewsTreeLabelProvider extends StyledCellLabelProvider {
+	protected Font italicFont;
+	protected Font boldFont;
+	private Styler fBoldStyler;
+	private Styler fItalicStyler;
+
+	/**
+	 * constructor
+	 *
+	 * @param boldFont
+	 * @param italicFont
+	 */
+	public ReviewsTreeLabelProvider(final Font boldFont, final Font italicFont) {
+		this.boldFont = boldFont;
+		this.italicFont = italicFont;
+		// Multi-font support only works in JFace 3.5 and above (specifically, 3.5 M4 and above).
+		// With JFace 3.4, the font information (bold in this example) will be ignored.
+
+		fBoldStyler = new Styler() {
+
+			@Override
+			public void applyStyles(TextStyle textStyle) {
+				textStyle.font = boldFont;
+
+			}
+		};
+		fItalicStyler = new Styler() {
+
+			@Override
+			public void applyStyles(TextStyle textStyle) {
+				textStyle.font = italicFont;
+
+			}
+		};
+	}
+
+
+	/**
+	 * update visual appearance of a cell
+	 */
+	@Override
+	public void update(ViewerCell cell) {
+		Object obj = cell.getElement();
+
+		if (obj instanceof org.eclipse.uml2.uml.NamedElement) {
+			NamedElement namedElement = (NamedElement) obj;
+			StyledString styledString = new StyledString(""); //$NON-NLS-1$
+			// if no name
+			if (((org.eclipse.uml2.uml.NamedElement) obj).getName() == null) {
+				styledString.append("###"); //$NON-NLS-1$
+
+			} else {
+				// it has a name
+				styledString.append(((org.eclipse.uml2.uml.NamedElement) obj).getName() + ": ", fBoldStyler); //$NON-NLS-1$
+				Requirement reqStereotypeAppli = UMLUtil.getStereotypeApplication(namedElement, Requirement.class);
+				// this is a stereotype
+				if (reqStereotypeAppli != null) {
+					styledString.append(reqStereotypeAppli.getText(), fItalicStyler);
+				}
+			}
+
+			cell.setBackground(new Color(Display.getCurrent(), 255, 255, 200));
+			cell.setText(styledString.toString());
+			cell.setStyleRanges(styledString.getStyleRanges());
+			// this is a GDPR requirement
+			if (GDPRRequiementHelper.isGDPR_Requirement(namedElement)) {
+				cell.setBackground(new Color(Display.getCurrent(), 51, 204, 255));
+			}
+		}
+		super.update(cell);
+	}
+
+}