TabStripToolboxItem.cs
5.5 KB
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
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Design;
using System.Design;
using System.Windows.Forms.ComponentModel;
using System.Runtime.Serialization;
using System.Windows.Forms.Design;
using System.Collections.Generic;
namespace RibbonStyle {
/// <summary>
/// This class is invoked when dragging a TabStrip off the toolbox.
/// note that it creates two things - a TabStrip and a TabStripPageSwitcher.
/// </summary>
[Serializable]
internal class TabStripToolboxItem : ToolboxItem {
public TabStripToolboxItem() { }
public TabStripToolboxItem(Type toolType)
: base(toolType) {
}
private TabStripToolboxItem(SerializationInfo info, StreamingContext context) {
Deserialize(info, context);
}
/// <summary>
/// this method is called when dragging a TabStrip off the toolbox.
/// </summary>
/// <param name="host"></param>
/// <returns></returns>
protected override IComponent[] CreateComponentsCore(IDesignerHost host) {
IComponent[] components = base.CreateComponentsCore(host);
Control parentControl = null;
ControlDesigner parentControlDesigner = null;
TabStrip tabStrip = null;
IComponentChangeService changeSvc = (IComponentChangeService)host.GetService(typeof(IComponentChangeService));
// fish out the parent we're adding the TabStrip to.
if (components.Length > 0 && components[0] is TabStrip) {
tabStrip = components[0] as TabStrip;
ITreeDesigner tabStripDesigner = host.GetDesigner(tabStrip) as ITreeDesigner;
parentControlDesigner = tabStripDesigner.Parent as ControlDesigner;
if (parentControlDesigner != null) {
parentControl = parentControlDesigner.Control;
}
}
// Create a ControlSwitcher on the same parent.
if (host != null) {
TabPageSwitcher controlSwitcher = null;
DesignerTransaction t = null;
try {
try {
t = host.CreateTransaction("add tabswitcher");
}
catch (CheckoutException ex) {
if (ex == CheckoutException.Canceled) {
return components;
}
throw ex;
}
// create a TabPageSwitcher and add it to the same parent as the TabStrip
MemberDescriptor controlsMember = TypeDescriptor.GetProperties(parentControlDesigner)["Controls"];
controlSwitcher = host.CreateComponent(typeof(TabPageSwitcher)) as TabPageSwitcher;
if (changeSvc != null) {
changeSvc.OnComponentChanging(parentControl, controlsMember);
changeSvc.OnComponentChanged(parentControl, controlsMember, null, null);
}
// specify default values for our TabStrip
Dictionary<string, object> propertyValues = new Dictionary<string, object>();
propertyValues["Location"] = new Point(tabStrip.Left, tabStrip.Bottom + 3);
propertyValues["TabStrip"] = tabStrip;
// set the property values
SetProperties(controlSwitcher, propertyValues, host);
}
finally {
if (t != null)
t.Commit();
}
// add the TabPageSwitcher to the list of components that we've created
if (controlSwitcher != null) {
IComponent[] newComponents = new IComponent[components.Length + 1];
Array.Copy(components, newComponents, components.Length);
newComponents[newComponents.Length - 1] = controlSwitcher;
return newComponents;
}
}
return components;
}
/// <summary>
/// handy helper method for setting multiple properties.
/// </summary>
/// <param name="component"></param>
/// <param name="properties"></param>
/// <param name="host"></param>
private void SetProperties(Component component, Dictionary<string,object> properties, IDesignerHost host) {
IComponentChangeService changeSvc = (IComponentChangeService)host.GetService(typeof(IComponentChangeService));
foreach (string propname in properties.Keys) {
PropertyDescriptor propDescriptor = TypeDescriptor.GetProperties(component)[propname];
if (changeSvc != null) {
changeSvc.OnComponentChanging(component, propDescriptor);
}
if (propDescriptor != null) {
propDescriptor.SetValue(component, properties[propname]);
}
if (changeSvc != null) {
changeSvc.OnComponentChanged(component, propDescriptor, null, null);
}
}
}
}
}