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"); }
public VarData GetLocalVarData(string varName) { if (VariableMap.TryGetValue(varName, out var varData)) { return(varData); } return(null); }
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; } }
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(""); } } }
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); }
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); }