public override void Draw(DrawingContext ctx) { BracketElement.DrawBracket(ctx, 0, 0, Height, true); BracketElement.DrawBracket(ctx, Width - BracketElement.CloseBracketWidth, 0, Height, false); double x = 0; for (int i = 0; i < elements.Length; i++) { if (i != 0) { ctx.DrawText(Comma, new Point(BracketElement.OpenBracketWidth + BracketElement.BracketGap + x, Height - Comma.Height)); x += 5; } elements[i].Draw(ctx, BracketElement.OpenBracketWidth + BracketElement.BracketGap + x, (Height - elements[i].Height) / 2); x += elements[i].Width; } }
private static FormulaElement CreateFormulaElement(TokenType type, int size) { int i = 0; if (type is ExprCore.Types.Expression expr) { return(ConvertAsFormulaElement(expr.ExprTree, size)); } else if (type is Function func) { if (func.funcName == "sqrt") { return(new SquareRootElement(CreateFormulaElement(func.parameters[0], size))); } else if (func.funcName == "abs") { return(new AbsoluteElement(CreateFormulaElement(func.parameters[0], size))); } else { FormulaElement[] parameters = new FormulaElement[func.parameters.Count]; foreach (TokenType t in func.parameters) { parameters[i++] = CreateFormulaElement(t, size); } return(new SequenceElement(new List <FormulaElement>() { new TextElement(func.funcName, size), new CommaBracketElement(parameters) })); } } else if (type is ExprCore.Types.Matrix mat) { double rowMax = 0; double columnMax = 0; FormulaElement[] elements = new FormulaElement[mat.rows * mat.columns]; for (int r = 0; r < mat.rows; r++) { for (int c = 0; c < mat.columns; c++) { elements[i] = CreateFormulaElement(mat.data[r, c], size); rowMax = Math.Max(rowMax, elements[i].Height); columnMax = Math.Max(columnMax, elements[i].Width); i++; } } return(new MatrixElement(rowMax, columnMax, mat.rows, mat.columns, elements)); } else if (type is ExprCore.Types.Vector vec) { FormulaElement[] elements = new FormulaElement[vec.vecData.Length]; foreach (TokenType t in vec.vecData) { elements[i++] = CreateFormulaElement(t, size); } return(new CommaBracketElement(elements)); } else if (type is Fraction frac) { if (UseFractionForm) { FormulaElement n = new TextElement(frac.numerator.ToString(), size); FormulaElement d = new TextElement(frac.denomiator.ToString(), size); if (frac.denomiator == 1) { return(n); } else { return(new FractionElement(n, d)); } } else { return(new TextElement(frac.GetValue().ToString(), size)); } } else if (type is UnaryOperatorWrapper unary) { FormulaElement innerElement = CreateFormulaElement(unary.token, size); FormulaElement wrapper = innerElement; if (unary.token is ExprCore.Types.Expression) { wrapper = new BracketElement(innerElement); } return(new SequenceElement(new List <FormulaElement>() { new TextElement(unary.operation.ToString(), size), wrapper })); } else { return(new TextElement(type.ToString(), size)); } }