tangxu
2024-10-14 6cd995b71dfc74d4d96347d0bc535fddf36fa9df
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// *********************************
// Message from Original Author:
//
// 2008 Jose Menendez Poo
// Please give me credit if you use this code. It's all I ask.
// Contact me for more info: menendezpoo@gmail.com
// *********************************
//
// Original project from http://ribbon.codeplex.com/
// Continue to support and maintain by http://officeribbon.codeplex.com/
 
 
using System.ComponentModel;
using System.Drawing;
 
namespace System.Windows.Forms
{
    [ToolboxItem(false)]
    public class RibbonPanelPopup : RibbonPopup
    {
        #region Fields
 
        private bool _ignoreNext;
 
        #endregion
 
        #region Ctor
        internal RibbonPanelPopup(RibbonPanel panel)
        {
            SetStyle(ControlStyles.Opaque, false);
            DoubleBuffered = true;
 
            Sensor = new RibbonMouseSensor(this, panel.Owner, panel.Items)
            {
                PanelLimit = panel
            };
            Panel = panel;
            Panel.PopUp = this;
            panel.Owner.SuspendSensor();
 
            using (Graphics g = CreateGraphics())
            {
                panel.overflowBoundsBuffer = panel.Bounds;
                Size s = panel.SwitchToSize(this, g, GetSizeMode(panel));
                //s.Width += 100;
                //s.Height += 100;
                Size = s;
 
            }
 
            foreach (RibbonItem item in panel.Items)
            {
                item.SetCanvas(this);
            }
        }
        #endregion
 
        #region Props
 
        public RibbonMouseSensor Sensor { get; }
 
        /// <summary>
        /// Gets the panel related to the form
        /// </summary>
        public RibbonPanel Panel { get; }
 
        #endregion
 
        #region Methods
 
        public RibbonElementSizeMode GetSizeMode(RibbonPanel pnl)
        {
            if (pnl.FlowsTo == RibbonPanelFlowDirection.Right)
            {
                return RibbonElementSizeMode.Medium;
            }
 
            return RibbonElementSizeMode.Large;
        }
 
        /// <summary>
        /// Prevents the form from being hidden the next time the mouse clicks on the form.
        /// It is useful for reacting to clicks of items inside items.
        /// </summary>
        public void IgnoreNextClickDeactivation()
        {
            _ignoreNext = true;
        }
 
        #endregion
 
        #region Overrides
        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
 
        }
 
        protected override void OnMouseUp(MouseEventArgs e)
        {
            base.OnMouseUp(e);
 
 
            if (_ignoreNext)
            {
                _ignoreNext = false;
            }
 
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
 
            Panel.Owner.Renderer.OnRenderPanelPopupBackground(
                new RibbonCanvasEventArgs(Panel.Owner, e.Graphics, new Rectangle(Point.Empty, ClientSize), this, Panel));
 
            foreach (RibbonItem item in Panel.Items)
            {
                item.OnPaint(this, new RibbonElementPaintEventArgs(e.ClipRectangle, e.Graphics, RibbonElementSizeMode.Large));
            }
 
            Panel.Owner.Renderer.OnRenderRibbonPanelBackground(new RibbonPanelRenderEventArgs(Panel.Owner, e.Graphics, e.ClipRectangle, Panel, this));
            Panel.Owner.Renderer.OnRenderRibbonPanelText(new RibbonPanelRenderEventArgs(Panel.Owner, e.Graphics, e.ClipRectangle, Panel, this));
 
        }
 
        protected override void OnClosed(EventArgs e)
        {
            foreach (RibbonItem item in Panel.Items)
            {
                item.SetCanvas(null);
            }
 
            Panel.SetPressed(false);
            Panel.SetSelected(false);
            Panel.Owner.UpdateRegions();
            Panel.Owner.Refresh();
            Panel.PopUp = null;
            Panel.Owner.ResumeSensor();
 
            Panel.PopupShowed = false;
 
            Panel.Owner.RedrawArea(Panel.Bounds);
            base.OnClosed(e);
        }
 
        #endregion
 
        #region Shadow
 
 
 
 
        #endregion
    }
}