PropertiesTester fix: fixed inf. loop when creating a trace
Fix desc.: Now extracting the info about the current Office-view
contents from a SourceProvider and not from the Office view itself.

Change-Id: I547ec623bbb58d1a0aaf7177298032b55eceb88b
Signed-off-by: Dusan Kalanj <kalanj@chalmers.se>
diff --git a/org.eclipse.capra.ui.office/plugin.xml b/org.eclipse.capra.ui.office/plugin.xml
index ab76405..f88463a 100644
--- a/org.eclipse.capra.ui.office/plugin.xml
+++ b/org.eclipse.capra.ui.office/plugin.xml
@@ -65,16 +65,6 @@
       </handler>
    </extension>
    <extension
-         point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester 
-            class="org.eclipse.capra.ui.office.utils.OfficePropertyTester"
-            id="org.eclipse.capra.ui.office.utils.OfficePropertyTester"
-            namespace="org.eclipse.capra.ui.office.utils"
-            properties="isViewEmpty, isExcelObject"
-            type="java.lang.Object">
-      </propertyTester>
-   </extension>
-   <extension
          point="org.eclipse.ui.menus">
       <menuContribution
             locationURI="menu:org.eclipse.capra.ui.views.OfficeView?after=additions"> 
@@ -90,11 +80,9 @@
                style="push"
                tooltip="Select which sheet in the Excel workbook to display">
             <visibleWhen>
-               <test
-                     forcePluginActivation="true"
-                     property="org.eclipse.capra.ui.office.utils.isExcelObject">
-               </test>
-            </visibleWhen>
+    		   <reference
+    		   	   definitionId="org.eclipse.capra.ui.office.utils.isExcelObjectExpression"/>
+			</visibleWhen>
          </command>
          <command
                commandId="org.eclipse.capra.ui.office.clearselection"
@@ -102,11 +90,9 @@
                style="push"
                tooltip="Clears the current selection of elements">
             <visibleWhen>
-               <test
-                     forcePluginActivation="true"
-                     property="org.eclipse.capra.ui.office.utils.isViewEmpty">
-               </test>
-            </visibleWhen>
+    		   <reference
+    		   	   definitionId="org.eclipse.capra.ui.office.utils.isViewPopulatedExpression"/>
+			</visibleWhen>
          </command>
       </menuContribution>
       <menuContribution
@@ -149,4 +135,50 @@
             class="org.eclipse.capra.ui.office.preferences.PreferenceInitializer">
       </initializer>
    </extension>
+   <extension
+         point="org.eclipse.core.expressions.propertyTesters">
+      <propertyTester
+            class="org.eclipse.capra.ui.office.utils.OfficePropertyTester"
+            id="org.eclipse.capra.ui.office.utils.OfficePropertyTester"
+            namespace="org.eclipse.capra.ui.office.utils"
+            properties="isViewPopulated, isExcelObject"
+            type="org.eclipse.capra.ui.office.objects.CapraOfficeObject">
+      </propertyTester>
+   </extension>
+   <extension
+         point="org.eclipse.ui.services">
+      <sourceProvider
+            provider="org.eclipse.capra.ui.office.utils.OfficeSourceProvider">
+         <variable
+               name="org.eclipse.capra.ui.office.utils.capraOfficeObject"
+               priorityLevel="workbench">
+         </variable>
+      </sourceProvider>
+   </extension>
+   <extension
+         point="org.eclipse.core.expressions.definitions">
+      <definition
+            id="org.eclipse.capra.ui.office.utils.isViewPopulatedExpression">
+         <with
+               variable="org.eclipse.capra.ui.office.utils.capraOfficeObject">
+            <test
+                  forcePluginActivation="true"
+                  property="org.eclipse.capra.ui.office.utils.isViewPopulated">
+            </test>
+         </with>
+      </definition>
+   </extension>
+   <extension
+         point="org.eclipse.core.expressions.definitions">
+      <definition
+            id="org.eclipse.capra.ui.office.utils.isExcelObjectExpression">
+         <with
+               variable="org.eclipse.capra.ui.office.utils.capraOfficeObject">
+            <test
+                  forcePluginActivation="true"
+                  property="org.eclipse.capra.ui.office.utils.isExcelObject">
+            </test>
+         </with>
+      </definition>
+   </extension>
 </plugin>
diff --git a/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/utils/OfficePropertyTester.java b/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/utils/OfficePropertyTester.java
index 6846ee2..9b471fc 100644
--- a/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/utils/OfficePropertyTester.java
+++ b/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/utils/OfficePropertyTester.java
@@ -12,7 +12,6 @@
 package org.eclipse.capra.ui.office.utils;
 
 import org.eclipse.capra.ui.office.objects.CapraExcelRow;
-import org.eclipse.capra.ui.office.views.OfficeView;
 import org.eclipse.core.expressions.PropertyTester;
 
 /**
@@ -25,28 +24,17 @@
  */
 public class OfficePropertyTester extends PropertyTester {
 
-	private static final String IS_VIEW_EMPTY = "isViewEmpty";
+	private static final String IS_VIEW_POPULATED = "isViewPopulated";
 	private static final String IS_EXCEL_OBJECT = "isExcelObject";
 
 	@Override
 	public boolean test(final Object receiver, final String property, final Object[] args, final Object expectedValue) {
 
-		// Triggers when a test is called to check whether the Office view is
-		// empty or not.
-		if (property.equals(IS_VIEW_EMPTY))
-			if (OfficeView.getOpenedView().getSelection().isEmpty())
-				return false;
-			else
-				return true;
+		if (property.equals(IS_VIEW_POPULATED))
+			return receiver != null;
 
-		// Triggers when a test is called to check if the objects in the Office
-		// view represent Excel rows.
 		if (property.equals(IS_EXCEL_OBJECT))
-			if (!OfficeView.getOpenedView().getSelection().isEmpty()
-					&& OfficeView.getOpenedView().getSelection().get(0) instanceof CapraExcelRow)
-				return true;
-			else
-				return false;
+			return receiver instanceof CapraExcelRow;
 
 		return false;
 	}
diff --git a/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/utils/OfficeSourceProvider.java b/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/utils/OfficeSourceProvider.java
new file mode 100644
index 0000000..05911dc
--- /dev/null
+++ b/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/utils/OfficeSourceProvider.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Chalmers | University of Gothenburg, rt-labs and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * 	   Chalmers | University of Gothenburg and rt-labs - initial API and implementation and/or initial documentation
+ *******************************************************************************/
+
+package org.eclipse.capra.ui.office.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.capra.ui.office.objects.CapraOfficeObject;
+import org.eclipse.ui.AbstractSourceProvider;
+import org.eclipse.ui.ISources;
+
+/**
+ * This class provides the plugin with information about the contents of the
+ * Office view. It does that by providing a sample object from the view, from
+ * which the following useful information can be deducted: if view is populated
+ * (object is null if it is empty); the type of the objects in the view; the
+ * file-path of the file that was used to extract the objects.
+ *
+ * @author Dusan Kalanj
+ *
+ */
+public class OfficeSourceProvider extends AbstractSourceProvider {
+
+	/**
+	 * The ID of the variable that corresponds to the one in the plugin.xml and
+	 * is used to identify the resource that is being held by the class.
+	 */
+	public static final String CAPRA_OFFICE_OBJECT = "org.eclipse.capra.ui.office.utils.capraOfficeObject";
+
+	private CapraOfficeObject capraOfficeObject = null;
+
+	@Override
+	public void dispose() {
+	}
+
+	/**
+	 * Sets the resource (an instance of CapraOfficeObject).
+	 * 
+	 * @param capraOfficeObject
+	 */
+	public void setResource(CapraOfficeObject capraOfficeObject) {
+		this.capraOfficeObject = capraOfficeObject;
+		fireSourceChanged(ISources.WORKBENCH, CAPRA_OFFICE_OBJECT, this.capraOfficeObject);
+	}
+
+	@Override
+	public Map<String, CapraOfficeObject> getCurrentState() {
+		HashMap<String, CapraOfficeObject> map = new HashMap<String, CapraOfficeObject>();
+		map.put(CAPRA_OFFICE_OBJECT, capraOfficeObject);
+		return map;
+	}
+
+	@Override
+	public String[] getProvidedSourceNames() {
+		return new String[] { CAPRA_OFFICE_OBJECT };
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/views/OfficeView.java b/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/views/OfficeView.java
index 217aa07..69421ae 100644
--- a/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/views/OfficeView.java
+++ b/org.eclipse.capra.ui.office/src/org/eclipse/capra/ui/office/views/OfficeView.java
@@ -27,6 +27,7 @@
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 import org.apache.xmlbeans.SchemaTypeLoaderException;
 import org.eclipse.capra.ui.office.Activator;
+import org.eclipse.capra.ui.office.utils.OfficeSourceProvider;
 import org.eclipse.capra.ui.office.exceptions.CapraOfficeFileNotSupportedException;
 import org.eclipse.capra.ui.office.exceptions.CapraOfficeObjectNotFound;
 import org.eclipse.capra.ui.office.objects.CapraExcelRow;
@@ -66,6 +67,7 @@
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.services.ISourceProviderService;
 
 import com.google.common.io.Files;
 
@@ -114,6 +116,12 @@
 	private List<CapraOfficeObject> selection = new ArrayList<CapraOfficeObject>();
 
 	/**
+	 * Instance of OfficeSourceProvider (used for hiding context menu options)
+	 */
+	private OfficeSourceProvider provider = (OfficeSourceProvider) ((ISourceProviderService) PlatformUI.getWorkbench()
+			.getService(ISourceProviderService.class)).getSourceProvider(OfficeSourceProvider.CAPRA_OFFICE_OBJECT);
+	
+	/**
 	 * The content provider class used by the view.
 	 */
 	class ViewContentProvider implements IStructuredContentProvider {
@@ -364,6 +372,9 @@
 					selection.add(cRow);
 			}
 		}
+		
+		if (!selection.isEmpty())
+			provider.setResource(selection.get(0));
 	}
 
 	/**
@@ -399,6 +410,9 @@
 					selection.add(cRequirement);
 			}
 		}
+		
+		if (!selection.isEmpty())
+			provider.setResource(selection.get(0));
 	}
 
 	/**
@@ -447,6 +461,7 @@
 	public void clearSelection() {
 		selection.clear();
 		viewer.refresh();
+		provider.setResource(null);
 	}
 
 	/**