Esempio n. 1
0
        public int ChangeConduct(String strVarName, String strNewValue, String strNewOpRules, ref String strRetMsg)
        {
            int nRet = -1;

            NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName];

            if (node == null)
            {
                nRet      = -1;
                strRetMsg = "无此变量";

                return(nRet);
            }

            //@TODO, diff to decide whether update



            nRet = UpdateVar(strVarName, strVarName, strNewValue, strNewOpRules, ref strRetMsg);
            node = (NetWorkNode)m_hashVarsNetWork[strVarName];

            nRet = ChangeConduct(node, ref strRetMsg);

            nRet      = 0;
            strRetMsg = "变化传导成功";

            return(nRet);
        }
Esempio n. 2
0
        //
        private int RemoveVar(String strVarName, ref String strRetMsg)
        {
            int nRet = -1;

            NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName];

            if (node == null)
            {
                nRet      = -1;
                strRetMsg = "无此变量";

                return(nRet);
            }

            foreach (DictionaryEntry entry in node.hashDependentVars)
            {
                NetWorkNode dependentNode = (NetWorkNode)entry.Value;
                dependentNode.hashImpactVars.Remove(strVarName);
            }

            foreach (DictionaryEntry entry in node.hashImpactVars)
            {
                NetWorkNode impactedNode = (NetWorkNode)entry.Value;
                impactedNode.hashDependentVars.Remove(strVarName);
            }

            m_hashVarsNetWork.Remove(strVarName);


            nRet      = 0;
            strRetMsg = "删除成功";
            return(nRet);
        }
Esempio n. 3
0
        public Boolean IsHasRef(String strVarName)
        {
            NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName];

            if (node == null)
            {
                return(false);
            }

            Boolean bRet = (node.hashImpactVars.Count > 0);

            return(bRet);
        }
Esempio n. 4
0
        //
        public Boolean IsAlone(String strVarName)
        {
            NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName];

            if (node == null)
            {
                return(true);
            }

            Boolean bRet = (node.hashDependentVars.Count == 0 && node.hashImpactVars.Count == 0);

            return(bRet);
        }
Esempio n. 5
0
        public int ChangeConduct(NetWorkNode node, ref String strRetMsg)
        {
            int       nRet = -1;
            Hashtable hashDependentVars = new Hashtable();
            Hashtable hashPastVars      = new Hashtable();

            if (IsCycleRef(node, ref hashPastVars))
            {
                node.strValue = "#INVALID:存在循环引用:" + node.strName;
                strRetMsg     = node.strValue;

                Word.ContentControl cnt = (Word.ContentControl)m_hashAllVars[node.strName];
                if (cnt != null)
                {
                    Boolean bLock1 = cnt.LockContentControl, bLock2 = cnt.LockContents;

                    cnt.LockContentControl = false;
                    cnt.LockContents       = false;

                    try
                    {
                        if (!m_bInUndoRedo)
                        {
                            cnt.Range.Text = node.strValue;
                        }
                    }
                    catch (System.Exception ex)
                    {
                    }
                    finally
                    {
                    }

                    cnt.LockContentControl = bLock1;
                    cnt.LockContents       = bLock2;
                }

                return(nRet);
            }

            hashPastVars.Clear();

            nRet = ChangeConduct(node, ref hashDependentVars, ref hashPastVars, ref strRetMsg);

            return(nRet);
        }
Esempio n. 6
0
        public int SafeRemoveVar(String strVarName, ref String strRetMsg, Boolean bConduct = true)
        {
            Boolean bRet   = false;
            int     nRet   = -1;
            String  strMsg = "";

            // recalc
            NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName];

            if (node != null)
            {
                // Hashtable hashPastedVars = new Hashtable();
                if (bConduct)
                {
                    ChangeConduct(node, ref strMsg);
                }

                foreach (DictionaryEntry entry in node.hashDependentVars)
                {
                    NetWorkNode dependentNode = (NetWorkNode)entry.Value;
                    dependentNode.hashImpactVars.Remove(strVarName);
                }
            }

            bRet = IsAlone(strVarName);

            if (bRet)
            {
                nRet = RemoveVar(strVarName, ref strRetMsg);
            }
            else
            {
                nRet      = -1;
                strRetMsg = "非孤立变量";
            }

            return(nRet);
        }
Esempio n. 7
0
        public Boolean IsCycleRef(NetWorkNode node, ref Hashtable hashPastVars)
        {
            if (hashPastVars.Contains(node.strName))
            {
                return(true);
            }

            hashPastVars.Add(node.strName, node);

            foreach (DictionaryEntry entry in node.hashImpactVars)
            {
                NetWorkNode impactedNode = (NetWorkNode)entry.Value;

                if (IsCycleRef(impactedNode, ref hashPastVars))
                {
                    return(true);
                }
            }

            hashPastVars.Remove(node.strName);

            return(false);
        }
Esempio n. 8
0
        //
        public int AddVar(String strVarName, String strVarValue, String strVarOpRules, ref String strRetMsg)
        {
            int    nRet = -1;
            String strRet = "", strMsg = "";

            NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName];

            if (node == null)
            {
                node = new NetWorkNode();
            }
            else
            {
                // nRet = UpdateVar(node.strName, strVarName, strVarValue, strVarOpRules,ref strRetMsg);
                nRet = SafeRemoveVar(node.strName, ref strRetMsg, false);
            }


            node.strName    = strVarName;
            node.strOpRules = strVarOpRules;
            node.strValue   = strVarValue;

            Hashtable hashDependentVars = new Hashtable();

            if (!node.strOpRules.Equals(""))
            {
                strRet = Computing(node.strOpRules, m_hashAllVars, ref hashDependentVars, ref strMsg);

                if (strRet != null)
                {
                    node.strValue = strRet;
                }
                else
                {
                    node.strValue = "#INVALID:" + strMsg;
                }
            }

            if (hashDependentVars.Count > 0)
            {
                foreach (DictionaryEntry entry in hashDependentVars)
                {
                    String strItem = (String)entry.Key;

                    NetWorkNode dependentNode = (NetWorkNode)m_hashVarsNetWork[strItem];
                    if (dependentNode == null)
                    {
                        dependentNode = new NetWorkNode();
                        // fill
                        dependentNode.strName    = strItem;
                        dependentNode.strValue   = "";
                        dependentNode.strOpRules = "";

                        m_hashVarsNetWork[strItem] = dependentNode;
                    }

                    // record dependent vars in current node
                    node.hashDependentVars[strItem] = dependentNode;
                    // update its impact node link
                    dependentNode.hashImpactVars[strVarName] = node;
                }
            }

            m_hashVarsNetWork[strVarName] = node;


            //重新计算,变化传导
            nRet = ChangeConduct(node, ref strRetMsg);

            return(nRet);
        }
Esempio n. 9
0
        public NetWorkNode findNode(String strVarName)
        {
            NetWorkNode node = (NetWorkNode)m_hashVarsNetWork[strVarName];

            return(node);
        }
Esempio n. 10
0
        // 变化传导
        public int ChangeConduct(NetWorkNode node, ref Hashtable hashDependentVars, ref Hashtable hashPastVars, ref String strRetMsg)
        {
            int    nRet = -1;
            String strRet = "", strMsg = "";

            Word.ContentControl cnt      = null;
            Boolean             bIsCycle = false;

            if (hashPastVars.Contains(node.strName))
            {
                node.strValue = "#INVALID:存在循环引用:" + node.strName;
                bIsCycle      = true;
            }
            else
            {
                if (!node.strOpRules.Equals(""))
                {
                    // re calc
                    hashDependentVars.Clear();

                    strRet = Computing(node.strOpRules, m_hashAllVars, ref hashDependentVars, ref strMsg);

                    if (strRet != null)
                    {
                        node.strValue = strRet;
                    }
                    else
                    {
                        node.strValue = "#INVALID:" + strMsg;
                    }
                }

                hashPastVars.Add(node.strName, node);
            }

            cnt = (Word.ContentControl)m_hashAllVars[node.strName];
            if (cnt != null)
            {
                Boolean bLock1 = cnt.LockContentControl, bLock2 = cnt.LockContents;

                cnt.LockContentControl = false;
                cnt.LockContents       = false;

                try
                {
                    if (!m_bInUndoRedo)
                    {
                        cnt.Range.Text = node.strValue;
                    }
                }
                catch (System.Exception ex)
                {
                }
                finally
                {
                }

                cnt.LockContentControl = bLock1;
                cnt.LockContents       = bLock2;
            }

            if (bIsCycle)
            {
                nRet      = -1;
                strRetMsg = node.strValue;
                hashPastVars.Remove(node.strName);
                return(nRet);
            }

            foreach (DictionaryEntry entry in node.hashImpactVars)
            {
                NetWorkNode impactedNode = (NetWorkNode)entry.Value;

                nRet = ChangeConduct(impactedNode, ref hashDependentVars, ref hashPastVars, ref strRetMsg);
            }

            hashPastVars.Remove(node.strName);

            return(nRet);
        }