Beispiel #1
0
        public VarData GetVarData(int pathCurrentIndex, ColumnTag tag, int pathEndIndex)
        {
            if (pathCurrentIndex > pathEndIndex)
            {
                return(null);
            }

            ColumnTag.VarInfo varInfo = tag.Path[pathCurrentIndex];
            if (false == VariableMap.TryGetValue(varInfo.Define.Name, out var varData))
            {
                return(null);
            }

            if (pathCurrentIndex == pathEndIndex)
            {
                return(varData);
            }

            if (varInfo.Define.Type == VarDefine.EType.List)
            {
                if (varInfo.ListIndex >= varData.Beans.Count)
                {
                    return(null);
                }
                Bean bean = varData.Beans[varInfo.ListIndex];
                if (null == bean)
                {
                    return(null);
                }
                return(bean.GetVarData(pathCurrentIndex + 1, tag, pathEndIndex));
            }
            throw new Exception("pathCurrentIndex != pathEndIndex And VarData Is Not A List");
        }
Beispiel #2
0
 public VarData GetLocalVarData(string varName)
 {
     if (VariableMap.TryGetValue(varName, out var varData))
     {
         return(varData);
     }
     return(null);
 }
Beispiel #3
0
 public void DeleteVarData(string name)
 {
     if (VariableMap.TryGetValue(name, out var vardata))
     {
         if (Self != null && vardata.Self != null)
         {
             Self.RemoveChild(vardata.Self);
         }
         VariableMap.Remove(name);
         Document.IsChanged = true;
     }
 }
Beispiel #4
0
        public void SaveAs(XmlDocument xml, XmlElement parent, bool create, Property.DataOutputFlags flags)
        {
            XmlElement self = create ? null : Self;

            if (null == self)
            {
                self = xml.CreateElement("bean");
                parent.AppendChild(self);
                if (false == create)
                {
                    Self = self;
                }
            }

            if (flags == Property.DataOutputFlags.All)
            {
                self.SetAttribute("DefineFullName", DefineFullName);
            }

            if (RowIndex >= 0)
            {
                self.SetAttribute("row", RowIndex.ToString());
            }

            // 使用 DefineFullName 找到 BeanDefine。慢的话,可以加cache优化速度。
            BeanDefine beanDefine = Document.BeanDefine;

            if (false == string.IsNullOrEmpty(DefineFullName))
            {
                beanDefine = FormMain.Instance.Documents.SearchReference(DefineFullName);
            }

            foreach (var varDefine in beanDefine.Variables)
            {
                if (0 == (varDefine.DataOutputFlags & flags))
                {
                    continue;
                }

                if (VariableMap.TryGetValue(varDefine.Name, out var varData))
                {
                    varDefine.DetectType(varData.Value);
                    varData.SaveAs(xml, self, create, flags);
                }
                else
                {
                    varDefine.DetectType("");
                }
            }
        }
Beispiel #5
0
        public void RenameVar(string oldName, string newName)
        {
            if (oldName.Equals(newName))
            {
                return;
            }

            if (VariableMap.TryGetValue(oldName, out var exist))
            {
                VariableMap.Add(newName, exist);
                exist.Name = newName;
                VariableMap.Remove(oldName);
                Document.IsChanged = true;
            }
        }
        public Node Resolve(Node expression)
        {
            switch (expression)
            {
            case UnaryOperatorNode un:
                switch (un.NodeType)
                {
                case NodeTypes.Plus: return(Node.Plus(Resolve(un.Argument)));

                case NodeTypes.Minus: return(Node.Minus(Resolve(un.Argument)));

                case NodeTypes.Not: return(Node.Not(Resolve(un.Argument)));
                }

                break;

            case BinaryOperatorNode bn:
                var left  = Resolve(bn.Left);
                var right = Resolve(bn.Right);
                switch (bn.NodeType)
                {
                case NodeTypes.Add: return(Node.Add(left, right));

                case NodeTypes.Subtract: return(Node.Subtract(left, right));

                case NodeTypes.Multiply: return(Node.Multiply(left, right));

                case NodeTypes.Divide: return(Node.Divide(left, right));

                case NodeTypes.Modulo: return(Node.Modulo(left, right));

                case NodeTypes.LessThan: return(Node.LessThan(left, right));

                case NodeTypes.GreaterThan: return(Node.GreaterThan(left, right));

                case NodeTypes.LessThanOrEqual: return(Node.LessThanOrEqual(left, right));

                case NodeTypes.GreaterThanOrEqual: return(Node.GreaterThanOrEqual(left, right));

                case NodeTypes.Equals: return(Node.Equals(left, right));

                case NodeTypes.NotEquals: return(Node.NotEquals(left, right));

                case NodeTypes.And: return(Node.And(left, right));

                case NodeTypes.Or: return(Node.Or(left, right));

                case NodeTypes.Xor: return(Node.Xor(left, right));

                case NodeTypes.Pow: return(Node.Power(left, right));
                }

                break;

            case TernaryOperatorNode tn:
                return(Node.Conditional(Resolve(tn.Condition), Resolve(tn.IfTrue), Resolve(tn.IfFalse)));

            case FunctionNode fn:
                var args = new Node[fn.Arguments.Count];
                for (var i = 0; i < args.Length; i++)
                {
                    args[i] = Resolve(fn.Arguments[i]);
                }

                var funtionUpdated = Node.Function(fn.Name, args);
                if (FunctionMap != null && FunctionMap.TryGetValue(fn.Name, out var function))
                {
                    if (function is StaticResolverFunction staticResolverFunction)
                    {
                        var i = 0;
                        foreach (VariableNode argument in staticResolverFunction.Arguments)
                        {
                            VariableMap[argument.Name] = args[i];
                            i++;
                        }

                        var functionBodyResolved = Resolve(staticResolverFunction.GetBody());
                        return(functionBodyResolved);
                    }

                    if (function is DynamicResolverFunction dynamicResolverFunction)
                    {
                        var functionBodyResolved = dynamicResolverFunction.GetBody(args);
                        return(functionBodyResolved);
                    }
                }

                return(funtionUpdated);

            case ConstantNode cn:
                return(cn);

            case VariableNode vn:
                if (VariableMap != null && vn.NodeType == NodeTypes.Variable && VariableMap.TryGetValue(vn.Name, out var mapped))
                {
                    return(Resolve(mapped));
                }
                else
                {
                    var vargs = new VariableFoundEventArgs <VariableNode>(this, vn);
                    OnUnknownVariableFound(vargs);
                    if (vargs.Created)
                    {
                        return(vargs.Result);
                    }
                    else
                    {
                        return(vn);
                    }
                }
            }

            return(expression);
        }
Beispiel #7
0
        public bool Update(GridData grid, GridData.Row row, ref int colIndex, int pathIndex, UpdateParam param)
        {
            // ColumnCount maybe change in loop
            for (; colIndex < grid.ColumnCount; ++colIndex)
            {
                ColumnTag tag = grid.GetColumn(colIndex).ColumnTag;
                switch (tag.Tag)
                {
                case ColumnTag.ETag.AddVariable:
                    // end of bean.
                    // 删除Define变化时没有同步的数据。
                    HashSet <string> removed = new HashSet <string>();
                    foreach (var k in VariableMap.Keys)
                    {
                        if (tag.PathLast.Define.Parent.GetVariable(k) == null)
                        {
                            removed.Add(k);
                        }
                    }
                    foreach (var k in removed)
                    {
                        DeleteVarData(k);
                    }
                    return(false);
                }
                ColumnTag.VarInfo varInfo = tag.Path[pathIndex];
                if (false == VariableMap.TryGetValue(varInfo.Define.Name, out var varData))
                {
                    switch (param.UpdateType)
                    {
                    case EUpdate.Data:
                        break;     // will new data

                    case EUpdate.CallAction:
                    case EUpdate.Grid:
                        if (varInfo.Define.Type == VarDefine.EType.List)
                        {
                            if (tag.Tag == ColumnTag.ETag.ListStart)
                            {
                                ++colIndex;
                            }
                            colIndex = GridData.FindColumnListEnd(grid, colIndex);
                        }
                        continue;     // data not found. continue load.

                    case EUpdate.DeleteData:
                        return(true);    // data not found. nothing need to delete.

                    default:
                        throw new Exception("unknown update type");
                    }
                    varData = new VarData(this, varInfo.Define.Name);
                    VariableMap.Add(varInfo.Define.Name, varData);
                }
                else if (param.UpdateType == EUpdate.CallAction)
                {
                    param.UpdateAction(grid, colIndex, varInfo, varData);
                }

                if (varInfo.Define.Type == VarDefine.EType.List)
                {
                    if (param.UpdateType == EUpdate.DeleteData)
                    {
                        if (pathIndex + 1 < tag.Path.Count)
                        {
                            if (varInfo.ListIndex < varData.Beans.Count)
                            {
                                Bean bean1 = varData.Beans[varInfo.ListIndex];
                                if (null != bean1)
                                {
                                    bean1.Update(grid, row, ref colIndex, pathIndex + 1, param);
                                }
                                // always return true;
                            }
                        }
                        else
                        {
                            if (ColumnTag.ETag.ListStart != tag.Tag)
                            {
                                throw new Exception("应该仅在Tag为ListStart时移除数据. see FormMain.deleteVariable...");
                            }
                            DeleteVarData(varInfo.Define.Name);
                        }
                        return(true);
                    }
                    if (ColumnTag.ETag.ListStart == tag.Tag)
                    {
                        continue; // 此时没有进入下一级Bean,就在当前Bean再次判断,因为这里没有ListIndex。
                    }
                    if (tag.Tag == ColumnTag.ETag.ListEnd)
                    {
                        int curListCount = -varInfo.ListIndex;
                        int add          = 0;
                        for (int i = curListCount; i < varData.Beans.Count; ++i)
                        {
                            ColumnTag tagSeed = tag.Copy(ColumnTag.ETag.Normal);
                            tagSeed.PathLast.ListIndex = i;
                            add += tag.PathLast.Define.Reference.BuildGridColumns(grid, colIndex + add, tagSeed, -1);
                        }
                        if (curListCount < varData.Beans.Count) // curListCount 至少为1.
                        {
                            varInfo.ListIndex = -varData.Beans.Count;
                        }
                        if (add > 0)
                        {
                            --colIndex; // 新增加了列,回退一列,继续装载数据。
                        }
                        continue;
                    }

                    if (varInfo.ListIndex >= varData.Beans.Count)
                    {
                        if (EUpdate.Data == param.UpdateType)
                        {
                            for (int i = varData.Beans.Count; i < varInfo.ListIndex; ++i)
                            {
                                varData.AddBean(new Bean(Document, varInfo.Define.Value));
                            }
                            Bean create = new Bean(Document, varInfo.Define.Value);
                            varData.AddBean(create);
                            if (create.Update(grid, row, ref colIndex, pathIndex + 1, param))
                            {
                                return(true);
                            }
                        }
                        // 忽略剩下的没有数据的item直到ListEnd。
                        colIndex = GridData.FindColumnListEnd(grid, colIndex);
                        continue;
                    }

                    Bean bean = varData.Beans[varInfo.ListIndex];
                    if (null != bean)
                    {
                        if (bean.Update(grid, row, ref colIndex, pathIndex + 1, param))
                        {
                            return(true);
                        }
                        continue;
                    }
                    if (EUpdate.Data == param.UpdateType)
                    {
                        Bean create = new Bean(Document, varInfo.Define.Value);
                        varData.SetBeanAt(varInfo.ListIndex, create);
                        if (create.Update(grid, row, ref colIndex, pathIndex + 1, param))
                        {
                            return(true);
                        }
                    }
                    continue;
                }

                if (pathIndex + 1 != tag.Path.Count)
                {
                    throw new Exception("Remain Path, But Is Not A List");
                }

                switch (param.UpdateType)
                {
                case EUpdate.Data:
                    // OnGridCellEndEdit update data
                    varData.Value = row.Cells[colIndex].Value;
                    return(true);

                case EUpdate.CallAction:
                    // 上面已经做完了。
                    break;

                case EUpdate.Grid:
                    row.Cells[colIndex].Value = varData.Value; // upate to grid
                    break;                                     // Update Grid 等到 ColumnTag.ETag.AddVariable 才返回。在这个函数开头。

                case EUpdate.DeleteData:
                    DeleteVarData(varInfo.Define.Name);
                    return(true);

                default:
                    throw new Exception("unkown update type. end.");
                }
            }
            return(true);
        }