From b0f4f094001f18c9e7810804143390e76321523c Mon Sep 17 00:00:00 2001
From: blaakmeer <sdos@astron.nl>
Date: Thu, 28 Sep 2006 10:26:12 +0000
Subject: [PATCH] BugID: 752 Implemented special case handling of __childDp
 element of the Station type Along the way, added support for multi-rooted
 trees, otherwise we could only view one station with the navigator.

---
 MAC/Navigator/panels/nav_fw/navigator.pnl     |   3 +-
 .../objects/nav_fw/navigator_config_tab.pnl   |   1 -
 .../scripts/libs/nav_fw/fwTreeView.ctl        |  34 ++--
 .../nav_fw/gcfnav-configuration-functions.ctl |  35 +++-
 .../scripts/libs/nav_fw/gcfnav-functions.ctl  | 174 +++++++++++-------
 .../libs/nav_fw/gcfnav-tab-functions.ctl      |   4 +-
 6 files changed, 168 insertions(+), 83 deletions(-)

diff --git a/MAC/Navigator/panels/nav_fw/navigator.pnl b/MAC/Navigator/panels/nav_fw/navigator.pnl
index bce65a175e0..0e14dd06fca 100644
--- a/MAC/Navigator/panels/nav_fw/navigator.pnl
+++ b/MAC/Navigator/panels/nav_fw/navigator.pnl
@@ -5,7 +5,8 @@ PANEL,391 228 1272 960 N "_3DFace" 0
 "main()
 {
   gcfStartFollowDistSystems();
-  navConfigCheckResourceRoots();
+  // waar slaat dit in hemelsnaam op? Ik wil met de Navigator toch ook remote systemen kunnen bekijken?
+  // navConfigCheckResourceRoots();
   Navigator_HandleEventInitialize();
   navConfigInitPathNames();
 }
diff --git a/MAC/Navigator/panels/objects/nav_fw/navigator_config_tab.pnl b/MAC/Navigator/panels/objects/nav_fw/navigator_config_tab.pnl
index 759a7bbd892..d803ff6145d 100644
--- a/MAC/Navigator/panels/objects/nav_fw/navigator_config_tab.pnl
+++ b/MAC/Navigator/panels/objects/nav_fw/navigator_config_tab.pnl
@@ -14,7 +14,6 @@ PANEL,299 108 946 43 N "_3DFace" 4
   {
 	  viewConfigDpName = \"__nav_default_viewconfig\";
 	}
-  DebugN(\"viewConfigDpName:\"+viewConfigDpName);
   if(dpAccessable(viewConfigDpName))
   {
     dpGet(viewConfigDpName + \".nrOfSubViews\",nrOfSubViews);
diff --git a/MAC/Navigator/scripts/libs/nav_fw/fwTreeView.ctl b/MAC/Navigator/scripts/libs/nav_fw/fwTreeView.ctl
index 47b19f340a0..900c976dbe8 100644
--- a/MAC/Navigator/scripts/libs/nav_fw/fwTreeView.ctl
+++ b/MAC/Navigator/scripts/libs/nav_fw/fwTreeView.ctl
@@ -228,7 +228,12 @@ unsigned fwTreeView_appendToParentNode(unsigned parentIndex, string name, anytyp
   
   //DebugTN("in fwTreeView_appendToParentNode:", parentIndex,name, value, handle, level);
   //DebugTN("name:" + name + " |value:" + value + " |handle:" + handle + " |level:"+ level);
-  if(parentIndex <= 1 || parentIndex > fwTreeView_getNodeCount(referenceName))
+//
+//  Removed the check for parentIndex <= 1 because the tree can have more than one root  
+//  if(parentIndex <= 1 || parentIndex > fwTreeView_getNodeCount(referenceName))
+//
+  parentNode = fwTreeView_getNode(parentIndex, referenceName);
+  if(parentIndex > fwTreeView_getNodeCount(referenceName) || dynlen(parentNode) < 5)
   { // simply append it to the tree, because the parent is the root or undefined
     fwTreeView_appendNode(name,value,handle,level,referenceName);
     nodeId = fwTreeView_getNodeCount(referenceName);
@@ -237,7 +242,6 @@ unsigned fwTreeView_appendToParentNode(unsigned parentIndex, string name, anytyp
   else
   {
     // check the requested level against the the level of the parent
-    parentNode = fwTreeView_getNode(parentIndex, referenceName);
     if(level != (parentNode[fwTreeView_LEVEL] + 1))
     { // append node because parent is not exactly one level higher than the level of the node.
       fwTreeView_appendNode(name,value,handle,level,referenceName);
@@ -247,17 +251,17 @@ unsigned fwTreeView_appendToParentNode(unsigned parentIndex, string name, anytyp
     else
     {
       // insert the node after the last direct child of the parent
-	  //DebugTN("____________________________________");
+      //DebugTN("____________________________________");
       int i=1;
 
-	  if (g_parentIndex==parentIndex)
-	  {
-		  g_nodeID = g_nodeID + 1;
-		  i = g_nodeID;
-		  //DebugTN("##____skip_while_loop_____##");
-	  }
-	  else
-	  {
+  	  if (g_parentIndex==parentIndex)
+  	  {
+  		  g_nodeID = g_nodeID + 1;
+  		  i = g_nodeID;
+  		  //DebugTN("##____skip_while_loop_____##");
+  	  }
+  	  else
+  	  {
         if(parentIndex+i <= fwTreeView_getNodeCount(referenceName))
         {       
           testNode = fwTreeView_getNode(parentIndex+i,referenceName);
@@ -272,11 +276,11 @@ unsigned fwTreeView_appendToParentNode(unsigned parentIndex, string name, anytyp
             }
           }
         }
-      g_nodeID = i;
+        g_nodeID = i;
       }
-    fwTreeView_insertTreeNode(parentIndex+i,name,value,handle,level,referenceName);
-	  nodeId = parentIndex+i;
-	  g_parentIndex = parentIndex;
+      fwTreeView_insertTreeNode(parentIndex+i,name,value,handle,level,referenceName);
+  	  nodeId = parentIndex+i;
+  	  g_parentIndex = parentIndex;
     }
   }
 
diff --git a/MAC/Navigator/scripts/libs/nav_fw/gcfnav-configuration-functions.ctl b/MAC/Navigator/scripts/libs/nav_fw/gcfnav-configuration-functions.ctl
index 271759955a2..3d6706213f2 100644
--- a/MAC/Navigator/scripts/libs/nav_fw/gcfnav-configuration-functions.ctl
+++ b/MAC/Navigator/scripts/libs/nav_fw/gcfnav-configuration-functions.ctl
@@ -418,18 +418,49 @@ dyn_string navConfigGetResources(string parentDatapoint, int depth)
   int maxDepth;
   bool parentDatapointIsReference;
   checkForReference(parentDatapoint, reference, parentDatapointIsReference);
+  
   if (parentDatapoint == "")
   {
+    // An empty parentdatapoint indicates that the navigator is starting up
+    // The roots are read from the Navigator configuration
     maxDepth = depth;
     // read the roots from the configuration
     dpGet(DPNAME_NAVIGATOR + "." + ELNAME_RESOURCEROOTS, resourceRoots);
     err = getLastError();
     if (dynlen(err) > 0)
     {
-      // if nothing specified, take the local PIC and PAC trees
-      resourceRoots = makeDynString("PIC", "PAC");
+      // if nothing specified, take the local LOFAR tree
+      resourceRoots = makeDynString("LOFAR");
     }  
   }
+  else if(strpos(parentDatapoint, ":") < 0)
+  {
+    // if the parent datapoint does not contain the system separator ':' then
+    // it must be a root datapoint
+    LOG_DEBUG("parent is root",parentDatapoint);
+    
+    maxDepth = depth;
+    // read the roots from the configuration
+    dpGet(DPNAME_NAVIGATOR + "." + ELNAME_RESOURCEROOTS, resourceRoots);
+    // now only use the resource roots of the requested parent
+    if (dynlen(resourceRoots) > 0)
+    {
+      int i=1;
+      while(i <= dynlen(resourceRoots))
+      {
+        if(strpos(resourceRoots[i],parentDatapoint) == 0)
+        {
+          // yup, this resource must stay
+          i++;
+        }
+        else
+        {
+          // nope, we don't need this resource at this moment
+          dynRemove(resourceRoots,i);
+        }
+      }
+    }
+  }
   else
   {
     dyn_string dpPathElements = strsplit(parentDatapoint, "_");
diff --git a/MAC/Navigator/scripts/libs/nav_fw/gcfnav-functions.ctl b/MAC/Navigator/scripts/libs/nav_fw/gcfnav-functions.ctl
index add4c9ad563..9c8c5c1ca7a 100644
--- a/MAC/Navigator/scripts/libs/nav_fw/gcfnav-functions.ctl
+++ b/MAC/Navigator/scripts/libs/nav_fw/gcfnav-functions.ctl
@@ -102,33 +102,36 @@ void changeSelectedPosition(string newDatapoint)
   int i;
   long nodeID;
   dyn_string datapointPath = splitDatapointPath(newDatapoint);
-  string systemName = substr(getSystemName(getSystemId()), 0, (strlen(getSystemName(getSystemId())) - 1));
-  if (g_datapoint == systemName)
-  {
-    TreeView_OnExpand(1);
-  }
+  LOG_DEBUG("changeSelectedPostion> changing selection to :",newDatapoint);
+  string systemName = strrtrim(dpSubStr(newDatapoint, DPSUB_SYS), ":");
+//  if (g_datapoint == systemName)
+//  {
+//    TreeView_OnExpand(1);
+//  }
   string temp = "";
   string temp_dpe = "";
 
-  dyn_string dcurrent = splitDatapointPath(g_datapoint);
-  dyn_string dnew     = splitDatapointPath(newDatapoint);
-  int Index;
-  for (i = 1; i <= dynlen(datapointPath); i++)
+  for (i = 0; i <= dynlen(datapointPath); i++)
   {
-    if (i == 1)
+    if(i == 0)
     {
-      temp = datapointPath[i];
+      temp = systemName;
     }
-    else
-    {
-    if (i == dynlen(datapointPath)) //last element in datapointPath could be an datapoint element
+    else if (i == 1)
     {
-     temp_dpe = temp + "." + datapointPath[i];
+      temp = temp + ":" + datapointPath[i];
     }
+    else
+    {
+      if (i == dynlen(datapointPath)) //last element in datapointPath could be an datapoint element
+      {
+       temp_dpe = temp + "." + datapointPath[i];
+      }
       temp = temp + "_" + datapointPath[i]; //build datapoint
     }
 
     nodeID = getNodeFromDatapoint(temp);
+    LOG_DEBUG("changeSelectedPostion> trying to expand '" + temp + "', nodeID=" + nodeID);
     if (nodeID == 0) //temp not found
     {
       nodeID = getNodeFromDatapoint(temp + " ->"); //maybe a local reference
@@ -150,16 +153,17 @@ void changeSelectedPosition(string newDatapoint)
       if (nodeID != 0)
       {
         TreeView_OnExpand((nodeID));
+        LOG_DEBUG("changeSelectedPostion> expanding node " + nodeID);
       }
       else
       {
         nodeID = getNodeFromDatapoint(temp_dpe); //nodeID not found, try the datapoint element
         if (nodeID != 0)
-      {
-      TreeView_OnExpand(nodeID);
-      
-     }
-    }
+        {
+          TreeView_OnExpand(nodeID);
+          LOG_DEBUG("changeSelectedPostion> expanding node " + nodeID);
+        }
+      }
     }
   }
 
@@ -495,31 +499,37 @@ void treeAddDatapoints(dyn_string names)
   g_nodeID  = 0;  // to increase performance
   if (dynlen(names) > 0)
   {
-    systemName = strrtrim(dpSubStr(names[1], DPSUB_SYS), ":");
-
-    // Check if the item already exists
-    if (mappingHasKey(g_datapoint2itemID, systemName))
-    {
-      addedNode = g_datapoint2itemID[systemName];
-    }
-    else
-    {
-      addedNode = treeAddNode(-1, 0, systemName);
-      LOG_TRACE("Added root node: ", addedNode, systemName);
-      insertDatapointNodeMapping(addedNode, systemName);
-    }  
     // go through the list of datapoint names
     string aName;
+    string currentSystemName = "";
     for (namesIndex = 1; namesIndex <= dynlen(names); namesIndex++)
     {
       dyn_int internalNodeMapping;
       dyn_string internalFullDPName;
-      aName = names[namesIndex];
 
       int pathIndex;
       dyn_string dpPathElements;
       string datapointName;
       int parentId;
+
+      systemName = strrtrim(dpSubStr(names[namesIndex], DPSUB_SYS), ":");
+      if(currentSystemName != systemName)
+      {
+        currentSystemName = systemName;
+        // Check if the item already exists
+        if (mappingHasKey(g_datapoint2itemID, systemName))
+        {
+          addedNode = g_datapoint2itemID[systemName];
+        }
+        else
+        {
+          addedNode = treeAddNode(-1, 0, systemName);
+          LOG_TRACE("Added root node: ", addedNode, systemName);
+          insertDatapointNodeMapping(addedNode, systemName);
+        }  
+      }
+      
+      aName = names[namesIndex];
       // remove the System part from the datapoint name
       datapointName = dpSubStr(aName, DPSUB_DP);
       if (datapointName == "")
@@ -604,28 +614,49 @@ void treeAddDatapoints(dyn_string names)
             string elementName = splittedElement[elementLevel + 1];
             if ("__" == substr(elementName, 0, 2)) //Check if the elementName contains reference info
             {
-              if (strpos(addingDPpart, " ->") < 0)
+              // special case: __childDp
+              if (strpos(elementName,"__childDp") >= 0)
               {
-                dyn_string referenceContent;
+                string referenceContent;
                 if (dpAccessable(addingDPpart + "." + elementName))
                 {
                   dpGet(addingDPpart + "." + elementName, referenceContent);
+                  // add the reference to the global list. This list is inspected on several occasions, e.g. when
+                  // the user changes the selected item in the tree
+                  dynAppend(g_referenceList, addingDPpart + "=" + referenceContent);
+                  LOG_TRACE("Add reference: ", addingDPpart + "=" + referenceContent);
                 }
                 else
                 {
                   LOG_WARN("Unable to get reference info for datapoint",addingDPpart + "." + elementName);
                 }
-                for (int k = 1; k <= dynlen(referenceContent); k++)
+              }
+              else
+              {
+                // in all other cases: add a reference to the tree
+                if (strpos(addingDPpart, " ->") < 0)
                 {
-                  dyn_string referenceSplit = strsplit(referenceContent[k], "=");
-                  string referenceText = addingDPpart + "_" + referenceSplit[1] + referenceSign(referenceSplit[2]);
-                  dynAppend(g_referenceList, referenceText + "=" + referenceSplit[2]);
-                  dynAppend(names, referenceText);
-                  LOG_TRACE("Add reference: ", referenceText);
-                  // Because this is a reference, the DP's of the branche must be retrieved and
-                  // add to the dyn_string names, for correct build-up of the tree.
-                  dyn_string refResources = navConfigGetResources(referenceText, 2);
-                  dynAppend(names, refResources);
+                  dyn_string referenceContent;
+                  if (dpAccessable(addingDPpart + "." + elementName))
+                  {
+                    dpGet(addingDPpart + "." + elementName, referenceContent);
+                  }
+                  else
+                  {
+                    LOG_WARN("Unable to get reference info for datapoint",addingDPpart + "." + elementName);
+                  }
+                  for (int k = 1; k <= dynlen(referenceContent); k++)
+                  {
+                    dyn_string referenceSplit = strsplit(referenceContent[k], "=");
+                    string referenceText = addingDPpart + "_" + referenceSplit[1] + referenceSign(referenceSplit[2]);
+                    dynAppend(g_referenceList, referenceText + "=" + referenceSplit[2]);
+                    dynAppend(names, referenceText);
+                    LOG_TRACE("Add reference: ", referenceText);
+                    // Because this is a reference, the DP's of the branche must be retrieved and
+                    // add to the dyn_string names, for correct build-up of the tree.
+                    dyn_string refResources = navConfigGetResources(referenceText, 2);
+                    dynAppend(names, refResources);
+                  }
                 }
               }
             }
@@ -735,7 +766,7 @@ insertInternalNodeMapping(dyn_int internalNodeMapping, dyn_string fullDPname)
 string buildPathFromNode(long Node)
 {
   string datapointPath = "";
-  if (Node >= 1)
+  if (Node >= 1 && dynlen(g_itemID2datapoint) >= Node)
   {
     datapointPath = g_itemID2datapoint[Node];
   }
@@ -752,13 +783,21 @@ long getNodeFromDatapoint(string dpe)
 {
   long nodeId = 0;
   
-  //string datapointName = dpSubStr(dpe, DPSUB_SYS_DP_EL); Origiganel 
-  string datapointName = getSystemName(getSystemId()) + dpe;  //New AdB 18-3-2005
+  string datapointName = dpSubStr(dpe, DPSUB_SYS_DP_EL); // Origiganel 
+  //string datapointName = getSystemName(getSystemId()) + dpe;  //New AdB 18-3-2005 maar wel ...
   LOG_TRACE("getNodeFromDatapoint: searching for: ", dpe, datapointName);
   if (mappingHasKey(g_datapoint2itemID, datapointName))
   {
     nodeId = g_datapoint2itemID[datapointName];
   }
+  else
+  {
+    // maybe it was a systemname?
+    if (mappingHasKey(g_datapoint2itemID, dpe))
+    {
+      nodeId = g_datapoint2itemID[dpe];
+    }
+  }
   LOG_TRACE("found??? nodeId= ", nodeId);
   return nodeId;
 }
@@ -1182,10 +1221,10 @@ void TreeCtrl_HandleEventOnExpand(long Node)
     if (Node != 0)
     {
       string datapointPath = buildPathFromNode(Node);
-      if (Node == 1)
-      {
-        datapointPath = "";
-      }
+//      if (Node == 1)
+//      {
+//        datapointPath = "";
+//      }
       // get top level resources. "" means no parent, 1 means: 1 level deep
       dyn_string resources = navConfigGetResources(datapointPath, 2);
       LOG_DEBUG("adding resources: ", LOG_DYN(resources));
@@ -1233,7 +1272,9 @@ void TreeCtrl_HandleEventOnCollapse(unsigned Node)
     datapoint[k]= g_itemID2datapoint[j];
     k++;
   }
-
+  
+  LOG_TRACE("TreeCtrl_HandleEventOnCollapse("+Node+"): removing dp's from tree:",LOG_DYN(datapoint));
+  
   //delete the collapse nodes from g_itemID2datapoint and g_datapoint2itemID
   for (int i = 1; i <= dynlen(datapoint); i++)
   {
@@ -1432,10 +1473,10 @@ TreeView_OnSelect(unsigned pos)
   checkForReference(datapointPath, reference, parentDatapointIsReference);
   
   LOG_TRACE("check for expand", parentDatapointIsReference, datapointPath, dpAccessable(datapointPath));
-  //Check or the access is permitted to this point in the tree
+  //Check if the access is permitted to this point in the tree
   if (checkDpPermit(datapointPath) || pos == 1)
   {
-    //check or the selected item in the tree is an dpe. If yes, use the dp name to check the existance
+    //check if the selected item in the tree is an dpe. If yes, use the dp name to check the existence
     if (strpos(datapointPath, ".") > 0)
     {
      dyn_string datapointPathSplit = strsplit(datapointPath, ".");
@@ -1444,7 +1485,16 @@ TreeView_OnSelect(unsigned pos)
     }
     if (!parentDatapointIsReference || (parentDatapointIsReference && dpAccessable(datapointPath + "__enabled")))
     {
-      TreeCtrl_HandleEventOnSelChange(pos);
+      // set the tree selection to the referenced item
+      if(parentDatapointIsReference)
+      {
+        LOG_INFO("Navigating to referenced datapoint:",datapointPath);
+        navConfigTriggerNavigatorRefreshWithDP(datapointPath);
+      }
+      else
+      {
+        TreeCtrl_HandleEventOnSelChange(pos);
+      }
     }
     else
     {
@@ -1471,10 +1521,10 @@ TreeView_OnExpand(unsigned pos)
 {
   LOG_DEBUG("TreeView_OnExpand", pos);
   string datapointPath = buildPathFromNode(pos);
-  if (pos == 1)
-  {
-    datapointPath = "";
-  }      
+//  if (pos == 1)
+//  {
+//    datapointPath = "";
+//  }      
   if (checkDpPermit(datapointPath) || pos == 1)
   {
     dyn_string reference;
@@ -1578,7 +1628,7 @@ bool dpIsDistributed(string dpName)
 }
 
 ///////////////////////////////////////////////////////////////////////////
-// Function checkDpPermit: Checks or the current user has permission to
+// Function checkDpPermit: Checks if the current user has permission to
 //                         access the current datapoint
 //
 // Output: TRUE,  permitted to access given dpName 
diff --git a/MAC/Navigator/scripts/libs/nav_fw/gcfnav-tab-functions.ctl b/MAC/Navigator/scripts/libs/nav_fw/gcfnav-tab-functions.ctl
index c57d4818e93..3a7e09dc627 100644
--- a/MAC/Navigator/scripts/libs/nav_fw/gcfnav-tab-functions.ctl
+++ b/MAC/Navigator/scripts/libs/nav_fw/gcfnav-tab-functions.ctl
@@ -211,7 +211,7 @@ void ComboBoxViewsSelectionChanged()
   if(viewsComboBoxCtrl.itemCount==0)
   {
     viewTabsCtrl.namedRegisterPanel(VIEW_TABS_VIEW_NAME, viewsPath + "nosubview.pnl",panelParameters);
-    LOG_WARN("1. No subview configured for this datapoint type");
+    LOG_WARN("1. No subview configured for this datapoint", g_datapoint);
   }
   //  else if(!dpAccessable(g_datapoint))
   //  {
@@ -227,7 +227,7 @@ void ComboBoxViewsSelectionChanged()
   {
     selectedPanel = viewsPath + "nopanel.pnl";
     viewTabsCtrl.namedRegisterPanel(VIEW_TABS_VIEW_NAME, viewsPath + "nopanel.pnl",panelParameters);
-    LOG_WARN("4 No panel configured for this subview");
+    LOG_WARN("4 No panel configured for this subview",selectedSubView);
   }
   else  //5. The configured panel file for this subview has not been found
   {
-- 
GitLab