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