Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/09/11 16:36:07 (13 years ago)
Author:
mkommend
Message:

#1479: Allowed modificiation of the subtree count in grammars and adapted SymbolicExpressionTreeChart to handle different styles for connection lines.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GP.Grammar.Editor/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.4/SymbolicExpressionGrammarEditorView.cs

    r6387 r6403  
    159159      var tree = new SymbolicExpressionTree(new SymbolicExpressionTreeNode(symbol));
    160160
     161      allowedChildSymbolsControl.SuspendRepaint = true;
    161162      if (Content.GetMaximumSubtreeCount(symbol) > 0) {
    162163        for (int i = 0; i < Content.GetMaximumSubtreeCount(symbol); i++) {
     
    169170      }
    170171      allowedChildSymbolsControl.Tree = tree;
     172
     173      foreach (var subtreeNode in tree.Root.Subtrees) {
     174        foreach (var allowedChildNode in subtreeNode.Subtrees) {
     175          var visualLine = allowedChildSymbolsControl.GetVisualSymbolicExpressionTreeNodeConnection(subtreeNode, allowedChildNode);
     176          visualLine.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
     177        }
     178      }
     179
     180      for (int i = Content.GetMinimumSubtreeCount(symbol); i < Content.GetMaximumSubtreeCount(symbol); i++) {
     181        var subtreeNode = tree.Root.GetSubtree(i);
     182        var visualTreeNode = allowedChildSymbolsControl.GetVisualSymbolicExpressionTreeNode(subtreeNode);
     183        visualTreeNode.TextColor = Color.Gray;
     184        visualTreeNode.LineColor = Color.LightGray;
     185
     186        var visualLine = allowedChildSymbolsControl.GetVisualSymbolicExpressionTreeNodeConnection(tree.Root, subtreeNode);
     187        visualLine.LineColor = Color.LightGray;
     188
     189        foreach (var allowedChildNode in subtreeNode.Subtrees) {
     190          visualTreeNode = allowedChildSymbolsControl.GetVisualSymbolicExpressionTreeNode(allowedChildNode);
     191          visualTreeNode.TextColor = Color.Gray;
     192          visualTreeNode.LineColor = Color.LightGray;
     193
     194          visualLine = allowedChildSymbolsControl.GetVisualSymbolicExpressionTreeNodeConnection(subtreeNode, allowedChildNode);
     195          visualLine.LineColor = Color.LightGray;
     196        }
     197      }
     198
     199      allowedChildSymbolsControl.SuspendRepaint = false;
     200      allowedChildSymbolsControl.Repaint();
    171201      UpdateSelectedSymbolicExpressionTreeNodes();
    172202    }
     
    216246      var symbol = data as ISymbol;
    217247      var symbols = data as IEnumerable<ISymbol>;
    218       if (symbol != null && !(symbol is IReadOnlySymbol) && !Content.ContainsSymbol(symbol)) validDragOperation = true;
     248      if (symbol != null && !(symbol is IReadOnlySymbol) && Content.ContainsSymbol(symbol)) validDragOperation = true;
    219249      else if (symbols != null && symbols.All(s => !(symbol is IReadOnlySymbol) && Content.ContainsSymbol(s))) validDragOperation = true;
    220250    }
     
    263293      foreach (var node in allowedChildSymbolsControl.Tree.IterateNodesPrefix()) {
    264294        var visualNode = allowedChildSymbolsControl.GetVisualSymbolicExpressionTreeNode(node);
    265         if (!selectedSymbolicExpressionTreeNodes.Contains(node)) {
    266           visualNode.FillColor = Color.White;
    267           visualNode.LineColor = Color.Black;
    268         } else {
    269           visualNode.FillColor = Color.WhiteSmoke;
    270           visualNode.LineColor = Color.DarkOrange;
    271         }
     295        if (!selectedSymbolicExpressionTreeNodes.Contains(node)) visualNode.FillColor = Color.White;
     296        else visualNode.FillColor = Color.LightSteelBlue;
     297
    272298      }
    273299      allowedChildSymbolsControl.Repaint();
     300    }
     301
     302    private RectangleF increaseMinimumSubtreeCountRectangle;
     303    private RectangleF decreaseMinimumSubtreeCountRectangle;
     304    private RectangleF increaseMaximumSubtreeCountRectangle;
     305    private RectangleF decreaseMaximumSubtreeCountRectangle;
     306    private void allowedChildSymbolsControl_Paint(object sender, PaintEventArgs e) {
     307      increaseMinimumSubtreeCountRectangle = RectangleF.Empty;
     308      decreaseMinimumSubtreeCountRectangle = RectangleF.Empty;
     309      increaseMaximumSubtreeCountRectangle = RectangleF.Empty;
     310      decreaseMaximumSubtreeCountRectangle = RectangleF.Empty;
     311
     312      if (Content == null) return;
     313      if (allowedChildSymbolsControl.Tree == null) return;
     314
     315      var rootNode = allowedChildSymbolsControl.Tree.Root;
     316      var visualRootNode = allowedChildSymbolsControl.GetVisualSymbolicExpressionTreeNode(rootNode);
     317      var graphics = e.Graphics;
     318
     319      if (rootNode.Symbol is IReadOnlySymbol) return;
     320      if (rootNode.Symbol.MinimumArity == rootNode.Symbol.MaximumArity) return;
     321
     322      using (Pen pen = new Pen(Color.Black)) {
     323        using (Font font = new Font("Times New Roman", 8)) {
     324          var stringFormat = new StringFormat();
     325          stringFormat.Alignment = StringAlignment.Center;
     326          stringFormat.LineAlignment = StringAlignment.Center;
     327          int spacing = 5;
     328          int size = (visualRootNode.Height - spacing * 3) / 2;
     329
     330          increaseMinimumSubtreeCountRectangle = new RectangleF(visualRootNode.X - spacing - size, visualRootNode.Y + spacing, size, size);
     331          decreaseMinimumSubtreeCountRectangle = new RectangleF(visualRootNode.X - spacing - size, visualRootNode.Y + size + 2 * spacing, size, size);
     332          increaseMaximumSubtreeCountRectangle = new RectangleF(visualRootNode.X + visualRootNode.Width + spacing, visualRootNode.Y + spacing, size, size);
     333          decreaseMaximumSubtreeCountRectangle = new RectangleF(visualRootNode.X + visualRootNode.Width + spacing, visualRootNode.Y + size + 2 * spacing, size, size);
     334
     335          pen.Color = Content.GetMaximumSubtreeCount(rootNode.Symbol) == Content.GetMinimumSubtreeCount(rootNode.Symbol) ? Color.LightGray : Color.Black;
     336          graphics.DrawString("+", font, pen.Brush, increaseMinimumSubtreeCountRectangle, stringFormat);
     337          graphics.DrawRectangle(pen, Rectangle.Round(increaseMinimumSubtreeCountRectangle));
     338          if (pen.Color == Color.LightGray) increaseMinimumSubtreeCountRectangle = RectangleF.Empty;
     339
     340          pen.Color = Content.GetMinimumSubtreeCount(rootNode.Symbol) == rootNode.Symbol.MinimumArity ? Color.LightGray : Color.Black;
     341          graphics.DrawString("-", font, pen.Brush, decreaseMinimumSubtreeCountRectangle, stringFormat);
     342          graphics.DrawRectangle(pen, Rectangle.Round(decreaseMinimumSubtreeCountRectangle));
     343          if (pen.Color == Color.LightGray) decreaseMinimumSubtreeCountRectangle = RectangleF.Empty;
     344
     345          pen.Color = Content.GetMaximumSubtreeCount(rootNode.Symbol) == rootNode.Symbol.MaximumArity ? Color.LightGray : Color.Black;
     346          graphics.DrawRectangle(pen, Rectangle.Round(increaseMaximumSubtreeCountRectangle));
     347          graphics.DrawString("+", font, pen.Brush, increaseMaximumSubtreeCountRectangle, stringFormat);
     348          if (pen.Color == Color.LightGray) increaseMaximumSubtreeCountRectangle = RectangleF.Empty;
     349
     350          pen.Color = Content.GetMaximumSubtreeCount(rootNode.Symbol) == Content.GetMinimumSubtreeCount(rootNode.Symbol) ? Color.LightGray : Color.Black;
     351          graphics.DrawRectangle(pen, Rectangle.Round(decreaseMaximumSubtreeCountRectangle));
     352          graphics.DrawString("-", font, pen.Brush, decreaseMaximumSubtreeCountRectangle, stringFormat);
     353          if (pen.Color == Color.LightGray) decreaseMaximumSubtreeCountRectangle = RectangleF.Empty;
     354        }
     355      }
    274356    }
    275357
     
    297379            groupSymbol = selectedNode.Tag as GroupSymbol;
    298380            if (groupSymbol != null && Content.ContainsSymbol(groupSymbol)) break;
     381            selectedNode = selectedNode.Parent;
    299382          }
    300383
     
    345428    }
    346429    #endregion
     430
     431    private void allowedChildSymbolsControl_MouseDown(object sender, MouseEventArgs e) {
     432      if (Content == null) return;
     433      if (allowedChildSymbolsControl.Tree == null) return;
     434
     435      var pointF = new PointF(e.X, e.Y);
     436      var rootSymbol = allowedChildSymbolsControl.Tree.Root.Symbol;
     437      int minimumSubtreeCount = Content.GetMinimumSubtreeCount(rootSymbol);
     438      int maximumSubtreecount = Content.GetMaximumSubtreeCount(rootSymbol);
     439
     440      bool changed = true;
     441      DeregisterContentEvents();
     442      if (increaseMinimumSubtreeCountRectangle.Contains(pointF))
     443        Content.SetSubtreeCount(rootSymbol, minimumSubtreeCount + 1, maximumSubtreecount);
     444      else if (decreaseMinimumSubtreeCountRectangle.Contains(pointF))
     445        Content.SetSubtreeCount(rootSymbol, minimumSubtreeCount - 1, maximumSubtreecount);
     446      else if (increaseMaximumSubtreeCountRectangle.Contains(pointF))
     447        Content.SetSubtreeCount(rootSymbol, minimumSubtreeCount, maximumSubtreecount + 1);
     448      else if (decreaseMaximumSubtreeCountRectangle.Contains(pointF))
     449        Content.SetSubtreeCount(rootSymbol, minimumSubtreeCount, maximumSubtreecount - 1);
     450      else
     451        changed = false;
     452
     453      if (changed) BuildAllowedChildSymbolsTree(rootSymbol);
     454      RegisterContentEvents();
     455    }
    347456  }
    348457
Note: See TracChangeset for help on using the changeset viewer.