public void Display() { Cursor cursor = Mouse.OverrideCursor; Mouse.OverrideCursor = Cursors.Wait; try { canvas.Children.Clear(); codeLines.Clear(); subs.Clear(); sbDocument = mainWindow.GetActiveDocument(); //scaleView = 1; //scaleTransform.ScaleX = 1.0; //scaleTransform.ScaleY = 1.0; lastHighlight = null; Parse(); maxrow = 0; maxcol = 0; foreach (CodeLine codeLine in codeLines) { int row = codeLine.row; int col = codeLine.col; if (codeLine.block != eBlock.START && codeLine.block != eBlock.SUB && codeLine.block != eBlock.ELSE && codeLine.block != eBlock.ELSEIF) { ConnectEndIf(row, col, 0, col); } if (codeLine.block == eBlock.ELSE || codeLine.block == eBlock.ELSEIF) { Line connect = new Line() { X1 = borderSpace + (width + widthSpace) * col + 2, X2 = borderSpace + (width + widthSpace) * col - widthSpace - 2, Y1 = borderSpace + heightSpace * row + height / 2, Y2 = borderSpace + heightSpace * row + height / 2, Stroke = new SolidColorBrush(foreground), StrokeThickness = 2, }; canvas.Children.Add(connect); int testCol = col - 1; while (null == HasSymbol(row, testCol) && testCol > 0) { Line connect2 = new Line() { X1 = borderSpace + (width + widthSpace) * (testCol + 1) + 2, X2 = borderSpace + (width + widthSpace) * testCol - widthSpace - 2, Y1 = borderSpace + heightSpace * row + height / 2, Y2 = borderSpace + heightSpace * row + height / 2, Stroke = new SolidColorBrush(foreground), StrokeThickness = 2, }; canvas.Children.Add(connect2); testCol--; } ImageSource arrow = MainWindow.ImageSourceFromBitmap(Properties.Resources.Arrow); Image img = new Image() { Width = 24, Height = 24, Source = arrow, }; RotateTransform rotateTransform = new RotateTransform(); rotateTransform.CenterX = 12; rotateTransform.CenterY = 12; rotateTransform.Angle = 180; img.RenderTransform = new TransformGroup(); ((TransformGroup)img.RenderTransform).Children.Add(rotateTransform); canvas.Children.Add(img); Canvas.SetLeft(img, borderSpace + (width + widthSpace) * col - 22); Canvas.SetTop(img, borderSpace + heightSpace * row + height / 2 - 11); Canvas.SetZIndex(img, 1); } if (codeLine.block == eBlock.IF || codeLine.block == eBlock.ELSEIF) { if (TFshape) { Grid imgTrue = CodeShape.GetBlock(Colors.Green, "T", 24, 24, eShape.ELLIPSE); canvas.Children.Add(imgTrue); Canvas.SetLeft(imgTrue, borderSpace + (width + widthSpace) * col + width / 2 - imgTrue.Width / 2); Canvas.SetTop(imgTrue, borderSpace + heightSpace * row + height + 2); Canvas.SetZIndex(imgTrue, 1); Grid imgFalse = CodeShape.GetBlock(Colors.Red, "F", 24, 24, eShape.ELLIPSE); canvas.Children.Add(imgFalse); Canvas.SetLeft(imgFalse, borderSpace + (width + widthSpace) * col + width + 2); Canvas.SetTop(imgFalse, borderSpace + heightSpace * row + height / 2 - imgTrue.Height / 2); Canvas.SetZIndex(imgFalse, 1); } else { TextBlock condition = new TextBlock() { Foreground = new SolidColorBrush(foreground), Text = "True", }; condition.Measure(new Size(double.MaxValue, double.MaxValue)); canvas.Children.Add(condition); Canvas.SetLeft(condition, borderSpace + (width + widthSpace) * col + width / 2 + 2); Canvas.SetTop(condition, borderSpace + heightSpace * row + height + 2); condition = new TextBlock() { Foreground = new SolidColorBrush(foreground), Text = "False", }; condition.Measure(new Size(double.MaxValue, double.MaxValue)); canvas.Children.Add(condition); Canvas.SetLeft(condition, borderSpace + (width + widthSpace) * col + width + 2); Canvas.SetTop(condition, borderSpace + heightSpace * row + height / 2 - condition.DesiredSize.Height - 2); } } if (codeLine.block == eBlock.ENDIF) { int rowIf = codeLine.rootLine.row; for (int colIf = 0; colIf <= maxcol; colIf++) { CodeLine cl = HasSymbol(rowIf, colIf); if (null != cl && cl.rootLine == codeLine.rootLine) { ConnectEndIf(codeLine.row, codeLine.col, rowIf, colIf); } } } if (codeLine.block == eBlock.ENDFOR || codeLine.block == eBlock.ENDWHILE || codeLine.block == eBlock.GOTO) { ConnectLoop(codeLine.row, codeLine.col, codeLine.rootLine.row, codeLine.rootLine.col); } Color color; switch (codeLine.block) { case eBlock.IF: case eBlock.ELSE: case eBlock.ELSEIF: color = MainWindow.IntToColor(MainWindow.CHART_CONDITION_COLOR); break; case eBlock.START: case eBlock.SUB: color = MainWindow.IntToColor(MainWindow.CHART_START_COLOR); break; case eBlock.GOTO: case eBlock.LABEL: case eBlock.CALL: color = MainWindow.IntToColor(MainWindow.CHART_CALL_COLOR); break; case eBlock.FOR: case eBlock.ENDFOR: color = MainWindow.IntToColor(MainWindow.CHART_FOR_COLOR); break; case eBlock.WHILE: case eBlock.ENDWHILE: color = MainWindow.IntToColor(MainWindow.CHART_WHILE_COLOR); break; default: color = MainWindow.IntToColor(MainWindow.CHART_STATEMENT_COLOR); break; } CodeShape border = new CodeShape(codeLine, width, height, color); codeLine.border = border; border.grid.MouseDown += new MouseButtonEventHandler(codeClick); canvas.Children.Add(border.grid); Canvas.SetLeft(border.grid, borderSpace + (width + widthSpace) * col); Canvas.SetTop(border.grid, borderSpace + heightSpace * row++); maxcol = Math.Max(maxcol, col); maxrow = Math.Max(maxrow, row); } canvas.Width = -widthSpace + 2 * borderSpace + (width + widthSpace) * (maxcol + 1); canvas.Height = borderSpace + heightSpace * maxrow; } catch (Exception ex) { MainWindow.Errors.Add(new Error("Flow Chart : " + ex.Message)); OnError(); } Mouse.OverrideCursor = cursor; }
// Connect left and up/down from row1,col1 to row2,col2 private void ConnectLoop(int row1, int col1, int row2, int col2) { Line connect; ImageSource arrow = MainWindow.ImageSourceFromBitmap(Properties.Resources.Arrow); Image img; int space = 26; List <CodeLine> working = new List <CodeLine>(); for (int row = Math.Min(row1, row2); row <= Math.Max(row1, row2); row++) { CodeLine codeLine = HasSymbol(row, col2); if (null != codeLine) { working.Add(codeLine); space = Math.Max(space, codeLine.linkDist + 4); } } space = Math.Min(space, (int)widthSpace - 4); foreach (CodeLine codeLine in working) { codeLine.linkDist = space; } connect = new Line() { X1 = borderSpace + (width + widthSpace) * col1, X2 = borderSpace + (width + widthSpace) * col2 - space, Y1 = borderSpace + heightSpace * row1 + height / 2, Y2 = borderSpace + heightSpace * row1 + height / 2, Stroke = new SolidColorBrush(foreground), StrokeThickness = 2, }; canvas.Children.Add(connect); connect = new Line() { X1 = borderSpace + (width + widthSpace) * col2 - space, X2 = borderSpace + (width + widthSpace) * col2 - space, Y1 = borderSpace + heightSpace * row1 + height / 2, Y2 = borderSpace + heightSpace * row2 + height / 2, Stroke = new SolidColorBrush(foreground), StrokeThickness = 2, }; canvas.Children.Add(connect); connect = new Line() { X1 = borderSpace + (width + widthSpace) * col2 - space, X2 = borderSpace + (width + widthSpace) * col2, Y1 = borderSpace + heightSpace * row2 + height / 2, Y2 = borderSpace + heightSpace * row2 + height / 2, Stroke = new SolidColorBrush(foreground), StrokeThickness = 2, }; canvas.Children.Add(connect); img = new Image() { Width = 24, Height = 24, Source = arrow, }; RotateTransform rotateTransform = new RotateTransform(); rotateTransform.CenterX = 12; rotateTransform.CenterY = 12; rotateTransform.Angle = 180; img.RenderTransform = new TransformGroup(); ((TransformGroup)img.RenderTransform).Children.Add(rotateTransform); canvas.Children.Add(img); Canvas.SetLeft(img, borderSpace + (width + widthSpace) * col2 - 24); Canvas.SetTop(img, borderSpace + heightSpace * row2 + height / 2 - 11); Canvas.SetZIndex(img, 1); }