File: HighlightOverlayGlyph.cs

package info (click to toggle)
mono 6.14.1%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,282,732 kB
  • sloc: cs: 11,182,461; xml: 2,850,281; ansic: 699,123; cpp: 122,919; perl: 58,604; javascript: 30,841; asm: 21,845; makefile: 19,602; sh: 10,973; python: 4,772; pascal: 925; sql: 859; sed: 16; php: 1
file content (101 lines) | stat: -rw-r--r-- 3,774 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------

namespace System.Workflow.ComponentModel.Design
{
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Workflow.ComponentModel.Design;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Runtime.InteropServices;

    // <summary>
    // This class provides the visualisation of the backdrop + hightlighted designer when
    // in highlight view.
    // </summary>
    [ComVisible(false)]
    internal class HighlightOverlayGlyph : DesignerGlyph
    {
        private Rectangle bounds;
        private List<ActivityDesigner> highlightedDesigners;
        public HighlightOverlayGlyph(Rectangle bounds, List<ActivityDesigner> highlightedDesigners)
        {
            this.HighlightedDesigners = highlightedDesigners;
            this.Bounds = bounds;
        }

        public Rectangle Bounds
        {
            get { return bounds; }
            set { bounds = value; }
        }

        public List<ActivityDesigner> HighlightedDesigners
        {
            get { return highlightedDesigners; }
            set { highlightedDesigners = value; }
        }

        protected override void OnPaint(Graphics graphics, bool activated, AmbientTheme ambientTheme, ActivityDesigner designer)
        {
            Rectangle frameRect = Bounds;
            Rectangle shadowRect = frameRect;

            Color BaseColor = Color.FromArgb(150, 0, 0, 0); // dark semitransparent backdrop 
            Color LightingColor = Color.FromArgb(150, 0, 0, 0);

            Brush frameBrush = new LinearGradientBrush(new Point(frameRect.Left, frameRect.Top), new Point(frameRect.Left, frameRect.Bottom), BaseColor, LightingColor);

            shadowRect = DropRoundedRectangleShadow(shadowRect, graphics);
            graphics.FillPath(frameBrush, RoundedRect(frameRect));
            graphics.SmoothingMode = SmoothingMode.HighQuality;
            graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

            foreach (ActivityDesigner highlightedDesigner in HighlightedDesigners)
            {
                DesignerPainter.PaintDesigner(highlightedDesigner, new ActivityDesignerPaintEventArgs(graphics, designer.Bounds, designer.Bounds, null));
            }
        }

        private Rectangle DropRoundedRectangleShadow(Rectangle shadowRect, Graphics outputGraphics)
        {

            int shadowIntensity = 1;
            using (Pen shadowPen = new Pen(Color.FromArgb(shadowIntensity, 0, 0, 0)))
            {
                shadowPen.Width = 24;
                for (int i = 0; i < 12; i++)
                {
                    outputGraphics.DrawPath(shadowPen, RoundedRect(shadowRect));
                    shadowPen.Color = Color.FromArgb(shadowIntensity - 1, 0, 0, 0);
                    shadowIntensity += 2;
                    shadowPen.Width = shadowPen.Width - 2;;
                }

                return shadowRect;
            }
        }


        private GraphicsPath RoundedRect(Rectangle frame)
        {
            GraphicsPath path = new GraphicsPath();
            int radius = 1;
            int diameter = radius * 2;
            Rectangle arc = new Rectangle(frame.Left, frame.Top, diameter, diameter);
            path.AddArc(arc, 180, 90);
            arc.X = frame.Right - diameter;
            path.AddArc(arc, 270, 90);
            arc.Y = frame.Bottom - diameter;
            path.AddArc(arc, 0, 90);
            arc.X = frame.Left;
            path.AddArc(arc, 90, 90);
            path.CloseFigure();
            return path;
        }
    }

}