diff --git a/2547.pdf b/2547.pdf new file mode 100644 index 0000000..808f1f9 Binary files /dev/null and b/2547.pdf differ diff --git a/2548.pdf b/2548.pdf new file mode 100644 index 0000000..26085dd Binary files /dev/null and b/2548.pdf differ diff --git a/3933.htm b/3933.htm new file mode 100644 index 0000000..36268a7 --- /dev/null +++ b/3933.htm @@ -0,0 +1 @@ + PART 1

Errata for 439-8 MacDonald (corrected in the 2nd and 4th printing)

 

p. 65, bottom code listing, second line is:

short state = GetAsyncKeyState(Keys.D).ToString();

but should be:

short state = GetAsyncKeyState(Keys.D);

A little bit later this line:

"D is not currently pressed, but has been pressed since the last call."

is missing the semi-colon (;) at the end.

 

p. 80, middle code listing, this code:

[DllImport("user32.dll")]

private static extern bool GetWindowPlacement(IntPtr handle,

  ref ManagedWindowPlacement placement);

[DllImport("user32.dll")]

private static extern bool SetWindowPlacement(IntPtr handle,

  ref ManagedWindowPlacement placement);

should be altered like this:

[DllImport("user32.dll")]

private static extern bool GetWindowPlacement(IntPtr handle,

  [In, Out] ManagedWindowPlacement placement);

[DllImport("user32.dll")]

private static extern bool SetWindowPlacement(IntPtr handle,

  ManagedWindowPlacement placement);

 

p. 87, bottom line of code, "frmMain" should be replaced with "MainForm"

 

p. 142, second code segment, before the final } (but after the

"g.DrawImage..." line there should be another line of code:

g.Dispose();

 

 

p 21: code Òthis.txtUserName.KeyPressÓ should be Òthis.txtUserName_KeyPressÓ

 

p 618, above list: Òbetween the Leave and Enter EventsÓ should be Òafter the Leave and Enter eventsÓ

 

p 618: Item 4 reads: 4. Validating (Textbox2) but should be 4. Validated (Textbox1)

 

p 863, before third code segment: change Òand 1 to indicate that the object supplied through the parameter is larger than the current instance.Ó to Òand 1 to indicate that the current instance is greater than the instance supplied through the parameter.Ó

 

p 223, Table 7-4: ÒAlignmenttÓ should be ÒAlignmentÓ

 

p 225: the order of the first two lines of code should be reversed, so the FillRectangle() call occurs before DrawRectangle()

 

p 7, after first code segment: change Òwith three possible values: Red, Blue, and Yellow.Ó To Òwith four possible values: Red, Blue, Yellow, and White.Ó

 

p 22, paragraph after Figure 1-4, ÒVisual Studio uses inheritance (the first method) when you create forms. When you configure controls, however, it inserts them as is, and adds the appropriate logic for modifying their properties (the second method).Ó

Should Be:

 ÒVisual Studio uses inheritance (the second method) when you create forms. When you configure controls, however, it inserts them as is, and adds the appropriate logic for modifying their properties (the first method).Ó

 

p 841, second line of code: Òprivate void CreateAndPaintCachedImage(Image imageÓ, should be Òprivate void CreateAndPaintCachedImage(ref Image imageÓ

 

p. 450, after first code segment: ÒThe ToString() method buildsÓ should be ÒThe ConvertToString() method buildsÓ

 

p. 451, first line: ÒThe ConverFromString() method doesÓ should be ÒThe FromString() method doesÓ

 

 

\ No newline at end of file diff --git a/9781590594391.jpg b/9781590594391.jpg new file mode 100644 index 0000000..df1313b Binary files /dev/null and b/9781590594391.jpg differ diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..3cb4862 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,27 @@ +Freeware License, some rights reserved + +Copyright (c) 2006 Matthew MacDonald + +Permission is hereby granted, free of charge, to anyone obtaining a copy +of this software and associated documentation files (the "Software"), +to work with the Software within the limits of freeware distribution and fair use. +This includes the rights to use, copy, and modify the Software for personal use. +Users are also allowed and encouraged to submit corrections and modifications +to the Software for the benefit of other users. + +It is not allowed to reuse, modify, or redistribute the Software for +commercial use in any way, or for a user’s educational materials such as books +or blog articles without prior permission from the copyright holder. + +The above copyright notice and this permission notice need to be included +in all copies or substantial portions of the software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS OR APRESS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.csproj b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.csproj new file mode 100644 index 0000000..3e2e770 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.csproj @@ -0,0 +1,73 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {733E549B-7FB8-4B95-BC6D-D79DD1CFC9EA} + WinExe + Properties + AnimatedCursor + AnimatedCursor + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + Always + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.csproj.user b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.sln b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.sln new file mode 100644 index 0000000..ddc017f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AnimatedCursor", "AnimatedCursor.csproj", "{733E549B-7FB8-4B95-BC6D-D79DD1CFC9EA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {733E549B-7FB8-4B95-BC6D-D79DD1CFC9EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {733E549B-7FB8-4B95-BC6D-D79DD1CFC9EA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {733E549B-7FB8-4B95-BC6D-D79DD1CFC9EA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {733E549B-7FB8-4B95-BC6D-D79DD1CFC9EA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.suo b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.suo new file mode 100644 index 0000000..610093b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/AnimatedCursor.suo differ diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/BLOB.ANI b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/BLOB.ANI new file mode 100644 index 0000000..cfad9bf Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/BLOB.ANI differ diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Form1.Designer.cs new file mode 100644 index 0000000..9e2e03e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Form1.Designer.cs @@ -0,0 +1,48 @@ +namespace AnimatedCursor +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + } +} + diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Form1.cs b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Form1.cs new file mode 100644 index 0000000..1f3a6ed --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Form1.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.IO; +using System.Runtime.InteropServices; + +namespace AnimatedCursor +{ + public partial class Form1 : Form + { + + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + try + { + this.Cursor = AdvancedCursors.Create( + Path.Combine(Application.StartupPath, "blob.ani")); + } + catch (Exception err) + { + MessageBox.Show(err.Message); + } + } + + } + + public class AdvancedCursors + { + + [DllImport("User32.dll")] + private static extern IntPtr LoadCursorFromFile(String str); + + public static Cursor Create(string filename) + { + // Get handle to cursor. + IntPtr hCursor = LoadCursorFromFile(filename); + + // Check if it succeeded. + if (!IntPtr.Zero.Equals(hCursor)) + { + return new Cursor(hCursor); + } + else + { + throw new ApplicationException("Could not create cursor from file " + filename); + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Form1.resx b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Program.cs b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Program.cs new file mode 100644 index 0000000..077c134 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace AnimatedCursor +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d93f50c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AnimatedCursor")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AnimatedCursor")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2f4e092d-5167-4702-bad9-95188a3aa212")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Resources.Designer.cs new file mode 100644 index 0000000..66fcfc4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AnimatedCursor.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AnimatedCursor.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AnimatedCursor.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace AnimatedCursor.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AnimatedCursor.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Settings.Designer.cs new file mode 100644 index 0000000..7d4ed88 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AnimatedCursor.Properties.Settings.get_Default():AnimatedCursor.Properties.Settings")] + +namespace AnimatedCursor.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/bin/Debug/AnimatedCursor.exe b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/bin/Debug/AnimatedCursor.exe new file mode 100644 index 0000000..fd20120 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/bin/Debug/AnimatedCursor.exe differ diff --git a/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/bin/Debug/BLOB.ANI b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/bin/Debug/BLOB.ANI new file mode 100644 index 0000000..cfad9bf Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/AnimatedCursor/bin/Debug/BLOB.ANI differ diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.csproj b/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.csproj new file mode 100644 index 0000000..9c78fe5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {E19104BE-74BF-4E76-AC87-31A1B63AC7C1} + WinExe + Properties + ColorChanger + ColorChanger + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.csproj.user b/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.sln b/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.sln new file mode 100644 index 0000000..c8827e7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ColorChanger", "ColorChanger.csproj", "{E19104BE-74BF-4E76-AC87-31A1B63AC7C1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E19104BE-74BF-4E76-AC87-31A1B63AC7C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E19104BE-74BF-4E76-AC87-31A1B63AC7C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E19104BE-74BF-4E76-AC87-31A1B63AC7C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E19104BE-74BF-4E76-AC87-31A1B63AC7C1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.suo b/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.suo new file mode 100644 index 0000000..ba61534 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/ColorChanger/ColorChanger.suo differ diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Form1.Designer.cs new file mode 100644 index 0000000..ca8ef1c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Form1.Designer.cs @@ -0,0 +1,119 @@ +namespace ColorChanger +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblSaturation = new System.Windows.Forms.Label(); + this.lblHue = new System.Windows.Forms.Label(); + this.lblBrightness = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.lstColors = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // lblSaturation + // + this.lblSaturation.BackColor = System.Drawing.SystemColors.ActiveCaptionText; + this.lblSaturation.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblSaturation.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblSaturation.Location = new System.Drawing.Point(268, 57); + this.lblSaturation.Name = "lblSaturation"; + this.lblSaturation.Size = new System.Drawing.Size(136, 20); + this.lblSaturation.TabIndex = 4; + this.lblSaturation.Text = " Saturation"; + // + // lblHue + // + this.lblHue.BackColor = System.Drawing.SystemColors.ActiveCaptionText; + this.lblHue.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblHue.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblHue.Location = new System.Drawing.Point(268, 33); + this.lblHue.Name = "lblHue"; + this.lblHue.Size = new System.Drawing.Size(136, 20); + this.lblHue.TabIndex = 3; + this.lblHue.Text = " Hue"; + // + // lblBrightness + // + this.lblBrightness.BackColor = System.Drawing.SystemColors.ActiveCaptionText; + this.lblBrightness.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.lblBrightness.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.lblBrightness.Location = new System.Drawing.Point(268, 9); + this.lblBrightness.Name = "lblBrightness"; + this.lblBrightness.Size = new System.Drawing.Size(136, 20); + this.lblBrightness.TabIndex = 2; + this.lblBrightness.Text = " Brightness"; + // + // Label1 + // + this.Label1.BackColor = System.Drawing.SystemColors.ActiveCaptionText; + this.Label1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Label1.Location = new System.Drawing.Point(12, 9); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(200, 20); + this.Label1.TabIndex = 0; + this.Label1.Text = " Choose a Background Color:"; + // + // lstColors + // + this.lstColors.FormattingEnabled = true; + this.lstColors.Location = new System.Drawing.Point(12, 37); + this.lstColors.Name = "lstColors"; + this.lstColors.Size = new System.Drawing.Size(200, 238); + this.lstColors.TabIndex = 1; + this.lstColors.SelectedIndexChanged += new System.EventHandler(this.lstColors_SelectedIndexChanged); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(430, 284); + this.Controls.Add(this.lblSaturation); + this.Controls.Add(this.lblHue); + this.Controls.Add(this.lblBrightness); + this.Controls.Add(this.Label1); + this.Controls.Add(this.lstColors); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Color Changer"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lblSaturation; + private System.Windows.Forms.Label lblHue; + private System.Windows.Forms.Label lblBrightness; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.ListBox lstColors; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/Form1.cs b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Form1.cs new file mode 100644 index 0000000..9fc06f0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Form1.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ColorChanger +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + string[] colorNames; + colorNames = System.Enum.GetNames(typeof(KnownColor)); + + lstColors.Items.AddRange(colorNames); + } + + private void lstColors_SelectedIndexChanged(object sender, EventArgs e) + { + KnownColor selectedColor; + selectedColor = (KnownColor)System.Enum.Parse(typeof(KnownColor), lstColors.Text); + + this.BackColor = System.Drawing.Color.FromKnownColor(selectedColor); + + // Display color information. + lblBrightness.Text = "Brightness = " + + this.BackColor.GetBrightness().ToString(); + lblHue.Text = "Hue = " + this.BackColor.GetHue().ToString(); + lblSaturation.Text = "Saturation = " + this.BackColor.GetSaturation().ToString(); + + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/Form1.resx b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/Program.cs b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Program.cs new file mode 100644 index 0000000..0c88ae3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ColorChanger +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..dd5dfb8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ColorChanger")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ColorChanger")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("4f20a40c-3b58-4085-94aa-d630c1260386")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Resources.Designer.cs new file mode 100644 index 0000000..f8c5e82 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ColorChanger.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ColorChanger.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ColorChanger.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace ColorChanger.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ColorChanger.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Settings.Designer.cs new file mode 100644 index 0000000..72b6d3d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ColorChanger.Properties.Settings.get_Default():ColorChanger.Properties.Settings")] + +namespace ColorChanger.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ColorChanger/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter02/ColorChanger/bin/Debug/ColorChanger.exe b/Pro Windows Forms 2.0/Chapter02/ColorChanger/bin/Debug/ColorChanger.exe new file mode 100644 index 0000000..936ba52 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/ColorChanger/bin/Debug/ColorChanger.exe differ diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.csproj b/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.csproj new file mode 100644 index 0000000..0d16e09 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {BA53FA41-6F9B-4DB4-B287-9738F087807E} + WinExe + Properties + ControlMedley + ControlMedley + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.csproj.user b/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.sln b/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.sln new file mode 100644 index 0000000..cd10319 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlMedley", "ControlMedley.csproj", "{BA53FA41-6F9B-4DB4-B287-9738F087807E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BA53FA41-6F9B-4DB4-B287-9738F087807E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BA53FA41-6F9B-4DB4-B287-9738F087807E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA53FA41-6F9B-4DB4-B287-9738F087807E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BA53FA41-6F9B-4DB4-B287-9738F087807E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.suo b/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.suo new file mode 100644 index 0000000..f090bce Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/ControlMedley/ControlMedley.suo differ diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Form1.Designer.cs new file mode 100644 index 0000000..414c20f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Form1.Designer.cs @@ -0,0 +1,91 @@ +namespace ControlMedley +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Label1 = new System.Windows.Forms.Label(); + this.TextBox1 = new System.Windows.Forms.TextBox(); + this.Button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // Label1 + // + this.Label1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Label1.Location = new System.Drawing.Point(14, 97); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(112, 24); + this.Label1.TabIndex = 8; + this.Label1.Text = "Label1"; + this.Label1.Click += new System.EventHandler(this.ctrlClick); + // + // TextBox1 + // + this.TextBox1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.TextBox1.Location = new System.Drawing.Point(12, 61); + this.TextBox1.Name = "TextBox1"; + this.TextBox1.Size = new System.Drawing.Size(156, 21); + this.TextBox1.TabIndex = 7; + this.TextBox1.Text = "TextBox1"; + this.TextBox1.Click += new System.EventHandler(this.ctrlClick); + // + // Button1 + // + this.Button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Button1.Location = new System.Drawing.Point(12, 21); + this.Button1.Name = "Button1"; + this.Button1.Size = new System.Drawing.Size(96, 28); + this.Button1.TabIndex = 6; + this.Button1.Text = "Button1"; + this.Button1.Click += new System.EventHandler(this.ctrlClick); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(367, 281); + this.Controls.Add(this.Label1); + this.Controls.Add(this.TextBox1); + this.Controls.Add(this.Button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Control Medley"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.TextBox TextBox1; + private System.Windows.Forms.Button Button1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/Form1.cs b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Form1.cs new file mode 100644 index 0000000..85f870f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Form1.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ControlMedley +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + private void ctrlClick(System.Object sender, EventArgs e) + { + Control ctrl = (Control)sender; + MessageBox.Show("You clicked: " + ctrl.Name); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/Form1.resx b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/Program.cs b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Program.cs new file mode 100644 index 0000000..f95d17e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ControlMedley +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0d124ed --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ControlMedley")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ControlMedley")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9f3f8e17-ce9f-46ae-8a39-ab872b323246")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Resources.Designer.cs new file mode 100644 index 0000000..33d7db2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ControlMedley.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ControlMedley.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ControlMedley.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace ControlMedley.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ControlMedley.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Settings.Designer.cs new file mode 100644 index 0000000..d15759c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ControlMedley.Properties.Settings.get_Default():ControlMedley.Properties.Settings")] + +namespace ControlMedley.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ControlMedley/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter02/ControlMedley/bin/Debug/ControlMedley.exe b/Pro Windows Forms 2.0/Chapter02/ControlMedley/bin/Debug/ControlMedley.exe new file mode 100644 index 0000000..afa10f4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/ControlMedley/bin/Debug/ControlMedley.exe differ diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.csproj b/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.csproj new file mode 100644 index 0000000..880d805 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {04EA815A-5F16-46DF-A7EC-405DA99054F0} + WinExe + Properties + EventTracker + EventTracker + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.csproj.user b/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.sln b/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.sln new file mode 100644 index 0000000..8a4d1e7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventTracker", "EventTracker.csproj", "{04EA815A-5F16-46DF-A7EC-405DA99054F0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {04EA815A-5F16-46DF-A7EC-405DA99054F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04EA815A-5F16-46DF-A7EC-405DA99054F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04EA815A-5F16-46DF-A7EC-405DA99054F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04EA815A-5F16-46DF-A7EC-405DA99054F0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.suo b/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.suo new file mode 100644 index 0000000..5dfb8be Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/EventTracker/EventTracker.suo differ diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter02/EventTracker/Form1.Designer.cs new file mode 100644 index 0000000..ecab5e4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/Form1.Designer.cs @@ -0,0 +1,177 @@ +namespace EventTracker +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label4 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.pic = new System.Windows.Forms.PictureBox(); + this.txt = new System.Windows.Forms.TextBox(); + this.cmd = new System.Windows.Forms.Button(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label3 = new System.Windows.Forms.Label(); + this.lstLog = new System.Windows.Forms.ListBox(); + this.GroupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic)).BeginInit(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.Label4); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.pic); + this.GroupBox1.Controls.Add(this.txt); + this.GroupBox1.Controls.Add(this.cmd); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(7, 0); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(384, 148); + this.GroupBox1.TabIndex = 12; + this.GroupBox1.TabStop = false; + // + // Label4 + // + this.Label4.Location = new System.Drawing.Point(92, 108); + this.Label4.Name = "Label4"; + this.Label4.Size = new System.Drawing.Size(56, 16); + this.Label4.TabIndex = 5; + this.Label4.Text = "And here:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(6, 24); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(144, 16); + this.Label1.TabIndex = 2; + this.Label1.Text = "Test keyboard events here:"; + // + // pic + // + this.pic.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pic.Location = new System.Drawing.Point(156, 48); + this.pic.Name = "pic"; + this.pic.Size = new System.Drawing.Size(192, 48); + this.pic.TabIndex = 3; + this.pic.TabStop = false; + this.pic.DoubleClick += new System.EventHandler(this.pic_DoubleClick); + this.pic.Click += new System.EventHandler(this.pic_Click); + this.pic.MouseHover += new System.EventHandler(this.pic_MouseHover); + this.pic.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pic_MouseUp); + this.pic.MouseEnter += new System.EventHandler(this.pic_MouseEnter); + this.pic.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pic_MouseDown); + // + // txt + // + this.txt.Location = new System.Drawing.Point(156, 20); + this.txt.Name = "txt"; + this.txt.Size = new System.Drawing.Size(192, 21); + this.txt.TabIndex = 1; + this.txt.KeyUp += new System.Windows.Forms.KeyEventHandler(this.txt_KeyUp); + this.txt.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txt_KeyPress); + this.txt.TextChanged += new System.EventHandler(this.txt_TextChanged); + this.txt.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txt_KeyDown); + // + // cmd + // + this.cmd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmd.Location = new System.Drawing.Point(156, 100); + this.cmd.Name = "cmd"; + this.cmd.Size = new System.Drawing.Size(88, 28); + this.cmd.TabIndex = 4; + this.cmd.Text = "Button1"; + this.cmd.MouseLeave += new System.EventHandler(this.pic_MouseLeave); + this.cmd.Click += new System.EventHandler(this.pic_Click); + this.cmd.MouseEnter += new System.EventHandler(this.pic_MouseEnter); + this.cmd.MouseHover += new System.EventHandler(this.pic_MouseHover); + this.cmd.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pic_MouseUp); + this.cmd.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pic_MouseDown); + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(20, 52); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(128, 16); + this.Label2.TabIndex = 2; + this.Label2.Text = "Test mouse events here:"; + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(23, 100); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(64, 24); + this.Label3.TabIndex = 11; + this.Label3.Text = "Label3"; + // + // lstLog + // + this.lstLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstLog.FormattingEnabled = true; + this.lstLog.IntegralHeight = false; + this.lstLog.Location = new System.Drawing.Point(7, 156); + this.lstLog.Name = "lstLog"; + this.lstLog.Size = new System.Drawing.Size(384, 212); + this.lstLog.TabIndex = 10; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(399, 374); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.Label3); + this.Controls.Add(this.lstLog); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Event Tracker"; + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pic)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Label Label4; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.PictureBox pic; + private System.Windows.Forms.TextBox txt; + private System.Windows.Forms.Button cmd; + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label3; + private System.Windows.Forms.ListBox lstLog; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/Form1.cs b/Pro Windows Forms 2.0/Chapter02/EventTracker/Form1.cs new file mode 100644 index 0000000..e7f240a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/Form1.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace EventTracker +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Log(String data) + { + lstLog.Items.Add(data); + int itemsPerPage = (int)(lstLog.Height / lstLog.ItemHeight); + lstLog.TopIndex = lstLog.Items.Count - itemsPerPage; + } + + private void txt_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) + { + Log("Key Down: " + e.KeyCode.ToString() + e.KeyValue.ToString()); + } + + private void txt_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) + { + Log("Key Press: " + e.KeyChar.ToString()); + } + + private void txt_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) + { + Log("Key Up: " + e.KeyCode.ToString() + e.KeyValue.ToString() + " Text is: " + txt.Text); + } + + private void txt_TextChanged(object sender, System.EventArgs e) + { + Log("Changed: " + " Text is: " + txt.Text); + } + + private void pic_MouseEnter(object sender, System.EventArgs e) + { + Log("Mouse Enter"); + } + + private void pic_MouseHover(object sender, System.EventArgs e) + { + Log("Mouse Hover"); + } + + private void pic_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) + { + Log("Mouse Down: X=" + e.X.ToString() + " Y=" + e.Y.ToString() + " Button=" + e.Button.ToString()); + } + + private void pic_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) + { + Log("Mouse Up: X=" + e.X.ToString() + " Y=" + e.Y.ToString() + " Button=" + e.Button.ToString()); + } + + private void pic_Click(object sender, System.EventArgs e) + { + Log("Click"); + } + + private void pic_DoubleClick(object sender, System.EventArgs e) + { + Log("Double Click"); + } + + private void pic_MouseLeave(object sender, System.EventArgs e) + { + Log("Mouse Leave"); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/Form1.resx b/Pro Windows Forms 2.0/Chapter02/EventTracker/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/Program.cs b/Pro Windows Forms 2.0/Chapter02/EventTracker/Program.cs new file mode 100644 index 0000000..a7075a2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace EventTracker +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..01d4b4e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("EventTracker")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("EventTracker")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ffb8984a-7d7b-4cbb-968a-d7b12fbdca1d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Resources.Designer.cs new file mode 100644 index 0000000..2e7aa73 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "EventTracker.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "EventTracker.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "EventTracker.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace EventTracker.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EventTracker.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Settings.Designer.cs new file mode 100644 index 0000000..b65cef8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "EventTracker.Properties.Settings.get_Default():EventTracker.Properties.Settings")] + +namespace EventTracker.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/EventTracker/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter02/EventTracker/bin/Debug/EventTracker.exe b/Pro Windows Forms 2.0/Chapter02/EventTracker/bin/Debug/EventTracker.exe new file mode 100644 index 0000000..b95c608 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/EventTracker/bin/Debug/EventTracker.exe differ diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.csproj b/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.csproj new file mode 100644 index 0000000..c0846a7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {9FDCC9CB-8BAE-4721-9AD3-BE49983BB376} + WinExe + Properties + FontViewer + FontViewer + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.csproj.user b/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.sln b/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.sln new file mode 100644 index 0000000..da9ea27 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FontViewer", "FontViewer.csproj", "{9FDCC9CB-8BAE-4721-9AD3-BE49983BB376}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9FDCC9CB-8BAE-4721-9AD3-BE49983BB376}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FDCC9CB-8BAE-4721-9AD3-BE49983BB376}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FDCC9CB-8BAE-4721-9AD3-BE49983BB376}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FDCC9CB-8BAE-4721-9AD3-BE49983BB376}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.suo b/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.suo new file mode 100644 index 0000000..8a4897a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/FontViewer/FontViewer.suo differ diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter02/FontViewer/Form1.Designer.cs new file mode 100644 index 0000000..63c1706 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/Form1.Designer.cs @@ -0,0 +1,114 @@ +namespace FontViewer +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.lstFonts = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.statusBar = new System.Windows.Forms.StatusStrip(); + this.statusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.groupBox1.SuspendLayout(); + this.statusBar.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.Controls.Add(this.lstFonts); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Location = new System.Drawing.Point(7, 0); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(497, 40); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + // + // lstFonts + // + this.lstFonts.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.lstFonts.DropDownWidth = 340; + this.lstFonts.FormattingEnabled = true; + this.lstFonts.Location = new System.Drawing.Point(100, 12); + this.lstFonts.Name = "lstFonts"; + this.lstFonts.Size = new System.Drawing.Size(340, 21); + this.lstFonts.TabIndex = 1; + this.lstFonts.SelectedIndexChanged += new System.EventHandler(this.lstFonts_SelectedIndexChanged); + // + // label1 + // + this.label1.Location = new System.Drawing.Point(12, 16); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(80, 12); + this.label1.TabIndex = 0; + this.label1.Text = "Choose Font:"; + // + // statusBar + // + this.statusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.statusLabel}); + this.statusBar.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Table; + this.statusBar.Location = new System.Drawing.Point(0, 155); + this.statusBar.Name = "statusBar"; + this.statusBar.Size = new System.Drawing.Size(516, 22); + this.statusBar.TabIndex = 2; + this.statusBar.Text = "statusStrip1"; + // + // statusLabel + // + this.statusLabel.Name = "statusLabel"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(516, 177); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.statusBar); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "FontViewer"; + this.Load += new System.EventHandler(this.Form1_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); + this.groupBox1.ResumeLayout(false); + this.statusBar.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.ComboBox lstFonts; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.StatusStrip statusBar; + private System.Windows.Forms.ToolStripStatusLabel statusLabel; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/Form1.cs b/Pro Windows Forms 2.0/Chapter02/FontViewer/Form1.cs new file mode 100644 index 0000000..c2342cf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/Form1.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using Microsoft.Win32; + +namespace FontViewer +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + System.Drawing.Text.InstalledFontCollection fonts = new System.Drawing.Text.InstalledFontCollection(); + foreach (FontFamily family in fonts.Families) + { + lstFonts.Items.Add(family.Name); + } + + RegistryKey rk; + rk = Registry.LocalMachine.OpenSubKey("Software\\ProseTech\\FontViewer"); + if (rk != null) this.Text += " - " + rk.GetValue("Customer"); + + } + + private void lstFonts_SelectedIndexChanged(object sender, EventArgs e) + { + this.Invalidate(); + } + + private void Form1_Paint(object sender, PaintEventArgs e) + { + if (lstFonts.SelectedIndex != -1) + { + try + { + e.Graphics.DrawString(lstFonts.Text, new Font(lstFonts.Text, 50), Brushes.Black, 10, 50); + statusBar.Items[0].Text = ""; + } + catch (ArgumentException err) + { + statusBar.Items[0].Text = err.Message; + } + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/Form1.resx b/Pro Windows Forms 2.0/Chapter02/FontViewer/Form1.resx new file mode 100644 index 0000000..7e314da --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/Program.cs b/Pro Windows Forms 2.0/Chapter02/FontViewer/Program.cs new file mode 100644 index 0000000..dcce801 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace FontViewer +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..749dc8e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("FontViewer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("FontViewer")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("93cab26e-e40f-401e-a30d-f6e59ab2b8a1")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Resources.Designer.cs new file mode 100644 index 0000000..c97c5c5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "FontViewer.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "FontViewer.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "FontViewer.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace FontViewer.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FontViewer.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Settings.Designer.cs new file mode 100644 index 0000000..7bab0d2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "FontViewer.Properties.Settings.get_Default():FontViewer.Properties.Settings")] + +namespace FontViewer.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/FontViewer/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter02/FontViewer/bin/Debug/FontViewer.exe b/Pro Windows Forms 2.0/Chapter02/FontViewer/bin/Debug/FontViewer.exe new file mode 100644 index 0000000..e05c353 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/FontViewer/bin/Debug/FontViewer.exe differ diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form1.Designer.cs new file mode 100644 index 0000000..b2b2a24 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form1.Designer.cs @@ -0,0 +1,49 @@ +namespace ImpossibleAPI +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(422, 351); + this.IsMdiContainer = true; + this.Name = "Form1"; + this.Text = "Form1"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed); + this.ResumeLayout(false); + + } + + #endregion + } +} + diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form1.cs b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form1.cs new file mode 100644 index 0000000..698e81e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form1.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ImpossibleAPI +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_FormClosed(object sender, FormClosedEventArgs e) + { + Application.Exit(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form1.resx b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form2.Designer.cs b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form2.Designer.cs new file mode 100644 index 0000000..b1c7eeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form2.Designer.cs @@ -0,0 +1,84 @@ +namespace ImpossibleAPI +{ + partial class Form2 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Button3 = new System.Windows.Forms.Button(); + this.Button2 = new System.Windows.Forms.Button(); + this.Button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // Button3 + // + this.Button3.Location = new System.Drawing.Point(120, 56); + this.Button3.Name = "Button3"; + this.Button3.Size = new System.Drawing.Size(88, 32); + this.Button3.TabIndex = 8; + this.Button3.Text = "Become Child of Parent2"; + this.Button3.Click += new System.EventHandler(this.Button3_Click); + // + // Button2 + // + this.Button2.Location = new System.Drawing.Point(12, 56); + this.Button2.Name = "Button2"; + this.Button2.Size = new System.Drawing.Size(88, 32); + this.Button2.TabIndex = 7; + this.Button2.Text = "Become Child of Parent1"; + this.Button2.Click += new System.EventHandler(this.Button2_Click); + // + // Button1 + // + this.Button1.Location = new System.Drawing.Point(12, 12); + this.Button1.Name = "Button1"; + this.Button1.Size = new System.Drawing.Size(88, 32); + this.Button1.TabIndex = 6; + this.Button1.Text = "Become Parent"; + this.Button1.Click += new System.EventHandler(this.Button1_Click); + // + // Form2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 154); + this.Controls.Add(this.Button3); + this.Controls.Add(this.Button2); + this.Controls.Add(this.Button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form2"; + this.Text = "Form2"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button Button3; + private System.Windows.Forms.Button Button2; + private System.Windows.Forms.Button Button1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form2.cs b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form2.cs new file mode 100644 index 0000000..9622f05 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form2.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ImpossibleAPI +{ + public partial class Form2 : Form + { + public Form2() + { + InitializeComponent(); + } + + private void Button1_Click(object sender, System.EventArgs e) + { + this.Hide(); + this.MdiParent = null; + this.IsMdiContainer = true; + this.Show(); + } + + private void Button2_Click(object sender, System.EventArgs e) + { + this.Hide(); + this.IsMdiContainer = false; + this.MdiParent = Program.Main2; + this.Show(); + } + + private void Button3_Click(object sender, System.EventArgs e) + { + this.Hide(); + this.IsMdiContainer = false; + this.MdiParent = Program.Main1; + this.Show(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form2.resx b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form2.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Form2.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.csproj b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.csproj new file mode 100644 index 0000000..75f1968 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.csproj @@ -0,0 +1,79 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {5DAEF339-978A-4D54-826F-B36E6F0D117C} + WinExe + Properties + ImpossibleAPI + ImpossibleAPI + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + Form + + + Form2.cs + + + + + Form1.cs + + + Form2.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.csproj.user b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.sln b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.sln new file mode 100644 index 0000000..9077a8a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImpossibleAPI", "ImpossibleAPI.csproj", "{5DAEF339-978A-4D54-826F-B36E6F0D117C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5DAEF339-978A-4D54-826F-B36E6F0D117C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5DAEF339-978A-4D54-826F-B36E6F0D117C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DAEF339-978A-4D54-826F-B36E6F0D117C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5DAEF339-978A-4D54-826F-B36E6F0D117C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.suo b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.suo new file mode 100644 index 0000000..6d70aaf Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/ImpossibleAPI.suo differ diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Program.cs b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Program.cs new file mode 100644 index 0000000..b215c40 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Program.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ImpossibleAPI +{ + static class Program + { + public static Form1 Main1 = new Form1(); + public static Form1 Main2 = new Form1(); + public static Form2 Child = new Form2(); + + [STAThread] + public static void Main() + { + Application.EnableVisualStyles(); + Main1.Text = "Parent 2"; + Main2.Text = "Parent 1"; + Main1.Show(); + Main2.Show(); + + Child.MdiParent = Main2; + Child.Show(); + + System.Windows.Forms.Application.Run(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e705244 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ImpossibleAPI")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ImpossibleAPI")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("605cc7b4-1484-4106-b427-ca0db91fb4b4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Resources.Designer.cs new file mode 100644 index 0000000..27d72e7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ImpossibleAPI.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ImpossibleAPI.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ImpossibleAPI.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace ImpossibleAPI.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ImpossibleAPI.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Settings.Designer.cs new file mode 100644 index 0000000..cecad61 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ImpossibleAPI.Properties.Settings.get_Default():ImpossibleAPI.Properties.Settings")] + +namespace ImpossibleAPI.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/bin/Debug/ImpossibleAPI.exe b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/bin/Debug/ImpossibleAPI.exe new file mode 100644 index 0000000..d633b71 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/ImpossibleAPI/bin/Debug/ImpossibleAPI.exe differ diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter02/KeyTest/Form1.Designer.cs new file mode 100644 index 0000000..18d2925 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/Form1.Designer.cs @@ -0,0 +1,89 @@ +namespace KeyTest +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.lbl = new System.Windows.Forms.Label(); + this.cmdAsyncState = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(36, 36); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(205, 41); + this.textBox1.TabIndex = 0; + this.textBox1.Text = ""; + // + // lbl + // + this.lbl.AutoSize = true; + this.lbl.Location = new System.Drawing.Point(35, 77); + this.lbl.MaximumSize = new System.Drawing.Size(200, 0); + this.lbl.Name = "lbl"; + this.lbl.Size = new System.Drawing.Size(0, 13); + this.lbl.TabIndex = 1; + // + // cmdAsyncState + // + this.cmdAsyncState.Location = new System.Drawing.Point(36, 202); + this.cmdAsyncState.Name = "cmdAsyncState"; + this.cmdAsyncState.Size = new System.Drawing.Size(141, 24); + this.cmdAsyncState.TabIndex = 2; + this.cmdAsyncState.Text = "GetAsyncState() for \"D\""; + this.cmdAsyncState.Click += new System.EventHandler(this.cmdAsyncState_Click); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.cmdAsyncState); + this.Controls.Add(this.lbl); + this.Controls.Add(this.textBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.KeyPreview = true; + this.Name = "Form1"; + this.Text = "KeyTest"; + this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Form1_KeyPress); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label lbl; + private System.Windows.Forms.Button cmdAsyncState; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/Form1.cs b/Pro Windows Forms 2.0/Chapter02/KeyTest/Form1.cs new file mode 100644 index 0000000..c966cea --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/Form1.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Runtime.InteropServices; + +namespace KeyTest +{ + public partial class Form1 : Form + { + [DllImport("User32.dll")] + private static extern short GetAsyncKeyState( + System.Windows.Forms.Keys vKey); // Keys enumeration + + + public Form1() + { + InitializeComponent(); + } + + private void Form1_KeyPress(object sender, KeyPressEventArgs e) + { + e.Handled = true; + } + + private void Form1_KeyDown(object sender, KeyEventArgs e) + { + + // Show the key letter that was pressed. For example, if the user presses + // the D key, the key value will always be “D” regardless of whether Shift + // was held down or not). + lbl.Text = "Key Down: " + e.KeyValue.ToString(); + lbl.Text += "\nKey Code: " + e.KeyCode.ToString(); + lbl.Text += "\nKey Data: " + e.KeyData.ToString(); + + // The KeyCode contains information about every key that was held down, + // using the Keys enumeration. Check if one of these keys is Shift. + if ((e.Modifiers & Keys.Shift) == Keys.Shift) + { + lbl.Text += "\n" + "Shift was held down."; + } + + if ((e.Modifiers & Keys.Control) == Keys.Control) + { + lbl.Text += "\n" + "Control was held down."; + } + + // The easier approach. + if (e.Alt) + { + lbl.Text += "\n" + "Alt was held down."; + } + } + + private void cmdAsyncState_Click(object sender, EventArgs e) + { + // Test for the letter D. + short state = GetAsyncKeyState(Keys.D); + switch (state) + { + case 0: + lbl.Text = "D has not been pressed since the last call."; + break; + case 1: + lbl.Text = "D is not currently pressed, but has been pressed since the last call."; + break; + case -32767: + lbl.Text = "D is currently pressed."; + break; + } + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/Form1.resx b/Pro Windows Forms 2.0/Chapter02/KeyTest/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.csproj b/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.csproj new file mode 100644 index 0000000..442d688 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {A8F7BDC7-F38C-4AAC-9A87-0293167A772E} + WinExe + Properties + KeyTest + KeyTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.csproj.user b/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.sln b/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.sln new file mode 100644 index 0000000..9ebbb46 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeyTest", "KeyTest.csproj", "{A8F7BDC7-F38C-4AAC-9A87-0293167A772E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A8F7BDC7-F38C-4AAC-9A87-0293167A772E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8F7BDC7-F38C-4AAC-9A87-0293167A772E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8F7BDC7-F38C-4AAC-9A87-0293167A772E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8F7BDC7-F38C-4AAC-9A87-0293167A772E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.suo b/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.suo new file mode 100644 index 0000000..e2ebd5b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/KeyTest/KeyTest.suo differ diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/Program.cs b/Pro Windows Forms 2.0/Chapter02/KeyTest/Program.cs new file mode 100644 index 0000000..0da554f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace KeyTest +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1f46c4a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("KeyTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("KeyTest")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("74d1bbc8-02d2-41e6-82b2-9fa15482333a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Resources.Designer.cs new file mode 100644 index 0000000..6da0e55 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "KeyTest.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "KeyTest.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "KeyTest.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace KeyTest.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("KeyTest.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Settings.Designer.cs new file mode 100644 index 0000000..e4052bb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "KeyTest.Properties.Settings.get_Default():KeyTest.Properties.Settings")] + +namespace KeyTest.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/KeyTest/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter02/KeyTest/bin/Debug/KeyTest.exe b/Pro Windows Forms 2.0/Chapter02/KeyTest/bin/Debug/KeyTest.exe new file mode 100644 index 0000000..e7d47d9 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/KeyTest/bin/Debug/KeyTest.exe differ diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Form1.Designer.cs new file mode 100644 index 0000000..c767c19 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Form1.Designer.cs @@ -0,0 +1,73 @@ +namespace SmallOrLargeFonts +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(37, 89); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "OK"; + this.button1.UseVisualStyleBackColor = true; + // + // label2 + // + this.label2.Location = new System.Drawing.Point(12, 9); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(220, 55); + this.label2.TabIndex = 2; + this.label2.Text = "Here is some sample text. Try changing the Small Fonts/Large Fonts setting for th" + + "e computer. This window will adjust automatically."; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(118, 89); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 3; + this.button2.Text = "Cancel"; + this.button2.UseVisualStyleBackColor = true; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(244, 138); + this.Controls.Add(this.button2); + this.Controls.Add(this.label2); + this.Controls.Add(this.button1); + this.Name = "Form1"; + this.Text = "Form1"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button button2; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Form1.cs b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Form1.cs new file mode 100644 index 0000000..4d3e72b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Form1.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using Microsoft.Win32; + +namespace SmallOrLargeFonts +{ + public partial class Form1 : Form + { + public Form1() + { + this.Font = SystemFonts.IconTitleFont; + this.AutoScaleDimensions = new System.Drawing.SizeF(6.0F, 13.0F); + InitializeComponent(); + SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged); + } + + private void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e) + { + if (e.Category == UserPreferenceCategory.Window) + { + this.Font = SystemFonts.IconTitleFont; + } + } + + // You must always detach event handlers for static events. + protected override void Dispose(bool disposing) + { + if (disposing) + { + SystemEvents.UserPreferenceChanged -= + new UserPreferenceChangedEventHandler( + SystemEvents_UserPreferenceChanged); + if (components != null) components.Dispose(); + } + base.Dispose(disposing); + } + + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Form1.resx b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Program.cs b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Program.cs new file mode 100644 index 0000000..2bbf7ac --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace SmallOrLargeFonts +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..62c871b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SmallOrLargeFonts")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SmallOrLargeFonts")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("995937bc-90a3-4964-a3fd-662f8f6aca92")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Resources.Designer.cs new file mode 100644 index 0000000..1186321 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace SmallOrLargeFonts.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SmallOrLargeFonts.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Settings.Designer.cs new file mode 100644 index 0000000..4b5bdb8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace SmallOrLargeFonts.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/SmallOrLargeFonts.csproj b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/SmallOrLargeFonts.csproj new file mode 100644 index 0000000..263aa69 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/SmallOrLargeFonts.csproj @@ -0,0 +1,78 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {E70A39BE-7EDA-4074-8CCB-BEDB92AE66F0} + WinExe + Properties + SmallOrLargeFonts + SmallOrLargeFonts + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Designer + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/SmallOrLargeFonts.sln b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/SmallOrLargeFonts.sln new file mode 100644 index 0000000..b1aaad7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/SmallOrLargeFonts.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmallOrLargeFonts", "SmallOrLargeFonts.csproj", "{E70A39BE-7EDA-4074-8CCB-BEDB92AE66F0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E70A39BE-7EDA-4074-8CCB-BEDB92AE66F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E70A39BE-7EDA-4074-8CCB-BEDB92AE66F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E70A39BE-7EDA-4074-8CCB-BEDB92AE66F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E70A39BE-7EDA-4074-8CCB-BEDB92AE66F0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/SmallOrLargeFonts.suo b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/SmallOrLargeFonts.suo new file mode 100644 index 0000000..d94052b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/SmallOrLargeFonts.suo differ diff --git a/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/bin/Debug/SmallOrLargeFonts.exe b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/bin/Debug/SmallOrLargeFonts.exe new file mode 100644 index 0000000..3d62501 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter02/SmallOrLargeFonts/bin/Debug/SmallOrLargeFonts.exe differ diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/AutoSizing.csproj b/Pro Windows Forms 2.0/Chapter03/AutoSizing/AutoSizing.csproj new file mode 100644 index 0000000..2404b5a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/AutoSizing.csproj @@ -0,0 +1,78 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {FB25B270-6B36-43E8-9639-2359A7C60A3F} + WinExe + Properties + AutoSizing + AutoSizing + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Designer + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/AutoSizing.sln b/Pro Windows Forms 2.0/Chapter03/AutoSizing/AutoSizing.sln new file mode 100644 index 0000000..10c1abd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/AutoSizing.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoSizing", "AutoSizing.csproj", "{FB25B270-6B36-43E8-9639-2359A7C60A3F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FB25B270-6B36-43E8-9639-2359A7C60A3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB25B270-6B36-43E8-9639-2359A7C60A3F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB25B270-6B36-43E8-9639-2359A7C60A3F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB25B270-6B36-43E8-9639-2359A7C60A3F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/AutoSizing.suo b/Pro Windows Forms 2.0/Chapter03/AutoSizing/AutoSizing.suo new file mode 100644 index 0000000..655dea3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/AutoSizing/AutoSizing.suo differ diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Form1.Designer.cs new file mode 100644 index 0000000..d9d9d41 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Form1.Designer.cs @@ -0,0 +1,135 @@ +namespace AutoSizing +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.cmdSetText = new System.Windows.Forms.Button(); + this.cmdSetTextConstraint = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.AutoSize = true; + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Location = new System.Drawing.Point(15, 133); + this.groupBox1.Margin = new System.Windows.Forms.Padding(20); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(200, 100); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "groupBox1"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(17, 25); + this.label1.Margin = new System.Windows.Forms.Padding(5); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 0; + this.label1.Text = "label1"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(15, 12); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox1.Size = new System.Drawing.Size(200, 47); + this.textBox1.TabIndex = 1; + this.textBox1.Text = "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the l" + + "azy dog."; + // + // cmdSetText + // + this.cmdSetText.Location = new System.Drawing.Point(50, 65); + this.cmdSetText.Name = "cmdSetText"; + this.cmdSetText.Size = new System.Drawing.Size(165, 23); + this.cmdSetText.TabIndex = 2; + this.cmdSetText.Text = "Set Text"; + this.cmdSetText.UseVisualStyleBackColor = true; + this.cmdSetText.Click += new System.EventHandler(this.cmdSetText_Click); + // + // cmdSetTextConstraint + // + this.cmdSetTextConstraint.Location = new System.Drawing.Point(50, 91); + this.cmdSetTextConstraint.Name = "cmdSetTextConstraint"; + this.cmdSetTextConstraint.Size = new System.Drawing.Size(165, 23); + this.cmdSetTextConstraint.TabIndex = 3; + this.cmdSetTextConstraint.Text = "Constrain Label and Set Text"; + this.cmdSetTextConstraint.UseVisualStyleBackColor = true; + this.cmdSetTextConstraint.Click += new System.EventHandler(this.cmdSetTextConstraint_Click); + // + // label2 + // + this.label2.Location = new System.Drawing.Point(12, 258); + this.label2.Margin = new System.Windows.Forms.Padding(10); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(216, 75); + this.label2.TabIndex = 4; + this.label2.Text = "The Margin settings on various controls (the Label, GroupBox, etc) are increased " + + "to ensure some breathing room when the labels grow."; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.ClientSize = new System.Drawing.Size(247, 336); + this.Controls.Add(this.label2); + this.Controls.Add(this.cmdSetTextConstraint); + this.Controls.Add(this.cmdSetText); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.groupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Form1"; + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button cmdSetText; + private System.Windows.Forms.Button cmdSetTextConstraint; + private System.Windows.Forms.Label label2; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/Form1.cs b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Form1.cs new file mode 100644 index 0000000..b448686 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Form1.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace AutoSizing +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void cmdSetText_Click(object sender, EventArgs e) + { + + // There is no width boundary. + label1.MaximumSize = new Size(0,0); + label1.Text = ""; + label1.Text = textBox1.Text; + } + + private void cmdSetTextConstraint_Click(object sender, EventArgs e) + { + // There is a width boundary. + label1.MaximumSize = new Size(200,0); + label1.Text = textBox1.Text; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/Form1.resx b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/Program.cs b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Program.cs new file mode 100644 index 0000000..58d3295 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace AutoSizing +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7c88dfc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AutoSizing")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AutoSizing")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c3e29a20-d4c3-48cc-9efb-4ba86e9b6a8b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Resources.Designer.cs new file mode 100644 index 0000000..56d599e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AutoSizing.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AutoSizing.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Settings.Designer.cs new file mode 100644 index 0000000..ca16155 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AutoSizing.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/AutoSizing/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter03/AutoSizing/bin/Debug/AutoSizing.exe b/Pro Windows Forms 2.0/Chapter03/AutoSizing/bin/Debug/AutoSizing.exe new file mode 100644 index 0000000..9dd63ec Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/AutoSizing/bin/Debug/AutoSizing.exe differ diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Docking.csproj b/Pro Windows Forms 2.0/Chapter03/Docking/Docking.csproj new file mode 100644 index 0000000..60041fa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Docking.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {8A322AE6-5EEC-435C-8988-1DB2E4101FC1} + WinExe + Properties + Docking + Docking + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Docking.csproj.user b/Pro Windows Forms 2.0/Chapter03/Docking/Docking.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Docking.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Docking.sln b/Pro Windows Forms 2.0/Chapter03/Docking/Docking.sln new file mode 100644 index 0000000..773823a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Docking.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Docking", "Docking.csproj", "{8A322AE6-5EEC-435C-8988-1DB2E4101FC1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8A322AE6-5EEC-435C-8988-1DB2E4101FC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A322AE6-5EEC-435C-8988-1DB2E4101FC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A322AE6-5EEC-435C-8988-1DB2E4101FC1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A322AE6-5EEC-435C-8988-1DB2E4101FC1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Docking.suo b/Pro Windows Forms 2.0/Chapter03/Docking/Docking.suo new file mode 100644 index 0000000..ef4a321 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/Docking/Docking.suo differ diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter03/Docking/Form1.Designer.cs new file mode 100644 index 0000000..d358a6a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Form1.Designer.cs @@ -0,0 +1,214 @@ +namespace Docking +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.cmdUpdate = new System.Windows.Forms.Button(); + this.udDockPaddingForm = new System.Windows.Forms.NumericUpDown(); + this.udDockPaddingPanel = new System.Windows.Forms.NumericUpDown(); + this.lstDockPanel = new System.Windows.Forms.ComboBox(); + this.Label3 = new System.Windows.Forms.Label(); + this.Label4 = new System.Windows.Forms.Label(); + this.lstDockTextBox = new System.Windows.Forms.ComboBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.pnlDock = new System.Windows.Forms.Panel(); + this.txtDock = new System.Windows.Forms.TextBox(); + this.GroupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.udDockPaddingForm)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.udDockPaddingPanel)).BeginInit(); + this.pnlDock.SuspendLayout(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Controls.Add(this.cmdUpdate); + this.GroupBox1.Controls.Add(this.udDockPaddingForm); + this.GroupBox1.Controls.Add(this.udDockPaddingPanel); + this.GroupBox1.Controls.Add(this.lstDockPanel); + this.GroupBox1.Controls.Add(this.Label3); + this.GroupBox1.Controls.Add(this.Label4); + this.GroupBox1.Controls.Add(this.lstDockTextBox); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Location = new System.Drawing.Point(202, 20); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(284, 224); + this.GroupBox1.TabIndex = 14; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Configure"; + // + // cmdUpdate + // + this.cmdUpdate.Location = new System.Drawing.Point(160, 180); + this.cmdUpdate.Name = "cmdUpdate"; + this.cmdUpdate.Size = new System.Drawing.Size(84, 24); + this.cmdUpdate.TabIndex = 10; + this.cmdUpdate.Text = "Update"; + this.cmdUpdate.Click += new System.EventHandler(this.cmdUpdate_Click); + // + // udDockPaddingForm + // + this.udDockPaddingForm.Increment = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.udDockPaddingForm.Location = new System.Drawing.Point(160, 32); + this.udDockPaddingForm.Name = "udDockPaddingForm"; + this.udDockPaddingForm.Size = new System.Drawing.Size(52, 21); + this.udDockPaddingForm.TabIndex = 4; + // + // udDockPaddingPanel + // + this.udDockPaddingPanel.Increment = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.udDockPaddingPanel.Location = new System.Drawing.Point(160, 56); + this.udDockPaddingPanel.Name = "udDockPaddingPanel"; + this.udDockPaddingPanel.Size = new System.Drawing.Size(52, 21); + this.udDockPaddingPanel.TabIndex = 5; + this.udDockPaddingPanel.Value = new decimal(new int[] { + 20, + 0, + 0, + 0}); + // + // lstDockPanel + // + this.lstDockPanel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.lstDockPanel.FormattingEnabled = true; + this.lstDockPanel.Location = new System.Drawing.Point(156, 100); + this.lstDockPanel.Name = "lstDockPanel"; + this.lstDockPanel.Size = new System.Drawing.Size(92, 21); + this.lstDockPanel.TabIndex = 8; + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(16, 104); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(136, 20); + this.Label3.TabIndex = 6; + this.Label3.Text = "Dock Panel To:"; + // + // Label4 + // + this.Label4.Location = new System.Drawing.Point(16, 128); + this.Label4.Name = "Label4"; + this.Label4.Size = new System.Drawing.Size(136, 20); + this.Label4.TabIndex = 7; + this.Label4.Text = "Dock TextBox To:"; + // + // lstDockTextBox + // + this.lstDockTextBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.lstDockTextBox.FormattingEnabled = true; + this.lstDockTextBox.Location = new System.Drawing.Point(156, 124); + this.lstDockTextBox.Name = "lstDockTextBox"; + this.lstDockTextBox.Size = new System.Drawing.Size(92, 21); + this.lstDockTextBox.TabIndex = 9; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 60); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(136, 20); + this.Label2.TabIndex = 3; + this.Label2.Text = "Set Panel\'s DockPadding:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 36); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(136, 20); + this.Label1.TabIndex = 2; + this.Label1.Text = "Set Form\'s DockPadding:"; + // + // pnlDock + // + this.pnlDock.Controls.Add(this.txtDock); + this.pnlDock.Dock = System.Windows.Forms.DockStyle.Left; + this.pnlDock.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.pnlDock.Location = new System.Drawing.Point(0, 0); + this.pnlDock.Name = "pnlDock"; + this.pnlDock.Padding = new System.Windows.Forms.Padding(20); + this.pnlDock.Size = new System.Drawing.Size(224, 314); + this.pnlDock.TabIndex = 13; + // + // txtDock + // + this.txtDock.Dock = System.Windows.Forms.DockStyle.Left; + this.txtDock.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtDock.Location = new System.Drawing.Point(20, 20); + this.txtDock.Multiline = true; + this.txtDock.Name = "txtDock"; + this.txtDock.Size = new System.Drawing.Size(108, 274); + this.txtDock.TabIndex = 0; + this.txtDock.Text = "I\'m docked to the edge of this Panel.\r\n\r\nThe Panel is docked to the edge of the f" + + "orm.\r\n\r\nThe Panel\'s DockPadding gives the necessary room to breathe."; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(497, 314); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.pnlDock); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Docking At Work"; + this.Load += new System.EventHandler(this.Form1_Load); + this.GroupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.udDockPaddingForm)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.udDockPaddingPanel)).EndInit(); + this.pnlDock.ResumeLayout(false); + this.pnlDock.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Button cmdUpdate; + private System.Windows.Forms.NumericUpDown udDockPaddingForm; + private System.Windows.Forms.NumericUpDown udDockPaddingPanel; + private System.Windows.Forms.ComboBox lstDockPanel; + private System.Windows.Forms.Label Label3; + private System.Windows.Forms.Label Label4; + private System.Windows.Forms.ComboBox lstDockTextBox; + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.Panel pnlDock; + private System.Windows.Forms.TextBox txtDock; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Form1.cs b/Pro Windows Forms 2.0/Chapter03/Docking/Form1.cs new file mode 100644 index 0000000..7ad01a8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Form1.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Docking +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + lstDockPanel.Items.AddRange(Enum.GetNames(Dock.GetType())); + lstDockTextBox.Items.AddRange(Enum.GetNames(Dock.GetType())); + + lstDockPanel.Text = Enum.GetName(Dock.GetType(), pnlDock.Dock); + lstDockTextBox.Text = Enum.GetName(Dock.GetType(), lstDockTextBox.Dock); + } + + private void cmdUpdate_Click(object sender, EventArgs e) + { + this.DockPadding.All = (int)udDockPaddingForm.Value; + pnlDock.DockPadding.All = (int)udDockPaddingPanel.Value; + + // Now we use some rather unusual code to translate the string + // in the listbox into an enumeration object that can be used + // to set the Dock property. + // This looks quite strange, but is actually just one more + // part of the shared class library. + + // First we get the converter that can do the job. + TypeConverter converter; + converter = TypeDescriptor.GetConverter(Dock.GetType()); + + // Then we use it to convert the string. + pnlDock.Dock = (DockStyle)converter.ConvertFromString(lstDockPanel.Text); + txtDock.Dock = (DockStyle)converter.ConvertFromString(lstDockTextBox.Text); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Form1.resx b/Pro Windows Forms 2.0/Chapter03/Docking/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Program.cs b/Pro Windows Forms 2.0/Chapter03/Docking/Program.cs new file mode 100644 index 0000000..a4489a4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Docking +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter03/Docking/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..fd1e811 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Docking")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Docking")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6cb086ef-d76d-4ec1-9bb9-6db2a59eaf13")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Resources.Designer.cs new file mode 100644 index 0000000..9ca5121 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Docking.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Docking.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Docking.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace Docking.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Docking.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Settings.Designer.cs new file mode 100644 index 0000000..17ee4a1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Docking.Properties.Settings.get_Default():Docking.Properties.Settings")] + +namespace Docking.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Docking/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter03/Docking/bin/Debug/Docking.exe b/Pro Windows Forms 2.0/Chapter03/Docking/bin/Debug/Docking.exe new file mode 100644 index 0000000..78d89f0 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/Docking/bin/Debug/Docking.exe differ diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.csproj b/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.csproj new file mode 100644 index 0000000..821bb30 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.csproj @@ -0,0 +1,79 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {A742891C-C6CD-400F-BC6B-F8B2A1F9D129} + WinExe + Properties + FormOwnership + FormOwnership + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + OwnedForm.cs + + + Form + + + OwnerForm.cs + + + + + OwnedForm.cs + + + OwnerForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.csproj.user b/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.sln b/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.sln new file mode 100644 index 0000000..623e919 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormOwnership", "FormOwnership.csproj", "{A742891C-C6CD-400F-BC6B-F8B2A1F9D129}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A742891C-C6CD-400F-BC6B-F8B2A1F9D129}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A742891C-C6CD-400F-BC6B-F8B2A1F9D129}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A742891C-C6CD-400F-BC6B-F8B2A1F9D129}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A742891C-C6CD-400F-BC6B-F8B2A1F9D129}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.suo b/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.suo new file mode 100644 index 0000000..093073a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/FormOwnership/FormOwnership.suo differ diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnedForm.Designer.cs b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnedForm.Designer.cs new file mode 100644 index 0000000..050eda0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnedForm.Designer.cs @@ -0,0 +1,59 @@ +namespace FormOwnership +{ + partial class OwnedForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblState = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblState + // + this.lblState.Location = new System.Drawing.Point(26, 24); + this.lblState.Name = "lblState"; + this.lblState.Size = new System.Drawing.Size(184, 56); + this.lblState.TabIndex = 2; + // + // OwnedForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(236, 104); + this.Controls.Add(this.lblState); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "OwnedForm"; + this.Text = "OwnedForm"; + this.ResumeLayout(false); + + } + + #endregion + + public System.Windows.Forms.Label lblState; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnedForm.cs b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnedForm.cs new file mode 100644 index 0000000..4e982fe --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnedForm.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace FormOwnership +{ + public partial class OwnedForm : Form + { + public OwnedForm() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnedForm.resx b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnedForm.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnedForm.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnerForm.Designer.cs b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnerForm.Designer.cs new file mode 100644 index 0000000..5223f34 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnerForm.Designer.cs @@ -0,0 +1,88 @@ +namespace FormOwnership +{ + partial class OwnerForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.cmdReleaseOwnership = new System.Windows.Forms.Button(); + this.cmdAddOwnership = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.Location = new System.Drawing.Point(38, 37); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(216, 80); + this.label1.TabIndex = 7; + this.label1.Text = "To test form ownership, try minimizing this form when the second form is owned. T" + + "hen try, minimizing it when the second form is not owned."; + // + // cmdReleaseOwnership + // + this.cmdReleaseOwnership.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdReleaseOwnership.Location = new System.Drawing.Point(150, 197); + this.cmdReleaseOwnership.Name = "cmdReleaseOwnership"; + this.cmdReleaseOwnership.Size = new System.Drawing.Size(128, 32); + this.cmdReleaseOwnership.TabIndex = 6; + this.cmdReleaseOwnership.Text = "Remove Ownership"; + this.cmdReleaseOwnership.Click += new System.EventHandler(this.cmdReleaseOwnership_Click); + // + // cmdAddOwnership + // + this.cmdAddOwnership.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAddOwnership.Location = new System.Drawing.Point(14, 197); + this.cmdAddOwnership.Name = "cmdAddOwnership"; + this.cmdAddOwnership.Size = new System.Drawing.Size(120, 32); + this.cmdAddOwnership.TabIndex = 5; + this.cmdAddOwnership.Text = "Set Ownership"; + this.cmdAddOwnership.Click += new System.EventHandler(this.cmdAddOwnership_Click); + // + // OwnerForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.label1); + this.Controls.Add(this.cmdReleaseOwnership); + this.Controls.Add(this.cmdAddOwnership); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "OwnerForm"; + this.Text = "Owner"; + this.Load += new System.EventHandler(this.OwnerForm_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button cmdReleaseOwnership; + private System.Windows.Forms.Button cmdAddOwnership; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnerForm.cs b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnerForm.cs new file mode 100644 index 0000000..55f7a03 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnerForm.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace FormOwnership +{ + public partial class OwnerForm : Form + { + public OwnerForm() + { + InitializeComponent(); + } + + private OwnedForm frmOwned = new OwnedForm(); + + private void OwnerForm_Load(object sender, System.EventArgs e) + { + this.Show(); + frmOwned.Show(); + } + + private void cmdAddOwnership_Click(object sender, System.EventArgs e) + { + this.AddOwnedForm(frmOwned); + frmOwned.lblState.Text = "I'm Owned"; + } + + private void cmdReleaseOwnership_Click(object sender, System.EventArgs e) + { + this.RemoveOwnedForm(frmOwned); + frmOwned.lblState.Text = "I'm Free!"; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnerForm.resx b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnerForm.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/OwnerForm.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/Program.cs b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Program.cs new file mode 100644 index 0000000..7f519a1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace FormOwnership +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new OwnerForm()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..aad2142 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("FormOwnership")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("FormOwnership")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a44990ec-a875-4ba8-be90-a690e51dcfe8")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Resources.Designer.cs new file mode 100644 index 0000000..c881ff6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "FormOwnership.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "FormOwnership.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "FormOwnership.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace FormOwnership.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FormOwnership.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Settings.Designer.cs new file mode 100644 index 0000000..5c82883 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "FormOwnership.Properties.Settings.get_Default():FormOwnership.Properties.Settings")] + +namespace FormOwnership.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/FormOwnership/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter03/FormOwnership/bin/Debug/FormOwnership.exe b/Pro Windows Forms 2.0/Chapter03/FormOwnership/bin/Debug/FormOwnership.exe new file mode 100644 index 0000000..b81643e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/FormOwnership/bin/Debug/FormOwnership.exe differ diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Form1.Designer.cs new file mode 100644 index 0000000..9bc3646 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Form1.Designer.cs @@ -0,0 +1,72 @@ +namespace SaveFormPosition +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(54, 66); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(110, 23); + this.button1.TabIndex = 0; + this.button1.Text = "Save Size"; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(54, 106); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(110, 23); + this.button2.TabIndex = 1; + this.button2.Text = "Restore Size"; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Name = "Form1"; + this.Text = "Form1"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Form1.cs b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Form1.cs new file mode 100644 index 0000000..2381772 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Form1.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace SaveFormPosition +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void button1_Click(object sender, EventArgs e) + { + FormPositionHelper.SaveSize(this); + } + + private void button2_Click(object sender, EventArgs e) + { + FormPositionHelper.SetSize(this); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Form1.resx b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/FormPositionHelper.cs b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/FormPositionHelper.cs new file mode 100644 index 0000000..3b59cc5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/FormPositionHelper.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Win32; +using System.Runtime.InteropServices; +using System.Runtime.Serialization.Formatters.Binary; +using System.IO; +using System.Windows.Forms; + +namespace SaveFormPosition +{ + public class FormPositionHelper + { + [Serializable] + [StructLayout(LayoutKind.Sequential)] + private class ManagedPt + { + public int X = 0; + public int Y = 0; + + public ManagedPt() + { + } + + public ManagedPt(int x, int y) + { + X = x; + Y = y; + } + } + + [Serializable] + [StructLayout(LayoutKind.Sequential)] + private class ManagedRect + { + public int X = 0; + public int Y = 0; + public int Right = 0; + public int Bottom = 0; + + public ManagedRect() + { + } + + public ManagedRect(int x, int y, int right, int bottom) + { + X = x; + Y = y; + Right = right; + Bottom = bottom; + } + } + + [Serializable] + [StructLayout(LayoutKind.Sequential)] + private class ManagedWindowPlacement + { + public uint Length = 0; + public uint Flags = 0; + public uint ShowCmd = 0; + public ManagedPt MinPosition = null; + public ManagedPt MaxPosition = null; + public ManagedRect NormalPosition = null; + + public ManagedWindowPlacement() + { + Length = (uint)Marshal.SizeOf(this); + } + } + + [DllImport("user32.dll")] + private static extern bool GetWindowPlacement(IntPtr handle, + [In, Out] ManagedWindowPlacement placement); + + [DllImport("user32.dll")] + private static extern bool SetWindowPlacement(IntPtr handle, + ManagedWindowPlacement placement); + + public static string RegPath = @"Software\App\"; + + public static void SaveSize(System.Windows.Forms.Form frm) + { + // Create or retrieve a reference to a key where the settings + // will be stored. + RegistryKey key; + key = Registry.LocalMachine.CreateSubKey(RegPath + frm.Name); + + // Get the window placement. + ManagedWindowPlacement placement = new ManagedWindowPlacement(); + GetWindowPlacement(frm.Handle, placement); + + MemoryStream ms = new MemoryStream(); + BinaryFormatter f = new BinaryFormatter(); + f.Serialize(ms, placement); + + key.SetValue("Placement", ms.ToArray()); + } + + public static void SetSize(System.Windows.Forms.Form frm) + { + RegistryKey key; + key = Registry.LocalMachine.OpenSubKey(RegPath + frm.Name); + + if (key != null) + { + MemoryStream ms = new MemoryStream((byte[])key.GetValue("Placement")); + BinaryFormatter f = new BinaryFormatter(); + ManagedWindowPlacement placement = (ManagedWindowPlacement)f.Deserialize(ms); + SetWindowPlacement(frm.Handle, placement); + } + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Program.cs b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Program.cs new file mode 100644 index 0000000..975ed2b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace SaveFormPosition +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1bc3026 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SaveFormPosition")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SaveFormPosition")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("461c55f0-f7e6-4750-8d17-bd18fdc856ef")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Resources.Designer.cs new file mode 100644 index 0000000..0304cec --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SaveFormPosition.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SaveFormPosition.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SaveFormPosition.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace SaveFormPosition.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SaveFormPosition.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Settings.Designer.cs new file mode 100644 index 0000000..db48f48 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SaveFormPosition.Properties.Settings.get_Default():SaveFormPosition.Properties.Settings")] + +namespace SaveFormPosition.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.csproj b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.csproj new file mode 100644 index 0000000..6413d9c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.csproj @@ -0,0 +1,71 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {5040424C-C09D-40B2-9B3E-36FC2A250FDE} + WinExe + Properties + SaveFormPosition + SaveFormPosition + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.csproj.user b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.sln b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.sln new file mode 100644 index 0000000..956f28d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SaveFormPosition", "SaveFormPosition.csproj", "{5040424C-C09D-40B2-9B3E-36FC2A250FDE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5040424C-C09D-40B2-9B3E-36FC2A250FDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5040424C-C09D-40B2-9B3E-36FC2A250FDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5040424C-C09D-40B2-9B3E-36FC2A250FDE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5040424C-C09D-40B2-9B3E-36FC2A250FDE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.suo b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.suo new file mode 100644 index 0000000..de89720 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/SaveFormPosition.suo differ diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/bin/Debug/SaveFormPosition.exe b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/bin/Debug/SaveFormPosition.exe new file mode 100644 index 0000000..115efc5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/bin/Debug/SaveFormPosition.exe differ diff --git a/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/bin/Release/SaveFormPosition.exe b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/bin/Release/SaveFormPosition.exe new file mode 100644 index 0000000..1930f39 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/SaveFormPosition/bin/Release/SaveFormPosition.exe differ diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Menu.cs b/Pro Windows Forms 2.0/Chapter03/Scrolling/Menu.cs new file mode 100644 index 0000000..54d4a4a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace Scrolling +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("Scrolling." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter03/Scrolling/Menu.designer.cs new file mode 100644 index 0000000..cca54b5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Menu.designer.cs @@ -0,0 +1,74 @@ +namespace Scrolling +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(167, 23); + this.button1.TabIndex = 0; + this.button1.Text = "ScrollableForm"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(167, 23); + this.button2.TabIndex = 1; + this.button2.Text = "ScrollablePanel"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(197, 215); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Menu.resx b/Pro Windows Forms 2.0/Chapter03/Scrolling/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Program.cs b/Pro Windows Forms 2.0/Chapter03/Scrolling/Program.cs new file mode 100644 index 0000000..bd0be58 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Scrolling +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..21185b4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Scrolling")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Scrolling")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("991b3fd3-818f-4e57-ab70-9b601ef0c218")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d51b499 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Scrolling.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Scrolling.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Scrolling.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace Scrolling.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Scrolling.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Settings.Designer.cs new file mode 100644 index 0000000..c157cec --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Scrolling.Properties.Settings.get_Default():Scrolling.Properties.Settings")] + +namespace Scrolling.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollableForm.Designer.cs b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollableForm.Designer.cs new file mode 100644 index 0000000..dca0419 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollableForm.Designer.cs @@ -0,0 +1,134 @@ +namespace Scrolling +{ + partial class ScrollableForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Panel1 = new System.Windows.Forms.Panel(); + this.Button6 = new System.Windows.Forms.Button(); + this.Button5 = new System.Windows.Forms.Button(); + this.Button4 = new System.Windows.Forms.Button(); + this.Button3 = new System.Windows.Forms.Button(); + this.Button2 = new System.Windows.Forms.Button(); + this.Button1 = new System.Windows.Forms.Button(); + this.Panel1.SuspendLayout(); + this.SuspendLayout(); + // + // Panel1 + // + this.Panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.Panel1.Controls.Add(this.Button6); + this.Panel1.Controls.Add(this.Button5); + this.Panel1.Controls.Add(this.Button4); + this.Panel1.Controls.Add(this.Button3); + this.Panel1.Controls.Add(this.Button2); + this.Panel1.Controls.Add(this.Button1); + this.Panel1.Location = new System.Drawing.Point(14, 15); + this.Panel1.Name = "Panel1"; + this.Panel1.Size = new System.Drawing.Size(264, 237); + this.Panel1.TabIndex = 3; + // + // Button6 + // + this.Button6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button6.Location = new System.Drawing.Point(16, 180); + this.Button6.Name = "Button6"; + this.Button6.Size = new System.Drawing.Size(168, 24); + this.Button6.TabIndex = 5; + this.Button6.Text = "Button6"; + // + // Button5 + // + this.Button5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button5.Location = new System.Drawing.Point(16, 148); + this.Button5.Name = "Button5"; + this.Button5.Size = new System.Drawing.Size(168, 24); + this.Button5.TabIndex = 4; + this.Button5.Text = "Button5"; + // + // Button4 + // + this.Button4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button4.Location = new System.Drawing.Point(16, 116); + this.Button4.Name = "Button4"; + this.Button4.Size = new System.Drawing.Size(168, 24); + this.Button4.TabIndex = 3; + this.Button4.Text = "Button4"; + // + // Button3 + // + this.Button3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button3.Location = new System.Drawing.Point(16, 84); + this.Button3.Name = "Button3"; + this.Button3.Size = new System.Drawing.Size(168, 24); + this.Button3.TabIndex = 2; + this.Button3.Text = "Button3"; + // + // Button2 + // + this.Button2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button2.Location = new System.Drawing.Point(16, 52); + this.Button2.Name = "Button2"; + this.Button2.Size = new System.Drawing.Size(168, 24); + this.Button2.TabIndex = 1; + this.Button2.Text = "Button2"; + // + // Button1 + // + this.Button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button1.Location = new System.Drawing.Point(16, 20); + this.Button1.Name = "Button1"; + this.Button1.Size = new System.Drawing.Size(168, 24); + this.Button1.TabIndex = 0; + this.Button1.Text = "Button1"; + // + // ScrollableForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScroll = true; + this.ClientSize = new System.Drawing.Size(172, 165); + this.Controls.Add(this.Panel1); + this.Name = "ScrollableForm"; + this.Text = "Form1"; + this.Panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel Panel1; + private System.Windows.Forms.Button Button6; + private System.Windows.Forms.Button Button5; + private System.Windows.Forms.Button Button4; + private System.Windows.Forms.Button Button3; + private System.Windows.Forms.Button Button2; + private System.Windows.Forms.Button Button1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollableForm.cs b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollableForm.cs new file mode 100644 index 0000000..789a1ab --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollableForm.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Scrolling +{ + public partial class ScrollableForm : Form + { + public ScrollableForm() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollableForm.resx b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollableForm.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollableForm.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollablePanel.Designer.cs b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollablePanel.Designer.cs new file mode 100644 index 0000000..2b8afbb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollablePanel.Designer.cs @@ -0,0 +1,137 @@ +namespace Scrolling +{ + partial class ScrollablePanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Panel1 = new System.Windows.Forms.Panel(); + this.Button6 = new System.Windows.Forms.Button(); + this.Button5 = new System.Windows.Forms.Button(); + this.Button4 = new System.Windows.Forms.Button(); + this.Button3 = new System.Windows.Forms.Button(); + this.Button2 = new System.Windows.Forms.Button(); + this.Button1 = new System.Windows.Forms.Button(); + this.Panel1.SuspendLayout(); + this.SuspendLayout(); + // + // Panel1 + // + this.Panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.Panel1.AutoScroll = true; + this.Panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.Panel1.Controls.Add(this.Button6); + this.Panel1.Controls.Add(this.Button5); + this.Panel1.Controls.Add(this.Button4); + this.Panel1.Controls.Add(this.Button3); + this.Panel1.Controls.Add(this.Button2); + this.Panel1.Controls.Add(this.Button1); + this.Panel1.Location = new System.Drawing.Point(12, 12); + this.Panel1.Name = "Panel1"; + this.Panel1.Size = new System.Drawing.Size(218, 198); + this.Panel1.TabIndex = 3; + // + // Button6 + // + this.Button6.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button6.Location = new System.Drawing.Point(16, 180); + this.Button6.Name = "Button6"; + this.Button6.Size = new System.Drawing.Size(168, 24); + this.Button6.TabIndex = 5; + this.Button6.Text = "Button6"; + // + // Button5 + // + this.Button5.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button5.Location = new System.Drawing.Point(16, 148); + this.Button5.Name = "Button5"; + this.Button5.Size = new System.Drawing.Size(168, 24); + this.Button5.TabIndex = 4; + this.Button5.Text = "Button5"; + // + // Button4 + // + this.Button4.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button4.Location = new System.Drawing.Point(16, 116); + this.Button4.Name = "Button4"; + this.Button4.Size = new System.Drawing.Size(168, 24); + this.Button4.TabIndex = 3; + this.Button4.Text = "Button4"; + // + // Button3 + // + this.Button3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button3.Location = new System.Drawing.Point(16, 84); + this.Button3.Name = "Button3"; + this.Button3.Size = new System.Drawing.Size(168, 24); + this.Button3.TabIndex = 2; + this.Button3.Text = "Button3"; + // + // Button2 + // + this.Button2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button2.Location = new System.Drawing.Point(16, 52); + this.Button2.Name = "Button2"; + this.Button2.Size = new System.Drawing.Size(168, 24); + this.Button2.TabIndex = 1; + this.Button2.Text = "Button2"; + // + // Button1 + // + this.Button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Button1.Location = new System.Drawing.Point(16, 20); + this.Button1.Name = "Button1"; + this.Button1.Size = new System.Drawing.Size(168, 24); + this.Button1.TabIndex = 0; + this.Button1.Text = "Button1"; + // + // ScrollablePanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(248, 224); + this.Controls.Add(this.Panel1); + this.Name = "ScrollablePanel"; + this.Text = "ScrollablePanel"; + this.Panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel Panel1; + private System.Windows.Forms.Button Button6; + private System.Windows.Forms.Button Button5; + private System.Windows.Forms.Button Button4; + private System.Windows.Forms.Button Button3; + private System.Windows.Forms.Button Button2; + private System.Windows.Forms.Button Button1; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollablePanel.cs b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollablePanel.cs new file mode 100644 index 0000000..053d45e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollablePanel.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Scrolling +{ + public partial class ScrollablePanel : Form + { + public ScrollablePanel() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollablePanel.resx b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollablePanel.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/ScrollablePanel.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.csproj b/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.csproj new file mode 100644 index 0000000..54dd132 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.csproj @@ -0,0 +1,89 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {4251BDAF-E62B-4F48-8409-70AE190CC771} + WinExe + Properties + Scrolling + Scrolling + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Menu.cs + + + Form + + + ScrollableForm.cs + + + + + Menu.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + ScrollableForm.cs + + + ScrollablePanel.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Form + + + ScrollablePanel.cs + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.csproj.user b/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.sln b/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.sln new file mode 100644 index 0000000..efaffc6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Scrolling", "Scrolling.csproj", "{4251BDAF-E62B-4F48-8409-70AE190CC771}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4251BDAF-E62B-4F48-8409-70AE190CC771}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4251BDAF-E62B-4F48-8409-70AE190CC771}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4251BDAF-E62B-4F48-8409-70AE190CC771}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4251BDAF-E62B-4F48-8409-70AE190CC771}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.suo b/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.suo new file mode 100644 index 0000000..a4ec071 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/Scrolling/Scrolling.suo differ diff --git a/Pro Windows Forms 2.0/Chapter03/Scrolling/bin/Debug/Scrolling.exe b/Pro Windows Forms 2.0/Chapter03/Scrolling/bin/Debug/Scrolling.exe new file mode 100644 index 0000000..08bcdeb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/Scrolling/bin/Debug/Scrolling.exe differ diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Form1.Designer.cs new file mode 100644 index 0000000..5cace52 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Form1.Designer.cs @@ -0,0 +1,213 @@ +namespace SplitWindow +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.pnlFileList = new System.Windows.Forms.Panel(); + this.cmdHide = new System.Windows.Forms.Button(); + this.ListView1 = new System.Windows.Forms.ListView(); + this.ColumnHeader1 = new System.Windows.Forms.ColumnHeader(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.webBrowser1 = new System.Windows.Forms.WebBrowser(); + this.TextBox1 = new System.Windows.Forms.TextBox(); + this.pnlShow = new System.Windows.Forms.Panel(); + this.cmdShow = new System.Windows.Forms.Button(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.pnlFileList.SuspendLayout(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + this.pnlShow.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(29, 10); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.pnlFileList); + this.splitContainer1.Panel1MinSize = 50; + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.splitContainer2); + this.splitContainer1.Size = new System.Drawing.Size(477, 366); + this.splitContainer1.SplitterDistance = 155; + this.splitContainer1.TabIndex = 0; + this.splitContainer1.Text = "splitContainer1"; + // + // pnlFileList + // + this.pnlFileList.Controls.Add(this.cmdHide); + this.pnlFileList.Controls.Add(this.ListView1); + this.pnlFileList.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlFileList.Location = new System.Drawing.Point(0, 0); + this.pnlFileList.Name = "pnlFileList"; + this.pnlFileList.Padding = new System.Windows.Forms.Padding(0, 0, 1, 0); + this.pnlFileList.Size = new System.Drawing.Size(155, 366); + this.pnlFileList.TabIndex = 21; + // + // cmdHide + // + this.cmdHide.Dock = System.Windows.Forms.DockStyle.Bottom; + this.cmdHide.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdHide.Location = new System.Drawing.Point(0, 346); + this.cmdHide.Name = "cmdHide"; + this.cmdHide.Size = new System.Drawing.Size(154, 20); + this.cmdHide.TabIndex = 23; + this.cmdHide.Text = "<< Hide"; + this.cmdHide.Click += new System.EventHandler(this.cmdHide_Click); + // + // ListView1 + // + this.ListView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.ListView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.ColumnHeader1}); + this.ListView1.Location = new System.Drawing.Point(0, 3); + this.ListView1.Name = "ListView1"; + this.ListView1.Size = new System.Drawing.Size(152, 337); + this.ListView1.TabIndex = 22; + this.ListView1.UseCompatibleStateImageBehavior = false; + this.ListView1.View = System.Windows.Forms.View.Details; + this.ListView1.SelectedIndexChanged += new System.EventHandler(this.ListView1_SelectedIndexChanged); + // + // ColumnHeader1 + // + this.ColumnHeader1.Name = "ColumnHeader1"; + this.ColumnHeader1.Text = "File"; + this.ColumnHeader1.Width = 99; + // + // splitContainer2 + // + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.Location = new System.Drawing.Point(0, 0); + this.splitContainer2.Name = "splitContainer2"; + this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.webBrowser1); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.TextBox1); + this.splitContainer2.Size = new System.Drawing.Size(318, 366); + this.splitContainer2.SplitterDistance = 173; + this.splitContainer2.TabIndex = 0; + this.splitContainer2.Text = "splitContainer2"; + // + // webBrowser1 + // + this.webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill; + this.webBrowser1.Location = new System.Drawing.Point(0, 0); + this.webBrowser1.Name = "webBrowser1"; + this.webBrowser1.Size = new System.Drawing.Size(318, 173); + this.webBrowser1.TabIndex = 0; + // + // TextBox1 + // + this.TextBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.TextBox1.Location = new System.Drawing.Point(0, 0); + this.TextBox1.Multiline = true; + this.TextBox1.Name = "TextBox1"; + this.TextBox1.ReadOnly = true; + this.TextBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.TextBox1.Size = new System.Drawing.Size(318, 189); + this.TextBox1.TabIndex = 1; + // + // pnlShow + // + this.pnlShow.Controls.Add(this.cmdShow); + this.pnlShow.Dock = System.Windows.Forms.DockStyle.Left; + this.pnlShow.Location = new System.Drawing.Point(10, 10); + this.pnlShow.Name = "pnlShow"; + this.pnlShow.Padding = new System.Windows.Forms.Padding(0, 0, 3, 0); + this.pnlShow.Size = new System.Drawing.Size(19, 366); + this.pnlShow.TabIndex = 23; + this.pnlShow.Visible = false; + // + // cmdShow + // + this.cmdShow.Dock = System.Windows.Forms.DockStyle.Fill; + this.cmdShow.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdShow.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cmdShow.Location = new System.Drawing.Point(0, 0); + this.cmdShow.Name = "cmdShow"; + this.cmdShow.Size = new System.Drawing.Size(16, 366); + this.cmdShow.TabIndex = 21; + this.cmdShow.Text = ">"; + this.cmdShow.Click += new System.EventHandler(this.cmdShow_Click); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(516, 386); + this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.pnlShow); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Padding = new System.Windows.Forms.Padding(10); + this.Text = "Split Window"; + this.Load += new System.EventHandler(this.Form1_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.pnlFileList.ResumeLayout(false); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + this.splitContainer2.Panel2.PerformLayout(); + this.splitContainer2.ResumeLayout(false); + this.pnlShow.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.WebBrowser webBrowser1; + private System.Windows.Forms.TextBox TextBox1; + private System.Windows.Forms.Panel pnlFileList; + private System.Windows.Forms.Button cmdHide; + private System.Windows.Forms.ListView ListView1; + private System.Windows.Forms.ColumnHeader ColumnHeader1; + private System.Windows.Forms.Panel pnlShow; + private System.Windows.Forms.Button cmdShow; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/Form1.cs b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Form1.cs new file mode 100644 index 0000000..2b8348f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Form1.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.IO; + +namespace SplitWindow +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void cmdHide_Click(object sender, EventArgs e) + { + splitContainer1.Panel1Collapsed = true; + pnlShow.Visible = true; + + } + + private void cmdShow_Click(object sender, EventArgs e) + { + splitContainer1.Panel1Collapsed = false; + pnlShow.Visible = false; + + + } + + private void Form1_Load(object sender, EventArgs e) + { + DirectoryInfo d = new DirectoryInfo(Application.StartupPath); + foreach (FileInfo f in d.GetFiles()) + { + ListView1.Items.Add(f.Name); + } + } + + private void ListView1_SelectedIndexChanged(object sender, EventArgs e) + { + try + { + // Construct the objects required for the Navigate2 method call. + // C# does not support optional parameters. + string urlText = Path.Combine(Application.StartupPath, ListView1.SelectedItems[0].Text); + + + webBrowser1.Navigate(urlText); + StreamReader r = File.OpenText(urlText); + TextBox1.Text = r.ReadToEnd(); + r.Close(); + } + catch + { + } + + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/Form1.resx b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/Program.cs b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Program.cs new file mode 100644 index 0000000..c043bd0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace SplitWindow +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..479beb2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SplitWindow")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SplitWindow")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("911106a9-f45f-4a25-a6a1-f6a6d061892e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Resources.Designer.cs new file mode 100644 index 0000000..4a62252 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SplitWindow.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SplitWindow.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SplitWindow.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace SplitWindow.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SplitWindow.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Settings.Designer.cs new file mode 100644 index 0000000..ac3f4ff --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SplitWindow.Properties.Settings.get_Default():SplitWindow.Properties.Settings")] + +namespace SplitWindow.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.csproj b/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.csproj new file mode 100644 index 0000000..a7c554c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.csproj @@ -0,0 +1,78 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {83432B8C-AB08-4EBC-BF94-761A4405EBEE} + WinExe + Properties + SplitWindow + SplitWindow + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + Always + + + Always + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.csproj.user b/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.sln b/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.sln new file mode 100644 index 0000000..f970f9f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SplitWindow", "SplitWindow.csproj", "{83432B8C-AB08-4EBC-BF94-761A4405EBEE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {83432B8C-AB08-4EBC-BF94-761A4405EBEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {83432B8C-AB08-4EBC-BF94-761A4405EBEE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {83432B8C-AB08-4EBC-BF94-761A4405EBEE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {83432B8C-AB08-4EBC-BF94-761A4405EBEE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.suo b/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.suo new file mode 100644 index 0000000..f331648 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/SplitWindow/SplitWindow.suo differ diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/address.htm b/Pro Windows Forms 2.0/Chapter03/SplitWindow/address.htm new file mode 100644 index 0000000..5ae83d8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/address.htm @@ -0,0 +1,17 @@ + + + + +

Bargain basement stake collection (all wooden). Make checks payable to:

+

Buffy Summers
+1630 Revello Drive
+Sunnydale, California
+U.S.A.

+
+
+
+
+No warranty expressed or implied. + + + diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/bin/Debug/SplitWindow.exe b/Pro Windows Forms 2.0/Chapter03/SplitWindow/bin/Debug/SplitWindow.exe new file mode 100644 index 0000000..95482e5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/SplitWindow/bin/Debug/SplitWindow.exe differ diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/bin/Debug/address.htm b/Pro Windows Forms 2.0/Chapter03/SplitWindow/bin/Debug/address.htm new file mode 100644 index 0000000..5ae83d8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/bin/Debug/address.htm @@ -0,0 +1,17 @@ + + + + +

Bargain basement stake collection (all wooden). Make checks payable to:

+

Buffy Summers
+1630 Revello Drive
+Sunnydale, California
+U.S.A.

+
+
+
+
+No warranty expressed or implied. + + + diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/bin/Debug/blockquote.htm b/Pro Windows Forms 2.0/Chapter03/SplitWindow/bin/Debug/blockquote.htm new file mode 100644 index 0000000..45355e0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/bin/Debug/blockquote.htm @@ -0,0 +1,25 @@ + + + + +It was the best of times + + + +

Some words of wisdom from "A Tale of Two Cities":

+
+It was the best of times, it was the worst of times, it was the age of +wisdom, it was the age of foolishness, it was the epoch of belief, it was the +epoch of incredulity, it was the season of Light, it was the season of Darkness, +it was the spring of hope, it was the winter of despair, we had everything +before us, we had nothing before us, we were all going direct to Heaven, we were +all going direct the other way—in short, the period was so far like the present +period, that some of its noisiest authorities insisted on its being received, +for good or for evil, in the superlative degree of comparison only. +
+

It's amazing what you can fit into one sentence. Typing that much in +one go can seriously tire the wrist. Did they have carpal tunnel syndrome +in the nineteenth century?

+ + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/SplitWindow/blockquote.htm b/Pro Windows Forms 2.0/Chapter03/SplitWindow/blockquote.htm new file mode 100644 index 0000000..45355e0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/SplitWindow/blockquote.htm @@ -0,0 +1,25 @@ + + + + +It was the best of times + + + +

Some words of wisdom from "A Tale of Two Cities":

+
+It was the best of times, it was the worst of times, it was the age of +wisdom, it was the age of foolishness, it was the epoch of belief, it was the +epoch of incredulity, it was the season of Light, it was the season of Darkness, +it was the spring of hope, it was the winter of despair, we had everything +before us, we had nothing before us, we were all going direct to Heaven, we were +all going direct the other way—in short, the period was so far like the present +period, that some of its noisiest authorities insisted on its being received, +for good or for evil, in the superlative degree of comparison only. +
+

It's amazing what you can fit into one sentence. Typing that much in +one go can seriously tire the wrist. Did they have carpal tunnel syndrome +in the nineteenth century?

+ + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Holes.Designer.cs b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Holes.Designer.cs new file mode 100644 index 0000000..f995ee7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Holes.Designer.cs @@ -0,0 +1,108 @@ +namespace TransparentForm +{ + partial class Holes + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.PictureBox4 = new System.Windows.Forms.PictureBox(); + this.PictureBox2 = new System.Windows.Forms.PictureBox(); + this.PictureBox1 = new System.Windows.Forms.PictureBox(); + this.PictureBox3 = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.PictureBox4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.PictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.PictureBox3)).BeginInit(); + this.SuspendLayout(); + // + // PictureBox4 + // + this.PictureBox4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + this.PictureBox4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.PictureBox4.Location = new System.Drawing.Point(156, 141); + this.PictureBox4.Name = "PictureBox4"; + this.PictureBox4.Size = new System.Drawing.Size(76, 76); + this.PictureBox4.TabIndex = 14; + this.PictureBox4.TabStop = false; + // + // PictureBox2 + // + this.PictureBox2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + this.PictureBox2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.PictureBox2.Location = new System.Drawing.Point(60, 141); + this.PictureBox2.Name = "PictureBox2"; + this.PictureBox2.Size = new System.Drawing.Size(76, 76); + this.PictureBox2.TabIndex = 13; + this.PictureBox2.TabStop = false; + // + // PictureBox1 + // + this.PictureBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + this.PictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.PictureBox1.Location = new System.Drawing.Point(156, 49); + this.PictureBox1.Name = "PictureBox1"; + this.PictureBox1.Size = new System.Drawing.Size(76, 76); + this.PictureBox1.TabIndex = 12; + this.PictureBox1.TabStop = false; + // + // PictureBox3 + // + this.PictureBox3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + this.PictureBox3.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.PictureBox3.Location = new System.Drawing.Point(60, 49); + this.PictureBox3.Name = "PictureBox3"; + this.PictureBox3.Size = new System.Drawing.Size(76, 76); + this.PictureBox3.TabIndex = 11; + this.PictureBox3.TabStop = false; + // + // Holes + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.PictureBox4); + this.Controls.Add(this.PictureBox2); + this.Controls.Add(this.PictureBox1); + this.Controls.Add(this.PictureBox3); + this.Name = "Holes"; + this.Text = "Holes"; + this.TransparencyKey = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); + ((System.ComponentModel.ISupportInitialize)(this.PictureBox4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.PictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.PictureBox3)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox PictureBox4; + private System.Windows.Forms.PictureBox PictureBox2; + private System.Windows.Forms.PictureBox PictureBox1; + private System.Windows.Forms.PictureBox PictureBox3; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Holes.cs b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Holes.cs new file mode 100644 index 0000000..3bdbc2d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Holes.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace TransparentForm +{ + public partial class Holes : Form + { + public Holes() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Holes.resx b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Holes.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Holes.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Menu.cs b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Menu.cs new file mode 100644 index 0000000..f8857b6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace TransparentForm +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("TransparentForm." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Menu.designer.cs new file mode 100644 index 0000000..20a924f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Menu.designer.cs @@ -0,0 +1,74 @@ +namespace TransparentForm +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(167, 23); + this.button1.TabIndex = 0; + this.button1.Text = "Holes"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(167, 23); + this.button2.TabIndex = 1; + this.button2.Text = "Transparent"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(197, 215); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Menu.resx b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Program.cs b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Program.cs new file mode 100644 index 0000000..4d67bec --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace TransparentForm +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2900ad9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("TransparentForm")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TransparentForm")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5ed4eb63-facb-47a6-9f8a-14642a5be897")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Resources.Designer.cs new file mode 100644 index 0000000..83f1bed --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TransparentForm.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TransparentForm.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TransparentForm.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace TransparentForm.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TransparentForm.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Settings.Designer.cs new file mode 100644 index 0000000..762a040 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TransparentForm.Properties.Settings.get_Default():TransparentForm.Properties.Settings")] + +namespace TransparentForm.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Transparent.Designer.cs b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Transparent.Designer.cs new file mode 100644 index 0000000..994bb43 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Transparent.Designer.cs @@ -0,0 +1,107 @@ +namespace TransparentForm +{ + partial class Transparent + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.cmdApply = new System.Windows.Forms.Button(); + this.udOpacity = new System.Windows.Forms.NumericUpDown(); + this.Label1 = new System.Windows.Forms.Label(); + this.GroupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.udOpacity)).BeginInit(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Controls.Add(this.cmdApply); + this.GroupBox1.Controls.Add(this.udOpacity); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Location = new System.Drawing.Point(12, 89); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(268, 116); + this.GroupBox1.TabIndex = 5; + this.GroupBox1.TabStop = false; + // + // cmdApply + // + this.cmdApply.Location = new System.Drawing.Point(172, 64); + this.cmdApply.Name = "cmdApply"; + this.cmdApply.Size = new System.Drawing.Size(80, 24); + this.cmdApply.TabIndex = 5; + this.cmdApply.Text = "Apply"; + this.cmdApply.Click += new System.EventHandler(this.cmdApply_Click); + // + // udOpacity + // + this.udOpacity.Increment = new decimal(new int[] { + 5, + 0, + 0, + 0}); + this.udOpacity.Location = new System.Drawing.Point(88, 32); + this.udOpacity.Name = "udOpacity"; + this.udOpacity.Size = new System.Drawing.Size(48, 21); + this.udOpacity.TabIndex = 4; + this.udOpacity.Value = new decimal(new int[] { + 50, + 0, + 0, + 0}); + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(20, 36); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(56, 16); + this.Label1.TabIndex = 3; + this.Label1.Text = "Opacity:"; + // + // Transparent + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(309, 289); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Transparent"; + this.Text = "Transparent"; + this.GroupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.udOpacity)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Button cmdApply; + private System.Windows.Forms.NumericUpDown udOpacity; + private System.Windows.Forms.Label Label1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Transparent.cs b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Transparent.cs new file mode 100644 index 0000000..7df37c0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Transparent.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace TransparentForm +{ + public partial class Transparent : Form + { + public Transparent() + { + InitializeComponent(); + } + + private void cmdApply_Click(object sender, EventArgs e) + { + this.Opacity = (double)udOpacity.Value / 100; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/Transparent.resx b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Transparent.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/Transparent.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.csproj b/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.csproj new file mode 100644 index 0000000..af278dc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.csproj @@ -0,0 +1,89 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {84F8196C-228D-4C60-B04A-679B691B2CC8} + WinExe + Properties + TransparentForm + TransparentForm + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Holes.cs + + + Form + + + Menu.cs + + + Form + + + Transparent.cs + + + + + Holes.cs + + + Menu.cs + Designer + + + Transparent.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.csproj.user b/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.sln b/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.sln new file mode 100644 index 0000000..2d25183 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TransparentForm", "TransparentForm.csproj", "{84F8196C-228D-4C60-B04A-679B691B2CC8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {84F8196C-228D-4C60-B04A-679B691B2CC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84F8196C-228D-4C60-B04A-679B691B2CC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84F8196C-228D-4C60-B04A-679B691B2CC8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84F8196C-228D-4C60-B04A-679B691B2CC8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.suo b/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.suo new file mode 100644 index 0000000..2558665 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/TransparentForm/TransparentForm.suo differ diff --git a/Pro Windows Forms 2.0/Chapter03/TransparentForm/bin/Debug/TransparentForm.exe b/Pro Windows Forms 2.0/Chapter03/TransparentForm/bin/Debug/TransparentForm.exe new file mode 100644 index 0000000..d47615b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter03/TransparentForm/bin/Debug/TransparentForm.exe differ diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.csproj b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.csproj new file mode 100644 index 0000000..8164cd0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.csproj @@ -0,0 +1,79 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {F9455FF4-41BA-4303-ABEF-330B74C1F55A} + WinExe + Properties + AuthenticDragAndDrop + AuthenticDragAndDrop + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + DrawingArea.cs + + + Form + + + Palette.cs + + + + + DrawingArea.cs + + + Palette.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.csproj.user b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.sln b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.sln new file mode 100644 index 0000000..afcdc18 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AuthenticDragAndDrop", "AuthenticDragAndDrop.csproj", "{F9455FF4-41BA-4303-ABEF-330B74C1F55A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F9455FF4-41BA-4303-ABEF-330B74C1F55A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F9455FF4-41BA-4303-ABEF-330B74C1F55A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F9455FF4-41BA-4303-ABEF-330B74C1F55A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F9455FF4-41BA-4303-ABEF-330B74C1F55A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.suo b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.suo new file mode 100644 index 0000000..db168b9 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/AuthenticDragAndDrop.suo differ diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/DrawingArea.Designer.cs b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/DrawingArea.Designer.cs new file mode 100644 index 0000000..1c16997 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/DrawingArea.Designer.cs @@ -0,0 +1,68 @@ +namespace AuthenticDragAndDrop +{ + partial class DrawingArea + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.picDrawingArea = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.picDrawingArea)).BeginInit(); + this.SuspendLayout(); + // + // picDrawingArea + // + this.picDrawingArea.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.picDrawingArea.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.picDrawingArea.Location = new System.Drawing.Point(1, 2); + this.picDrawingArea.Name = "picDrawingArea"; + this.picDrawingArea.Size = new System.Drawing.Size(377, 270); + this.picDrawingArea.TabIndex = 2; + this.picDrawingArea.TabStop = false; + this.picDrawingArea.DragDrop += new System.Windows.Forms.DragEventHandler(this.picDrawingArea_DragDrop); + this.picDrawingArea.DragEnter += new System.Windows.Forms.DragEventHandler(this.picDrawingArea_DragEnter); + // + // DrawingArea + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(379, 274); + this.Controls.Add(this.picDrawingArea); + this.Name = "DrawingArea"; + this.Text = "Drawing Area"; + this.Load += new System.EventHandler(this.DrawingArea_Load); + ((System.ComponentModel.ISupportInitialize)(this.picDrawingArea)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox picDrawingArea; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/DrawingArea.cs b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/DrawingArea.cs new file mode 100644 index 0000000..7cadf37 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/DrawingArea.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace AuthenticDragAndDrop +{ + public partial class DrawingArea : Form + { + public DrawingArea() + { + InitializeComponent(); + } + + private void DrawingArea_Load(object sender, EventArgs e) + { + Palette frmTool = new Palette(); + this.AddOwnedForm(frmTool); + frmTool.Show(); + picDrawingArea.AllowDrop = true; + } + + private void picDrawingArea_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.Bitmap)) + { + e.Effect = DragDropEffects.Copy; + } + else + { + e.Effect = DragDropEffects.None; + } + } + + private void picDrawingArea_DragDrop(object sender, DragEventArgs e) + { + Graphics g = picDrawingArea.CreateGraphics(); + g.DrawImage((Image)e.Data.GetData(DataFormats.Bitmap), + new Point(e.X - this.Left - 12, e.Y - this.Top - 30)); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/DrawingArea.resx b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/DrawingArea.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/DrawingArea.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Palette.Designer.cs b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Palette.Designer.cs new file mode 100644 index 0000000..6fb497a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Palette.Designer.cs @@ -0,0 +1,102 @@ +namespace AuthenticDragAndDrop +{ + partial class Palette + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Palette)); + this.images = new System.Windows.Forms.ImageList(this.components); + this.lblPictureThree = new System.Windows.Forms.Label(); + this.lblPictureTwo = new System.Windows.Forms.Label(); + this.lblPictureOne = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // images + // + this.images.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("images.ImageStream"))); + this.images.Images.SetKeyName(0, ""); + this.images.Images.SetKeyName(1, ""); + this.images.Images.SetKeyName(2, ""); + // + // lblPictureThree + // + this.lblPictureThree.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lblPictureThree.ImageIndex = 2; + this.lblPictureThree.ImageList = this.images; + this.lblPictureThree.Location = new System.Drawing.Point(12, 113); + this.lblPictureThree.Name = "lblPictureThree"; + this.lblPictureThree.Size = new System.Drawing.Size(56, 48); + this.lblPictureThree.TabIndex = 6; + this.lblPictureThree.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbl_MouseDown); + // + // lblPictureTwo + // + this.lblPictureTwo.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lblPictureTwo.ImageIndex = 1; + this.lblPictureTwo.ImageList = this.images; + this.lblPictureTwo.Location = new System.Drawing.Point(12, 61); + this.lblPictureTwo.Name = "lblPictureTwo"; + this.lblPictureTwo.Size = new System.Drawing.Size(56, 48); + this.lblPictureTwo.TabIndex = 5; + this.lblPictureTwo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbl_MouseDown); + // + // lblPictureOne + // + this.lblPictureOne.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lblPictureOne.ImageIndex = 0; + this.lblPictureOne.ImageList = this.images; + this.lblPictureOne.Location = new System.Drawing.Point(12, 9); + this.lblPictureOne.Name = "lblPictureOne"; + this.lblPictureOne.Size = new System.Drawing.Size(56, 48); + this.lblPictureOne.TabIndex = 4; + this.lblPictureOne.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lbl_MouseDown); + // + // Palette + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(83, 173); + this.Controls.Add(this.lblPictureTwo); + this.Controls.Add(this.lblPictureOne); + this.Controls.Add(this.lblPictureThree); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "Palette"; + this.ShowInTaskbar = false; + this.Text = "Palette"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ImageList images; + private System.Windows.Forms.Label lblPictureThree; + private System.Windows.Forms.Label lblPictureTwo; + private System.Windows.Forms.Label lblPictureOne; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Palette.cs b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Palette.cs new file mode 100644 index 0000000..56f9f76 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Palette.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace AuthenticDragAndDrop +{ + public partial class Palette : Form + { + public Palette() + { + InitializeComponent(); + } + + private void lbl_MouseDown(object sender, MouseEventArgs e) + { + Label lbl = (Label)sender; + lbl.DoDragDrop(lbl.Image, DragDropEffects.Copy); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Palette.resx b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Palette.resx new file mode 100644 index 0000000..25c5096 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Palette.resx @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADW + CQAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wIABT4BAAM+AQw1AAE+ + ASMBKgIwASMBPgSNAQwJAAbDCwAEARYAAT4BIwEwAnkB5QEMAQcBtgEHAY0BDAcACsMIAAEBBJQBARUA + AT4BIwEqAXkB5QEaAeUBjQG1AbYBjQEMBwACwwEDBAABAwLDCAAGARYAAT4BIwEqATACkwEMAY0BtQGN + AQwGAALDAQMBAATDAQABAwLDBwABAQTvAQEXAAI+ASoBkwF0AXMBEQIMAY0DDAMAAsMBAAbDAQACwwYA + AQEB7wT/AewBARgAAT4BKgFzAUMBDgE+AQwEjQEMAgACwwEABsMBAALDBQABAQHvBP8B7AH/Ae8BARgA + A2ABPwEOAW0BjQG1AbYBjQEMAgAMwwUAAQEB7wH/Au8B7AL/Ae8CARQAA2ACAAFgAT4BQwFzAQwBtgEH + AY0BDAIAA8MCAALDAgADwwUAAQEB/wMAAe8C/wHvAQEBlBkAAWABPgFzAXQBcwEMAY0BDAMAA8MCAALD + AgADwwUAAQEB7wL/AQAB7wL/Ae8BARkAAWABAAE+AXQBHAGZAeUBHgEMBAACwwIAAsMCAALDBwABAQHv + Af8BAAHvAf8B7wEBGgABYAEAAT4BIwF0AeUBmQEjAQwEAArDCAABAQTvAQEbAAFgAgABPgEwAnkBMAEM + BgAGwwoABgEeAAE+ASMCMAEqAQwWAAEBBJQBAR8AAT4BIwEqASMBDBcABAEhAAE+ASMBDDIAAUIBTQE+ + BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAGCAR8B+AEfAv8DAAEPAeABBwH8AT8DAAEP + AcABAwH4AR8DAAEPAcABAwH4AR8CAAGAAQ8BgAEBAfgBHwIAAcABAQGAAQEB8AEPAgAB8AEAAYABAQHg + AQcCAAH4AQABgAEBAeABAwIAAcYBAAGAAQEB4AEDAgAB/gEBAYABAQHgAQcCAAH9AQEBwAEDAfABDwIA + Af0BAQHAAQMB+AEfAgAB/QGBAeABBwH4AR8CAAH/AYEB+AEfAfgBHwIAAf8BwQL/AfwBPwIAAf8B4wT/ + AgAL + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Program.cs b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Program.cs new file mode 100644 index 0000000..e731546 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace AuthenticDragAndDrop +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new DrawingArea()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d633f1c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AuthenticDragAndDrop")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AuthenticDragAndDrop")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9ed1080a-c4ff-40d5-907e-95197d0cc3c2")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Resources.Designer.cs new file mode 100644 index 0000000..c361a7f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AuthenticDragAndDrop.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AuthenticDragAndDrop.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AuthenticDragAndDrop.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace AuthenticDragAndDrop.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AuthenticDragAndDrop.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Settings.Designer.cs new file mode 100644 index 0000000..09434dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AuthenticDragAndDrop.Properties.Settings.get_Default():AuthenticDragAndDrop.Properties.Settings")] + +namespace AuthenticDragAndDrop.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/bin/Debug/AuthenticDragAndDrop.exe b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/bin/Debug/AuthenticDragAndDrop.exe new file mode 100644 index 0000000..a7327d3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/AuthenticDragAndDrop/bin/Debug/AuthenticDragAndDrop.exe differ diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.csproj b/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.csproj new file mode 100644 index 0000000..7f08284 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.csproj @@ -0,0 +1,61 @@ + + + Debug + AnyCPU + 8.0.40607 + 2.0 + {60EB0064-9A08-4091-8E26-1B8BEF8E6143} + WinExe + AutoComplete + AutoComplete + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + Form + + + Form1.cs + + + + + ResXFileCodeGenerator + Resources.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.csproj.user b/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.csproj.user new file mode 100644 index 0000000..97a12b8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.csproj.user @@ -0,0 +1,7 @@ + + + 8.0.40607 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.sln b/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.sln new file mode 100644 index 0000000..1303bae --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoComplete", "AutoComplete.csproj", "{60EB0064-9A08-4091-8E26-1B8BEF8E6143}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {60EB0064-9A08-4091-8E26-1B8BEF8E6143}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60EB0064-9A08-4091-8E26-1B8BEF8E6143}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60EB0064-9A08-4091-8E26-1B8BEF8E6143}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60EB0064-9A08-4091-8E26-1B8BEF8E6143}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.suo b/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.suo new file mode 100644 index 0000000..087961b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/AutoComplete/AutoComplete.suo differ diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Form1.Designer.cs new file mode 100644 index 0000000..7b0cc6c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Form1.Designer.cs @@ -0,0 +1,72 @@ +namespace AutoComplete +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.lstColors = new System.Windows.Forms.ComboBox(); + this.toolTip2 = new System.Windows.Forms.ToolTip(this.components); + this.SuspendLayout(); +// +// lstColors +// + this.lstColors.AutoCompleteMode = ((System.Windows.Forms.AutoCompleteMode)((System.Windows.Forms.AutoCompleteMode.Suggest | System.Windows.Forms.AutoCompleteMode.Append))); + this.lstColors.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.lstColors.FormattingEnabled = true; + this.lstColors.Location = new System.Drawing.Point(13, 13); + this.lstColors.Name = "lstColors"; + this.lstColors.Size = new System.Drawing.Size(267, 21); + this.lstColors.TabIndex = 0; + this.toolTip2.SetToolTip(this.lstColors, "kljkllklj"); +// +// toolTip2 +// + this.toolTip2.IsBalloon = true; + this.toolTip2.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; +// +// Form1 +// + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(296, 82); + this.Controls.Add(this.lstColors); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "AutoComplete"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ComboBox lstColors; + private System.Windows.Forms.ToolTip toolTip2; + + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/Form1.cs b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Form1.cs new file mode 100644 index 0000000..3b8389a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Form1.cs @@ -0,0 +1,30 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Windows.Forms; + +#endregion + +namespace AutoComplete +{ + partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + string[] colorNames; + colorNames = System.Enum.GetNames(typeof(KnownColor)); + + lstColors.Items.AddRange(colorNames); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/Program.cs b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Program.cs new file mode 100644 index 0000000..a324e5c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Program.cs @@ -0,0 +1,24 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +#endregion + +namespace AutoComplete +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4e0b4e3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AutoComplete")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AutoComplete")] +[assembly: AssemblyCopyright("Copyright @ 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Resources.cs new file mode 100644 index 0000000..1fc285d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Resources.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AutoComplete.Properties +{ + using System; + using System.IO; + using System.Resources; + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources + { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager + { + get + { + if ((_resMgr == null)) + { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture + { + get + { + return _resCulture; + } + set + { + _resCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Settings.cs new file mode 100644 index 0000000..641c958 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Settings.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AutoComplete.Properties +{ + public partial class Settings : System.Configuration.ApplicationSettingsBase + { + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + public static Settings Value + { + get + { + if ((Settings.m_Value == null)) + { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) + { + try + { + Settings.m_Value = new Settings(); + } + finally + { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Settings.settings new file mode 100644 index 0000000..4024694 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/AutoComplete/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/AutoComplete/bin/Debug/AutoComplete.exe b/Pro Windows Forms 2.0/Chapter04/AutoComplete/bin/Debug/AutoComplete.exe new file mode 100644 index 0000000..0260671 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/AutoComplete/bin/Debug/AutoComplete.exe differ diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.csproj b/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.csproj new file mode 100644 index 0000000..376bd1b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {9185D896-0A04-476A-A809-BC931A1B3F92} + WinExe + Properties + DateControls + DateControls + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.csproj.user b/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.sln b/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.sln new file mode 100644 index 0000000..7c0bb07 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DateControls", "DateControls.csproj", "{9185D896-0A04-476A-A809-BC931A1B3F92}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9185D896-0A04-476A-A809-BC931A1B3F92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9185D896-0A04-476A-A809-BC931A1B3F92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9185D896-0A04-476A-A809-BC931A1B3F92}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9185D896-0A04-476A-A809-BC931A1B3F92}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.suo b/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.suo new file mode 100644 index 0000000..42e7d4b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/DateControls/DateControls.suo differ diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter04/DateControls/Form1.Designer.cs new file mode 100644 index 0000000..68ba102 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/Form1.Designer.cs @@ -0,0 +1,143 @@ +namespace DateControls +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dateTimePicker1 = new System.Windows.Forms.DateTimePicker(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.dateTimePicker2 = new System.Windows.Forms.DateTimePicker(); + this.dateTimePicker3 = new System.Windows.Forms.DateTimePicker(); + this.dateTimePicker4 = new System.Windows.Forms.DateTimePicker(); + this.SuspendLayout(); + // + // dateTimePicker1 + // + this.dateTimePicker1.Location = new System.Drawing.Point(92, 15); + this.dateTimePicker1.Name = "dateTimePicker1"; + this.dateTimePicker1.Size = new System.Drawing.Size(200, 21); + this.dateTimePicker1.TabIndex = 0; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 19); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(30, 13); + this.label1.TabIndex = 2; + this.label1.Text = "Long:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 54); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(33, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Short:"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 92); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(29, 13); + this.label3.TabIndex = 4; + this.label3.Text = "Time:"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(12, 128); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(64, 13); + this.label4.TabIndex = 5; + this.label4.Text = "Custom ISO:"; + // + // dateTimePicker2 + // + this.dateTimePicker2.Format = System.Windows.Forms.DateTimePickerFormat.Short; + this.dateTimePicker2.Location = new System.Drawing.Point(92, 50); + this.dateTimePicker2.Name = "dateTimePicker2"; + this.dateTimePicker2.Size = new System.Drawing.Size(200, 21); + this.dateTimePicker2.TabIndex = 6; + // + // dateTimePicker3 + // + this.dateTimePicker3.Format = System.Windows.Forms.DateTimePickerFormat.Time; + this.dateTimePicker3.Location = new System.Drawing.Point(92, 88); + this.dateTimePicker3.Name = "dateTimePicker3"; + this.dateTimePicker3.Size = new System.Drawing.Size(200, 21); + this.dateTimePicker3.TabIndex = 7; + // + // dateTimePicker4 + // + this.dateTimePicker4.CustomFormat = "yyyy-mm-dd"; + this.dateTimePicker4.Format = System.Windows.Forms.DateTimePickerFormat.Custom; + this.dateTimePicker4.Location = new System.Drawing.Point(92, 124); + this.dateTimePicker4.Name = "dateTimePicker4"; + this.dateTimePicker4.Size = new System.Drawing.Size(200, 21); + this.dateTimePicker4.TabIndex = 8; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(348, 192); + this.Controls.Add(this.dateTimePicker4); + this.Controls.Add(this.dateTimePicker3); + this.Controls.Add(this.dateTimePicker2); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.dateTimePicker1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Date Controls"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.DateTimePicker dateTimePicker1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.DateTimePicker dateTimePicker2; + private System.Windows.Forms.DateTimePicker dateTimePicker3; + private System.Windows.Forms.DateTimePicker dateTimePicker4; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/Form1.cs b/Pro Windows Forms 2.0/Chapter04/DateControls/Form1.cs new file mode 100644 index 0000000..df94b70 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/Form1.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Threading; +using System.Globalization; + +namespace DateControls +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/Form1.resx b/Pro Windows Forms 2.0/Chapter04/DateControls/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/Program.cs b/Pro Windows Forms 2.0/Chapter04/DateControls/Program.cs new file mode 100644 index 0000000..fb049ab --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DateControls +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..575486a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DateControls")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DateControls")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a89f7c0e-9774-410c-8e41-51be3bddff1f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Resources.Designer.cs new file mode 100644 index 0000000..9d1c3ef --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DateControls.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DateControls.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DateControls.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace DateControls.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DateControls.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Settings.Designer.cs new file mode 100644 index 0000000..67702e3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DateControls.Properties.Settings.get_Default():DateControls.Properties.Settings")] + +namespace DateControls.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/DateControls/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter04/DateControls/bin/Debug/DateControls.exe b/Pro Windows Forms 2.0/Chapter04/DateControls/bin/Debug/DateControls.exe new file mode 100644 index 0000000..68ded90 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/DateControls/bin/Debug/DateControls.exe differ diff --git a/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/App.ico b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/FakeDragAndDrop.csproj b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/FakeDragAndDrop.csproj new file mode 100644 index 0000000..2a95a59 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/FakeDragAndDrop.csproj @@ -0,0 +1,98 @@ + + + Local + 8.0.50215 + 2.0 + {9754B34A-6857-4806-87A9-FDCD14383970} + Debug + AnyCPU + App.ico + + + FakeDragAndDrop + + + JScript + Grid + IE50 + false + WinExe + FakeDragAndDrop + + + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + + + System.Data + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + + + Form + + + Form1.cs + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/FakeDragAndDrop.sln b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/FakeDragAndDrop.sln new file mode 100644 index 0000000..0aeb1fa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/FakeDragAndDrop.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FakeDragAndDrop", "FakeDragAndDrop.csproj", "{9754B34A-6857-4806-87A9-FDCD14383970}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9754B34A-6857-4806-87A9-FDCD14383970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9754B34A-6857-4806-87A9-FDCD14383970}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9754B34A-6857-4806-87A9-FDCD14383970}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9754B34A-6857-4806-87A9-FDCD14383970}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/FakeDragAndDrop.suo b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/FakeDragAndDrop.suo new file mode 100644 index 0000000..91fb082 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/FakeDragAndDrop.suo differ diff --git a/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/Form1.cs b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/Form1.cs new file mode 100644 index 0000000..ce66f67 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/Form1.cs @@ -0,0 +1,132 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +namespace FakeDragAndDrop +{ + /// + /// Summary description for Form1. + /// + public class Form1 : System.Windows.Forms.Form + { + internal System.Windows.Forms.Label lblDragger; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1)); + this.lblDragger = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblDragger + // + this.lblDragger.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lblDragger.Image = ((System.Drawing.Bitmap)(resources.GetObject("lblDragger.Image"))); + this.lblDragger.Location = new System.Drawing.Point(110, 105); + this.lblDragger.Name = "lblDragger"; + this.lblDragger.Size = new System.Drawing.Size(72, 56); + this.lblDragger.TabIndex = 2; + this.lblDragger.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lblDragger_MouseUp); + this.lblDragger.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lblDragger_MouseMove); + this.lblDragger.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lblDragger_MouseDown); + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.lblDragger}); + this.Name = "Form1"; + this.Text = "Fake Drag And Drop"; + this.ResumeLayout(false); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.Run(new Form1()); + } + + // Keep track of when fake "drag and drop" mode is enabled. + private bool isDragging = false; + + // Store the location where the user clicked the control. + private int clickOffsetX, clickOffsetY; + + // Start dragging. + private void lblDragger_MouseDown(System.Object sender, + System.Windows.Forms.MouseEventArgs e) + { + isDragging = true; + clickOffsetX = e.X; + clickOffsetY = e.Y; + } + + // End dragging. + private void lblDragger_MouseUp(System.Object sender, + System.Windows.Forms.MouseEventArgs e) + { + isDragging = false; + } + + // Move the control (during dragging). + private void lblDragger_MouseMove(System.Object sender, + System.Windows.Forms.MouseEventArgs e) + { + if (isDragging == true) + { + // The control coordinates are converted into form coordinates + // by adding the label position offset. + // The offset where the user clicked in the control is also + // accounted for. Otherwise, it looks like the top-left corner + // of the label is attached to the mouse. + lblDragger.Left = e.X + lblDragger.Left - clickOffsetX; + lblDragger.Top = e.Y + lblDragger.Top - clickOffsetY; + } + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/Form1.resx b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/Form1.resx new file mode 100644 index 0000000..9f5b8b6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/Form1.resx @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAHtJREFUOE/Nk1EO + wCAIQz26V9oJ2XSDAFK7j33MxA81fTQFW/vrkstYtanfKRI5yu2gJQgKM/ABLRADaCUVgnMAhOoMMMDZ + xbcAFKK/hw5YF1IulkMIcNdGCuj9HqCqdeMNAYYVe1SIn0YmDgAWIhqkCWEh7sR+sl5/phMfVa5qBsOl + WQAAAABJRU5ErkJggg== + + + + Form1 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/bin/Debug/FakeDragAndDrop.exe b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/bin/Debug/FakeDragAndDrop.exe new file mode 100644 index 0000000..245b88c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/FakeDragAndDrop/bin/Debug/FakeDragAndDrop.exe differ diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileList.Designer.cs b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileList.Designer.cs new file mode 100644 index 0000000..fe0a17a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileList.Designer.cs @@ -0,0 +1,78 @@ +namespace FileWatcher +{ + partial class FileList + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.lstFiles = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Anchor = System.Windows.Forms.AnchorStyles.Bottom; + this.button1.DialogResult = System.Windows.Forms.DialogResult.OK; + this.button1.Location = new System.Drawing.Point(106, 231); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "Close"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // lstFiles + // + this.lstFiles.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstFiles.FormattingEnabled = true; + this.lstFiles.IntegralHeight = false; + this.lstFiles.Location = new System.Drawing.Point(10, 12); + this.lstFiles.Name = "lstFiles"; + this.lstFiles.Size = new System.Drawing.Size(268, 210); + this.lstFiles.TabIndex = 1; + // + // FileList + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.lstFiles); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "FileList"; + this.Text = "FileList"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ListBox lstFiles; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileList.cs b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileList.cs new file mode 100644 index 0000000..7fa7df3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileList.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace FileWatcher +{ + public partial class FileList : Form + { + public FileList() + { + InitializeComponent(); + } + + + public void FillList(List list) + { + lstFiles.DataSource = list; + } + + private void button1_Click(object sender, EventArgs e) + { + Close(); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileList.resx b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileList.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileList.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.Designer.cs b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.Designer.cs new file mode 100644 index 0000000..e4ff6c2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.Designer.cs @@ -0,0 +1,87 @@ +namespace FileWatcher +{ + partial class FileSystemTray + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FileSystemTray)); + this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.cmdShowFiles = new System.Windows.Forms.ToolStripMenuItem(); + this.cmdExit = new System.Windows.Forms.ToolStripMenuItem(); + this.fileSystemWatcher1 = new System.IO.FileSystemWatcher(); + this.contextMenuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).BeginInit(); + // + // notifyIcon1 + // + this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1; + this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon"))); + this.notifyIcon1.Text = "My .NET Application"; + this.notifyIcon1.Visible = true; + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cmdShowFiles, + this.cmdExit}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(104, 26); + // + // cmdShowFiles + // + this.cmdShowFiles.Name = "cmdShowFiles"; + this.cmdShowFiles.Size = new System.Drawing.Size(135, 22); + this.cmdShowFiles.Text = "Show Files"; + // + // cmdExit + // + this.cmdExit.Name = "cmdExit"; + this.cmdExit.Size = new System.Drawing.Size(103, 22); + this.cmdExit.Text = "Exit"; + // + // fileSystemWatcher1 + // + this.fileSystemWatcher1.EnableRaisingEvents = true; + this.fileSystemWatcher1.IncludeSubdirectories = true; + this.fileSystemWatcher1.Path = "c:\\"; + this.fileSystemWatcher1.Created += new System.IO.FileSystemEventHandler(this.fileSystemWatcher_Changed); + this.contextMenuStrip1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.fileSystemWatcher1)).EndInit(); + + } + + #endregion + + private System.Windows.Forms.NotifyIcon notifyIcon1; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem cmdExit; + private System.Windows.Forms.ToolStripMenuItem cmdShowFiles; + private System.IO.FileSystemWatcher fileSystemWatcher1; + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.cs b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.cs new file mode 100644 index 0000000..6317283 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.cs @@ -0,0 +1,53 @@ +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Windows.Forms; + +namespace FileWatcher +{ + public partial class FileSystemTray : Component + { + public FileSystemTray() + { + Initialize(); + } + + public FileSystemTray(IContainer container) + { + container.Add(this); + + Initialize(); + } + + public void Initialize() + { + InitializeComponent(); + cmdExit.Click += new EventHandler(cmdExit_Click); + cmdShowFiles.Click += new EventHandler(cmdShowFiles_Click); + } + + private List newFiles = new List(); + + private void fileSystemWatcher_Changed(object sender, System.IO.FileSystemEventArgs e) + { + newFiles.Add(e.Name); + } + + private void cmdExit_Click(object sender, System.EventArgs e) + { + // Make sure the icon disappears promptly. + this.Dispose(); + + Application.Exit(); + } + + private void cmdShowFiles_Click(object sender, System.EventArgs e) + { + FileList frmFileList = new FileList(); + frmFileList.FillList(newFiles); + frmFileList.Show(); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.csproj b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.csproj new file mode 100644 index 0000000..9c1e377 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.csproj @@ -0,0 +1,88 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {A247A06F-3393-4F61-B4A7-0B749B2B67FB} + WinExe + Properties + FileWatcher + FileWatcher + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Component + + + FileWatcher.cs + + + Form + + + FileList.cs + + + + + Designer + FileWatcher.cs + + + Designer + FileList.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.resx b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.resx new file mode 100644 index 0000000..f093bea --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.resx @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 54 + + + 17, 91 + + + + + AAABAAEAICAAAAEACACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAgAQAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAC9KAAgwSwAbNkoAMj9KAB47TAAAAwkAdOX/AMf8/wDM//8Ayv//AM3//wAQWoQAADVfAABj + pgAcdrYAPYzCAAIhNQAAcbIA7f//AI///wCI//8Ahf//AK3//wC+8f8AeOD/AIfp/wCz//8A0f//ANr/ + /wDc//8Alf//AAswTQBymLYAt///AIn//wCO//8Ajf//AKT//wCv//8Ao///AJf//wCK//8Abvf/AAAc + OQCEn7QArv//AIv//wCQ//8Ac/j/AG7k/wB+6/8Affj/AGq99wBCqNsAlOv/AMD8/wCh7f8AAB83AFeM + tACd//8Akf//AHji/wBy0v8AzeT/AM7n/wDm8P8A2PD/APL8/wD///8Ah7fVAAAAAgBEibQAndv/AILJ + /wCByf8AYLz/AHzH/wBswf8AcsH/AILI/wDI//8Ay///AK7v/wDG7P8A7P7/APj//wAALFsAS4y0AJbd + /wBmxP8ASbj/AKfa/wDU6/8Ax/D/ANH7/wDT//8AtP//ALH//wCg7/8AvfD/AOP//wB16f8AIHq0AJDb + /wBbv/8Aotr/AKH//wCl//8Apv//AKn//wCL6f8As+r/ANL//wAjZ3IADXK0AJje/wAmqf8A0fT/AJr/ + /wCM//8Aeun/AKnv/wCW6PUAABQoABJ1tgCG1/8AQbP/AIT//wB+6f8AFWWfAAIAAAAAZqEAeNL/AJHR + /wC1//8AifT/AG/j/wAAGjQAAFqNAGPK/wC+5/8Ahs3/AI7O/wCPz/8AlNH/AJrU/wCM0v8Ah9X/AF/H + /wAMhMYAAEp3AHjU/wCP1P8AlNb/AJbZ/wCY2/8AnuH/AI/e/wBazf8AMb//ABqQ0QAWaJoAAB4yAAAP + GgAAS3kAnOL/AMDo/wBaxf8AWcv/AEe08wA2pOcACHKxAABEbwAAHzYAAFeJAHXo/wA6tvoADHa0ABtO + bwAAFiYAABAdAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAljaqEq8NtAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACWNUM/qKuhlosNtAAAAAAAAAAAAAAAAAAAAAAAAAAAAJY2RRk/Pz8/ + n6o2loStrgAAAAAAAAAAAAAAAAAAAAAAlqpcehkZGRkZGRkZP6qroRKlAQAAAAAAAAAAAAAAAACWhTV2 + Pj4+Pj4+Pj4+Pj4+GamroRINAAAAAAAAAAAAAJaFNlaBgYGBgYGBgYGBgYGBgYGBP7IAAAAAAAAAAAAA + oYWrQVMaGhoaGhoaGhoaGhoaGho/qQEAAAAAAAAAAAA2hbFLX4iIiIiIiIiIiIiIiIiIiD88ogAAAAAA + AAAAADZ+qjZEMDAwMDAwMDAwMDAwMDAwP2I2tAAAAAAAAAAANn6oq0JuHx8fHx8fHx8fHx8fHx8/ImOX + AAAAAAAAAAA2fpWqmXF3d3d3d3d3d3d3d3d3dz9RUTakAAAAAAAAAGmTjIxpRBcoKCgoKCgoKCgoKCgo + mAsLew0AAAAAAAAAaVk/P6uZRRNlYAo4GxsbGxsbGxuYYGBgEAAAAAAAAABMphkZGaqrlUxLjUJWUjg4 + ODg4OJhlZWVoAQAAAAAAAFo3gYGBgYGBgT+fqjVFHRwcHBwcfhMTExNnAAAAAAAATTcaGhoaGhoaGhoa + MjVFVkQTZWV+VlZWVpO0AAAAAABJY4iIiIiIiIiIiIiIBzaMTEtcjUVFRUVFVYQAAAAAAFxuHx8fHx8f + Hx8fHx8fHx8fiDKfoX02NUuNlgAAAAAAXBd3d3d3d3d3d3d3d3d3d3d3d3c2AAAAAAAAAAAAAABNCXd3 + d3d3dyhfXzgiLjx3d3d3dzYAAAAAAAAAAAAAAKFCJnd3d3d3ZUY2Nk2OcEEeXwgnNgAAAAAAAAAAAAAA + AE1VZQo4YmCNlwAAAAAAlpY2NjU2AAAAAAAAAAAAAAAAljY2NUtcjaEAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP/////////////////////x////wB///8AB///AAB//wAAB/8AAAP/AAAB/wAAAf8AA + AD/AAAA/wAAAH8AAAB/AAAAPwAAAD8AAAA/AAAAHwAAAB8AAAAfAAAAHwAAA/8AAAP/AAAH/4A+B/+Af + //////////////////////// + + + + 23, 21 + + + False + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.sln b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.sln new file mode 100644 index 0000000..709ad32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileWatcher", "FileWatcher\FileWatcher.csproj", "{A247A06F-3393-4F61-B4A7-0B749B2B67FB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A247A06F-3393-4F61-B4A7-0B749B2B67FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A247A06F-3393-4F61-B4A7-0B749B2B67FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A247A06F-3393-4F61-B4A7-0B749B2B67FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A247A06F-3393-4F61-B4A7-0B749B2B67FB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.suo b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.suo new file mode 100644 index 0000000..65bb7ae Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/FileWatcher/FileWatcher.suo differ diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/Program.cs b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Program.cs new file mode 100644 index 0000000..c47dfbd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace FileWatcher +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + FileSystemTray cmp = new FileSystemTray(); + + Application.Run(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c38f818 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("FileWatcher")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("FileWatcher")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("431cadc0-9ecd-45d0-b4d3-bba2d6e1f2b8")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d64b327 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace FileWatcher.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FileWatcher.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Settings.Designer.cs new file mode 100644 index 0000000..4843c3e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace FileWatcher.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/FileWatcher/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter04/FileWatcher/bin/Debug/FileWatcher.exe b/Pro Windows Forms 2.0/Chapter04/FileWatcher/bin/Debug/FileWatcher.exe new file mode 100644 index 0000000..73c4883 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/FileWatcher/bin/Debug/FileWatcher.exe differ diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Form1.Designer.cs new file mode 100644 index 0000000..fc5bec8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Form1.Designer.cs @@ -0,0 +1,78 @@ +namespace LinkLabels +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lnkBuy = new System.Windows.Forms.LinkLabel(); + this.lnkWebSite = new System.Windows.Forms.LinkLabel(); + this.SuspendLayout(); + // + // lnkBuy + // + this.lnkBuy.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lnkBuy.LinkArea = new System.Windows.Forms.LinkArea(0, 0); + this.lnkBuy.Location = new System.Drawing.Point(45, 100); + this.lnkBuy.Name = "lnkBuy"; + this.lnkBuy.Size = new System.Drawing.Size(244, 48); + this.lnkBuy.TabIndex = 7; + this.lnkBuy.Text = "Buy it at Amazon.com or Barnes and Noble."; + this.lnkBuy.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkWebSite_Clicked); + // + // lnkWebSite + // + this.lnkWebSite.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lnkWebSite.LinkArea = new System.Windows.Forms.LinkArea(0, 0); + this.lnkWebSite.Location = new System.Drawing.Point(45, 56); + this.lnkWebSite.Name = "lnkWebSite"; + this.lnkWebSite.Size = new System.Drawing.Size(248, 36); + this.lnkWebSite.TabIndex = 6; + this.lnkWebSite.Text = "See www.prosetech.com for more information."; + this.lnkWebSite.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkWebSite_Clicked); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(338, 204); + this.Controls.Add(this.lnkBuy); + this.Controls.Add(this.lnkWebSite); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Link Labels"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.LinkLabel lnkBuy; + private System.Windows.Forms.LinkLabel lnkWebSite; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/Form1.cs b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Form1.cs new file mode 100644 index 0000000..2547dbd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Form1.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace LinkLabels +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + lnkBuy.Links.Add(10, 10, "http://www.amazon.com"); + lnkBuy.Links.Add(24, 16, "http://www.bn.com"); + lnkWebSite.Links.Add(4, 17, "http://www.prosetech.com"); + } + + private void linkWebSite_Clicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) + { + e.Link.Visited = true; + System.Diagnostics.Process.Start((string)e.Link.LinkData); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/Form1.resx b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.csproj b/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.csproj new file mode 100644 index 0000000..488854d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {D18B2FEA-9F3D-4E78-BABB-E7315D23FAD0} + WinExe + Properties + LinkLabels + LinkLabels + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.csproj.user b/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.sln b/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.sln new file mode 100644 index 0000000..fcd570c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LinkLabels", "LinkLabels.csproj", "{D18B2FEA-9F3D-4E78-BABB-E7315D23FAD0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D18B2FEA-9F3D-4E78-BABB-E7315D23FAD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D18B2FEA-9F3D-4E78-BABB-E7315D23FAD0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D18B2FEA-9F3D-4E78-BABB-E7315D23FAD0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D18B2FEA-9F3D-4E78-BABB-E7315D23FAD0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.suo b/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.suo new file mode 100644 index 0000000..6a27221 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/LinkLabels/LinkLabels.suo differ diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/Program.cs b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Program.cs new file mode 100644 index 0000000..4ce08c7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace LinkLabels +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..09af829 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("LinkLabels")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("LinkLabels")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f78da2a6-cbf1-4112-844a-c2ac0fc8c23a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Resources.Designer.cs new file mode 100644 index 0000000..9d52ce4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "LinkLabels.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "LinkLabels.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "LinkLabels.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace LinkLabels.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LinkLabels.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Settings.Designer.cs new file mode 100644 index 0000000..3b0bb22 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "LinkLabels.Properties.Settings.get_Default():LinkLabels.Properties.Settings")] + +namespace LinkLabels.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/LinkLabels/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter04/LinkLabels/bin/Debug/LinkLabels.exe b/Pro Windows Forms 2.0/Chapter04/LinkLabels/bin/Debug/LinkLabels.exe new file mode 100644 index 0000000..b6ccc06 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/LinkLabels/bin/Debug/LinkLabels.exe differ diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Customer.cs b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Customer.cs new file mode 100644 index 0000000..0e6db77 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Customer.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ListBoxObjects +{ + public class Customer + { + public string FirstName; + public string LastName; + public DateTime BirthDate; + + public Customer() { } + + public Customer(string firstName, string lastName, DateTime birthDate) + { + FirstName = firstName; + LastName = lastName; + BirthDate = birthDate; + } + + public override string ToString() + { + return FirstName + " " + LastName; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Form1.Designer.cs new file mode 100644 index 0000000..186a472 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Form1.Designer.cs @@ -0,0 +1,64 @@ +namespace ListBoxObjects +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lstCustomers = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // lstCustomers + // + this.lstCustomers.FormattingEnabled = true; + this.lstCustomers.Location = new System.Drawing.Point(12, 12); + this.lstCustomers.Name = "lstCustomers"; + this.lstCustomers.Size = new System.Drawing.Size(120, 95); + this.lstCustomers.TabIndex = 0; + this.lstCustomers.SelectedIndexChanged += new System.EventHandler(this.lstCustomers_SelectedIndexChanged); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(308, 230); + this.Controls.Add(this.lstCustomers); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ListBox lstCustomers; + + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Form1.cs b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Form1.cs new file mode 100644 index 0000000..a9d3cff --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Form1.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ListBoxObjects +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + lstCustomers.Items.Add(new Customer("Maurice", "Respighi", DateTime.Now.AddDays(-10))); + lstCustomers.Items.Add(new Customer("Sam", "Digweed", DateTime.Now.AddDays(-100))); + lstCustomers.Items.Add(new Customer("Faria", "Khan", DateTime.Now.AddDays(-500))); + + } + + private void lstCustomers_SelectedIndexChanged(object sender, EventArgs e) + { + Customer cust = (Customer)lstCustomers.SelectedItem; + MessageBox.Show("Birth Date: " + cust.BirthDate.ToShortDateString()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Form1.resx b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.csproj b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.csproj new file mode 100644 index 0000000..5831007 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.csproj @@ -0,0 +1,71 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {DAF91B05-D16C-466A-8EDF-6F0F250ECFB9} + WinExe + Properties + ListBoxObjects + ListBoxObjects + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.csproj.user b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.sln b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.sln new file mode 100644 index 0000000..2beb5d8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListBoxObjects", "ListBoxObjects.csproj", "{DAF91B05-D16C-466A-8EDF-6F0F250ECFB9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DAF91B05-D16C-466A-8EDF-6F0F250ECFB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DAF91B05-D16C-466A-8EDF-6F0F250ECFB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DAF91B05-D16C-466A-8EDF-6F0F250ECFB9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DAF91B05-D16C-466A-8EDF-6F0F250ECFB9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.suo b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.suo new file mode 100644 index 0000000..3351ddf Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/ListBoxObjects.suo differ diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Program.cs b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Program.cs new file mode 100644 index 0000000..49ccaf5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ListBoxObjects +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..19db7ce --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ListBoxObjects")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ListBoxObjects")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("de144b69-51c9-4fae-ac8b-0da900b76b08")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Resources.Designer.cs new file mode 100644 index 0000000..1d54680 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ListBoxObjects.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ListBoxObjects.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ListBoxObjects.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace ListBoxObjects.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ListBoxObjects.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Settings.Designer.cs new file mode 100644 index 0000000..49f8e32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ListBoxObjects.Properties.Settings.get_Default():ListBoxObjects.Properties.Settings")] + +namespace ListBoxObjects.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/bin/Debug/ListBoxObjects.exe b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/bin/Debug/ListBoxObjects.exe new file mode 100644 index 0000000..7607abe Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/ListBoxObjects/bin/Debug/ListBoxObjects.exe differ diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Form1.Designer.cs new file mode 100644 index 0000000..6b9d6c3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Form1.Designer.cs @@ -0,0 +1,205 @@ +namespace RichTextBox +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.cmdBold = new System.Windows.Forms.ToolStripButton(); + this.cmdItalic = new System.Windows.Forms.ToolStripButton(); + this.cmdUnderline = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.lstColors = new System.Windows.Forms.ToolStripDropDownButton(); + this.lstFonts = new System.Windows.Forms.ToolStripDropDownButton(); + this.lstFontSize = new System.Windows.Forms.ToolStripDropDownButton(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.lstZoom = new System.Windows.Forms.ToolStripDropDownButton(); + this.cmdAddImage = new System.Windows.Forms.Button(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // richTextBox1 + // + this.richTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.richTextBox1.BulletIndent = 5; + this.richTextBox1.Location = new System.Drawing.Point(12, 37); + this.richTextBox1.Margin = new System.Windows.Forms.Padding(5); + this.richTextBox1.Name = "richTextBox1"; + this.richTextBox1.Size = new System.Drawing.Size(317, 197); + this.richTextBox1.TabIndex = 0; + this.richTextBox1.Text = resources.GetString("richTextBox1.Text"); + this.richTextBox1.SelectionChanged += new System.EventHandler(this.richTextBox1_SelectionChanged); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cmdBold, + this.cmdItalic, + this.cmdUnderline, + this.toolStripSeparator1, + this.lstColors, + this.lstFonts, + this.lstFontSize, + this.toolStripSeparator2, + this.lstZoom}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(341, 25); + this.toolStrip1.TabIndex = 1; + this.toolStrip1.Text = "toolStrip1"; + // + // cmdBold + // + this.cmdBold.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.cmdBold.Image = ((System.Drawing.Image)(resources.GetObject("cmdBold.Image"))); + this.cmdBold.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cmdBold.Name = "cmdBold"; + this.cmdBold.Size = new System.Drawing.Size(31, 22); + this.cmdBold.Text = "Bold"; + this.cmdBold.Click += new System.EventHandler(this.cmdBold_Click); + // + // cmdItalic + // + this.cmdItalic.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.cmdItalic.Image = ((System.Drawing.Image)(resources.GetObject("cmdItalic.Image"))); + this.cmdItalic.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cmdItalic.Name = "cmdItalic"; + this.cmdItalic.Size = new System.Drawing.Size(34, 22); + this.cmdItalic.Text = "Italic"; + this.cmdItalic.Click += new System.EventHandler(this.cmdItalic_Click); + // + // cmdUnderline + // + this.cmdUnderline.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.cmdUnderline.Image = ((System.Drawing.Image)(resources.GetObject("cmdUnderline.Image"))); + this.cmdUnderline.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cmdUnderline.Name = "cmdUnderline"; + this.cmdUnderline.Size = new System.Drawing.Size(56, 22); + this.cmdUnderline.Text = "Underline"; + this.cmdUnderline.Click += new System.EventHandler(this.cmdUnderline_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // lstColors + // + this.lstColors.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.lstColors.Image = ((System.Drawing.Image)(resources.GetObject("lstColors.Image"))); + this.lstColors.ImageTransparentColor = System.Drawing.Color.Magenta; + this.lstColors.Name = "lstColors"; + this.lstColors.Size = new System.Drawing.Size(45, 22); + this.lstColors.Text = "Color"; + this.lstColors.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.lstColors_DropDownItemClicked); + // + // lstFonts + // + this.lstFonts.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.lstFonts.Image = ((System.Drawing.Image)(resources.GetObject("lstFonts.Image"))); + this.lstFonts.ImageTransparentColor = System.Drawing.Color.Magenta; + this.lstFonts.Name = "lstFonts"; + this.lstFonts.Size = new System.Drawing.Size(42, 22); + this.lstFonts.Text = "Font"; + this.lstFonts.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.lstFonts_DropDownItemClicked); + // + // lstFontSize + // + this.lstFontSize.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.lstFontSize.Image = ((System.Drawing.Image)(resources.GetObject("lstFontSize.Image"))); + this.lstFontSize.ImageTransparentColor = System.Drawing.Color.Magenta; + this.lstFontSize.Name = "lstFontSize"; + this.lstFontSize.Size = new System.Drawing.Size(39, 22); + this.lstFontSize.Text = "Size"; + this.lstFontSize.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.lstFontSize_DropDownItemClicked); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); + // + // lstZoom + // + this.lstZoom.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.lstZoom.Image = ((System.Drawing.Image)(resources.GetObject("lstZoom.Image"))); + this.lstZoom.ImageTransparentColor = System.Drawing.Color.Magenta; + this.lstZoom.Name = "lstZoom"; + this.lstZoom.Size = new System.Drawing.Size(46, 22); + this.lstZoom.Text = "Zoom"; + this.lstZoom.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.lstZoom_DropDownItemClicked); + // + // cmdAddImage + // + this.cmdAddImage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.cmdAddImage.Location = new System.Drawing.Point(12, 237); + this.cmdAddImage.Name = "cmdAddImage"; + this.cmdAddImage.Size = new System.Drawing.Size(154, 23); + this.cmdAddImage.TabIndex = 2; + this.cmdAddImage.Text = "Insert Image"; + this.cmdAddImage.UseVisualStyleBackColor = true; + this.cmdAddImage.Click += new System.EventHandler(this.cmdAddImage_Click); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(341, 266); + this.Controls.Add(this.cmdAddImage); + this.Controls.Add(this.toolStrip1); + this.Controls.Add(this.richTextBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "RichTextBox Test"; + this.Load += new System.EventHandler(this.Form1_Load); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.RichTextBox richTextBox1; + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton cmdUnderline; + private System.Windows.Forms.ToolStripButton cmdBold; + private System.Windows.Forms.ToolStripButton cmdItalic; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripDropDownButton lstColors; + private System.Windows.Forms.ToolStripDropDownButton lstFonts; + private System.Windows.Forms.ToolStripDropDownButton lstZoom; + private System.Windows.Forms.ToolStripDropDownButton lstFontSize; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.Button cmdAddImage; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/Form1.cs b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Form1.cs new file mode 100644 index 0000000..09feef5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Form1.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Text; +using System.IO; + +namespace RichTextBox +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private bool previousSelectionState = false; + private void richTextBox1_SelectionChanged(object sender, EventArgs e) + { + if (richTextBox1.SelectionFont != null) + { + cmdBold.Checked = richTextBox1.SelectionFont.Bold; + cmdItalic.Checked = richTextBox1.SelectionFont.Italic; + cmdUnderline.Checked = richTextBox1.SelectionFont.Underline; + } + } + + private void cmdBold_Click(object sender, EventArgs e) + { + if (richTextBox1.SelectionFont == null) + { + // The selection includes multiple fonts. Sadly, + // there's no way to get information about any + // of them. + return; + } + + // Get the current style. + FontStyle style = richTextBox1.SelectionFont.Style; + + // Adjust as required. + if (richTextBox1.SelectionFont.Bold) + { + style &= ~FontStyle.Bold; + } + else + { + style |= FontStyle.Bold; + + } + + // Assign font with new style. + richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, style); + } + + private void cmdItalic_Click(object sender, EventArgs e) + { + if (richTextBox1.SelectionFont == null) + { + // The selection includes multiple fonts. Sadly, + // there's no way to get information about any + // of them. + return; + } + + // Get the current style. + FontStyle style = richTextBox1.SelectionFont.Style; + + // Adjust as required. + if (richTextBox1.SelectionFont.Italic) + { + style &= ~FontStyle.Italic; + } + else + { + style |= FontStyle.Italic; + } + // Assign font with new style. + richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, style); + } + + private void cmdUnderline_Click(object sender, EventArgs e) + { + if (richTextBox1.SelectionFont == null) + { + // The selection includes multiple fonts. Sadly, + // there's no way to get information about any + // of them. + return; + } + + // Get the current style. + FontStyle style = richTextBox1.SelectionFont.Style; + + // Adjust as required. + if (richTextBox1.SelectionFont.Underline) + { + style &= ~FontStyle.Underline; + } + else + { + style |= FontStyle.Underline; + } + // Assign font with new style. + richTextBox1.SelectionFont = new Font(richTextBox1.SelectionFont, style); + } + + private void Form1_Load(object sender, EventArgs e) + { + // Create color list. + string[] colorNames; + colorNames = System.Enum.GetNames(typeof(KnownColor)); + foreach (string colorName in colorNames) + { + lstColors.DropDown.Items.Add(colorName); + } + // Create font list. + InstalledFontCollection fonts = new InstalledFontCollection(); + foreach (FontFamily family in fonts.Families) + { + lstFonts.DropDown.Items.Add(family.Name); + } + + // Create zoom list. + for (int i = 25; i < 525; i += 25) + { + lstZoom.DropDown.Items.Add(i.ToString() + "%"); + } + + // Create font size list. + for (int i = 5; i < 60; i += 5) + { + lstFontSize.DropDown.Items.Add(i.ToString()); + } + } + + + private void lstColors_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + + KnownColor selectedColor; + selectedColor = (KnownColor)System.Enum.Parse(typeof(KnownColor), e.ClickedItem.Text); + + richTextBox1.SelectionColor = Color.FromKnownColor(selectedColor); + } + + private void lstFonts_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + if (richTextBox1.SelectionFont == null) + { + // The selection includes multiple fonts. Sadly, + // there's no way to get information about any + // of them. + richTextBox1.SelectionFont = new Font(e.ClickedItem.Text, richTextBox1.Font.Size); + } + richTextBox1.SelectionFont = new Font(e.ClickedItem.Text, richTextBox1.SelectionFont.Size); + } + + private void lstZoom_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + float zoomPercent = Convert.ToSingle(e.ClickedItem.Text.Trim('%')); + richTextBox1.ZoomFactor = zoomPercent / 100; + } + + private void lstFontSize_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + if (richTextBox1.SelectionFont == null) + { + // The selection includes multiple fonts. Sadly, + // there's no way to get information about any + // of them. + return; + } + richTextBox1.SelectionFont = + new Font(richTextBox1.SelectionFont.FontFamily, + Convert.ToInt32(e.ClickedItem.Text), + richTextBox1.SelectionFont.Style); + } + + private void cmdAddImage_Click(object sender, EventArgs e) + { + // Get the image. + Image img = Image.FromFile(Path.Combine(Application.StartupPath, "planet.jpg")); + // Place it on the clipboard. + Clipboard.SetImage(img); + + // Move to the front. + richTextBox1.SelectionStart = 0; + + // Paste the image. + richTextBox1.Paste(); + + // Optionally remove the data from the clipboard. + Clipboard.Clear(); + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/Form1.resx b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Form1.resx new file mode 100644 index 0000000..11120e1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Form1.resx @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras massa nulla, pellentesque at, tincidunt vel, euismod sed, pede. + + Morbi quis odio a quam ultricies luctus. Cras et lectus. Etiam orci augue, adipiscing eget, molestie id, mattis in, tortor. Sed facilisis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras quis libero in dolor laoreet sodales. + + Sed non mauris. Maecenas fringilla. Sed dictum, nunc id viverra mattis, orci odio posuere tellus, ut tempus neque quam quis dolor. Fusce facilisis luctus ligula. Proin leo tellus, rhoncus sit amet, elementum sed, ultrices ac, mi. Vestibulum sit amet dui. Aliquam erat volutpat. + + Integer malesuada viverra quam. Nam in dui. Cras turpis mauris, aliquam eget, pellentesque non, cursus eu, nisl. Quisque in velit at orci luctus condimentum. Aliquam lacus justo, luctus id, ultricies nec, congue ac, sem. + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL + U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI + VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ + QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 + /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 + cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j + 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR + dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb + NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE + s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL + U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI + VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ + QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 + /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 + cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j + 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR + dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb + NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE + s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL + U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI + VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ + QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 + /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 + cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j + 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR + dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb + NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE + s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL + U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI + VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ + QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 + /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 + cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j + 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR + dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb + NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE + s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL + U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI + VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ + QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 + /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 + cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j + 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR + dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb + NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE + s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL + U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI + VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ + QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 + /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 + cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j + 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR + dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb + NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE + s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL + U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI + VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ + QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 + /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 + cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j + 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR + dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb + NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE + s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/Program.cs b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Program.cs new file mode 100644 index 0000000..3e2fc0f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace RichTextBox +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d17b2dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("RichTextBox")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("RichTextBox")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9f78f38d-dfde-4d89-acdb-fd33c0e2c7f5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Resources.Designer.cs new file mode 100644 index 0000000..2d12b03 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace RichTextBox.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RichTextBox.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Settings.Designer.cs new file mode 100644 index 0000000..6a83182 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace RichTextBox.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/RichTextBox.csproj b/Pro Windows Forms 2.0/Chapter04/RichTextBox/RichTextBox.csproj new file mode 100644 index 0000000..d054057 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/RichTextBox.csproj @@ -0,0 +1,78 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {1B56126B-6C7C-473C-B8F7-AF36F72BF020} + WinExe + Properties + RichTextBox + RichTextBox + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Designer + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/RichTextBox.sln b/Pro Windows Forms 2.0/Chapter04/RichTextBox/RichTextBox.sln new file mode 100644 index 0000000..aab0be1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/RichTextBox/RichTextBox.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RichTextBox", "RichTextBox.csproj", "{1B56126B-6C7C-473C-B8F7-AF36F72BF020}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1B56126B-6C7C-473C-B8F7-AF36F72BF020}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1B56126B-6C7C-473C-B8F7-AF36F72BF020}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1B56126B-6C7C-473C-B8F7-AF36F72BF020}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1B56126B-6C7C-473C-B8F7-AF36F72BF020}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/RichTextBox.suo b/Pro Windows Forms 2.0/Chapter04/RichTextBox/RichTextBox.suo new file mode 100644 index 0000000..10ed2d8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/RichTextBox/RichTextBox.suo differ diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/bin/Debug/RichTextBox.exe b/Pro Windows Forms 2.0/Chapter04/RichTextBox/bin/Debug/RichTextBox.exe new file mode 100644 index 0000000..24dea31 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/RichTextBox/bin/Debug/RichTextBox.exe differ diff --git a/Pro Windows Forms 2.0/Chapter04/RichTextBox/bin/Debug/planet.JPG b/Pro Windows Forms 2.0/Chapter04/RichTextBox/bin/Debug/planet.JPG new file mode 100644 index 0000000..69f7409 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/RichTextBox/bin/Debug/planet.JPG differ diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter04/ToolTips/Form1.Designer.cs new file mode 100644 index 0000000..44db6f4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/Form1.Designer.cs @@ -0,0 +1,89 @@ +namespace ToolTips +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.toolTip2 = new System.Windows.Forms.ToolTip(this.components); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox1 + // + this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pictureBox1.Location = new System.Drawing.Point(12, 24); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(100, 50); + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + this.toolTip1.SetToolTip(this.pictureBox1, "This is a tooltip."); + // + // toolTip1 + // + this.toolTip1.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; + this.toolTip1.ToolTipTitle = "Titled ToolTip"; + // + // pictureBox2 + // + this.pictureBox2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pictureBox2.Location = new System.Drawing.Point(148, 24); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(100, 50); + this.pictureBox2.TabIndex = 1; + this.pictureBox2.TabStop = false; + this.toolTip2.SetToolTip(this.pictureBox2, "This is a tooltip."); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(279, 107); + this.Controls.Add(this.pictureBox2); + this.Controls.Add(this.pictureBox1); + this.Name = "Form1"; + this.Text = "ToolTip Test"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.ToolTip toolTip1; + private System.Windows.Forms.ToolTip toolTip2; + private System.Windows.Forms.PictureBox pictureBox2; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/Form1.cs b/Pro Windows Forms 2.0/Chapter04/ToolTips/Form1.cs new file mode 100644 index 0000000..76e62b9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/Form1.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ToolTips +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/Form1.resx b/Pro Windows Forms 2.0/Chapter04/ToolTips/Form1.resx new file mode 100644 index 0000000..1cb565f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/Form1.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 109, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/Program.cs b/Pro Windows Forms 2.0/Chapter04/ToolTips/Program.cs new file mode 100644 index 0000000..71e8399 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ToolTips +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2c0d75d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ToolTips")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ToolTips")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0886b5e1-fabf-4372-b05b-f97ca4a3b87e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Resources.Designer.cs new file mode 100644 index 0000000..8bbf134 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ToolTips.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ToolTips.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ToolTips.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace ToolTips.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ToolTips.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Settings.Designer.cs new file mode 100644 index 0000000..4a5f391 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ToolTips.Properties.Settings.get_Default():ToolTips.Properties.Settings")] + +namespace ToolTips.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.csproj b/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.csproj new file mode 100644 index 0000000..5e51522 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {4A167789-28C2-4F5A-AEA1-C23BCC1BFF1C} + WinExe + Properties + ToolTips + ToolTips + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.csproj.user b/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.sln b/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.sln new file mode 100644 index 0000000..3f28df5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToolTips", "ToolTips.csproj", "{4A167789-28C2-4F5A-AEA1-C23BCC1BFF1C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4A167789-28C2-4F5A-AEA1-C23BCC1BFF1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A167789-28C2-4F5A-AEA1-C23BCC1BFF1C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A167789-28C2-4F5A-AEA1-C23BCC1BFF1C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A167789-28C2-4F5A-AEA1-C23BCC1BFF1C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.suo b/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.suo new file mode 100644 index 0000000..8f2b949 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/ToolTips/ToolTips.suo differ diff --git a/Pro Windows Forms 2.0/Chapter04/ToolTips/bin/Debug/ToolTips.exe b/Pro Windows Forms 2.0/Chapter04/ToolTips/bin/Debug/ToolTips.exe new file mode 100644 index 0000000..6d55853 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter04/ToolTips/bin/Debug/ToolTips.exe differ diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageListTest.Designer.cs b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageListTest.Designer.cs new file mode 100644 index 0000000..ef6d9b4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageListTest.Designer.cs @@ -0,0 +1,83 @@ +namespace ImageTest +{ + partial class ImageListTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.cmdFillImageList = new System.Windows.Forms.Button(); + this.cmdPaintImages = new System.Windows.Forms.Button(); + this.iconImages = new System.Windows.Forms.ImageList(this.components); + this.SuspendLayout(); + // + // cmdFillImageList + // + this.cmdFillImageList.Location = new System.Drawing.Point(29, 217); + this.cmdFillImageList.Name = "cmdFillImageList"; + this.cmdFillImageList.Size = new System.Drawing.Size(118, 23); + this.cmdFillImageList.TabIndex = 0; + this.cmdFillImageList.Text = "Fill Image List"; + this.cmdFillImageList.UseVisualStyleBackColor = true; + this.cmdFillImageList.Click += new System.EventHandler(this.cmdFillImageList_Click); + // + // cmdPaintImages + // + this.cmdPaintImages.Location = new System.Drawing.Point(153, 217); + this.cmdPaintImages.Name = "cmdPaintImages"; + this.cmdPaintImages.Size = new System.Drawing.Size(112, 23); + this.cmdPaintImages.TabIndex = 1; + this.cmdPaintImages.Text = "Paint Images"; + this.cmdPaintImages.UseVisualStyleBackColor = true; + this.cmdPaintImages.Click += new System.EventHandler(this.cmdPaintImages_Click); + // + // iconImages + // + this.iconImages.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; + this.iconImages.ImageSize = new System.Drawing.Size(16, 16); + this.iconImages.TransparentColor = System.Drawing.Color.Transparent; + // + // ImageListTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.cmdPaintImages); + this.Controls.Add(this.cmdFillImageList); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "ImageListTest"; + this.Text = "ImageListTest"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button cmdFillImageList; + private System.Windows.Forms.Button cmdPaintImages; + private System.Windows.Forms.ImageList iconImages; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageListTest.cs b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageListTest.cs new file mode 100644 index 0000000..3a4f2d3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageListTest.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.IO; + +namespace ImageTest +{ + public partial class ImageListTest : Form + { + public ImageListTest() + { + InitializeComponent(); + } + + private void cmdFillImageList_Click(object sender, EventArgs e) + { + // Configure the ImageList. + iconImages.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; + iconImages.ImageSize = new System.Drawing.Size(16, 16); + + // Get all the icon files in the current directory. + string[] iconFiles = Directory.GetFiles(Application.StartupPath, "*.ico"); + + // Create an Image object for each file and add it to the ImageList. + // You can also use an Image subclass (like Icon). + foreach (string iconFile in iconFiles) + { + Icon newIcon = new Icon(iconFile); + iconImages.Images.Add(newIcon); + } + + } + + private void cmdPaintImages_Click(object sender, EventArgs e) + { + // Get the graphics device context for the form. + Graphics g = this.CreateGraphics(); + + // Draw each image using the ImageList.Draw() method. + for (int i = 0; i < iconImages.Images.Count; i++) + { + iconImages.Draw(g, 30 + i * 30, 30, i); + } + + // Release the graphics device context. + g.Dispose(); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageListTest.resx b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageListTest.resx new file mode 100644 index 0000000..b88f893 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageListTest.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageTest.csproj b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageTest.csproj new file mode 100644 index 0000000..46228e6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageTest.csproj @@ -0,0 +1,102 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {5A35895D-DA84-4C7E-881B-2535072A1FBF} + WinExe + Properties + ImageTest + ImageTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + ImageListTest.cs + + + Form + + + ImagesInCommonControls.cs + + + Form + + + Menu.cs + + + + + Designer + ImageListTest.cs + + + Designer + ImagesInCommonControls.cs + + + Menu.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageTest.sln b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageTest.sln new file mode 100644 index 0000000..cca6567 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageTest.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageTest", "ImageTest.csproj", "{5A35895D-DA84-4C7E-881B-2535072A1FBF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5A35895D-DA84-4C7E-881B-2535072A1FBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A35895D-DA84-4C7E-881B-2535072A1FBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A35895D-DA84-4C7E-881B-2535072A1FBF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A35895D-DA84-4C7E-881B-2535072A1FBF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageTest.suo b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageTest.suo new file mode 100644 index 0000000..c306dc6 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImageTest.suo differ diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/ImagesInCommonControls.Designer.cs b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImagesInCommonControls.Designer.cs new file mode 100644 index 0000000..693127a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImagesInCommonControls.Designer.cs @@ -0,0 +1,118 @@ +namespace ImageTest +{ + partial class ImagesInCommonControls + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ImagesInCommonControls)); + this.label2 = new System.Windows.Forms.Label(); + this.button2 = new System.Windows.Forms.Button(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.button1 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label2 + // + this.label2.Image = ((System.Drawing.Image)(resources.GetObject("label2.Image"))); + this.label2.ImageAlign = System.Drawing.ContentAlignment.MiddleRight; + this.label2.Location = new System.Drawing.Point(158, 9); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(78, 77); + this.label2.TabIndex = 5; + this.label2.Text = "label2"; + // + // button2 + // + this.button2.Image = ((System.Drawing.Image)(resources.GetObject("button2.Image"))); + this.button2.Location = new System.Drawing.Point(161, 99); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(101, 74); + this.button2.TabIndex = 4; + this.button2.Text = "button2"; + this.button2.UseVisualStyleBackColor = true; + // + // radioButton1 + // + this.radioButton1.Image = ((System.Drawing.Image)(resources.GetObject("radioButton1.Image"))); + this.radioButton1.Location = new System.Drawing.Point(12, 195); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(224, 47); + this.radioButton1.TabIndex = 3; + this.radioButton1.TabStop = true; + this.radioButton1.Text = "radioButton1"; + this.radioButton1.UseVisualStyleBackColor = true; + // + // button1 + // + this.button1.Image = ((System.Drawing.Image)(resources.GetObject("button1.Image"))); + this.button1.ImageAlign = System.Drawing.ContentAlignment.TopRight; + this.button1.Location = new System.Drawing.Point(12, 99); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(132, 74); + this.button1.TabIndex = 1; + this.button1.Text = "button1"; + this.button1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.button1.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.Image = ((System.Drawing.Image)(resources.GetObject("label1.Image"))); + this.label1.ImageAlign = System.Drawing.ContentAlignment.MiddleRight; + this.label1.Location = new System.Drawing.Point(20, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(105, 77); + this.label1.TabIndex = 0; + this.label1.Text = "label1"; + // + // ImagesInCommonControls + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(299, 271); + this.Controls.Add(this.label2); + this.Controls.Add(this.button2); + this.Controls.Add(this.radioButton1); + this.Controls.Add(this.button1); + this.Controls.Add(this.label1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "ImagesInCommonControls"; + this.Text = "ImagesInCommonControls"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Label label2; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/ImagesInCommonControls.cs b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImagesInCommonControls.cs new file mode 100644 index 0000000..fa0f94e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImagesInCommonControls.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ImageTest +{ + public partial class ImagesInCommonControls : Form + { + public ImagesInCommonControls() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/ImagesInCommonControls.resx b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImagesInCommonControls.resx new file mode 100644 index 0000000..18e716d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/ImagesInCommonControls.resx @@ -0,0 +1,396 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + R0lGODlhQwBEAPcAAP///xQNBxgPFBwOAxcSBxUSFhoQEBwXGRgbHh8ZCRwcGh0cIyMWCCIWEyQeCyId + GCweDSEWIiMdJB8gHB8jJCUgES0kDCwjFC4rCS4qFSMiJCsmJysqLC0rNDInDDUsDTYtETksBTouGjEo + NDsvIi8xNj0zDToyFTYyJjMyMjk0NDI6KTI6Mj86M0Y0CkY2EkU8D0s7Dks9FUM9NUhCEU5BE1BAIVFD + DVZJE11MFFJGIVxTFWJUF21VDmpWGWRZE2tdGGpVJnFaHnRdIG5lG3NnGHhlG3NsGXpqHXZnIXZtI3lq + I4VvHoN0HohyFoV1IY17IpJ8I4+HLJSBH5OCKpyFJpiIK56QOKOPKaSTLqKRNayVLK2XNaeYNa6bK7GV + LrKdMrifM62hL7WhLrSkM7ukKbukNL+oLryrPb6wS8CpF8msGMKnNcKqKcWsOsmtLM+zF8WxNs2zMMy6 + OtOyHNa6Hti9H9K2KtW8KNS9N9q+Jtm+NsOsSca3R8GyWsu2Rcy1Vc26SMq6V8ayZse7c8u7Zsy9ctO8 + RtG5Vdm+QdG8auG/L8q/gtrAHtbAKNXBN9zCKdzDNN7IKN3JOczCYtXBStXCV9zDRdvFVd3KRtzJWNbD + YdLFd9rGYtjHdtfLZNbLed3LaNzNd93QeeHFKuHGNOjHK+TLKuTMN+jNLOnNNObQKuXQNuvSLezTM+3Z + NfDVLvDVOPDYL/LZN/ndLPnePuDFQeLLRuHMVujNSejMUuDLZOLPd+TXQejQRO/aQOXTfvLVRPXWVvTa + Q/ncR/nfUPfgN/rhO/bhS/zjR/rjU//oTP/rUs3Dh9LBk9TJhNfMlNrKhtzNmNvSid3SmNfSrc3NzdPT + 09vb3OPUhuPUkeXamenXiuncnODVp+bao+PcuOvdp+ndvOXbw+Xhveviqe3ku/HltvLquN/h3Ozkx+vj + 1O7ny+Pj4+nn6evr6vDnzvPsyfLs1vDu3/Xxzvbx1/j0zvv12/v63/Pz4vPz8/r25Pv39f376////wAA + ACwAAAAAQwBEAAAI/wABCBxIsKDBgv3qxSvXrdu2h9/CnYu376DFixgzFqxXjhuvUJpuiRx5K9MtXLuy + haOosaVLghyBhRSJqqbNmzYzZeokalu8l0Atxtv2KdMkVLlUqXLlilVTnFBRXeqkTV2/oEHrZdNkq+Yt + m0uZimWKitWpU1BvXbI07SdWjf26aTL5taarVmPFttrLtxVaqJMqbaKW7+3FeKIujWTFapXevnsfu1qa + SunZmqVKRarEyZxhg+U63cqVq6YqvExR3+WbN/XeVKn+ktIcKZIlahU/A9iGaaTpsZCDC+979mzm2pWi + 1TPcL1tvmqjCPuYrC5Z1WdixD49dnFTtR5Weyf/D2hxXrro1VbveK2uW+/fwhxcvTpvz+Jf9qGnShf40 + 677twfeeLMPxxV13tW3GyXIufTMTWKvhBZmAAgZIoHDzkUIKJJDUdkg0uWVkTii49LceXtkFSCGF1WHY + HYcJVkKNRvaQSJNSSkHmCnYr9tiifC/CGMkh4GBUnkmmqZKKjjuuqCKFsTAFS3AZcgjJI3vkQcl9B6Gz + Cy6Z2ASbjrHE0uOZZR4zCywR7jXfKVZe+cgj0VjUHHSonLJkZGKZ6d4ww7zyyp9nDtPGI8dQOZ+VjjyS + Bx6HeGbQObvUdVlfYr3nZy3JJFPLLICuOIwPDHxgRS2Qvbkhh47kkSUnVxH/1A8wJeV5KWuu+BlqMsKY + sUUmyYAK6LCxJDOGARIoQIAXifL15imrNoJHHnkEQk5B8ZR41Hy4ukLoLMngEoQIJMiQRrDEDAvoMkcU + 8MADB5jAyoWtrKIqh43oMW0eoBS0TUiTkHLWmHyWCSqoyiixwQwtqCBDJseoO8wsyOygAAUSSCAAs+st + CkkjkOg7bSDqDHSPKGFKInCee6pmJqDJ/HGCCiqkoMIFVCwTy7DuVXzxAg8UwMQxrh0Ip5Ui7zHHNAOd + E5Kttu7Z58vDMKMFCiuk0EEKIwQxcaizFItEARooMEEBQiCTayuWFRenyNRSktu/lha3ZF5UM0MFByyU + /9ABBx3Y4Asx8LmyTBYHaDDBAgUMkUyusbR9VpyQ4GF5tSX3M0qYpbx5N1Nl5n3FA39zYLoMt3wqoC0f + LKCBBgVE8XiZk3lspeUjSwMAPaGE+eznob8cTDJ9ZGD6Bh1ooEMwUB4jBQFlJ/BHLbQzZTuHuFPLCQDn + YJJJKZN43m2uwxKTgwSlS5BEMgaH7u0wSDjgABXFuM8UbGdpyKEdduhLbSH7CIf3wPc7PoFuFr8Y3h88 + IAEOSMADczBG8CY4jDgEghj2mwx3NLShRjSif5cDhDq0cYlJlMJWzzJgmQZVLDTQ4AMuAEMyYBGlKLWm + FsQIRvXut8FofTBpggBHNv8ugYoTPusU3aIdC5PRiznc4hgZFMsrQOeKKdqQh/nzoR1wt4dAeGOItyiF + wFJowLtMLRa0CBsNW5MryLXGaBzE1w/9dwhqDNEWYjxiyyTDxrUxqY/e8ksWtagHfe3hENK4Y2byOB+C + 8VFCwBHOalqjii/kIUrQolzIComHRyAyG5HAY2bG2Eip+edEBfojalDhAg8YwQuRWNXbROZJO14iM6jQ + 0BH1NKZZTDKVBbqLKk4xCzFcIAIDcIIqNKmHkOWhlkMsYi5JWcpUzCITTyjDLFYhIWD2BTapWIWSTDEL + ILyACnKQhCat9Mw6ktCEsWSk3ZY0CzPIYABgmMUpVrH/CnDqqRXcASf+3qQKVKQiEi7YAi2OxqFVFRIS + e6gEIrzRjUtkojazESMpY4OKJ0CgAU9wRWxYAdCBmhScANXTZYr4CiqE4BFxbCiHCqmHPVwCEeLo3iVq + s0hdFgcVPWBABhxgBllQszjO4uVAq3SKPITACK6ARExneUhFwKMemLCFLSKhUVJqqBRhIMMcYmCCSQhy + l7s8kIYmkQMIuCEVUpUl5bJ0iELUox+hKMVWR+nTUnAoT6/oQgB8IFI9Gu2IkDgFK4gQgCVEdapzPcQh + tgcAEu6Vr/qLEylQsYMAAEFJiW0kWk+hzlSgoggKOMEc4ARZK0UiooGYEQDMcYmd/y6yqxzUUCROIQcQ + FIAHiYiqlSQBrdwKLK6ncEUccvCuLCwzlnKFUYcOKYhrAWAfnbDtbb86G+mmwgsOUMALuNCYdVIOiZGg + Aggk8IAmLNO8QnrtIQxRGIEM8ZY9lW5t4qSKKjhgARXgARlQwbbi6nIpqpBDFGrwgLIhARXwdW1tDgkN + gsTDEgmKpYQjQTk9qCILGFiAAhyAAyiU4Q5crc0cxkAFHnxAARqQgAWmkMsIxykSiahuQUQRiYtyuEMd + 2q9m9YAKNOCAAQsQcQVEIIMmw8AEF3iA6x4AgRyY4bk2nm4iDtGMWA3EHJXYaYaD/GNNzqYKMXgAAhTA + 5jaL+P9dHsgBFiKRimZGd661SUSOi2QQHot5vwlaZyT0QIqDbsEINwjBBS5gAQ+AAAY/iMIZIgHhLHNo + D3M6JCP00SVL/JnDgbZxZUqRhzi0oQ1vkMNuY2PpG0diTkG8iDbCHOgyazazlKNma1v92kM6gx8XuUcn + HpFhW9+61Xe2NJbqug4RVSISn261tLPcqDxEQhDVaMk2HnEcIU/72+vcQyQC0Qxgw2UaidhqqNfZTHBH + eA/wPgQh5oEfURB73eymabuRpu+HRvi1kcjDIJoNFHyAwtr47nC/F95vG+8BEnPwwzje0g9RINzYs2w3 + wxtuXkfU9A4S1002DpFwfm+cpja4rimH5TCIkukGAOWoBLzHfHKGm1mWjtiDHuJgCC69vB4WF5LJbQ5f + mu4BD3eQAx9093KExBwPtVlEsmf60H3PdJOFbAMbFMGOplvkHto4BB6aiXGsM1PfeKBDG2LtdYzUYxuW + sJzVUX71ftcBDmtggyHA4eW2G+kcoqjEHQZfh/71u390oMMa1NAGQEjDLX4Hyj7i8Q1PCEIOmM/8Gzbv + BkBwghqQj/xn+rGPesgjHqhHfT1C5PWAAAA7 + + + + + R0lGODlhQwBEAPcAAP///xQNBxgPFBwOAxcSBxUSFhoQEBwXGRgbHh8ZCRwcGh0cIyMWCCIWEyQeCyId + GCweDSEWIiMdJB8gHB8jJCUgES0kDCwjFC4rCS4qFSMiJCsmJysqLC0rNDInDDUsDTYtETksBTouGjEo + NDsvIi8xNj0zDToyFTYyJjMyMjk0NDI6KTI6Mj86M0Y0CkY2EkU8D0s7Dks9FUM9NUhCEU5BE1BAIVFD + DVZJE11MFFJGIVxTFWJUF21VDmpWGWRZE2tdGGpVJnFaHnRdIG5lG3NnGHhlG3NsGXpqHXZnIXZtI3lq + I4VvHoN0HohyFoV1IY17IpJ8I4+HLJSBH5OCKpyFJpiIK56QOKOPKaSTLqKRNayVLK2XNaeYNa6bK7GV + LrKdMrifM62hL7WhLrSkM7ukKbukNL+oLryrPb6wS8CpF8msGMKnNcKqKcWsOsmtLM+zF8WxNs2zMMy6 + OtOyHNa6Hti9H9K2KtW8KNS9N9q+Jtm+NsOsSca3R8GyWsu2Rcy1Vc26SMq6V8ayZse7c8u7Zsy9ctO8 + RtG5Vdm+QdG8auG/L8q/gtrAHtbAKNXBN9zCKdzDNN7IKN3JOczCYtXBStXCV9zDRdvFVd3KRtzJWNbD + YdLFd9rGYtjHdtfLZNbLed3LaNzNd93QeeHFKuHGNOjHK+TLKuTMN+jNLOnNNObQKuXQNuvSLezTM+3Z + NfDVLvDVOPDYL/LZN/ndLPnePuDFQeLLRuHMVujNSejMUuDLZOLPd+TXQejQRO/aQOXTfvLVRPXWVvTa + Q/ncR/nfUPfgN/rhO/bhS/zjR/rjU//oTP/rUs3Dh9LBk9TJhNfMlNrKhtzNmNvSid3SmNfSrc3NzdPT + 09vb3OPUhuPUkeXamenXiuncnODVp+bao+PcuOvdp+ndvOXbw+Xhveviqe3ku/HltvLquN/h3Ozkx+vj + 1O7ny+Pj4+nn6evr6vDnzvPsyfLs1vDu3/Xxzvbx1/j0zvv12/v63/Pz4vPz8/r25Pv39f376////wAA + ACwAAAAAQwBEAAAI/wABCBxIsKDBgv3qxSvXrdu2h9/CnYu376DFixgzFqxXjhuvUJpuiRx5K9MtXLuy + haOosaVLghyBhRSJqqbNmzYzZeokalu8l0Atxtv2KdMkVLlUqXLlilVTnFBRXeqkTV2/oEHrZdNkq+Yt + m0uZimWKitWpU1BvXbI07SdWjf26aTL5taarVmPFttrLtxVaqJMqbaKW7+3FeKIujWTFapXevnsfu1qa + SunZmqVKRarEyZxhg+U63cqVq6YqvExR3+WbN/XeVKn+ktIcKZIlahU/A9iGaaTpsZCDC+979mzm2pWi + 1TPcL1tvmqjCPuYrC5Z1WdixD49dnFTtR5Weyf/D2hxXrro1VbveK2uW+/fwhxcvTpvz+Jf9qGnShf40 + 677twfeeLMPxxV13tW3GyXIufTMTWKvhBZmAAgZIoHDzkUIKJJDUdkg0uWVkTii49LceXtkFSCGF1WHY + HYcJVkKNRvaQSJNSSkHmCnYr9tiifC/CGMkh4GBUnkmmqZKKjjuuqCKFsTAFS3AZcgjJI3vkQcl9B6Gz + Cy6Z2ASbjrHE0uOZZR4zCywR7jXfKVZe+cgj0VjUHHSonLJkZGKZ6d4ww7zyyp9nDtPGI8dQOZ+VjjyS + Bx6HeGbQObvUdVlfYr3nZy3JJFPLLICuOIwPDHxgRS2Qvbkhh47kkSUnVxH/1A8wJeV5KWuu+BlqMsKY + sUUmyYAK6LCxJDOGARIoQIAXifL15imrNoJHHnkEQk5B8ZR41Hy4ukLoLMngEoQIJMiQRrDEDAvoMkcU + 8MADB5jAyoWtrKIqh43oMW0eoBS0TUiTkHLWmHyWCSqoyiixwQwtqCBDJseoO8wsyOygAAUSSCAAs+st + CkkjkOg7bSDqDHSPKGFKInCee6pmJqDJ/HGCCiqkoMIFVCwTy7DuVXzxAg8UwMQxrh0Ip5Ui7zHHNAOd + E5Kttu7Z58vDMKMFCiuk0EEKIwQxcaizFItEARooMEEBQiCTayuWFRenyNRSktu/lha3ZF5UM0MFByyU + /9ABBx3Y4Asx8LmyTBYHaDDBAgUMkUyusbR9VpyQ4GF5tSX3M0qYpbx5N1Nl5n3FA39zYLoMt3wqoC0f + LKCBBgVE8XiZk3lspeUjSwMAPaGE+eznob8cTDJ9ZGD6Bh1ooEMwUB4jBQFlJ/BHLbQzZTuHuFPLCQDn + YJJJKZN43m2uwxKTgwSlS5BEMgaH7u0wSDjgABXFuM8UbGdpyKEdduhLbSH7CIf3wPc7PoFuFr8Y3h88 + IAEOSMADczBG8CY4jDgEghj2mwx3NLShRjSif5cDhDq0cYlJlMJWzzJgmQZVLDTQ4AMuAEMyYBGlKLWm + FsQIRvXut8FofTBpggBHNv8ugYoTPusU3aIdC5PRiznc4hgZFMsrQOeKKdqQh/nzoR1wt4dAeGOItyiF + wFJowLtMLRa0CBsNW5MryLXGaBzE1w/9dwhqDNEWYjxiyyTDxrUxqY/e8ksWtagHfe3hENK4Y2byOB+C + 8VFCwBHOalqjii/kIUrQolzIComHRyAyG5HAY2bG2Eip+edEBfojalDhAg8YwQuRWNXbROZJO14iM6jQ + 0BH1NKZZTDKVBbqLKk4xCzFcIAIDcIIqNKmHkOWhlkMsYi5JWcpUzCITTyjDLFYhIWD2BTapWIWSTDEL + ILyACnKQhCat9Mw6ktCEsWSk3ZY0CzPIYABgmMUpVrH/CnDqqRXcASf+3qQKVKQiEi7YAi2OxqFVFRIS + e6gEIrzRjUtkojazESMpY4OKJ0CgAU9wRWxYAdCBmhScANXTZYr4CiqE4BFxbCiHCqmHPVwCEeLo3iVq + s0hdFgcVPWBABhxgBllQszjO4uVAq3SKPITACK6ARExneUhFwKMemLCFLSKhUVJqqBRhIMMcYmCCSQhy + l7s8kIYmkQMIuCEVUpUl5bJ0iELUox+hKMVWR+nTUnAoT6/oQgB8IFI9Gu2IkDgFK4gQgCVEdapzPcQh + tgcAEu6Vr/qLEylQsYMAAEFJiW0kWk+hzlSgoggKOMEc4ARZK0UiooGYEQDMcYmd/y6yqxzUUCROIQcQ + FIAHiYiqlSQBrdwKLK6ncEUccvCuLCwzlnKFUYcOKYhrAWAfnbDtbb86G+mmwgsOUMALuNCYdVIOiZGg + Aggk8IAmLNO8QnrtIQxRGIEM8ZY9lW5t4qSKKjhgARXgARlQwbbi6nIpqpBDFGrwgLIhARXwdW1tDgkN + gsTDEgmKpYQjQTk9qCILGFiAAhyAAyiU4Q5crc0cxkAFHnxAARqQgAWmkMsIxykSiahuQUQRiYtyuEMd + 2q9m9YAKNOCAAQsQcQVEIIMmw8AEF3iA6x4AgRyY4bk2nm4iDtGMWA3EHJXYaYaD/GNNzqYKMXgAAhTA + 5jaL+P9dHsgBFiKRimZGd661SUSOi2QQHot5vwlaZyT0QIqDbsEINwjBBS5gAQ+AAAY/iMIZIgHhLHNo + D3M6JCP00SVL/JnDgbZxZUqRhzi0oQ1vkMNuY2PpG0diTkG8iDbCHOgyazazlKNma1v92kM6gx8XuUcn + HpFhW9+61Xe2NJbqug4RVSISn261tLPcqDxEQhDVaMk2HnEcIU/72+vcQyQC0Qxgw2UaidhqqNfZTHBH + eA/wPgQh5oEfURB73eymabuRpu+HRvi1kcjDIJoNFHyAwtr47nC/F95vG+8BEnPwwzje0g9RINzYs2w3 + wxtuXkfU9A4S1002DpFwfm+cpja4rimH5TCIkukGAOWoBLzHfHKGm1mWjtiDHuJgCC69vB4WF5LJbQ5f + mu4BD3eQAx9093KExBwPtVlEsmf60H3PdJOFbAMbFMGOplvkHto4BB6aiXGsM1PfeKBDG2LtdYzUYxuW + sJzVUX71ftcBDmtggyHA4eW2G+kcoqjEHQZfh/71u390oMMa1NAGQEjDLX4Hyj7i8Q1PCEIOmM/8Gzbv + BkBwghqQj/xn+rGPesgjHqhHfT1C5PWAAAA7 + + + + + R0lGODlhQwBEAPcAAP///xQNBxgPFBwOAxcSBxUSFhoQEBwXGRgbHh8ZCRwcGh0cIyMWCCIWEyQeCyId + GCweDSEWIiMdJB8gHB8jJCUgES0kDCwjFC4rCS4qFSMiJCsmJysqLC0rNDInDDUsDTYtETksBTouGjEo + NDsvIi8xNj0zDToyFTYyJjMyMjk0NDI6KTI6Mj86M0Y0CkY2EkU8D0s7Dks9FUM9NUhCEU5BE1BAIVFD + DVZJE11MFFJGIVxTFWJUF21VDmpWGWRZE2tdGGpVJnFaHnRdIG5lG3NnGHhlG3NsGXpqHXZnIXZtI3lq + I4VvHoN0HohyFoV1IY17IpJ8I4+HLJSBH5OCKpyFJpiIK56QOKOPKaSTLqKRNayVLK2XNaeYNa6bK7GV + LrKdMrifM62hL7WhLrSkM7ukKbukNL+oLryrPb6wS8CpF8msGMKnNcKqKcWsOsmtLM+zF8WxNs2zMMy6 + OtOyHNa6Hti9H9K2KtW8KNS9N9q+Jtm+NsOsSca3R8GyWsu2Rcy1Vc26SMq6V8ayZse7c8u7Zsy9ctO8 + RtG5Vdm+QdG8auG/L8q/gtrAHtbAKNXBN9zCKdzDNN7IKN3JOczCYtXBStXCV9zDRdvFVd3KRtzJWNbD + YdLFd9rGYtjHdtfLZNbLed3LaNzNd93QeeHFKuHGNOjHK+TLKuTMN+jNLOnNNObQKuXQNuvSLezTM+3Z + NfDVLvDVOPDYL/LZN/ndLPnePuDFQeLLRuHMVujNSejMUuDLZOLPd+TXQejQRO/aQOXTfvLVRPXWVvTa + Q/ncR/nfUPfgN/rhO/bhS/zjR/rjU//oTP/rUs3Dh9LBk9TJhNfMlNrKhtzNmNvSid3SmNfSrc3NzdPT + 09vb3OPUhuPUkeXamenXiuncnODVp+bao+PcuOvdp+ndvOXbw+Xhveviqe3ku/HltvLquN/h3Ozkx+vj + 1O7ny+Pj4+nn6evr6vDnzvPsyfLs1vDu3/Xxzvbx1/j0zvv12/v63/Pz4vPz8/r25Pv39f376////wAA + ACwAAAAAQwBEAAAI/wABCBxIsKDBgv3qxSvXrdu2h9/CnYu376DFixgzFqxXjhuvUJpuiRx5K9MtXLuy + haOosaVLghyBhRSJqqbNmzYzZeokalu8l0Atxtv2KdMkVLlUqXLlilVTnFBRXeqkTV2/oEHrZdNkq+Yt + m0uZimWKitWpU1BvXbI07SdWjf26aTL5taarVmPFttrLtxVaqJMqbaKW7+3FeKIujWTFapXevnsfu1qa + SunZmqVKRarEyZxhg+U63cqVq6YqvExR3+WbN/XeVKn+ktIcKZIlahU/A9iGaaTpsZCDC+979mzm2pWi + 1TPcL1tvmqjCPuYrC5Z1WdixD49dnFTtR5Weyf/D2hxXrro1VbveK2uW+/fwhxcvTpvz+Jf9qGnShf40 + 677twfeeLMPxxV13tW3GyXIufTMTWKvhBZmAAgZIoHDzkUIKJJDUdkg0uWVkTii49LceXtkFSCGF1WHY + HYcJVkKNRvaQSJNSSkHmCnYr9tiifC/CGMkh4GBUnkmmqZKKjjuuqCKFsTAFS3AZcgjJI3vkQcl9B6Gz + Cy6Z2ASbjrHE0uOZZR4zCywR7jXfKVZe+cgj0VjUHHSonLJkZGKZ6d4ww7zyyp9nDtPGI8dQOZ+VjjyS + Bx6HeGbQObvUdVlfYr3nZy3JJFPLLICuOIwPDHxgRS2Qvbkhh47kkSUnVxH/1A8wJeV5KWuu+BlqMsKY + sUUmyYAK6LCxJDOGARIoQIAXifL15imrNoJHHnkEQk5B8ZR41Hy4ukLoLMngEoQIJMiQRrDEDAvoMkcU + 8MADB5jAyoWtrKIqh43oMW0eoBS0TUiTkHLWmHyWCSqoyiixwQwtqCBDJseoO8wsyOygAAUSSCAAs+st + CkkjkOg7bSDqDHSPKGFKInCee6pmJqDJ/HGCCiqkoMIFVCwTy7DuVXzxAg8UwMQxrh0Ip5Ui7zHHNAOd + E5Kttu7Z58vDMKMFCiuk0EEKIwQxcaizFItEARooMEEBQiCTayuWFRenyNRSktu/lha3ZF5UM0MFByyU + /9ABBx3Y4Asx8LmyTBYHaDDBAgUMkUyusbR9VpyQ4GF5tSX3M0qYpbx5N1Nl5n3FA39zYLoMt3wqoC0f + LKCBBgVE8XiZk3lspeUjSwMAPaGE+eznob8cTDJ9ZGD6Bh1ooEMwUB4jBQFlJ/BHLbQzZTuHuFPLCQDn + YJJJKZN43m2uwxKTgwSlS5BEMgaH7u0wSDjgABXFuM8UbGdpyKEdduhLbSH7CIf3wPc7PoFuFr8Y3h88 + IAEOSMADczBG8CY4jDgEghj2mwx3NLShRjSif5cDhDq0cYlJlMJWzzJgmQZVLDTQ4AMuAEMyYBGlKLWm + FsQIRvXut8FofTBpggBHNv8ugYoTPusU3aIdC5PRiznc4hgZFMsrQOeKKdqQh/nzoR1wt4dAeGOItyiF + wFJowLtMLRa0CBsNW5MryLXGaBzE1w/9dwhqDNEWYjxiyyTDxrUxqY/e8ksWtagHfe3hENK4Y2byOB+C + 8VFCwBHOalqjii/kIUrQolzIComHRyAyG5HAY2bG2Eip+edEBfojalDhAg8YwQuRWNXbROZJO14iM6jQ + 0BH1NKZZTDKVBbqLKk4xCzFcIAIDcIIqNKmHkOWhlkMsYi5JWcpUzCITTyjDLFYhIWD2BTapWIWSTDEL + ILyACnKQhCat9Mw6ktCEsWSk3ZY0CzPIYABgmMUpVrH/CnDqqRXcASf+3qQKVKQiEi7YAi2OxqFVFRIS + e6gEIrzRjUtkojazESMpY4OKJ0CgAU9wRWxYAdCBmhScANXTZYr4CiqE4BFxbCiHCqmHPVwCEeLo3iVq + s0hdFgcVPWBABhxgBllQszjO4uVAq3SKPITACK6ARExneUhFwKMemLCFLSKhUVJqqBRhIMMcYmCCSQhy + l7s8kIYmkQMIuCEVUpUl5bJ0iELUox+hKMVWR+nTUnAoT6/oQgB8IFI9Gu2IkDgFK4gQgCVEdapzPcQh + tgcAEu6Vr/qLEylQsYMAAEFJiW0kWk+hzlSgoggKOMEc4ARZK0UiooGYEQDMcYmd/y6yqxzUUCROIQcQ + FIAHiYiqlSQBrdwKLK6ncEUccvCuLCwzlnKFUYcOKYhrAWAfnbDtbb86G+mmwgsOUMALuNCYdVIOiZGg + Aggk8IAmLNO8QnrtIQxRGIEM8ZY9lW5t4qSKKjhgARXgARlQwbbi6nIpqpBDFGrwgLIhARXwdW1tDgkN + gsTDEgmKpYQjQTk9qCILGFiAAhyAAyiU4Q5crc0cxkAFHnxAARqQgAWmkMsIxykSiahuQUQRiYtyuEMd + 2q9m9YAKNOCAAQsQcQVEIIMmw8AEF3iA6x4AgRyY4bk2nm4iDtGMWA3EHJXYaYaD/GNNzqYKMXgAAhTA + 5jaL+P9dHsgBFiKRimZGd661SUSOi2QQHot5vwlaZyT0QIqDbsEINwjBBS5gAQ+AAAY/iMIZIgHhLHNo + D3M6JCP00SVL/JnDgbZxZUqRhzi0oQ1vkMNuY2PpG0diTkG8iDbCHOgyazazlKNma1v92kM6gx8XuUcn + HpFhW9+61Xe2NJbqug4RVSISn261tLPcqDxEQhDVaMk2HnEcIU/72+vcQyQC0Qxgw2UaidhqqNfZTHBH + eA/wPgQh5oEfURB73eymabuRpu+HRvi1kcjDIJoNFHyAwtr47nC/F95vG+8BEnPwwzje0g9RINzYs2w3 + wxtuXkfU9A4S1002DpFwfm+cpja4rimH5TCIkukGAOWoBLzHfHKGm1mWjtiDHuJgCC69vB4WF5LJbQ5f + mu4BD3eQAx9093KExBwPtVlEsmf60H3PdJOFbAMbFMGOplvkHto4BB6aiXGsM1PfeKBDG2LtdYzUYxuW + sJzVUX71ftcBDmtggyHA4eW2G+kcoqjEHQZfh/71u390oMMa1NAGQEjDLX4Hyj7i8Q1PCEIOmM/8Gzbv + BkBwghqQj/xn+rGPesgjHqhHfT1C5PWAAAA7 + + + + + R0lGODlhQwBEAPcAAP///xQNBxgPFBwOAxcSBxUSFhoQEBwXGRgbHh8ZCRwcGh0cIyMWCCIWEyQeCyId + GCweDSEWIiMdJB8gHB8jJCUgES0kDCwjFC4rCS4qFSMiJCsmJysqLC0rNDInDDUsDTYtETksBTouGjEo + NDsvIi8xNj0zDToyFTYyJjMyMjk0NDI6KTI6Mj86M0Y0CkY2EkU8D0s7Dks9FUM9NUhCEU5BE1BAIVFD + DVZJE11MFFJGIVxTFWJUF21VDmpWGWRZE2tdGGpVJnFaHnRdIG5lG3NnGHhlG3NsGXpqHXZnIXZtI3lq + I4VvHoN0HohyFoV1IY17IpJ8I4+HLJSBH5OCKpyFJpiIK56QOKOPKaSTLqKRNayVLK2XNaeYNa6bK7GV + LrKdMrifM62hL7WhLrSkM7ukKbukNL+oLryrPb6wS8CpF8msGMKnNcKqKcWsOsmtLM+zF8WxNs2zMMy6 + OtOyHNa6Hti9H9K2KtW8KNS9N9q+Jtm+NsOsSca3R8GyWsu2Rcy1Vc26SMq6V8ayZse7c8u7Zsy9ctO8 + RtG5Vdm+QdG8auG/L8q/gtrAHtbAKNXBN9zCKdzDNN7IKN3JOczCYtXBStXCV9zDRdvFVd3KRtzJWNbD + YdLFd9rGYtjHdtfLZNbLed3LaNzNd93QeeHFKuHGNOjHK+TLKuTMN+jNLOnNNObQKuXQNuvSLezTM+3Z + NfDVLvDVOPDYL/LZN/ndLPnePuDFQeLLRuHMVujNSejMUuDLZOLPd+TXQejQRO/aQOXTfvLVRPXWVvTa + Q/ncR/nfUPfgN/rhO/bhS/zjR/rjU//oTP/rUs3Dh9LBk9TJhNfMlNrKhtzNmNvSid3SmNfSrc3NzdPT + 09vb3OPUhuPUkeXamenXiuncnODVp+bao+PcuOvdp+ndvOXbw+Xhveviqe3ku/HltvLquN/h3Ozkx+vj + 1O7ny+Pj4+nn6evr6vDnzvPsyfLs1vDu3/Xxzvbx1/j0zvv12/v63/Pz4vPz8/r25Pv39f376////wAA + ACwAAAAAQwBEAAAI/wABCBxIsKDBgv3qxSvXrdu2h9/CnYu376DFixgzFqxXjhuvUJpuiRx5K9MtXLuy + haOosaVLghyBhRSJqqbNmzYzZeokalu8l0Atxtv2KdMkVLlUqXLlilVTnFBRXeqkTV2/oEHrZdNkq+Yt + m0uZimWKitWpU1BvXbI07SdWjf26aTL5taarVmPFttrLtxVaqJMqbaKW7+3FeKIujWTFapXevnsfu1qa + SunZmqVKRarEyZxhg+U63cqVq6YqvExR3+WbN/XeVKn+ktIcKZIlahU/A9iGaaTpsZCDC+979mzm2pWi + 1TPcL1tvmqjCPuYrC5Z1WdixD49dnFTtR5Weyf/D2hxXrro1VbveK2uW+/fwhxcvTpvz+Jf9qGnShf40 + 677twfeeLMPxxV13tW3GyXIufTMTWKvhBZmAAgZIoHDzkUIKJJDUdkg0uWVkTii49LceXtkFSCGF1WHY + HYcJVkKNRvaQSJNSSkHmCnYr9tiifC/CGMkh4GBUnkmmqZKKjjuuqCKFsTAFS3AZcgjJI3vkQcl9B6Gz + Cy6Z2ASbjrHE0uOZZR4zCywR7jXfKVZe+cgj0VjUHHSonLJkZGKZ6d4ww7zyyp9nDtPGI8dQOZ+VjjyS + Bx6HeGbQObvUdVlfYr3nZy3JJFPLLICuOIwPDHxgRS2Qvbkhh47kkSUnVxH/1A8wJeV5KWuu+BlqMsKY + sUUmyYAK6LCxJDOGARIoQIAXifL15imrNoJHHnkEQk5B8ZR41Hy4ukLoLMngEoQIJMiQRrDEDAvoMkcU + 8MADB5jAyoWtrKIqh43oMW0eoBS0TUiTkHLWmHyWCSqoyiixwQwtqCBDJseoO8wsyOygAAUSSCAAs+st + CkkjkOg7bSDqDHSPKGFKInCee6pmJqDJ/HGCCiqkoMIFVCwTy7DuVXzxAg8UwMQxrh0Ip5Ui7zHHNAOd + E5Kttu7Z58vDMKMFCiuk0EEKIwQxcaizFItEARooMEEBQiCTayuWFRenyNRSktu/lha3ZF5UM0MFByyU + /9ABBx3Y4Asx8LmyTBYHaDDBAgUMkUyusbR9VpyQ4GF5tSX3M0qYpbx5N1Nl5n3FA39zYLoMt3wqoC0f + LKCBBgVE8XiZk3lspeUjSwMAPaGE+eznob8cTDJ9ZGD6Bh1ooEMwUB4jBQFlJ/BHLbQzZTuHuFPLCQDn + YJJJKZN43m2uwxKTgwSlS5BEMgaH7u0wSDjgABXFuM8UbGdpyKEdduhLbSH7CIf3wPc7PoFuFr8Y3h88 + IAEOSMADczBG8CY4jDgEghj2mwx3NLShRjSif5cDhDq0cYlJlMJWzzJgmQZVLDTQ4AMuAEMyYBGlKLWm + FsQIRvXut8FofTBpggBHNv8ugYoTPusU3aIdC5PRiznc4hgZFMsrQOeKKdqQh/nzoR1wt4dAeGOItyiF + wFJowLtMLRa0CBsNW5MryLXGaBzE1w/9dwhqDNEWYjxiyyTDxrUxqY/e8ksWtagHfe3hENK4Y2byOB+C + 8VFCwBHOalqjii/kIUrQolzIComHRyAyG5HAY2bG2Eip+edEBfojalDhAg8YwQuRWNXbROZJO14iM6jQ + 0BH1NKZZTDKVBbqLKk4xCzFcIAIDcIIqNKmHkOWhlkMsYi5JWcpUzCITTyjDLFYhIWD2BTapWIWSTDEL + ILyACnKQhCat9Mw6ktCEsWSk3ZY0CzPIYABgmMUpVrH/CnDqqRXcASf+3qQKVKQiEi7YAi2OxqFVFRIS + e6gEIrzRjUtkojazESMpY4OKJ0CgAU9wRWxYAdCBmhScANXTZYr4CiqE4BFxbCiHCqmHPVwCEeLo3iVq + s0hdFgcVPWBABhxgBllQszjO4uVAq3SKPITACK6ARExneUhFwKMemLCFLSKhUVJqqBRhIMMcYmCCSQhy + l7s8kIYmkQMIuCEVUpUl5bJ0iELUox+hKMVWR+nTUnAoT6/oQgB8IFI9Gu2IkDgFK4gQgCVEdapzPcQh + tgcAEu6Vr/qLEylQsYMAAEFJiW0kWk+hzlSgoggKOMEc4ARZK0UiooGYEQDMcYmd/y6yqxzUUCROIQcQ + FIAHiYiqlSQBrdwKLK6ncEUccvCuLCwzlnKFUYcOKYhrAWAfnbDtbb86G+mmwgsOUMALuNCYdVIOiZGg + Aggk8IAmLNO8QnrtIQxRGIEM8ZY9lW5t4qSKKjhgARXgARlQwbbi6nIpqpBDFGrwgLIhARXwdW1tDgkN + gsTDEgmKpYQjQTk9qCILGFiAAhyAAyiU4Q5crc0cxkAFHnxAARqQgAWmkMsIxykSiahuQUQRiYtyuEMd + 2q9m9YAKNOCAAQsQcQVEIIMmw8AEF3iA6x4AgRyY4bk2nm4iDtGMWA3EHJXYaYaD/GNNzqYKMXgAAhTA + 5jaL+P9dHsgBFiKRimZGd661SUSOi2QQHot5vwlaZyT0QIqDbsEINwjBBS5gAQ+AAAY/iMIZIgHhLHNo + D3M6JCP00SVL/JnDgbZxZUqRhzi0oQ1vkMNuY2PpG0diTkG8iDbCHOgyazazlKNma1v92kM6gx8XuUcn + HpFhW9+61Xe2NJbqug4RVSISn261tLPcqDxEQhDVaMk2HnEcIU/72+vcQyQC0Qxgw2UaidhqqNfZTHBH + eA/wPgQh5oEfURB73eymabuRpu+HRvi1kcjDIJoNFHyAwtr47nC/F95vG+8BEnPwwzje0g9RINzYs2w3 + wxtuXkfU9A4S1002DpFwfm+cpja4rimH5TCIkukGAOWoBLzHfHKGm1mWjtiDHuJgCC69vB4WF5LJbQ5f + mu4BD3eQAx9093KExBwPtVlEsmf60H3PdJOFbAMbFMGOplvkHto4BB6aiXGsM1PfeKBDG2LtdYzUYxuW + sJzVUX71ftcBDmtggyHA4eW2G+kcoqjEHQZfh/71u390oMMa1NAGQEjDLX4Hyj7i8Q1PCEIOmM/8Gzbv + BkBwghqQj/xn+rGPesgjHqhHfT1C5PWAAAA7 + + + + + R0lGODlhQwBEAPcAAP///xQNBxgPFBwOAxcSBxUSFhoQEBwXGRgbHh8ZCRwcGh0cIyMWCCIWEyQeCyId + GCweDSEWIiMdJB8gHB8jJCUgES0kDCwjFC4rCS4qFSMiJCsmJysqLC0rNDInDDUsDTYtETksBTouGjEo + NDsvIi8xNj0zDToyFTYyJjMyMjk0NDI6KTI6Mj86M0Y0CkY2EkU8D0s7Dks9FUM9NUhCEU5BE1BAIVFD + DVZJE11MFFJGIVxTFWJUF21VDmpWGWRZE2tdGGpVJnFaHnRdIG5lG3NnGHhlG3NsGXpqHXZnIXZtI3lq + I4VvHoN0HohyFoV1IY17IpJ8I4+HLJSBH5OCKpyFJpiIK56QOKOPKaSTLqKRNayVLK2XNaeYNa6bK7GV + LrKdMrifM62hL7WhLrSkM7ukKbukNL+oLryrPb6wS8CpF8msGMKnNcKqKcWsOsmtLM+zF8WxNs2zMMy6 + OtOyHNa6Hti9H9K2KtW8KNS9N9q+Jtm+NsOsSca3R8GyWsu2Rcy1Vc26SMq6V8ayZse7c8u7Zsy9ctO8 + RtG5Vdm+QdG8auG/L8q/gtrAHtbAKNXBN9zCKdzDNN7IKN3JOczCYtXBStXCV9zDRdvFVd3KRtzJWNbD + YdLFd9rGYtjHdtfLZNbLed3LaNzNd93QeeHFKuHGNOjHK+TLKuTMN+jNLOnNNObQKuXQNuvSLezTM+3Z + NfDVLvDVOPDYL/LZN/ndLPnePuDFQeLLRuHMVujNSejMUuDLZOLPd+TXQejQRO/aQOXTfvLVRPXWVvTa + Q/ncR/nfUPfgN/rhO/bhS/zjR/rjU//oTP/rUs3Dh9LBk9TJhNfMlNrKhtzNmNvSid3SmNfSrc3NzdPT + 09vb3OPUhuPUkeXamenXiuncnODVp+bao+PcuOvdp+ndvOXbw+Xhveviqe3ku/HltvLquN/h3Ozkx+vj + 1O7ny+Pj4+nn6evr6vDnzvPsyfLs1vDu3/Xxzvbx1/j0zvv12/v63/Pz4vPz8/r25Pv39f376////wAA + ACwAAAAAQwBEAAAI/wABCBxIsKDBgv3qxSvXrdu2h9/CnYu376DFixgzFqxXjhuvUJpuiRx5K9MtXLuy + haOosaVLghyBhRSJqqbNmzYzZeokalu8l0Atxtv2KdMkVLlUqXLlilVTnFBRXeqkTV2/oEHrZdNkq+Yt + m0uZimWKitWpU1BvXbI07SdWjf26aTL5taarVmPFttrLtxVaqJMqbaKW7+3FeKIujWTFapXevnsfu1qa + SunZmqVKRarEyZxhg+U63cqVq6YqvExR3+WbN/XeVKn+ktIcKZIlahU/A9iGaaTpsZCDC+979mzm2pWi + 1TPcL1tvmqjCPuYrC5Z1WdixD49dnFTtR5Weyf/D2hxXrro1VbveK2uW+/fwhxcvTpvz+Jf9qGnShf40 + 677twfeeLMPxxV13tW3GyXIufTMTWKvhBZmAAgZIoHDzkUIKJJDUdkg0uWVkTii49LceXtkFSCGF1WHY + HYcJVkKNRvaQSJNSSkHmCnYr9tiifC/CGMkh4GBUnkmmqZKKjjuuqCKFsTAFS3AZcgjJI3vkQcl9B6Gz + Cy6Z2ASbjrHE0uOZZR4zCywR7jXfKVZe+cgj0VjUHHSonLJkZGKZ6d4ww7zyyp9nDtPGI8dQOZ+VjjyS + Bx6HeGbQObvUdVlfYr3nZy3JJFPLLICuOIwPDHxgRS2Qvbkhh47kkSUnVxH/1A8wJeV5KWuu+BlqMsKY + sUUmyYAK6LCxJDOGARIoQIAXifL15imrNoJHHnkEQk5B8ZR41Hy4ukLoLMngEoQIJMiQRrDEDAvoMkcU + 8MADB5jAyoWtrKIqh43oMW0eoBS0TUiTkHLWmHyWCSqoyiixwQwtqCBDJseoO8wsyOygAAUSSCAAs+st + CkkjkOg7bSDqDHSPKGFKInCee6pmJqDJ/HGCCiqkoMIFVCwTy7DuVXzxAg8UwMQxrh0Ip5Ui7zHHNAOd + E5Kttu7Z58vDMKMFCiuk0EEKIwQxcaizFItEARooMEEBQiCTayuWFRenyNRSktu/lha3ZF5UM0MFByyU + /9ABBx3Y4Asx8LmyTBYHaDDBAgUMkUyusbR9VpyQ4GF5tSX3M0qYpbx5N1Nl5n3FA39zYLoMt3wqoC0f + LKCBBgVE8XiZk3lspeUjSwMAPaGE+eznob8cTDJ9ZGD6Bh1ooEMwUB4jBQFlJ/BHLbQzZTuHuFPLCQDn + YJJJKZN43m2uwxKTgwSlS5BEMgaH7u0wSDjgABXFuM8UbGdpyKEdduhLbSH7CIf3wPc7PoFuFr8Y3h88 + IAEOSMADczBG8CY4jDgEghj2mwx3NLShRjSif5cDhDq0cYlJlMJWzzJgmQZVLDTQ4AMuAEMyYBGlKLWm + FsQIRvXut8FofTBpggBHNv8ugYoTPusU3aIdC5PRiznc4hgZFMsrQOeKKdqQh/nzoR1wt4dAeGOItyiF + wFJowLtMLRa0CBsNW5MryLXGaBzE1w/9dwhqDNEWYjxiyyTDxrUxqY/e8ksWtagHfe3hENK4Y2byOB+C + 8VFCwBHOalqjii/kIUrQolzIComHRyAyG5HAY2bG2Eip+edEBfojalDhAg8YwQuRWNXbROZJO14iM6jQ + 0BH1NKZZTDKVBbqLKk4xCzFcIAIDcIIqNKmHkOWhlkMsYi5JWcpUzCITTyjDLFYhIWD2BTapWIWSTDEL + ILyACnKQhCat9Mw6ktCEsWSk3ZY0CzPIYABgmMUpVrH/CnDqqRXcASf+3qQKVKQiEi7YAi2OxqFVFRIS + e6gEIrzRjUtkojazESMpY4OKJ0CgAU9wRWxYAdCBmhScANXTZYr4CiqE4BFxbCiHCqmHPVwCEeLo3iVq + s0hdFgcVPWBABhxgBllQszjO4uVAq3SKPITACK6ARExneUhFwKMemLCFLSKhUVJqqBRhIMMcYmCCSQhy + l7s8kIYmkQMIuCEVUpUl5bJ0iELUox+hKMVWR+nTUnAoT6/oQgB8IFI9Gu2IkDgFK4gQgCVEdapzPcQh + tgcAEu6Vr/qLEylQsYMAAEFJiW0kWk+hzlSgoggKOMEc4ARZK0UiooGYEQDMcYmd/y6yqxzUUCROIQcQ + FIAHiYiqlSQBrdwKLK6ncEUccvCuLCwzlnKFUYcOKYhrAWAfnbDtbb86G+mmwgsOUMALuNCYdVIOiZGg + Aggk8IAmLNO8QnrtIQxRGIEM8ZY9lW5t4qSKKjhgARXgARlQwbbi6nIpqpBDFGrwgLIhARXwdW1tDgkN + gsTDEgmKpYQjQTk9qCILGFiAAhyAAyiU4Q5crc0cxkAFHnxAARqQgAWmkMsIxykSiahuQUQRiYtyuEMd + 2q9m9YAKNOCAAQsQcQVEIIMmw8AEF3iA6x4AgRyY4bk2nm4iDtGMWA3EHJXYaYaD/GNNzqYKMXgAAhTA + 5jaL+P9dHsgBFiKRimZGd661SUSOi2QQHot5vwlaZyT0QIqDbsEINwjBBS5gAQ+AAAY/iMIZIgHhLHNo + D3M6JCP00SVL/JnDgbZxZUqRhzi0oQ1vkMNuY2PpG0diTkG8iDbCHOgyazazlKNma1v92kM6gx8XuUcn + HpFhW9+61Xe2NJbqug4RVSISn261tLPcqDxEQhDVaMk2HnEcIU/72+vcQyQC0Qxgw2UaidhqqNfZTHBH + eA/wPgQh5oEfURB73eymabuRpu+HRvi1kcjDIJoNFHyAwtr47nC/F95vG+8BEnPwwzje0g9RINzYs2w3 + wxtuXkfU9A4S1002DpFwfm+cpja4rimH5TCIkukGAOWoBLzHfHKGm1mWjtiDHuJgCC69vB4WF5LJbQ5f + mu4BD3eQAx9093KExBwPtVlEsmf60H3PdJOFbAMbFMGOplvkHto4BB6aiXGsM1PfeKBDG2LtdYzUYxuW + sJzVUX71ftcBDmtggyHA4eW2G+kcoqjEHQZfh/71u390oMMa1NAGQEjDLX4Hyj7i8Q1PCEIOmM/8Gzbv + BkBwghqQj/xn+rGPesgjHqhHfT1C5PWAAAA7 + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/Menu.cs b/Pro Windows Forms 2.0/Chapter05/ImageTest/Menu.cs new file mode 100644 index 0000000..3264a2e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace ImageTest +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("ImageTest." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter05/ImageTest/Menu.designer.cs new file mode 100644 index 0000000..acc3771 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/Menu.designer.cs @@ -0,0 +1,74 @@ +namespace ImageTest +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(167, 23); + this.button1.TabIndex = 0; + this.button1.Text = "ImagesInCommonControls"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(167, 23); + this.button2.TabIndex = 1; + this.button2.Text = "ImageListTest"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(197, 215); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/Menu.resx b/Pro Windows Forms 2.0/Chapter05/ImageTest/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/Program.cs b/Pro Windows Forms 2.0/Chapter05/ImageTest/Program.cs new file mode 100644 index 0000000..1194c1e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ImageTest +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..873ac81 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ImageTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ImageTest")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("bd5270bc-a787-4c9b-bc68-9180b70e3747")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Resources.Designer.cs new file mode 100644 index 0000000..f79faf0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Resources.Designer.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ImageTest.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ImageTest.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap happy { + get { + object obj = ResourceManager.GetObject("happy", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Resources.resx new file mode 100644 index 0000000..e13b00a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\happy.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Settings.Designer.cs new file mode 100644 index 0000000..90b1011 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ImageTest.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/ImageTest/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/Resources/happy.gif b/Pro Windows Forms 2.0/Chapter05/ImageTest/Resources/happy.gif new file mode 100644 index 0000000..3a08b76 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/ImageTest/Resources/happy.gif differ diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDER01.ICO b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDER01.ICO new file mode 100644 index 0000000..14c91fd Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDER01.ICO differ diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDER02.ICO b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDER02.ICO new file mode 100644 index 0000000..88cce84 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDER02.ICO differ diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDRS01.ICO b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDRS01.ICO new file mode 100644 index 0000000..7358e17 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDRS01.ICO differ diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDRS02.ICO b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDRS02.ICO new file mode 100644 index 0000000..675947e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/FOLDRS02.ICO differ diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/ImageTest.exe b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/ImageTest.exe new file mode 100644 index 0000000..4c9b2b1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/ImageTest.exe differ diff --git a/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/active.ico b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/active.ico new file mode 100644 index 0000000..3e7061a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/ImageTest/bin/Debug/active.ico differ diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.Designer.cs new file mode 100644 index 0000000..3803ff9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.Designer.cs @@ -0,0 +1,99 @@ +namespace LocalizedTest +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.lblFirstName = new System.Windows.Forms.Label(); + this.lblLastName = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // lblFirstName + // + this.lblFirstName.AccessibleDescription = null; + this.lblFirstName.AccessibleName = null; + resources.ApplyResources(this.lblFirstName, "lblFirstName"); + this.lblFirstName.Font = null; + this.lblFirstName.Name = "lblFirstName"; + // + // lblLastName + // + this.lblLastName.AccessibleDescription = null; + this.lblLastName.AccessibleName = null; + resources.ApplyResources(this.lblLastName, "lblLastName"); + this.lblLastName.Font = null; + this.lblLastName.Name = "lblLastName"; + // + // textBox1 + // + this.textBox1.AccessibleDescription = null; + this.textBox1.AccessibleName = null; + resources.ApplyResources(this.textBox1, "textBox1"); + this.textBox1.BackgroundImage = null; + this.textBox1.Font = null; + this.textBox1.Name = "textBox1"; + // + // textBox2 + // + this.textBox2.AccessibleDescription = null; + this.textBox2.AccessibleName = null; + resources.ApplyResources(this.textBox2, "textBox2"); + this.textBox2.BackgroundImage = null; + this.textBox2.Font = null; + this.textBox2.Name = "textBox2"; + // + // Form1 + // + this.AccessibleDescription = null; + this.AccessibleName = null; + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = null; + this.Controls.Add(this.textBox2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.lblLastName); + this.Controls.Add(this.lblFirstName); + this.Font = null; + this.Icon = null; + this.Name = "Form1"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblFirstName; + private System.Windows.Forms.Label lblLastName; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.TextBox textBox2; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.cs b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.cs new file mode 100644 index 0000000..13f4013 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace LocalizedTest +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.fr-FR.resx b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.fr-FR.resx new file mode 100644 index 0000000..b8267f1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.fr-FR.resx @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 46, 13 + + + Prénom: + + + 79, 13 + + + Nom de famille: + + + 102, 21 + + + 102, 57 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.resx b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.resx new file mode 100644 index 0000000..4b296d0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Form1.resx @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + lblLastName + + + lblFirstName + + + 0 + + + + 0 + + + + 97, 57 + + + textBox1 + + + True + + + $this + + + Form1 + + + 61, 13 + + + 21, 64 + + + textBox2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 100, 20 + + + System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 100, 20 + + + 1 + + + 1 + + + First Name: + + + 60, 13 + + + Last Name: + + + $this + + + 21, 24 + + + 310, 178 + + + 2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 6, 13 + + + 97, 21 + + + $this + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 3 + + + Form1 + + + 3 + + + 2 + + + True + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/LocalizedTest.csproj b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/LocalizedTest.csproj new file mode 100644 index 0000000..174bcd3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/LocalizedTest.csproj @@ -0,0 +1,82 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {6BB6042C-75CA-4F1A-9FCB-1901F9E73E9D} + WinExe + Properties + LocalizedTest + LocalizedTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Designer + Form1.cs + + + Designer + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/LocalizedTest.sln b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/LocalizedTest.sln new file mode 100644 index 0000000..f9cab34 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/LocalizedTest.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocalizedTest", "LocalizedTest.csproj", "{6BB6042C-75CA-4F1A-9FCB-1901F9E73E9D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6BB6042C-75CA-4F1A-9FCB-1901F9E73E9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6BB6042C-75CA-4F1A-9FCB-1901F9E73E9D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6BB6042C-75CA-4F1A-9FCB-1901F9E73E9D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6BB6042C-75CA-4F1A-9FCB-1901F9E73E9D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/LocalizedTest.suo b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/LocalizedTest.suo new file mode 100644 index 0000000..83c46f9 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/LocalizedTest.suo differ diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Program.cs b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Program.cs new file mode 100644 index 0000000..ef67add --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using System.Threading; +using System.Globalization; + +namespace LocalizedTest +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // Uncomment for French. + //Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR"); + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ca8aed8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("LocalizedTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("LocalizedTest")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("fd1aff0a-614a-4684-bef1-6f8f6f7b4ed2")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Resources.Designer.cs new file mode 100644 index 0000000..7f01591 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace LocalizedTest.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LocalizedTest.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Settings.Designer.cs new file mode 100644 index 0000000..b90062b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace LocalizedTest.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/bin/Debug/LocalizedTest.exe b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/bin/Debug/LocalizedTest.exe new file mode 100644 index 0000000..d6b4537 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/bin/Debug/LocalizedTest.exe differ diff --git a/Pro Windows Forms 2.0/Chapter05/LocalizedTest/bin/Debug/fr-FR/LocalizedTest.resources.dll b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/bin/Debug/fr-FR/LocalizedTest.resources.dll new file mode 100644 index 0000000..423fa0a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter05/LocalizedTest/bin/Debug/fr-FR/LocalizedTest.resources.dll differ diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Form1.Designer.cs new file mode 100644 index 0000000..aef834b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Form1.Designer.cs @@ -0,0 +1,235 @@ +namespace ListViewExample +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.imagesSmall = new System.Windows.Forms.ImageList(this.components); + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.optTile = new System.Windows.Forms.RadioButton(); + this.optLargeIcon = new System.Windows.Forms.RadioButton(); + this.optList = new System.Windows.Forms.RadioButton(); + this.optDetails = new System.Windows.Forms.RadioButton(); + this.optSmallIcon = new System.Windows.Forms.RadioButton(); + this.cmdFillList = new System.Windows.Forms.Button(); + this.imagesLarge = new System.Windows.Forms.ImageList(this.components); + this.listView = new System.Windows.Forms.ListView(); + this.cmdResizeColumns = new System.Windows.Forms.Button(); + this.txtSelected = new System.Windows.Forms.TextBox(); + this.chkGroups = new System.Windows.Forms.CheckBox(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // imagesSmall + // + this.imagesSmall.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imagesSmall.ImageStream"))); + this.imagesSmall.Images.SetKeyName(0, ""); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.chkGroups); + this.GroupBox1.Controls.Add(this.optTile); + this.GroupBox1.Controls.Add(this.optLargeIcon); + this.GroupBox1.Controls.Add(this.optList); + this.GroupBox1.Controls.Add(this.optDetails); + this.GroupBox1.Controls.Add(this.optSmallIcon); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.GroupBox1.Location = new System.Drawing.Point(269, 12); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(114, 177); + this.GroupBox1.TabIndex = 8; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "View"; + // + // optTile + // + this.optTile.Checked = true; + this.optTile.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optTile.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.optTile.Location = new System.Drawing.Point(16, 119); + this.optTile.Name = "optTile"; + this.optTile.Size = new System.Drawing.Size(56, 16); + this.optTile.TabIndex = 1; + this.optTile.Tag = ""; + this.optTile.Text = "Tile"; + this.optTile.CheckedChanged += new System.EventHandler(this.NewView); + // + // optLargeIcon + // + this.optLargeIcon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optLargeIcon.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.optLargeIcon.Location = new System.Drawing.Point(16, 48); + this.optLargeIcon.Name = "optLargeIcon"; + this.optLargeIcon.Size = new System.Drawing.Size(76, 16); + this.optLargeIcon.TabIndex = 0; + this.optLargeIcon.Text = "LargeIcon"; + this.optLargeIcon.CheckedChanged += new System.EventHandler(this.NewView); + // + // optList + // + this.optList.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optList.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.optList.Location = new System.Drawing.Point(16, 96); + this.optList.Name = "optList"; + this.optList.Size = new System.Drawing.Size(56, 16); + this.optList.TabIndex = 0; + this.optList.Text = "List"; + this.optList.CheckedChanged += new System.EventHandler(this.NewView); + // + // optDetails + // + this.optDetails.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optDetails.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.optDetails.Location = new System.Drawing.Point(16, 72); + this.optDetails.Name = "optDetails"; + this.optDetails.Size = new System.Drawing.Size(72, 16); + this.optDetails.TabIndex = 0; + this.optDetails.Text = "Details"; + this.optDetails.CheckedChanged += new System.EventHandler(this.NewView); + // + // optSmallIcon + // + this.optSmallIcon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.optSmallIcon.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.optSmallIcon.Location = new System.Drawing.Point(16, 24); + this.optSmallIcon.Name = "optSmallIcon"; + this.optSmallIcon.Size = new System.Drawing.Size(72, 16); + this.optSmallIcon.TabIndex = 0; + this.optSmallIcon.Text = "SmallIcon"; + this.optSmallIcon.CheckedChanged += new System.EventHandler(this.NewView); + // + // cmdFillList + // + this.cmdFillList.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdFillList.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFillList.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cmdFillList.Location = new System.Drawing.Point(269, 195); + this.cmdFillList.Name = "cmdFillList"; + this.cmdFillList.Size = new System.Drawing.Size(114, 24); + this.cmdFillList.TabIndex = 7; + this.cmdFillList.Text = "Fill List"; + this.cmdFillList.Click += new System.EventHandler(this.cmdFillList_Click); + // + // imagesLarge + // + this.imagesLarge.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imagesLarge.ImageStream"))); + this.imagesLarge.Images.SetKeyName(0, ""); + // + // listView + // + this.listView.AllowColumnReorder = true; + this.listView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listView.FullRowSelect = true; + this.listView.GridLines = true; + this.listView.Location = new System.Drawing.Point(7, 8); + this.listView.MultiSelect = false; + this.listView.Name = "listView"; + this.listView.Size = new System.Drawing.Size(254, 282); + this.listView.Sorting = System.Windows.Forms.SortOrder.Ascending; + this.listView.TabIndex = 6; + this.listView.SelectedIndexChanged += new System.EventHandler(this.listView_SelectedIndexChanged); + this.listView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView_ColumnClick); + // + // cmdResizeColumns + // + this.cmdResizeColumns.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdResizeColumns.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdResizeColumns.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.cmdResizeColumns.Location = new System.Drawing.Point(269, 225); + this.cmdResizeColumns.Name = "cmdResizeColumns"; + this.cmdResizeColumns.Size = new System.Drawing.Size(114, 24); + this.cmdResizeColumns.TabIndex = 9; + this.cmdResizeColumns.Text = "Auto Resize Columns"; + this.cmdResizeColumns.Click += new System.EventHandler(this.cmdResizeColumns_Click); + // + // txtSelected + // + this.txtSelected.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSelected.Location = new System.Drawing.Point(7, 296); + this.txtSelected.Multiline = true; + this.txtSelected.Name = "txtSelected"; + this.txtSelected.ReadOnly = true; + this.txtSelected.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtSelected.Size = new System.Drawing.Size(254, 73); + this.txtSelected.TabIndex = 10; + // + // chkGroups + // + this.chkGroups.AutoSize = true; + this.chkGroups.Location = new System.Drawing.Point(14, 150); + this.chkGroups.Name = "chkGroups"; + this.chkGroups.Size = new System.Drawing.Size(85, 17); + this.chkGroups.TabIndex = 11; + this.chkGroups.Text = "Show Groups"; + this.chkGroups.CheckedChanged += new System.EventHandler(this.chkGroups_CheckedChanged); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(390, 381); + this.Controls.Add(this.txtSelected); + this.Controls.Add(this.cmdResizeColumns); + this.Controls.Add(this.listView); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.cmdFillList); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "ListView Example"; + this.Load += new System.EventHandler(this.Form1_Load); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ImageList imagesSmall; + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.RadioButton optTile; + private System.Windows.Forms.RadioButton optLargeIcon; + private System.Windows.Forms.RadioButton optList; + private System.Windows.Forms.RadioButton optDetails; + private System.Windows.Forms.RadioButton optSmallIcon; + private System.Windows.Forms.Button cmdFillList; + private System.Windows.Forms.ImageList imagesLarge; + private System.Windows.Forms.ListView listView; + private System.Windows.Forms.Button cmdResizeColumns; + private System.Windows.Forms.TextBox txtSelected; + private System.Windows.Forms.CheckBox chkGroups; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/Form1.cs b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Form1.cs new file mode 100644 index 0000000..5574512 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Form1.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ListViewExample +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void cmdFillList_Click(object sender, EventArgs e) + { + FillList(); + } + + private void FillList() + { + listView.Items.Clear(); + + // Create groups if needed. They only + // appear is ShowGroups is true. + if (listView.Groups.Count == 0) + { + DataTable dtGroups = StoreDB.GetCategories(); + foreach (DataRow dr in dtGroups.Rows) + { + listView.Groups.Add(dr["CategoryID"].ToString(), + dr["CategoryName"].ToString()); + } + } + // Turn groups on or off. + listView.ShowGroups = chkGroups.Checked; + + DataTable dtProducts = StoreDB.GetProducts(); + + // Suspending automatic refreshes as items are added/removed. + listView.BeginUpdate(); + + listView.SmallImageList = imagesSmall; + listView.LargeImageList = imagesLarge; + foreach (DataRow dr in dtProducts.Rows) + { + ListViewItem listItem = new ListViewItem(dr["ModelName"].ToString()); + listItem.ImageIndex = 0; + + // Put it in the appropriate group. + // (Only has an effect if ShowGroups is true.) + listItem.Group = listView.Groups[dr["CategoryID"].ToString()]; + + // Add sub-items for Details view. + listItem.SubItems.Add(dr["ProductID"].ToString()); + listItem.SubItems.Add(dr["Description"].ToString()); + + listView.Items.Add(listItem); + } + + // Add column headers for Details view + // if they haven't been added before. + if (listView.Columns.Count == 0) + { + listView.Columns.Add("Product", 100, HorizontalAlignment.Left); + listView.Columns.Add("ID", 100, HorizontalAlignment.Left); + listView.Columns.Add("Description", 100, HorizontalAlignment.Left); + } + + // Re-enable the display. + listView.EndUpdate(); + } + + private void Form1_Load(object sender, EventArgs e) + { + listView.View = View.Tile; + listView.TileSize = new Size(300, 50); + optLargeIcon.Tag = View.LargeIcon; + optSmallIcon.Tag = View.SmallIcon; + optDetails.Tag = View.Details; + optList.Tag = View.List; + optTile.Tag = View.Tile; + FillList(); + } + + private void NewView(object sender, System.EventArgs e) + { + // Set the current view mode based on the number in the tag value of the + // selected radio button. + + listView.View = (View)(((Control)sender).Tag); + + // Display the current view style. + this.Text = "Using View: " + listView.View.ToString(); + } + + private void listView_ColumnClick(object sender, ColumnClickEventArgs e) + { + // Check the current sort. + ListViewItemComparer sorter = listView.ListViewItemSorter as ListViewItemComparer; + + // Specify an alphabetic sort based on the column that was clicked. + if (sorter == null) + { + sorter = new ListViewItemComparer(e.Column); + listView.ListViewItemSorter = sorter; + } + else + { + if (sorter.Column == e.Column && !sorter.Descending) + { + // The list is already sorted on this column. + // Time to flip the sort. + sorter.Descending = true; + // Keep the ListView.Sorting property + // synchronized, just for tidiness. + listView.Sorting = SortOrder.Descending; + } + else + { + listView.Sorting = SortOrder.Ascending; + sorter.Descending = false; + sorter.Column = e.Column; + } + } + + // Perform the sort. + listView.Sort(); + } + + private void cmdResizeColumns_Click(object sender, EventArgs e) + { + listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + } + + + private void listView_SelectedIndexChanged(object sender, EventArgs e) + { + if (listView.SelectedItems.Count > 0) + txtSelected.Text = listView.SelectedItems[0].SubItems[2].Text; + } + + private void chkGroups_CheckedChanged(object sender, EventArgs e) + { + FillList(); + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/Form1.resx b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Form1.resx new file mode 100644 index 0000000..e736162 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Form1.resx @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 244, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABK + CAAAAk1TRnQBSQFMAwEBAAEEAQABBAEAARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA + AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA + AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA + AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm + AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ + AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm + AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz + AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm + AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm + AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA + ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm + AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm + ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm + AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA + AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ + AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz + AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/ + AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA + AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM + AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm + ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ + AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ + ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM + ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm + AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM + AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA + AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA + ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7 + Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8BAAT/CvQC/zAABP8B8QHt + AewBkgEHAbwB8QHyAfMB9AL/MAAE/wLtAesBEgHqAW0B7AHtAe8B9AL/MAAE/wHtAQcCtQH3AewB6wHq + AW0B8gL/MAAE/wHtAbwB7QG8AfABvAG1AfcBEgHyAv8wAAT/Ae0BBwHtAfcB7wEHAfcB7QESAfIC/zAA + BP8B7QEHAewC6gFtAa4BkgESAfIC/zAABP8BkgEHAesE6gGSARIB8gL/MAAE/wGSAQcB6wQSAe0BEgHy + Av8wAAT/AZIBBwHrAm4C6wHtARIB8gL/MAAE/wGSAQcC6gJMARIB7AESAfIC/zAABP8BkgEHAewBbQFL + AUQBFQHsARIB8gL/MAAE/wGSAgcB7wH3Ae8B9wHtARIB8gL/MAAE/wGSAW0B7QHvAQcB8AHxAfcB6gHy + Av8wAAT/Ae0B6wPsAZIB7QHrAW0B8gL/MAAE/wL0AfABvAEHAu0B9wL0Av8wAAFCAU0BPgcAAT4DAAEo + AwABQAMAARADAAEBAQABAQUAAYAXAAP/gQAL + + + + 357, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABG + CwAAAk1TRnQBSQFMAwEBAAEEAQABBAEAASABAAEgAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA + AYADAAEgAwABAQEAAQgGAAEQGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA + AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA + AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm + AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ + AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm + AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz + AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm + AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm + AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA + ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm + AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm + ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm + AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA + AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ + AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz + AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/ + AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA + AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM + AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm + ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ + AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ + ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM + ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm + AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM + AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA + AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA + ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7 + Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8IAAHxAu8BvAHyAvR5AAES + AhMBEgFtAe0B7wG8AfIC9HUAAfcBBwLsARMBFQETARIBbQHtAe8BvAHyAvRxAAHvAfEBkgH/AfEBvAH3 + AewBEwEVARMBEgFtAewB7wG8AfJvAAHvAfEB9wH/Ae0BbQHsAfcB7wEHAfcBbQETARUBEwESAewB8m4A + Ae8B8QH3Af8B7QLsAe8B7AFtAewB7QH3Ae8B7QFtARIB8m4AAe8BvAHvAf8C7AH0AbwC9AHyAQcB7AFt + Ad0B7AESAfJuAAHvAbwB7wH0AewB7wHyAfQC/wHvAfEBBwFtAd0B7AESAfJuAAHvAbwB7wH0AuwB9wHv + AQcC8QG8AfcBbQHdAewBEgHybgAB7wEHAe8B8gHsBW0B7QH3AQcB7AHdAewBEgHybgAB7wEHAe8B8gHs + CRIB3QHsARIB8m4AAu8BBwHyAewJEgHdAewBEgHybgAC7wEHAfEB7AkSAfQB7AESAfJuAALvAQcB8QFt + CRIB9AHsARIB8m4AAQcB7wK8AW0JEwH/AewBEgHybgABBwHvArwBbQkTAf8B7AESAfJuAAEHAfcBvAEH + AW0JEwH/AewBEgHybgABBwGSAfEBBwFtAe8B7QFtBhMB/wHsARIB8m4AAQcBkgHxAe8BbQETAW0B7QLv + AZIB7AFtARUB9AHsARIB8m4AAQcB7QHxAe8BbQIVASwDJQHsAZIBbQH0AewBEgHybgABBwHtAfIB7wES + AhUBJAMsASUCFQHyAewBEgHybgABBwHsAfIB7wESAxUBJAElAUMDFQHyAewBEgHybgABBwHsAfQB9wHv + Ae0B7AFtARMFQwHxAewBEgHybgABBwHsAfQB7wH3BO8BBwGSAewBbQEVAfEB7AESAfJuAAEHAewC8QHv + AfcE7wIHA7wB7AESAfJuAAEHAewB7QG8AfIB9AHyAfEBvAEHAe8CBwK8AewBEgHybgABBwJtA+wB7wEH + AfED9APxAW0BEgHybgAB7wISBewC7QH3AQcBvAHxAQcBbQESAfJuAAHvCOwC7QKSAfcBkgFtARIB8m4A + Ae8B7QNtAewBbQHsAW0B7ALtAZIB7AETAm0B8nIAAfEBvAH3Au0DbQHsAe8B9wFtAe8B9HgAAfIBvAHv + AfcCBwH0aAABQgFNAT4HAAE+AwABKAMAAYADAAEgAwABAQEAAQEGAAECFgAD/wEAAf4BAwL/DAAB/gEA + AT8B/wwAAf4BAAEDAf8MAAH+AgAB/wwAAf4CAAF/DAAB/gIAAX8MAAH+AgABfwwAAf4CAAF/DAAB/gIA + AX8MAAH+AgABfwwAAf4CAAF/DAAB/gIAAX8MAAH+AgABfwwAAf4CAAF/DAAB/gIAAX8MAAH+AgABfwwA + Af4CAAF/DAAB/gIAAX8MAAH+AgABfwwAAf4CAAF/DAAB/gIAAX8MAAH+AgABfwwAAf4CAAF/DAAB/gIA + AX8MAAH+AgABfwwAAf4CAAF/DAAB/gIAAX8MAAH+AgABfwwAAf4CAAF/DAAB/gIAAX8MAAH/AeABAAF/ + DAAC/wGAAf8MAAs= + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.csproj b/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.csproj new file mode 100644 index 0000000..4d52971 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.csproj @@ -0,0 +1,63 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {2048540F-8DFC-447F-A646-2765E0BB3E81} + WinExe + Properties + ListViewExample + ListViewExample + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + + Form1.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.csproj.user b/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.sln b/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.sln new file mode 100644 index 0000000..d462f53 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListViewExample", "ListViewExample.csproj", "{2048540F-8DFC-447F-A646-2765E0BB3E81}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2048540F-8DFC-447F-A646-2765E0BB3E81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2048540F-8DFC-447F-A646-2765E0BB3E81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2048540F-8DFC-447F-A646-2765E0BB3E81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2048540F-8DFC-447F-A646-2765E0BB3E81}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.suo b/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.suo new file mode 100644 index 0000000..23db5f3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewExample.suo differ diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewItemComparer.cs b/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewItemComparer.cs new file mode 100644 index 0000000..cc5b0eb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/ListViewItemComparer.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Collections; +using System.Windows.Forms; + +namespace ListViewExample +{ + public class ListViewItemComparer : IComparer + { + private int column; + public int Column + { + get { return column; } + set { column = value; } + } + + private bool numeric = false; + public bool Numeric + { + get { return numeric; } + set { numeric = value; } + } + + private bool descending = false; + public bool Descending + { + get { return descending; } + set { descending = value; } + } + + public ListViewItemComparer(int columnIndex) + { + Column = columnIndex; + } + + public int Compare(object x, object y) + { + ListViewItem listX, listY; + if (descending) + { + listY = (ListViewItem)x; + listX = (ListViewItem)y; + } + else + { + listX = (ListViewItem)x; + listY = (ListViewItem)y; + } + + if (Numeric) + { + // Convert column text to numbers before comparing. + // If the conversion fails, the value defaults to 0. + decimal valX, valY; + Decimal.TryParse(listX.SubItems[Column].Text, out valX); + Decimal.TryParse(listY.SubItems[Column].Text, out valY); + + // Perform a numeric comparison. + return Decimal.Compare(valX, valY); + } + else + { + // Perform an alphabetic comparison. + return String.Compare( + listX.SubItems[Column].Text, listY.SubItems[Column].Text); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/Program.cs b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Program.cs new file mode 100644 index 0000000..e64ee63 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ListViewExample +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b42b827 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ListViewExample")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ListViewExample")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6e05aea6-3fee-4d77-a84e-c1bf2d332d83")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Properties/Settings.Designer.cs new file mode 100644 index 0000000..fa811cc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ListViewExample.Properties.Settings.get_Default():ListViewExample.Properties.Settings")] + +namespace ListViewExample.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/StoreDB.cs b/Pro Windows Forms 2.0/Chapter06/ListViewExample/StoreDB.cs new file mode 100644 index 0000000..86ebe96 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/StoreDB.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Windows.Forms; + +namespace ListViewExample +{ + public class StoreDB + { + public static DataTable GetProducts() + { + DataSet dsStore = new DataSet(); + dsStore.ReadXmlSchema(Application.StartupPath + "\\store.xsd"); + dsStore.ReadXml(Application.StartupPath + "\\store.xml"); + return dsStore.Tables["Products"]; + } + + public static DataTable GetCategories() + { + DataSet dsStore = new DataSet(); + dsStore.ReadXmlSchema(Application.StartupPath + "\\store.xsd"); + dsStore.ReadXml(Application.StartupPath + "\\store.xml"); + return dsStore.Tables["Categories"]; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/bin/Debug/ListViewExample.exe b/Pro Windows Forms 2.0/Chapter06/ListViewExample/bin/Debug/ListViewExample.exe new file mode 100644 index 0000000..276dd82 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter06/ListViewExample/bin/Debug/ListViewExample.exe differ diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/bin/Debug/store.xml b/Pro Windows Forms 2.0/Chapter06/ListViewExample/bin/Debug/store.xml new file mode 100644 index 0000000..fc6480b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/bin/Debug/store.xml @@ -0,0 +1,400 @@ + + + + 355 + 16 + RU007 + Rain Racer 2000 + image.gif + 1499.99 + Looks like an ordinary bumbershoot, but don't be fooled! Simply place Rain Racer's tip on the ground and press the release latch. Within seconds, this ordinary rain umbrella converts into a two-wheeled gas-powered mini-scooter. Goes from 0 to 60 in 7.5 seconds - even in a driving rain! Comes in black, blue, and candy-apple red. + + + 356 + 20 + STKY1 + Edible Tape + image.gif + 3.99 + The latest in personal survival gear, the STKY1 looks like a roll of ordinary office tape, but can save your life in an emergency. Just remove the tape roll and place in a kettle of boiling water with mixed vegetables and a ham shank. In just 90 minutes you have a great tasking soup that really sticks to your ribs! Herbs and spices not included. + + + 357 + 16 + P38 + Escape Vehicle (Air) + image.gif + 2.99 + In a jam, need a quick escape? Just whip out a sheet of our patented P38 paper and, with a few quick folds, it converts into a lighter-than-air escape vehicle! Especially effective on windy days - no fuel required. Comes in several sizes including letter, legal, A10, and B52. + + + 358 + 19 + NOZ119 + Extracting Tool + image.gif + 199 + High-tech miniaturized extracting tool. Excellent for extricating foreign objects from your person. Good for picking up really tiny stuff, too! Cleverly disguised as a pair of tweezers. + + + 359 + 16 + PT109 + Escape Vehicle (Water) + image.gif + 1299.99 + Camouflaged as stylish wing tips, these 'shoes' get you out of a jam on the high seas instantly. Exposed to water, the pair transforms into speedy miniature inflatable rafts. Complete with 76 HP outboard motor, these hip heels will whisk you to safety even in the roughest of seas. Warning: Not recommended for beachwear. + + + 360 + 14 + RED1 + Communications Device + image.gif + 49.99 + Subversively stay in touch with this miniaturized wireless communications device. Speak into the pointy end and listen with the other end! Voice-activated dialing makes calling for backup a breeze. Excellent for undercover work at schools, rest homes, and most corporate headquarters. Comes in assorted colors. + + + 362 + 14 + LK4TLNT + Persuasive Pencil + image.gif + 1.99 + Persuade anyone to see your point of view! Captivate your friends and enemies alike! Draw the crime-scene or map out the chain of events. All you need is several years of training or copious amounts of natural talent. You're halfway there with the Persuasive Pencil. Purchase this item with the Retro Pocket Protector Rocket Pack for optimum disguise. + + + 363 + 18 + NTMBS1 + Multi-Purpose Rubber Band + image.gif + 1.99 + One of our most popular items! A band of rubber that stretches 20 times the original size. Uses include silent one-to-one communication across a crowded room, holding together a pack of Persuasive Pencils, and powering lightweight aircraft. Beware, stretching past 20 feet results in a painful snap and a rubber strip. + + + 364 + 19 + NE1RPR + Universal Repair System + image.gif + 4.99 + Few people appreciate the awesome repair possibilities contained in a single roll of duct tape. In fact, some houses in the Midwest are made entirely out of the miracle material contained in every roll! Can be safely used to repair cars, computers, people, dams, and a host of other items. + + + 365 + 19 + BRTLGT1 + Effective Flashlight + image.gif + 9.99 + The most powerful darkness-removal device offered to creatures of this world. Rather than amplifying existing/secondary light, this handy product actually REMOVES darkness allowing you to see with your own eyes. Must-have for nighttime operations. An affordable alternative to the Night Vision Goggles. + + + 367 + 18 + INCPPRCLP + The Incredible Versatile Paperclip + image.gif + 1.49 + This 0. 01 oz piece of metal is the most versatile item in any respectable spy's toolbox and will come in handy in all sorts of situations. Serves as a wily lock pick, aerodynamic projectile (used in conjunction with Multi-Purpose Rubber Band), or escape-proof finger cuffs. Best of all, small size and pliability means it fits anywhere undetected. Order several today! + + + 368 + 16 + DNTRPR + Toaster Boat + image.gif + 19999.98 + Turn breakfast into a high-speed chase! In addition to toasting bagels and breakfast pastries, this inconspicuous toaster turns into a speedboat at the touch of a button. Boasting top speeds of 60 knots and an ultra-quiet motor, this valuable item will get you where you need to be ... fast! Best of all, Toaster Boat is easily repaired using a Versatile Paperclip or a standard butter knife. Manufacturer's Warning: Do not submerge electrical items. + + + 370 + 17 + TGFDA + Multi-Purpose Towelette + image.gif + 12.99 + Don't leave home without your monogrammed towelette! Made from lightweight, quick-dry fabric, this piece of equipment has more uses in a spy's day than a Swiss Army knife. The perfect all-around tool while undercover in the locker room: serves as towel, shield, disguise, sled, defensive weapon, whip and emergency food source. Handy bail gear for the Toaster Boat. Monogram included with purchase price. + + + 371 + 18 + WOWPEN + Mighty Mighty Pen + image.gif + 129.99 + Some spies claim this item is more powerful than a sword. After examining the titanium frame, built-in blowtorch, and Nerf dart-launcher, we tend to agree! + + + 372 + 20 + ICNCU + Perfect-Vision Glasses + image.gif + 129.99 + Avoid painful and potentially devastating laser eye surgery and contact lenses. Cheaper and more effective than a visit to the optometrist, these Perfect-Vision Glasses simply slide over nose and eyes and hook on ears. Suddenly you have 20/20 vision! Glasses also function as HUD (Heads Up Display) for most European sports cars manufactured after 1992. + + + 373 + 17 + LKARCKT + Pocket Protector Rocket Pack + image.gif + 1.99 + Any debonair spy knows that this accoutrement is coming back in style. Flawlessly protects the pockets of your short-sleeved oxford from unsightly ink and pencil marks. But there's more! Strap it on your back and it doubles as a rocket pack. Provides enough turbo-thrust for a 250-pound spy or a passel of small children. Maximum travel radius: 3000 miles. + + + 374 + 15 + DNTGCGHT + Counterfeit Creation Wallet + image.gif + 999.99 + Don't be caught penniless in Prague without this hot item! Instantly creates replicas of most common currencies! Simply place rocks and water in the wallet, close, open up again, and remove your legal tender! + + + 375 + 16 + WRLD00 + Global Navigational System + image.gif + 29.99 + No spy should be without one of these premium devices. Determine your exact location with a quick flick of the finger. Calculate destination points by spinning, closing your eyes, and stopping it with your index finger. + + + 376 + 15 + CITSME9 + Cloaking Device + image.gif + 9999.99 + Worried about detection on your covert mission? Confuse mission-threatening forces with this cloaking device. Powerful new features include string-activated pre-programmed phrases such as "Danger! Danger!", "Reach for the sky!", and other anti-enemy expressions. Hyper-reactive karate chop action deters even the most persistent villain. + + + 377 + 15 + BME007 + Indentity Confusion Device + image.gif + 6.99 + Never leave on an undercover mission without our Identity Confusion Device! If a threatening person approaches, deploy the device and point toward the oncoming individual. The subject will fail to recognize you and let you pass unnoticed. Also works well on dogs. + + + 379 + 17 + SHADE01 + Ultra Violet Attack Defender + image.gif + 89.99 + Be safe and suave. A spy wearing this trendy article of clothing is safe from ultraviolet ray-gun attacks. Worn correctly, the Defender deflects rays from ultraviolet weapons back to the instigator. As a bonus, also offers protection against harmful solar ultraviolet rays, equivalent to SPF 50. + + + 378 + 17 + SQUKY1 + Guard Dog Pacifier + image.gif + 14.99 + Pesky guard dogs become a spy's best friend with the Guard Dog Pacifier. Even the most ferocious dogs suddenly act like cuddly kittens when they see this prop. Simply hold the device in front of any threatening dogs, shaking it mildly. For tougher canines, a quick squeeze emits an irresistible squeak that never fails to place the dog under your control. + + + 382 + 20 + CHEW99 + Survival Bar + image.gif + 6.99 + Survive for up to four days in confinement with this handy item. Disguised as a common eraser, it's really a high-calorie food bar. Stranded in hostile territory without hope of nourishment? Simply break off a small piece of the eraser and chew vigorously for at least twenty minutes. Developed by the same folks who created freeze-dried ice cream, powdered drink mix, and glow-in-the-dark shoelaces. + + + 402 + 20 + C00LCMB1 + Telescoping Comb + image.gif + 399.99 + Use the Telescoping Comb to track down anyone, anywhere! Deceptively simple, this is no normal comb. Flip the hidden switch and two telescoping lenses project forward creating a surprisingly powerful set of binoculars (50X). Night-vision add-on is available for midnight hour operations. + + + 384 + 19 + FF007 + Eavesdrop Detector + image.gif + 99.99 + Worried that counteragents have placed listening devices in your home or office? No problem! Use our bug-sweeping wiener to check your surroundings for unwanted surveillance devices. Just wave the frankfurter around the room ... when bugs are detected, this "foot-long" beeps! Comes complete with bun, relish, mustard, and headphones for privacy. + + + 385 + 16 + LNGWADN + Escape Cord + image.gif + 13.99 + Any agent assigned to mountain terrain should carry this ordinary-looking extension cord ... except that it's really a rappelling rope! Pull quickly on each end to convert the electrical cord into a rope capable of safely supporting up to two agents. Comes in various sizes including Mt McKinley, Everest, and Kilimanjaro. WARNING: To prevent serious injury, be sure to disconnect from wall socket before use. + + + 386 + 17 + 1MOR4ME + Cocktail Party Pal + image.gif + 69.99 + Do your assignments have you flitting from one high society party to the next? Worried about keeping your wits about you as you mingle witih the champagne-and-caviar crowd? No matter how many drinks you're offered, you can safely operate even the most complicated heavy machinery as long as you use our model 1MOR4ME alcohol-neutralizing coaster. Simply place the beverage glass on the patented circle to eliminate any trace of alcohol in the drink. + + + 387 + 20 + SQRTME1 + Remote Foliage Feeder + image.gif + 9.99 + Even spies need to care for their office plants. With this handy remote watering device, you can water your flowers as a spy should, from the comfort of your chair. Water your plants from up to 50 feet away. Comes with an optional aiming system that can be mounted to the top for improved accuracy. + + + 388 + 20 + ICUCLRLY00 + Contact Lenses + image.GIF + 59.99 + Traditional binoculars and night goggles can be bulky, especially for assignments in confined areas. The problem is solved with these patent-pending contact lenses, which give excellent visibility up to 100 miles. New feature: now with a night vision feature that permits you to see in complete darkness! Contacts now come in a variety of fashionable colors for coordinating with your favorite ensembles. + + + 389 + 20 + OPNURMIND + Telekinesis Spoon + image.gif + 2.99 + Learn to move things with your mind! Broaden your mental powers using this training device to hone telekinesis skills. Simply look at the device, concentrate, and repeat "There is no spoon" over and over. + + + 390 + 19 + ULOST007 + Rubber Stamp Beacon + image.gif + 129.99 + With the Rubber Stamp Beacon, you'll never get lost on your missions again. As you proceed through complicated terrain, stamp a stationary object with this device. Once an object has been stamped, the stamp's patented ink will emit a signal that can be detected up to 153.2 miles away by the receiver embedded in the device's case. WARNING: Do not expose ink to water. + + + 391 + 17 + BSUR2DUC + Bullet Proof Facial Tissue + image.gif + 79.99 + Being a spy can be dangerous work. Our patented Bulletproof Facial Tissue gives a spy confidence that any bullets in the vicinity risk-free. Unlike traditional bulletproof devices, these lightweight tissues have amazingly high tensile strength. To protect the upper body, simply place a tissue in your shirt pocket. To protect the lower body, place a tissue in your pants pocket. If you do not have any pockets, be sure to check out our Bulletproof Tape. 100 tissues per box. WARNING: Bullet must not be moving for device to successfully stop penetration. + + + 393 + 20 + NOBOOBOO4U + Speed Bandages + image.GIF + 3.99 + Even spies make mistakes. Barbed wire and guard dogs pose a threat of injury for the active spy. Use our special bandages on cuts and bruises to rapidly heal the injury. Depending on the severity of the wound, the bandages can take between 10 to 30 minutes to completely heal the injury. + + + 394 + 15 + BHONST93 + Correction Fluid + image.gif + 1.99 + Disguised as typewriter correction fluid, this scientific truth serum forces subjects to correct anything not perfectly true. Simply place a drop of the special correction fluid on the tip of the subject's nose. Within seconds, the suspect will automatically correct every lie. Effects from Correction Fluid last approximately 30 minutes per drop. WARNING: Discontinue use if skin appears irritated. + + + 396 + 19 + BPRECISE00 + Dilemma Resolution Device + image.gif + 11.99 + Facing a brick wall? Stopped short at a long, sheer cliff wall? Carry our handy lightweight calculator for just these emergencies. Quickly enter in your dilemma and the calculator spews out the best solutions to the problem. Manufacturer Warning: Use at own risk. Suggestions may lead to adverse outcomes. + + + 397 + 14 + LSRPTR1 + Nonexplosive Cigar + image.gif + 29.99 + Contrary to popular spy lore, not all cigars owned by spies explode! Best used during mission briefings, our Nonexplosive Cigar is really a cleverly-disguised, top-of-the-line, precision laser pointer. Make your next presentation a hit. + + + 399 + 20 + QLT2112 + Document Transportation System + image.gif + 299.99 + Keep your stolen Top Secret documents in a place they'll never think to look! This patent leather briefcase has multiple pockets to keep documents organized. Top quality craftsmanship to last a lifetime. + + + 400 + 15 + THNKDKE1 + Hologram Cufflinks + image.gif + 799.99 + Just point, and a turn of the wrist will project a hologram of you up to 100 yards away. Sneaking past guards will be child's play when you've sent them on a wild goose chase. Note: Hologram adds ten pounds to your appearance. + + + 401 + 14 + TCKLR1 + Fake Moustache Translator + image.gif + 599.99 + Fake Moustache Translator attaches between nose and mouth to double as a language translator and identity concealer. Sophisticated electronics translate your voice into the desired language. Wriggle your nose to toggle between Spanish, English, French, and Arabic. Excellent on diplomatic missions. + + + 404 + 14 + JWLTRANS6 + Interpreter Earrings + image.gif + 459.99 + The simple elegance of our stylish monosex earrings accents any wardrobe, but their clean lines mask the sophisticated technology within. Twist the lower half to engage a translator function that intercepts spoken words in any language and converts them to the wearer's native tongue. Warning: do not use in conjunction with our Fake Moustache Translator product, as the resulting feedback loop makes any language sound like Pig Latin. + + + 406 + 19 + GRTWTCH9 + Multi-Purpose Watch + image.gif + 399.99 + In the tradition of famous spy movies, the Multi Purpose Watch comes with every convenience! Installed with lighter, TV, camera, schedule-organizing software, MP3 player, water purifier, spotlight, and tire pump. Special feature: Displays current date and time. Kitchen sink add-on will be available in the fall of 2001. + + + 14 + Communications + + + 15 + Deception + + + 16 + Travel + + + 17 + Protection + + + 18 + Munitions + + + 19 + Tools + + + 20 + General + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewExample/bin/Debug/store.xsd b/Pro Windows Forms 2.0/Chapter06/ListViewExample/bin/Debug/store.xsd new file mode 100644 index 0000000..df3f001 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewExample/bin/Debug/store.xsd @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Form1.Designer.cs new file mode 100644 index 0000000..4e74b57 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Form1.Designer.cs @@ -0,0 +1,95 @@ +namespace ListViewVirtualization +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.listView = new System.Windows.Forms.ListView(); + this.imagesLarge = new System.Windows.Forms.ImageList(this.components); + this.imagesSmall = new System.Windows.Forms.ImageList(this.components); + this.lblStatus = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // listView + // + this.listView.AllowColumnReorder = true; + this.listView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listView.GridLines = true; + this.listView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.listView.Location = new System.Drawing.Point(6, 5); + this.listView.Name = "listView"; + this.listView.Size = new System.Drawing.Size(402, 316); + this.listView.Sorting = System.Windows.Forms.SortOrder.Ascending; + this.listView.TabIndex = 4; + this.listView.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.listView_RetrieveVirtualItem); + // + // imagesLarge + // + this.imagesLarge.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imagesLarge.ImageStream"))); + this.imagesLarge.Images.SetKeyName(0, ""); + // + // imagesSmall + // + this.imagesSmall.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imagesSmall.ImageStream"))); + this.imagesSmall.Images.SetKeyName(0, ""); + // + // lblStatus + // + this.lblStatus.AutoSize = true; + this.lblStatus.Location = new System.Drawing.Point(12, 328); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Size = new System.Drawing.Size(0, 0); + this.lblStatus.TabIndex = 5; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(416, 350); + this.Controls.Add(this.lblStatus); + this.Controls.Add(this.listView); + this.Name = "Form1"; + this.Text = "ListView Virtualization"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListView listView; + private System.Windows.Forms.ImageList imagesLarge; + private System.Windows.Forms.ImageList imagesSmall; + private System.Windows.Forms.Label lblStatus; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Form1.cs b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Form1.cs new file mode 100644 index 0000000..ec35562 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Form1.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ListViewVirtualization +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + listView.View = View.Details; + listView.VirtualMode = true; + listView.VirtualListSize = NorthwindDB.GetOrdersCount(); + + // Suspending automatic refreshes as items are added/removed. + listView.BeginUpdate(); + + listView.SmallImageList = imagesSmall; + listView.LargeImageList = imagesLarge; + + // Add column headers for Details view. + listView.Columns.Add("ID", 100, HorizontalAlignment.Left); + listView.Columns.Add("ShippedDate", 100, HorizontalAlignment.Left); + + // Re-enable the display. + listView.EndUpdate(); + } + + private DataTable dtCachedItems; + private void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) + { + // Check if the item is in the local cache. + DataRow match = null; + if (dtCachedItems != null) + match = dtCachedItems.Rows.Find(e.ItemIndex + 1); + + if (match == null) + { + // The item isn't in memory. + // Get a new range of 100 records. + int from, to; + if (e.ItemIndex < 50) + from = 0; + else + from = (e.ItemIndex - 50); + + to = from + 100; + dtCachedItems = NorthwindDB.GetOrders(from, to); + + // Don't use the MessageBox to show this information. + // Hiding any part of the ListView can retrigger this event. + lblStatus.Text = String.Format( + "Fetched rows from {0} to {1}.", + from.ToString(), to.ToString()); + + match = dtCachedItems.Rows.Find(e.ItemIndex + 1); + } + + // Create the ListViewItem for the matching record. + e.Item = new ListViewItem(match["OrderID"].ToString()); + e.Item.SubItems.Add(match["ShippedDate"].ToString()); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Form1.resx b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Form1.resx new file mode 100644 index 0000000..3eb7478 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Form1.resx @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 244, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABG + CwAAAk1TRnQBSQFMAwEBAAEEAQABBAEAASABAAEgAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA + AYADAAEgAwABAQEAAQgGAAEQGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA + AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA + AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm + AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ + AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm + AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz + AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm + AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm + AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA + ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm + AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm + ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm + AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA + AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ + AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz + AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/ + AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA + AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM + AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm + ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ + AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ + ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM + ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm + AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM + AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA + AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA + ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7 + Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8IAAHxAu8BvAHyAvR5AAES + AhMBEgFtAe0B7wG8AfIC9HUAAfcBBwLsARMBFQETARIBbQHtAe8BvAHyAvRxAAHvAfEBkgH/AfEBvAH3 + AewBEwEVARMBEgFtAewB7wG8AfJvAAHvAfEB9wH/Ae0BbQHsAfcB7wEHAfcBbQETARUBEwESAewB8m4A + Ae8B8QH3Af8B7QLsAe8B7AFtAewB7QH3Ae8B7QFtARIB8m4AAe8BvAHvAf8C7AH0AbwC9AHyAQcB7AFt + Ad0B7AESAfJuAAHvAbwB7wH0AewB7wHyAfQC/wHvAfEBBwFtAd0B7AESAfJuAAHvAbwB7wH0AuwB9wHv + AQcC8QG8AfcBbQHdAewBEgHybgAB7wEHAe8B8gHsBW0B7QH3AQcB7AHdAewBEgHybgAB7wEHAe8B8gHs + CRIB3QHsARIB8m4AAu8BBwHyAewJEgHdAewBEgHybgAC7wEHAfEB7AkSAfQB7AESAfJuAALvAQcB8QFt + CRIB9AHsARIB8m4AAQcB7wK8AW0JEwH/AewBEgHybgABBwHvArwBbQkTAf8B7AESAfJuAAEHAfcBvAEH + AW0JEwH/AewBEgHybgABBwGSAfEBBwFtAe8B7QFtBhMB/wHsARIB8m4AAQcBkgHxAe8BbQETAW0B7QLv + AZIB7AFtARUB9AHsARIB8m4AAQcB7QHxAe8BbQIVASwDJQHsAZIBbQH0AewBEgHybgABBwHtAfIB7wES + AhUBJAMsASUCFQHyAewBEgHybgABBwHsAfIB7wESAxUBJAElAUMDFQHyAewBEgHybgABBwHsAfQB9wHv + Ae0B7AFtARMFQwHxAewBEgHybgABBwHsAfQB7wH3BO8BBwGSAewBbQEVAfEB7AESAfJuAAEHAewC8QHv + AfcE7wIHA7wB7AESAfJuAAEHAewB7QG8AfIB9AHyAfEBvAEHAe8CBwK8AewBEgHybgABBwJtA+wB7wEH + AfED9APxAW0BEgHybgAB7wISBewC7QH3AQcBvAHxAQcBbQESAfJuAAHvCOwC7QKSAfcBkgFtARIB8m4A + Ae8B7QNtAewBbQHsAW0B7ALtAZIB7AETAm0B8nIAAfEBvAH3Au0DbQHsAe8B9wFtAe8B9HgAAfIBvAHv + AfcCBwH0aAABQgFNAT4HAAE+AwABKAMAAYADAAEgAwABAQEAAQEGAAECFgAD/wEAAf4BAwL/DAAB/gEA + AT8B/wwAAf4BAAEDAf8MAAH+AgAB/wwAAf4CAAF/DAAB/gIAAX8MAAH+AgABfwwAAf4CAAF/DAAB/gIA + AX8MAAH+AgABfwwAAf4CAAF/DAAB/gIAAX8MAAH+AgABfwwAAf4CAAF/DAAB/gIAAX8MAAH+AgABfwwA + Af4CAAF/DAAB/gIAAX8MAAH+AgABfwwAAf4CAAF/DAAB/gIAAX8MAAH+AgABfwwAAf4CAAF/DAAB/gIA + AX8MAAH+AgABfwwAAf4CAAF/DAAB/gIAAX8MAAH+AgABfwwAAf4CAAF/DAAB/gIAAX8MAAH/AeABAAF/ + DAAC/wGAAf8MAAs= + + + + 358, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABK + CAAAAk1TRnQBSQFMAwEBAAEEAQABBAEAARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA + AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA + AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA + AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm + AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ + AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm + AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz + AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm + AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm + AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA + ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm + AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm + ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm + AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA + AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ + AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz + AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/ + AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA + AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM + AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm + ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ + AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ + ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM + ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm + AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM + AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA + AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA + ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7 + Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8BAAT/CvQC/zAABP8B8QHt + AewBkgEHAbwB8QHyAfMB9AL/MAAE/wLtAesBEgHqAW0B7AHtAe8B9AL/MAAE/wHtAQcCtQH3AewB6wHq + AW0B8gL/MAAE/wHtAbwB7QG8AfABvAG1AfcBEgHyAv8wAAT/Ae0BBwHtAfcB7wEHAfcB7QESAfIC/zAA + BP8B7QEHAewC6gFtAa4BkgESAfIC/zAABP8BkgEHAesE6gGSARIB8gL/MAAE/wGSAQcB6wQSAe0BEgHy + Av8wAAT/AZIBBwHrAm4C6wHtARIB8gL/MAAE/wGSAQcC6gJMARIB7AESAfIC/zAABP8BkgEHAewBbQFL + AUQBFQHsARIB8gL/MAAE/wGSAgcB7wH3Ae8B9wHtARIB8gL/MAAE/wGSAW0B7QHvAQcB8AHxAfcB6gHy + Av8wAAT/Ae0B6wPsAZIB7QHrAW0B8gL/MAAE/wL0AfABvAEHAu0B9wL0Av8wAAFCAU0BPgcAAT4DAAEo + AwABQAMAARADAAEBAQABAQUAAYAXAAP/gQAL + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.csproj b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.csproj new file mode 100644 index 0000000..0da941b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.csproj @@ -0,0 +1,72 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {A29E52EE-9D27-428C-AD59-6F69855706CC} + WinExe + Properties + ListViewVirtualization + ListViewVirtualization + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.csproj.user b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.sln b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.sln new file mode 100644 index 0000000..257e4b9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ListViewVirtualization", "ListViewVirtualization.csproj", "{A29E52EE-9D27-428C-AD59-6F69855706CC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A29E52EE-9D27-428C-AD59-6F69855706CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A29E52EE-9D27-428C-AD59-6F69855706CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A29E52EE-9D27-428C-AD59-6F69855706CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A29E52EE-9D27-428C-AD59-6F69855706CC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.suo b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.suo new file mode 100644 index 0000000..7a8d122 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/ListViewVirtualization.suo differ diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/NorthwindDB.cs b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/NorthwindDB.cs new file mode 100644 index 0000000..0001eb6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/NorthwindDB.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data.SqlClient; +using System.Data; + +namespace ListViewVirtualization +{ + public class NorthwindDB + { + private static string connectionString = Properties.Settings.Default.ConnectionString; + + public static int GetOrdersCount() + { + // Create the command and the connection. + string sql = "SELECT COUNT(*) FROM Orders"; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand(sql, con); + + // Get the number of records. + using (con) + { + con.Open(); + return (int)cmd.ExecuteScalar(); + } + } + + public static DataTable GetOrders(int fromOrderID, int toOrderID) + { + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetOrdersByPage", con); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new SqlParameter("@FromID", SqlDbType.Int, 4)); + cmd.Parameters["@FromID"].Value = fromOrderID; + cmd.Parameters.Add(new SqlParameter("@ToID", SqlDbType.Int, 4)); + cmd.Parameters["@ToID"].Value = toOrderID; + + // Prepare to fill a new DataSet. + SqlDataAdapter adapter = new SqlDataAdapter(cmd); + DataSet ds = new DataSet(); + + // Get the appropriate "page" of order records. + adapter.Fill(ds); + ds.Tables[0].PrimaryKey = new DataColumn[] { ds.Tables[0].Columns["ID"] }; + return ds.Tables[0]; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/OrdersByPage.sql b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/OrdersByPage.sql new file mode 100644 index 0000000..9868f60 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/OrdersByPage.sql differ diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Program.cs b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Program.cs new file mode 100644 index 0000000..e75552e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ListViewVirtualization +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..acb9967 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ListViewVirtualization")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ListViewVirtualization")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("63d11d88-7494-47c4-8370-d8849fdd51fe")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Resources.Designer.cs new file mode 100644 index 0000000..5888203 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ListViewVirtualization.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ListViewVirtualization.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ListViewVirtualization.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace ListViewVirtualization.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ListViewVirtualization.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Settings.Designer.cs new file mode 100644 index 0000000..05e2618 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Settings.Designer.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ListViewVirtualization.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI")] + public string ConnectionString { + get { + return ((string)(this["ConnectionString"])); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Settings.settings new file mode 100644 index 0000000..7d6871f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/Properties/Settings.settings @@ -0,0 +1,9 @@ + + + + + + Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/app.config b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/app.config new file mode 100644 index 0000000..de7d729 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/app.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/bin/Debug/ListViewVirtualization.exe b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/bin/Debug/ListViewVirtualization.exe new file mode 100644 index 0000000..ef30780 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/bin/Debug/ListViewVirtualization.exe differ diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/bin/Debug/ListViewVirtualization.exe.config b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/bin/Debug/ListViewVirtualization.exe.config new file mode 100644 index 0000000..240207b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/bin/Debug/ListViewVirtualization.exe.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/bin/Debug/ListViewVirtualization.vshost.exe.config b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/bin/Debug/ListViewVirtualization.vshost.exe.config new file mode 100644 index 0000000..240207b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/ListViewVirtualization/bin/Debug/ListViewVirtualization.vshost.exe.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Form1.Designer.cs new file mode 100644 index 0000000..9357fbc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Form1.Designer.cs @@ -0,0 +1,106 @@ +namespace TreeViewDragAndDrop +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.treeOne = new System.Windows.Forms.TreeView(); + this.treeTwo = new System.Windows.Forms.TreeView(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.treeOne); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.treeTwo); + this.splitContainer1.Size = new System.Drawing.Size(456, 391); + this.splitContainer1.SplitterDistance = 238; + this.splitContainer1.TabIndex = 0; + this.splitContainer1.Text = "splitContainer1"; + // + // treeOne + // + this.treeOne.Dock = System.Windows.Forms.DockStyle.Left; + this.treeOne.HideSelection = false; + this.treeOne.Location = new System.Drawing.Point(0, 0); + this.treeOne.Name = "treeOne"; + this.treeOne.Size = new System.Drawing.Size(236, 391); + this.treeOne.TabIndex = 5; + this.treeOne.DragDrop += new System.Windows.Forms.DragEventHandler(this.tree_DragDrop); + this.treeOne.DragOver += new System.Windows.Forms.DragEventHandler(this.tree_DragOver); + this.treeOne.DoubleClick += new System.EventHandler(this.tree_DoubleClick); + this.treeOne.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tree_MouseDown); + // + // treeTwo + // + this.treeTwo.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeTwo.Location = new System.Drawing.Point(0, 0); + this.treeTwo.Name = "treeTwo"; + this.treeTwo.Size = new System.Drawing.Size(214, 391); + this.treeTwo.TabIndex = 7; + this.treeTwo.DragDrop += new System.Windows.Forms.DragEventHandler(this.tree_DragDrop); + this.treeTwo.DragOver += new System.Windows.Forms.DragEventHandler(this.tree_DragOver); + this.treeTwo.DoubleClick += new System.EventHandler(this.tree_DoubleClick); + this.treeTwo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.tree_MouseDown); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(456, 391); + this.Controls.Add(this.splitContainer1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "TreeView Drag-And-Drop"; + this.Load += new System.EventHandler(this.Form1_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TreeView treeOne; + private System.Windows.Forms.TreeView treeTwo; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Form1.cs b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Form1.cs new file mode 100644 index 0000000..20f41eb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Form1.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace TreeViewDragAndDrop +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + TreeNode node = treeOne.Nodes.Add("Fruits"); + node.Nodes.Add("Apple"); + node.Nodes.Add("Peach"); + node.Expand(); + + node = treeTwo.Nodes.Add("Vegetables"); + node.Nodes.Add("Tomato"); + node.Nodes.Add("Eggplant"); + node.Expand(); + + treeTwo.AllowDrop = true; + treeOne.AllowDrop = true; + } + + private void tree_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) + { + // Get the tree. + TreeView tree = (TreeView)sender; + + // Get the node underneath the mouse. + TreeNode node = tree.GetNodeAt(e.X, e.Y); + tree.SelectedNode = node; + + // Start the drag-and-drop operation with the node. + if (node != null) + { + tree.DoDragDrop(node, DragDropEffects.Copy); + } + } + private void tree_DragOver(object sender, System.Windows.Forms.DragEventArgs e) + { + // Get the tree. + TreeView tree = (TreeView)sender; + + // Drag and drop denied by default. + e.Effect = DragDropEffects.None; + + TreeNode nodeSource = (TreeNode)e.Data.GetData(typeof(TreeNode)); + + // Make sure it's a valid format? + if (nodeSource != null) + { + // Make sure it's not from the current tree. + if (nodeSource.TreeView != tree) + { + // Get the screen point. + Point pt = new Point(e.X, e.Y); + + // Convert to a point in the TreeView's coordinate system. + pt = tree.PointToClient(pt); + + // Is the mouse over a valid node? + TreeNode nodeTarget = tree.GetNodeAt(pt); + if (nodeTarget != null) + { + e.Effect = DragDropEffects.Copy; + tree.SelectedNode = nodeTarget; + } + } + } + } + private void tree_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) + { + // Get the tree. + TreeView tree = (TreeView)sender; + + // Get the screen point. + Point pt = new Point(e.X, e.Y); + + // Convert to a point in the TreeView's coordinate system. + pt = tree.PointToClient(pt); + + // Get the node underneath the mouse. + TreeNode nodeTarget = tree.GetNodeAt(pt); + + // Add a child node. + TreeNode nodeSource = (TreeNode)e.Data.GetData(typeof(TreeNode)); + nodeTarget.Nodes.Add((TreeNode)nodeSource.Clone()); + + // Uncomment to make this a move. + //nodeSource.Remove(); + + // Show the newly added node if it is not already visible. + nodeTarget.Expand(); + } + + private void tree_DoubleClick(object sender, EventArgs e) + { + MessageBox.Show(((TreeView)sender).SelectedNode.FullPath); + + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Form1.resx b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Program.cs b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Program.cs new file mode 100644 index 0000000..31a79e6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace TreeViewDragAndDrop +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..af6ec4f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("TreeViewDragAndDrop")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TreeViewDragAndDrop")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0a158f45-bcbc-477c-8c37-ab44693ab05a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d9e4b24 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TreeViewDragAndDrop.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TreeViewDragAndDrop.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TreeViewDragAndDrop.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace TreeViewDragAndDrop.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TreeViewDragAndDrop.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Settings.Designer.cs new file mode 100644 index 0000000..181a165 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TreeViewDragAndDrop.Properties.Settings.get_Default():TreeViewDragAndDrop.Properties.Settings")] + +namespace TreeViewDragAndDrop.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.csproj b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.csproj new file mode 100644 index 0000000..159b93a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {BA7A9D1E-0D9C-43E6-A04B-F2B13F66D642} + WinExe + Properties + TreeViewDragAndDrop + TreeViewDragAndDrop + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.csproj.user b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.sln b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.sln new file mode 100644 index 0000000..01936e6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TreeViewDragAndDrop", "TreeViewDragAndDrop.csproj", "{BA7A9D1E-0D9C-43E6-A04B-F2B13F66D642}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BA7A9D1E-0D9C-43E6-A04B-F2B13F66D642}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BA7A9D1E-0D9C-43E6-A04B-F2B13F66D642}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA7A9D1E-0D9C-43E6-A04B-F2B13F66D642}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BA7A9D1E-0D9C-43E6-A04B-F2B13F66D642}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.suo b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.suo new file mode 100644 index 0000000..124b621 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/TreeViewDragAndDrop.suo differ diff --git a/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/bin/Debug/TreeViewDragAndDrop.exe b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/bin/Debug/TreeViewDragAndDrop.exe new file mode 100644 index 0000000..a9b2a28 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter06/TreeViewDragAndDrop/bin/Debug/TreeViewDragAndDrop.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.csproj b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.csproj new file mode 100644 index 0000000..97fa8eb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.csproj @@ -0,0 +1,77 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {BF0ABB8D-29F0-4033-AE24-2F833D0540DB} + WinExe + Properties + AlphaBlending + AlphaBlending + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.csproj.user b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.sln b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.sln new file mode 100644 index 0000000..be1fffb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AlphaBlending", "AlphaBlending.csproj", "{BF0ABB8D-29F0-4033-AE24-2F833D0540DB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BF0ABB8D-29F0-4033-AE24-2F833D0540DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF0ABB8D-29F0-4033-AE24-2F833D0540DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF0ABB8D-29F0-4033-AE24-2F833D0540DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF0ABB8D-29F0-4033-AE24-2F833D0540DB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.suo b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.suo new file mode 100644 index 0000000..cd42e97 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/AlphaBlending.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Form1.Designer.cs new file mode 100644 index 0000000..8c4eb15 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Form1.Designer.cs @@ -0,0 +1,48 @@ +namespace AlphaBlending +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "Form1"; + this.Text = "Alpha Blending"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Form1.cs b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Form1.cs new file mode 100644 index 0000000..76674f7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Form1.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace AlphaBlending +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Paint(object sender, PaintEventArgs e) + { + // Fill the background with a tile. + Bitmap bitmap = Properties.Resources.Pic; + TextureBrush brush = new TextureBrush(bitmap); + e.Graphics.FillRectangle(brush, ClientRectangle); + bitmap.Dispose(); + + // Draw some solid content. + Color color = Color.Yellow; + int penWidth = 80; + Pen opaquePen = new Pen(color, penWidth); + e.Graphics.DrawLine(opaquePen, 0, 50, 200, 20); + opaquePen.Dispose(); + + // Make the color partly transparent (50%). + Color semiTransparentColor = Color.FromArgb(128, color.R, color.G, color.B); + Pen semiTransparentPen = new Pen(semiTransparentColor, penWidth); + e.Graphics.DrawLine(semiTransparentPen, 0, 200, 200, 140); + semiTransparentPen.Dispose(); + + // Make the color very transparent (70%). + Color veryTransparentColor = Color.FromArgb(77, color.R, color.G, color.B); + Pen veryTransparentPen = new Pen(veryTransparentColor, penWidth); + e.Graphics.DrawLine(veryTransparentPen, 0, 350, 200, 260); + veryTransparentPen.Dispose(); + + // Draw some transparent text. + Brush transparentBrush = new SolidBrush(semiTransparentColor); + e.Graphics.DrawString("TRANSPARENT", new Font("Verdana", 36, FontStyle.Bold), + transparentBrush, 80, 150); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Form1.resx b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Program.cs b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Program.cs new file mode 100644 index 0000000..3df26b1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace AlphaBlending +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f7b0d18 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AlphaBlending")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AlphaBlending")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("78f1362c-7c23-4491-9c05-7d0969f62f88")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Resources.Designer.cs new file mode 100644 index 0000000..640dc37 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="AlphaBlending.Properties.Resources.get_ResourceManager():System.Resources.Resourc" + + "eManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="AlphaBlending.Properties.Resources.get_Culture():System.Globalization.CultureInfo" + + "")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="AlphaBlending.Properties.Resources.set_Culture(System.Globalization.CultureInfo):" + + "Void")] + +namespace AlphaBlending.Properties { + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AlphaBlending.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap Pic { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("Pic", resourceCulture))); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Resources.resx new file mode 100644 index 0000000..58ffdb7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Resources.resx @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\stones.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Settings.Designer.cs new file mode 100644 index 0000000..7ee098b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AlphaBlending.Properties.Settings.get_Default():AlphaBlending.Properties.Settings")] + +namespace AlphaBlending.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Resources/ChurchHighQuality.jpg b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Resources/ChurchHighQuality.jpg new file mode 100644 index 0000000..154e591 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Resources/ChurchHighQuality.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Resources/stones.jpg b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Resources/stones.jpg new file mode 100644 index 0000000..54d4f7b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/Resources/stones.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter07/AlphaBlending/bin/Debug/AlphaBlending.exe b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/bin/Debug/AlphaBlending.exe new file mode 100644 index 0000000..edf9ffb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/AlphaBlending/bin/Debug/AlphaBlending.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.csproj b/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.csproj new file mode 100644 index 0000000..bfcc672 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.csproj @@ -0,0 +1,110 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {96770A00-F849-45DF-A67B-06C88636A05B} + WinExe + Properties + Brush + Brushes + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + GradientBrushes.cs + + + Form + + + HatchBrushes.cs + + + Form + + + Menu.cs + + + Form + + + PathGradient.cs + + + + + GradientBrushes.cs + + + HatchBrushes.cs + + + Menu.cs + + + PathGradient.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + TextureBrushes.cs + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Form + + + TextureBrushes.cs + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.csproj.user b/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.sln b/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.sln new file mode 100644 index 0000000..911b4fb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Brushes", "Brushes.csproj", "{96770A00-F849-45DF-A67B-06C88636A05B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {96770A00-F849-45DF-A67B-06C88636A05B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96770A00-F849-45DF-A67B-06C88636A05B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96770A00-F849-45DF-A67B-06C88636A05B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96770A00-F849-45DF-A67B-06C88636A05B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.suo b/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.suo new file mode 100644 index 0000000..f08b20b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Brushes/Brushes.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/GradientBrushes.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/GradientBrushes.Designer.cs new file mode 100644 index 0000000..fe9effa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/GradientBrushes.Designer.cs @@ -0,0 +1,47 @@ +namespace Brush +{ + partial class GradientBrushes + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // GradientBrushes + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(548, 359); + this.Name = "GradientBrushes"; + this.Text = "GradientBrushes"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.GradientBrushes_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/GradientBrushes.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/GradientBrushes.cs new file mode 100644 index 0000000..1cde8ae --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/GradientBrushes.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace Brush +{ + public partial class GradientBrushes : Form + { + public GradientBrushes() + { + InitializeComponent(); + } + + private void GradientBrushes_Paint(object sender, PaintEventArgs e) + { + LinearGradientBrush myBrush; + int y = 20; + int x = 20; + + foreach (LinearGradientMode gradientStyle in System.Enum.GetValues(typeof(LinearGradientMode))) + { + myBrush = new LinearGradientBrush(new Rectangle(x, y, 100, 60), Color.Violet, Color.White, gradientStyle); + e.Graphics.FillRectangle(myBrush, x, y, 100, 60); + e.Graphics.DrawString(gradientStyle.ToString(), new Font("Tahoma", 8), Brushes.Black, 110 + x, y + 20); + y += 70; + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/GradientBrushes.resx b/Pro Windows Forms 2.0/Chapter07/Brushes/GradientBrushes.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/GradientBrushes.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/HatchBrushes.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/HatchBrushes.Designer.cs new file mode 100644 index 0000000..537eca7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/HatchBrushes.Designer.cs @@ -0,0 +1,47 @@ +namespace Brush +{ + partial class HatchBrushes + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // HatchBrushes + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(554, 381); + this.Name = "HatchBrushes"; + this.Text = "HatchBrushes"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.HatchBrushes_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/HatchBrushes.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/HatchBrushes.cs new file mode 100644 index 0000000..4b8e291 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/HatchBrushes.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace Brush +{ + public partial class HatchBrushes : Form + { + public HatchBrushes() + { + InitializeComponent(); + } + + private void HatchBrushes_Paint(object sender, PaintEventArgs e) + { + + int y = 20; + int x = 20; + + Font font = new Font("Tahoma", 8); + // Enumerate over all the styles. + foreach (HatchStyle brushStyle in System.Enum.GetValues(typeof(HatchStyle))) + { + HatchBrush myBrush = new HatchBrush(brushStyle, Color.Blue, Color.LightYellow); + + // Fill a rectangle with the brush. + e.Graphics.FillRectangle(myBrush, x, y, 40, 20); + + // Display the brush name. + e.Graphics.DrawString(brushStyle.ToString(), font, + Brushes.Black, 50 + x, y + 5); + + y += 30; + if ((y + 30) > this.ClientSize.Height) + { + y = 20; + x += 180; + } + myBrush.Dispose(); + } + font.Dispose(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/HatchBrushes.resx b/Pro Windows Forms 2.0/Chapter07/Brushes/HatchBrushes.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/HatchBrushes.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Menu.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/Menu.cs new file mode 100644 index 0000000..48ba415 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace Brush +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("Brush." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/Menu.designer.cs new file mode 100644 index 0000000..77e480e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Menu.designer.cs @@ -0,0 +1,98 @@ +namespace Brush +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(118, 23); + this.button1.TabIndex = 0; + this.button1.Text = "HatchBrushes"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(118, 23); + this.button2.TabIndex = 1; + this.button2.Text = "GradientBrushes"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 70); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(118, 23); + this.button3.TabIndex = 2; + this.button3.Text = "PathGradient"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 99); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(118, 23); + this.button4.TabIndex = 3; + this.button4.Text = "TextureBrushes"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 156); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Menu.resx b/Pro Windows Forms 2.0/Chapter07/Brushes/Menu.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Menu.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/PathGradient.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/PathGradient.Designer.cs new file mode 100644 index 0000000..b6b61ac --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/PathGradient.Designer.cs @@ -0,0 +1,47 @@ +namespace Brush +{ + partial class PathGradient + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // PathGradient + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "PathGradient"; + this.Text = "PathGradient"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.PathGradient_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/PathGradient.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/PathGradient.cs new file mode 100644 index 0000000..e81fd25 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/PathGradient.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace Brush +{ + public partial class PathGradient : Form + { + public PathGradient() + { + InitializeComponent(); + } + + private void PathGradient_Paint(object sender, PaintEventArgs e) + { + GraphicsPath path = new GraphicsPath(); + int size = 150; + path.AddEllipse(10, 10, size, size); + + PathGradientBrush brush = new PathGradientBrush(path); + brush.WrapMode = WrapMode.Tile; + brush.SurroundColors = new Color[] { Color.White }; + brush.CenterColor = Color.Violet; + e.Graphics.FillRectangle(brush, 10, 10, size, size); + + path.Dispose(); + brush.Dispose(); + + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/PathGradient.resx b/Pro Windows Forms 2.0/Chapter07/Brushes/PathGradient.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/PathGradient.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Program.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/Program.cs new file mode 100644 index 0000000..6071e38 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Brush +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..78adbc0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Brushes")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Brushes")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("52b1d460-fe8e-49d7-b8ab-e1038f8e781a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Resources.Designer.cs new file mode 100644 index 0000000..ef52ae5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Resources.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="Brush.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager" + + "")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="Brush.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="Brush.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace Brush.Properties { + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Brush.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap tile { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("tile", resourceCulture))); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Resources.resx new file mode 100644 index 0000000..4b2888a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Resources.resx @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\tile.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Settings.Designer.cs new file mode 100644 index 0000000..fe13819 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Settings.Designer.cs @@ -0,0 +1,27 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="Brush.Properties.Settings.get_Default():Brush.Properties.Settings")] + +namespace Brush.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/Resources/tile.bmp b/Pro Windows Forms 2.0/Chapter07/Brushes/Resources/tile.bmp new file mode 100644 index 0000000..606f167 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Brushes/Resources/tile.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/TextureBrushes.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/TextureBrushes.Designer.cs new file mode 100644 index 0000000..f62cc57 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/TextureBrushes.Designer.cs @@ -0,0 +1,47 @@ +namespace Brush +{ + partial class TextureBrushes + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // TextureBrushes + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(492, 353); + this.Name = "TextureBrushes"; + this.Text = "TextureBrushes"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.TextureBrushes_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/TextureBrushes.cs b/Pro Windows Forms 2.0/Chapter07/Brushes/TextureBrushes.cs new file mode 100644 index 0000000..8338764 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/TextureBrushes.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Brush +{ + public partial class TextureBrushes : Form + { + public TextureBrushes() + { + InitializeComponent(); + } + + private void TextureBrushes_Paint(object sender, PaintEventArgs e) + { + TextureBrush myBrush = new TextureBrush(Properties.Resources.tile); + e.Graphics.FillRectangle(myBrush, e.Graphics.ClipBounds); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/TextureBrushes.resx b/Pro Windows Forms 2.0/Chapter07/Brushes/TextureBrushes.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Brushes/TextureBrushes.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Brushes/bin/Debug/Brushes.exe b/Pro Windows Forms 2.0/Chapter07/Brushes/bin/Debug/Brushes.exe new file mode 100644 index 0000000..32281ef Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Brushes/bin/Debug/Brushes.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.csproj b/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.csproj new file mode 100644 index 0000000..df3c070 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {76B79F84-512E-48BF-947A-4A9C9081D1A3} + WinExe + Properties + Clipping + Clipping + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.csproj.user b/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.sln b/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.sln new file mode 100644 index 0000000..56e2444 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Clipping", "Clipping.csproj", "{76B79F84-512E-48BF-947A-4A9C9081D1A3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {76B79F84-512E-48BF-947A-4A9C9081D1A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76B79F84-512E-48BF-947A-4A9C9081D1A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76B79F84-512E-48BF-947A-4A9C9081D1A3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76B79F84-512E-48BF-947A-4A9C9081D1A3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.suo b/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.suo new file mode 100644 index 0000000..8f87bca Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Clipping/Clipping.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Clipping/Form1.Designer.cs new file mode 100644 index 0000000..8aad179 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Form1.Designer.cs @@ -0,0 +1,66 @@ +namespace Clipping +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.chkClipping = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // chkClipping + // + this.chkClipping.AutoSize = true; + this.chkClipping.Checked = true; + this.chkClipping.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkClipping.Location = new System.Drawing.Point(12, 300); + this.chkClipping.Name = "chkClipping"; + this.chkClipping.Size = new System.Drawing.Size(80, 17); + this.chkClipping.TabIndex = 0; + this.chkClipping.Text = "Use Clipping"; + this.chkClipping.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 329); + this.Controls.Add(this.chkClipping); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Clipping"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.CheckBox chkClipping; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Form1.cs b/Pro Windows Forms 2.0/Chapter07/Clipping/Form1.cs new file mode 100644 index 0000000..5f91835 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Form1.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace Clipping +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Paint(object sender, PaintEventArgs e) + { + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + + // Clip to path (with shape). + Rectangle rectangle = new Rectangle(10, 10, 250, 50); + GraphicsPath path = new GraphicsPath(); + path.AddEllipse(rectangle); + e.Graphics.DrawPath(Pens.Red, path); + + // Set the clipping. + Region clippingRegion = new Region(path); + if (chkClipping.Checked) e.Graphics.Clip = clippingRegion; + + // Draw in the clipped region. + e.Graphics.DrawString("Clipped", + new Font("Verdana", 36, FontStyle.Bold), Brushes.Black, 10, 10); + + clippingRegion.Dispose(); + path.Dispose(); + + // Rest the clipping region. + e.Graphics.ResetClip(); + + // Clip to path (which represents text). + path = new GraphicsPath(); + path.AddString("Clipped", new FontFamily("Verdana"), 0, 70, new Point(10, 130), new StringFormat()); + e.Graphics.DrawPath(Pens.Blue, path); + + // Set the clipping. + clippingRegion = new Region(path); + if (chkClipping.Checked) e.Graphics.Clip = clippingRegion; + + // Draw a series of ellipsis in the clipped region. + for (int i = 0; i < 40; i++) + { + e.Graphics.DrawEllipse(Pens.Red, 180 - i*3, 180 - i*3, i*6, i*6); + } + clippingRegion.Dispose(); + path.Dispose(); + } + + private void checkBox1_CheckedChanged(object sender, EventArgs e) + { + Invalidate(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Form1.resx b/Pro Windows Forms 2.0/Chapter07/Clipping/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Program.cs b/Pro Windows Forms 2.0/Chapter07/Clipping/Program.cs new file mode 100644 index 0000000..af56dc5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Clipping +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a6c00cf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Clipping")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Clipping")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("cfd1c765-1d96-4aa1-a07f-92a16e37916a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Resources.Designer.cs new file mode 100644 index 0000000..61b9098 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Clipping.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Clipping.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Clipping.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace Clipping.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Clipping.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Settings.Designer.cs new file mode 100644 index 0000000..06f666e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Clipping.Properties.Settings.get_Default():Clipping.Properties.Settings")] + +namespace Clipping.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Clipping/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/Clipping/bin/Debug/Clipping.exe b/Pro Windows Forms 2.0/Chapter07/Clipping/bin/Debug/Clipping.exe new file mode 100644 index 0000000..c2d36e1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Clipping/bin/Debug/Clipping.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/BufferedPanel.cs b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/BufferedPanel.cs new file mode 100644 index 0000000..e3df1dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/BufferedPanel.cs @@ -0,0 +1,31 @@ +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; +using System.Drawing; + +namespace ControlDoubleBuffering +{ + public partial class BufferedPanel : Panel + { + + public BufferedPanel() + { + this.BackColor = Color.Transparent; + this.DoubleBuffered = true; +// same as below... +// this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); +// this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + } + + + //// only here to disable background painting for testing AllPaintingInWmPaint flag + //protected override void OnPaintBackground(PaintEventArgs pevent) + //{ + // base.OnPaintBackground(pevent); + //} + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/BufferedPanel.designer.cs b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/BufferedPanel.designer.cs new file mode 100644 index 0000000..492f76d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/BufferedPanel.designer.cs @@ -0,0 +1,28 @@ +namespace ControlDoubleBuffering +{ + partial class BufferedPanel + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.csproj b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.csproj new file mode 100644 index 0000000..d23ba9d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.csproj @@ -0,0 +1,80 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {40606592-E04A-498E-9C86-1F24D3687577} + WinExe + Properties + ControlDoubleBuffering + ControlDoubleBuffering + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + Component + + + BufferedPanel.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.csproj.user b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.sln b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.sln new file mode 100644 index 0000000..72b2273 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlDoubleBuffering", "ControlDoubleBuffering.csproj", "{40606592-E04A-498E-9C86-1F24D3687577}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {40606592-E04A-498E-9C86-1F24D3687577}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40606592-E04A-498E-9C86-1F24D3687577}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40606592-E04A-498E-9C86-1F24D3687577}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40606592-E04A-498E-9C86-1F24D3687577}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.suo b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.suo new file mode 100644 index 0000000..7c14c33 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/ControlDoubleBuffering.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Form1.Designer.cs new file mode 100644 index 0000000..a7b07a2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Form1.Designer.cs @@ -0,0 +1,150 @@ +namespace ControlDoubleBuffering +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bufferedPanel = new ControlDoubleBuffering.BufferedPanel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.chkShowBufferedPanel = new System.Windows.Forms.CheckBox(); + this.chkShowPanel = new System.Windows.Forms.CheckBox(); + this.chkShowManualBufferedPanel = new System.Windows.Forms.CheckBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.SuspendLayout(); + // + // bufferedPanel + // + this.bufferedPanel.BackColor = System.Drawing.Color.Transparent; + this.bufferedPanel.Location = new System.Drawing.Point(32, 271); + this.bufferedPanel.Name = "bufferedPanel"; + this.bufferedPanel.Size = new System.Drawing.Size(193, 195); + this.bufferedPanel.TabIndex = 2; + this.bufferedPanel.Paint += new System.Windows.Forms.PaintEventHandler(this.logo2_Paint); + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.Transparent; + this.panel1.Location = new System.Drawing.Point(256, 271); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(213, 195); + this.panel1.TabIndex = 3; + this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.logo2_Paint); + // + // chkShowBufferedPanel + // + this.chkShowBufferedPanel.AutoSize = true; + this.chkShowBufferedPanel.BackColor = System.Drawing.Color.Transparent; + this.chkShowBufferedPanel.Checked = true; + this.chkShowBufferedPanel.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkShowBufferedPanel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chkShowBufferedPanel.ForeColor = System.Drawing.Color.White; + this.chkShowBufferedPanel.Location = new System.Drawing.Point(32, 216); + this.chkShowBufferedPanel.Name = "chkShowBufferedPanel"; + this.chkShowBufferedPanel.Size = new System.Drawing.Size(134, 17); + this.chkShowBufferedPanel.TabIndex = 4; + this.chkShowBufferedPanel.Text = "Show BufferedPanel"; + this.chkShowBufferedPanel.UseVisualStyleBackColor = false; + this.chkShowBufferedPanel.CheckedChanged += new System.EventHandler(this.chkShowBufferedPanel_CheckedChanged); + // + // chkShowPanel + // + this.chkShowPanel.AutoSize = true; + this.chkShowPanel.BackColor = System.Drawing.Color.Transparent; + this.chkShowPanel.Checked = true; + this.chkShowPanel.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkShowPanel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chkShowPanel.ForeColor = System.Drawing.Color.White; + this.chkShowPanel.Location = new System.Drawing.Point(256, 216); + this.chkShowPanel.Name = "chkShowPanel"; + this.chkShowPanel.Size = new System.Drawing.Size(86, 17); + this.chkShowPanel.TabIndex = 5; + this.chkShowPanel.Text = "Show Panel"; + this.chkShowPanel.UseVisualStyleBackColor = false; + this.chkShowPanel.CheckedChanged += new System.EventHandler(this.chkShowPanel_CheckedChanged); + // + // chkShowManualBufferedPanel + // + this.chkShowManualBufferedPanel.AutoSize = true; + this.chkShowManualBufferedPanel.BackColor = System.Drawing.Color.Transparent; + this.chkShowManualBufferedPanel.Checked = true; + this.chkShowManualBufferedPanel.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkShowManualBufferedPanel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chkShowManualBufferedPanel.ForeColor = System.Drawing.Color.White; + this.chkShowManualBufferedPanel.Location = new System.Drawing.Point(499, 216); + this.chkShowManualBufferedPanel.Name = "chkShowManualBufferedPanel"; + this.chkShowManualBufferedPanel.Size = new System.Drawing.Size(191, 17); + this.chkShowManualBufferedPanel.TabIndex = 7; + this.chkShowManualBufferedPanel.Text = "Show Manually Buffered Panel"; + this.chkShowManualBufferedPanel.UseVisualStyleBackColor = false; + this.chkShowManualBufferedPanel.CheckedChanged += new System.EventHandler(this.chkShowManualBufferedPanel_CheckedChanged); + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.Transparent; + this.panel2.Location = new System.Drawing.Point(499, 271); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(213, 195); + this.panel2.TabIndex = 6; + this.panel2.Paint += new System.Windows.Forms.PaintEventHandler(this.logo2_Paint); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = ControlDoubleBuffering.Properties.Resources.ShopFloor_030; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.ClientSize = new System.Drawing.Size(721, 522); + this.Controls.Add(this.chkShowManualBufferedPanel); + this.Controls.Add(this.panel2); + this.Controls.Add(this.chkShowPanel); + this.Controls.Add(this.chkShowBufferedPanel); + this.Controls.Add(this.panel1); + this.Controls.Add(this.bufferedPanel); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "DoubleBuffered Controls"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private BufferedPanel bufferedPanel; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.CheckBox chkShowBufferedPanel; + private System.Windows.Forms.CheckBox chkShowPanel; + private System.Windows.Forms.CheckBox chkShowManualBufferedPanel; + private System.Windows.Forms.Panel panel2; + + + + + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Form1.cs b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Form1.cs new file mode 100644 index 0000000..4bf15cc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Form1.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace ControlDoubleBuffering +{ + public partial class Form1 : Form + { + BufferedPanel logo1; + + public Form1() + { + InitializeComponent(); + + // bug in line below - this isn't respected if BackgroundImage is set + this.SetStyle(ControlStyles.ResizeRedraw, false); + + this.DoubleBuffered = false; + } + + private void button1_Click(object sender, EventArgs e) + { + if (logo1 == null) + { + logo1 = new BufferedPanel(); + logo1.Location = new System.Drawing.Point(105, 29); + logo1.Name = "logo1"; + logo1.Size = new System.Drawing.Size(160, 200); + logo1.TabIndex = 0; + this.Controls.Add(logo1); + } + else + { + this.Controls.Remove(logo1); + logo1 = null; + } + } + + protected override void OnInvalidated(InvalidateEventArgs e) + { + System.Diagnostics.Debug.WriteLine("invalidated"); + base.OnInvalidated(e); + } + + const int RINGCOUNT = 100; + const float SWEEP = 2f; + const float INTERVAL = 5f; + const int INCREMENTS = 72; // usually 360/INTERVAL + + private void logo2_Paint(object sender, PaintEventArgs e) + { + Control ctrl = (Control)sender; + // intentionally slow painting algorith here + + // Decide whether or not to use manual double-buffering. + Graphics g; + Bitmap bitmap = null; + if (sender == panel2) + { + bitmap = new Bitmap(ctrl.ClientRectangle.Width, ctrl.ClientRectangle.Height); + g = Graphics.FromImage(bitmap); + } + else + { + g = e.Graphics; + } + + + g.SmoothingMode = SmoothingMode.AntiAlias; + RectangleF paintRect = new Rectangle(ctrl.Width / 2, ctrl.Height / 2, 0, 0); + Rectangle borderRect = ctrl.ClientRectangle; + + borderRect.Size = new Size(borderRect.Width - 1, borderRect.Height - 1); + g.DrawRectangle(Pens.Yellow, borderRect); + float hScale = (float)this.Width / ((float)RINGCOUNT * 2f); + float vScale = (float)this.Height / ((float)RINGCOUNT * 2f); + + for (int i = 0; i < RINGCOUNT; i++) + { + paintRect.Inflate(hScale, vScale); + + for (int j = 0; j < INCREMENTS; j++) + { + g.DrawArc(Pens.Yellow, paintRect, (float)j * INTERVAL, SWEEP); + } + } + + // If using double buffering, render the final image and dispose of it. + if (sender == panel2) + { + e.Graphics.DrawImageUnscaled(bitmap, 0, 0); + g.Dispose(); + bitmap.Dispose(); + } + } + + + private void chkShowBufferedPanel_CheckedChanged(object sender, EventArgs e) + { + bufferedPanel.Visible = chkShowBufferedPanel.Checked; + } + + private void chkShowPanel_CheckedChanged(object sender, EventArgs e) + { + panel1.Visible = chkShowPanel.Checked; + } + + private void chkShowManualBufferedPanel_CheckedChanged(object sender, EventArgs e) + { + panel2.Visible = chkShowManualBufferedPanel.Checked; + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Form1.resx b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Program.cs b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Program.cs new file mode 100644 index 0000000..ff72d4e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ControlDoubleBuffering +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..113257b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WindowsApplication73")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("WindowsApplication73")] +[assembly: AssemblyCopyright("Copyright Microsoft 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d0cc0d31-c332-4334-9912-28900d6252f7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Resources.Designer.cs new file mode 100644 index 0000000..02e1f91 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Resources.Designer.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ControlDoubleBuffering.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ControlDoubleBuffering.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap ShopFloor_030 { + get { + object obj = ResourceManager.GetObject("ShopFloor 030", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Resources.resx new file mode 100644 index 0000000..5198481 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Resources.resx @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\ShopFloor 030.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Settings.Designer.cs new file mode 100644 index 0000000..4e9eb48 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ControlDoubleBuffering.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Resources/ShopFloor 030.jpg b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Resources/ShopFloor 030.jpg new file mode 100644 index 0000000..387cd59 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/Resources/ShopFloor 030.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/bin/Debug/ControlDoubleBuffering.exe b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/bin/Debug/ControlDoubleBuffering.exe new file mode 100644 index 0000000..5a3ea55 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/bin/Debug/ControlDoubleBuffering.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/bin/Release/ControlDoubleBuffering.exe b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/bin/Release/ControlDoubleBuffering.exe new file mode 100644 index 0000000..a8a7423 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/bin/Release/ControlDoubleBuffering.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/bin/Release/WindowsApplication73.exe b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/bin/Release/WindowsApplication73.exe new file mode 100644 index 0000000..b8be6e6 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/ControlDoubleBuffering/bin/Release/WindowsApplication73.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.Designer.cs b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.Designer.cs new file mode 100644 index 0000000..e6caacd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.Designer.cs @@ -0,0 +1,71 @@ +namespace DoubleBuffering +{ + partial class DoubleBuffering + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmrRefresh = new System.Windows.Forms.Timer(this.components); + this.chkDoubleBuffer = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // tmrRefresh + // + this.tmrRefresh.Interval = 10; + this.tmrRefresh.Tick += new System.EventHandler(this.tmrRefresh_Tick); + // + // chkDoubleBuffer + // + this.chkDoubleBuffer.BackColor = System.Drawing.Color.PaleTurquoise; + this.chkDoubleBuffer.Location = new System.Drawing.Point(12, 12); + this.chkDoubleBuffer.Name = "chkDoubleBuffer"; + this.chkDoubleBuffer.Size = new System.Drawing.Size(336, 16); + this.chkDoubleBuffer.TabIndex = 2; + this.chkDoubleBuffer.Text = "Use Double Buffering"; + this.chkDoubleBuffer.UseVisualStyleBackColor = false; + // + // DoubleBuffering + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(422, 373); + this.Controls.Add(this.chkDoubleBuffer); + this.Name = "DoubleBuffering"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.DoubleBuffering_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.DoubleBuffering_Paint); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Timer tmrRefresh; + private System.Windows.Forms.CheckBox chkDoubleBuffer; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.cs b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.cs new file mode 100644 index 0000000..07b3200 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DoubleBuffering +{ + public partial class DoubleBuffering : Form + { + public DoubleBuffering() + { + InitializeComponent(); + } + + private bool isShrinking = false; + private int extraSize = 0; + + // This code is triggered in response to the timer tick. + private void tmrRefresh_Tick(object sender, + System.EventArgs e) + { + // Change the circle dimensions. + if (isShrinking) + extraSize--; + else + extraSize++; + + // Change the sizing direction if needed. + if (extraSize > (this.Width - 150)) + isShrinking = true; + else if (extraSize < 1) + isShrinking = false; + + // Repaint the form. + this.Invalidate(); + } + + private void DoubleBuffering_Paint(object sender, + System.Windows.Forms.PaintEventArgs e) + { + // Check if double buffering is needed. + this.DoubleBuffered = chkDoubleBuffer.Checked; + + Graphics g = e.Graphics; + g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + + // Draw a rectangle. + Pen drawingPen = new Pen(Color.Black, 10); + g.FillRectangle(Brushes.White, new Rectangle(new Point(0, 0), + this.ClientSize)); + g.DrawEllipse(drawingPen, 50, 50, 50 + extraSize, 50 + extraSize); + } + + private void DoubleBuffering_Load(object sender, EventArgs e) + { + tmrRefresh.Start(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.csproj b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.csproj new file mode 100644 index 0000000..8d121ef --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {4ABD98B8-6ED7-4045-9716-5D2EF2056BA3} + WinExe + Properties + DoubleBuffering + DoubleBuffering + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + DoubleBuffering.cs + + + + + DoubleBuffering.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.csproj.user b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.resx b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.resx new file mode 100644 index 0000000..b13d47f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.sln b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.sln new file mode 100644 index 0000000..4136b06 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DoubleBuffering", "DoubleBuffering.csproj", "{4ABD98B8-6ED7-4045-9716-5D2EF2056BA3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4ABD98B8-6ED7-4045-9716-5D2EF2056BA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4ABD98B8-6ED7-4045-9716-5D2EF2056BA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4ABD98B8-6ED7-4045-9716-5D2EF2056BA3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4ABD98B8-6ED7-4045-9716-5D2EF2056BA3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.suo b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.suo new file mode 100644 index 0000000..91e06d5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/DoubleBuffering.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Program.cs b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Program.cs new file mode 100644 index 0000000..2ff3420 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DoubleBuffering +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new DoubleBuffering()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e1af613 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DoubleBuffering")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DoubleBuffering")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("11e99d59-c265-4c00-bf6b-c856f2c6e214")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Resources.Designer.cs new file mode 100644 index 0000000..db7dddb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DoubleBuffering.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DoubleBuffering.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DoubleBuffering.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace DoubleBuffering.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DoubleBuffering.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Settings.Designer.cs new file mode 100644 index 0000000..e70520a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DoubleBuffering.Properties.Settings.get_Default():DoubleBuffering.Properties.Settings")] + +namespace DoubleBuffering.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/bin/Debug/DoubleBuffering.exe b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/bin/Debug/DoubleBuffering.exe new file mode 100644 index 0000000..9b9679e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/DoubleBuffering/bin/Debug/DoubleBuffering.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/Control.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Control.cs new file mode 100644 index 0000000..35f6336 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Control.cs @@ -0,0 +1,369 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.VisualStyles; +using System.Drawing; + +namespace DrawingControls +{ +public class WindowSimulation : Control + { + private Dictionary windowElements = + new Dictionary(); + private Dictionary elementRectangles = + new Dictionary(); + private VisualStyleRenderer renderer = null; + + private Point closeButtonOffset; + private Size gripperSize; + private Size closeButtonSize; + private bool isResizing = false; + private bool isMoving = false; + private bool isClosing = false; + private int captionHeight; + private int frameThickness; + private int statusHeight = 22; + private Point originalClick = new Point(); + private Point resizeOffset = new Point(); + + public WindowSimulation() + : base() + { + this.Location = new Point(50, 50); + this.Size = new Size(350, 300); + this.BackColor = Color.Azure; + this.DoubleBuffered = true; + this.MinimumSize = new Size(300, 200); + this.Font = SystemFonts.CaptionFont; + this.Text = "Simulated Window"; + + // Insert the VisualStyleElement objects into the Dictionary. + windowElements.Add("windowCaption", + VisualStyleElement.Window.Caption.Active); + windowElements.Add("windowBottom", + VisualStyleElement.Window.FrameBottom.Active); + windowElements.Add("windowLeft", + VisualStyleElement.Window.FrameLeft.Active); + windowElements.Add("windowRight", + VisualStyleElement.Window.FrameRight.Active); + windowElements.Add("windowClose", + VisualStyleElement.Window.CloseButton.Normal); + windowElements.Add("statusBar", + VisualStyleElement.Status.Bar.Normal); + windowElements.Add("statusGripper", + VisualStyleElement.Status.Gripper.Normal); + + // Get the sizes and location offsets for the window parts + // as specified by the visual style, and then use this + // information to calcualate the rectangles for each part. + GetPartDetails(); + CalculateRectangles(); + + this.MouseDown += + new MouseEventHandler(ImitationWindow_MouseDown); + this.MouseUp += + new MouseEventHandler(ImitationWindow_MouseUp); + this.MouseMove += + new MouseEventHandler(ImitationWindow_MouseMove); + } + + // Get the sizes and offsets for the window parts as specified + // by the visual style. + private void GetPartDetails() + { + // Do nothing further if visual styles are not enabled. + if (!Application.RenderWithVisualStyles) + { + return; + } + + using (Graphics g = this.CreateGraphics()) + { + // Get the size and offset of the close button. + if (SetRenderer(windowElements["windowClose"])) + { + closeButtonSize = + renderer.GetPartSize(g, ThemeSizeType.True); + closeButtonOffset = + renderer.GetPoint(PointProperty.Offset); + } + + // Get the height of the window caption. + if (SetRenderer(windowElements["windowCaption"])) + { + captionHeight = renderer.GetPartSize(g, + ThemeSizeType.True).Height; + } + + // Get the thickness of the left, bottom, + // and right window frame. + if (SetRenderer(windowElements["windowLeft"])) + { + frameThickness = renderer.GetPartSize(g, + ThemeSizeType.True).Width; + } + + // Get the size of the resizing gripper. + if (SetRenderer(windowElements["statusGripper"])) + { + gripperSize = renderer.GetPartSize(g, + ThemeSizeType.True); + } + } + } + + // Use the part metrics to determine the current size + // of the rectangles for all of the window parts. + private void CalculateRectangles() + { + int heightMinusFrame = + ClientRectangle.Height - frameThickness; + + // Calculate the window frame rectangles and add them + // to the Dictionary of rectangles. + elementRectangles["windowCaption"] = + new Rectangle(0, 0, + ClientRectangle.Width, captionHeight); + elementRectangles["windowBottom"] = + new Rectangle(0, heightMinusFrame, + ClientRectangle.Width, frameThickness); + elementRectangles["windowLeft"] = + new Rectangle(0, captionHeight, frameThickness, + heightMinusFrame - captionHeight); + elementRectangles["windowRight"] = + new Rectangle(ClientRectangle.Width - frameThickness, + captionHeight, frameThickness, + heightMinusFrame - captionHeight); + + // Calculate the window button rectangle and add it + // to the Dictionary of rectangles. + elementRectangles["windowClose"] = + new Rectangle(ClientRectangle.Right + + closeButtonOffset.X, closeButtonOffset.Y, + closeButtonSize.Width, closeButtonSize.Height); + + // Calculate the status bar rectangles and add them + // to the Dictionary of rectangles. + elementRectangles["statusBar"] = + new Rectangle(frameThickness, + heightMinusFrame - statusHeight, + ClientRectangle.Width - (2 * frameThickness), + statusHeight); + elementRectangles["statusGripper"] = + new Rectangle(ClientRectangle.Right - + gripperSize.Width - frameThickness, + heightMinusFrame - gripperSize.Height, + gripperSize.Width, gripperSize.Height); + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + // Ensure that visual styles are supported. + if (!Application.RenderWithVisualStyles) + { + this.Text = "Visual styles are not enabled."; + TextRenderer.DrawText(e.Graphics, this.Text, + this.Font, this.Location, this.ForeColor); + return; + } + + // Set the clip region to define the curved corners + // of the caption. + SetClipRegion(); + + // Draw each part of the window. + foreach (KeyValuePair entry + in windowElements) + { + if (SetRenderer(entry.Value)) + { + renderer.DrawBackground(e.Graphics, + elementRectangles[entry.Key]); + } + } + + // Draw the caption text. + TextRenderer.DrawText(e.Graphics, this.Text, this.Font, + elementRectangles["windowCaption"], Color.White, + TextFormatFlags.VerticalCenter | + TextFormatFlags.HorizontalCenter); + } + + // Initiate dragging, resizing, or closing the imitation window. + void ImitationWindow_MouseDown(object sender, MouseEventArgs e) + { + // The user clicked the close button. + if (elementRectangles["windowClose"].Contains(e.Location)) + { + windowElements["windowClose"] = + VisualStyleElement.Window.CloseButton.Pressed; + isClosing = true; + } + + // The user clicked the status grip. + else if (elementRectangles["statusGripper"]. + Contains(e.Location)) + { + isResizing = true; + this.Cursor = Cursors.SizeNWSE; + resizeOffset.X = this.Right - this.Left - e.X; + resizeOffset.Y = this.Bottom - this.Top - e.Y; + } + + // The user clicked the window caption. + else if (elementRectangles["windowCaption"]. + Contains(e.Location)) + { + isMoving = true; + originalClick.X = e.X; + originalClick.Y = e.Y; + } + + Invalidate(); + } + + // Stop any current resizing or moving actions. + void ImitationWindow_MouseUp(object sender, MouseEventArgs e) + { + // Stop moving the location of the window rectangles. + if (isMoving) + { + isMoving = false; + } + + // Change the cursor back to the default if the user + // stops resizing. + else if (isResizing) + { + isResizing = false; + } + + // Close the application if the user clicks the + // close button. + else if (elementRectangles["windowClose"]. + Contains(e.Location) && isClosing) + { + Application.Exit(); + } + } + + // Handle resizing or moving actions. + void ImitationWindow_MouseMove(object sender, + MouseEventArgs e) + { + // The left mouse button is down. + if ((MouseButtons.Left & e.Button) == MouseButtons.Left) + { + // Calculate the new control size if the user is + // dragging the resizing grip. + if (isResizing) + { + this.Width = e.X + resizeOffset.X; + this.Height = e.Y + resizeOffset.Y; + CalculateRectangles(); + } + + // Calculate the new location of the control if the + // user is dragging the window caption. + else if (isMoving) + { + int XChange = this.Location.X + + (e.X - originalClick.X); + int YChange = this.Location.Y + + (e.Y - originalClick.Y); + this.Location = new Point(XChange, YChange); + } + + // Cancel the closing action if the user clicked + // and held down on the close button, and has dragged + // the pointer outside the button. + else if (!elementRectangles["windowClose"]. + Contains(e.Location) && isClosing) + { + isClosing = false; + windowElements["windowClose"] = + VisualStyleElement.Window.CloseButton.Normal; + } + } + + // The left mouse button is not down. + else + { + // Paint the close button hot if the cursor is on it. + Rectangle closeRectangle = + elementRectangles["windowClose"]; + windowElements["windowClose"] = + closeRectangle.Contains(e.Location) ? + VisualStyleElement.Window.CloseButton.Hot : + VisualStyleElement.Window.CloseButton.Normal; + + // Use a resizing cursor if the cursor is on the + // status grip. + Rectangle gripRectangle = + elementRectangles["statusGripper"]; + this.Cursor = gripRectangle.Contains(e.Location) ? + Cursors.SizeNWSE : Cursors.Default; + } + + Invalidate(); + } + + // Calculate and set the clipping region for the control + // so that the corners of the title bar are rounded. + private void SetClipRegion() + { + if (!Application.RenderWithVisualStyles) + { + return; + } + + using (Graphics g = this.CreateGraphics()) + { + // Get the current region for the window caption. + if (SetRenderer(windowElements["windowCaption"])) + { + Region clipRegion = renderer.GetBackgroundRegion( + g, elementRectangles["windowCaption"]); + + // Get the client rectangle, but exclude the region + // of the window caption. + int height = (int)clipRegion.GetBounds(g).Height; + Rectangle nonCaptionRect = new Rectangle( + ClientRectangle.X, + ClientRectangle.Y + height, + ClientRectangle.Width, + ClientRectangle.Height - height); + + // Add the rectangle to the caption region, and + // make this region the form's clipping region. + clipRegion.Union(nonCaptionRect); + this.Region = clipRegion; + } + } + } + + // Set the VisualStyleRenderer to a new element. + private bool SetRenderer(VisualStyleElement element) + { + if (!VisualStyleRenderer.IsElementDefined(element)) + { + return false; + } + + if (renderer == null) + { + renderer = new VisualStyleRenderer(element); + } + else + { + renderer.SetParameters(element); + } + + return true; + } + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlPaintTest.Designer.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlPaintTest.Designer.cs new file mode 100644 index 0000000..81b3c79 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlPaintTest.Designer.cs @@ -0,0 +1,47 @@ +namespace DrawingControls +{ + partial class ControlPaintTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // ControlPaintTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "ControlPaintTest"; + this.Text = "ControlPaintTest"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.ControlPaintTest_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlPaintTest.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlPaintTest.cs new file mode 100644 index 0000000..81115a4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlPaintTest.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DrawingControls +{ + public partial class ControlPaintTest : Form + { + public ControlPaintTest() + { + InitializeComponent(); + } + + private void ControlPaintTest_Paint(object sender, PaintEventArgs e) + { + ControlPaint.DrawCheckBox(e.Graphics, new Rectangle(10, 10, 50, 50), ButtonState.Checked); + ControlPaint.DrawCheckBox(e.Graphics, new Rectangle(70, 10, 30, 30), ButtonState.Normal); + ControlPaint.DrawCheckBox(e.Graphics, new Rectangle(110, 10, 20, 20), ButtonState.Checked); + + ControlPaint.DrawButton(e.Graphics, new Rectangle(10, 80, 20, 20), ButtonState.Checked); + ControlPaint.DrawButton(e.Graphics, new Rectangle(50, 80, 20, 20), ButtonState.Flat); + ControlPaint.DrawButton(e.Graphics, new Rectangle(90, 80, 20, 20), ButtonState.Normal); + ControlPaint.DrawFocusRectangle(e.Graphics, new Rectangle(130, 80, 20, 20)); + + ControlPaint.DrawGrid(e.Graphics, new Rectangle(10, 120, 250, 50), new Size(5, 5), Color.Blue); + ControlPaint.DrawScrollButton(e.Graphics, new Rectangle(10, 180, 20, 20), ScrollButton.Left, ButtonState.Normal); + ControlPaint.DrawScrollButton(e.Graphics, new Rectangle(50, 180, 20, 20), ScrollButton.Max, ButtonState.Pushed); + ControlPaint.DrawScrollButton(e.Graphics, new Rectangle(90, 180, 20, 20), ScrollButton.Up, ButtonState.Normal); + + ControlPaint.DrawMenuGlyph(e.Graphics, new Rectangle(10, 220, 20, 20), MenuGlyph.Arrow); + ControlPaint.DrawMenuGlyph(e.Graphics, new Rectangle(50, 220, 20, 20), MenuGlyph.Checkmark); + ControlPaint.DrawMenuGlyph(e.Graphics, new Rectangle(90, 220, 20, 20), MenuGlyph.Max); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlPaintTest.resx b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlPaintTest.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlPaintTest.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlRenderer.Designer.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlRenderer.Designer.cs new file mode 100644 index 0000000..2fc2cdb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlRenderer.Designer.cs @@ -0,0 +1,47 @@ +namespace DrawingControls +{ + partial class ControlRenderer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // ControlRenderer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "ControlRenderer"; + this.Text = "ControlRenderer"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.ControlRenderer_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlRenderer.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlRenderer.cs new file mode 100644 index 0000000..134afe2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlRenderer.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.VisualStyles; + +namespace DrawingControls +{ + public partial class ControlRenderer : Form + { + public ControlRenderer() + { + InitializeComponent(); + } + + private void ControlRenderer_Paint(object sender, PaintEventArgs e) + { + + CheckBoxRenderer.DrawCheckBox(e.Graphics, new Point(10,10), + new Rectangle(10,10,110,15), "Style checkbox", Font,false, CheckBoxState.CheckedNormal); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlRenderer.resx b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlRenderer.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/ControlRenderer.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.csproj b/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.csproj new file mode 100644 index 0000000..ed6ba3d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.csproj @@ -0,0 +1,100 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {7F4BF936-C518-426D-9AC5-4D31FE01D98F} + WinExe + Properties + DrawingControls + DrawingControls + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Component + + + Form + + + ControlPaintTest.cs + + + Form + + + ControlRenderer.cs + + + Form + + + Menu.cs + + + + + ControlPaintTest.cs + + + ControlRenderer.cs + + + Menu.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + SimpleStyleRenderer.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Form + + + SimpleStyleRenderer.cs + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.csproj.user b/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.sln b/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.sln new file mode 100644 index 0000000..87b317c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DrawingControls", "DrawingControls.csproj", "{7F4BF936-C518-426D-9AC5-4D31FE01D98F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7F4BF936-C518-426D-9AC5-4D31FE01D98F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F4BF936-C518-426D-9AC5-4D31FE01D98F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F4BF936-C518-426D-9AC5-4D31FE01D98F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F4BF936-C518-426D-9AC5-4D31FE01D98F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.suo b/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.suo new file mode 100644 index 0000000..910108e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/DrawingControls/DrawingControls.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/Menu.Designer.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Menu.Designer.cs new file mode 100644 index 0000000..c347bde --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Menu.Designer.cs @@ -0,0 +1,85 @@ +namespace DrawingControls +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button4 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 70); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(118, 23); + this.button4.TabIndex = 11; + this.button4.Text = "ControlRenderer"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(118, 23); + this.button2.TabIndex = 9; + this.button2.Text = "SimpleStyleRenderer"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(118, 23); + this.button1.TabIndex = 8; + this.button1.Text = "ControlPaintTest"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(170, 164); + this.Controls.Add(this.button4); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/Menu.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Menu.cs new file mode 100644 index 0000000..ae0441d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace DrawingControls +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("DrawingControls." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/Menu.resx b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Menu.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Menu.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/Program.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Program.cs new file mode 100644 index 0000000..e94636a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DrawingControls +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6ba6950 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DrawingControls")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DrawingControls")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e421cfe5-8997-4ed0-b1a0-e164f95e0ee5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Resources.Designer.cs new file mode 100644 index 0000000..e5db07a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DrawingControls.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DrawingControls.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DrawingControls.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace DrawingControls.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DrawingControls.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Settings.Designer.cs new file mode 100644 index 0000000..5e7643a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DrawingControls.Properties.Settings.get_Default():DrawingControls.Properties.Settings")] + +namespace DrawingControls.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/SimpleStyleRenderer.Designer.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/SimpleStyleRenderer.Designer.cs new file mode 100644 index 0000000..8f06a2d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/SimpleStyleRenderer.Designer.cs @@ -0,0 +1,49 @@ +namespace DrawingControls +{ + partial class SimpleStyleRenderer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // SimpleStyleRenderer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(384, 353); + this.Name = "SimpleStyleRenderer"; + this.Text = "SimpleStyleRenderer"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.SimpleStyleRenderer_Paint); + this.ResumeLayout(false); + + } + + #endregion + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/SimpleStyleRenderer.cs b/Pro Windows Forms 2.0/Chapter07/DrawingControls/SimpleStyleRenderer.cs new file mode 100644 index 0000000..1e87ce5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/SimpleStyleRenderer.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.VisualStyles; + +namespace DrawingControls +{ + public partial class SimpleStyleRenderer : Form + { + public SimpleStyleRenderer() + { + InitializeComponent(); + } + + private void SimpleStyleRenderer_Paint(object sender, PaintEventArgs e) + { + VisualStyleElement element = VisualStyleElement.Button.CheckBox.CheckedNormal; + + if (Application.RenderWithVisualStyles && + VisualStyleRenderer.IsElementDefined(element)) + { + VisualStyleRenderer renderer = new VisualStyleRenderer(element); + Rectangle rectCheck = new Rectangle(10, 10, 50, 50); + Rectangle rectBox = new Rectangle(10, 10, 200, 50); + Rectangle rectText = new Rectangle(50, 25, 150, 25); + renderer.DrawBackground(e.Graphics, rectCheck); + renderer.DrawEdge(e.Graphics, rectBox, + Edges.Bottom | Edges.Top | Edges.Left | Edges.Right, + EdgeStyle.Etched, EdgeEffects.Flat); + renderer.DrawText(e.Graphics, rectText, "Styled checkbox", false, TextFormatFlags.Top); + } + else + { + // (Perform ControlPaint drawing here.) + } + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/SimpleStyleRenderer.resx b/Pro Windows Forms 2.0/Chapter07/DrawingControls/SimpleStyleRenderer.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/DrawingControls/SimpleStyleRenderer.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/bin/Debug/DrawingControls.exe b/Pro Windows Forms 2.0/Chapter07/DrawingControls/bin/Debug/DrawingControls.exe new file mode 100644 index 0000000..f7ee166 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/DrawingControls/bin/Debug/DrawingControls.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/DrawingControls/bin/Release/DrawingControls.exe b/Pro Windows Forms 2.0/Chapter07/DrawingControls/bin/Release/DrawingControls.exe new file mode 100644 index 0000000..6e75774 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/DrawingControls/bin/Release/DrawingControls.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/GraphicsPathHit.Designer.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/GraphicsPathHit.Designer.cs new file mode 100644 index 0000000..57e091e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/GraphicsPathHit.Designer.cs @@ -0,0 +1,48 @@ +namespace HitTesting +{ + partial class GraphicsPathHit + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // GraphicsPathHit + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "GraphicsPathHit"; + this.Text = "GraphicsPathHit"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.GraphicsPathHit_Paint); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.GraphicsPathHit_MouseDown); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/GraphicsPathHit.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/GraphicsPathHit.cs new file mode 100644 index 0000000..ae642dc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/GraphicsPathHit.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace HitTesting +{ + public partial class GraphicsPathHit : Form + { + public GraphicsPathHit() + { + InitializeComponent(); + } + + GraphicsPath path; + + private void GraphicsPathHit_Paint(object sender, PaintEventArgs e) + { + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + path = new GraphicsPath(); + path.StartFigure(); + path.AddArc(10, 10, 100, 100, 20, 50); + path.AddLine(20, 50, 70, 230); + path.CloseFigure(); + path.AddEllipse(120, 50, 80, 80); + e.Graphics.FillPath(Brushes.White, path); + e.Graphics.DrawPath(Pens.Black, path); + } + + private void GraphicsPathHit_MouseDown(object sender, MouseEventArgs e) + { + if (path.IsVisible(e.X, e.Y)) + { + MessageBox.Show("You clicked inside the figure."); + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/GraphicsPathHit.resx b/Pro Windows Forms 2.0/Chapter07/HitTesting/GraphicsPathHit.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/GraphicsPathHit.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.csproj b/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.csproj new file mode 100644 index 0000000..1536385 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.csproj @@ -0,0 +1,97 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {E67F8C35-E740-46DF-BA09-FEFA2829BD9E} + WinExe + Properties + HitTesting + HitTesting + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + GraphicsPathHit.cs + + + Form + + + Menu.cs + + + Form + + + NonOptimizedSquares.cs + + + Form + + + OptimizedSquares.cs + + + + + GraphicsPathHit.cs + + + Menu.cs + + + NonOptimizedSquares.cs + + + OptimizedSquares.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.csproj.user b/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.sln b/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.sln new file mode 100644 index 0000000..6eb021c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HitTesting", "HitTesting.csproj", "{E67F8C35-E740-46DF-BA09-FEFA2829BD9E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E67F8C35-E740-46DF-BA09-FEFA2829BD9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E67F8C35-E740-46DF-BA09-FEFA2829BD9E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E67F8C35-E740-46DF-BA09-FEFA2829BD9E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E67F8C35-E740-46DF-BA09-FEFA2829BD9E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.suo b/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.suo new file mode 100644 index 0000000..4052e50 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/HitTesting/HitTesting.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/Menu.Designer.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/Menu.Designer.cs new file mode 100644 index 0000000..a6dd4d8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/Menu.Designer.cs @@ -0,0 +1,86 @@ +namespace HitTesting +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 70); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(133, 23); + this.button3.TabIndex = 6; + this.button3.Text = "OptimizedSquares"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(133, 23); + this.button2.TabIndex = 5; + this.button2.Text = "NonOptimizedSquares"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(133, 23); + this.button1.TabIndex = 4; + this.button1.Text = "GraphicsPathHit"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(171, 162); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/Menu.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/Menu.cs new file mode 100644 index 0000000..abc29e7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace HitTesting +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("HitTesting." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/Menu.resx b/Pro Windows Forms 2.0/Chapter07/HitTesting/Menu.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/Menu.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/NonOptimizedSquares.Designer.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/NonOptimizedSquares.Designer.cs new file mode 100644 index 0000000..7fe79d8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/NonOptimizedSquares.Designer.cs @@ -0,0 +1,63 @@ +namespace HitTesting +{ + partial class NonOptimizedSquares + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblCount = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblCount + // + this.lblCount.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lblCount.Dock = System.Windows.Forms.DockStyle.Bottom; + this.lblCount.Location = new System.Drawing.Point(0, 251); + this.lblCount.Name = "lblCount"; + this.lblCount.Padding = new System.Windows.Forms.Padding(2); + this.lblCount.Size = new System.Drawing.Size(299, 21); + this.lblCount.TabIndex = 0; + // + // NonOptimizedSquares + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(299, 272); + this.Controls.Add(this.lblCount); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "NonOptimizedSquares"; + this.Text = "NonOptimizedSquares"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.NonOptimizedSquares_Paint); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.NonOptimizedSquares_MouseDown); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lblCount; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/NonOptimizedSquares.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/NonOptimizedSquares.cs new file mode 100644 index 0000000..0649564 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/NonOptimizedSquares.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace HitTesting +{ + public partial class NonOptimizedSquares : Form + { + public NonOptimizedSquares() + { + InitializeComponent(); + } + + + // Store the squares that are painted on the form. + List squares = new List(); + + private void NonOptimizedSquares_Paint(object sender, PaintEventArgs e) + { + Pen pen = new Pen(Color.Red, 10); + foreach (Rectangle square in squares) + { + e.Graphics.DrawRectangle(pen, square); + } + pen.Dispose(); + lblCount.Text = " " + squares.Count.ToString() + " squares"; + } + + private void NonOptimizedSquares_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + // Add a square and update the screen. + Rectangle square = new Rectangle(e.X, e.Y, 20, 20); + squares.Add(square); + square.Inflate(5, 5); + Invalidate(square); + } + else if (e.Button == MouseButtons.Right) + { + // Search for the clicked square. + int squareNumber = 0; + foreach (Rectangle square in squares) + { + squareNumber++; + if (square.Contains(e.X, e.Y)) + { + MessageBox.Show("Point inside square #" + + squareNumber.ToString()); + } + } + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/NonOptimizedSquares.resx b/Pro Windows Forms 2.0/Chapter07/HitTesting/NonOptimizedSquares.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/NonOptimizedSquares.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/OptimizedSquares.Designer.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/OptimizedSquares.Designer.cs new file mode 100644 index 0000000..99b33dc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/OptimizedSquares.Designer.cs @@ -0,0 +1,62 @@ +namespace HitTesting +{ + partial class OptimizedSquares + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblCount = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lblCount + // + this.lblCount.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lblCount.Dock = System.Windows.Forms.DockStyle.Bottom; + this.lblCount.Location = new System.Drawing.Point(0, 245); + this.lblCount.Name = "lblCount"; + this.lblCount.Padding = new System.Windows.Forms.Padding(2); + this.lblCount.Size = new System.Drawing.Size(292, 21); + this.lblCount.TabIndex = 1; + // + // OptimizedSquares + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.lblCount); + this.Name = "OptimizedSquares"; + this.Text = "OptimizedSquares"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.DrawSquare_Paint); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DrawSquare_MouseDown); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label lblCount; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/OptimizedSquares.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/OptimizedSquares.cs new file mode 100644 index 0000000..a45b93c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/OptimizedSquares.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace HitTesting +{ + public partial class OptimizedSquares : Form + { + public OptimizedSquares() + { + InitializeComponent(); + } + + // Store the squares that are painted on the form. + List squares = new List(); + + + // Paint a square in response to a mouse click. + private void DrawSquare_MouseDown(object sender, + System.Windows.Forms.MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + Rectangle square = new Rectangle(e.X, e.Y, 20, 20); + squares.Add(square); + + Graphics g = this.CreateGraphics(); + DrawRectangle(square, g); + g.Dispose(); + } + else if (e.Button == MouseButtons.Right) + { + // Search for the clicked square. + int squareNumber = 0; + foreach (Rectangle square in squares) + { + squareNumber++; + if (square.Contains(e.X, e.Y)) + { + MessageBox.Show("Point inside square #" + + squareNumber.ToString()); + } + } + } + + } + + // Paint all the squares when the form needs to be refreshed + // in response to the Paint event. + private void DrawSquare_Paint(object sender, + System.Windows.Forms.PaintEventArgs e) + { + foreach (Rectangle square in squares) + { + DrawRectangle(square, e.Graphics); + } + + } + + // This procedure performs the actual drawing, and is called by + // DrawSquare_MouseDown and DrawSquare_Paint. + private void DrawRectangle(Rectangle rect, Graphics g) + { + Pen pen = new Pen(Color.Red, 10); + g.DrawRectangle(pen, rect); + pen.Dispose(); + lblCount.Text = " " + squares.Count.ToString() + " squares"; + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/OptimizedSquares.resx b/Pro Windows Forms 2.0/Chapter07/HitTesting/OptimizedSquares.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/OptimizedSquares.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/Program.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/Program.cs new file mode 100644 index 0000000..c5e1e97 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace HitTesting +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c5e331c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("HitTesting")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("HitTesting")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e2e57037-da86-4e70-a393-e670eab8fd2e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Resources.Designer.cs new file mode 100644 index 0000000..57af187 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "HitTesting.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "HitTesting.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "HitTesting.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace HitTesting.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HitTesting.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Settings.Designer.cs new file mode 100644 index 0000000..bf95444 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "HitTesting.Properties.Settings.get_Default():HitTesting.Properties.Settings")] + +namespace HitTesting.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/HitTesting/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/HitTesting/bin/Debug/HitTesting.exe b/Pro Windows Forms 2.0/Chapter07/HitTesting/bin/Debug/HitTesting.exe new file mode 100644 index 0000000..c2bf2ee Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/HitTesting/bin/Debug/HitTesting.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/LineJoins.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Pens/LineJoins.Designer.cs new file mode 100644 index 0000000..e3208b4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/LineJoins.Designer.cs @@ -0,0 +1,48 @@ +namespace Pens +{ + partial class LineJoins + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // LineJoins + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(381, 336); + this.Name = "LineJoins"; + this.Text = "LineJoins"; + this.Load += new System.EventHandler(this.LineJoins_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.LineJoins_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/LineJoins.cs b/Pro Windows Forms 2.0/Chapter07/Pens/LineJoins.cs new file mode 100644 index 0000000..7afaf5e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/LineJoins.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace Pens +{ + public partial class LineJoins : Form + { + public LineJoins() + { + InitializeComponent(); + } + + private void LineJoins_Load(object sender, EventArgs e) + { + + } + + private void LineJoins_Paint(object sender, PaintEventArgs e) + { + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + + Pen myPen = new Pen(Color.Blue, 10); + int y = 20; + + foreach (LineJoin join in Enum.GetValues(typeof(LineJoin))) + { + myPen.LineJoin = join; + e.Graphics.DrawRectangle(myPen, 20, y, 70, 40); + e.Graphics.DrawString(join.ToString(), new Font("Tahoma", 8), Brushes.Black, 100, y + 10); + y += 70; + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/LineJoins.resx b/Pro Windows Forms 2.0/Chapter07/Pens/LineJoins.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/LineJoins.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Menu.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Pens/Menu.Designer.cs new file mode 100644 index 0000000..b906b64 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Menu.Designer.cs @@ -0,0 +1,98 @@ +namespace Pens +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(107, 23); + this.button1.TabIndex = 0; + this.button1.Text = "PenCaps"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(107, 23); + this.button2.TabIndex = 1; + this.button2.Text = "PenDashStyles"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 70); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(107, 23); + this.button3.TabIndex = 2; + this.button3.Text = "PenAlignments"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 99); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(107, 23); + this.button4.TabIndex = 3; + this.button4.Text = "LineJoins"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 156); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Menu.cs b/Pro Windows Forms 2.0/Chapter07/Pens/Menu.cs new file mode 100644 index 0000000..ab23639 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace Pens +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("Pens." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Menu.resx b/Pro Windows Forms 2.0/Chapter07/Pens/Menu.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Menu.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/PenAlignments.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Pens/PenAlignments.Designer.cs new file mode 100644 index 0000000..771562e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/PenAlignments.Designer.cs @@ -0,0 +1,48 @@ +namespace Pens +{ + partial class PenAlignments + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // PenAlignment + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "PenAlignment"; + this.Text = "PenAlignment"; + this.Load += new System.EventHandler(this.PenAlignment_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.PenAlignment_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/PenAlignments.cs b/Pro Windows Forms 2.0/Chapter07/Pens/PenAlignments.cs new file mode 100644 index 0000000..d5bd4cf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/PenAlignments.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace Pens +{ + public partial class PenAlignments : Form + { + public PenAlignments() + { + InitializeComponent(); + } + + private void PenAlignment_Load(object sender, EventArgs e) + { + + } + + private void PenAlignment_Paint(object sender, PaintEventArgs e) + { + // Example of border problem. + //Rectangle rect = new Rectangle(10, 10, 110, 110); + //Pen pen = new Pen(Color.Red, 1); + //Brush brush = Brushes.LightBlue; + //e.Graphics.DrawRectangle(pen, rect); + //e.Graphics.FillRectangle(brush, rect); + + + Rectangle rect = new Rectangle(10, 10, 110, 110); + Pen pen = new Pen(Color.White, 11); + Pen penOutline = new Pen(Color.Black, 1); + penOutline.Alignment = PenAlignment.Inset; + pen.Alignment = PenAlignment.Center; + e.Graphics.DrawString("11-Pixel Centered Pen", SystemFonts.DefaultFont, Brushes.Black, rect.Location); + rect.Offset(0, 25); + e.Graphics.FillRectangle(Brushes.LightBlue, rect); + e.Graphics.DrawRectangle(pen, rect); + e.Graphics.DrawRectangle(penOutline, rect); + + rect.Offset(150, -25); + e.Graphics.DrawString("11-Pixel Inset Pen", SystemFonts.DefaultFont, Brushes.Black, rect.Location); + rect.Offset(0, 25); + pen.Alignment = PenAlignment.Inset; + e.Graphics.FillRectangle(Brushes.LightBlue, rect); + e.Graphics.DrawRectangle(pen, rect); + e.Graphics.DrawRectangle(penOutline, rect); + + + pen.Dispose(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/PenAlignments.resx b/Pro Windows Forms 2.0/Chapter07/Pens/PenAlignments.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/PenAlignments.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/PenCaps.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Pens/PenCaps.Designer.cs new file mode 100644 index 0000000..4baa4e4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/PenCaps.Designer.cs @@ -0,0 +1,47 @@ +namespace Pens +{ + partial class PenCaps + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // PenCap + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(351, 344); + this.Name = "PenCap"; + this.Text = "PenCap"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.PenCap_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/PenCaps.cs b/Pro Windows Forms 2.0/Chapter07/Pens/PenCaps.cs new file mode 100644 index 0000000..fdfe7b9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/PenCaps.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace Pens +{ + public partial class PenCaps : Form + { + public PenCaps() + { + InitializeComponent(); + } + + private void PenCap_Paint(object sender, PaintEventArgs e) + { + Pen myPen = new Pen(Color.Blue, 10); + int y = 20; + + foreach (LineCap cap in Enum.GetValues(typeof(LineCap))) + { + myPen.StartCap = cap; + myPen.EndCap = cap; + e.Graphics.DrawLine(myPen, 20, y, 100, y); + e.Graphics.DrawString(cap.ToString(), new Font("Tahoma", 8), Brushes.Black, 120, y - 10); + y += 30; + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/PenCaps.resx b/Pro Windows Forms 2.0/Chapter07/Pens/PenCaps.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/PenCaps.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/PenDashStyles.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Pens/PenDashStyles.Designer.cs new file mode 100644 index 0000000..1a36d8a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/PenDashStyles.Designer.cs @@ -0,0 +1,48 @@ +namespace Pens +{ + partial class PenDashStyles + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // PenDashStyles + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(553, 385); + this.Name = "PenDashStyles"; + this.Text = "PenDashStyles"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.PenDashStyles_Paint); + this.Resize += new System.EventHandler(this.PenDashStyles_Resize); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/PenDashStyles.cs b/Pro Windows Forms 2.0/Chapter07/Pens/PenDashStyles.cs new file mode 100644 index 0000000..eacdf97 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/PenDashStyles.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace Pens +{ + public partial class PenDashStyles : Form + { + public PenDashStyles() + { + InitializeComponent(); + } + + private void PenDashStyles_Paint(object sender, PaintEventArgs e) + { + Pen myPen = new Pen(Color.Blue, 10); + int y = 20; + foreach (DashStyle dash in Enum.GetValues(typeof(DashStyle))) + { + myPen.DashStyle = dash; + e.Graphics.DrawLine(myPen, 20, y, 100, y); + e.Graphics.DrawString(dash.ToString(), new Font("Tahoma", 8), Brushes.Black, 120, y - 10); + y += 30; + } + + y += 10; + myPen.StartCap = LineCap.Round; + myPen.EndCap = LineCap.Round; + + foreach (DashStyle dash in System.Enum.GetValues(typeof(DashStyle))) + { + myPen.DashStyle = dash; + e.Graphics.DrawLine(myPen, 20, y, 100, y); + e.Graphics.DrawString(dash.ToString() + " (with round caps)", new Font("Tahoma", 8), Brushes.Black, 120, y - 10); + y += 30; + } + } + + private void PenDashStyles_Resize(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/PenDashStyles.resx b/Pro Windows Forms 2.0/Chapter07/Pens/PenDashStyles.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/PenDashStyles.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Pens.csproj b/Pro Windows Forms 2.0/Chapter07/Pens/Pens.csproj new file mode 100644 index 0000000..5d6e7e5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Pens.csproj @@ -0,0 +1,106 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {DACF9925-11EF-40E1-9E69-FFDB3B3958A2} + WinExe + Properties + Pens + Pens + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + LineJoins.cs + + + Form + + + Menu.cs + + + Form + + + PenAlignments.cs + + + Form + + + PenCaps.cs + + + Form + + + PenDashStyles.cs + + + + + LineJoins.cs + + + Menu.cs + + + PenAlignments.cs + + + PenCaps.cs + + + PenDashStyles.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Pens.csproj.user b/Pro Windows Forms 2.0/Chapter07/Pens/Pens.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Pens.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Pens.sln b/Pro Windows Forms 2.0/Chapter07/Pens/Pens.sln new file mode 100644 index 0000000..5369e11 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Pens.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pens", "Pens.csproj", "{DACF9925-11EF-40E1-9E69-FFDB3B3958A2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DACF9925-11EF-40E1-9E69-FFDB3B3958A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DACF9925-11EF-40E1-9E69-FFDB3B3958A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DACF9925-11EF-40E1-9E69-FFDB3B3958A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DACF9925-11EF-40E1-9E69-FFDB3B3958A2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Pens.suo b/Pro Windows Forms 2.0/Chapter07/Pens/Pens.suo new file mode 100644 index 0000000..6620f57 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Pens/Pens.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Program.cs b/Pro Windows Forms 2.0/Chapter07/Pens/Program.cs new file mode 100644 index 0000000..37e6006 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Pens +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/Pens/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b933d1e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Pens")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Pens")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c54f7774-1ba3-4c2a-8075-21274a5c8113")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Resources.Designer.cs new file mode 100644 index 0000000..3e74175 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Pens.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Pens.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Pens.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace Pens.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Pens.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Settings.Designer.cs new file mode 100644 index 0000000..13bccda --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Pens.Properties.Settings.get_Default():Pens.Properties.Settings")] + +namespace Pens.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Pens/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/Pens/bin/Debug/Pens.exe b/Pro Windows Forms 2.0/Chapter07/Pens/bin/Debug/Pens.exe new file mode 100644 index 0000000..951a9a9 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Pens/bin/Debug/Pens.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Form1.Designer.cs new file mode 100644 index 0000000..511785b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Form1.Designer.cs @@ -0,0 +1,93 @@ +namespace ScreenCapture +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panel1 = new System.Windows.Forms.Panel(); + this.cmdCapture = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.AutoScroll = true; + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.Controls.Add(this.pictureBox1); + this.panel1.Location = new System.Drawing.Point(8, 8); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(270, 233); + this.panel1.TabIndex = 0; + // + // cmdCapture + // + this.cmdCapture.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdCapture.Location = new System.Drawing.Point(169, 249); + this.cmdCapture.Name = "cmdCapture"; + this.cmdCapture.Size = new System.Drawing.Size(110, 30); + this.cmdCapture.TabIndex = 1; + this.cmdCapture.Text = "Capture Screen"; + this.cmdCapture.UseVisualStyleBackColor = true; + this.cmdCapture.Click += new System.EventHandler(this.cmdCapture_Click); + // + // pictureBox1 + // + this.pictureBox1.Location = new System.Drawing.Point(0, 0); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(100, 50); + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(290, 288); + this.Controls.Add(this.cmdCapture); + this.Controls.Add(this.panel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Screen Capture"; + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Button cmdCapture; + private System.Windows.Forms.PictureBox pictureBox1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Form1.cs b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Form1.cs new file mode 100644 index 0000000..e02d6d0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Form1.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ScreenCapture +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void cmdCapture_Click(object sender, EventArgs e) + { + if (pictureBox1.Image != null) pictureBox1.Image.Dispose(); + + Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); + Graphics g = Graphics.FromImage(bmp); + g.CopyFromScreen(0, 0, 0, 0, bmp.Size); + g.Dispose(); + pictureBox1.Image = bmp; + pictureBox1.Size = bmp.Size; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Form1.resx b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Program.cs b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Program.cs new file mode 100644 index 0000000..76f7ffa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ScreenCapture +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..835884f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ScreenCapture")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ScreenCapture")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("71fdf5a1-aff6-4d77-a0a6-057dcdb14ef3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Resources.Designer.cs new file mode 100644 index 0000000..bc138f5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.7 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ScreenCapture.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ScreenCapture.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Settings.Designer.cs new file mode 100644 index 0000000..dc601eb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.7 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ScreenCapture.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/ScreenCapture.csproj b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/ScreenCapture.csproj new file mode 100644 index 0000000..e729b10 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/ScreenCapture.csproj @@ -0,0 +1,78 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {81B0F20D-D824-42A0-B372-1F0CB9BCE364} + WinExe + Properties + ScreenCapture + ScreenCapture + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Designer + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/ScreenCapture.sln b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/ScreenCapture.sln new file mode 100644 index 0000000..1bc1ae5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/ScreenCapture.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScreenCapture", "ScreenCapture.csproj", "{81B0F20D-D824-42A0-B372-1F0CB9BCE364}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {81B0F20D-D824-42A0-B372-1F0CB9BCE364}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81B0F20D-D824-42A0-B372-1F0CB9BCE364}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81B0F20D-D824-42A0-B372-1F0CB9BCE364}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81B0F20D-D824-42A0-B372-1F0CB9BCE364}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/ScreenCapture.suo b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/ScreenCapture.suo new file mode 100644 index 0000000..b9b24cf Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/ScreenCapture.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/ScreenCapture/bin/Debug/ScreenCapture.exe b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/bin/Debug/ScreenCapture.exe new file mode 100644 index 0000000..d6d8f19 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/ScreenCapture/bin/Debug/ScreenCapture.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/FlawedResizing.Designer.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/FlawedResizing.Designer.cs new file mode 100644 index 0000000..2f9e403 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/FlawedResizing.Designer.cs @@ -0,0 +1,63 @@ +namespace SimpleDrawing +{ + partial class FlawedResizing + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.chkResizeRedraw = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // chkResizeRedraw + // + this.chkResizeRedraw.AutoSize = true; + this.chkResizeRedraw.Location = new System.Drawing.Point(102, 104); + this.chkResizeRedraw.Name = "chkResizeRedraw"; + this.chkResizeRedraw.Size = new System.Drawing.Size(95, 17); + this.chkResizeRedraw.TabIndex = 0; + this.chkResizeRedraw.Text = "ResizeRedraw"; + this.chkResizeRedraw.CheckedChanged += new System.EventHandler(this.chkResizeRedraw_CheckedChanged); + // + // FlawedResizing + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.chkResizeRedraw); + this.Name = "FlawedResizing"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "FlawedResizing"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.FlawedResizing_Paint); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.CheckBox chkResizeRedraw; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/FlawedResizing.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/FlawedResizing.cs new file mode 100644 index 0000000..f02c403 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/FlawedResizing.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace SimpleDrawing +{ + public partial class FlawedResizing : Form + { + public FlawedResizing() + { + InitializeComponent(); + } + + private void FlawedResizing_Paint(object sender, PaintEventArgs e) + { + ResizeRedraw = chkResizeRedraw.Checked; + Pen pen = new Pen(Color.Red, 1); + e.Graphics.DrawEllipse(pen, new Rectangle(new Point(0, 0), + this.ClientSize)); + pen.Dispose(); + + } + + private void chkResizeRedraw_CheckedChanged(object sender, EventArgs e) + { + Invalidate(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/FlawedResizing.resx b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/FlawedResizing.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/FlawedResizing.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/GraphicsPathExample.resx b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/GraphicsPathExample.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/GraphicsPathExample.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Menu.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Menu.cs new file mode 100644 index 0000000..7ce21c6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace SimpleDrawing +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("SimpleDrawing." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Menu.designer.cs new file mode 100644 index 0000000..ca97ff0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Menu.designer.cs @@ -0,0 +1,98 @@ +namespace SimpleDrawing +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(124, 23); + this.button1.TabIndex = 0; + this.button1.Text = "SimpleDraw"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(124, 23); + this.button2.TabIndex = 1; + this.button2.Text = "Smoothing"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 70); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(124, 23); + this.button3.TabIndex = 2; + this.button3.Text = "SmoothingText"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 99); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(124, 23); + this.button4.TabIndex = 3; + this.button4.Text = "FlawedResizing"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 156); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Menu.resx b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Menu.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Menu.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Program.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Program.cs new file mode 100644 index 0000000..52955a1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace SimpleDrawing +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a403573 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SimpleDrawing")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SimpleDrawing")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("86301d0a-06fc-40ba-9a2b-460de27cae50")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Resources.Designer.cs new file mode 100644 index 0000000..f2d806f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SimpleDrawing.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SimpleDrawing.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SimpleDrawing.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace SimpleDrawing.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SimpleDrawing.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Settings.Designer.cs new file mode 100644 index 0000000..cc36a3b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SimpleDrawing.Properties.Settings.get_Default():SimpleDrawing.Properties.Settings")] + +namespace SimpleDrawing.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDraw.Designer.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDraw.Designer.cs new file mode 100644 index 0000000..78d32ca --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDraw.Designer.cs @@ -0,0 +1,64 @@ +namespace SimpleDrawing +{ + partial class SimpleDraw + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.chkRepaint = new System.Windows.Forms.CheckBox(); + this.SuspendLayout(); + // + // chkRepaint + // + this.chkRepaint.AutoSize = true; + this.chkRepaint.Checked = true; + this.chkRepaint.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkRepaint.Location = new System.Drawing.Point(34, 12); + this.chkRepaint.Name = "chkRepaint"; + this.chkRepaint.Size = new System.Drawing.Size(133, 17); + this.chkRepaint.TabIndex = 0; + this.chkRepaint.Text = "Update when repainted"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(232, 266); + this.Controls.Add(this.chkRepaint); + this.Name = "Form1"; + this.Text = "GDI+"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.CheckBox chkRepaint; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDraw.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDraw.cs new file mode 100644 index 0000000..cc41d60 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDraw.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace SimpleDrawing +{ + public partial class SimpleDraw : Form + { + public SimpleDraw() + { + InitializeComponent(); + } + + private void Form1_Paint(object sender, PaintEventArgs e) + { + if (chkRepaint.Checked) + { + Pen drawingPen = new Pen(Color.Red, 15); + e.Graphics.DrawArc(drawingPen, 50, 20, 100, 200, 40, 210); + drawingPen.Dispose(); + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDraw.resx b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDraw.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDraw.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.csproj b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.csproj new file mode 100644 index 0000000..9d5944a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.csproj @@ -0,0 +1,106 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {B9265177-B621-4F7F-899A-AE568AE06C4A} + WinExe + Properties + SimpleDrawing + SimpleDrawing + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + FlawedResizing.cs + + + Form + + + Menu.cs + + + Form + + + SimpleDraw.cs + + + + + FlawedResizing.cs + + + Menu.cs + + + SimpleDraw.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + Smoothing.cs + + + SmoothingText.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Form + + + Smoothing.cs + + + Form + + + SmoothingText.cs + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.csproj.user b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.sln b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.sln new file mode 100644 index 0000000..108b8fe --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleDrawing", "SimpleDrawing.csproj", "{B9265177-B621-4F7F-899A-AE568AE06C4A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B9265177-B621-4F7F-899A-AE568AE06C4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B9265177-B621-4F7F-899A-AE568AE06C4A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9265177-B621-4F7F-899A-AE568AE06C4A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B9265177-B621-4F7F-899A-AE568AE06C4A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.suo b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.suo new file mode 100644 index 0000000..b9e2814 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SimpleDrawing.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Smoothing.Designer.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Smoothing.Designer.cs new file mode 100644 index 0000000..7163d73 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Smoothing.Designer.cs @@ -0,0 +1,163 @@ +namespace SimpleDrawing +{ + partial class Smoothing + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.grpHighQuality = new System.Windows.Forms.GroupBox(); + this.picHighQuality = new System.Windows.Forms.PictureBox(); + this.grpAntiAlias = new System.Windows.Forms.GroupBox(); + this.picAntialias = new System.Windows.Forms.PictureBox(); + this.grpHighSpeed = new System.Windows.Forms.GroupBox(); + this.picHighSpeed = new System.Windows.Forms.PictureBox(); + this.grpNone = new System.Windows.Forms.GroupBox(); + this.picNone = new System.Windows.Forms.PictureBox(); + this.grpHighQuality.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picHighQuality)).BeginInit(); + this.grpAntiAlias.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picAntialias)).BeginInit(); + this.grpHighSpeed.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picHighSpeed)).BeginInit(); + this.grpNone.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picNone)).BeginInit(); + this.SuspendLayout(); + // + // grpHighQuality + // + this.grpHighQuality.Controls.Add(this.picHighQuality); + this.grpHighQuality.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.grpHighQuality.Location = new System.Drawing.Point(12, 276); + this.grpHighQuality.Name = "grpHighQuality"; + this.grpHighQuality.Size = new System.Drawing.Size(344, 85); + this.grpHighQuality.TabIndex = 12; + this.grpHighQuality.TabStop = false; + this.grpHighQuality.Text = "HighQuality"; + // + // picHighQuality + // + this.picHighQuality.Location = new System.Drawing.Point(8, 16); + this.picHighQuality.Name = "picHighQuality"; + this.picHighQuality.Size = new System.Drawing.Size(328, 64); + this.picHighQuality.TabIndex = 0; + this.picHighQuality.TabStop = false; + this.picHighQuality.Paint += new System.Windows.Forms.PaintEventHandler(this.picHighQuality_Paint); + // + // grpAntiAlias + // + this.grpAntiAlias.Controls.Add(this.picAntialias); + this.grpAntiAlias.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.grpAntiAlias.Location = new System.Drawing.Point(12, 188); + this.grpAntiAlias.Name = "grpAntiAlias"; + this.grpAntiAlias.Size = new System.Drawing.Size(344, 85); + this.grpAntiAlias.TabIndex = 11; + this.grpAntiAlias.TabStop = false; + this.grpAntiAlias.Text = "AntiAlias"; + // + // picAntialias + // + this.picAntialias.Location = new System.Drawing.Point(8, 16); + this.picAntialias.Name = "picAntialias"; + this.picAntialias.Size = new System.Drawing.Size(328, 64); + this.picAntialias.TabIndex = 0; + this.picAntialias.TabStop = false; + this.picAntialias.Paint += new System.Windows.Forms.PaintEventHandler(this.picAntialias_Paint); + // + // grpHighSpeed + // + this.grpHighSpeed.Controls.Add(this.picHighSpeed); + this.grpHighSpeed.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.grpHighSpeed.Location = new System.Drawing.Point(12, 100); + this.grpHighSpeed.Name = "grpHighSpeed"; + this.grpHighSpeed.Size = new System.Drawing.Size(344, 85); + this.grpHighSpeed.TabIndex = 10; + this.grpHighSpeed.TabStop = false; + this.grpHighSpeed.Text = "HighSpeed"; + // + // picHighSpeed + // + this.picHighSpeed.Location = new System.Drawing.Point(8, 16); + this.picHighSpeed.Name = "picHighSpeed"; + this.picHighSpeed.Size = new System.Drawing.Size(328, 64); + this.picHighSpeed.TabIndex = 0; + this.picHighSpeed.TabStop = false; + this.picHighSpeed.Paint += new System.Windows.Forms.PaintEventHandler(this.picHighSpeed_Paint); + // + // grpNone + // + this.grpNone.Controls.Add(this.picNone); + this.grpNone.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.grpNone.Location = new System.Drawing.Point(12, 12); + this.grpNone.Name = "grpNone"; + this.grpNone.Size = new System.Drawing.Size(344, 85); + this.grpNone.TabIndex = 9; + this.grpNone.TabStop = false; + this.grpNone.Text = "None"; + // + // picNone + // + this.picNone.Location = new System.Drawing.Point(8, 16); + this.picNone.Name = "picNone"; + this.picNone.Size = new System.Drawing.Size(328, 64); + this.picNone.TabIndex = 0; + this.picNone.TabStop = false; + this.picNone.Paint += new System.Windows.Forms.PaintEventHandler(this.picNone_Paint); + // + // Smoothing + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(392, 382); + this.Controls.Add(this.grpHighQuality); + this.Controls.Add(this.grpAntiAlias); + this.Controls.Add(this.grpHighSpeed); + this.Controls.Add(this.grpNone); + this.Name = "Smoothing"; + this.Text = "Smoothing"; + this.grpHighQuality.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.picHighQuality)).EndInit(); + this.grpAntiAlias.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.picAntialias)).EndInit(); + this.grpHighSpeed.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.picHighSpeed)).EndInit(); + this.grpNone.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.picNone)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grpHighQuality; + private System.Windows.Forms.PictureBox picHighQuality; + private System.Windows.Forms.GroupBox grpAntiAlias; + private System.Windows.Forms.PictureBox picAntialias; + private System.Windows.Forms.GroupBox grpHighSpeed; + private System.Windows.Forms.PictureBox picHighSpeed; + private System.Windows.Forms.GroupBox grpNone; + private System.Windows.Forms.PictureBox picNone; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Smoothing.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Smoothing.cs new file mode 100644 index 0000000..a6780ae --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Smoothing.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace SimpleDrawing +{ + public partial class Smoothing : Form + { + public Smoothing() + { + InitializeComponent(); + } + + private void picNone_Paint(object sender, System.Windows.Forms.PaintEventArgs e) + { + DrawEllipse(e.Graphics); + } + + private void picHighSpeed_Paint(object sender, System.Windows.Forms.PaintEventArgs e) + { + e.Graphics.SmoothingMode = SmoothingMode.HighSpeed; + DrawEllipse(e.Graphics); + + } + + private void picAntialias_Paint(object sender, System.Windows.Forms.PaintEventArgs e) + { + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + DrawEllipse(e.Graphics); + } + + private void picHighQuality_Paint(object sender, System.Windows.Forms.PaintEventArgs e) + { + e.Graphics.SmoothingMode = SmoothingMode.HighQuality; + DrawEllipse(e.Graphics); + } + + private void DrawEllipse(Graphics g) + { + Pen drawingPen = new Pen(Color.Red, 5); + g.DrawEllipse(drawingPen, 10, 10, 300, 40); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Smoothing.resx b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Smoothing.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/Smoothing.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SmoothingText.Designer.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SmoothingText.Designer.cs new file mode 100644 index 0000000..06eeea7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SmoothingText.Designer.cs @@ -0,0 +1,87 @@ +namespace SimpleDrawing +{ + partial class SmoothingText + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Label3 = new System.Windows.Forms.Label(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // Label3 + // + this.Label3.BackColor = System.Drawing.Color.White; + this.Label3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Label3.Location = new System.Drawing.Point(271, 171); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(128, 16); + this.Label3.TabIndex = 8; + this.Label3.Text = " ClearTypeGridFit"; + // + // Label2 + // + this.Label2.BackColor = System.Drawing.Color.White; + this.Label2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Label2.Location = new System.Drawing.Point(271, 103); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(128, 16); + this.Label2.TabIndex = 7; + this.Label2.Text = " AntiAliasGridFit"; + // + // Label1 + // + this.Label1.BackColor = System.Drawing.Color.White; + this.Label1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Label1.Location = new System.Drawing.Point(271, 39); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(128, 16); + this.Label1.TabIndex = 6; + this.Label1.Text = " SingleBitPerPixelGridFit"; + // + // SmoothingText + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(472, 315); + this.Controls.Add(this.Label3); + this.Controls.Add(this.Label2); + this.Controls.Add(this.Label1); + this.Name = "SmoothingText"; + this.Text = "SmoothingText"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.SmoothingText_Paint); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label Label3; + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SmoothingText.cs b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SmoothingText.cs new file mode 100644 index 0000000..7b538b4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SmoothingText.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Text; + +namespace SimpleDrawing +{ + public partial class SmoothingText : Form + { + public SmoothingText() + { + InitializeComponent(); + } + + private void SmoothingText_Paint(object sender, PaintEventArgs e) + { + Font TextFont = new Font("Times New Roman", 25, FontStyle.Italic); + e.Graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit; + e.Graphics.DrawString("Sample Text", TextFont, Brushes.Black, 20, 20); + e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; + e.Graphics.DrawString("Sample Text", TextFont, Brushes.Black, 20, 85); + e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; + e.Graphics.DrawString("Sample Text", TextFont, Brushes.Black, 20, 150); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SmoothingText.resx b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SmoothingText.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/SmoothingText.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/bin/Debug/SimpleDrawing.exe b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/bin/Debug/SimpleDrawing.exe new file mode 100644 index 0000000..67bb2b7 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/SimpleDrawing/bin/Debug/SimpleDrawing.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/Text/Program.cs b/Pro Windows Forms 2.0/Chapter07/Text/Program.cs new file mode 100644 index 0000000..f76b4ad --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Text +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new TextWrap()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Text/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/Text/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6191a34 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Text")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Text")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("51d7ae64-9705-40ba-970a-65bc187430a7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/Text/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Text/Properties/Resources.Designer.cs new file mode 100644 index 0000000..3f838f3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Text.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Text.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Text.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace Text.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Text.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/Text/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/Text/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Text/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Text/Properties/Settings.Designer.cs new file mode 100644 index 0000000..3fc4fd3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Text.Properties.Settings.get_Default():Text.Properties.Settings")] + +namespace Text.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/Text/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/Text/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/Text/Text.csproj b/Pro Windows Forms 2.0/Chapter07/Text/Text.csproj new file mode 100644 index 0000000..c875c87 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/Text.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {D1BB50EA-9F6E-4BD5-B928-9C2B4213E8E2} + WinExe + Properties + Text + Text + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + TextWrap.cs + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + TextWrap.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Text/Text.csproj.user b/Pro Windows Forms 2.0/Chapter07/Text/Text.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/Text.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Text/Text.sln b/Pro Windows Forms 2.0/Chapter07/Text/Text.sln new file mode 100644 index 0000000..94038b9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/Text.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Text", "Text.csproj", "{D1BB50EA-9F6E-4BD5-B928-9C2B4213E8E2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D1BB50EA-9F6E-4BD5-B928-9C2B4213E8E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D1BB50EA-9F6E-4BD5-B928-9C2B4213E8E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1BB50EA-9F6E-4BD5-B928-9C2B4213E8E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D1BB50EA-9F6E-4BD5-B928-9C2B4213E8E2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/Text/Text.suo b/Pro Windows Forms 2.0/Chapter07/Text/Text.suo new file mode 100644 index 0000000..5051396 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Text/Text.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/Text/TextWrap.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Text/TextWrap.Designer.cs new file mode 100644 index 0000000..e345513 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/TextWrap.Designer.cs @@ -0,0 +1,127 @@ +namespace Text +{ + partial class TextWrap + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.lstAlignmentH = new System.Windows.Forms.ComboBox(); + this.lstTrimming = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.lstAlignmentV = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 19); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(113, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Alignment (Horizontal):"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 74); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(49, 13); + this.label2.TabIndex = 1; + this.label2.Text = "Trimming:"; + // + // lstAlignmentH + // + this.lstAlignmentH.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.lstAlignmentH.FormattingEnabled = true; + this.lstAlignmentH.Location = new System.Drawing.Point(131, 16); + this.lstAlignmentH.Name = "lstAlignmentH"; + this.lstAlignmentH.Size = new System.Drawing.Size(121, 21); + this.lstAlignmentH.TabIndex = 2; + this.lstAlignmentH.SelectedIndexChanged += new System.EventHandler(this.lst_Changed); + // + // lstTrimming + // + this.lstTrimming.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.lstTrimming.FormattingEnabled = true; + this.lstTrimming.Location = new System.Drawing.Point(131, 69); + this.lstTrimming.Name = "lstTrimming"; + this.lstTrimming.Size = new System.Drawing.Size(121, 21); + this.lstTrimming.TabIndex = 3; + this.lstTrimming.SelectedIndexChanged += new System.EventHandler(this.lst_Changed); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 47); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(100, 13); + this.label3.TabIndex = 4; + this.label3.Text = "Alignment (Vertical):"; + // + // lstAlignmentV + // + this.lstAlignmentV.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.lstAlignmentV.FormattingEnabled = true; + this.lstAlignmentV.Location = new System.Drawing.Point(131, 42); + this.lstAlignmentV.Name = "lstAlignmentV"; + this.lstAlignmentV.Size = new System.Drawing.Size(121, 21); + this.lstAlignmentV.TabIndex = 5; + this.lstAlignmentV.SelectedIndexChanged += new System.EventHandler(this.lst_Changed); + // + // TextWrap + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(319, 296); + this.Controls.Add(this.lstAlignmentV); + this.Controls.Add(this.label3); + this.Controls.Add(this.lstTrimming); + this.Controls.Add(this.lstAlignmentH); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "TextWrap"; + this.Text = "Text Wrap"; + this.Load += new System.EventHandler(this.TextWrap_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.TextWrap_Paint); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox lstAlignmentH; + private System.Windows.Forms.ComboBox lstTrimming; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ComboBox lstAlignmentV; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/Text/TextWrap.cs b/Pro Windows Forms 2.0/Chapter07/Text/TextWrap.cs new file mode 100644 index 0000000..52534f2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/TextWrap.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Text +{ + public partial class TextWrap : Form + { + public TextWrap() + { + InitializeComponent(); + } + + private void TextWrap_Paint(object sender, PaintEventArgs e) + { + string text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; + + StringFormat stringFormat = new StringFormat(); + // Center each line of text. + stringFormat.Alignment = (StringAlignment)Enum.Parse(typeof(StringAlignment), lstAlignmentH.Text); + // Center the block of text (top to bottom) in the rectangle. + stringFormat.LineAlignment = (StringAlignment)Enum.Parse(typeof(StringAlignment), lstAlignmentV.Text); + + // Set the wrap style. + stringFormat.Trimming = (StringTrimming)Enum.Parse(typeof(StringTrimming), lstTrimming.Text); + + Font font = new Font("Verdana", 12); + Rectangle rect = new Rectangle(30, 110, Width - 60, Height - 160); + e.Graphics.DrawString(text, font, Brushes.Black, rect, stringFormat); + + Pen pen = Pens.Black; + e.Graphics.DrawRectangle(pen, rect); + + } + + private void TextWrap_Load(object sender, EventArgs e) + { + ResizeRedraw = true; + lstAlignmentH.DataSource = Enum.GetNames(typeof(StringAlignment)); + lstAlignmentV.DataSource = Enum.GetNames(typeof(StringAlignment)); + lstTrimming.DataSource = Enum.GetNames(typeof(StringTrimming)); + } + + private void lst_Changed(object sender, EventArgs e) + { + Invalidate(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Text/TextWrap.resx b/Pro Windows Forms 2.0/Chapter07/Text/TextWrap.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Text/TextWrap.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Text/bin/Debug/Text.exe b/Pro Windows Forms 2.0/Chapter07/Text/bin/Debug/Text.exe new file mode 100644 index 0000000..72a122e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Text/bin/Debug/Text.exe differ diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Menu.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Transforms/Menu.Designer.cs new file mode 100644 index 0000000..9de978c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Menu.Designer.cs @@ -0,0 +1,73 @@ +namespace Transforms +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(124, 23); + this.button2.TabIndex = 4; + this.button2.Text = "RotateTransform"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(124, 23); + this.button1.TabIndex = 3; + this.button1.Text = "TranslateTransform"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(177, 153); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Menu.cs b/Pro Windows Forms 2.0/Chapter07/Transforms/Menu.cs new file mode 100644 index 0000000..1ca8125 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace Transforms +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("Transforms." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Menu.resx b/Pro Windows Forms 2.0/Chapter07/Transforms/Menu.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Menu.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Program.cs b/Pro Windows Forms 2.0/Chapter07/Transforms/Program.cs new file mode 100644 index 0000000..fd60e02 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Transforms +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a3afa70 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Transforms")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Transforms")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b9890361-ffeb-4c75-a459-125cb8bb8354")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Resources.Designer.cs new file mode 100644 index 0000000..902bb00 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Transforms.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Transforms.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Transforms.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace Transforms.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Transforms.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Settings.Designer.cs new file mode 100644 index 0000000..5ac188f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Transforms.Properties.Settings.get_Default():Transforms.Properties.Settings")] + +namespace Transforms.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/RotateTransform.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Transforms/RotateTransform.Designer.cs new file mode 100644 index 0000000..72321f7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/RotateTransform.Designer.cs @@ -0,0 +1,47 @@ +namespace Transforms +{ + partial class RotateTransform + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // RotateTransform + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "RotateTransform"; + this.Text = "RotateTransform"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.RotateTransform_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/RotateTransform.cs b/Pro Windows Forms 2.0/Chapter07/Transforms/RotateTransform.cs new file mode 100644 index 0000000..d0bb41f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/RotateTransform.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Text; + +namespace Transforms +{ + public partial class RotateTransform : Form + { + public RotateTransform() + { + InitializeComponent(); + } + + private void RotateTransform_Paint(object sender, PaintEventArgs e) + { + // Optimize text quality. + e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; + + // Move origin to center of form so we can rotate around that. + e.Graphics.TranslateTransform(this.Width / 2 - 30, this.Height / 2 - 30); + + DrawText(e.Graphics); + e.Graphics.RotateTransform(45); + DrawText(e.Graphics); + e.Graphics.RotateTransform(75); + DrawText(e.Graphics); + e.Graphics.RotateTransform(160); + DrawText(e.Graphics); + } + + private void DrawText(Graphics g) + { + g.DrawString("Text", new Font("Verdana", 30, FontStyle.Bold), + Brushes.Black, 0, 0); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/RotateTransform.resx b/Pro Windows Forms 2.0/Chapter07/Transforms/RotateTransform.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/RotateTransform.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.csproj b/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.csproj new file mode 100644 index 0000000..b57fd26 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.csproj @@ -0,0 +1,88 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {9FA3FF43-8117-4BCE-A6C7-944C9FAAD509} + WinExe + Properties + Transforms + Transforms + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Menu.cs + + + + + Menu.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + RotateTransform.cs + + + TranslateTransform.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Form + + + RotateTransform.cs + + + Form + + + TranslateTransform.cs + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.csproj.user b/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.sln b/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.sln new file mode 100644 index 0000000..2de661c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Transforms", "Transforms.csproj", "{9FA3FF43-8117-4BCE-A6C7-944C9FAAD509}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9FA3FF43-8117-4BCE-A6C7-944C9FAAD509}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FA3FF43-8117-4BCE-A6C7-944C9FAAD509}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FA3FF43-8117-4BCE-A6C7-944C9FAAD509}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FA3FF43-8117-4BCE-A6C7-944C9FAAD509}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.suo b/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.suo new file mode 100644 index 0000000..b6b7d57 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Transforms/Transforms.suo differ diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/TranslateTransform.Designer.cs b/Pro Windows Forms 2.0/Chapter07/Transforms/TranslateTransform.Designer.cs new file mode 100644 index 0000000..8a95834 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/TranslateTransform.Designer.cs @@ -0,0 +1,47 @@ +namespace Transforms +{ + partial class TranslateTransform + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // TranslateTransform + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "TranslateTransform"; + this.Text = "TranslateTransform"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.TranslateTransform_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/TranslateTransform.cs b/Pro Windows Forms 2.0/Chapter07/Transforms/TranslateTransform.cs new file mode 100644 index 0000000..58ceeb5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/TranslateTransform.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Transforms +{ + public partial class TranslateTransform : Form + { + public TranslateTransform() + { + InitializeComponent(); + } + + private void TranslateTransform_Paint(object sender, PaintEventArgs e) + { + // Draw several squares in different places. + DrawRectangle(e.Graphics); + e.Graphics.TranslateTransform(180, 60); + DrawRectangle(e.Graphics); + e.Graphics.TranslateTransform(-50, 80); + DrawRectangle(e.Graphics); + e.Graphics.TranslateTransform(-100, 50); + DrawRectangle(e.Graphics); + } + + private void DrawRectangle(Graphics g) + { + Pen drawingPen = new Pen(Color.Red, 30); + + // Draw a rectangle at a fixed position. + g.DrawRectangle(drawingPen, new Rectangle(20, 20, 20, 20)); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/TranslateTransform.resx b/Pro Windows Forms 2.0/Chapter07/Transforms/TranslateTransform.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter07/Transforms/TranslateTransform.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter07/Transforms/bin/Debug/Transforms.exe b/Pro Windows Forms 2.0/Chapter07/Transforms/bin/Debug/Transforms.exe new file mode 100644 index 0000000..2fa34ce Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter07/Transforms/bin/Debug/Transforms.exe differ diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.csproj b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.csproj new file mode 100644 index 0000000..5c027da --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.csproj @@ -0,0 +1,75 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {88DE7ED2-2F60-4DDE-9C40-0FB5E57079DE} + WinExe + Properties + AutomaticObjectBinding + AutomaticObjectBinding + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.csproj.user b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.sln b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.sln new file mode 100644 index 0000000..ba98814 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutomaticObjectBinding", "AutomaticObjectBinding.csproj", "{88DE7ED2-2F60-4DDE-9C40-0FB5E57079DE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {88DE7ED2-2F60-4DDE-9C40-0FB5E57079DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88DE7ED2-2F60-4DDE-9C40-0FB5E57079DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88DE7ED2-2F60-4DDE-9C40-0FB5E57079DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88DE7ED2-2F60-4DDE-9C40-0FB5E57079DE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.suo b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.suo new file mode 100644 index 0000000..cc7577b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/AutomaticObjectBinding.suo differ diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Form1.Designer.cs new file mode 100644 index 0000000..106d182 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Form1.Designer.cs @@ -0,0 +1,294 @@ +namespace AutomaticObjectBinding +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + System.Windows.Forms.Label descriptionLabel; + System.Windows.Forms.Label modelNameLabel; + System.Windows.Forms.Label modelNumberLabel; + System.Windows.Forms.Label unitCostLabel; + this.productListBindingSource = new System.Windows.Forms.BindingSource(this.components); + this.productListBindingNavigator = new System.Windows.Forms.BindingNavigator(this.components); + this.bindingNavigatorMoveFirstItem = new System.Windows.Forms.ToolStripButton(); + this.bindingNavigatorMovePreviousItem = new System.Windows.Forms.ToolStripButton(); + this.bindingNavigatorSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.bindingNavigatorPositionItem = new System.Windows.Forms.ToolStripTextBox(); + this.bindingNavigatorCountItem = new System.Windows.Forms.ToolStripLabel(); + this.bindingNavigatorSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.bindingNavigatorMoveNextItem = new System.Windows.Forms.ToolStripButton(); + this.bindingNavigatorMoveLastItem = new System.Windows.Forms.ToolStripButton(); + this.bindingNavigatorSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.bindingNavigatorAddNewItem = new System.Windows.Forms.ToolStripButton(); + this.bindingNavigatorDeleteItem = new System.Windows.Forms.ToolStripButton(); + this.bindingNavigatorSaveItem = new System.Windows.Forms.ToolStripButton(); + this.descriptionLabel1 = new System.Windows.Forms.Label(); + this.modelNameComboBox = new System.Windows.Forms.ComboBox(); + this.modelNumberTextBox = new System.Windows.Forms.TextBox(); + this.unitCostTextBox = new System.Windows.Forms.TextBox(); + descriptionLabel = new System.Windows.Forms.Label(); + modelNameLabel = new System.Windows.Forms.Label(); + modelNumberLabel = new System.Windows.Forms.Label(); + unitCostLabel = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.productListBindingSource)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.productListBindingNavigator)).BeginInit(); + this.productListBindingNavigator.SuspendLayout(); + this.SuspendLayout(); + // + // productListBindingSource + // + this.productListBindingSource.DataSource = typeof(AutomaticObjectBinding.ProductList); + // + // productListBindingNavigator + // + this.productListBindingNavigator.AddNewItem = this.bindingNavigatorAddNewItem; + this.productListBindingNavigator.BindingSource = this.productListBindingSource; + this.productListBindingNavigator.CountItem = this.bindingNavigatorCountItem; + this.productListBindingNavigator.CountItemFormat = "of {0}"; + this.productListBindingNavigator.DeleteItem = this.bindingNavigatorDeleteItem; + this.productListBindingNavigator.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.bindingNavigatorMoveFirstItem, + this.bindingNavigatorMovePreviousItem, + this.bindingNavigatorSeparator, + this.bindingNavigatorPositionItem, + this.bindingNavigatorCountItem, + this.bindingNavigatorSeparator1, + this.bindingNavigatorMoveNextItem, + this.bindingNavigatorMoveLastItem, + this.bindingNavigatorSeparator2, + this.bindingNavigatorAddNewItem, + this.bindingNavigatorDeleteItem, + this.bindingNavigatorSaveItem}); + this.productListBindingNavigator.Location = new System.Drawing.Point(0, 0); + this.productListBindingNavigator.MoveFirstItem = this.bindingNavigatorMoveFirstItem; + this.productListBindingNavigator.MoveLastItem = this.bindingNavigatorMoveLastItem; + this.productListBindingNavigator.MoveNextItem = this.bindingNavigatorMoveNextItem; + this.productListBindingNavigator.MovePreviousItem = this.bindingNavigatorMovePreviousItem; + this.productListBindingNavigator.Name = "productListBindingNavigator"; + this.productListBindingNavigator.PositionItem = this.bindingNavigatorPositionItem; + this.productListBindingNavigator.Size = new System.Drawing.Size(292, 25); + this.productListBindingNavigator.TabIndex = 0; + this.productListBindingNavigator.Text = "bindingNavigator1"; + // + // bindingNavigatorMoveFirstItem + // + this.bindingNavigatorMoveFirstItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.bindingNavigatorMoveFirstItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveFirstItem.Image"))); + this.bindingNavigatorMoveFirstItem.Name = "bindingNavigatorMoveFirstItem"; + this.bindingNavigatorMoveFirstItem.Text = "Move first"; + // + // bindingNavigatorMovePreviousItem + // + this.bindingNavigatorMovePreviousItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.bindingNavigatorMovePreviousItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMovePreviousItem.Image"))); + this.bindingNavigatorMovePreviousItem.Name = "bindingNavigatorMovePreviousItem"; + this.bindingNavigatorMovePreviousItem.Text = "Move previous"; + // + // bindingNavigatorSeparator + // + this.bindingNavigatorSeparator.Name = "bindingNavigatorSeparator"; + // + // bindingNavigatorPositionItem + // + this.bindingNavigatorPositionItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.ImageAndText; + this.bindingNavigatorPositionItem.Name = "bindingNavigatorPositionItem"; + this.bindingNavigatorPositionItem.Size = new System.Drawing.Size(50, 25); + this.bindingNavigatorPositionItem.Text = "0"; + this.bindingNavigatorPositionItem.ToolTipText = "Current position"; + // + // bindingNavigatorCountItem + // + this.bindingNavigatorCountItem.Name = "bindingNavigatorCountItem"; + this.bindingNavigatorCountItem.Text = "of {0}"; + this.bindingNavigatorCountItem.ToolTipText = "Total number of items"; + // + // bindingNavigatorSeparator1 + // + this.bindingNavigatorSeparator1.Name = "bindingNavigatorSeparator"; + // + // bindingNavigatorMoveNextItem + // + this.bindingNavigatorMoveNextItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.bindingNavigatorMoveNextItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveNextItem.Image"))); + this.bindingNavigatorMoveNextItem.Name = "bindingNavigatorMoveNextItem"; + this.bindingNavigatorMoveNextItem.Text = "Move next"; + // + // bindingNavigatorMoveLastItem + // + this.bindingNavigatorMoveLastItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.bindingNavigatorMoveLastItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorMoveLastItem.Image"))); + this.bindingNavigatorMoveLastItem.Name = "bindingNavigatorMoveLastItem"; + this.bindingNavigatorMoveLastItem.Text = "Move last"; + // + // bindingNavigatorSeparator2 + // + this.bindingNavigatorSeparator2.Name = "bindingNavigatorSeparator"; + // + // bindingNavigatorAddNewItem + // + this.bindingNavigatorAddNewItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.bindingNavigatorAddNewItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorAddNewItem.Image"))); + this.bindingNavigatorAddNewItem.Name = "bindingNavigatorAddNewItem"; + this.bindingNavigatorAddNewItem.Text = "Add new"; + // + // bindingNavigatorDeleteItem + // + this.bindingNavigatorDeleteItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.bindingNavigatorDeleteItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorDeleteItem.Image"))); + this.bindingNavigatorDeleteItem.Name = "bindingNavigatorDeleteItem"; + this.bindingNavigatorDeleteItem.Text = "Delete"; + // + // bindingNavigatorSaveItem + // + this.bindingNavigatorSaveItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.bindingNavigatorSaveItem.Enabled = false; + this.bindingNavigatorSaveItem.Image = ((System.Drawing.Image)(resources.GetObject("bindingNavigatorSaveItem.Image"))); + this.bindingNavigatorSaveItem.Name = "bindingNavigatorSaveItem"; + this.bindingNavigatorSaveItem.Text = "Save Data"; + // + // descriptionLabel + // + descriptionLabel.AutoSize = true; + descriptionLabel.Location = new System.Drawing.Point(30, 49); + descriptionLabel.Name = "descriptionLabel"; + descriptionLabel.Size = new System.Drawing.Size(59, 13); + descriptionLabel.TabIndex = 1; + descriptionLabel.Text = "Description:"; + // + // descriptionLabel1 + // + this.descriptionLabel1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.productListBindingSource, "Description", true)); + this.descriptionLabel1.Location = new System.Drawing.Point(112, 49); + this.descriptionLabel1.Name = "descriptionLabel1"; + this.descriptionLabel1.Size = new System.Drawing.Size(121, 23); + this.descriptionLabel1.TabIndex = 2; + // + // modelNameLabel + // + modelNameLabel.AutoSize = true; + modelNameLabel.Location = new System.Drawing.Point(30, 76); + modelNameLabel.Name = "modelNameLabel"; + modelNameLabel.Size = new System.Drawing.Size(66, 13); + modelNameLabel.TabIndex = 3; + modelNameLabel.Text = "Model Name:"; + // + // modelNameComboBox + // + this.modelNameComboBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.productListBindingSource, "ModelName", true)); + this.modelNameComboBox.FormattingEnabled = true; + this.modelNameComboBox.Location = new System.Drawing.Point(112, 76); + this.modelNameComboBox.Name = "modelNameComboBox"; + this.modelNameComboBox.Size = new System.Drawing.Size(121, 21); + this.modelNameComboBox.TabIndex = 4; + // + // modelNumberLabel + // + modelNumberLabel.AutoSize = true; + modelNumberLabel.Location = new System.Drawing.Point(30, 107); + modelNumberLabel.Name = "modelNumberLabel"; + modelNumberLabel.Size = new System.Drawing.Size(75, 13); + modelNumberLabel.TabIndex = 5; + modelNumberLabel.Text = "Model Number:"; + // + // modelNumberTextBox + // + this.modelNumberTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.productListBindingSource, "ModelNumber", true)); + this.modelNumberTextBox.Location = new System.Drawing.Point(112, 104); + this.modelNumberTextBox.Name = "modelNumberTextBox"; + this.modelNumberTextBox.Size = new System.Drawing.Size(121, 20); + this.modelNumberTextBox.TabIndex = 6; + // + // unitCostLabel + // + unitCostLabel.AutoSize = true; + unitCostLabel.Location = new System.Drawing.Point(30, 134); + unitCostLabel.Name = "unitCostLabel"; + unitCostLabel.Size = new System.Drawing.Size(49, 13); + unitCostLabel.TabIndex = 7; + unitCostLabel.Text = "Unit Cost:"; + // + // unitCostTextBox + // + this.unitCostTextBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.productListBindingSource, "UnitCost", true)); + this.unitCostTextBox.Location = new System.Drawing.Point(112, 131); + this.unitCostTextBox.Name = "unitCostTextBox"; + this.unitCostTextBox.Size = new System.Drawing.Size(121, 20); + this.unitCostTextBox.TabIndex = 8; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(descriptionLabel); + this.Controls.Add(this.descriptionLabel1); + this.Controls.Add(modelNameLabel); + this.Controls.Add(this.modelNameComboBox); + this.Controls.Add(modelNumberLabel); + this.Controls.Add(this.modelNumberTextBox); + this.Controls.Add(unitCostLabel); + this.Controls.Add(this.unitCostTextBox); + this.Controls.Add(this.productListBindingNavigator); + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + ((System.ComponentModel.ISupportInitialize)(this.productListBindingSource)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.productListBindingNavigator)).EndInit(); + this.productListBindingNavigator.ResumeLayout(false); + this.productListBindingNavigator.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.BindingSource productListBindingSource; + private System.Windows.Forms.BindingNavigator productListBindingNavigator; + private System.Windows.Forms.ToolStripButton bindingNavigatorAddNewItem; + private System.Windows.Forms.ToolStripLabel bindingNavigatorCountItem; + private System.Windows.Forms.ToolStripButton bindingNavigatorDeleteItem; + private System.Windows.Forms.ToolStripButton bindingNavigatorMoveFirstItem; + private System.Windows.Forms.ToolStripButton bindingNavigatorMovePreviousItem; + private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator; + private System.Windows.Forms.ToolStripTextBox bindingNavigatorPositionItem; + private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator1; + private System.Windows.Forms.ToolStripButton bindingNavigatorMoveNextItem; + private System.Windows.Forms.ToolStripButton bindingNavigatorMoveLastItem; + private System.Windows.Forms.ToolStripSeparator bindingNavigatorSeparator2; + private System.Windows.Forms.ToolStripButton bindingNavigatorSaveItem; + private System.Windows.Forms.Label descriptionLabel1; + private System.Windows.Forms.ComboBox modelNameComboBox; + private System.Windows.Forms.TextBox modelNumberTextBox; + private System.Windows.Forms.TextBox unitCostTextBox; + + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Form1.cs b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Form1.cs new file mode 100644 index 0000000..bb0af24 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Form1.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace AutomaticObjectBinding +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + productListBindingSource.DataSource = Program.StoreDB.GetProducts(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Form1.resx b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Form1.resx new file mode 100644 index 0000000..6818a8c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Form1.resx @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 194, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAfNJREFUOE/Nk8lr + U1EUxvtnuHMnLQouFGpBRdwIorgQ7EYUobqpi0bEooID3XbRhQutOFDbOgUqDs2AbU2cWtoaJG0TxTSV + 5OXV5OXlzYOJ/rzGVSGBLL27C+f7ne8799y2tv/2uKUI7voILRt05Qm84jhWbqwuqixd5MfrfTj5B/W7 + LY3gK48FNNQYaqzeZD1+FC3ZR9WcxEqdR4luF6Jx3MIwyvtDaMsB3OKLJoDsCMWPJ5CfbcZJncVN9aLH + dvFTGkR/t59SdCdmdgi70ATw16ZfmcBKnkF5vgl99iBm8jT6QjfahwNU1TE8Pdq4e9WYQUtfw0j3Yy2d + QovvxskM4ZsLWNlBrHQAb/UK1pcLOLkbIuLcRpAjPyQ3uQf51TbK4S3Cehee9JTfv3Rs6Q564jharJNi + eCvqYg9+ZXojwFcXMbJ3cQr38Nauo0ba0ee6sb8OoM0fE656qOlPcKT7Ahikan1rHMXOD1Oa2ktZTN+c + P4z2pgvz80kB7MBMBfCNcPO9sPOjyLEjSKFO/PIj0b1fxGkXnYOYK+covOzAyAzgKU0gdm4U5VMf5vdb + +Po0+sol5NAOvFIQT42gJi+jp6/ilZu8hKfMik2cwi3F6zbNtduUE71C/E/gKW8FbAavkmhtvWtOhpqz + 3Fpxyx+mQeEfdtWWWgCbhLwAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAW9JREFUOE+tkk0o + w3EYx3dV3kq5uKBWDiPT8hISMiQsMiEyQ9qBg0hoFwcHUi7kgIvkQFJSTrQ4zdvmrTW1/kuT0i74x+X3 + MRal/fEnv8tz+H2fz/N8vz0azX88PG6wmcDp4E881hYR3VUIixF2Nr+FcO2DlbnPGjaWoM+M6DAiOitg + YUoR8rqhsJTBWG/kP6fOMKTegGjKh/7mTyIx0oUw58C0/XubLM8iKtPeQIx2gfcMJgbD0FBVlRE+D7QU + hS2ZshANuTDQqq75fQIHe6GVcxHV6VCr/2VzQIKmAshOQNbHc6+PhTqDOggBP5jzoDCJoLUaLo7fwr3V + hSCr8z8EeHcLbSU8FCfjLU0nuL/70cB4Py5tDLL7UBnC8xMMW6EkhRNdIsGt9QjhTXkGUnsN8rVf4Q72 + tpFzEnGlRiH1NIL8qDjJoY1DdjkVADNjSGnReI2ZIF196VW22+D8SAFw6YLJITjaV5e2qotSIXoBiiMD + HEVvQ/IAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAStJREFUOE9jYBg0 + oHDW8/9NC57/z5z4+D8uR4W3P8Apx5A789n/VUfe/8elKL77wf/ghmu4DciY8vT/wn0fsCqK73n4f+n+ + ///9qy/gNiCh58n/aVveYyiKaL8P1pw56/9/r9ITuA2I7Hr0v3f1BxRFoa33wJpb1wFt7/z73yX/AG4D + Apsf/q+b/w6uKLjl7v9Fe///7wBqzpjz879d3c//9hnbcRvgUXX/f/60NyiK7Ipv/0+f8/u/f9e3/zqF + 7/5bJKzHbYB96d3/2ZNfYyjSTzn/36ToxX+VrE//jSOX4TbAIu/O/9T+11gVGSSd+C+b9vW/bvA83AYY + Zt3+H9byEqci/dTL/zV8p+E2QCftxn+/6od4Fal4TMBtgFPulf8gBXgVDZqMh+wQAPB2wKsSwCgmAAAA + AElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAL1JREFUOE9jYBgy + ILz9wX+yHRvf/eB/cMM18gyI73n4f+n+///9qy+QbkBE+32w5sxZ//97lZ4gzYDQ1ntgza3rgLZ3/v3v + kn+AeAOCW+7+X7T3//8OoOaMOT//29X9/G+fsZ14A0ChbVd8+3/6nN///bu+/dcpfPffImE9aQaADNFP + Of/fpOjFf5WsT/+NI5eRbgDIEIOkE/9l077+1w2eR54BYJekXv6v4TuNfANAhqh4TKDMALKTMc01AgDQ + FGCYkuTLEQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAKtJREFUOE9jYBh0 + oHDW8/8UOSp35rP/Cd33yDckY8rT//P2//6f0HWHPEMSep78n73v1//OrX//u5VeJt2QyK5H/6ds+/W/ + ZOnf/wnT//63yT1LmiGBzQ//t659D9ZsXPLlv3T0tf/GkcuIN8Sj6v7/krnv4JoVXXqI1wyKPvvSu/8D + W56BbSZZM8gAi7w7/20KrpCnGWSAYdZt8jWDDNBJu0GanylKtoNCMwCgfl+gC2KedgAAAABJRU5ErkJg + gg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAATBJREFUOE9jYBhU + oHDW8/+4HASSa1rw/H/mxMc41TDkznz2P6H7HlYFILlVR97/D29/gNuAjClP/8/b//t/QtcdDEUguYX7 + PvwPbriG24CEnif/Z+/79b9z69//bqWXURSC5KZtef/fv/oCbgMiux79n7Lt1/+SpX//J0z/+98m9yxc + MUiud/WH/16lJ3AbENj88H/r2vdgzcYlX/5LR1/7bxy5DKwBJFc3/91/l/wDuA3wqLr/v2TuO7hmRZce + uGKQXP60N//tM7bjNsC+9O7/wJZnYJuRNYNcAJLLnvz6v0XCetwGWOTd+W9TcAVDM8gAkFxq/2u4l7Cm + F8Os21g1gxSD5MJaXv7XDZ6H2wU6aTdwSoLk/Kof/tfwnYbbAHz5yin3yn8VjwlgPKjyHwMAvtG/s0Vm + x8MAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAilJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mm/qB+fy8znPOef7qFT/4z17GgWVr30Zbd4lPHYvoLEhgvuOGdTWfIL9dgg3 + yqdQWjKBwoLXyMsdxYXzQSi9CeztAWqqV7HRW1ldgzGtF4fTnvBSBN7WRS6orPjyV57gyMIKdpufQ62W + YTnkEQL3o3kuKC35vK7gJ/w+vIg4kw8Fl6dxwNwkBM76WS64ZHv3h+BXeGQygm2SF9accaSmOIWg7m6Y + C7KzRmMEv8ODwTA2692Q5QBMJocQVFd95AL5TEARrAf3+D9gU2IDjhx9gaSkWiG4WTmN7i6wUwLHT76C + 5dgA3zYtjGamz6bOP+A+HLR0QpLsQnC1bBIdPrAMAE2ub+zuX1F+fY4vlRZGM2dmBBU4ObUdBkOFEFwp + HIenGXjoXGPBicKYnhNT5hM2pJ8r4p2TUxi83wO9vkwIbHljDAaq7kR5ZxJQSOK0EobezmJsag5y7jXs + NbZxWLvHBZ2uSAgolo57UD6bBASfzb+FN6F5hGaWcLHYjni9i8GNiN/1ANrEfCHIzBhmcy/zmbcaPNiy + Q0JLRz98XYPo7vNj4OUQ9pksUOvqkcDg7Zo6aDTWWMHpU/08npQwCgndmU5F26aF0czUlYrgnQnZQvAv + f/R3bGg6a0rM640AAAAASUVORK5CYII= + + + + False + + + False + + + False + + + False + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Product.cs b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Product.cs new file mode 100644 index 0000000..e815aac --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Product.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace AutomaticObjectBinding +{ + public class Product + { + private string modelNumber; + public string ModelNumber + { + get { return modelNumber; } + set { modelNumber = value; } + } + + private string modelName; + public string ModelName + { + get { return modelName; } + set { modelName = value; } + } + + private decimal unitCost; + public decimal UnitCost + { + get { return unitCost; } + set { unitCost = value; } + } + + private string description; + public string Description + { + get { return description; } + set { description = value; } + } + + public Product(string modelNumber, string modelName, + decimal unitCost, string description) + { + ModelNumber = modelNumber; + ModelName = modelName; + UnitCost = unitCost; + Description = description; + } + + public override string ToString() + { + return ModelName + " (" + ModelNumber + ")"; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/ProductList.cs b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/ProductList.cs new file mode 100644 index 0000000..f289ccd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/ProductList.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; + +namespace AutomaticObjectBinding +{ + public class ProductList : BindingList + { + public ProductList() + { + base.AllowNew = true; + } + + protected override object AddNewCore() + { + Product product = new Product(Guid.NewGuid().ToString(), "[ModelName]", 0, "[Description]"); + base.Items.Add(product); + return product; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Program.cs b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Program.cs new file mode 100644 index 0000000..aa90396 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace AutomaticObjectBinding +{ + static class Program + { + private static StoreDB storeDB = new StoreDB(); + public static StoreDB StoreDB + { + get { return storeDB; } + } + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7a7bf1b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AutomaticObjectBinding")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AutomaticObjectBinding")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("21b85bf8-52d8-4e10-9129-87b073ffdd3e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/DataSources/ProductList.datasource b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/DataSources/ProductList.datasource new file mode 100644 index 0000000..05e832a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/DataSources/ProductList.datasource @@ -0,0 +1,28 @@ + + + + AutomaticObjectBinding.ProductList, AutomaticObjectBinding, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Resources.Designer.cs new file mode 100644 index 0000000..b1359f5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AutomaticObjectBinding.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AutomaticObjectBinding.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AutomaticObjectBinding.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace AutomaticObjectBinding.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AutomaticObjectBinding.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Settings.Designer.cs new file mode 100644 index 0000000..e31e372 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Settings.Designer.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="AutomaticObjectBinding.Properties.Settings.get_Default():AutomaticObjectBinding.P" + + "roperties.Settings")] + +namespace AutomaticObjectBinding.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=localhost;Initial Catalog=Store;Integrated Security=True")] + public string Store { + get { + return ((string)(this["Store"])); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Settings.settings new file mode 100644 index 0000000..dcad37d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/Properties/Settings.settings @@ -0,0 +1,11 @@ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/StoreDB.cs b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/StoreDB.cs new file mode 100644 index 0000000..bf121a0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/StoreDB.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.ComponentModel; + +namespace AutomaticObjectBinding +{ + public class StoreDB + { + public ProductList GetProducts() + { + string connectionString = Properties.Settings.Default.Store; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetProducts", con); + cmd.CommandType = CommandType.StoredProcedure; + + ProductList products = new ProductList(); + try + { + con.Open(); + SqlDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) + { + // Create a Product object that wraps the + // current record. + Product product = new Product((string)reader["ModelNumber"], + (string)reader["ModelName"], (decimal)reader["UnitCost"], + (string)reader["Description"]); + + // Add to collection + products.Add(product); + } + } + finally + { + con.Close(); + } + + return products; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/app.config b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/app.config new file mode 100644 index 0000000..3cf420c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/app.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Debug/AutomaticObjectBinding.exe b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Debug/AutomaticObjectBinding.exe new file mode 100644 index 0000000..bf30622 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Debug/AutomaticObjectBinding.exe differ diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Debug/AutomaticObjectBinding.exe.config b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Debug/AutomaticObjectBinding.exe.config new file mode 100644 index 0000000..a9f7b1a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Debug/AutomaticObjectBinding.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Debug/AutomaticObjectBinding.vshost.exe.config b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Debug/AutomaticObjectBinding.vshost.exe.config new file mode 100644 index 0000000..a9f7b1a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Debug/AutomaticObjectBinding.vshost.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Release/AutomaticObjectBinding.exe b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Release/AutomaticObjectBinding.exe new file mode 100644 index 0000000..947e8b7 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Release/AutomaticObjectBinding.exe differ diff --git a/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Release/AutomaticObjectBinding.exe.config b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Release/AutomaticObjectBinding.exe.config new file mode 100644 index 0000000..3cf420c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/AutomaticObjectBinding/bin/Release/AutomaticObjectBinding.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.csproj b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.csproj new file mode 100644 index 0000000..1b33b85 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.csproj @@ -0,0 +1,110 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {1A9D9B20-30F0-4E83-8399-4DE1D5A3E891} + WinExe + Properties + BindingToCollections + BindingToCollections + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + EditableBinding.cs + + + Form + + + GridBinding.cs + + + Form + + + Menu.cs + + + Form + + + MultipleControlBinding.cs + + + + + + + EditableBinding.cs + + + GridBinding.cs + + + Menu.cs + + + MultipleControlBinding.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + SimpleListBinding.cs + + + True + Resources.resx + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Form + + + SimpleListBinding.cs + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.csproj.user b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.sln b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.sln new file mode 100644 index 0000000..bfb1700 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BindingToCollections", "BindingToCollections.csproj", "{1A9D9B20-30F0-4E83-8399-4DE1D5A3E891}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1A9D9B20-30F0-4E83-8399-4DE1D5A3E891}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A9D9B20-30F0-4E83-8399-4DE1D5A3E891}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A9D9B20-30F0-4E83-8399-4DE1D5A3E891}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A9D9B20-30F0-4E83-8399-4DE1D5A3E891}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.suo b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.suo new file mode 100644 index 0000000..8a3964f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/BindingToCollections.suo differ diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/EditableBinding.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/EditableBinding.cs new file mode 100644 index 0000000..13a5d76 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/EditableBinding.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToCollections +{ + public partial class EditableBinding : Form + { + public EditableBinding() + { + InitializeComponent(); + } + + private void EditableBinding_Load(object sender, EventArgs e) + { + BindingList products = Program.StoreDB.GetProducts(); + + cboModelName.DataSource = products; + cboModelName.DisplayMember = "ModelName"; + + // Create the binding. + Binding costBinding = new Binding("Text", products, "UnitCost"); + + // Connect the methods for formatting and parsing data. + costBinding.Format += new ConvertEventHandler(DecimalToCurrencyString); + costBinding.Parse += new ConvertEventHandler(CurrencyStringToDecimal); + + // Add the binding. + txtUnitCost.DataBindings.Add(costBinding); + txtModelName.DataBindings.Add("Text", products, "ModelName"); + txtModelNumber.DataBindings.Add("Text", products, "ModelNumber"); + + txtDescription.DataBindings.Add("Text", products, "Description"); + } + + private object previousValue; + private void DecimalToCurrencyString(object sender, ConvertEventArgs e) + { + if (e.DesiredType == typeof(string)) + { + // Use the ToString method to format the value as currency ("c"). + e.Value = ((decimal)e.Value).ToString("c"); + } + } + + private void CurrencyStringToDecimal(object sender, ConvertEventArgs e) + { + if (e.DesiredType == typeof(decimal)) + { + // Convert the string back to decimal using the static Parse method. + try + { + previousValue = e.Value; + e.Value = Decimal.Parse(e.Value.ToString(), + System.Globalization.NumberStyles.Currency, null); + } + catch + { + e.Value = previousValue; + } + } + } + + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/EditableBinding.designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/EditableBinding.designer.cs new file mode 100644 index 0000000..e7587f3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/EditableBinding.designer.cs @@ -0,0 +1,176 @@ +namespace BindingToCollections +{ + partial class EditableBinding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Label4 = new System.Windows.Forms.Label(); + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label3 = new System.Windows.Forms.Label(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtModelName = new System.Windows.Forms.TextBox(); + this.txtDescription = new System.Windows.Forms.TextBox(); + this.txtUnitCost = new System.Windows.Forms.TextBox(); + this.txtModelNumber = new System.Windows.Forms.TextBox(); + this.cboModelName = new System.Windows.Forms.ComboBox(); + this.lblStatus = new System.Windows.Forms.Label(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // Label4 + // + this.Label4.Location = new System.Drawing.Point(14, 21); + this.Label4.Name = "Label4"; + this.Label4.Size = new System.Drawing.Size(88, 16); + this.Label4.TabIndex = 23; + this.Label4.Text = "Select a Record:"; + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.Label3); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.txtModelName); + this.GroupBox1.Controls.Add(this.txtDescription); + this.GroupBox1.Controls.Add(this.txtUnitCost); + this.GroupBox1.Controls.Add(this.txtModelNumber); + this.GroupBox1.Location = new System.Drawing.Point(14, 57); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(400, 234); + this.GroupBox1.TabIndex = 22; + this.GroupBox1.TabStop = false; + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(220, 56); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(36, 16); + this.Label3.TabIndex = 18; + this.Label3.Text = "Cost:"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 56); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(52, 16); + this.Label2.TabIndex = 17; + this.Label2.Text = "Model:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 28); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(52, 16); + this.Label1.TabIndex = 16; + this.Label1.Text = "Name:"; + // + // txtModelName + // + this.txtModelName.Location = new System.Drawing.Point(68, 24); + this.txtModelName.Name = "txtModelName"; + this.txtModelName.Size = new System.Drawing.Size(316, 21); + this.txtModelName.TabIndex = 15; + // + // txtDescription + // + this.txtDescription.Location = new System.Drawing.Point(12, 92); + this.txtDescription.Multiline = true; + this.txtDescription.Name = "txtDescription"; + this.txtDescription.Size = new System.Drawing.Size(372, 116); + this.txtDescription.TabIndex = 14; + // + // txtUnitCost + // + this.txtUnitCost.Location = new System.Drawing.Point(256, 52); + this.txtUnitCost.Name = "txtUnitCost"; + this.txtUnitCost.Size = new System.Drawing.Size(128, 21); + this.txtUnitCost.TabIndex = 13; + // + // txtModelNumber + // + this.txtModelNumber.Location = new System.Drawing.Point(68, 52); + this.txtModelNumber.Name = "txtModelNumber"; + this.txtModelNumber.Size = new System.Drawing.Size(136, 21); + this.txtModelNumber.TabIndex = 12; + // + // cboModelName + // + this.cboModelName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboModelName.FormattingEnabled = true; + this.cboModelName.Location = new System.Drawing.Point(106, 17); + this.cboModelName.Name = "cboModelName"; + this.cboModelName.Size = new System.Drawing.Size(308, 21); + this.cboModelName.TabIndex = 21; + // + // lblStatus + // + this.lblStatus.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lblStatus.Dock = System.Windows.Forms.DockStyle.Bottom; + this.lblStatus.Location = new System.Drawing.Point(0, 306); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Padding = new System.Windows.Forms.Padding(3); + this.lblStatus.Size = new System.Drawing.Size(428, 21); + this.lblStatus.TabIndex = 24; + // + // EditableBinding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(428, 327); + this.Controls.Add(this.lblStatus); + this.Controls.Add(this.Label4); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.cboModelName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "EditableBinding"; + this.Text = "Editable Binding"; + this.Load += new System.EventHandler(this.EditableBinding_Load); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label Label4; + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Label Label3; + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.TextBox txtModelName; + private System.Windows.Forms.TextBox txtDescription; + private System.Windows.Forms.TextBox txtUnitCost; + private System.Windows.Forms.TextBox txtModelNumber; + private System.Windows.Forms.ComboBox cboModelName; + private System.Windows.Forms.Label lblStatus; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/EditableBinding.resx b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/EditableBinding.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/EditableBinding.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/GridBinding.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/GridBinding.Designer.cs new file mode 100644 index 0000000..1fd9191 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/GridBinding.Designer.cs @@ -0,0 +1,65 @@ +namespace BindingToCollections +{ + partial class GridBinding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(12, 12); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(377, 302); + this.dataGridView1.TabIndex = 0; + this.dataGridView1.Text = "dataGridView1"; + // + // GridBinding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(401, 326); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "GridBinding"; + this.Text = "Grid Binding"; + this.Load += new System.EventHandler(this.GridBinding_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/GridBinding.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/GridBinding.cs new file mode 100644 index 0000000..e5f9c89 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/GridBinding.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToCollections +{ + public partial class GridBinding : Form + { + public GridBinding() + { + InitializeComponent(); + } + + private void GridBinding_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/GridBinding.resx b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/GridBinding.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/GridBinding.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Menu.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Menu.cs new file mode 100644 index 0000000..99b1a84 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace BindingToCollections +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("BindingToCollections." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Menu.designer.cs new file mode 100644 index 0000000..837fe33 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Menu.designer.cs @@ -0,0 +1,98 @@ +namespace BindingToCollections +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(124, 23); + this.button1.TabIndex = 0; + this.button1.Text = "SimpleListBinding"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 41); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(124, 23); + this.button3.TabIndex = 2; + this.button3.Text = "MultipleControlBinding"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 70); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(124, 23); + this.button4.TabIndex = 3; + this.button4.Text = "EditableBinding"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 99); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(124, 23); + this.button2.TabIndex = 4; + this.button2.Text = "GridBinding"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 192); + this.Controls.Add(this.button2); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button2; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Menu.resx b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Menu.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Menu.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/MultipleControlBinding.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/MultipleControlBinding.Designer.cs new file mode 100644 index 0000000..01a25c4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/MultipleControlBinding.Designer.cs @@ -0,0 +1,140 @@ +namespace BindingToCollections +{ + partial class MultipleControlBinding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.lblDescription = new System.Windows.Forms.Label(); + this.lblUnitCost = new System.Windows.Forms.Label(); + this.lblModelNumber = new System.Windows.Forms.Label(); + this.cmdNext = new System.Windows.Forms.Button(); + this.cmdPrev = new System.Windows.Forms.Button(); + this.cboModelName = new System.Windows.Forms.ComboBox(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.lblDescription); + this.GroupBox1.Controls.Add(this.lblUnitCost); + this.GroupBox1.Controls.Add(this.lblModelNumber); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(18, 55); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(312, 174); + this.GroupBox1.TabIndex = 14; + this.GroupBox1.TabStop = false; + // + // lblDescription + // + this.lblDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblDescription.Location = new System.Drawing.Point(8, 58); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Size = new System.Drawing.Size(296, 104); + this.lblDescription.TabIndex = 6; + // + // lblUnitCost + // + this.lblUnitCost.Location = new System.Drawing.Point(168, 16); + this.lblUnitCost.Name = "lblUnitCost"; + this.lblUnitCost.Size = new System.Drawing.Size(136, 32); + this.lblUnitCost.TabIndex = 5; + // + // lblModelNumber + // + this.lblModelNumber.Location = new System.Drawing.Point(8, 16); + this.lblModelNumber.Name = "lblModelNumber"; + this.lblModelNumber.Size = new System.Drawing.Size(140, 32); + this.lblModelNumber.TabIndex = 4; + // + // cmdNext + // + this.cmdNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdNext.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNext.Location = new System.Drawing.Point(238, 241); + this.cmdNext.Name = "cmdNext"; + this.cmdNext.Size = new System.Drawing.Size(92, 28); + this.cmdNext.TabIndex = 13; + this.cmdNext.Text = "Next >>"; + this.cmdNext.Click += new System.EventHandler(this.cmdNext_Click); + // + // cmdPrev + // + this.cmdPrev.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.cmdPrev.Enabled = false; + this.cmdPrev.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPrev.Location = new System.Drawing.Point(18, 241); + this.cmdPrev.Name = "cmdPrev"; + this.cmdPrev.Size = new System.Drawing.Size(92, 28); + this.cmdPrev.TabIndex = 12; + this.cmdPrev.Text = "<< Prev"; + this.cmdPrev.Click += new System.EventHandler(this.cmdPrev_Click); + // + // cboModelName + // + this.cboModelName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboModelName.FormattingEnabled = true; + this.cboModelName.Location = new System.Drawing.Point(14, 19); + this.cboModelName.Name = "cboModelName"; + this.cboModelName.Size = new System.Drawing.Size(316, 21); + this.cboModelName.TabIndex = 11; + // + // MultipleControlBinding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(352, 282); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.cmdNext); + this.Controls.Add(this.cmdPrev); + this.Controls.Add(this.cboModelName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "MultipleControlBinding"; + this.Text = "Multiple Control Binding"; + this.Load += new System.EventHandler(this.MultipleControlBinding_Load); + this.GroupBox1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Label lblDescription; + private System.Windows.Forms.Label lblUnitCost; + private System.Windows.Forms.Label lblModelNumber; + private System.Windows.Forms.Button cmdNext; + private System.Windows.Forms.Button cmdPrev; + private System.Windows.Forms.ComboBox cboModelName; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/MultipleControlBinding.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/MultipleControlBinding.cs new file mode 100644 index 0000000..3a79e2c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/MultipleControlBinding.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToCollections +{ + public partial class MultipleControlBinding : Form + { + private BindingManagerBase storeBinding; + + public MultipleControlBinding() + { + InitializeComponent(); + } + + private void MultipleControlBinding_Load(object sender, EventArgs e) + { + BindingList products = Program.StoreDB.GetProducts(); + + cboModelName.DataSource = products; + cboModelName.DisplayMember = "ModelName"; + + lblModelNumber.DataBindings.Add("Text", products, "ModelNumber"); + lblUnitCost.DataBindings.Add("Text", products, "UnitCost", true, DataSourceUpdateMode.OnValidation, 0, "C"); + lblDescription.DataBindings.Add("Text", products, "Description"); + + // Keep track of the binding context. + storeBinding = this.BindingContext[products]; + + storeBinding.PositionChanged += new EventHandler(Binding_PositionChanged); + } + + private void cmdPrev_Click(object sender, System.EventArgs e) + { + storeBinding.Position--; + } + + private void cmdNext_Click(object sender, System.EventArgs e) + { + storeBinding.Position++; + } + + private void Binding_PositionChanged(object sender, System.EventArgs e) + { + if (storeBinding.Position == storeBinding.Count - 1) + { + cmdNext.Enabled = false; + } + else + { + cmdNext.Enabled = true; + } + + if (storeBinding.Position == 0) + { + cmdPrev.Enabled = false; + } + else + { + cmdPrev.Enabled = true; + } + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/MultipleControlBinding.resx b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/MultipleControlBinding.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/MultipleControlBinding.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Product.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Product.cs new file mode 100644 index 0000000..c8892f0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Product.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BindingToCollections +{ + public class Product + { + private string modelNumber; + public string ModelNumber + { + get { return modelNumber; } + set { modelNumber = value; } + } + + private string modelName; + public string ModelName + { + get { return modelName; } + set { modelName = value; } + } + + private decimal unitCost; + public decimal UnitCost + { + get { return unitCost; } + set { unitCost = value; } + } + + private string description; + public string Description + { + get { return description; } + set { description = value; } + } + + public Product(string modelNumber, string modelName, + decimal unitCost, string description) + { + ModelNumber = modelNumber; + ModelName = modelName; + UnitCost = unitCost; + Description = description; + } + + public override string ToString() + { + return ModelName + " (" + ModelNumber + ")"; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/ProductList.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/ProductList.cs new file mode 100644 index 0000000..38c8693 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/ProductList.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; + +namespace BindingToCollections +{ + public class ProductList : BindingList + { + public ProductList() + { + base.AllowNew = true; + } + + protected override object AddNewCore() + { + Product product = new Product(Guid.NewGuid().ToString(), "[ModelName]", 0, "[Description]"); + base.Items.Add(product); + return product; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Program.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Program.cs new file mode 100644 index 0000000..a07d117 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace BindingToCollections +{ + static class Program + { + private static StoreDB storeDB = new StoreDB(); + public static StoreDB StoreDB + { + get { return storeDB; } + } + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0e2991d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BindingToCollections")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BindingToCollections")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("1d208e77-ea54-4e2f-8d38-1ed0bba66ea3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Resources.Designer.cs new file mode 100644 index 0000000..37c436e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "BindingToCollections.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "BindingToCollections.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "BindingToCollections.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace BindingToCollections.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BindingToCollections.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Settings.Designer.cs new file mode 100644 index 0000000..4fe887a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Settings.Designer.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="BindingToCollections.Properties.Settings.get_Default():BindingToCollections.Prope" + + "rties.Settings")] + +namespace BindingToCollections.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=localhost;Initial Catalog=Store;Integrated Security=True")] + public string Store { + get { + return ((string)(this["Store"])); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Settings.settings new file mode 100644 index 0000000..8c7050c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/Properties/Settings.settings @@ -0,0 +1,11 @@ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/SimpleListBinding.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/SimpleListBinding.cs new file mode 100644 index 0000000..3792a27 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/SimpleListBinding.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToCollections +{ + public partial class SimpleListBinding : Form + { + public SimpleListBinding() + { + InitializeComponent(); + } + + private void SimpleListBinding_Load(object sender, EventArgs e) + { + lstModelName.DataSource = Program.StoreDB.GetProducts(); + //lstModelName.DisplayMember = "ModelName"; + } + + + private void lstModelName_DoubleClick(object sender, EventArgs e) + { + Product product = (Product)lstModelName.SelectedItem; + MessageBox.Show(String.Format("Costs {0:C}", product.UnitCost)); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/SimpleListBinding.designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/SimpleListBinding.designer.cs new file mode 100644 index 0000000..3fc1b67 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/SimpleListBinding.designer.cs @@ -0,0 +1,65 @@ +namespace BindingToCollections +{ + partial class SimpleListBinding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lstModelName = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // lstModelName + // + this.lstModelName.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstModelName.FormattingEnabled = true; + this.lstModelName.Location = new System.Drawing.Point(10, 12); + this.lstModelName.Name = "lstModelName"; + this.lstModelName.Size = new System.Drawing.Size(268, 238); + this.lstModelName.TabIndex = 0; + this.lstModelName.DoubleClick += new System.EventHandler(this.lstModelName_DoubleClick); + // + // SimpleListBinding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.lstModelName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "SimpleListBinding"; + this.Text = "Simple List Binding"; + this.Load += new System.EventHandler(this.SimpleListBinding_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ListBox lstModelName; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/SimpleListBinding.resx b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/SimpleListBinding.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/SimpleListBinding.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/StoreDB.cs b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/StoreDB.cs new file mode 100644 index 0000000..c998250 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/StoreDB.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; +using System.ComponentModel; + +namespace BindingToCollections +{ + public class StoreDB + { + public ProductList GetProducts() + { + string connectionString = Properties.Settings.Default.Store; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetProducts", con); + cmd.CommandType = CommandType.StoredProcedure; + + ProductList products = new ProductList(); + try + { + con.Open(); + SqlDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) + { + // Create a Product object that wraps the + // current record. + Product product = new Product((string)reader["ModelNumber"], + (string)reader["ModelName"], (decimal)reader["UnitCost"], + (string)reader["Description"]); + + // Add to collection + products.Add(product); + } + } + finally + { + con.Close(); + } + + return products; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/app.config b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/app.config new file mode 100644 index 0000000..a575f41 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/app.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/bin/Debug/BindingToCollections.exe b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/bin/Debug/BindingToCollections.exe new file mode 100644 index 0000000..07460fb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/bin/Debug/BindingToCollections.exe differ diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/bin/Debug/BindingToCollections.exe.config b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/bin/Debug/BindingToCollections.exe.config new file mode 100644 index 0000000..cce6074 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/bin/Debug/BindingToCollections.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToCollections/bin/Debug/BindingToCollections.vshost.exe.config b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/bin/Debug/BindingToCollections.vshost.exe.config new file mode 100644 index 0000000..cce6074 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToCollections/bin/Debug/BindingToCollections.vshost.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindToImage.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindToImage.Designer.cs new file mode 100644 index 0000000..c56344a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindToImage.Designer.cs @@ -0,0 +1,113 @@ +namespace BindingToDataSet +{ + partial class BindToImage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.picProduct = new System.Windows.Forms.PictureBox(); + this.Label1 = new System.Windows.Forms.Label(); + this.cboModelName = new System.Windows.Forms.ComboBox(); + this.lblStatus = new System.Windows.Forms.Label(); + this.GroupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.picProduct)).BeginInit(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Controls.Add(this.picProduct); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(12, 44); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(191, 148); + this.GroupBox1.TabIndex = 26; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Display Value for ProductImage"; + // + // picProduct + // + this.picProduct.Location = new System.Drawing.Point(16, 24); + this.picProduct.Name = "picProduct"; + this.picProduct.Size = new System.Drawing.Size(128, 88); + this.picProduct.TabIndex = 18; + this.picProduct.TabStop = false; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(20, 12); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(64, 16); + this.Label1.TabIndex = 25; + this.Label1.Text = "Product:"; + // + // cboModelName + // + this.cboModelName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboModelName.FormattingEnabled = true; + this.cboModelName.Location = new System.Drawing.Point(84, 8); + this.cboModelName.Name = "cboModelName"; + this.cboModelName.Size = new System.Drawing.Size(248, 21); + this.cboModelName.TabIndex = 23; + // + // lblStatus + // + this.lblStatus.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lblStatus.Dock = System.Windows.Forms.DockStyle.Bottom; + this.lblStatus.Location = new System.Drawing.Point(0, 215); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Padding = new System.Windows.Forms.Padding(3); + this.lblStatus.Size = new System.Drawing.Size(355, 21); + this.lblStatus.TabIndex = 27; + // + // BindToImage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(355, 236); + this.Controls.Add(this.lblStatus); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.Label1); + this.Controls.Add(this.cboModelName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "BindToImage"; + this.Text = "Bind To Image"; + this.Load += new System.EventHandler(this.BindToImage_Load); + this.GroupBox1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.picProduct)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.PictureBox picProduct; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.ComboBox cboModelName; + private System.Windows.Forms.Label lblStatus; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindToImage.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindToImage.cs new file mode 100644 index 0000000..8283baf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindToImage.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + public partial class BindToImage : Form + { + public BindToImage() + { + InitializeComponent(); + } + + private void FileToImage(object sender, ConvertEventArgs e) + { + if (e.DesiredType == typeof(Image)) + { + // Store the filename. + picProduct.Tag = e.Value; + + // Look up the corresponding file, and create an Image object. + try + { + lblStatus.Text = "Retrieved picture " + e.Value; + e.Value = Image.FromFile(Application.StartupPath + "\\" + e.Value); + } + catch (Exception err) + { + lblStatus.Text = "Could not find picture " + e.Value; + + // You could return an error picture here. + // This code uses a blank 1x1 pixel image. + e.Value = new Bitmap(1,1); + } + } + } + + private void ImageToFile(object sender, ConvertEventArgs e) + { + if (e.DesiredType == typeof(string)) + { + // Substitute the filename. + e.Value = picProduct.Tag; + } + } + + private void BindToImage_Load(object sender, EventArgs e) + { + DataTable dt = Program.StoreDB.GetProducts(); + + cboModelName.DataSource = dt; + cboModelName.DisplayMember = "ModelName"; + + Binding pictureBinding = new Binding("Image", dt, "ProductImage"); + pictureBinding.Format += new ConvertEventHandler(FileToImage); + pictureBinding.Parse += new ConvertEventHandler(ImageToFile); + + picProduct.DataBindings.Add(pictureBinding); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindToImage.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindToImage.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindToImage.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.csproj b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.csproj new file mode 100644 index 0000000..28374f0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.csproj @@ -0,0 +1,162 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {3FFCBBA6-CA5D-4C9B-93C2-DBFF2369B51B} + WinExe + Properties + BindingToDataSet + BindingToDataSet + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + BindToImage.cs + + + Form + + + GridBinding.cs + + + Form + + + Validation.cs + + + Form + + + EditableBinding.cs + + + Form + + + FilteredListBinding.cs + + + Form + + + LookupTable.cs + + + Form + + + MasterDetail.cs + + + Form + + + Menu.cs + + + Form + + + MultipleControlBinding.cs + + + Form + + + SimpleListBinding.cs + + + + + BindToImage.cs + + + GridBinding.cs + + + Validation.cs + + + EditableBinding.cs + + + FilteredListBinding.cs + + + LookupTable.cs + + + MasterDetail.cs + + + Menu.cs + + + MultipleControlBinding.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + SimpleListBinding.cs + + + Unsynchronized.cs + + + True + Resources.resx + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + Form + + + Unsynchronized.cs + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.csproj.user b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.sln b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.sln new file mode 100644 index 0000000..03901b9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BindingToDataSet", "BindingToDataSet.csproj", "{3FFCBBA6-CA5D-4C9B-93C2-DBFF2369B51B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3FFCBBA6-CA5D-4C9B-93C2-DBFF2369B51B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3FFCBBA6-CA5D-4C9B-93C2-DBFF2369B51B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3FFCBBA6-CA5D-4C9B-93C2-DBFF2369B51B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3FFCBBA6-CA5D-4C9B-93C2-DBFF2369B51B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.suo b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.suo new file mode 100644 index 0000000..212ac4f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/BindingToDataSet.suo differ diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/EditableBinding.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/EditableBinding.Designer.cs new file mode 100644 index 0000000..d07fccc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/EditableBinding.Designer.cs @@ -0,0 +1,176 @@ +namespace BindingToDataSet +{ + partial class EditableBinding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Label4 = new System.Windows.Forms.Label(); + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label3 = new System.Windows.Forms.Label(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtModelName = new System.Windows.Forms.TextBox(); + this.txtDescription = new System.Windows.Forms.TextBox(); + this.txtUnitCost = new System.Windows.Forms.TextBox(); + this.txtModelNumber = new System.Windows.Forms.TextBox(); + this.cboModelName = new System.Windows.Forms.ComboBox(); + this.lblStatus = new System.Windows.Forms.Label(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // Label4 + // + this.Label4.Location = new System.Drawing.Point(14, 21); + this.Label4.Name = "Label4"; + this.Label4.Size = new System.Drawing.Size(88, 16); + this.Label4.TabIndex = 23; + this.Label4.Text = "Select a Record:"; + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.Label3); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.txtModelName); + this.GroupBox1.Controls.Add(this.txtDescription); + this.GroupBox1.Controls.Add(this.txtUnitCost); + this.GroupBox1.Controls.Add(this.txtModelNumber); + this.GroupBox1.Location = new System.Drawing.Point(14, 57); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(400, 234); + this.GroupBox1.TabIndex = 22; + this.GroupBox1.TabStop = false; + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(220, 56); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(36, 16); + this.Label3.TabIndex = 18; + this.Label3.Text = "Cost:"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 56); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(52, 16); + this.Label2.TabIndex = 17; + this.Label2.Text = "Model:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 28); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(52, 16); + this.Label1.TabIndex = 16; + this.Label1.Text = "Name:"; + // + // txtModelName + // + this.txtModelName.Location = new System.Drawing.Point(68, 24); + this.txtModelName.Name = "txtModelName"; + this.txtModelName.Size = new System.Drawing.Size(316, 21); + this.txtModelName.TabIndex = 15; + // + // txtDescription + // + this.txtDescription.Location = new System.Drawing.Point(12, 92); + this.txtDescription.Multiline = true; + this.txtDescription.Name = "txtDescription"; + this.txtDescription.Size = new System.Drawing.Size(372, 116); + this.txtDescription.TabIndex = 14; + // + // txtUnitCost + // + this.txtUnitCost.Location = new System.Drawing.Point(256, 52); + this.txtUnitCost.Name = "txtUnitCost"; + this.txtUnitCost.Size = new System.Drawing.Size(128, 21); + this.txtUnitCost.TabIndex = 13; + // + // txtModelNumber + // + this.txtModelNumber.Location = new System.Drawing.Point(68, 52); + this.txtModelNumber.Name = "txtModelNumber"; + this.txtModelNumber.Size = new System.Drawing.Size(136, 21); + this.txtModelNumber.TabIndex = 12; + // + // cboModelName + // + this.cboModelName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboModelName.FormattingEnabled = true; + this.cboModelName.Location = new System.Drawing.Point(106, 17); + this.cboModelName.Name = "cboModelName"; + this.cboModelName.Size = new System.Drawing.Size(308, 21); + this.cboModelName.TabIndex = 21; + // + // lblStatus + // + this.lblStatus.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lblStatus.Dock = System.Windows.Forms.DockStyle.Bottom; + this.lblStatus.Location = new System.Drawing.Point(0, 306); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Padding = new System.Windows.Forms.Padding(3); + this.lblStatus.Size = new System.Drawing.Size(428, 21); + this.lblStatus.TabIndex = 24; + // + // EditableBinding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(428, 327); + this.Controls.Add(this.lblStatus); + this.Controls.Add(this.Label4); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.cboModelName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "EditableBinding"; + this.Text = "Editable Binding"; + this.Load += new System.EventHandler(this.EditableBinding_Load); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label Label4; + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Label Label3; + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.TextBox txtModelName; + private System.Windows.Forms.TextBox txtDescription; + private System.Windows.Forms.TextBox txtUnitCost; + private System.Windows.Forms.TextBox txtModelNumber; + private System.Windows.Forms.ComboBox cboModelName; + private System.Windows.Forms.Label lblStatus; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/EditableBinding.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/EditableBinding.cs new file mode 100644 index 0000000..529873d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/EditableBinding.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + public partial class EditableBinding : Form + { + public EditableBinding() + { + InitializeComponent(); + } + + private void EditableBinding_Load(object sender, EventArgs e) + { + DataTable dt = Program.StoreDB.GetProducts(); + + cboModelName.DataSource = dt; + cboModelName.DisplayMember = "ModelName"; + + // Create the binding. + Binding costBinding = new Binding("Text", dt, "UnitCost"); + + // Connect the methods for formatting and parsing data. + costBinding.Format += new ConvertEventHandler(DecimalToCurrencyString); + costBinding.Parse += new ConvertEventHandler(CurrencyStringToDecimal); + + // Add the binding. + txtUnitCost.DataBindings.Add(costBinding); + txtModelName.DataBindings.Add("Text", dt, "ModelName"); + txtModelNumber.DataBindings.Add("Text", dt, "ModelNumber"); + + txtDescription.DataBindings.Add("Text", dt, "Description"); + + // Register an event handler for changes to the DataTable (optional). + dt.ColumnChanged += new DataColumnChangeEventHandler(TableChanged); + } + + object previousUnitCost; + private void DecimalToCurrencyString(object sender, ConvertEventArgs e) + { + if (e.DesiredType == typeof(string)) + { + previousUnitCost = e.Value; + // Use the ToString method to format the value as currency ("c"). + e.Value = ((decimal)e.Value).ToString("c"); + } + } + + private void CurrencyStringToDecimal(object sender, ConvertEventArgs e) + { + if (e.DesiredType == typeof(decimal)) + { + // Convert the string back to decimal using the static Parse method. + try + { + e.Value = Decimal.Parse(e.Value.ToString()); + } + catch + { + e.Value = previousUnitCost; + } + } + } + + private void TableChanged(object sender, System.Data.DataColumnChangeEventArgs e) + { + lblStatus.Text = "Detected change. Column " + e.Column.ColumnName; + lblStatus.Text += " updated to " + e.ProposedValue.ToString() + "."; + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/EditableBinding.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/EditableBinding.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/EditableBinding.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/FilteredListBinding.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/FilteredListBinding.Designer.cs new file mode 100644 index 0000000..7337ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/FilteredListBinding.Designer.cs @@ -0,0 +1,64 @@ +namespace BindingToDataSet +{ + partial class FilteredListBinding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lstModelName = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // lstModelName + // + this.lstModelName.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstModelName.FormattingEnabled = true; + this.lstModelName.Location = new System.Drawing.Point(12, 12); + this.lstModelName.Name = "lstModelName"; + this.lstModelName.Size = new System.Drawing.Size(268, 238); + this.lstModelName.TabIndex = 0; + // + // SimpleListBinding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.lstModelName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "SimpleListBinding"; + this.Text = "Filtered List Binding"; + this.Load += new System.EventHandler(this.SimpleListBinding_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ListBox lstModelName; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/FilteredListBinding.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/FilteredListBinding.cs new file mode 100644 index 0000000..621e849 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/FilteredListBinding.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + public partial class FilteredListBinding : Form + { + public FilteredListBinding() + { + InitializeComponent(); + } + + private void SimpleListBinding_Load(object sender, EventArgs e) + { + DataTable dt = Program.StoreDB.GetProducts(); + dt.DefaultView.RowFilter = "UnitCost < 5"; + + lstModelName.DataSource = dt; + lstModelName.DisplayMember = "ModelName"; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/FilteredListBinding.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/FilteredListBinding.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/FilteredListBinding.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/GridBinding.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/GridBinding.cs new file mode 100644 index 0000000..7a6f334 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/GridBinding.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + public partial class GridBinding : Form + { + public GridBinding() + { + InitializeComponent(); + } + + private void GridBinding_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/GridBinding.designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/GridBinding.designer.cs new file mode 100644 index 0000000..0081cdb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/GridBinding.designer.cs @@ -0,0 +1,65 @@ +namespace BindingToDataSet +{ + partial class GridBinding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(12, 12); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(377, 302); + this.dataGridView1.TabIndex = 0; + this.dataGridView1.Text = "dataGridView1"; + // + // GridBinding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(401, 326); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "GridBinding"; + this.Text = "Grid Binding"; + this.Load += new System.EventHandler(this.GridBinding_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/GridBinding.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/GridBinding.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/GridBinding.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/LookupTable.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/LookupTable.Designer.cs new file mode 100644 index 0000000..7618c26 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/LookupTable.Designer.cs @@ -0,0 +1,95 @@ +namespace BindingToDataSet +{ + partial class LookupTable + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Label4 = new System.Windows.Forms.Label(); + this.cboModelName = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.cboCategory = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // Label4 + // + this.Label4.Location = new System.Drawing.Point(12, 27); + this.Label4.Name = "Label4"; + this.Label4.Size = new System.Drawing.Size(88, 16); + this.Label4.TabIndex = 25; + this.Label4.Text = "Select a Record:"; + // + // cboModelName + // + this.cboModelName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboModelName.FormattingEnabled = true; + this.cboModelName.Location = new System.Drawing.Point(122, 23); + this.cboModelName.Name = "cboModelName"; + this.cboModelName.Size = new System.Drawing.Size(267, 21); + this.cboModelName.TabIndex = 24; + // + // label1 + // + this.label1.Location = new System.Drawing.Point(12, 57); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(110, 16); + this.label1.TabIndex = 27; + this.label1.Text = "Change its Category:"; + // + // cboCategory + // + this.cboCategory.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboCategory.FormattingEnabled = true; + this.cboCategory.Location = new System.Drawing.Point(122, 53); + this.cboCategory.Name = "cboCategory"; + this.cboCategory.Size = new System.Drawing.Size(267, 21); + this.cboCategory.TabIndex = 26; + // + // LookupTable + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(423, 218); + this.Controls.Add(this.label1); + this.Controls.Add(this.cboCategory); + this.Controls.Add(this.Label4); + this.Controls.Add(this.cboModelName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "LookupTable"; + this.Text = "Lookup Table"; + this.Load += new System.EventHandler(this.LookupTable_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label Label4; + private System.Windows.Forms.ComboBox cboModelName; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cboCategory; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/LookupTable.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/LookupTable.cs new file mode 100644 index 0000000..0f25629 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/LookupTable.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + public partial class LookupTable : Form + { + public LookupTable() + { + InitializeComponent(); + } + + private void LookupTable_Load(object sender, EventArgs e) + { + DataSet ds = Program.StoreDB.GetCategoriesAndProducts(); + + // Connect the product list used for navigation. + cboModelName.DataSource = ds.Tables["Products"]; + cboModelName.DisplayMember = "ModelName"; + + // Connect the category list used for editing. + cboCategory.DataSource = ds.Tables["Categories"]; + cboCategory.DisplayMember = "CategoryName"; + cboCategory.ValueMember = "CategoryID"; + cboCategory.DataBindings.Add("SelectedValue", ds.Tables["Products"], + "CategoryID"); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/LookupTable.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/LookupTable.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/LookupTable.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MasterDetail.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MasterDetail.Designer.cs new file mode 100644 index 0000000..0f8e91c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MasterDetail.Designer.cs @@ -0,0 +1,93 @@ +namespace BindingToDataSet +{ + partial class MasterDetail + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.lstProduct = new System.Windows.Forms.ListBox(); + this.lstCategory = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(212, 9); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(120, 16); + this.Label2.TabIndex = 13; + this.Label2.Text = "Products:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(12, 9); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(120, 16); + this.Label1.TabIndex = 12; + this.Label1.Text = "Categories:"; + // + // lstProduct + // + this.lstProduct.FormattingEnabled = true; + this.lstProduct.Location = new System.Drawing.Point(212, 25); + this.lstProduct.Name = "lstProduct"; + this.lstProduct.Size = new System.Drawing.Size(208, 225); + this.lstProduct.TabIndex = 11; + // + // lstCategory + // + this.lstCategory.FormattingEnabled = true; + this.lstCategory.Location = new System.Drawing.Point(12, 25); + this.lstCategory.Name = "lstCategory"; + this.lstCategory.Size = new System.Drawing.Size(192, 225); + this.lstCategory.TabIndex = 10; + // + // MasterDetail + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(441, 266); + this.Controls.Add(this.Label2); + this.Controls.Add(this.Label1); + this.Controls.Add(this.lstProduct); + this.Controls.Add(this.lstCategory); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "MasterDetail"; + this.Text = "Master Detail"; + this.Load += new System.EventHandler(this.MasterDetail_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.ListBox lstProduct; + private System.Windows.Forms.ListBox lstCategory; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MasterDetail.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MasterDetail.cs new file mode 100644 index 0000000..fae7d98 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MasterDetail.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + public partial class MasterDetail : Form + { + public MasterDetail() + { + InitializeComponent(); + } + + private BindingManagerBase categoryBinding; + private DataSet ds; + + private void MasterDetail_Load(object sender, EventArgs e) + { + ds = Program.StoreDB.GetCategoriesAndProducts(); + + // Bind the lists to different tables. + lstCategory.DataSource = ds.Tables["Categories"]; + lstCategory.DisplayMember = "CategoryName"; + + lstProduct.DataSource = ds.Tables["Products"]; + lstProduct.DisplayMember = "ModelName"; + + // Track the binding context and handle position changing. + categoryBinding = this.BindingContext[ds.Tables["Categories"]]; + categoryBinding.PositionChanged += new EventHandler(Binding_PositionChanged); + + // Update child table at startup. + UpdateProducts(); + } + + private void Binding_PositionChanged(object sender, System.EventArgs e) + { + UpdateProducts(); + } + + private void UpdateProducts() + { + string filter; + DataRow selectedRow; + + // Find the current category row. + selectedRow = ds.Tables["Categories"].Rows[categoryBinding.Position]; + + // Create a filter expression using its CategoryID. + filter = "CategoryID='" + selectedRow["CategoryID"].ToString() + "'"; + + // Modify the view onto the product table. + ds.Tables["Products"].DefaultView.RowFilter = filter; + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MasterDetail.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MasterDetail.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MasterDetail.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Menu.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Menu.cs new file mode 100644 index 0000000..a35546b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace BindingToDataSet +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("BindingToDataSet." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Menu.designer.cs new file mode 100644 index 0000000..dd79dce --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Menu.designer.cs @@ -0,0 +1,170 @@ +namespace BindingToDataSet +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(124, 23); + this.button1.TabIndex = 0; + this.button1.Text = "SimpleListBinding"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(124, 23); + this.button2.TabIndex = 1; + this.button2.Text = "FilteredListBinding"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 70); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(124, 23); + this.button3.TabIndex = 2; + this.button3.Text = "MultipleControlBinding"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 99); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(124, 23); + this.button4.TabIndex = 3; + this.button4.Text = "EditableBinding"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(12, 128); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(124, 23); + this.button5.TabIndex = 4; + this.button5.Text = "BindToImage"; + this.button5.Click += new System.EventHandler(this.cmd_Click); + // + // button6 + // + this.button6.Location = new System.Drawing.Point(12, 157); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(124, 23); + this.button6.TabIndex = 5; + this.button6.Text = "LookupTable"; + this.button6.Click += new System.EventHandler(this.cmd_Click); + // + // button7 + // + this.button7.Location = new System.Drawing.Point(12, 186); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(124, 23); + this.button7.TabIndex = 6; + this.button7.Text = "MasterDetail"; + this.button7.Click += new System.EventHandler(this.cmd_Click); + // + // button8 + // + this.button8.Location = new System.Drawing.Point(12, 216); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(124, 23); + this.button8.TabIndex = 7; + this.button8.Text = "Unsynchronized"; + this.button8.Click += new System.EventHandler(this.cmd_Click); + // + // button9 + // + this.button9.Location = new System.Drawing.Point(12, 245); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(124, 23); + this.button9.TabIndex = 8; + this.button9.Text = "Validation"; + this.button9.Click += new System.EventHandler(this.cmd_Click); + // + // button10 + // + this.button10.Location = new System.Drawing.Point(12, 276); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(124, 23); + this.button10.TabIndex = 9; + this.button10.Text = "GridBinding"; + this.button10.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 322); + this.Controls.Add(this.button10); + this.Controls.Add(this.button9); + this.Controls.Add(this.button8); + this.Controls.Add(this.button7); + this.Controls.Add(this.button6); + this.Controls.Add(this.button5); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Menu.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Menu.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Menu.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MultipleControlBinding.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MultipleControlBinding.Designer.cs new file mode 100644 index 0000000..c35b3ff --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MultipleControlBinding.Designer.cs @@ -0,0 +1,140 @@ +namespace BindingToDataSet +{ + partial class MultipleControlBinding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.lblDescription = new System.Windows.Forms.Label(); + this.lblUnitCost = new System.Windows.Forms.Label(); + this.lblModelNumber = new System.Windows.Forms.Label(); + this.cmdNext = new System.Windows.Forms.Button(); + this.cmdPrev = new System.Windows.Forms.Button(); + this.cboModelName = new System.Windows.Forms.ComboBox(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.lblDescription); + this.GroupBox1.Controls.Add(this.lblUnitCost); + this.GroupBox1.Controls.Add(this.lblModelNumber); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(18, 55); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(312, 174); + this.GroupBox1.TabIndex = 14; + this.GroupBox1.TabStop = false; + // + // lblDescription + // + this.lblDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblDescription.Location = new System.Drawing.Point(8, 58); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Size = new System.Drawing.Size(296, 104); + this.lblDescription.TabIndex = 6; + // + // lblUnitCost + // + this.lblUnitCost.Location = new System.Drawing.Point(168, 16); + this.lblUnitCost.Name = "lblUnitCost"; + this.lblUnitCost.Size = new System.Drawing.Size(136, 32); + this.lblUnitCost.TabIndex = 5; + // + // lblModelNumber + // + this.lblModelNumber.Location = new System.Drawing.Point(8, 16); + this.lblModelNumber.Name = "lblModelNumber"; + this.lblModelNumber.Size = new System.Drawing.Size(140, 32); + this.lblModelNumber.TabIndex = 4; + // + // cmdNext + // + this.cmdNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdNext.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNext.Location = new System.Drawing.Point(238, 241); + this.cmdNext.Name = "cmdNext"; + this.cmdNext.Size = new System.Drawing.Size(92, 28); + this.cmdNext.TabIndex = 13; + this.cmdNext.Text = "Next >>"; + this.cmdNext.Click += new System.EventHandler(this.cmdNext_Click); + // + // cmdPrev + // + this.cmdPrev.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.cmdPrev.Enabled = false; + this.cmdPrev.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPrev.Location = new System.Drawing.Point(18, 241); + this.cmdPrev.Name = "cmdPrev"; + this.cmdPrev.Size = new System.Drawing.Size(92, 28); + this.cmdPrev.TabIndex = 12; + this.cmdPrev.Text = "<< Prev"; + this.cmdPrev.Click += new System.EventHandler(this.cmdPrev_Click); + // + // cboModelName + // + this.cboModelName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboModelName.FormattingEnabled = true; + this.cboModelName.Location = new System.Drawing.Point(14, 19); + this.cboModelName.Name = "cboModelName"; + this.cboModelName.Size = new System.Drawing.Size(316, 21); + this.cboModelName.TabIndex = 11; + // + // MultipleControlBinding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(352, 282); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.cmdNext); + this.Controls.Add(this.cmdPrev); + this.Controls.Add(this.cboModelName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "MultipleControlBinding"; + this.Text = "Multiple Control Binding"; + this.Load += new System.EventHandler(this.MultipleControlBinding_Load); + this.GroupBox1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Label lblDescription; + private System.Windows.Forms.Label lblUnitCost; + private System.Windows.Forms.Label lblModelNumber; + private System.Windows.Forms.Button cmdNext; + private System.Windows.Forms.Button cmdPrev; + private System.Windows.Forms.ComboBox cboModelName; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MultipleControlBinding.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MultipleControlBinding.cs new file mode 100644 index 0000000..f3a68d6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MultipleControlBinding.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + public partial class MultipleControlBinding : Form + { + private BindingManagerBase storeBinding; + + public MultipleControlBinding() + { + InitializeComponent(); + } + + private void MultipleControlBinding_Load(object sender, EventArgs e) + { + DataTable dt = Program.StoreDB.GetProducts(); + + cboModelName.DataSource = dt; + cboModelName.DisplayMember = "ModelName"; + + lblModelNumber.DataBindings.Add("Text", dt, "ModelNumber"); + lblUnitCost.DataBindings.Add("Text", dt, "UnitCost", true, DataSourceUpdateMode.OnPropertyChanged, 0, "C"); + lblDescription.DataBindings.Add("Text", dt, "Description"); + + // Keep track of the binding context. + storeBinding = this.BindingContext[dt]; + + storeBinding.PositionChanged += new EventHandler(Binding_PositionChanged); + } + + private void cmdPrev_Click(object sender, System.EventArgs e) + { + storeBinding.Position--; + } + + private void cmdNext_Click(object sender, System.EventArgs e) + { + storeBinding.Position++; + } + + private void Binding_PositionChanged(object sender, System.EventArgs e) + { + if (storeBinding.Position == storeBinding.Count - 1) + { + cmdNext.Enabled = false; + } + else + { + cmdNext.Enabled = true; + } + + if (storeBinding.Position == 0) + { + cmdPrev.Enabled = false; + } + else + { + cmdPrev.Enabled = true; + } + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MultipleControlBinding.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MultipleControlBinding.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/MultipleControlBinding.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Program.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Program.cs new file mode 100644 index 0000000..1109cfb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + static class Program + { + private static StoreDB storeDB = new StoreDB(); + public static StoreDB StoreDB + { + get { return storeDB; } + } + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ad6f418 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BindingToDataSet")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BindingToDataSet")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("afbb4a8d-9220-4408-b20f-11f53ef80a1a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d05899b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "BindingToDataSet.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "BindingToDataSet.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "BindingToDataSet.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace BindingToDataSet.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BindingToDataSet.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Settings.Designer.cs new file mode 100644 index 0000000..28a317b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Settings.Designer.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="BindingToDataSet.Properties.Settings.get_Default():BindingToDataSet.Properties.Se" + + "ttings")] + +namespace BindingToDataSet.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=localhost;Initial Catalog=Store;Integrated Security=True")] + public string Store { + get { + return ((string)(this["Store"])); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Settings.settings new file mode 100644 index 0000000..2092f95 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Properties/Settings.settings @@ -0,0 +1,11 @@ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/SimpleListBinding.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/SimpleListBinding.Designer.cs new file mode 100644 index 0000000..18dda70 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/SimpleListBinding.Designer.cs @@ -0,0 +1,64 @@ +namespace BindingToDataSet +{ + partial class SimpleListBinding + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lstModelName = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // lstModelName + // + this.lstModelName.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstModelName.FormattingEnabled = true; + this.lstModelName.Location = new System.Drawing.Point(10, 12); + this.lstModelName.Name = "lstModelName"; + this.lstModelName.Size = new System.Drawing.Size(268, 238); + this.lstModelName.TabIndex = 0; + // + // SimpleListBinding + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.lstModelName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "SimpleListBinding"; + this.Text = "List Binding"; + this.Load += new System.EventHandler(this.SimpleListBinding_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ListBox lstModelName; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/SimpleListBinding.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/SimpleListBinding.cs new file mode 100644 index 0000000..98278f0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/SimpleListBinding.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + public partial class SimpleListBinding : Form + { + public SimpleListBinding() + { + InitializeComponent(); + } + + private void SimpleListBinding_Load(object sender, EventArgs e) + { + lstModelName.DataSource = Program.StoreDB.GetProducts(); + lstModelName.DisplayMember = "ModelName"; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/SimpleListBinding.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/SimpleListBinding.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/SimpleListBinding.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/StoreDB.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/StoreDB.cs new file mode 100644 index 0000000..861d219 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/StoreDB.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +namespace BindingToDataSet +{ + public class StoreDB + { + public DataTable GetProducts() + { + string connectionString = Properties.Settings.Default.Store; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetProducts", con); + cmd.CommandType = CommandType.StoredProcedure; + SqlDataAdapter adapter = new SqlDataAdapter(cmd); + + DataSet ds = new DataSet(); + adapter.Fill(ds, "Products"); + return ds.Tables[0]; + } + + public DataSet GetCategoriesAndProducts() + { + string connectionString = Properties.Settings.Default.Store; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetProducts", con); + cmd.CommandType = CommandType.StoredProcedure; + SqlDataAdapter adapter = new SqlDataAdapter(cmd); + + DataSet ds = new DataSet(); + adapter.Fill(ds, "Products"); + cmd.CommandText = "GetCategories"; + adapter.Fill(ds, "Categories"); + +// Set up a relation between these tables (optional). + DataRelation relCategoryProduct = new DataRelation("CategoryProduct", + ds.Tables["Categories"].Columns["CategoryID"], + ds.Tables["Products"].Columns["CategoryID"]); + ds.Relations.Add(relCategoryProduct); + + return ds; + } + + public string ValidateProduct(DataRow row) + { + string errors = ""; + + if (((decimal)row["UnitCost"]) <= 0) + { + errors += "* UnitCost value too low\n"; + } + if (row["ModelNumber"].ToString() == "") + { + errors += "* You must specify a ModelNumber\n"; + } + if (row["ModelName"].ToString() == "") + { + errors += "* You must specify a ModelName\n"; + } + return errors; + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Unsynchronized.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Unsynchronized.Designer.cs new file mode 100644 index 0000000..277d022 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Unsynchronized.Designer.cs @@ -0,0 +1,99 @@ +namespace BindingToDataSet +{ + partial class Unsynchronized + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.grpB = new System.Windows.Forms.GroupBox(); + this.lstModelNameB = new System.Windows.Forms.ListBox(); + this.grpA = new System.Windows.Forms.GroupBox(); + this.lstModelNameA = new System.Windows.Forms.ListBox(); + this.grpB.SuspendLayout(); + this.grpA.SuspendLayout(); + this.SuspendLayout(); + // + // grpB + // + this.grpB.Controls.Add(this.lstModelNameB); + this.grpB.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.grpB.Location = new System.Drawing.Point(6, 134); + this.grpB.Name = "grpB"; + this.grpB.Size = new System.Drawing.Size(280, 136); + this.grpB.TabIndex = 7; + this.grpB.TabStop = false; + // + // lstModelNameB + // + this.lstModelNameB.FormattingEnabled = true; + this.lstModelNameB.Location = new System.Drawing.Point(16, 24); + this.lstModelNameB.Name = "lstModelNameB"; + this.lstModelNameB.Size = new System.Drawing.Size(248, 95); + this.lstModelNameB.TabIndex = 1; + // + // grpA + // + this.grpA.Controls.Add(this.lstModelNameA); + this.grpA.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.grpA.Location = new System.Drawing.Point(6, -3); + this.grpA.Name = "grpA"; + this.grpA.Size = new System.Drawing.Size(280, 136); + this.grpA.TabIndex = 6; + this.grpA.TabStop = false; + // + // lstModelNameA + // + this.lstModelNameA.FormattingEnabled = true; + this.lstModelNameA.Location = new System.Drawing.Point(16, 24); + this.lstModelNameA.Name = "lstModelNameA"; + this.lstModelNameA.Size = new System.Drawing.Size(248, 95); + this.lstModelNameA.TabIndex = 0; + // + // Unsynchronized + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 285); + this.Controls.Add(this.grpB); + this.Controls.Add(this.grpA); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Unsynchronized"; + this.Text = "Unsynchronized"; + this.Load += new System.EventHandler(this.Unsynchronized_Load); + this.grpB.ResumeLayout(false); + this.grpA.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox grpB; + private System.Windows.Forms.ListBox lstModelNameB; + private System.Windows.Forms.GroupBox grpA; + private System.Windows.Forms.ListBox lstModelNameA; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Unsynchronized.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Unsynchronized.cs new file mode 100644 index 0000000..1caba87 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Unsynchronized.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + public partial class Unsynchronized : Form + { + public Unsynchronized() + { + InitializeComponent(); + } + + private void Unsynchronized_Load(object sender, EventArgs e) + { + // Make sure all the controls in the second group box have a different binding. + grpB.BindingContext = new BindingContext(); + + DataTable dt = Program.StoreDB.GetProducts(); + + // Configure the first group. + lstModelNameA.DataSource = dt; + lstModelNameA.DisplayMember = "ModelName"; + + // Configure the second group. + lstModelNameB.DataSource = dt; + lstModelNameB.DisplayMember = "ModelName"; + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Unsynchronized.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Unsynchronized.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Unsynchronized.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Validation.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Validation.Designer.cs new file mode 100644 index 0000000..ee6e01a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Validation.Designer.cs @@ -0,0 +1,180 @@ +namespace BindingToDataSet +{ + partial class Validation + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Label4 = new System.Windows.Forms.Label(); + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label3 = new System.Windows.Forms.Label(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtModelName = new System.Windows.Forms.TextBox(); + this.txtDescription = new System.Windows.Forms.TextBox(); + this.txtUnitCost = new System.Windows.Forms.TextBox(); + this.txtModelNumber = new System.Windows.Forms.TextBox(); + this.cboModelName = new System.Windows.Forms.ComboBox(); + this.lblStatus = new System.Windows.Forms.Label(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // Label4 + // + this.Label4.Location = new System.Drawing.Point(14, 21); + this.Label4.Name = "Label4"; + this.Label4.Size = new System.Drawing.Size(88, 16); + this.Label4.TabIndex = 23; + this.Label4.Text = "Select a Record:"; + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.Label3); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.txtModelName); + this.GroupBox1.Controls.Add(this.txtDescription); + this.GroupBox1.Controls.Add(this.txtUnitCost); + this.GroupBox1.Controls.Add(this.txtModelNumber); + this.GroupBox1.Location = new System.Drawing.Point(14, 57); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(400, 225); + this.GroupBox1.TabIndex = 22; + this.GroupBox1.TabStop = false; + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(220, 56); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(36, 16); + this.Label3.TabIndex = 18; + this.Label3.Text = "Cost:"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 56); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(52, 16); + this.Label2.TabIndex = 17; + this.Label2.Text = "Model:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 28); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(52, 16); + this.Label1.TabIndex = 16; + this.Label1.Text = "Name:"; + // + // txtModelName + // + this.txtModelName.Location = new System.Drawing.Point(68, 24); + this.txtModelName.Name = "txtModelName"; + this.txtModelName.Size = new System.Drawing.Size(316, 21); + this.txtModelName.TabIndex = 15; + // + // txtDescription + // + this.txtDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDescription.Location = new System.Drawing.Point(12, 92); + this.txtDescription.Multiline = true; + this.txtDescription.Name = "txtDescription"; + this.txtDescription.Size = new System.Drawing.Size(372, 116); + this.txtDescription.TabIndex = 14; + // + // txtUnitCost + // + this.txtUnitCost.Location = new System.Drawing.Point(256, 52); + this.txtUnitCost.Name = "txtUnitCost"; + this.txtUnitCost.Size = new System.Drawing.Size(128, 21); + this.txtUnitCost.TabIndex = 13; + // + // txtModelNumber + // + this.txtModelNumber.Location = new System.Drawing.Point(68, 52); + this.txtModelNumber.Name = "txtModelNumber"; + this.txtModelNumber.Size = new System.Drawing.Size(136, 21); + this.txtModelNumber.TabIndex = 12; + // + // cboModelName + // + this.cboModelName.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboModelName.FormattingEnabled = true; + this.cboModelName.Location = new System.Drawing.Point(106, 17); + this.cboModelName.Name = "cboModelName"; + this.cboModelName.Size = new System.Drawing.Size(308, 21); + this.cboModelName.TabIndex = 21; + // + // lblStatus + // + this.lblStatus.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.lblStatus.Dock = System.Windows.Forms.DockStyle.Bottom; + this.lblStatus.ForeColor = System.Drawing.Color.Red; + this.lblStatus.Location = new System.Drawing.Point(0, 304); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Padding = new System.Windows.Forms.Padding(3); + this.lblStatus.Size = new System.Drawing.Size(428, 60); + this.lblStatus.TabIndex = 24; + // + // Validation + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(428, 364); + this.Controls.Add(this.lblStatus); + this.Controls.Add(this.Label4); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.cboModelName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Validation"; + this.Text = "Validation"; + this.Load += new System.EventHandler(this.EditableBinding_Load); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label Label4; + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Label Label3; + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.TextBox txtModelName; + private System.Windows.Forms.TextBox txtDescription; + private System.Windows.Forms.TextBox txtUnitCost; + private System.Windows.Forms.TextBox txtModelNumber; + private System.Windows.Forms.ComboBox cboModelName; + private System.Windows.Forms.Label lblStatus; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Validation.cs b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Validation.cs new file mode 100644 index 0000000..70bd691 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Validation.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace BindingToDataSet +{ + public partial class Validation : Form + { + public Validation() + { + InitializeComponent(); + } + + private int currentPage; + private bool errFlag; + private BindingManagerBase storeBinding; + + private void EditableBinding_Load(object sender, EventArgs e) + { + DataTable dt = Program.StoreDB.GetProducts(); + + cboModelName.DataSource = dt; + cboModelName.DisplayMember = "ModelName"; + + Binding costBinding = new Binding("Text", dt, "UnitCost"); + txtUnitCost.DataBindings.Add(costBinding); + txtModelName.DataBindings.Add("Text", dt, "ModelName"); + txtModelNumber.DataBindings.Add("Text", dt, "ModelNumber"); + txtDescription.DataBindings.Add("Text", dt, "Description"); + + // Keep track of the binding context. + storeBinding = this.BindingContext[dt]; + + dt.ColumnChanged += new DataColumnChangeEventHandler(TableChanged); + storeBinding.PositionChanged += new EventHandler(Binding_PositionChanged); + } + + private void Binding_PositionChanged(object sender, System.EventArgs e) + { + if (errFlag) + { + // Reset the page. + storeBinding.Position = currentPage; + } + else + { + // Allow the page to change and update the currentPage variable. + currentPage = storeBinding.Position; + } + } + + private void TableChanged(object sender, System.Data.DataColumnChangeEventArgs e) + { + string errors = Program.StoreDB.ValidateProduct(e.Row); + + if (errors == "") + { + errFlag = false; + } + else + { + errFlag = true; + } + lblStatus.Text = errors; + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Validation.resx b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Validation.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/Validation.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/app.config b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/app.config new file mode 100644 index 0000000..07caddf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/app.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/BindingToDataSet.exe b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/BindingToDataSet.exe new file mode 100644 index 0000000..3ad2afc Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/BindingToDataSet.exe differ diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/BindingToDataSet.exe.config b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/BindingToDataSet.exe.config new file mode 100644 index 0000000..432771e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/BindingToDataSet.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=.\SQLEXPRESS;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/BindingToDataSet.vshost.exe.config b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/BindingToDataSet.vshost.exe.config new file mode 100644 index 0000000..432771e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/BindingToDataSet.vshost.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=.\SQLEXPRESS;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/image.gif b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/image.gif new file mode 100644 index 0000000..58d21ae Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Debug/image.gif differ diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Release/BindingToDataSet.exe b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Release/BindingToDataSet.exe new file mode 100644 index 0000000..3bf0808 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Release/BindingToDataSet.exe differ diff --git a/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Release/BindingToDataSet.exe.config b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Release/BindingToDataSet.exe.config new file mode 100644 index 0000000..07caddf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingToDataSet/bin/Release/BindingToDataSet.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.csproj b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.csproj new file mode 100644 index 0000000..b636bcc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {7E77E2A5-1D65-4148-86C2-E3ABF558726F} + WinExe + Properties + BindingUnusualProperties + BindingUnusualProperties + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.csproj.user b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.sln b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.sln new file mode 100644 index 0000000..d87dff6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BindingUnusualProperties", "BindingUnusualProperties.csproj", "{7E77E2A5-1D65-4148-86C2-E3ABF558726F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7E77E2A5-1D65-4148-86C2-E3ABF558726F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E77E2A5-1D65-4148-86C2-E3ABF558726F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E77E2A5-1D65-4148-86C2-E3ABF558726F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E77E2A5-1D65-4148-86C2-E3ABF558726F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.suo b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.suo new file mode 100644 index 0000000..b0a8975 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/BindingUnusualProperties.suo differ diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Form1.Designer.cs new file mode 100644 index 0000000..86b2235 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Form1.Designer.cs @@ -0,0 +1,110 @@ +namespace BindingUnusualProperties +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.lstFonts = new System.Windows.Forms.ListBox(); + this.lblSampleText = new System.Windows.Forms.Label(); + this.lstColors = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(209, 11); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(140, 12); + this.Label2.TabIndex = 14; + this.Label2.Text = "Choose a Font:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(13, 11); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(140, 12); + this.Label1.TabIndex = 13; + this.Label1.Text = "Choose a Color:"; + // + // lstFonts + // + this.lstFonts.FormattingEnabled = true; + this.lstFonts.Location = new System.Drawing.Point(209, 27); + this.lstFonts.Name = "lstFonts"; + this.lstFonts.Size = new System.Drawing.Size(180, 134); + this.lstFonts.TabIndex = 12; + // + // lblSampleText + // + this.lblSampleText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblSampleText.Location = new System.Drawing.Point(17, 183); + this.lblSampleText.Name = "lblSampleText"; + this.lblSampleText.Size = new System.Drawing.Size(372, 96); + this.lblSampleText.TabIndex = 11; + this.lblSampleText.Text = "Click an item in one of the lists above to change the font or color of this text." + + " Once the initial conditions are set up (i.e., the binding), this operation happ" + + "ens automatically."; + // + // lstColors + // + this.lstColors.FormattingEnabled = true; + this.lstColors.Location = new System.Drawing.Point(13, 27); + this.lstColors.Name = "lstColors"; + this.lstColors.Size = new System.Drawing.Size(176, 134); + this.lstColors.TabIndex = 10; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(403, 291); + this.Controls.Add(this.Label2); + this.Controls.Add(this.Label1); + this.Controls.Add(this.lstFonts); + this.Controls.Add(this.lblSampleText); + this.Controls.Add(this.lstColors); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Binding Unsual Properties"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.ListBox lstFonts; + private System.Windows.Forms.Label lblSampleText; + private System.Windows.Forms.ListBox lstColors; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Form1.cs b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Form1.cs new file mode 100644 index 0000000..35f00e5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Form1.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Text; +using System.Collections; + +namespace BindingUnusualProperties +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + // These are our final data sources: two ArrayList objects. + List fontList = new List(); + List colorList = new List(); + + // The InstalledFonts collection allows us to enumerate installed fonts. + // Each FontFamily needs to be converted to a genuine Font object + // before it is suitable for data binding to the Control.Font property. + InstalledFontCollection InstalledFonts = new InstalledFontCollection(); + foreach (FontFamily family in InstalledFonts.Families) + { + try + { + fontList.Add(new Font(family, 12)); + } + catch + { + // We end up here if the font could not be created + // with the default style. + } + } + + // In order to retrieve the list of colors, we need to first retrieve + // the strings for the KnownColor enumeration, and then convert each one + // into a suitable color object. + string[] colorNames; + colorNames = System.Enum.GetNames(typeof(KnownColor)); + TypeConverter cnvrt = TypeDescriptor.GetConverter(typeof(KnownColor)); + + foreach (string colorName in colorNames) + { + colorList.Add(Color.FromKnownColor((KnownColor)cnvrt.ConvertFromString(colorName))); + } + + // We can now bind both our list controls. + lstColors.DataSource = colorList; + lstColors.DisplayMember = "Name"; + lstFonts.DataSource = fontList; + lstFonts.DisplayMember = "Name"; + + // The label is bound to both data sources. + lblSampleText.DataBindings.Add("ForeColor", colorList, ""); + lblSampleText.DataBindings.Add("Font", fontList, ""); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Form1.resx b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Program.cs b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Program.cs new file mode 100644 index 0000000..6a8638c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace BindingUnusualProperties +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..98495fe --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BindingUnusualProperties")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BindingUnusualProperties")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("8bf46f81-607b-417a-bb75-b8071bf8ed96")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Resources.Designer.cs new file mode 100644 index 0000000..503e22b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "BindingUnusualProperties.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "BindingUnusualProperties.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "BindingUnusualProperties.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace BindingUnusualProperties.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BindingUnusualProperties.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Settings.Designer.cs new file mode 100644 index 0000000..fae69d0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "BindingUnusualProperties.Properties.Settings.get_Default():BindingUnusualProperties.Properties.Settings")] + +namespace BindingUnusualProperties.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/bin/Debug/BindingUnusualProperties.exe b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/bin/Debug/BindingUnusualProperties.exe new file mode 100644 index 0000000..254ea2c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/BindingUnusualProperties/bin/Debug/BindingUnusualProperties.exe differ diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Program.cs b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Program.cs new file mode 100644 index 0000000..5173019 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace TreeViewDataBinding +{ + static class Program + { + private static StoreDB storeDB = new StoreDB(); + public static StoreDB StoreDB + { + get { return storeDB; } + } + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new TreeViewForm()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5499320 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("TreeViewDataBinding")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TreeViewDataBinding")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("95cab87c-7b7f-4a53-afd6-3d19256fa04d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d08bc46 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TreeViewDataBinding.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TreeViewDataBinding.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TreeViewDataBinding.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace TreeViewDataBinding.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TreeViewDataBinding.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Settings.Designer.cs new file mode 100644 index 0000000..7e9985b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Settings.Designer.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="TreeViewDataBinding.Properties.Settings.get_Default():TreeViewDataBinding.Propert" + + "ies.Settings")] + +namespace TreeViewDataBinding.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=localhost;Initial Catalog=Store;Integrated Security=True")] + public string Store { + get { + return ((string)(this["Store"])); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Settings.settings new file mode 100644 index 0000000..e028eb6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/Properties/Settings.settings @@ -0,0 +1,11 @@ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/StoreDB.cs b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/StoreDB.cs new file mode 100644 index 0000000..99b0cae --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/StoreDB.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +namespace TreeViewDataBinding +{ + public class StoreDB + { + public DataTable GetCategories() + { + string connectionString = Properties.Settings.Default.Store; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetProducts", con); + cmd.CommandType = CommandType.StoredProcedure; + SqlDataAdapter adapter = new SqlDataAdapter(cmd); + + DataSet ds = new DataSet(); + adapter.Fill(ds, Tables.Product); + cmd.CommandText = "GetCategories"; + adapter.Fill(ds, Tables.Category); + + // Set up a relation between these tables (optional). + DataRelation relCategoryProduct = new DataRelation("CategoryProduct", + ds.Tables[Tables.Category].Columns[CategoryField.ID], + ds.Tables[Tables.Product].Columns[ProductField.CategoryID]); + ds.Relations.Add(relCategoryProduct); + return ds.Tables[Tables.Category]; + } + + public static class Tables + { + public const string Product = "Products"; + public const string Category = "Categories"; + } + + public static class ProductField + { + public const string Name = "ModelName"; + public const string Description = "Description"; + public const string CategoryID = "CategoryID"; + } + + public static class CategoryField + { + public const string Name = "CategoryName"; + public const string ID = "CategoryID"; + } + + public DataRow[] GetProductsInCategory(DataRow rowParent) + { + DataRelation relCategoryProduct = rowParent.Table.DataSet.Relations[0]; + return rowParent.GetChildRows(relCategoryProduct); + } + + public string GetDisplayText(DataRow row) + { + string text = ""; + + switch (row.Table.TableName) + { + case Tables.Product: + text = "ID: " + row[0] + "\n"; + text += "Name: " + row[ProductField.Name] + "\n\n"; + text += row[ProductField.Description]; + break; + } + return text; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.csproj b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.csproj new file mode 100644 index 0000000..ec79ed0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.csproj @@ -0,0 +1,72 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {16E85DAA-7673-452A-B95B-CB0A86604F15} + WinExe + Properties + TreeViewDataBinding + TreeViewDataBinding + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + TreeViewForm.cs + + + True + Resources.resx + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + Form + + + TreeViewForm.cs + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.csproj.user b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.sln b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.sln new file mode 100644 index 0000000..95438ea --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TreeViewDataBinding", "TreeViewDataBinding.csproj", "{16E85DAA-7673-452A-B95B-CB0A86604F15}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {16E85DAA-7673-452A-B95B-CB0A86604F15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16E85DAA-7673-452A-B95B-CB0A86604F15}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16E85DAA-7673-452A-B95B-CB0A86604F15}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16E85DAA-7673-452A-B95B-CB0A86604F15}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.suo b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.suo new file mode 100644 index 0000000..ca6379e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewDataBinding.suo differ diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewForm.Designer.cs b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewForm.Designer.cs new file mode 100644 index 0000000..8190afd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewForm.Designer.cs @@ -0,0 +1,167 @@ +namespace TreeViewDataBinding +{ + partial class TreeViewForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Panel2 = new System.Windows.Forms.Panel(); + this.Panel3 = new System.Windows.Forms.Panel(); + this.lblInfo = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.Splitter1 = new System.Windows.Forms.Splitter(); + this.treeDB = new System.Windows.Forms.TreeView(); + this.Panel1 = new System.Windows.Forms.Panel(); + this.cmdClose = new System.Windows.Forms.Button(); + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Panel2.SuspendLayout(); + this.Panel3.SuspendLayout(); + this.Panel1.SuspendLayout(); + this.SuspendLayout(); + // + // Panel2 + // + this.Panel2.Controls.Add(this.Panel3); + this.Panel2.Controls.Add(this.Splitter1); + this.Panel2.Controls.Add(this.treeDB); + this.Panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.Panel2.Location = new System.Drawing.Point(0, 0); + this.Panel2.Name = "Panel2"; + this.Panel2.Size = new System.Drawing.Size(503, 311); + this.Panel2.TabIndex = 10; + // + // Panel3 + // + this.Panel3.Controls.Add(this.lblInfo); + this.Panel3.Controls.Add(this.Label1); + this.Panel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.Panel3.Location = new System.Drawing.Point(239, 0); + this.Panel3.Name = "Panel3"; + this.Panel3.Size = new System.Drawing.Size(264, 311); + this.Panel3.TabIndex = 7; + // + // lblInfo + // + this.lblInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblInfo.BackColor = System.Drawing.SystemColors.Window; + this.lblInfo.Location = new System.Drawing.Point(16, 12); + this.lblInfo.Name = "lblInfo"; + this.lblInfo.Size = new System.Drawing.Size(233, 287); + this.lblInfo.TabIndex = 1; + // + // Label1 + // + this.Label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.Label1.BackColor = System.Drawing.SystemColors.Window; + this.Label1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.Label1.Location = new System.Drawing.Point(4, 0); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(257, 311); + this.Label1.TabIndex = 2; + // + // Splitter1 + // + this.Splitter1.Location = new System.Drawing.Point(236, 0); + this.Splitter1.Name = "Splitter1"; + this.Splitter1.Size = new System.Drawing.Size(3, 311); + this.Splitter1.TabIndex = 6; + this.Splitter1.TabStop = false; + // + // treeDB + // + this.treeDB.Dock = System.Windows.Forms.DockStyle.Left; + this.treeDB.Location = new System.Drawing.Point(0, 0); + this.treeDB.Name = "treeDB"; + this.treeDB.Size = new System.Drawing.Size(236, 311); + this.treeDB.TabIndex = 4; + this.treeDB.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeDB_BeforeExpand); + this.treeDB.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeDB_AfterSelect); + // + // Panel1 + // + this.Panel1.Controls.Add(this.cmdClose); + this.Panel1.Controls.Add(this.GroupBox1); + this.Panel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.Panel1.Location = new System.Drawing.Point(0, 311); + this.Panel1.Name = "Panel1"; + this.Panel1.Size = new System.Drawing.Size(503, 36); + this.Panel1.TabIndex = 9; + // + // cmdClose + // + this.cmdClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdClose.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdClose.Location = new System.Drawing.Point(429, 12); + this.cmdClose.Name = "cmdClose"; + this.cmdClose.Size = new System.Drawing.Size(72, 24); + this.cmdClose.TabIndex = 4; + this.cmdClose.Text = "Close"; + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Location = new System.Drawing.Point(0, 0); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(501, 8); + this.GroupBox1.TabIndex = 5; + this.GroupBox1.TabStop = false; + // + // TreeViewForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(503, 347); + this.Controls.Add(this.Panel2); + this.Controls.Add(this.Panel1); + this.Name = "TreeViewForm"; + this.Text = "Product Catalog"; + this.Load += new System.EventHandler(this.TreeViewForm_Load); + this.Panel2.ResumeLayout(false); + this.Panel3.ResumeLayout(false); + this.Panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel Panel2; + private System.Windows.Forms.Panel Panel3; + private System.Windows.Forms.Label lblInfo; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.Splitter Splitter1; + private System.Windows.Forms.TreeView treeDB; + private System.Windows.Forms.Panel Panel1; + private System.Windows.Forms.Button cmdClose; + private System.Windows.Forms.GroupBox GroupBox1; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewForm.cs b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewForm.cs new file mode 100644 index 0000000..069443e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewForm.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace TreeViewDataBinding +{ + public partial class TreeViewForm : Form + { + public TreeViewForm() + { + InitializeComponent(); + } + + private void TreeViewForm_Load(object sender, EventArgs e) + { + TreeNode nodeParent; + foreach (DataRow row in Program.StoreDB.GetCategories().Rows) + { + // Add the category node. + nodeParent = + treeDB.Nodes.Add(row[StoreDB.CategoryField.Name].ToString()); + nodeParent.ImageIndex = 0; + + // Store the disconnected category information. + nodeParent.Tag = row; + + // Add a "dummy" node. + nodeParent.Nodes.Add("*"); + } + + } + + private void treeDB_AfterSelect(object sender, TreeViewEventArgs e) + { + lblInfo.Text = Program.StoreDB.GetDisplayText((DataRow)e.Node.Tag); + } + + private void treeDB_BeforeExpand(object sender, TreeViewCancelEventArgs e) + { + TreeNode nodeSelected, nodeChild; + nodeSelected = e.Node; + + if (nodeSelected.Nodes[0].Text == "*") + { + // This is a dummy node. + nodeSelected.Nodes.Clear(); + + foreach (DataRow row in + Program.StoreDB.GetProductsInCategory((DataRow)nodeSelected.Tag)) + { + string field = row[StoreDB.ProductField.Name].ToString(); + nodeChild = nodeSelected.Nodes.Add(field); + + // Store the disconnected product information. + nodeChild.Tag = row; + nodeChild.ImageIndex = 1; + nodeChild.SelectedImageIndex = 1; + } + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewForm.resx b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewForm.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/TreeViewForm.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/app.config b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/app.config new file mode 100644 index 0000000..bb779aa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/app.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/bin/Debug/TreeViewDataBinding.exe b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/bin/Debug/TreeViewDataBinding.exe new file mode 100644 index 0000000..9892835 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/bin/Debug/TreeViewDataBinding.exe differ diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/bin/Debug/TreeViewDataBinding.exe.config b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/bin/Debug/TreeViewDataBinding.exe.config new file mode 100644 index 0000000..bb779aa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/bin/Debug/TreeViewDataBinding.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/bin/Debug/TreeViewDataBinding.vshost.exe.config b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/bin/Debug/TreeViewDataBinding.vshost.exe.config new file mode 100644 index 0000000..bb779aa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/TreeViewDataBinding/bin/Debug/TreeViewDataBinding.vshost.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/readme.txt b/Pro Windows Forms 2.0/Chapter08/readme.txt new file mode 100644 index 0000000..79133ce --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/readme.txt @@ -0,0 +1 @@ +Use store.sql to install the IBuySpy sample database. \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter08/store.sql b/Pro Windows Forms 2.0/Chapter08/store.sql new file mode 100644 index 0000000..e3579e2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter08/store.sql @@ -0,0 +1,1135 @@ +CREATE DATABASE [store] +GO + +-- ======================================================= +-- MAKE TABLES AND SPROCS FOR IBUYSPY STORE DB +-- +-- File: store_schema.sql +-- Version: 1.2 - 06/01/01 (swarren) +-- +-- ======================================================= + +-- point to proper DB +use [store] +GO + + +-- ================================================================== +-- create the new tables +-- =================================================================== +CREATE TABLE [dbo].[Categories] ( + [CategoryID] [int] IDENTITY (1, 1) NOT NULL , + [CategoryName] [nvarchar] (50) +) ON [PRIMARY] +GO + +CREATE TABLE [dbo].[Customers] ( + [CustomerID] [int] IDENTITY (1, 1) NOT NULL , + [FullName] [nvarchar] (50) , + [EmailAddress] [nvarchar] (50) , + [Password] [nvarchar] (50) +) ON [PRIMARY] +GO + +CREATE TABLE [dbo].[OrderDetails] ( + [OrderID] [int] NOT NULL , + [ProductID] [int] NOT NULL , + [Quantity] [int] NOT NULL , + [UnitCost] [money] NOT NULL +) ON [PRIMARY] +GO + +CREATE TABLE [dbo].[Orders] ( + [OrderID] [int] IDENTITY (1, 1) NOT NULL , + [CustomerID] [int] NOT NULL , + [OrderDate] [datetime] NOT NULL , + [ShipDate] [datetime] NOT NULL +) ON [PRIMARY] +GO + +CREATE TABLE [dbo].[Products] ( + [ProductID] [int] IDENTITY (1, 1) NOT NULL , + [CategoryID] [int] NOT NULL , + [ModelNumber] [nvarchar] (50) , + [ModelName] [nvarchar] (50) , + [ProductImage] [nvarchar] (50) , + [UnitCost] [money] NOT NULL , + [Description] [nvarchar] (3800) +) ON [PRIMARY] +GO + +CREATE TABLE [dbo].[Reviews] ( + [ReviewID] [int] IDENTITY (1, 1) NOT NULL , + [ProductID] [int] NOT NULL , + [CustomerName] [nvarchar] (50) , + [CustomerEmail] [nvarchar] (50) , + [Rating] [int] NOT NULL , + [Comments] [nvarchar] (3850) , +) ON [PRIMARY] +GO + +CREATE TABLE [dbo].[ShoppingCart] ( + [RecordID] [int] IDENTITY (1, 1) NOT NULL , + [CartID] [nvarchar] (50) , + [Quantity] [int] NOT NULL , + [ProductID] [int] NOT NULL , + [DateCreated] [datetime] NOT NULL +) ON [PRIMARY] +GO + +-- ============================================================= +-- create the stored procs +-- ============================================================= +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS OFF +GO + +CREATE Procedure CustomerAdd +( + @FullName nvarchar(50), + @Email nvarchar(50), + @Password nvarchar(50), + @CustomerID int OUTPUT +) +AS + +INSERT INTO Customers +( + FullName, + EMailAddress, + Password +) + +VALUES +( + @FullName, + @Email, + @Password +) + +SELECT + @CustomerID = @@Identity + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure CustomerAlsoBought +( + @ProductID int +) +As + +/* We want to take the top 5 products contained in + the orders where someone has purchased the given Product */ +SELECT TOP 5 + OrderDetails.ProductID, + Products.ModelName, + SUM(OrderDetails.Quantity) as TotalNum + +FROM + OrderDetails + INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID + +WHERE OrderID IN +( + /* This inner query should retrieve all orders that have contained the productID */ + SELECT DISTINCT OrderID + FROM OrderDetails + WHERE ProductID = @ProductID +) +AND OrderDetails.ProductID != @ProductID + +GROUP BY OrderDetails.ProductID, Products.ModelName + +ORDER BY TotalNum DESC + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure CustomerDetail +( + @CustomerID int, + @FullName nvarchar(50) OUTPUT, + @Email nvarchar(50) OUTPUT, + @Password nvarchar(50) OUTPUT +) +AS + +SELECT + @FullName = FullName, + @Email = EmailAddress, + @Password = Password + +FROM + Customers + +WHERE + CustomerID = @CustomerID +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure CustomerLogin +( + @Email nvarchar(50), + @Password nvarchar(50), + @CustomerID int OUTPUT +) +AS + +SELECT + @CustomerID = CustomerID + +FROM + Customers + +WHERE + EmailAddress = @Email + AND + Password = @Password + +IF @@Rowcount < 1 +SELECT + @CustomerID = 0 +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure OrdersDetail +( + @OrderID int, + @OrderDate datetime OUTPUT, + @ShipDate datetime OUTPUT, + @OrderTotal money OUTPUT +) +AS + +/* First, return the OrderTotal */ +SELECT + @OrderTotal = Cast(SUM(OrderDetails.Quantity * OrderDetails.UnitCost) as money) + +FROM + OrderDetails + +WHERE + OrderID= @OrderID + +/* Then, return the dates */ +SELECT + @OrderDate = OrderDate, + @ShipDate = ShipDate + +FROM + Orders + +WHERE + OrderID = @OrderID + +/* Then, return the recordset of info */ +SELECT + Products.ProductID, + Products.ModelName, + Products.ModelNumber, + OrderDetails.UnitCost, + OrderDetails.Quantity, + (OrderDetails.Quantity * OrderDetails.UnitCost) as ExtendedAmount + +FROM + OrderDetails + INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID + +WHERE + OrderID = @OrderID + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure OrdersList +( + @CustomerID int +) +As + +SELECT + Orders.OrderID, + Cast(sum(orderdetails.quantity*orderdetails.unitcost) as money) as OrderTotal, + Orders.OrderDate, + Orders.ShipDate + +FROM + Orders + INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID + +GROUP BY + CustomerID, + Orders.OrderID, + Orders.OrderDate, + Orders.ShipDate +HAVING + Orders.CustomerID = @CustomerID + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ProductCategoryList + +AS + +SELECT + CategoryID, + CategoryName + +FROM + Categories + +ORDER BY + CategoryName ASC + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ProductDetail +( + @ProductID int, + @ModelNumber nvarchar(50) OUTPUT, + @ModelName nvarchar(50) OUTPUT, + @ProductImage nvarchar(50) OUTPUT, + @UnitCost money OUTPUT, + @Description nvarchar(4000) OUTPUT +) +AS + +SELECT + @ProductID = ProductID, + @ModelNumber = ModelNumber, + @ModelName = ModelName, + @ProductImage = ProductImage, + @UnitCost = UnitCost, + @Description = Description + +FROM + Products + +WHERE + ProductID = @ProductID +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ProductSearch +( + @Search nvarchar(255) +) +AS + +SELECT + ProductID, + ModelName, + ModelNumber, + UnitCost, + ProductImage + +FROM + Products + +WHERE + ModelNumber LIKE '%' + @Search + '%' + OR + ModelName LIKE '%' + @Search + '%' + OR + Description LIKE '%' + @Search + '%' +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ProductsByCategory +( + @CategoryID int +) +AS + +SELECT + ProductID, + ModelName, + UnitCost, + ProductImage + +FROM + Products + +WHERE + CategoryID = @CategoryID + +ORDER BY + ModelName, + ModelNumber + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ProductsMostPopular + +AS + +SELECT TOP 5 + OrderDetails.ProductID, + SUM(OrderDetails.Quantity) as TotalNum, + Products.ModelName + +FROM + OrderDetails + INNER JOIN Products ON OrderDetails.ProductID = Products.ProductID + +GROUP BY + OrderDetails.ProductID, + Products.ModelName + +ORDER BY + TotalNum DESC + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ReviewsAdd +( + @ProductID int, + @CustomerName nvarchar(50), + @CustomerEmail nvarchar(50), + @Rating int, + @Comments nvarchar(3850), + @ReviewID int OUTPUT +) +AS + +INSERT INTO Reviews +( + ProductID, + CustomerName, + CustomerEmail, + Rating, + Comments +) +VALUES +( + @ProductID, + @CustomerName, + @CustomerEmail, + @Rating, + @Comments +) + +SELECT + @ReviewID = @@Identity + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ReviewsList +( + @ProductID int +) +AS + +SELECT + ReviewID, + CustomerName, + Rating, + Comments + +FROM + Reviews + +WHERE + ProductID = @ProductID + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ShoppingCartAddItem +( + @CartID nvarchar(50), + @ProductID int, + @Quantity int +) +As + +DECLARE @CountItems int + +SELECT + @CountItems = Count(ProductID) +FROM + ShoppingCart +WHERE + ProductID = @ProductID + AND + CartID = @CartID + +IF @CountItems > 0 /* There are items - update the current quantity */ + + UPDATE + ShoppingCart + SET + Quantity = (@Quantity + ShoppingCart.Quantity) + WHERE + ProductID = @ProductID + AND + CartID = @CartID + +ELSE /* New entry for this Cart. Add a new record */ + + INSERT INTO ShoppingCart + ( + CartID, + Quantity, + ProductID + ) + VALUES + ( + @CartID, + @Quantity, + @ProductID + ) + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ShoppingCartEmpty +( + @CartID nvarchar(50) +) +AS + +DELETE FROM ShoppingCart + +WHERE + CartID = @CartID +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + + +CREATE Procedure OrdersAdd +( + @CustomerID int, + @CartID nvarchar(50), + @OrderDate datetime, + @ShipDate datetime, + @OrderID int OUTPUT +) +AS + +BEGIN TRAN AddOrder + +/* Create the Order header */ +INSERT INTO Orders +( + CustomerID, + OrderDate, + ShipDate +) +VALUES +( + @CustomerID, + @OrderDate, + @ShipDate +) + +SELECT + @OrderID = @@Identity + +/* Copy items from given shopping cart to OrdersDetail table for given OrderID*/ +INSERT INTO OrderDetails +( + OrderID, + ProductID, + Quantity, + UnitCost +) + +SELECT + @OrderID, + ShoppingCart.ProductID, + Quantity, + Products.UnitCost + +FROM + ShoppingCart + INNER JOIN Products ON ShoppingCart.ProductID = Products.ProductID + +WHERE + CartID = @CartID + +/* Removal of items from user's shopping cart will happen on the business layer*/ +EXEC ShoppingCartEmpty @CartId + +COMMIT TRAN AddOrder + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ShoppingCartItemCount +( + @CartID nvarchar(50), + @ItemCount int OUTPUT +) +AS + +SELECT + @ItemCount = COUNT(ProductID) + +FROM + ShoppingCart + +WHERE + CartID = @CartID +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ShoppingCartList +( + @CartID nvarchar(50) +) +AS + +SELECT + Products.ProductID, + Products.ModelName, + Products.ModelNumber, + ShoppingCart.Quantity, + Products.UnitCost, + Cast((Products.UnitCost * ShoppingCart.Quantity) as money) as ExtendedAmount + +FROM + Products, + ShoppingCart + +WHERE + Products.ProductID = ShoppingCart.ProductID + AND + ShoppingCart.CartID = @CartID + +ORDER BY + Products.ModelName, + Products.ModelNumber +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ShoppingCartMigrate +( + @OriginalCartId nvarchar(50), + @NewCartId nvarchar(50) +) +AS + +UPDATE + ShoppingCart + +SET + CartId = @NewCartId + +WHERE + CartId = @OriginalCartId +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ShoppingCartRemoveAbandoned + +AS + +DELETE FROM ShoppingCart + +WHERE + DATEDIFF(dd, DateCreated, GetDate()) > 1 + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ShoppingCartRemoveItem +( + @CartID nvarchar(50), + @ProductID int +) +AS + +DELETE FROM ShoppingCart + +WHERE + CartID = @CartID + AND + ProductID = @ProductID + +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ShoppingCartTotal +( + @CartID nvarchar(50), + @TotalCost money OUTPUT +) +AS + +SELECT + @TotalCost = SUM(Products.UnitCost * ShoppingCart.Quantity) + +FROM + ShoppingCart, + Products + +WHERE + ShoppingCart.CartID = @CartID + AND + Products.ProductID = ShoppingCart.ProductID +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_NULLS ON +GO + +CREATE Procedure ShoppingCartUpdate +( + @CartID nvarchar(50), + @ProductID int, + @Quantity int +) +AS + +UPDATE ShoppingCart + +SET + Quantity = @Quantity + +WHERE + CartID = @CartID + AND + ProductID = @ProductID +GO +SET QUOTED_IDENTIFIER OFF +GO +SET ANSI_NULLS ON +GO + + +-- ============================================================= +-- create keys and indexes +-- ============================================================= +ALTER TABLE [dbo].[Categories] WITH NOCHECK ADD + CONSTRAINT [PK_Categories] PRIMARY KEY NONCLUSTERED + ( + [CategoryID] + ) ON [PRIMARY] +GO + +ALTER TABLE [dbo].[Customers] WITH NOCHECK ADD + CONSTRAINT [PK_Customers] PRIMARY KEY NONCLUSTERED + ( + [CustomerID] + ) ON [PRIMARY] +GO + +ALTER TABLE [dbo].[OrderDetails] WITH NOCHECK ADD + CONSTRAINT [PK_OrderDetails] PRIMARY KEY NONCLUSTERED + ( + [OrderID], + [ProductID] + ) ON [PRIMARY] +GO + +ALTER TABLE [dbo].[Orders] WITH NOCHECK ADD + CONSTRAINT [DF_Orders_OrderDate] DEFAULT (getdate()) FOR [OrderDate], + CONSTRAINT [DF_Orders_ShipDate] DEFAULT (getdate()) FOR [ShipDate], + CONSTRAINT [PK_Orders] PRIMARY KEY NONCLUSTERED + ( + [OrderID] + ) ON [PRIMARY] +GO + +ALTER TABLE [dbo].[Products] WITH NOCHECK ADD + CONSTRAINT [PK_Products] PRIMARY KEY NONCLUSTERED + ( + [ProductID] + ) ON [PRIMARY] +GO + +ALTER TABLE [dbo].[ShoppingCart] WITH NOCHECK ADD + CONSTRAINT [DF_ShoppingCart_Quantity] DEFAULT (1) FOR [Quantity], + CONSTRAINT [DF_ShoppingCart_DateCreated] DEFAULT (getdate()) FOR [DateCreated], + CONSTRAINT [PK_ShoppingCart] PRIMARY KEY NONCLUSTERED + ( + [RecordID] + ) ON [PRIMARY] +GO + +CREATE INDEX [IX_ShoppingCart] ON [dbo].[ShoppingCart]([CartID], [ProductID]) ON [PRIMARY] +GO + +ALTER TABLE [dbo].[OrderDetails] ADD + CONSTRAINT [FK_OrderDetails_Orders] FOREIGN KEY + ( + [OrderID] + ) REFERENCES [dbo].[Orders] ( + [OrderID] + ) NOT FOR REPLICATION +GO + +ALTER TABLE [dbo].[Orders] ADD + CONSTRAINT [FK_Orders_Customers] FOREIGN KEY + ( + [CustomerID] + ) REFERENCES [dbo].[Customers] ( + [CustomerID] + ) NOT FOR REPLICATION +GO + +ALTER TABLE [dbo].[Products] ADD + CONSTRAINT [FK_Products_Categories] FOREIGN KEY + ( + [CategoryID] + ) REFERENCES [dbo].[Categories] ( + [CategoryID] + ) +GO + +ALTER TABLE [dbo].[Reviews] ADD + CONSTRAINT [FK_Reviews_Products] FOREIGN KEY + ( + [ProductID] + ) REFERENCES [dbo].[Products] ( + [ProductID] + ) NOT FOR REPLICATION +GO + +ALTER TABLE [dbo].[ShoppingCart] ADD + CONSTRAINT [FK_ShoppingCart_Products] FOREIGN KEY + ( + [ProductID] + ) REFERENCES [dbo].[Products] ( + [ProductID] + ) +GO + + + +-- ======================================================= +-- INSERT INITIAL DATA INTO IBUYSPY STORE DB +-- +-- File: store_data.sql +-- Version: 1.2 - 09/01/01 (swarren) +-- +-- ======================================================= + +-- point to proper DB +use [store] +GO + +SET IDENTITY_INSERT Categories ON +GO + +INSERT INTO Categories (CategoryID,CategoryName) VALUES (14,"Communications") +INSERT INTO Categories (CategoryID,CategoryName) VALUES (15,"Deception") +INSERT INTO Categories (CategoryID,CategoryName) VALUES (16,"Travel") +INSERT INTO Categories (CategoryID,CategoryName) VALUES (17,"Protection") +INSERT INTO Categories (CategoryID,CategoryName) VALUES (18,"Munitions") +INSERT INTO Categories (CategoryID,CategoryName) VALUES (19,"Tools") +INSERT INTO Categories (CategoryID,CategoryName) VALUES (20,"General") +GO + +SET IDENTITY_INSERT Categories OFF +GO + + +SET IDENTITY_INSERT Customers ON +GO + +INSERT INTO Customers (CustomerID,FullName,EmailAddress,Password) VALUES (1,"James Bondwell","jb@ibuyspy.com","IBS_007") +INSERT INTO Customers (CustomerID,FullName,EmailAddress,Password) VALUES (2,"Sarah Goodpenny","sg@ibuyspy.com","IBS_001") +INSERT INTO Customers (CustomerID,FullName,EmailAddress,Password) VALUES (3,"Gordon Que","gq@ibuyspy.com","IBS_000") +INSERT INTO Customers (CustomerID,FullName,EmailAddress,Password) VALUES (19,"Guest Account","guest","guest") +INSERT INTO Customers (CustomerID,FullName,EmailAddress,Password) VALUES (16,"Test Account","d","d") +GO + +SET IDENTITY_INSERT Customers OFF +GO + +SET IDENTITY_INSERT Orders ON +GO + +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (99,19,"2000-07-06 01:01:00.000","2000-07-07 01:01:00.000") +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (93,16,"2000-07-03 01:01:00.000","2000-07-04 01:01:00.000") +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (101,16,"2000-07-10 01:01:00.000","2000-07-11 01:01:00.000") +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (103,16,"2000-07-10 01:01:00.000","2000-07-10 01:01:00.000") +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (96,19,"2000-07-03 01:01:00.000","2000-07-03 01:01:00.000") +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (104,19,"2000-07-10 01:01:00.000","2000-07-11 01:01:00.000") +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (105,16,"2000-10-30 01:01:00.000","2000-10-31 01:01:00.000") +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (106,16,"2000-10-30 01:01:00.000","2000-10-30 01:01:00.000") +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (107,16,"2000-10-30 01:01:00.000","2000-10-31 01:01:00.000") +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (100,19,"2000-07-06 01:01:00.000","2000-07-08 01:01:00.000") +INSERT INTO Orders (OrderID,CustomerID,OrderDate,ShipDate) VALUES (102,16,"2000-07-10 01:01:00.000","2000-07-12 01:01:00.000") +GO + + +SET IDENTITY_INSERT Orders OFF +GO + +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (99,404,2,459.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (93,363,1,1.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (101,378,2,14.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (102,372,1,129.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (96,378,1,14.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (103,363,1,1.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (104,355,1,1499.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (104,378,1,14.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (104,406,1,399.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (100,404,2,459.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (101,401,1,599.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (102,401,1,599.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (104,362,1,1.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (104,404,1,459.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (105,355,2,1499.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (106,401,1,599.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (106,404,2,459.99) +INSERT INTO OrderDetails (OrderID,ProductID,Quantity,UnitCost) VALUES (107,368,2,19999.98) +GO + + +SET IDENTITY_INSERT Products ON +GO + +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (355,16,'RU007','Rain Racer 2000','image.gif',1499.99,"Looks like an ordinary bumbershoot, but don't be fooled! Simply place Rain Racer's tip on the ground and press the release latch. Within seconds, this ordinary rain umbrella converts into a two-wheeled gas-powered mini-scooter. Goes from 0 to 60 in 7.5 seconds - even in a driving rain! Comes in black, blue, and candy-apple red.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (356,20,'STKY1','Edible Tape','image.gif',3.99,'The latest in personal survival gear, the STKY1 looks like a roll of ordinary office tape, but can save your life in an emergency. Just remove the tape roll and place in a kettle of boiling water with mixed vegetables and a ham shank. In just 90 minutes you have a great tasking soup that really sticks to your ribs! Herbs and spices not included.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (357,16,'P38','Escape Vehicle (Air)','image.gif',2.99,'In a jam, need a quick escape? Just whip out a sheet of our patented P38 paper and, with a few quick folds, it converts into a lighter-than-air escape vehicle! Especially effective on windy days - no fuel required. Comes in several sizes including letter, legal, A10, and B52.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (358,19,'NOZ119','Extracting Tool','image.gif',199,'High-tech miniaturized extracting tool. Excellent for extricating foreign objects from your person. Good for picking up really tiny stuff, too! Cleverly disguised as a pair of tweezers. ') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (359,16,'PT109','Escape Vehicle (Water)','image.gif',1299.99,"Camouflaged as stylish wing tips, these 'shoes' get you out of a jam on the high seas instantly. Exposed to water, the pair transforms into speedy miniature inflatable rafts. Complete with 76 HP outboard motor, these hip heels will whisk you to safety even in the roughest of seas. Warning: Not recommended for beachwear.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (360,14,'RED1','Communications Device','360.gif',49.99,'Subversively stay in touch with this miniaturized wireless communications device. Speak into the pointy end and listen with the other end! Voice-activated dialing makes calling for backup a breeze. Excellent for undercover work at schools, rest homes, and most corporate headquarters. Comes in assorted colors.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (362,14,'LK4TLNT','Persuasive Pencil','362.gif',1.99,"Persuade anyone to see your point of view! Captivate your friends and enemies alike! Draw the crime-scene or map out the chain of events. All you need is several years of training or copious amounts of natural talent. You're halfway there with the Persuasive Pencil. Purchase this item with the Retro Pocket Protector Rocket Pack for optimum disguise.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (363,18,'NTMBS1','Multi-Purpose Rubber Band','image.gif',1.99,'One of our most popular items! A band of rubber that stretches 20 times the original size. Uses include silent one-to-one communication across a crowded room, holding together a pack of Persuasive Pencils, and powering lightweight aircraft. Beware, stretching past 20 feet results in a painful snap and a rubber strip.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (364,19,'NE1RPR','Universal Repair System','image.gif',4.99,'Few people appreciate the awesome repair possibilities contained in a single roll of duct tape. In fact, some houses in the Midwest are made entirely out of the miracle material contained in every roll! Can be safely used to repair cars, computers, people, dams, and a host of other items.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (365,19,'BRTLGT1','Effective Flashlight','image.gif',9.99,'The most powerful darkness-removal device offered to creatures of this world. Rather than amplifying existing/secondary light, this handy product actually REMOVES darkness allowing you to see with your own eyes. Must-have for nighttime operations. An affordable alternative to the Night Vision Goggles.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (367,18,'INCPPRCLP','The Incredible Versatile Paperclip','image.gif',1.49,"This 0. 01 oz piece of metal is the most versatile item in any respectable spy's toolbox and will come in handy in all sorts of situations. Serves as a wily lock pick, aerodynamic projectile (used in conjunction with Multi-Purpose Rubber Band), or escape-proof finger cuffs. Best of all, small size and pliability means it fits anywhere undetected. Order several today!") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (368,16,'DNTRPR','Toaster Boat','image.gif',19999.98,"Turn breakfast into a high-speed chase! In addition to toasting bagels and breakfast pastries, this inconspicuous toaster turns into a speedboat at the touch of a button. Boasting top speeds of 60 knots and an ultra-quiet motor, this valuable item will get you where you need to be ... fast! Best of all, Toaster Boat is easily repaired using a Versatile Paperclip or a standard butter knife. Manufacturer's Warning: Do not submerge electrical items.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (370,17,'TGFDA','Multi-Purpose Towelette','image.gif',12.99,"Don't leave home without your monogrammed towelette! Made from lightweight, quick-dry fabric, this piece of equipment has more uses in a spy's day than a Swiss Army knife. The perfect all-around tool while undercover in the locker room: serves as towel, shield, disguise, sled, defensive weapon, whip and emergency food source. Handy bail gear for the Toaster Boat. Monogram included with purchase price.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (371,18,'WOWPEN','Mighty Mighty Pen','image.gif',129.99,'Some spies claim this item is more powerful than a sword. After examining the titanium frame, built-in blowtorch, and Nerf dart-launcher, we tend to agree! ') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (372,20,'ICNCU','Perfect-Vision Glasses','image.gif',129.99,'Avoid painful and potentially devastating laser eye surgery and contact lenses. Cheaper and more effective than a visit to the optometrist, these Perfect-Vision Glasses simply slide over nose and eyes and hook on ears. Suddenly you have 20/20 vision! Glasses also function as HUD (Heads Up Display) for most European sports cars manufactured after 1992.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (373,17,'LKARCKT','Pocket Protector Rocket Pack','image.gif',1.99,"Any debonair spy knows that this accoutrement is coming back in style. Flawlessly protects the pockets of your short-sleeved oxford from unsightly ink and pencil marks. But there's more! Strap it on your back and it doubles as a rocket pack. Provides enough turbo-thrust for a 250-pound spy or a passel of small children. Maximum travel radius: 3000 miles.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (374,15,'DNTGCGHT','Counterfeit Creation Wallet','image.gif',999.99,"Don't be caught penniless in Prague without this hot item! Instantly creates replicas of most common currencies! Simply place rocks and water in the wallet, close, open up again, and remove your legal tender!") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (375,16,'WRLD00','Global Navigational System','image.gif',29.99,'No spy should be without one of these premium devices. Determine your exact location with a quick flick of the finger. Calculate destination points by spinning, closing your eyes, and stopping it with your index finger.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (376,15,'CITSME9','Cloaking Device','image.gif',9999.99,'Worried about detection on your covert mission? Confuse mission-threatening forces with this cloaking device. Powerful new features include string-activated pre-programmed phrases such as "Danger! Danger!", "Reach for the sky!", and other anti-enemy expressions. Hyper-reactive karate chop action deters even the most persistent villain.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (377,15,'BME007','Indentity Confusion Device','image.gif',6.99,'Never leave on an undercover mission without our Identity Confusion Device! If a threatening person approaches, deploy the device and point toward the oncoming individual. The subject will fail to recognize you and let you pass unnoticed. Also works well on dogs.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (379,17,'SHADE01','Ultra Violet Attack Defender','image.gif',89.99,'Be safe and suave. A spy wearing this trendy article of clothing is safe from ultraviolet ray-gun attacks. Worn correctly, the Defender deflects rays from ultraviolet weapons back to the instigator. As a bonus, also offers protection against harmful solar ultraviolet rays, equivalent to SPF 50.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (378,17,'SQUKY1','Guard Dog Pacifier','image.gif',14.99,"Pesky guard dogs become a spy's best friend with the Guard Dog Pacifier. Even the most ferocious dogs suddenly act like cuddly kittens when they see this prop. Simply hold the device in front of any threatening dogs, shaking it mildly. For tougher canines, a quick squeeze emits an irresistible squeak that never fails to place the dog under your control.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (382,20,'CHEW99','Survival Bar','image.gif',6.99,"Survive for up to four days in confinement with this handy item. Disguised as a common eraser, it's really a high-calorie food bar. Stranded in hostile territory without hope of nourishment? Simply break off a small piece of the eraser and chew vigorously for at least twenty minutes. Developed by the same folks who created freeze-dried ice cream, powdered drink mix, and glow-in-the-dark shoelaces.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (402,20,'C00LCMB1','Telescoping Comb','image.gif',399.99,'Use the Telescoping Comb to track down anyone, anywhere! Deceptively simple, this is no normal comb. Flip the hidden switch and two telescoping lenses project forward creating a surprisingly powerful set of binoculars (50X). Night-vision add-on is available for midnight hour operations.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (384,19,'FF007','Eavesdrop Detector','image.gif',99.99,'Worried that counteragents have placed listening devices in your home or office? No problem! Use our bug-sweeping wiener to check your surroundings for unwanted surveillance devices. Just wave the frankfurter around the room ... when bugs are detected, this "foot-long" beeps! Comes complete with bun, relish, mustard, and headphones for privacy.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (385,16,'LNGWADN','Escape Cord','image.gif',13.99,"Any agent assigned to mountain terrain should carry this ordinary-looking extension cord ... except that it's really a rappelling rope! Pull quickly on each end to convert the electrical cord into a rope capable of safely supporting up to two agents. Comes in various sizes including Mt McKinley, Everest, and Kilimanjaro. WARNING: To prevent serious injury, be sure to disconnect from wall socket before use.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (386,17,'1MOR4ME','Cocktail Party Pal','image.gif',69.99,"Do your assignments have you flitting from one high society party to the next? Worried about keeping your wits about you as you mingle witih the champagne-and-caviar crowd? No matter how many drinks you're offered, you can safely operate even the most complicated heavy machinery as long as you use our model 1MOR4ME alcohol-neutralizing coaster. Simply place the beverage glass on the patented circle to eliminate any trace of alcohol in the drink.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (387,20,'SQRTME1','Remote Foliage Feeder','image.gif',9.99,'Even spies need to care for their office plants. With this handy remote watering device, you can water your flowers as a spy should, from the comfort of your chair. Water your plants from up to 50 feet away. Comes with an optional aiming system that can be mounted to the top for improved accuracy.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (388,20,'ICUCLRLY00','Contact Lenses','image.GIF',59.99,'Traditional binoculars and night goggles can be bulky, especially for assignments in confined areas. The problem is solved with these patent-pending contact lenses, which give excellent visibility up to 100 miles. New feature: now with a night vision feature that permits you to see in complete darkness! Contacts now come in a variety of fashionable colors for coordinating with your favorite ensembles.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (389,20,'OPNURMIND','Telekinesis Spoon','image.gif',2.99,'Learn to move things with your mind! Broaden your mental powers using this training device to hone telekinesis skills. Simply look at the device, concentrate, and repeat "There is no spoon" over and over.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (390,19,'ULOST007','Rubber Stamp Beacon','image.gif',129.99,"With the Rubber Stamp Beacon, you'll never get lost on your missions again. As you proceed through complicated terrain, stamp a stationary object with this device. Once an object has been stamped, the stamp's patented ink will emit a signal that can be detected up to 153.2 miles away by the receiver embedded in the device's case. WARNING: Do not expose ink to water.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (391,17,'BSUR2DUC','Bullet Proof Facial Tissue','image.gif',79.99,'Being a spy can be dangerous work. Our patented Bulletproof Facial Tissue gives a spy confidence that any bullets in the vicinity risk-free. Unlike traditional bulletproof devices, these lightweight tissues have amazingly high tensile strength. To protect the upper body, simply place a tissue in your shirt pocket. To protect the lower body, place a tissue in your pants pocket. If you do not have any pockets, be sure to check out our Bulletproof Tape. 100 tissues per box. WARNING: Bullet must not be moving for device to successfully stop penetration.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (393,20,'NOBOOBOO4U','Speed Bandages','image.GIF',3.99,'Even spies make mistakes. Barbed wire and guard dogs pose a threat of injury for the active spy. Use our special bandages on cuts and bruises to rapidly heal the injury. Depending on the severity of the wound, the bandages can take between 10 to 30 minutes to completely heal the injury.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (394,15,'BHONST93','Correction Fluid','image.gif',1.99,"Disguised as typewriter correction fluid, this scientific truth serum forces subjects to correct anything not perfectly true. Simply place a drop of the special correction fluid on the tip of the subject's nose. Within seconds, the suspect will automatically correct every lie. Effects from Correction Fluid last approximately 30 minutes per drop. WARNING: Discontinue use if skin appears irritated.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (396,19,'BPRECISE00','Dilemma Resolution Device','image.gif',11.99,'Facing a brick wall? Stopped short at a long, sheer cliff wall? Carry our handy lightweight calculator for just these emergencies. Quickly enter in your dilemma and the calculator spews out the best solutions to the problem. Manufacturer Warning: Use at own risk. Suggestions may lead to adverse outcomes.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (397,14,'LSRPTR1','Nonexplosive Cigar','397.gif',29.99,'Contrary to popular spy lore, not all cigars owned by spies explode! Best used during mission briefings, our Nonexplosive Cigar is really a cleverly-disguised, top-of-the-line, precision laser pointer. Make your next presentation a hit.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (399,20,'QLT2112','Document Transportation System','image.gif',299.99,"Keep your stolen Top Secret documents in a place they'll never think to look! This patent leather briefcase has multiple pockets to keep documents organized. Top quality craftsmanship to last a lifetime.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (400,15,'THNKDKE1','Hologram Cufflinks','image.gif',799.99,"Just point, and a turn of the wrist will project a hologram of you up to 100 yards away. Sneaking past guards will be child's play when you've sent them on a wild goose chase. Note: Hologram adds ten pounds to your appearance.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (401,14,'TCKLR1','Fake Moustache Translator','401.gif',599.99,'Fake Moustache Translator attaches between nose and mouth to double as a language translator and identity concealer. Sophisticated electronics translate your voice into the desired language. Wriggle your nose to toggle between Spanish, English, French, and Arabic. Excellent on diplomatic missions.') +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (404,14,'JWLTRANS6','Interpreter Earrings','404.gif',459.99,"The simple elegance of our stylish monosex earrings accents any wardrobe, but their clean lines mask the sophisticated technology within. Twist the lower half to engage a translator function that intercepts spoken words in any language and converts them to the wearer's native tongue. Warning: do not use in conjunction with our Fake Moustache Translator product, as the resulting feedback loop makes any language sound like Pig Latin.") +INSERT INTO Products (ProductID,CategoryID,ModelNumber,ModelName,ProductImage,UnitCost,Description) VALUES (406,19,'GRTWTCH9','Multi-Purpose Watch','image.gif',399.99,'In the tradition of famous spy movies, the Multi Purpose Watch comes with every convenience! Installed with lighter, TV, camera, schedule-organizing software, MP3 player, water purifier, spotlight, and tire pump. Special feature: Displays current date and time. Kitchen sink add-on will be available in the fall of 2001.') + +GO + +SET IDENTITY_INSERT Products OFF +GO + +SET IDENTITY_INSERT Reviews ON +GO + +INSERT INTO Reviews (ReviewID,ProductID,CustomerName,CustomerEmail,Rating,Comments) VALUES (21,404,"Sarah Goodpenny","sg@ibuyspy.com",5,"Really smashing!  Don't know how I'd get by without them!") +INSERT INTO Reviews (ReviewID,ProductID,CustomerName,CustomerEmail,Rating,Comments) VALUES (22,378,"James Bondwell","jb@ibuyspy.com",3,"Well made, but only moderately effective.  Ouch!") +GO + + +CREATE PROCEDURE GetProducts AS +SELECT * FROM Products INNER JOIN Categories ON Products.CategoryID = Categories.CategoryID +GO + +CREATE PROCEDURE GetCategories AS +SELECT * FROM Categories +GO + + +SET IDENTITY_INSERT Reviews OFF +GO + +-- +-- EOF +-- diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl.sln b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl.sln new file mode 100644 index 0000000..bb6a56e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomControl", "CustomControl\CustomControl.csproj", "{729CF390-C328-46F8-8F76-2AE1DD52A7C1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomControlHost", "CustomControlHost\CustomControlHost.csproj", "{AC2978AB-2EEE-46E3-BC89-2138B2D1448F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {729CF390-C328-46F8-8F76-2AE1DD52A7C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {729CF390-C328-46F8-8F76-2AE1DD52A7C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {729CF390-C328-46F8-8F76-2AE1DD52A7C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {729CF390-C328-46F8-8F76-2AE1DD52A7C1}.Release|Any CPU.Build.0 = Release|Any CPU + {AC2978AB-2EEE-46E3-BC89-2138B2D1448F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC2978AB-2EEE-46E3-BC89-2138B2D1448F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC2978AB-2EEE-46E3-BC89-2138B2D1448F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC2978AB-2EEE-46E3-BC89-2138B2D1448F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl.suo b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl.suo new file mode 100644 index 0000000..7972369 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl.suo differ diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/CustomControl.csproj b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/CustomControl.csproj new file mode 100644 index 0000000..567317f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/CustomControl.csproj @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + 8.0.40607 + 2.0 + {729CF390-C328-46F8-8F76-2AE1DD52A7C1} + Library + CustomControl + CustomControl + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + Component + + + + ResXFileCodeGenerator + Resources.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/CustomControl.csproj.user b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/CustomControl.csproj.user new file mode 100644 index 0000000..97a12b8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/CustomControl.csproj.user @@ -0,0 +1,7 @@ + + + 8.0.40607 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/MyKey.snk b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/MyKey.snk new file mode 100644 index 0000000..a50d315 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/MyKey.snk differ diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/NumericTextBox.cs b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/NumericTextBox.cs new file mode 100644 index 0000000..6cd8ef7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/NumericTextBox.cs @@ -0,0 +1,27 @@ +#region Using directives + +using System; +using System.Windows.Forms; +using System.Collections.Generic; +using System.Text; + +#endregion + +namespace CustomControl +{ + public class NumericTextBox : TextBox + { + protected override void OnKeyPress(KeyPressEventArgs e) + { + // Ignore all non-control and non-numeric key presses. + if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar)) + { + e.Handled = true; + } + + // Call the implementation in the base TextBox class, + // which raises the KeyPress event. + base.OnKeyPress(e); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b2d122e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/AssemblyInfo.cs @@ -0,0 +1,30 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("CustomControl")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("CustomControl")] +[assembly: AssemblyCopyright("Copyright @ 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: AssemblyKeyFile(@"..\..\MyKey.snk")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Resources.cs new file mode 100644 index 0000000..07ae340 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Resources.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CustomControl.Properties +{ + using System; + using System.IO; + using System.Resources; + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources + { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager + { + get + { + if ((_resMgr == null)) + { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture + { + get + { + return _resCulture; + } + set + { + _resCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Settings.cs new file mode 100644 index 0000000..524e138 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Settings.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CustomControl.Properties +{ + public partial class Settings : System.Configuration.ApplicationSettingsBase + { + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + public static Settings Value + { + get + { + if ((Settings.m_Value == null)) + { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) + { + try + { + Settings.m_Value = new Settings(); + } + finally + { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Settings.settings new file mode 100644 index 0000000..4024694 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/bin/Debug/CustomControl.dll b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/bin/Debug/CustomControl.dll new file mode 100644 index 0000000..8724829 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControl/bin/Debug/CustomControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/CustomControlHost.csproj b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/CustomControlHost.csproj new file mode 100644 index 0000000..ed35321 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/CustomControlHost.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.40607 + 2.0 + {AC2978AB-2EEE-46E3-BC89-2138B2D1448F} + WinExe + CustomControlHost + CustomControlHost + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + Form + + + Form1.cs + + + + + ResXFileCodeGenerator + Resources.cs + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + + + + {729CF390-C328-46F8-8F76-2AE1DD52A7C1} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + CustomControl + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/CustomControlHost.csproj.user b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/CustomControlHost.csproj.user new file mode 100644 index 0000000..97a12b8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/CustomControlHost.csproj.user @@ -0,0 +1,7 @@ + + + 8.0.40607 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Form1.Designer.cs new file mode 100644 index 0000000..4c2e731 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Form1.Designer.cs @@ -0,0 +1,57 @@ +namespace CustomControlTest +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.numericTextBox1 = new CustomControl.NumericTextBox(); + this.SuspendLayout(); +// +// numericTextBox1 +// + this.numericTextBox1.Location = new System.Drawing.Point(13, 13); + this.numericTextBox1.Name = "numericTextBox1"; + this.numericTextBox1.TabIndex = 0; +// +// Form1 +// + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(248, 130); + this.Controls.Add(this.numericTextBox1); + this.Name = "Form1"; + this.Text = "Form1"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private CustomControl.NumericTextBox numericTextBox1; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Form1.cs b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Form1.cs new file mode 100644 index 0000000..2020b7c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Form1.cs @@ -0,0 +1,21 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Windows.Forms; + +#endregion + +namespace CustomControlTest +{ + partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Program.cs b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Program.cs new file mode 100644 index 0000000..3ebc081 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Program.cs @@ -0,0 +1,23 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +#endregion + +namespace CustomControlTest +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..36e43bd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("CustomControlTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("CustomControlTest")] +[assembly: AssemblyCopyright("Copyright @ 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Resources.cs new file mode 100644 index 0000000..12156cc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Resources.cs @@ -0,0 +1,61 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CustomControlHost.Properties { + using System; + using System.IO; + using System.Resources; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager { + get { + if ((_resMgr == null)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("CustomControlHost.Properties.Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture { + get { + return _resCulture; + } + set { + _resCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Settings.cs new file mode 100644 index 0000000..f3aae04 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Settings.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CustomControlHost.Properties { + + + sealed partial class Settings : System.Configuration.ApplicationSettingsBase { + + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + [System.Diagnostics.DebuggerNonUserCode()] + public static Settings Value { + get { + if ((Settings.m_Value == null)) { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) { + try { + Settings.m_Value = new Settings(); + } + finally { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Settings.settings new file mode 100644 index 0000000..1d214b6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/app.config b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/app.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/app.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControl.dll b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControl.dll new file mode 100644 index 0000000..8724829 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControlHost.exe b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControlHost.exe new file mode 100644 index 0000000..eee7560 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControlHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControlHost.exe.config b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControlHost.exe.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControlHost.exe.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControlHost.vshost.exe.config b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControlHost.vshost.exe.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter09/NumericTextBox/CustomControlHost/bin/Debug/CustomControlHost.vshost.exe.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewer.sln b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewer.sln new file mode 100644 index 0000000..5083174 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewer.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BitmapViewerHost", "BitmapViewerHost\BitmapViewerHost.csproj", "{B835B6B6-5A8A-40C1-B944-8F2A4AC241F5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BitmapViewerControl", "BitmapViewerControl\BitmapViewerControl.csproj", "{0032785D-BEAE-407A-850D-18535317FC67}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B835B6B6-5A8A-40C1-B944-8F2A4AC241F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B835B6B6-5A8A-40C1-B944-8F2A4AC241F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B835B6B6-5A8A-40C1-B944-8F2A4AC241F5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B835B6B6-5A8A-40C1-B944-8F2A4AC241F5}.Release|Any CPU.Build.0 = Release|Any CPU + {0032785D-BEAE-407A-850D-18535317FC67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0032785D-BEAE-407A-850D-18535317FC67}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0032785D-BEAE-407A-850D-18535317FC67}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0032785D-BEAE-407A-850D-18535317FC67}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewer.suo b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewer.suo new file mode 100644 index 0000000..bd168a2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewer.suo differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewer.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewer.cs new file mode 100644 index 0000000..793e125 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewer.cs @@ -0,0 +1,236 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.IO; +using System.Collections.Generic; + + +namespace BitmapViewerControl +{ + /// + /// Summary description for BitmapViewer. + /// + public class BitmapViewer : System.Windows.Forms.UserControl + { + internal System.Windows.Forms.Panel pnlPictures; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public BitmapViewer() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + // TODO: Add any initialization after the InitForm call + + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.pnlPictures = new System.Windows.Forms.Panel(); + this.SuspendLayout(); + // + // pnlPictures + // + this.pnlPictures.AutoScroll = true; + this.pnlPictures.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlPictures.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlPictures.Location = new System.Drawing.Point(1, 1); + this.pnlPictures.Name = "pnlPictures"; + this.pnlPictures.Size = new System.Drawing.Size(530, 218); + this.pnlPictures.TabIndex = 1; + // + // BitmapViewer + // + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.pnlPictures}); + this.DockPadding.All = 1; + this.Name = "BitmapViewer"; + this.Size = new System.Drawing.Size(532, 220); + this.ResumeLayout(false); + + } + #endregion + + public delegate void PictureSelectedDelegate(object sender, PictureSelectedEventArgs e); + public event PictureSelectedDelegate PictureSelected; + + // The directory that will be scanned for image. + private string directory=""; + + // Each picture box will be a square of dimension X dimension pixels. + private int dimension; + + // The space between the images and the top, left, and right sides. + private int border = 5; + + // The space between each image. + private int spacing; + + // The images that were found in the selected directory. + private List images = new List(); + + public string Directory + { + get + { + return directory; + } + set + { + directory = value; + GetImages(); + UpdateDisplay(); + } + } + + public int Dimension + { + get + { + return dimension; + } + set + { + dimension = value; + UpdateDisplay(); + } + } + + public int Spacing + { + get + { + return spacing; + } + set + { + spacing = value; + UpdateDisplay(); + } + } + + private void GetImages() + { + if (this.Directory != "" && this.directory != null) + { + images.Clear(); + DirectoryInfo dir = new DirectoryInfo(directory); + foreach (FileInfo file in dir.GetFiles("*.bmp")) + { + images.Add(new NamedImage(Bitmap.FromFile(file.FullName), file.FullName)); + } + } + } + + private void UpdateDisplay() + { + // Suspend layout to prevent multiple window refreshes. + pnlPictures.SuspendLayout(); + + // Clear the current display. + foreach (Control ctrl in pnlPictures.Controls) + { + ctrl.Dispose(); + } + pnlPictures.Controls.Clear(); + + // Row and Col will track the current position where pictures are + // being inserted. They begin at the top-right corner. + int row = border, col = border; + + // Iterate through the Images collection, and create PictureBox controls. + foreach (NamedImage image in images) + { + PictureBox pic = new PictureBox(); + pic.Image = image.Image; + pic.Tag = image.FileName; + pic.Size = new Size(dimension, dimension); + pic.Location = new Point(col, row); + pic.BorderStyle = BorderStyle.FixedSingle; + + // StrechImage mode gives us the "thumbnail" ability. + pic.SizeMode = PictureBoxSizeMode.StretchImage; + + // Display the picture. + pnlPictures.Controls.Add(pic); + + // Move to the next column. + col += dimension + spacing; + + // Handle the event. + pic.Click += new EventHandler(this.pic_Click); + + // Move to next line if no more pictures will fit. + if ((col + dimension + spacing + border) > this.Width) + { + col = border; + row += dimension + spacing; + } + } + pnlPictures.ResumeLayout(); + } + + public void RefreshImages() + { + GetImages(); + UpdateDisplay(); + } + + protected override void OnSizeChanged(System.EventArgs e) + { + UpdateDisplay(); + base.OnSizeChanged(e); + } + + private PictureBox picSelected; + + private void pic_Click(object sender, System.EventArgs e) + { + // Clear the border style from the last selected picture box. + if (picSelected != null) + { + picSelected.BorderStyle = BorderStyle.FixedSingle; + } + + // Get the new selection. + picSelected = (PictureBox)sender; + picSelected.BorderStyle = BorderStyle.Fixed3D; + + // Fire the selection event. + PictureSelectedEventArgs args = new + PictureSelectedEventArgs((string)picSelected.Tag, picSelected.Image); + if (PictureSelected != null) + { + PictureSelected(this, args); + } + + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewer.resx b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewer.resx new file mode 100644 index 0000000..ac3985e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewer.resx @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + + BitmapViewer + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewerControl.csproj b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewerControl.csproj new file mode 100644 index 0000000..9e5f649 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewerControl.csproj @@ -0,0 +1,114 @@ + + + Local + 8.0.40607 + 2.0 + {0032785D-BEAE-407A-850D-18535317FC67} + Debug + AnyCPU + + + + + BitmapViewerControl + + + JScript + Grid + IE50 + false + Library + BitmapViewerControl + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + Code + + + UserControl + + + UserControl + + + + BitmapViewer.cs + + + ImprovedBitmapViewer.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewerControl.csproj.user b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewerControl.csproj.user new file mode 100644 index 0000000..fbc1b23 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/BitmapViewerControl.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/ImprovedBitmapViewer.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/ImprovedBitmapViewer.cs new file mode 100644 index 0000000..059e61a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/ImprovedBitmapViewer.cs @@ -0,0 +1,254 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.IO; +using System.Threading; +using System.Collections.Generic; + +namespace BitmapViewerControl +{ + /// + /// Summary description for BitmapViewer. + /// + public class ImprovedBitmapViewer : System.Windows.Forms.UserControl + { + internal System.Windows.Forms.Panel pnlPictures; + private FlowLayoutPanel pnlFlow; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public ImprovedBitmapViewer() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + // TODO: Add any initialization after the InitForm call + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.pnlPictures = new System.Windows.Forms.Panel(); + this.pnlFlow = new System.Windows.Forms.FlowLayoutPanel(); + this.pnlPictures.SuspendLayout(); + this.SuspendLayout(); + // + // pnlPictures + // + this.pnlPictures.AutoScroll = true; + this.pnlPictures.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pnlPictures.Controls.Add(this.pnlFlow); + this.pnlPictures.Dock = System.Windows.Forms.DockStyle.Fill; + this.pnlPictures.Location = new System.Drawing.Point(1, 1); + this.pnlPictures.Name = "pnlPictures"; + this.pnlPictures.Size = new System.Drawing.Size(530, 218); + this.pnlPictures.TabIndex = 1; + // + // pnlFlow + // + this.pnlFlow.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlFlow.AutoScroll = true; + this.pnlFlow.Location = new System.Drawing.Point(0, 0); + this.pnlFlow.Name = "pnlFlow"; + this.pnlFlow.Size = new System.Drawing.Size(523, 211); + this.pnlFlow.TabIndex = 0; + // + // ImprovedBitmapViewer + // + this.Controls.Add(this.pnlPictures); + this.Name = "ImprovedBitmapViewer"; + this.Padding = new System.Windows.Forms.Padding(1); + this.Size = new System.Drawing.Size(532, 220); + this.pnlPictures.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + public delegate void PictureSelectedDelegate(object sender, PictureSelectedEventArgs e); + public event PictureSelectedDelegate PictureSelected; + + // The directory that will be scanned for image. + private string directory=""; + + // Each picture box will be a square of dimension X dimension pixels. + private int dimension; + + // The space between the images and the top, left, and right sides. + private int border = 5; + + // The space between each image. + private int spacing; + + // The images that were found in the selected directory. + private List images = new List(); + + public string Directory + { + get + { + return directory; + } + } + + public void StartLoadingImages(string directory) + { + this.directory = directory; + GetImages(); + } + + public int Dimension + { + get + { + return dimension; + } + set + { + dimension = value; + } + } + + public int Spacing + { + get + { + return spacing; + } + set + { + spacing = value; + } + } + + private void GetImages() + { + // Create a delegate that points to the method + // that you want to run asynchronously. + // The MethodInvoker delegate works because it + // matches the signature (no parameters or return value). + MethodInvoker asyncTask = new MethodInvoker(this.ReadImagesFromFile); + + // Borrow a thread from the CLR. + asyncTask.BeginInvoke(null, null); + } + + private void ReadImagesFromFile() + { + lock (images) + { + if (directory != "") + { + images.Clear(); + Image thumbnail; + DirectoryInfo dir = new DirectoryInfo(directory); + foreach (FileInfo file in dir.GetFiles("*.bmp")) + { + thumbnail = Bitmap.FromFile(file.FullName).GetThumbnailImage( + Dimension, Dimension, null, IntPtr.Zero); + images.Add(new NamedImage(thumbnail, file.Name)); + } + } + } + + // Update the display on the UI thread. + pnlFlow.Invoke(new MethodInvoker(this.UpdateDisplay)); + } + + private void UpdateDisplay() + { + // Suspend layout to prevent multiple window refreshes. + pnlFlow.SuspendLayout(); + + // Clear the current display. + foreach (Control ctrl in pnlFlow.Controls) + { + ctrl.Dispose(); + } + pnlFlow.Controls.Clear(); + + + // Row and Col will track the current position where pictures are + // being inserted. They begin at the top-right corner. + pnlFlow.Padding = new Padding(border); + + // Iterate through the Images collection, and create PictureBox controls. + lock (images) + { + foreach (NamedImage image in images) + { + PictureBox pic = new PictureBox(); + pic.Image = image.Image; + pic.Tag = image.FileName; + pic.Size = new Size(dimension, dimension); + pic.Margin = new Padding(spacing); + pic.BorderStyle = BorderStyle.FixedSingle; + + // Display the picture. + pnlFlow.Controls.Add(pic); + + // Handle the event. + pic.Click += new EventHandler(this.pic_Click); + } + } + pnlFlow.ResumeLayout(); + } + + public void RefreshImages() + { + GetImages(); + } + + private PictureBox picSelected; + + private void pic_Click(object sender, System.EventArgs e) + { + // Clear the border style from the last selected picture box. + if (picSelected != null) + { + picSelected.BorderStyle = BorderStyle.FixedSingle; + } + + // Get the new selection. + picSelected = (PictureBox)sender; + picSelected.BorderStyle = BorderStyle.Fixed3D; + + // Fire the selection event. + PictureSelectedEventArgs args = new + PictureSelectedEventArgs((string)picSelected.Tag, picSelected.Image); + if (PictureSelected != null) + { + PictureSelected(this, args); + } + } + + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/ImprovedBitmapViewer.resx b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/ImprovedBitmapViewer.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/ImprovedBitmapViewer.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/NamedImage.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/NamedImage.cs new file mode 100644 index 0000000..b6d1929 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/NamedImage.cs @@ -0,0 +1,58 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +#endregion + +namespace BitmapViewerControl +{ + internal class NamedImage + { + private Image image; + public Image Image + { + get { return image; } + set { image = value; } + } + + private string fileName; + public string FileName + { + get { return fileName; } + set { fileName = value; } + } + + public NamedImage(Image image, string fileName) + { + this.Image = image; + this.FileName = fileName; + } + } + + public class PictureSelectedEventArgs : EventArgs + { + private Image image; + public Image Image + { + get { return image; } + set { image = value; } + } + + private string fileName; + public string FileName + { + get { return fileName; } + set { fileName = value; } + } + + public PictureSelectedEventArgs(String fileName, Image image) + { + FileName = fileName; + Image = image; + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/bin/Debug/BitmapViewerControl.dll b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/bin/Debug/BitmapViewerControl.dll new file mode 100644 index 0000000..e025c0a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/bin/Debug/BitmapViewerControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/bin/Release/BitmapViewerControl.dll b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/bin/Release/BitmapViewerControl.dll new file mode 100644 index 0000000..2445f46 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerControl/bin/Release/BitmapViewerControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/App.ico b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapHost.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapHost.cs new file mode 100644 index 0000000..61c52f9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapHost.cs @@ -0,0 +1,99 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +namespace BitmapViewerHost +{ + /// + /// Summary description for Form1. + /// + public class BitmapHost : System.Windows.Forms.Form + { + private BitmapViewerControl.BitmapViewer bitmapViewer1; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public BitmapHost() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bitmapViewer1 = new BitmapViewerControl.BitmapViewer(); + this.SuspendLayout(); + // + // bitmapViewer1 + // + this.bitmapViewer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.bitmapViewer1.Dimension = 80; + this.bitmapViewer1.Directory = null; + this.bitmapViewer1.Location = new System.Drawing.Point(3, 3); + this.bitmapViewer1.Name = "bitmapViewer1"; + this.bitmapViewer1.Padding = new System.Windows.Forms.Padding(1); + this.bitmapViewer1.Size = new System.Drawing.Size(314, 259); + this.bitmapViewer1.Spacing = 10; + this.bitmapViewer1.TabIndex = 0; + this.bitmapViewer1.PictureSelected += new BitmapViewerControl.BitmapViewer.PictureSelectedDelegate(this.bitmapViewer1_PictureSelected); + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(320, 266); + this.Controls.Add(this.bitmapViewer1); + this.Name = "Form1"; + this.Text = "BitmapViewer"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + #endregion + + + private void Form1_Load(object sender, System.EventArgs e) + { + bitmapViewer1.Directory = Application.StartupPath; + } + + private void bitmapViewer1_PictureSelected(object sender, BitmapViewerControl.PictureSelectedEventArgs e) + { + MessageBox.Show("You chose " + System.IO.Path.GetFileName(e.FileName)); + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapHost.resx b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapHost.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapHost.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapViewerHost.csproj b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapViewerHost.csproj new file mode 100644 index 0000000..deeef5f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapViewerHost.csproj @@ -0,0 +1,134 @@ + + + Local + 8.0.50727 + 2.0 + {B835B6B6-5A8A-40C1-B944-8F2A4AC241F5} + Debug + AnyCPU + App.ico + + + BitmapViewerHost + + + JScript + Grid + IE50 + false + WinExe + BitmapViewerHost + BitmapViewerHost.BitmapHost + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + Form + + + Form + + + ImprovedBitmapHost.cs + + + Form + + + Menu.cs + + + + BitmapHost.cs + Designer + + + Designer + ImprovedBitmapHost.cs + + + Menu.cs + Designer + + + + + + {0032785D-BEAE-407A-850D-18535317FC67} + BitmapViewerControl + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapViewerHost.csproj.user b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapViewerHost.csproj.user new file mode 100644 index 0000000..a52cce6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/BitmapViewerHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 07\BitmapViewerControl\bin\Debug\;D:\Matthew\Writing\Books\Complete\Programming .NET User Interfaces\C#\Code\Chapter 07\BitmapViewerControl\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/ImprovedBitmapHost.Designer.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/ImprovedBitmapHost.Designer.cs new file mode 100644 index 0000000..ef4abe6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/ImprovedBitmapHost.Designer.cs @@ -0,0 +1,64 @@ +namespace BitmapViewerHost +{ + partial class ImprovedBitmapHost + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.bitmapViewer1 = new BitmapViewerControl.ImprovedBitmapViewer(); + this.SuspendLayout(); + // + // bitmapViewer1 + // + this.bitmapViewer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.bitmapViewer1.Dimension = 80; + this.bitmapViewer1.Location = new System.Drawing.Point(3, 3); + this.bitmapViewer1.Name = "bitmapViewer1"; + this.bitmapViewer1.Padding = new System.Windows.Forms.Padding(1); + this.bitmapViewer1.Size = new System.Drawing.Size(450, 220); + this.bitmapViewer1.Spacing = 10; + this.bitmapViewer1.TabIndex = 0; + // + // ImprovedBitmapHost + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(455, 272); + this.Controls.Add(this.bitmapViewer1); + this.Name = "ImprovedBitmapHost"; + this.Text = "ImprovedBitmapHost"; + this.Load += new System.EventHandler(this.ImprovedBitmapHost_Load); + this.ResumeLayout(false); + + } + + #endregion + + private BitmapViewerControl.ImprovedBitmapViewer bitmapViewer1; + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/ImprovedBitmapHost.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/ImprovedBitmapHost.cs new file mode 100644 index 0000000..c8666ce --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/ImprovedBitmapHost.cs @@ -0,0 +1,35 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +#endregion + +namespace BitmapViewerHost +{ + partial class ImprovedBitmapHost : Form + { + public ImprovedBitmapHost() + { + InitializeComponent(); + } + + private void bitmapViewer1_PictureSelected(object sender, BitmapViewerControl.PictureSelectedEventArgs e) + { + + } + + private void ImprovedBitmapHost_Load(object sender, EventArgs e) + { + bitmapViewer1.StartLoadingImages(Application.StartupPath); + } + + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/ImprovedBitmapHost.resx b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/ImprovedBitmapHost.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/ImprovedBitmapHost.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Menu.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Menu.cs new file mode 100644 index 0000000..9d61952 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace BitmapViewerHost +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("BitmapViewerHost." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Menu.designer.cs new file mode 100644 index 0000000..fcc8302 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Menu.designer.cs @@ -0,0 +1,74 @@ +namespace BitmapViewerHost +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(167, 23); + this.button1.TabIndex = 0; + this.button1.Text = "ProgressTest"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(167, 23); + this.button2.TabIndex = 1; + this.button2.Text = "AutoProgressTest"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(197, 215); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Menu.resx b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Program.cs b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Program.cs new file mode 100644 index 0000000..5b7df81 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace BitmapViewerHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/BitmapViewerControl.dll b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/BitmapViewerControl.dll new file mode 100644 index 0000000..e025c0a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/BitmapViewerControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/BitmapViewerHost.exe b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/BitmapViewerHost.exe new file mode 100644 index 0000000..4c755b4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/BitmapViewerHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/FeatherTexture.bmp b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/FeatherTexture.bmp new file mode 100644 index 0000000..a991dd5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/FeatherTexture.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Gone Fishing.bmp b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Gone Fishing.bmp new file mode 100644 index 0000000..402def8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Gone Fishing.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Greenstone.bmp b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Greenstone.bmp new file mode 100644 index 0000000..6e7731d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Greenstone.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Prairie Wind.bmp b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Prairie Wind.bmp new file mode 100644 index 0000000..dd95b69 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Prairie Wind.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Rhododendron.bmp b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Rhododendron.bmp new file mode 100644 index 0000000..047f840 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Rhododendron.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/River Sumida.bmp b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/River Sumida.bmp new file mode 100644 index 0000000..606f167 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/River Sumida.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Santa Fe Stucco.bmp b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Santa Fe Stucco.bmp new file mode 100644 index 0000000..e99f5a6 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Santa Fe Stucco.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Soap Bubbles.bmp b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Soap Bubbles.bmp new file mode 100644 index 0000000..f4e47bb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/Soap Bubbles.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/WALLPAPR.BMP b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/WALLPAPR.BMP new file mode 100644 index 0000000..72fcdce Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/BitmapViewer/BitmapViewerHost/bin/Debug/WALLPAPR.BMP differ diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/Progress.sln b/Pro Windows Forms 2.0/Chapter10/Progress/Progress.sln new file mode 100644 index 0000000..cc26c64 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/Progress.sln @@ -0,0 +1,28 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProgressControl", "ProgressBarControl\ProgressControl.csproj", "{374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProgressHost", "ProgressBarHost\ProgressHost.csproj", "{1760F81F-8541-42C6-9649-A4FDFAD6C2B2}" + ProjectSection(ProjectDependencies) = postProject + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3} = {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Release|Any CPU.Build.0 = Release|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/Progress.suo b/Pro Windows Forms 2.0/Chapter10/Progress/Progress.suo new file mode 100644 index 0000000..b1b1e7b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Progress/Progress.suo differ diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/AutoProgress.cs b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/AutoProgress.cs new file mode 100644 index 0000000..e1d31fc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/AutoProgress.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace ProgressBarControl +{ + /// + /// Summary description for Progress. + /// + public class AutoProgress : System.Windows.Forms.UserControl + { + internal System.Windows.Forms.ProgressBar Bar; + internal Timer tmrIncrementBar; + private IContainer components; + + public AutoProgress() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + // TODO: Add any initialization after the InitForm call + + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.Bar = new System.Windows.Forms.ProgressBar(); + this.tmrIncrementBar = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); +// +// Bar +// + this.Bar.Dock = System.Windows.Forms.DockStyle.Fill; + this.Bar.Location = new System.Drawing.Point(0, 0); + this.Bar.Name = "Bar"; + this.Bar.Size = new System.Drawing.Size(164, 42); + this.Bar.TabIndex = 2; +// +// tmrIncrementBar +// + this.tmrIncrementBar.Tick += new System.EventHandler(this.tmrIncrementBar_Tick); +// +// AutoProgress +// + this.Controls.Add(this.Bar); + this.Name = "AutoProgress"; + this.Size = new System.Drawing.Size(164, 42); + this.ResumeLayout(false); + + } + #endregion + + private int percentPerSecond = 5; + public int PercentPerSecond + { + get + { + return percentPerSecond; + } + set + { + if (value < 0) + { + throw new ArgumentException("Progress cannot go backward."); + } + else if (value == 0) + { + throw new ArgumentException("Progress must go on."); + } + percentPerSecond = value; + } + } + + public void Start() + { + // The maximum isn't controls how fine-grained + // the progress bar is. 200 is a good choice. + Bar.Maximum = 200; + + // Calculation is based on a timer that + // fires 10 times per second (an interval of 100). + tmrIncrementBar.Interval = 100; + decimal step = Math.Round((decimal)Bar.Maximum * PercentPerSecond / 1000); + Bar.Step = (int)step; + + // Reset the progress and start counting. + Bar.Value = 0; + tmrIncrementBar.Start(); + } + + public void Stop() + { + tmrIncrementBar.Stop(); + Bar.Value = 0; + } + + public void Finish() + { + tmrIncrementBar.Stop(); + Bar.Value = Bar.Maximum; + } + + private void tmrIncrementBar_Tick(object sender, EventArgs e) + { + Bar.PerformStep(); + if (Bar.Value == Bar.Maximum) + { + Bar.Value = 0; + } + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/AutoProgress.resx b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/AutoProgress.resx new file mode 100644 index 0000000..379c88c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/AutoProgress.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + + Assembly + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/Progress.cs b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/Progress.cs new file mode 100644 index 0000000..6f9ad66 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/Progress.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace ProgressBarControl +{ + /// + /// Summary description for Progress. + /// + public class Progress : System.Windows.Forms.UserControl + { + internal System.Windows.Forms.Label lblProgress; + internal System.Windows.Forms.ProgressBar Bar; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Progress() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + // TODO: Add any initialization after the InitForm call + + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblProgress = new System.Windows.Forms.Label(); + this.Bar = new System.Windows.Forms.ProgressBar(); + this.SuspendLayout(); + // + // lblProgress + // + this.lblProgress.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.lblProgress.Location = new System.Drawing.Point(5, 46); + this.lblProgress.Name = "lblProgress"; + this.lblProgress.Size = new System.Drawing.Size(152, 16); + this.lblProgress.TabIndex = 3; + this.lblProgress.Text = "0% Done"; + this.lblProgress.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // Bar + // + this.Bar.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.Bar.Location = new System.Drawing.Point(5, 6); + this.Bar.Name = "Bar"; + this.Bar.Size = new System.Drawing.Size(154, 32); + this.Bar.TabIndex = 2; + // + // Progress + // + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.lblProgress, + this.Bar}); + this.Name = "Progress"; + this.Size = new System.Drawing.Size(164, 68); + this.ResumeLayout(false); + + } + #endregion + public int Value + { + get + { + return Bar.Value; + } + set + { + Bar.Value = value; + UpdateLabel(); + } + } + + public int Maximum + { + get + { + return Bar.Maximum; + } + set + { + Bar.Maximum = value; + } + } + + public int Step + { + get + { + return Bar.Step; + } + set + { + Bar.Step = value; + } + } + + public void PerformStep() + { + Bar.PerformStep(); + UpdateLabel(); + } + + private void UpdateLabel() + { + lblProgress.Text = (Math.Round((decimal)(Bar.Value * 100) / + Bar.Maximum)).ToString(); + lblProgress.Text += "% Done"; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/Progress.resx b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/Progress.resx new file mode 100644 index 0000000..1bd4ec9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/Progress.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/ProgressControl.csproj b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/ProgressControl.csproj new file mode 100644 index 0000000..8dea4da --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/ProgressControl.csproj @@ -0,0 +1,111 @@ + + + Local + 8.0.40607 + 2.0 + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3} + Debug + AnyCPU + + + + + ProgressBarControl + + + JScript + Grid + IE50 + false + Library + ProgressBarControl + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + UserControl + + + UserControl + + + AutoProgress.cs + + + Progress.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/ProgressControl.csproj.user b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/ProgressControl.csproj.user new file mode 100644 index 0000000..fbc1b23 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/ProgressControl.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/bin/Debug/ProgressBarControl.dll b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/bin/Debug/ProgressBarControl.dll new file mode 100644 index 0000000..55f5483 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/bin/Debug/ProgressBarControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/bin/Release/ProgressBarControl.dll b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/bin/Release/ProgressBarControl.dll new file mode 100644 index 0000000..e785454 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarControl/bin/Release/ProgressBarControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/App.ico b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/AutoProgressTest.Designer.cs b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/AutoProgressTest.Designer.cs new file mode 100644 index 0000000..35d718f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/AutoProgressTest.Designer.cs @@ -0,0 +1,80 @@ +namespace ProgressHost +{ + partial class AutoProgressTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdStart = new System.Windows.Forms.Button(); + this.cmdStop = new System.Windows.Forms.Button(); + this.autoProgress = new ProgressBarControl.AutoProgress(); + this.SuspendLayout(); +// +// cmdStart +// + this.cmdStart.Location = new System.Drawing.Point(62, 165); + this.cmdStart.Name = "cmdStart"; + this.cmdStart.TabIndex = 0; + this.cmdStart.Text = "Start"; + this.cmdStart.Click += new System.EventHandler(this.cmdStart_Click); +// +// cmdStop +// + this.cmdStop.Location = new System.Drawing.Point(144, 165); + this.cmdStop.Name = "cmdStop"; + this.cmdStop.TabIndex = 1; + this.cmdStop.Text = "Stop"; + this.cmdStop.Click += new System.EventHandler(this.cmdStop_Click); +// +// autoProgress +// + this.autoProgress.Location = new System.Drawing.Point(62, 36); + + this.autoProgress.Name = "autoProgress"; + this.autoProgress.PercentPerSecond = 13; + this.autoProgress.Size = new System.Drawing.Size(164, 40); + this.autoProgress.TabIndex = 2; +// +// AutoProgressTest +// + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(287, 204); + this.Controls.Add(this.autoProgress); + this.Controls.Add(this.cmdStop); + this.Controls.Add(this.cmdStart); + this.Name = "AutoProgressTest"; + this.Text = "AutoProgressTest"; + this.Load += new System.EventHandler(this.AutoProgressTest_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button cmdStart; + private System.Windows.Forms.Button cmdStop; + private ProgressBarControl.AutoProgress autoProgress; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/AutoProgressTest.cs b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/AutoProgressTest.cs new file mode 100644 index 0000000..747433d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/AutoProgressTest.cs @@ -0,0 +1,38 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +#endregion + +namespace ProgressHost +{ + partial class AutoProgressTest : Form + { + public AutoProgressTest() + { + InitializeComponent(); + } + + private void AutoProgressTest_Load(object sender, EventArgs e) + { + + } + + private void cmdStart_Click(object sender, EventArgs e) + { + autoProgress.Start(); + } + + private void cmdStop_Click(object sender, EventArgs e) + { + autoProgress.Stop(); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Menu.cs b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Menu.cs new file mode 100644 index 0000000..b0d9a12 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace ProgressHost +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("ProgressHost." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Menu.designer.cs new file mode 100644 index 0000000..a10e1eb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Menu.designer.cs @@ -0,0 +1,74 @@ +namespace ProgressHost +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(167, 23); + this.button1.TabIndex = 0; + this.button1.Text = "ProgressTest"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(167, 23); + this.button2.TabIndex = 1; + this.button2.Text = "AutoProgressTest"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(197, 215); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Menu.resx b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Program.cs b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Program.cs new file mode 100644 index 0000000..2797d0d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ProgressHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressHost.csproj b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressHost.csproj new file mode 100644 index 0000000..e960309 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressHost.csproj @@ -0,0 +1,128 @@ + + + Local + 8.0.50727 + 2.0 + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2} + Debug + AnyCPU + App.ico + + + ProgressBarHost + + + JScript + Grid + IE50 + false + WinExe + ProgressBarHost + ProgressHost.Program + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + + Form + + + AutoProgressTest.cs + + + Form + + + Form + + + Menu.cs + + + + ProgressTest.cs + Designer + + + Menu.cs + Designer + + + + + + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3} + ProgressControl + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressHost.csproj.user b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressHost.csproj.user new file mode 100644 index 0000000..2f664cd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 07\ProgressBarControl\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressTest.cs b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressTest.cs new file mode 100644 index 0000000..77e00a1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressTest.cs @@ -0,0 +1,123 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +namespace ProgressHost +{ + /// + /// Summary description for Form1. + /// + public class ProgressTest : System.Windows.Forms.Form + { + internal System.Windows.Forms.Timer tmrIncrementBar; + private System.Windows.Forms.Button cmdStart; + private ProgressBarControl.Progress status; + private System.ComponentModel.IContainer components; + + public ProgressTest() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.status = new ProgressBarControl.Progress(); + this.tmrIncrementBar = new System.Windows.Forms.Timer(this.components); + this.cmdStart = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // status + // + this.status.Location = new System.Drawing.Point(12, 8); + this.status.Maximum = 100; + this.status.Name = "status"; + this.status.Size = new System.Drawing.Size(272, 88); + this.status.Step = 10; + this.status.TabIndex = 0; + this.status.Value = 0; + // + // tmrIncrementBar + // + this.tmrIncrementBar.Interval = 1000; + this.tmrIncrementBar.Tick += new System.EventHandler(this.tmrIncrementBar_Tick); + // + // cmdStart + // + this.cmdStart.Location = new System.Drawing.Point(104, 152); + this.cmdStart.Name = "cmdStart"; + this.cmdStart.Size = new System.Drawing.Size(92, 24); + this.cmdStart.TabIndex = 1; + this.cmdStart.Text = "Start"; + this.cmdStart.Click += new System.EventHandler(this.cmdStart_Click); + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(292, 194); + this.Controls.Add(this.cmdStart); + this.Controls.Add(this.status); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Progress Host"; + this.ResumeLayout(false); + + } + #endregion + + + + private void tmrIncrementBar_Tick(object sender, System.EventArgs e) + { + status.PerformStep(); + if (status.Maximum == status.Value) + { + tmrIncrementBar.Enabled = false; + } + + } + + private void cmdStart_Click(object sender, System.EventArgs e) + { + tmrIncrementBar.Enabled = false; + + status.Value = 0; + status.Maximum = 20; + status.Step = 1; + + tmrIncrementBar.Enabled = true; + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressTest.resx b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressTest.resx new file mode 100644 index 0000000..7887ec3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/ProgressTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Debug/ProgressBarControl.dll b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Debug/ProgressBarControl.dll new file mode 100644 index 0000000..55f5483 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Debug/ProgressBarControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Debug/ProgressBarHost.exe b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Debug/ProgressBarHost.exe new file mode 100644 index 0000000..ed7d245 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Debug/ProgressBarHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Release/ProgressBarControl.dll b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Release/ProgressBarControl.dll new file mode 100644 index 0000000..e785454 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Release/ProgressBarControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Release/ProgressBarHost.exe b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Release/ProgressBarHost.exe new file mode 100644 index 0000000..3a524b6 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Progress/ProgressBarHost/bin/Release/ProgressBarHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/Wizard.sln b/Pro Windows Forms 2.0/Chapter10/Wizard/Wizard.sln new file mode 100644 index 0000000..5d00ee4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/Wizard.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WizardComponent", "WizardComponent\WizardComponent.csproj", "{C96B15FA-A545-4C3B-B3FE-517C0B6E5EB8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WizardComponentTest", "WizardComponentTest\WizardComponentTest.csproj", "{EC6E21C2-75FC-4267-9D9B-39118F4FDBB3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C96B15FA-A545-4C3B-B3FE-517C0B6E5EB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C96B15FA-A545-4C3B-B3FE-517C0B6E5EB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C96B15FA-A545-4C3B-B3FE-517C0B6E5EB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C96B15FA-A545-4C3B-B3FE-517C0B6E5EB8}.Release|Any CPU.Build.0 = Release|Any CPU + {EC6E21C2-75FC-4267-9D9B-39118F4FDBB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC6E21C2-75FC-4267-9D9B-39118F4FDBB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC6E21C2-75FC-4267-9D9B-39118F4FDBB3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC6E21C2-75FC-4267-9D9B-39118F4FDBB3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/Wizard.suo b/Pro Windows Forms 2.0/Chapter10/Wizard/Wizard.suo new file mode 100644 index 0000000..d212548 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Wizard/Wizard.suo differ diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/IWizardItem.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/IWizardItem.cs new file mode 100644 index 0000000..06927a7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/IWizardItem.cs @@ -0,0 +1,22 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +#endregion + +namespace WizardComponent +{ + public interface IWizardItem + { + string HeaderTitle + { + get; + } + + Dictionary GetValues(); + void ApplyValues(Dictionary values); + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..13ef496 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WizardUserControl")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WizardUserControl")] +[assembly: AssemblyCopyright("Copyright @ 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Resources.cs new file mode 100644 index 0000000..84b24c0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Resources.cs @@ -0,0 +1,61 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WizardComponent.Properties { + using System; + using System.IO; + using System.Resources; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager { + get { + if ((_resMgr == null)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("WizardComponent.Properties.Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture { + get { + return _resCulture; + } + set { + _resCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Settings.cs new file mode 100644 index 0000000..f85fce0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Settings.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WizardComponent.Properties { + + + sealed partial class Settings : System.Configuration.ApplicationSettingsBase { + + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + [System.Diagnostics.DebuggerNonUserCode()] + public static Settings Value { + get { + if ((Settings.m_Value == null)) { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) { + try { + Settings.m_Value = new Settings(); + } + finally { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Settings.settings new file mode 100644 index 0000000..e9d595a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Wizard.Designer.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Wizard.Designer.cs new file mode 100644 index 0000000..3be0ff4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Wizard.Designer.cs @@ -0,0 +1,130 @@ +namespace WizardComponent +{ + partial class Wizard + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + foreach (System.Windows.Forms.Control ctrl in steps) + { + ctrl.Dispose(); + } + } + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Panel1 = new System.Windows.Forms.Panel(); + this.lblHeader = new System.Windows.Forms.Label(); + this.panelStep = new System.Windows.Forms.Panel(); + this.cmdNext = new System.Windows.Forms.Button(); + this.cmdPrev = new System.Windows.Forms.Button(); + this.Panel1.SuspendLayout(); + this.SuspendLayout(); + // + // Panel1 + // + this.Panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.Panel1.BackColor = System.Drawing.Color.White; + this.Panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Panel1.Controls.Add(this.lblHeader); + this.Panel1.Location = new System.Drawing.Point(4, 2); + this.Panel1.Name = "Panel1"; + this.Panel1.Size = new System.Drawing.Size(412, 68); + this.Panel1.TabIndex = 4; + // + // lblHeader + // + this.lblHeader.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblHeader.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblHeader.Location = new System.Drawing.Point(16, 1); + this.lblHeader.Name = "lblHeader"; + this.lblHeader.Size = new System.Drawing.Size(386, 65); + this.lblHeader.TabIndex = 0; + this.lblHeader.Text = "Header Text"; + this.lblHeader.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // panelStep + // + this.panelStep.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panelStep.AutoScroll = true; + this.panelStep.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelStep.Location = new System.Drawing.Point(4, 77); + this.panelStep.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2); + this.panelStep.Name = "panelStep"; + this.panelStep.Size = new System.Drawing.Size(412, 195); + this.panelStep.TabIndex = 6; + // + // cmdNext + // + this.cmdNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdNext.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNext.Location = new System.Drawing.Point(356, 279); + this.cmdNext.Name = "cmdNext"; + this.cmdNext.Size = new System.Drawing.Size(60, 28); + this.cmdNext.TabIndex = 8; + this.cmdNext.Text = "Next >"; + this.cmdNext.Click += new System.EventHandler(this.cmdNext_Click); + // + // cmdPrev + // + this.cmdPrev.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdPrev.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPrev.Location = new System.Drawing.Point(293, 279); + this.cmdPrev.Margin = new System.Windows.Forms.Padding(3, 1, 3, 3); + this.cmdPrev.Name = "cmdPrev"; + this.cmdPrev.Size = new System.Drawing.Size(60, 28); + this.cmdPrev.TabIndex = 9; + this.cmdPrev.Text = "< Prev"; + this.cmdPrev.Visible = false; + this.cmdPrev.Click += new System.EventHandler(this.cmdPrev_Click); + // + // Wizard + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(419, 315); + this.Controls.Add(this.cmdPrev); + this.Controls.Add(this.cmdNext); + this.Controls.Add(this.panelStep); + this.Controls.Add(this.Panel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Wizard"; + this.Text = "Wizard"; + this.Panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + internal System.Windows.Forms.Panel Panel1; + private System.Windows.Forms.Panel panelStep; + internal System.Windows.Forms.Label lblHeader; + internal System.Windows.Forms.Button cmdNext; + internal System.Windows.Forms.Button cmdPrev; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Wizard.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Wizard.cs new file mode 100644 index 0000000..21e9a42 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Wizard.cs @@ -0,0 +1,100 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +#endregion + +namespace WizardComponent +{ + public partial class Wizard : Form + { + public Wizard(List steps, Dictionary[] state) : + this(steps) + { + this.state = state; + } + + public Wizard(List steps) + { + InitializeComponent(); + if (steps.Count > 0) + { + this.steps = steps; + totalSteps = steps.Count; + currentStep = 1; + ShowStep(); + } + } + + private void ShowStep() + { + // Update buttons. + cmdPrev.Visible = (currentStep != 1); + if (currentStep == totalSteps) + cmdNext.Text = "Finish"; + else + cmdNext.Text = "Next >"; + + // Get headings. + lblHeader.Text = steps[currentStep - 1].HeaderTitle; + Text = "Step " + currentStep.ToString() + " of " + totalSteps.ToString(); + + // Get the child control. + + // See if there's state to be restored. + if (state != null && state[currentStep - 1] != null) + { + steps[currentStep - 1].ApplyValues(state[currentStep - 1]); + } + + // Show step content. + panelStep.Controls.Clear(); + UserControl ctrl = (UserControl)steps[currentStep - 1]; + panelStep.Controls.Add(ctrl); + } + + + private int currentStep; + private int totalSteps; + private List steps; + + private void cmdPrev_Click(object sender, EventArgs e) + { + currentStep--; + ShowStep(); + } + + private void cmdNext_Click(object sender, EventArgs e) + { + if (currentStep == totalSteps) + { + state = new Dictionary[totalSteps]; + for (int i = 0; i < totalSteps; i++) + { + state[i] = steps[i].GetValues(); + } + Close(); + } + else + { + currentStep++; + ShowStep(); + } + } + + + private Dictionary[] state; + public Dictionary[] State + { + get { return state; } + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Wizard.resx b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Wizard.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/Wizard.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/WizardComponent.csproj b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/WizardComponent.csproj new file mode 100644 index 0000000..5707b2b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/WizardComponent.csproj @@ -0,0 +1,68 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {C96B15FA-A545-4C3B-B3FE-517C0B6E5EB8} + Library + WizardComponent + WizardComponent + 4 + + + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + + Form + + + Wizard.cs + + + + Wizard.cs + Designer + + + ResXFileCodeGenerator + Resources.cs + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/WizardComponent.csproj.user b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/WizardComponent.csproj.user new file mode 100644 index 0000000..97a12b8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/WizardComponent.csproj.user @@ -0,0 +1,7 @@ + + + 8.0.40607 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/bin/Debug/WizardComponent.dll b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/bin/Debug/WizardComponent.dll new file mode 100644 index 0000000..b651d72 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponent/bin/Debug/WizardComponent.dll differ diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Form1.Designer.cs new file mode 100644 index 0000000..6459928 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Form1.Designer.cs @@ -0,0 +1,88 @@ +namespace WizardComponentTest +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(21, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(137, 23); + this.button1.TabIndex = 0; + this.button1.Text = "Launch the Wizard"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(21, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(137, 23); + this.button2.TabIndex = 1; + this.button2.Text = "Show the Wizard Data"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(57, 93); + this.label1.MaximumSize = new System.Drawing.Size(150, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(149, 39); + this.label1.TabIndex = 2; + this.label1.Text = "Launch the wizard more than once, and you\'ll see that it retains its data."; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.label1); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Wizard Test"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Form1.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Form1.cs new file mode 100644 index 0000000..d3498ff --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Form1.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using WizardComponent; + +namespace WizardComponentTest +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + + items.Add(new NameStep()); + items.Add(new RegistrationStep()); + } + + List items = new List(); + + private void button1_Click(object sender, EventArgs e) + { + Wizard wizard = new Wizard(items); + wizard.ShowDialog(); + } + + private void button2_Click(object sender, EventArgs e) + { + foreach (IWizardItem item in items) + { + string text = ""; + foreach (KeyValuePair setting in item.GetValues()) + { + text += String.Format("Key: {0}, Value: {1}\n", setting.Key, setting.Value); + } + MessageBox.Show(text); + } + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Form1.resx b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/NameStep.Designer.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/NameStep.Designer.cs new file mode 100644 index 0000000..7e551a2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/NameStep.Designer.cs @@ -0,0 +1,91 @@ +namespace WizardComponentTest +{ + partial class NameStep + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txtFirstName = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.txtLastName = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // txtFirstName + // + this.txtFirstName.Location = new System.Drawing.Point(78, 10); + this.txtFirstName.Name = "txtFirstName"; + this.txtFirstName.Size = new System.Drawing.Size(215, 21); + this.txtFirstName.TabIndex = 0; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(14, 15); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(58, 13); + this.label1.TabIndex = 1; + this.label1.Text = "First Name:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(15, 43); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(57, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Last Name:"; + // + // txtLastName + // + this.txtLastName.Location = new System.Drawing.Point(78, 38); + this.txtLastName.Name = "txtLastName"; + this.txtLastName.Size = new System.Drawing.Size(215, 21); + this.txtLastName.TabIndex = 3; + // + // Step1 + // + this.Controls.Add(this.txtLastName); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.txtFirstName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Step1"; + this.Size = new System.Drawing.Size(317, 79); + this.Load += new System.EventHandler(this.Step1_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txtFirstName; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtLastName; + + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/NameStep.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/NameStep.cs new file mode 100644 index 0000000..012f1cb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/NameStep.cs @@ -0,0 +1,49 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using WizardComponent; +#endregion + +namespace WizardComponentTest +{ + public partial class NameStep : UserControl, IWizardItem + { + public string HeaderTitle + { + get { return "Please enter your first and last name."; } + } + + Dictionary values = new Dictionary(); + + public Dictionary GetValues() + { + values.Clear(); + values.Add("FirstName", txtFirstName.Text); + values.Add("LastName", txtLastName.Text); + return values; + } + + public void ApplyValues(Dictionary values) + { + this.values = values; + txtFirstName.Text = values["FirstName"]; + txtFirstName.Text = values["LastName"]; + } + + public NameStep() + { + InitializeComponent(); + } + + private void Step1_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/NameStep.resx b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/NameStep.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/NameStep.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Program.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Program.cs new file mode 100644 index 0000000..dbe1a81 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Program.cs @@ -0,0 +1,24 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +#endregion + +namespace WizardComponentTest +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a354d93 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WizardComponentTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WizardComponentTest")] +[assembly: AssemblyCopyright("Copyright @ 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Resources.cs new file mode 100644 index 0000000..e5a208b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Resources.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WizardComponentTest.Properties +{ + using System; + using System.IO; + using System.Resources; + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources + { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager + { + get + { + if ((_resMgr == null)) + { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture + { + get + { + return _resCulture; + } + set + { + _resCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Settings.cs new file mode 100644 index 0000000..b6b3397 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Settings.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WizardComponentTest.Properties +{ + public partial class Settings : System.Configuration.ApplicationSettingsBase + { + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + public static Settings Value + { + get + { + if ((Settings.m_Value == null)) + { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) + { + try + { + Settings.m_Value = new Settings(); + } + finally + { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Settings.settings new file mode 100644 index 0000000..4024694 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/RegistrationStep.Designer.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/RegistrationStep.Designer.cs new file mode 100644 index 0000000..4c7dd59 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/RegistrationStep.Designer.cs @@ -0,0 +1,85 @@ +namespace WizardComponentTest +{ + partial class RegistrationStep + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.optRegisterToday = new System.Windows.Forms.RadioButton(); + this.optLater = new System.Windows.Forms.RadioButton(); + this.optNever = new System.Windows.Forms.RadioButton(); + this.SuspendLayout(); + // + // optRegisterToday + // + this.optRegisterToday.AutoSize = true; + this.optRegisterToday.Location = new System.Drawing.Point(12, 11); + this.optRegisterToday.Name = "optRegisterToday"; + this.optRegisterToday.Size = new System.Drawing.Size(179, 17); + this.optRegisterToday.TabIndex = 0; + this.optRegisterToday.TabStop = false; + this.optRegisterToday.Text = "Register today (discount applies)"; + // + // optLater + // + this.optLater.AutoSize = true; + this.optLater.Location = new System.Drawing.Point(12, 31); + this.optLater.Name = "optLater"; + this.optLater.Size = new System.Drawing.Size(98, 17); + this.optLater.TabIndex = 1; + this.optLater.TabStop = false; + this.optLater.Text = "Remind me later"; + // + // optNever + // + this.optNever.AutoSize = true; + this.optNever.Location = new System.Drawing.Point(12, 51); + this.optNever.Name = "optNever"; + this.optNever.Size = new System.Drawing.Size(105, 17); + this.optNever.TabIndex = 2; + this.optNever.TabStop = false; + this.optNever.Text = "Stop nagging me!"; + // + // RegistrationStep + // + this.Controls.Add(this.optNever); + this.Controls.Add(this.optLater); + this.Controls.Add(this.optRegisterToday); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "RegistrationStep"; + this.Size = new System.Drawing.Size(214, 83); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.RadioButton optRegisterToday; + private System.Windows.Forms.RadioButton optLater; + private System.Windows.Forms.RadioButton optNever; + + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/RegistrationStep.cs b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/RegistrationStep.cs new file mode 100644 index 0000000..e400e14 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/RegistrationStep.cs @@ -0,0 +1,56 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using WizardComponent; +#endregion + +namespace WizardComponentTest +{ + public partial class RegistrationStep : UserControl, IWizardItem + { + public string HeaderTitle + { + get { return "Select a registration method"; } + } + + Dictionary values = new Dictionary(); + + public Dictionary GetValues() + { + values.Clear(); + foreach (RadioButton opt in Controls) + { + if (opt.Checked) + { + values.Add(opt.Name, "True"); + break; + } + } + return values; + } + + public void ApplyValues(Dictionary values) + { + this.values = values; + foreach (RadioButton opt in Controls) + { + if (values[opt.Name] != null) + { + opt.Checked = true; + break; + } + } + } + + public RegistrationStep() + { + InitializeComponent(); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/RegistrationStep.resx b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/RegistrationStep.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/RegistrationStep.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/WizardComponentTest.csproj b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/WizardComponentTest.csproj new file mode 100644 index 0000000..c4656a6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/WizardComponentTest.csproj @@ -0,0 +1,89 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {EC6E21C2-75FC-4267-9D9B-39118F4FDBB3} + WinExe + WizardComponentTest + WizardComponentTest + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + Form + + + Form1.cs + + + + + Designer + Form1.cs + + + RegistrationStep.cs + + + ResXFileCodeGenerator + Resources.cs + + + NameStep.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + UserControl + + + NameStep.cs + + + UserControl + + + RegistrationStep.cs + + + + + + {C96B15FA-A545-4C3B-B3FE-517C0B6E5EB8} + WizardComponent + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/WizardComponentTest.csproj.user b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/WizardComponentTest.csproj.user new file mode 100644 index 0000000..eba6f5d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/WizardComponentTest.csproj.user @@ -0,0 +1,7 @@ + + + 8.0.50215 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/bin/Debug/WizardComponent.dll b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/bin/Debug/WizardComponent.dll new file mode 100644 index 0000000..b651d72 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/bin/Debug/WizardComponent.dll differ diff --git a/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/bin/Debug/WizardComponentTest.exe b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/bin/Debug/WizardComponentTest.exe new file mode 100644 index 0000000..ca0b923 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter10/Wizard/WizardComponentTest/bin/Debug/WizardComponentTest.exe differ diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTree.sln b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTree.sln new file mode 100644 index 0000000..4600cb5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTree.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryTreeHost", "DirectoryTreeHost\DirectoryTreeHost.csproj", "{822BA761-DEC0-48C6-BA50-290B02E1BF77}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryTreeControl", "DirectoryTreeControl\DirectoryTreeControl.csproj", "{3BAAC556-742E-413E-B3EC-12E23DB99DB8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Release|Any CPU.Build.0 = Release|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTree.suo b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTree.suo new file mode 100644 index 0000000..b69ccfc Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTree.suo differ diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTree.cs b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTree.cs new file mode 100644 index 0000000..a0c77fd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTree.cs @@ -0,0 +1,93 @@ +using System; +using System.IO; +using System.Windows.Forms; + +namespace DirectoryTreeControl +{ + public class DirectoryTree : TreeView + { + public delegate void DirectorySelectedDelegate(object sender, + DirectorySelectedEventArgs e); + public event DirectorySelectedDelegate DirectorySelected; + + private Char drive; + public Char Drive + { + get + { + return drive; + } + set + { + drive = value; + RefreshDisplay(); + } + } + + // This is public so a Refresh can be triggered manually. + public void RefreshDisplay() + { + // Erase the existing tree. + this.Nodes.Clear(); + + // Set the first node. + TreeNode rootNode = new TreeNode(drive + ":\\"); + this.Nodes.Add(rootNode); + + // Fill the first level and expand it. + Fill(rootNode); + this.Nodes[0].Expand(); + } + + private void Fill(TreeNode dirNode) + { + DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath); + + // An exception could be thrown in this code if you don't + // have sufficient security permissions for a file or directory. + // You can catch and then ignore this exception. + + foreach (DirectoryInfo dirItem in dir.GetDirectories()) + { + // Add node for the directory. + TreeNode newNode = new TreeNode(dirItem.Name); + dirNode.Nodes.Add(newNode); + newNode.Nodes.Add("*"); + } + } + + protected override void OnBeforeExpand(TreeViewCancelEventArgs e) + { + base.OnBeforeExpand(e); + + // If a dummy node is found, remove it and read the real directory list. + if (e.Node.Nodes[0].Text == "*") + { + e.Node.Nodes.Clear(); + Fill(e.Node); + } + } + + protected override void OnAfterSelect(TreeViewEventArgs e) + { + base.OnAfterSelect(e); + + // Raise the DirectorySelected event. + if (DirectorySelected != null) + { + DirectorySelected(this, + new DirectorySelectedEventArgs(e.Node.FullPath)); + } + } + } + public class DirectorySelectedEventArgs : EventArgs + { + public string DirectoryName; + + public DirectorySelectedEventArgs(string directoryName) + { + this.DirectoryName = directoryName; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTree.resx b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTree.resx new file mode 100644 index 0000000..7e32396 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTree.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj new file mode 100644 index 0000000..ec0115f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj @@ -0,0 +1,104 @@ + + + Local + 8.0.50727 + 2.0 + {3BAAC556-742E-413E-B3EC-12E23DB99DB8} + Debug + AnyCPU + + + + + DirectoryTreeControl + + + JScript + Grid + IE50 + false + Library + DirectoryTreeControl + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + Code + + + Component + + + DirectoryTree.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj.user b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj.user new file mode 100644 index 0000000..ef00d55 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/bin/Debug/DirectoryTreeControl.dll b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/bin/Debug/DirectoryTreeControl.dll new file mode 100644 index 0000000..716e719 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeControl/bin/Debug/DirectoryTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/App.ico b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj new file mode 100644 index 0000000..8c4a0ec --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj @@ -0,0 +1,108 @@ + + + Local + 8.0.40607 + 2.0 + {822BA761-DEC0-48C6-BA50-290B02E1BF77} + Debug + AnyCPU + App.ico + + + DirectoryTreeHost + + + JScript + Grid + IE50 + false + WinExe + DirectoryTreeHost + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + directorytreecontrol + ..\directorytreecontrol\bin\debug\directorytreecontrol.dll + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + Form + + + Form1.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj.user b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj.user new file mode 100644 index 0000000..6bf1188 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj.user @@ -0,0 +1,56 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 07\DirectoryTreeControl\bin\Debug\;D:\Matthew\2002\Writing\Books\User Interfaces in VB .NET (and C#)\C#\Code\Chapter 07\directorytreecontrol\bin\debug\ + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/Form1.cs b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/Form1.cs new file mode 100644 index 0000000..b5d5127 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/Form1.cs @@ -0,0 +1,81 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace DirectoryTreeHost +{ + /// + /// Summary description for Form1. + /// + public class Form1 : System.Windows.Forms.Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + + } + #endregion + + private void Form1_Load(object sender, System.EventArgs e) + { + DirectoryTreeControl.DirectoryTree dirTree = new + DirectoryTreeControl.DirectoryTree(); + dirTree.Size = new Size(this.Width - 30, this.Height - 60); + dirTree.Location = new Point(5, 5); + dirTree.Drive = Char.Parse("C"); + this.Controls.Add(dirTree); + + } + + public static void Main() + { + Application.Run(new Form1()); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/Form1.resx b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/Form1.resx new file mode 100644 index 0000000..add6c98 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/Form1.resx @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Form1 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeHost.exe b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeHost.exe new file mode 100644 index 0000000..c4626fb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/bin/Debug/directorytreecontrol.dll b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/bin/Debug/directorytreecontrol.dll new file mode 100644 index 0000000..716e719 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/DirectoryTree/DirectoryTreeHost/bin/Debug/directorytreecontrol.dll differ diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTree.sln b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTree.sln new file mode 100644 index 0000000..d6ad7df --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTree.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectTreeControl", "ProjectTreeControl\ProjectTreeControl.csproj", "{9C32F376-4D17-4C02-9546-24FA564A0C62}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectTreeHost", "ProjectTreeHost\ProjectTreeHost.csproj", "{80D4A3FD-B226-4FE4-8D25-3D0918B1B502}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9C32F376-4D17-4C02-9546-24FA564A0C62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C32F376-4D17-4C02-9546-24FA564A0C62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C32F376-4D17-4C02-9546-24FA564A0C62}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C32F376-4D17-4C02-9546-24FA564A0C62}.Release|Any CPU.Build.0 = Release|Any CPU + {80D4A3FD-B226-4FE4-8D25-3D0918B1B502}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80D4A3FD-B226-4FE4-8D25-3D0918B1B502}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80D4A3FD-B226-4FE4-8D25-3D0918B1B502}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80D4A3FD-B226-4FE4-8D25-3D0918B1B502}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Form1.Designer.cs new file mode 100644 index 0000000..0286d51 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Form1.Designer.cs @@ -0,0 +1,50 @@ +namespace ProjectTreeControl +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Form1.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Form1.cs new file mode 100644 index 0000000..49db0e4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Form1.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ProjectTreeControl +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Form1.resx b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Form1.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Form1.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Program.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Program.cs new file mode 100644 index 0000000..2758518 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ProjectTreeControl +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Project.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Project.cs new file mode 100644 index 0000000..df84dbe --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Project.cs @@ -0,0 +1,69 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; + +#endregion + +namespace ProjectTreeControl +{ + public class Project + { + // Use an enumeration to represent the three project status types. + public enum StatusType + { + Unassigned, + InProgress, + Closed + } + + private string name; + public string Name + { + get + { + return name; + } + set + { + name = value; + } + } + + private string description; + public string Description + { + get + { + return description; + } + set + { + description = value; + } + } + + private StatusType status; + public StatusType Status + { + get + { + return status; + } + + set + { + status = value; + } + } + + + public Project(string name, string description, StatusType status) + { + Name = name; + Description = description; + Status = status; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectSelectedEventArgs.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectSelectedEventArgs.cs new file mode 100644 index 0000000..907e3a6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectSelectedEventArgs.cs @@ -0,0 +1,35 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; + +#endregion + +namespace ProjectTreeControl +{ + // Define a higher-level event for node selection. + public delegate void ProjectSelectedEventHandler( + object sender, ProjectSelectedEventArgs e); + + public class ProjectSelectedEventArgs : EventArgs + { + private Project project; + public Project Project + { + get + { + return project; + } + set + { + project = value; + } + } + + public ProjectSelectedEventArgs(Project project) + { + Project = project; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTree.Designer.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTree.Designer.cs new file mode 100644 index 0000000..80ed2c4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTree.Designer.cs @@ -0,0 +1,52 @@ +namespace ProjectTreeControl +{ + partial class ProjectTree + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProjectTree)); + this.imagesTree = new System.Windows.Forms.ImageList(this.components); + this.SuspendLayout(); + // + // imagesTree + // + this.imagesTree.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imagesTree.ImageStream"))); + this.imagesTree.Images.SetKeyName(0, ""); + this.imagesTree.Images.SetKeyName(1, ""); + this.imagesTree.Images.SetKeyName(2, ""); + this.imagesTree.Images.SetKeyName(3, ""); + this.imagesTree.Images.SetKeyName(4, ""); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ImageList imagesTree; + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTree.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTree.cs new file mode 100644 index 0000000..c967913 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTree.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ProjectTreeControl +{ + [Designer(typeof(ProjectTreeDesigner))] + public partial class ProjectTree : TreeView + { + public ProjectTree():base() + { + InitializeComponent(); + // Set the images. + ImageList = this.imagesTree; + + // Created the first level of nodes. + nodeUnassigned = new TreeNode("Unassigned", + (int)NodeImages.UnassignedGroup, (int)NodeImages.UnassignedGroup); + nodeInProgress = new TreeNode("In Progress", + (int)NodeImages.InProgressGroup, (int)NodeImages.InProgressGroup); + nodeClosed = new TreeNode("Closed", + (int)NodeImages.ClosedGroup, (int)NodeImages.ClosedGroup); + + // Add the project category nodes. + Nodes.Add(nodeUnassigned); + Nodes.Add(nodeInProgress); + Nodes.Add(nodeClosed); + + } + + + // Specific numbers correspond to the image index. + private enum NodeImages + { + UnassignedGroup = 0, + InProgressGroup = 1, + ClosedGroup = 2, + NormalProject = 3, + SelectedProject = 4 + } + + // Store references to the three main node branches. + private TreeNode nodeUnassigned; + private TreeNode nodeInProgress; + private TreeNode nodeClosed; + + public TreeNode UnassignedProjectsNode + { + get + { + return nodeUnassigned; + } + } + + public TreeNode InProgressProjectsNode + { + get + { + return nodeInProgress; + } + } + + public TreeNode ClosedProjectsNode + { + get + { + return nodeClosed; + } + } + + + + + // Provide a specialized method the client can use to add nodes. + public void AddProject(Project project) + { + //TreeNode nodeNew = new TreeNode(project.Name, + // (int)NodeImages.NormalProject, (int)NodeImages.SelectedProject); + + // Store the project object for later use + // (when the event is raised). + //nodeNew.Tag = project; + ProjectTreeNode nodeNew = new ProjectTreeNode(project, project.Name, + (int)NodeImages.NormalProject, (int)NodeImages.SelectedProject); + + // (int)NodeImages.NormalProject, (int)NodeImages.SelectedProject); + + // Store the project object for later use + // (when the event is raised). + //nodeNew.Tag = project; + + switch (project.Status) + { + case Project.StatusType.Unassigned: + nodeUnassigned.Nodes.Add(nodeNew); + break; + case Project.StatusType.InProgress: + nodeInProgress.Nodes.Add(nodeNew); + break; + case Project.StatusType.Closed: + nodeClosed.Nodes.Add(nodeNew); + break; + } + } + + public Project GetProject(string name, Project.StatusType status) + { + TreeNodeCollection nodes = null; + + switch (status) + { + case Project.StatusType.Unassigned: + nodes = nodeUnassigned.Nodes; + break; + case Project.StatusType.InProgress: + nodes = nodeInProgress.Nodes; + break; + case Project.StatusType.Closed: + nodes = nodeClosed.Nodes; + break; + } + + foreach (TreeNode node in nodes) + { + if (node.Text == name) + { + Project project = node.Tag as Project; + if (project != null) return project; + } + } + return null; + } + + public event ProjectSelectedEventHandler ProjectSelected; + + protected override void OnAfterSelect(TreeViewEventArgs e) + { + base.OnAfterSelect(e); + + // Check that at least one event listener is registered + // before continuing. + if (ProjectSelected != null) + { + // To determine if it's a project node, + // you can examine the node's parent or (in this case) + // just check the level. + if (e.Node.Level == 1) + { + Project project = ((ProjectTreeNode)e.Node).Project; + ProjectSelectedEventArgs arg = new ProjectSelectedEventArgs(project); + ProjectSelected(this, arg); + } + } + } + + + } + } diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTree.resx b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTree.resx new file mode 100644 index 0000000..8979b8b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTree.resx @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAY + CwAAAk1TRnQBSQFMAgEBBQEAAQkBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/0UAAQc+AAH/AQABBwH7 + OgABBwEAAfsB/wEAAQcB+wEHOAAB+wEAA/8CAAH7AQcB+zYAAQcBAAH7Af8B+wL/AgABBwH7NQAB+wEA + BP8B+wH/AfsCAAH7AQczAAEHAQAB+wH/AfsF/wMAAQcyAAH7AQAE/wH7Af8B+wH/NgABBwEAAfsB/wH7 + Bf82AAH7AgAD/wH7Af8B+wH/NwAB+wEHAQAB+wX/OAAB+wIAAf8B+wH/OwAB+wEHPgABBwH7AQcB+wEH + ugABTg8AASUPAAHVDwAB/w8AAU4BAAE0DQABJQEAASwNAAHVAQAB1g0AAfsBAAH7DQABTgEAAzQLAAEl + AQADLAsAAdUBAAPWCwAB/wEAAf8BBwH7CwABTgEABTQJAAElAQABLAF1AywJAAHVAQAB1gEJA9YJAAH7 + AQAB+wEHAf8BBwH7CQABTgEABzQHAAElAQABLAN1AywHAAHVAQAB1gMJA9YHAAH/AQAC/wH7AQcB/wEH + AfsHAAFOAQAHNAcAASUBAAEsBXUBLAcAAdUBAAHWBQkB1gcAAfsBAAH7Av8BBwH7AQcB/wcAAU4BAAc0 + BwABJQEAASwFdQEsBwAB1QEAAdYFCQHWBwAB/wEAAv8B+wEHAf8BBwH7BwABTgEABzQHAAElAQABLAV1 + ASwHAAHVAQAB1gUJAdYHAAH7AQAB+wP/AfsBBwH/BwABTgEABzQHAAElAQACLAR1ASwHAAHVAQAC1gQJ + AdYHAAH/AQAC/wH7Av8BBwH7BwACTgIABTQHAAIlAgACLAJ1ASwHAALVAgAC1gIJAdYHAAH7Af8CAAL/ + AfsBBwH/CAADTgIAAzQIAAMlAgADLAgAA9UCAAPWCAAB+wH/AfsCAAH/AQcB+woAATQCTgIAATQKAAEs + AiUCAAEsCgAB1gLVAgAB1goAAf8B+wH/AgAB/woAAzQCTgsAAywCJQsAA9YC1QsAAfsB/wH7Af8B+wwA + AjQOAAIsDgAC1g4AAfsB/0cAAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYAA/8BAAHH + Af8GAAHBAf8HAAF/BwABHwcAAQcHAAEDBwABAQ8AAQwHAAEPBwABDwcAAQ8HAAEPBgABwAEvBgAB4AE/ + BgAB8AF/BgAB5wH/AecB/wHnAf8B5wH/AcMB/wHDAf8BwwH/AcMB/wHAAf8BwAH/AcAB/wHAAf8BwAE/ + AcABPwHAAT8BwAE/AcABDwHAAQ8BwAEPAcABDwHAAQcBwAEHAcABBwHAAQcBwAEHAcABBwHAAQcBwAEH + AcABBwHAAQcBwAEHAcABBwHAAQcBwAEHAcABBwHAAQcBwAEHAcABBwHAAQcBwAEHAcABBwHAAQcBwAEH + AcABBwHAAQcBwAEHAcABBwHAAQcB8AEHAfABBwHwAQcB8AEHAfgBBwH4AQcB+AEHAfgBBwH4AQcB+AEH + AfgBBwH4AQcB/gF/Af4BfwH+AX8B/gF/Cw== + + + + False + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeControl.csproj b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeControl.csproj new file mode 100644 index 0000000..c5fdd31 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeControl.csproj @@ -0,0 +1,86 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {9C32F376-4D17-4C02-9546-24FA564A0C62} + Library + Properties + ProjectTreeControl + ProjectTreeControl + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + Form + + + Form1.cs + + + + + + Component + + + ProjectTree.cs + + + + + + Form1.cs + + + ProjectTree.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeControl.csproj.user b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeControl.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeControl.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeDesigner.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeDesigner.cs new file mode 100644 index 0000000..a0db8bf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeDesigner.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms.Design; +using System.ComponentModel.Design; + +namespace ProjectTreeControl +{ + public class ProjectTreeDesigner : ControlDesigner + { + protected override void PostFilterProperties(System.Collections.IDictionary + properties) + { + base.PostFilterProperties(properties); + properties.Remove("Nodes"); + properties.Remove("ImageList"); + properties.Remove("ImageIndex"); + properties.Remove("ImageKey"); + } + + protected override void PostFilterEvents(System.Collections.IDictionary events) + { + base.PostFilterEvents(events); + events.Remove("AfterSelect"); + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeNode.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeNode.cs new file mode 100644 index 0000000..8ba1140 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/ProjectTreeNode.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows; +using System.Windows.Forms; + +namespace ProjectTreeControl +{ + public class ProjectTreeNode : TreeNode + { + private Project project; + public Project Project + { + get { return Project; } + } + + public ProjectTreeNode(Project project) + { + this.project = project; + } + public ProjectTreeNode(Project project, string text, int imageIndex, int selectedImageIndex) : base(text,imageIndex,selectedImageIndex) + { + this.project = project; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1ad19bb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ProjectTreeControl")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ProjectTreeControl")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3624d188-2139-4fc8-862f-0ab1cdb8ea90")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Resources.Designer.cs new file mode 100644 index 0000000..2568efc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.32 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ProjectTreeControl.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ProjectTreeControl.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ProjectTreeControl.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace ProjectTreeControl.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectTreeControl.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Settings.Designer.cs new file mode 100644 index 0000000..df22c21 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.32 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ProjectTreeControl.Properties.Settings.get_Default():ProjectTreeControl.Properties.Settings")] + +namespace ProjectTreeControl.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/bin/Debug/ProjectTreeControl.dll b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/bin/Debug/ProjectTreeControl.dll new file mode 100644 index 0000000..841336e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/bin/Debug/ProjectTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/bin/Debug/ProjectTreeControl.exe b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/bin/Debug/ProjectTreeControl.exe new file mode 100644 index 0000000..7ed0c52 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/bin/Debug/ProjectTreeControl.exe differ diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/bin/Release/ProjectTreeControl.exe b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/bin/Release/ProjectTreeControl.exe new file mode 100644 index 0000000..0891bbc Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeControl/bin/Release/ProjectTreeControl.exe differ diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Form1.Designer.cs new file mode 100644 index 0000000..673c289 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Form1.Designer.cs @@ -0,0 +1,60 @@ +namespace ProjectTreeHost +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.projectTree1 = new ProjectTreeControl.ProjectTree(); + this.SuspendLayout(); + // + // projectTree1 + // + this.projectTree1.Location = new System.Drawing.Point(31, 30); + this.projectTree1.Name = "projectTree1"; + this.projectTree1.SelectedImageIndex = 0; + this.projectTree1.Size = new System.Drawing.Size(191, 157); + this.projectTree1.TabIndex = 1; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.projectTree1); + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + + private ProjectTreeControl.ProjectTree projectTree1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Form1.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Form1.cs new file mode 100644 index 0000000..cd8735a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Form1.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using ProjectTreeControl; + +namespace ProjectTreeHost +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + projectTree1.AddProject(new Project("Migration to .NET", "", Project.StatusType.InProgress)); + projectTree1.AddProject(new Project("Revamp pricing site", "", Project.StatusType.Unassigned)); + projectTree1.AddProject(new Project("Prepare L-DAP feasibility report", "", Project.StatusType.Unassigned)); + projectTree1.AddProject(new Project("Update E201-G to Windows XP", "", Project.StatusType.Closed)); + projectTree1.AddProject(new Project("Annual meeting", "", Project.StatusType.Closed)); + + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Form1.resx b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Program.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Program.cs new file mode 100644 index 0000000..20912b1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ProjectTreeHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/ProjectTreeHost.csproj b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/ProjectTreeHost.csproj new file mode 100644 index 0000000..938cfda --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/ProjectTreeHost.csproj @@ -0,0 +1,76 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {80D4A3FD-B226-4FE4-8D25-3D0918B1B502} + WinExe + Properties + ProjectTreeHost + ProjectTreeHost + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {9C32F376-4D17-4C02-9546-24FA564A0C62} + ProjectTreeControl + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/ProjectTreeHost.csproj.user b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/ProjectTreeHost.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/ProjectTreeHost.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..df11fdf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ProjectTreeHost")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ProjectTreeHost")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f9beabc1-46a8-4980-a135-4a6b9d44a670")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Resources.Designer.cs new file mode 100644 index 0000000..3d13526 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.32 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ProjectTreeHost.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ProjectTreeHost.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ProjectTreeHost.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace ProjectTreeHost.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectTreeHost.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Settings.Designer.cs new file mode 100644 index 0000000..c5e8b51 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.32 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ProjectTreeHost.Properties.Settings.get_Default():ProjectTreeHost.Properties.Settings")] + +namespace ProjectTreeHost.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/bin/Debug/ProjectTreeControl.dll b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/bin/Debug/ProjectTreeControl.dll new file mode 100644 index 0000000..841336e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/bin/Debug/ProjectTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/bin/Debug/ProjectTreeHost.exe b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/bin/Debug/ProjectTreeHost.exe new file mode 100644 index 0000000..4dde170 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreeHost/bin/Debug/ProjectTreeHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreel.suo b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreel.suo new file mode 100644 index 0000000..1e7c6f6 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/ProjectTree/ProjectTreel.suo differ diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Ancestor.Designer.cs b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Ancestor.Designer.cs new file mode 100644 index 0000000..3babe5c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Ancestor.Designer.cs @@ -0,0 +1,106 @@ +namespace VisualInheritance +{ + partial class Ancestor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.cmdNext = new System.Windows.Forms.Button(); + this.lblHeader = new System.Windows.Forms.Label(); + this.Panel1 = new System.Windows.Forms.Panel(); + this.Panel1.SuspendLayout(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Location = new System.Drawing.Point(10, 225); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(284, 4); + this.GroupBox1.TabIndex = 8; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "GroupBox1"; + // + // cmdNext + // + this.cmdNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdNext.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdNext.Location = new System.Drawing.Point(234, 233); + this.cmdNext.Name = "cmdNext"; + this.cmdNext.Size = new System.Drawing.Size(60, 28); + this.cmdNext.TabIndex = 7; + this.cmdNext.Text = "Next"; + this.cmdNext.Click += new System.EventHandler(this.cmdNext_Click); + // + // lblHeader + // + this.lblHeader.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblHeader.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblHeader.Location = new System.Drawing.Point(16, 16); + this.lblHeader.Name = "lblHeader"; + this.lblHeader.Size = new System.Drawing.Size(262, 28); + this.lblHeader.TabIndex = 0; + this.lblHeader.Text = "Header Text"; + // + // Panel1 + // + this.Panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.Panel1.BackColor = System.Drawing.Color.White; + this.Panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Panel1.Controls.Add(this.lblHeader); + this.Panel1.Location = new System.Drawing.Point(6, 5); + this.Panel1.Name = "Panel1"; + this.Panel1.Size = new System.Drawing.Size(292, 68); + this.Panel1.TabIndex = 6; + // + // Ancestor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(304, 266); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.cmdNext); + this.Controls.Add(this.Panel1); + this.Name = "Ancestor"; + this.Text = "Ancestor"; + this.Panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Button cmdNext; + private System.Windows.Forms.Label lblHeader; + private System.Windows.Forms.Panel Panel1; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Ancestor.cs b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Ancestor.cs new file mode 100644 index 0000000..35c372b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Ancestor.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace VisualInheritance +{ + public partial class Ancestor : Form + { + public Ancestor() + { + InitializeComponent(); + } + + public string HeaderText + { + get + { + return lblHeader.Text; + } + set + { + lblHeader.Text = value; + } + } + + protected virtual void cmdNext_Click(object sender, EventArgs e) + { + MessageBox.Show("Base Class Event"); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Ancestor.resx b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Ancestor.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Ancestor.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Descendant.cs b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Descendant.cs new file mode 100644 index 0000000..2b79296 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Descendant.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace VisualInheritance +{ + public class Descendant : VisualInheritance.Ancestor + { + private System.ComponentModel.IContainer components = null; + + public Descendant() + { + // This call is required by the Windows Form Designer. + InitializeComponent(); + + // TODO: Add any initialization after the InitializeComponent call + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + protected override void cmdNext_Click(System.Object sender, System.EventArgs e) + { + // Call the original version. + base.cmdNext_Click(sender, e); + + MessageBox.Show("Descendant form event handler."); + + } + + #region Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + #endregion + } +} + diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Program.cs b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Program.cs new file mode 100644 index 0000000..838ca16 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace VisualInheritance +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Descendant()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e48702b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("VisualInheritance")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("VisualInheritance")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("4d92c07e-ca6e-49f5-87f3-622a79000d9e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Resources.Designer.cs new file mode 100644 index 0000000..e201866 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.32 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "VisualInheritance.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "VisualInheritance.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "VisualInheritance.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace VisualInheritance.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VisualInheritance.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Settings.Designer.cs new file mode 100644 index 0000000..cfc91ab --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.32 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "VisualInheritance.Properties.Settings.get_Default():VisualInheritance.Properties.Settings")] + +namespace VisualInheritance.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/VisualInheritance.csproj b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/VisualInheritance.csproj new file mode 100644 index 0000000..41ac1c7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/VisualInheritance.csproj @@ -0,0 +1,73 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {7C604DD7-E16D-4324-B31D-83EFC4FBE8DF} + WinExe + Properties + VisualInheritance + VisualInheritance + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Ancestor.cs + + + Form + + + + + Ancestor.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/VisualInheritance.csproj.user b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/VisualInheritance.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/VisualInheritance.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/bin/Debug/VisualInheritance.exe b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/bin/Debug/VisualInheritance.exe new file mode 100644 index 0000000..227c2ba Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/bin/Debug/VisualInheritance.exe differ diff --git a/Pro Windows Forms 2.0/Chapter11/VisualInheritance/bin/Release/VisualInheritance.exe b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/bin/Release/VisualInheritance.exe new file mode 100644 index 0000000..d0ebc95 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter11/VisualInheritance/bin/Release/VisualInheritance.exe differ diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanel.sln b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanel.sln new file mode 100644 index 0000000..3d88173 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanel.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CollapsiblePanelHost", "CollapsiblePanelHost\CollapsiblePanelHost.csproj", "{DD85A341-8E61-44EC-A98A-6669652BF6CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CollapsiblePanelControl", "CollapsiblePanelControl\CollapsiblePanelControl.csproj", "{A442592C-F336-4824-B4C7-11B34B724693}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DD85A341-8E61-44EC-A98A-6669652BF6CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD85A341-8E61-44EC-A98A-6669652BF6CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD85A341-8E61-44EC-A98A-6669652BF6CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD85A341-8E61-44EC-A98A-6669652BF6CD}.Release|Any CPU.Build.0 = Release|Any CPU + {A442592C-F336-4824-B4C7-11B34B724693}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A442592C-F336-4824-B4C7-11B34B724693}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A442592C-F336-4824-B4C7-11B34B724693}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A442592C-F336-4824-B4C7-11B34B724693}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanel.suo b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanel.suo new file mode 100644 index 0000000..48acfe3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanel.suo differ diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapseButton.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapseButton.cs new file mode 100644 index 0000000..0d1f48f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapseButton.cs @@ -0,0 +1,150 @@ +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Drawing.Imaging; +using System.Drawing.Drawing2D; +using System.Drawing.Design; +using System.Collections; +using System.ComponentModel; + +// Necessary for low level visual style API calls +using System.Windows.Forms.VisualStyles; + +// Necessary for GDI text API calls + +namespace Microsoft.Samples +{ + /// + /// Summary description for CollapseButton. + /// + public class CollapseButton : StateButtonBase + { + // Property fields + private bool collapsed; + + public CollapseButton() + { + this.SetStyle(ControlStyles.ResizeRedraw + | ControlStyles.OptimizedDoubleBuffer + | ControlStyles.SupportsTransparentBackColor, true); + + this.DoubleBuffered = true; + } + + // Properties + public bool Collapsed + { + get + { + return collapsed; + } + set + { + if (value != collapsed) + { + collapsed = value; + Invalidate(); + } + } + } + + + protected override void OnTextChanged(EventArgs e) + { + base.OnTextChanged(e); + Invalidate(); + } + + + // Methods + protected override void OnPaint(PaintEventArgs e) + { + VisualStyleRenderer renderer; + + // Paint parent background + InvokePaintBackground(this, new PaintEventArgs(e.Graphics, ClientRectangle)); + + // Paint background + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupHead.Normal); + renderer.DrawBackground(e.Graphics, new Rectangle(0, 0, e.ClipRectangle.Width, 25)); + + // Draw Text + Rectangle fontRect = new Rectangle(17, 6, this.Width - 17 - 24, this.Height); + + if ((State & StateButtonState.Pressed) != 0) + { + TextRenderer.DrawText(e.Graphics, this.Text, this.Font, fontRect, SystemColors.InactiveCaption, TextFormatFlags.Top | TextFormatFlags.Left); + } + else if ((State & StateButtonState.MouseHover) != 0) + { + TextRenderer.DrawText(e.Graphics, this.Text, this.Font, fontRect, SystemColors.InactiveCaption, TextFormatFlags.Top | TextFormatFlags.Left); + } + else if (!Enabled) + { + TextRenderer.DrawText(e.Graphics, this.Text, this.Font, fontRect, SystemColors.GrayText, TextFormatFlags.Top | TextFormatFlags.Left); + } + else + { + TextRenderer.DrawText(e.Graphics, this.Text, this.Font, fontRect, SystemColors.MenuHighlight, TextFormatFlags.Top | TextFormatFlags.Left); + } + + // Draw button + if (!collapsed) + { + // If pressed + if ((State & StateButtonState.Pressed) != 0) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupCollapse.Pressed); + } + + // If hot + else if ((State & StateButtonState.MouseHover) != 0) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupCollapse.Hot); + } + + // If disabled + else if (!Enabled) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupCollapse.Normal); + } + + // If normal + else + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupCollapse.Normal); + } + } + else + { + // If pressed + if ((State & StateButtonState.Pressed) != 0) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupExpand.Pressed); + } + + // If hot + else if ((State & StateButtonState.MouseHover) != 0) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupExpand.Hot); + } + + // If disabled + else if (!Enabled) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupExpand.Normal); + } + + // If normal + else + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupExpand.Normal); + } + } + + renderer.DrawBackground(e.Graphics, new Rectangle(this.Width - 22, 3, 20, 20)); + + base.OnPaint(e); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanel.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanel.cs new file mode 100644 index 0000000..547ed27 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanel.cs @@ -0,0 +1,177 @@ +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Drawing.Imaging; +using System.Drawing.Drawing2D; +using System.Drawing.Design; +using System.Collections; +using System.ComponentModel; + +// Needed for advanced visual styles scenarios +using System.Windows.Forms.VisualStyles; + +namespace Microsoft.Samples +{ + /// + /// Summary description for CollapsiblePanel. + /// + + // This disables the autodock smart tag + [Docking(DockingBehavior.Never)] + + // Set the designer + [Designer(typeof(CollapsiblePanelDesigner))] + public class CollapsiblePanel : Panel + { + // Controls + private CollapseButton button; + private Timer timer; + + // Fields + private bool collapsing; + private int oldHeight; + private int accelerator; + private bool collapsed; + + public CollapsiblePanel() + { + this.SetStyle(ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor, true); + + this.DoubleBuffered = true; + + // Setup button + button = new CollapseButton(); + button.Size = new Size(this.Width, 25); + button.Location = new Point(0, 0); + button.Font = new Font("Tahoma", 8.0f, FontStyle.Bold); + button.Dock = DockStyle.Top; + button.Click += new EventHandler(button_Click); + this.Controls.Add(button); + + // Setup timer + timer = new Timer(); + timer.Interval = 25; + timer.Tick += new EventHandler(timer_Tick); + } + + // Properties + public bool Collapsed + { + get + { + return collapsed; + } + set + { + if (collapsed != value) + { + collapsed = value; + if (collapsed) + { + PerformCollapse(); + } + else + { + PerformExpand(); + } + } + } + } + + [Browsable(true)] + public override string Text + { + get + { + return button.Text; + } + set + { + button.Text = value; + } + } + + // Methods + private void PerformCollapse() + { + collapsing = true; + SuspendLayout(); + timer.Enabled = true; + } + + private void PerformExpand() + { + collapsing = false; + SuspendLayout(); + timer.Enabled = true; + + } + + protected override void OnPaint(PaintEventArgs e) + { + // Paint parent background + InvokePaintBackground(this, new PaintEventArgs(e.Graphics, ClientRectangle)); + + // Fill the rest of the background + VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupBackground.Normal); + renderer.DrawBackground(e.Graphics, e.ClipRectangle); + + if (!timer.Enabled) + { + base.OnPaint(e); + } + } + + + protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) + { + base.SetBoundsCore(x, y, width, height, specified); + // My new code + if (!timer.Enabled && !collapsed) + { + oldHeight = Height; + } + } + + private void timer_Tick(object sender, EventArgs e) + { + if (collapsing) + { + this.Size = new Size(this.Width, this.Height - 2 - accelerator); + if (this.Height <= 25) + { + this.Size = new Size(this.Width, 25); + timer.Enabled = false; + button.Collapsed = true; + accelerator = 0; + ResumeLayout(); + } + } + else + { + this.Size = new Size(this.Width, this.Height + 2 + accelerator); + if (this.Height >= oldHeight) + { + this.Size = new Size(this.Width, oldHeight); + timer.Enabled = false; + button.Collapsed = false; + accelerator = 0; + ResumeLayout(); + } + } + accelerator++; + } + + private void button_Click(object sender, EventArgs e) + { + if (!collapsing) + { + Collapsed = true; + } + else + { + Collapsed = false; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanelActionList.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanelActionList.cs new file mode 100644 index 0000000..3acf252 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanelActionList.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace Microsoft.Samples +{ + /// + /// Summary description for MyControlActionList. + /// + public class CollapsiblePanelActionList //: System.ComponentModel.Design.DesignerActionList + { + CollapsiblePanel control; + ISelectionService selectionService; + + //public CollapsiblePanelActionList(CollapsiblePanel control, ISelectionService selectionService) + //{ + // this.control = control; + // this.selectionService = selectionService; + //} + + // Proeprties + public string Text + { + get + { + return control.Text; + } + set + { + // Setting through property descriptor to enable undo support + PropertyDescriptor prop = TypeDescriptor.GetProperties(control)["Text"]; + prop.SetValue(control, value); + } + } + + // Methods + public void CollapsePanel() + { + // Setting through property descriptor to enable undo support + PropertyDescriptor prop = TypeDescriptor.GetProperties(control)["Collapsed"]; + prop.SetValue(control, true); + } + + public void ExpandPanel() + { + // Setting through property descriptor to enable undo support + PropertyDescriptor prop = TypeDescriptor.GetProperties(control)["Collapsed"]; + prop.SetValue(control, false); + } + + //public override DesignerActionItem[] GetSortedActionItems() + //{ + // DesignerActionItem[] items = new DesignerActionItem[4]; + + // items[0] = new DesignerActionHeaderItem("Behavior", "Behavior"); + // items[1] = new DesignerActionPropertyItem("Text", "Text", "Behavior", "Sets the text of the control"); + // items[2] = new DesignerActionHeaderItem("Appearance", "Appearance"); + + // if (control.Collapsed) + // { + // items[3] = new DesignerActionMethodItem(this, "ExpandPanel", "Expand Panel", "Appearance", "Expands the panel", true); + // } + // else + // { + // items[3] = new DesignerActionMethodItem(this, "CollapsePanel", "Collapse Panel", "Appearance", "Collapses the panel", true); + // } + + // return items; + //} + + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanelControl.csproj b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanelControl.csproj new file mode 100644 index 0000000..f48ca44 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanelControl.csproj @@ -0,0 +1,67 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {A442592C-F336-4824-B4C7-11B34B724693} + Library + Properties + CollapsiblePanelControl + CollapsiblePanelControl + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Component + + + Component + + + + + Component + + + + + + + StateButtonBase.cs + Designer + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanelDesigner.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanelDesigner.cs new file mode 100644 index 0000000..8e942d3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/CollapsiblePanelDesigner.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Drawing.Design; +using System.Data; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +// New namespace for snaplines +using System.Windows.Forms.Design.Behavior; + +namespace Microsoft.Samples +{ + /// + /// Summary description for MyControlDesigner. + /// + public class CollapsiblePanelDesigner : ParentControlDesigner + { + DesignerActionListCollection actions; + public override DesignerActionListCollection ActionLists + { + get + { + if (actions == null) + { + //actions = new DesignerActionListCollection(); + //actions.Add(new CollapsiblePanelActionList((CollapsiblePanel)Control, (ISelectionService)GetService(typeof(ISelectionService)))); + } + return actions; + } + } + + public override IList SnapLines + { + get + { + IList snapLines = base.SnapLines; + + snapLines.Add(new SnapLine(SnapLineType.Baseline, 6 + Control.Font.Height)); + return snapLines; + } + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0a5847d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("CollapsiblePanelControl")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("CollapsiblePanelControl")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("05355f49-3a29-4a60-b28d-d59f79ad2984")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/StateButtonBase.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/StateButtonBase.cs new file mode 100644 index 0000000..f4c9926 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/StateButtonBase.cs @@ -0,0 +1,142 @@ +using System; +using System.Windows.Forms; +using System.ComponentModel; +using System.Drawing; + +namespace Microsoft.Samples +{ + // This class is the base for all button controls in this project. + // It contains fields so that inheriting buttons can track + // button state (normal, hover, pressed, and disabled) + public abstract class StateButtonBase : Control, IButtonControl + { + #region Fields + DialogResult dialogResult = DialogResult.None; + StateButtonState state; + #endregion + + #region Constructor + public StateButtonBase() + { + SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false); + } + #endregion + + #region Properties + protected override Size DefaultSize + { + get + { + return new Size(75, 23); + } + } + + [ + Category("Behavior"), + DefaultValue(typeof(DialogResult), "DialogResult.None"), + Description("Specifies the dialog result that this button will return when a form is closed by clicking it") + ] + public DialogResult DialogResult + { + get + { + return dialogResult; + } + set + { + dialogResult = value; + } + } + + protected StateButtonState State + { + get + { + return state; + } + } + #endregion + + #region Methods & Event Handlers + void SetState(StateButtonState setState, bool set) + { + StateButtonState newState = this.state; + if (set) + { + newState |= setState; + } + else + { + newState &= ~setState; + } + + if (this.state != newState) + { + this.state = newState; + Invalidate(); + } + } + + void IButtonControl.NotifyDefault(bool isDefault) + { + SetState(StateButtonState.Default, isDefault); + } + + public void PerformClick() + { + OnClick(EventArgs.Empty); + } + + protected override void OnMouseDown(MouseEventArgs e) + { + SetState(StateButtonState.Pressed, true); + base.OnMouseDown(e); + } + protected override void OnMouseUp(MouseEventArgs e) + { + bool click = false; + if ((State & StateButtonState.Pressed) != 0) + { + click = true; + } + SetState(StateButtonState.Pressed, false); + base.OnMouseUp(e); + + if (click) + { + Update(); + PerformClick(); + } + } + protected override void OnMouseMove(MouseEventArgs e) + { + if (Capture) + { + SetState(StateButtonState.Pressed, ClientRectangle.Contains(e.X, e.Y)); + } + base.OnMouseMove(e); + } + protected override void OnMouseEnter(EventArgs e) + { + SetState(StateButtonState.MouseHover, true); + base.OnMouseEnter(e); + } + protected override void OnMouseLeave(EventArgs e) + { + SetState(StateButtonState.MouseHover, false); + base.OnMouseLeave(e); + } + #endregion + } + + // This cenum is used for the states which a button can have + [Flags] + public enum StateButtonState + { + None = 0x00, + Pressed = 0x01, + MouseHover = 0x02, + Default = 0x04, + Disabled = 0x08, + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/StateButtonBase.resx b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/StateButtonBase.resx new file mode 100644 index 0000000..7e32396 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/StateButtonBase.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/bin/Debug/CollapsiblePanelControl.dll b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/bin/Debug/CollapsiblePanelControl.dll new file mode 100644 index 0000000..692896d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelControl/bin/Debug/CollapsiblePanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapseTest.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapseTest.cs new file mode 100644 index 0000000..a70bce0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapseTest.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace CollapsiblePanelHost +{ + public partial class CollapseTest : Form + { + public CollapseTest() + { + InitializeComponent(); + } + + private void CollapseTest_Load(object sender, EventArgs e) + { +// label1.BackColor = Color.Transparent; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapseTest.designer.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapseTest.designer.cs new file mode 100644 index 0000000..8f98601 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapseTest.designer.cs @@ -0,0 +1,128 @@ +namespace CollapsiblePanelHost +{ + partial class CollapseTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.collapsiblePanel1 = new Microsoft.Samples.CollapsiblePanel(); + this.collapsiblePanel2 = new Microsoft.Samples.CollapsiblePanel(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.collapsiblePanel1.SuspendLayout(); + this.collapsiblePanel2.SuspendLayout(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // collapsiblePanel1 + // + this.collapsiblePanel1.Collapsed = false; + this.collapsiblePanel1.Controls.Add(this.panel1); + this.collapsiblePanel1.Location = new System.Drawing.Point(209, 12); + this.collapsiblePanel1.Name = "collapsiblePanel1"; + this.collapsiblePanel1.Size = new System.Drawing.Size(184, 99); + this.collapsiblePanel1.TabIndex = 2; + this.collapsiblePanel1.Text = "collapsiblePanel1"; + // + // collapsiblePanel2 + // + this.collapsiblePanel2.Collapsed = false; + this.collapsiblePanel2.Controls.Add(this.button2); + this.collapsiblePanel2.Controls.Add(this.button1); + this.collapsiblePanel2.Location = new System.Drawing.Point(12, 12); + this.collapsiblePanel2.Name = "collapsiblePanel2"; + this.collapsiblePanel2.Size = new System.Drawing.Size(182, 99); + this.collapsiblePanel2.TabIndex = 3; + this.collapsiblePanel2.Text = "collapsiblePanel2"; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(21, 62); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 24); + this.button2.TabIndex = 2; + this.button2.Text = "button2"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(21, 32); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 24); + this.button1.TabIndex = 1; + this.button1.Text = "button1"; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.White; + this.panel1.Controls.Add(this.label1); + this.panel1.Location = new System.Drawing.Point(12, 33); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(161, 52); + this.panel1.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(21, 10); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(68, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Sample text."; + // + // CollapseTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(430, 141); + this.Controls.Add(this.collapsiblePanel1); + this.Controls.Add(this.collapsiblePanel2); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "CollapseTest"; + this.Text = "CollapseTest"; + this.Load += new System.EventHandler(this.CollapseTest_Load); + this.collapsiblePanel1.ResumeLayout(false); + this.collapsiblePanel2.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private Microsoft.Samples.CollapsiblePanel collapsiblePanel1; + private Microsoft.Samples.CollapsiblePanel collapsiblePanel2; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label label1; + + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapseTest.resx b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapseTest.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapseTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsibleLayout.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsibleLayout.cs new file mode 100644 index 0000000..17a2dd5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsibleLayout.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace CollapsiblePanelHost +{ + public partial class CollapsibleLayout : Form + { + public CollapsibleLayout() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsibleLayout.designer.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsibleLayout.designer.cs new file mode 100644 index 0000000..9d87043 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsibleLayout.designer.cs @@ -0,0 +1,101 @@ +namespace CollapsiblePanelHost +{ + partial class CollapsibleLayout + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.collapsiblePanel1 = new Microsoft.Samples.CollapsiblePanel(); + this.collapsiblePanel2 = new Microsoft.Samples.CollapsiblePanel(); + this.collapsiblePanel4 = new Microsoft.Samples.CollapsiblePanel(); + this.flowLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // flowLayoutPanel1 + // + this.flowLayoutPanel1.BackColor = System.Drawing.SystemColors.GradientInactiveCaption; + this.flowLayoutPanel1.Controls.Add(this.collapsiblePanel1); + this.flowLayoutPanel1.Controls.Add(this.collapsiblePanel2); + this.flowLayoutPanel1.Controls.Add(this.collapsiblePanel4); + this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + this.flowLayoutPanel1.Padding = new System.Windows.Forms.Padding(10); + this.flowLayoutPanel1.Size = new System.Drawing.Size(271, 347); + this.flowLayoutPanel1.TabIndex = 3; + // + // collapsiblePanel1 + // + this.collapsiblePanel1.Collapsed = false; + this.collapsiblePanel1.Dock = System.Windows.Forms.DockStyle.Top; + this.collapsiblePanel1.Location = new System.Drawing.Point(13, 13); + this.collapsiblePanel1.Name = "collapsiblePanel1"; + this.collapsiblePanel1.Size = new System.Drawing.Size(219, 100); + this.collapsiblePanel1.TabIndex = 6; + this.collapsiblePanel1.Text = "System Tasks"; + // + // collapsiblePanel2 + // + this.collapsiblePanel2.Collapsed = false; + this.collapsiblePanel2.Dock = System.Windows.Forms.DockStyle.Top; + this.collapsiblePanel2.Location = new System.Drawing.Point(13, 119); + this.collapsiblePanel2.Name = "collapsiblePanel2"; + this.collapsiblePanel2.Size = new System.Drawing.Size(219, 100); + this.collapsiblePanel2.TabIndex = 4; + this.collapsiblePanel2.Text = "Personal Tasks"; + // + // collapsiblePanel4 + // + this.collapsiblePanel4.Collapsed = false; + this.collapsiblePanel4.Dock = System.Windows.Forms.DockStyle.Top; + this.collapsiblePanel4.Location = new System.Drawing.Point(13, 225); + this.collapsiblePanel4.Name = "collapsiblePanel4"; + this.collapsiblePanel4.Size = new System.Drawing.Size(219, 100); + this.collapsiblePanel4.TabIndex = 5; + this.collapsiblePanel4.Text = "Other Tasks"; + // + // CollapsibleLayout + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(271, 347); + this.Controls.Add(this.flowLayoutPanel1); + this.Name = "CollapsibleLayout"; + this.Text = "Collapsible Layout"; + this.flowLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private Microsoft.Samples.CollapsiblePanel collapsiblePanel1; + private Microsoft.Samples.CollapsiblePanel collapsiblePanel2; + private Microsoft.Samples.CollapsiblePanel collapsiblePanel4; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsibleLayout.resx b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsibleLayout.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsibleLayout.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsiblePanelHost.csproj b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsiblePanelHost.csproj new file mode 100644 index 0000000..d80a432 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsiblePanelHost.csproj @@ -0,0 +1,104 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {DD85A341-8E61-44EC-A98A-6669652BF6CD} + WinExe + Properties + CollapsiblePanelHost + CollapsiblePanelHost + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + CollapseTest.cs + + + Form + + + CollapsibleLayout.cs + + + Form + + + Menu.cs + + + + + CollapseTest.cs + Designer + + + CollapsibleLayout.cs + Designer + + + Menu.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {A442592C-F336-4824-B4C7-11B34B724693} + CollapsiblePanelControl + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsiblePanelHost.suo b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsiblePanelHost.suo new file mode 100644 index 0000000..47f59bf Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/CollapsiblePanelHost.suo differ diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Menu.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Menu.cs new file mode 100644 index 0000000..89bad0c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace CollapsiblePanelHost +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("CollapsiblePanelHost." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Menu.designer.cs new file mode 100644 index 0000000..45a7c4c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Menu.designer.cs @@ -0,0 +1,74 @@ +namespace CollapsiblePanelHost +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(167, 23); + this.button1.TabIndex = 0; + this.button1.Text = "CollapseTest"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(167, 23); + this.button2.TabIndex = 1; + this.button2.Text = "CollapsibleLayout"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(197, 215); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Menu.resx b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Program.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Program.cs new file mode 100644 index 0000000..535bcb7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace CollapsiblePanelHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..81ae935 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("CollapsiblePanelHost")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("CollapsiblePanelHost")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3fe158e1-1a4a-43c1-80bd-000a98fdccef")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Resources.Designer.cs new file mode 100644 index 0000000..6649656 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CollapsiblePanelHost.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CollapsiblePanelHost.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Settings.Designer.cs new file mode 100644 index 0000000..e4f16f8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace CollapsiblePanelHost.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/bin/Debug/CollapsiblePanelControl.dll b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/bin/Debug/CollapsiblePanelControl.dll new file mode 100644 index 0000000..692896d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/bin/Debug/CollapsiblePanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/bin/Debug/CollapsiblePanelHost.exe b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/bin/Debug/CollapsiblePanelHost.exe new file mode 100644 index 0000000..62e7a0d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/CollapsiblePanel/CollapsiblePanelHost/bin/Debug/CollapsiblePanelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanel.sln b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanel.sln new file mode 100644 index 0000000..47d9663 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanel.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GradientPanelControl", "GradientPanelControl\GradientPanelControl.csproj", "{249E3320-5FB8-48DC-AD25-DBE71195209A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GradientPanelHost", "GradientPanelHost\GradientPanelHost.csproj", "{9BA9D88F-A938-44BF-ACDE-29F63B54D586}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Release|Any CPU.Build.0 = Release|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanel.suo b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanel.suo new file mode 100644 index 0000000..5375e2b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanel.suo differ diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientFill.cs b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientFill.cs new file mode 100644 index 0000000..9aed357 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientFill.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.ComponentModel; +using System.Drawing.Drawing2D; +using System.Drawing.Design; + +namespace GradientPanelControl +{ + public class GradientFill + { + private Color colorA = Color.LightBlue; + private Color colorB = Color.Purple; + private LinearGradientMode gradientStyle = LinearGradientMode.ForwardDiagonal; + + public event EventHandler GradientChanged; + + public Color ColorA + { + get + { + return colorA; + } + set + { + colorA = value; + OnGradientChanged(EventArgs.Empty); + } + } + + public Color ColorB + { + get + { + return colorB; + } + set + { + colorB = value; + OnGradientChanged(EventArgs.Empty); + } + } + + public LinearGradientMode GradientFillStyle + { + get + { + return gradientStyle; + } + set + { + gradientStyle = value; + OnGradientChanged(EventArgs.Empty); + } + } + + private void OnGradientChanged(EventArgs e) + { + if (GradientChanged != null) + { + GradientChanged(this, e); + } + } + + public GradientFill() + { + } + public GradientFill(Color colorA, Color colorB, LinearGradientMode gradientFillStyle) + { + ColorA = colorA; + ColorB = colorB; + GradientFillStyle = gradientFillStyle; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanel.cs b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanel.cs new file mode 100644 index 0000000..cb5752e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanel.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Drawing.Drawing2D; +using System.Drawing.Design; +// Needed for advanced visual styles scenarios +using System.Windows.Forms.VisualStyles; + +namespace GradientPanelControl +{ + /// + /// Summary description for GradientLabel. + /// + public class GradientPanel : Panel + { + private GradientFill gradient = new GradientFill(); + + public GradientPanel() + { + handlerGradientChanged = new EventHandler(GradientChanged); + gradient.GradientChanged += handlerGradientChanged; + ResizeRedraw = true; + } + + private EventHandler handlerGradientChanged; + + private Brush gradientBrush; + private Brush GradientBrush + { + get + { + if (gradientBrush == null) + { + gradientBrush = + new LinearGradientBrush(ClientRectangle, gradient.ColorA, + gradient.ColorB, gradient.GradientFillStyle); + } + return gradientBrush; + } + } + + public GradientFill GradientFill + { + get + { + return gradient; + } + set + { + gradient = value; + if (handlerGradientChanged != null) gradient.GradientChanged -= handlerGradientChanged; + handlerGradientChanged = new EventHandler(GradientChanged); + gradient.GradientChanged += handlerGradientChanged; + if (gradientBrush != null) gradientBrush.Dispose(); + gradientBrush = null; + Invalidate(); + } + } + + protected override void OnPaintBackground( + System.Windows.Forms.PaintEventArgs e) + { + // Fill the rest of the background + e.Graphics.FillRectangle(GradientBrush, ClientRectangle); + } + + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (gradientBrush != null) gradientBrush.Dispose(); + } + base.Dispose(disposing); + } + + protected override void OnScroll(ScrollEventArgs se) + { + Invalidate(); + } + + private void GradientChanged(object sender, EventArgs e) + { + if (gradientBrush != null) gradientBrush.Dispose(); + gradientBrush = null; + Invalidate(); + } + + } + + +} diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanel.resx b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanel.resx new file mode 100644 index 0000000..cde0d27 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanel.resx @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + GradientLabel + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanelControl.csproj b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanelControl.csproj new file mode 100644 index 0000000..8dcd4e3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanelControl.csproj @@ -0,0 +1,112 @@ + + + Local + 8.0.50727 + 2.0 + {249E3320-5FB8-48DC-AD25-DBE71195209A} + Debug + AnyCPU + + + + + GradientPanelControl + + + JScript + Grid + IE50 + false + Library + GradientPanelControl + OnBuildSuccess + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + Code + + + + Component + + + GradientPanel.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanelControl.csproj.user b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanelControl.csproj.user new file mode 100644 index 0000000..5414047 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanelControl.csproj.user @@ -0,0 +1,58 @@ + + + 7.10.3077 + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanelControl.suo b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanelControl.suo new file mode 100644 index 0000000..82348c8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/GradientPanelControl.suo differ diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/bin/Debug/GradientPanelControl.dll b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/bin/Debug/GradientPanelControl.dll new file mode 100644 index 0000000..c5cc190 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/bin/Debug/GradientPanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/bin/Release/GradientPanelControl.dll b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/bin/Release/GradientPanelControl.dll new file mode 100644 index 0000000..ed0a1ed Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelControl/bin/Release/GradientPanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/App.ico b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelHost.csproj b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelHost.csproj new file mode 100644 index 0000000..6f757e4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelHost.csproj @@ -0,0 +1,126 @@ + + + Local + 8.0.50727 + 2.0 + {9BA9D88F-A938-44BF-ACDE-29F63B54D586} + Debug + AnyCPU + App.ico + + + GradientPanelHost + + + JScript + Grid + IE50 + false + WinExe + GradientPanelHost + OnBuildSuccess + GradientPanelHost.Program + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + Form + + + GradientPanelTest.cs + + + + Designer + GradientPanelTest.cs + + + + + + {249E3320-5FB8-48DC-AD25-DBE71195209A} + GradientPanelControl + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelHost.csproj.user b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelHost.csproj.user new file mode 100644 index 0000000..9c11a20 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelHost.csproj.user @@ -0,0 +1,57 @@ + + + 8.0.50215 + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 13\GradientLabel\bin\Debug\;C:\Code\UserInterfaces\Code\Chapter 13\GradientLabel\bin\Debug\;D:\Code\UserInterfaces\Chapter 17\GradientLabel\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelTest.Designer.cs b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelTest.Designer.cs new file mode 100644 index 0000000..48f2733 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelTest.Designer.cs @@ -0,0 +1,139 @@ +namespace GradientPanelHost +{ + partial class GradientPanelTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + GradientPanelControl.GradientFill gradientFill1 = new GradientPanelControl.GradientFill(); + this.gradientPanel1 = new GradientPanelControl.GradientPanel(); + this.label3 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.gradientPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // gradientPanel1 + // + this.gradientPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gradientPanel1.AutoScroll = true; + this.gradientPanel1.Controls.Add(this.label3); + this.gradientPanel1.Controls.Add(this.button1); + this.gradientPanel1.Controls.Add(this.label2); + this.gradientPanel1.Controls.Add(this.label1); + + this.gradientPanel1.GradientFill = gradientFill1; + this.gradientPanel1.Location = new System.Drawing.Point(4, 6); + this.gradientPanel1.Name = "gradientPanel1"; + this.gradientPanel1.Size = new System.Drawing.Size(427, 190); + this.gradientPanel1.TabIndex = 1; + // + // label3 + // + this.label3.BackColor = System.Drawing.Color.Transparent; + this.label3.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.Location = new System.Drawing.Point(18, 57); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(328, 39); + this.label3.TabIndex = 2; + this.label3.Text = "These labels have a transparent background, which lets the gradient show through." + + ""; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(231, 109); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "Test Button"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(40, 226); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(108, 37); + this.label2.TabIndex = 1; + this.label2.Text = "label2"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(17, 12); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(277, 37); + this.label1.TabIndex = 0; + this.label1.Text = "Transparent Text"; + // + // label4 + // + this.label4.Location = new System.Drawing.Point(6, 202); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(425, 52); + this.label4.TabIndex = 2; + this.label4.Text = "Note: In this example, the GradientFill property isn\'t editable. In order to make" + + " it editable, you need some design-time classes; see the version in Chapter13 wh" + + "ich solves this problem."; + // + // GradientPanelTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(435, 260); + this.Controls.Add(this.label4); + this.Controls.Add(this.gradientPanel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "GradientPanelTest"; + this.Text = "GradientPanel"; + this.gradientPanel1.ResumeLayout(false); + this.gradientPanel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private GradientPanelControl.GradientPanel gradientPanel1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label4; + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelTest.cs b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelTest.cs new file mode 100644 index 0000000..0cb237b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelTest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace GradientPanelHost +{ + public partial class GradientPanelTest : Form + { + public GradientPanelTest() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelTest.resx b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelTest.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/GradientPanelTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/Program.cs b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/Program.cs new file mode 100644 index 0000000..dfed262 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace GradientPanelHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new GradientPanelTest()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelControl.dll b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelControl.dll new file mode 100644 index 0000000..c5cc190 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelHost.exe b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelHost.exe new file mode 100644 index 0000000..8c21fad Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Release/GradientPanelControl.dll b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Release/GradientPanelControl.dll new file mode 100644 index 0000000..ed0a1ed Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Release/GradientPanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Release/GradientPanelHost.exe b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Release/GradientPanelHost.exe new file mode 100644 index 0000000..7cac392 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/GradientPanel/GradientPanelHost/bin/Release/GradientPanelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabel.sln b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabel.sln new file mode 100644 index 0000000..7479435 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabel.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarqueeLabelHost", "MarqueeLabelHost\MarqueeLabelHost.csproj", "{F933461B-85EC-4C6C-8DE8-C2B65C51E696}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarqueeLabel", "MarqueeLabelControl\MarqueeLabel.csproj", "{2ED8BBD1-D421-450A-92A5-A6CAAACCE155}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Release|Any CPU.Build.0 = Release|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabel.suo b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabel.suo new file mode 100644 index 0000000..87af732 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabel.suo differ diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.cs b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.cs new file mode 100644 index 0000000..49f9963 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace MarqueeLabel +{ + /// + /// Summary description for MarqueeLabel. + /// + public class MarqueeLabel : Control + { + private System.ComponentModel.IContainer components; + + public MarqueeLabel() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + DoubleBuffered = true; + ResizeRedraw = true; + } + + public void Scroll(bool state) + { + tmrScroll.Enabled = state; + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmrScroll = new System.Windows.Forms.Timer(this.components); + // + // tmrScroll + // + this.tmrScroll.Tick += new System.EventHandler(this.tmrScroll_Tick); + // + // MarqueeLabel + // + this.Name = "MarqueeLabel"; + this.Size = new System.Drawing.Size(360, 104); + + + } + #endregion + + private string text; + private int scrollAmount = 10; + internal System.Windows.Forms.Timer tmrScroll; + private int position = 0; + + private void tmrScroll_Tick(object sender, System.EventArgs e) + { + position += scrollAmount; + + // Force a refresh. + Invalidate(); + } + + [Browsable(true), + DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public override string Text + { + get + { + return text; + } + set + { + text = value; + Invalidate(); + } + } + + public int ScrollTimeInterval + { + get + { + return tmrScroll.Interval; + } + set + { + tmrScroll.Interval = value; + } + } + + [DefaultValue(10)] + public int ScrollPixelAmount + { + get + { + return scrollAmount; + } + set + { + scrollAmount = value; + } + } + + + protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) + { + base.OnPaint(e); + + + if (position > Width) + { + // Reset the text to scroll back onto the control. + position = -(int)e.Graphics.MeasureString(text, Font).Width; + } + + //e.Graphics.FillRectangle(new SolidBrush(BackColor), e.ClipRectangle); + e.Graphics.DrawString(text, Font, new SolidBrush(ForeColor), position, 0); + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj new file mode 100644 index 0000000..d1e21c1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj @@ -0,0 +1,107 @@ + + + Local + 8.0.40607 + 2.0 + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155} + Debug + AnyCPU + + + + + MarqueeLabel + + + JScript + Grid + IE50 + false + Library + MarqueeLabel + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + Code + + + Component + + + MarqueeLabel.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj.user b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj.user new file mode 100644 index 0000000..277f465 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.resx b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.resx new file mode 100644 index 0000000..c15e6d4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.resx @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 317, 30 + + + Assembly + + + MarqueeLabel + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll new file mode 100644 index 0000000..3dc5364 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/bin/Release/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/bin/Release/MarqueeLabel.dll new file mode 100644 index 0000000..624367b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelControl/bin/Release/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/App.ico b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj new file mode 100644 index 0000000..a08f4ac --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj @@ -0,0 +1,118 @@ + + + Local + 8.0.50727 + 2.0 + {F933461B-85EC-4C6C-8DE8-C2B65C51E696} + Debug + AnyCPU + App.ico + + + MarqueeLabelHost + + + JScript + Grid + IE50 + false + WinExe + MarqueeLabelHost + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + Form + + + MarqueeTestForm.cs + + + + Designer + MarqueeTestForm.cs + + + + + + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155} + MarqueeLabel + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj.user b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj.user new file mode 100644 index 0000000..5b35e22 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 13\MarqueeLabel\bin\Debug\;D:\Matthew\2002\Writing\Books\User Interfaces in .NET\C#\Code\Chapter 13\MarqueeLabel\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.Designer.cs b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.Designer.cs new file mode 100644 index 0000000..de2bdc5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.Designer.cs @@ -0,0 +1,141 @@ +namespace MarqueeLabelHost +{ + partial class MarqueeTestForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.tbInterval = new System.Windows.Forms.TrackBar(); + this.Label1 = new System.Windows.Forms.Label(); + this.tbAmount = new System.Windows.Forms.TrackBar(); + this.marqueeLabel1 = new MarqueeLabel.MarqueeLabel(); + this.GroupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tbInterval)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.tbAmount)).BeginInit(); + + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.tbInterval); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.tbAmount); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(22, 177); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(336, 132); + this.GroupBox1.TabIndex = 6; + this.GroupBox1.TabStop = false; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(12, 76); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(80, 23); + this.Label2.TabIndex = 6; + this.Label2.Text = "Scroll Interval:"; + // + // tbInterval + // + this.tbInterval.Location = new System.Drawing.Point(96, 72); + this.tbInterval.Maximum = 500; + this.tbInterval.Minimum = 10; + this.tbInterval.Name = "tbInterval"; + this.tbInterval.Size = new System.Drawing.Size(228, 45); + this.tbInterval.TabIndex = 5; + this.tbInterval.TickFrequency = 10; + this.tbInterval.Value = 100; + this.tbInterval.ValueChanged += new System.EventHandler(this.tbInterval_ValueChanged); + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(12, 20); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(80, 23); + this.Label1.TabIndex = 4; + this.Label1.Text = "Scroll Amount:"; + // + // tbAmount + // + this.tbAmount.Location = new System.Drawing.Point(96, 16); + this.tbAmount.Maximum = 20; + this.tbAmount.Name = "tbAmount"; + this.tbAmount.Size = new System.Drawing.Size(228, 45); + this.tbAmount.TabIndex = 3; + this.tbAmount.Value = 10; + this.tbAmount.ValueChanged += new System.EventHandler(this.tbAmount_ValueChanged); + // + // marqueeLabel1 + // + this.marqueeLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.marqueeLabel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); + this.marqueeLabel1.Font = new System.Drawing.Font("Verdana", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.marqueeLabel1.ForeColor = System.Drawing.Color.Navy; + this.marqueeLabel1.Location = new System.Drawing.Point(-2, 7); + this.marqueeLabel1.Name = "marqueeLabel1"; + this.marqueeLabel1.ScrollTimeInterval = 100; + this.marqueeLabel1.Size = new System.Drawing.Size(384, 156); + this.marqueeLabel1.TabIndex = 7; + this.marqueeLabel1.Tag = ""; + this.marqueeLabel1.Text = "This scrolls!"; + // + // MarqueeTestForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(381, 322); + this.Controls.Add(this.marqueeLabel1); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "MarqueeTestForm"; + this.Text = "MarqueeTestForm"; + this.Load += new System.EventHandler(this.MarqueeTestForm_Load); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tbInterval)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.tbAmount)).EndInit(); + + this.ResumeLayout(false); + + } + + #endregion + + private MarqueeLabel.MarqueeLabel marqueeLabel1; + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.TrackBar tbInterval; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.TrackBar tbAmount; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.cs b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.cs new file mode 100644 index 0000000..7c661a8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MarqueeLabelHost +{ + public partial class MarqueeTestForm : Form + { + public MarqueeTestForm() + { + InitializeComponent(); + } + + private void tbAmount_ValueChanged(object sender, EventArgs e) + { + marqueeLabel1.ScrollPixelAmount = tbAmount.Value; + } + + private void tbInterval_ValueChanged(object sender, EventArgs e) + { + marqueeLabel1.ScrollTimeInterval = tbInterval.Value; + } + + private void MarqueeTestForm_Load(object sender, EventArgs e) + { + marqueeLabel1.Scroll(true); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.resx b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/Program.cs b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/Program.cs new file mode 100644 index 0000000..33a6330 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace MarqueeLabelHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new MarqueeTestForm()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll new file mode 100644 index 0000000..3dc5364 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe new file mode 100644 index 0000000..7f64b66 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabel.dll new file mode 100644 index 0000000..624367b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe new file mode 100644 index 0000000..22af8f9 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/CustTreeView.Designer.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/CustTreeView.Designer.cs new file mode 100644 index 0000000..b4c757e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/CustTreeView.Designer.cs @@ -0,0 +1,38 @@ +namespace OwnerDrawList +{ + partial class CustTreeView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "CustTreeView"; + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/CustTreeView.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/CustTreeView.cs new file mode 100644 index 0000000..c67b509 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/CustTreeView.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace OwnerDrawList +{ + public partial class CustTreeView : Form + { + public CustTreeView() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/CustTreeView.resx b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/CustTreeView.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/CustTreeView.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/FormattedListItemWrapper.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/FormattedListItemWrapper.cs new file mode 100644 index 0000000..b0cae3b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/FormattedListItemWrapper.cs @@ -0,0 +1,95 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; + +#endregion + +namespace OwnerDrawList +{ + public class FormattedListItemWrapper + { + private object item; + public object Item + { + get + { + return item; + } + set + { + item = value; + } + } + + private Color foreColor; + public Color ForeColor + { + get + { + return foreColor; + } + set + { + foreColor = value; + } + } + + private Color backColor; + public Color BackColor + { + get + { + return backColor; + } + set + { + backColor = value; + } + } + + private Font font; + public Font Font + { + get + { + return font; + } + set + { + font = value; + } + } + + public override string ToString() + { + if (Item == null) + { + return null; + } + else + { + return Item.ToString(); + } + } + + public FormattedListItemWrapper(object item) + { + Item = item; + } + + public FormattedListItemWrapper(object item, Font font) : this(item) + { + Font = font; + } + + public FormattedListItemWrapper(object item, Font font, + Color foreColor, Color backColor) : this(item, font) + { + ForeColor = foreColor; + BackColor = backColor; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Menu.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Menu.cs new file mode 100644 index 0000000..ec8aa12 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace OwnerDrawList +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("OwnerDrawList." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Menu.designer.cs new file mode 100644 index 0000000..6d5db56 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Menu.designer.cs @@ -0,0 +1,98 @@ +namespace OwnerDrawList +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(167, 23); + this.button1.TabIndex = 0; + this.button1.Text = "SimpleOwnerDrawList"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(167, 23); + this.button2.TabIndex = 1; + this.button2.Text = "VariableOwnerDrawList"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 70); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(167, 23); + this.button3.TabIndex = 2; + this.button3.Text = "OwnerDrawTreeView"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 99); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(167, 23); + this.button4.TabIndex = 3; + this.button4.Text = "OwnerDrawTreeViewControl"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(197, 215); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Menu.resx b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/MultiSelectTreeView.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/MultiSelectTreeView.cs new file mode 100644 index 0000000..406b728 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/MultiSelectTreeView.cs @@ -0,0 +1,221 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Drawing; +using System.Collections.ObjectModel; + +namespace OwnerDrawList +{ + public class MultiSelectTreeView : TreeView + { + // Force the tree to use owner drawing. + public MultiSelectTreeView() : base() + { + base.DrawMode = TreeViewDrawMode.OwnerDrawText; + } + + // Track the selected nodes. + internal List selectedNodes = + new List(); + + public ReadOnlyCollection SelectedNodes + { + get + { + // Return a read-only wrapper for this collection. + // The only way to change selection is through the + // MultiSelectTreeNode methods. + return selectedNodes.AsReadOnly(); + } + } + + protected override void OnDrawNode(DrawTreeNodeEventArgs e) + { + // Check for multiple selection support. + MultiSelectTreeNode2 multiNode = e.Node as MultiSelectTreeNode2; + if (multiNode != null) + { + // Retrieve the node font. If the node font has not been set, + // use the TreeView font. + Font nodeFont = multiNode.NodeFont; + if (nodeFont == null) nodeFont = base.Font; + + // Create brushes for the background and foreground. + Brush backBrush, foreBrush; + if (multiNode.IsSelected) + { + foreBrush = SystemBrushes.HighlightText; + backBrush = SystemBrushes.Highlight; + } + else + { + if (multiNode.ForeColor != Color.Empty) + { + foreBrush = new SolidBrush(multiNode.ForeColor); + } + else + { + foreBrush = new SolidBrush(multiNode.TreeView.ForeColor); + } + if (multiNode.BackColor != Color.Empty) + { + backBrush = new SolidBrush(multiNode.BackColor); + } + else + { + backBrush = new SolidBrush(multiNode.TreeView.BackColor); + } + } + + // Draw the background of the selected node. + Rectangle bounds = e.Bounds; + bounds.X += 1; + e.Graphics.FillRectangle(backBrush, bounds); + + // Draw the node text. + e.Graphics.DrawString(e.Node.Text, nodeFont, foreBrush, e.Bounds.X, e.Bounds.Y); + + // If the node has focus, draw the focus rectangle. + if ((e.State & TreeNodeStates.Focused) != 0) + { + using (Pen focusPen = new Pen(Color.Black)) + { + focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; + Rectangle focusBounds = e.Bounds; + focusBounds.Size = new Size(focusBounds.Width, + focusBounds.Height - 1); + + e.Graphics.DrawRectangle(focusPen, focusBounds); + } + } + + // Dispose brushes if they were created + // just for this node. + if (multiNode.IsSelected == false) + { + backBrush.Dispose(); + foreBrush.Dispose(); + } + } + else + { + // No multiple selection support. + e.DrawDefault = true; + } + } + + protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) + { + TreeNode nodeHit = base.HitTest(e.X, e.Y).Node; + if (nodeHit != null) + { + MultiSelectTreeNode2 multiNode = nodeHit as MultiSelectTreeNode2; + if (multiNode != null) + { + // Use advanced selection rules. + if ((Control.ModifierKeys & Keys.Control) == 0) + { + // Ctrl is not held down. + // Remove previous selection. + List nodesToDelete = + new List(); + foreach (MultiSelectTreeNode2 node in selectedNodes) + { + if (node != multiNode) + { + nodesToDelete.Add(node); + } + } + foreach (MultiSelectTreeNode2 node in nodesToDelete) + { + node.UnSelect(); + + } + } + + if (multiNode.IsSelected) + { + // Node is already selected. + // Toggle it off. + multiNode.UnSelect(); + } + else + { + // Add new selection. + multiNode.Select(); + } + } + } + } + + public void Select(MultiSelectTreeNode2 node) + { + if (!node.IsSelected) + { + node.IsSelected = true; + + // Update the collection. + selectedNodes.Add(node); + base.Invalidate(base.Bounds); + } + } + + public void UnSelect(MultiSelectTreeNode2 node) + { + if (node.IsSelected) + { + node.IsSelected = false; + + // Update the collection. + selectedNodes.Remove(node); + base.Invalidate(base.Bounds); + } + } + + } + + public class MultiSelectTreeNode2 : TreeNode + { + private MultiSelectTreeView MultiSelectTreeView + { + get + { + return base.TreeView as MultiSelectTreeView; + } + } + + public MultiSelectTreeNode2(string text) : base(text) + { + + } + + private bool selected = false; + public new bool IsSelected + { + get { return selected; } + internal set { selected = value; } + } + + public void Select() + { + // Check if the selection is being changed. + if (selected != true) + { + if (MultiSelectTreeView != null) MultiSelectTreeView.Select(this); + } + + } + + public void UnSelect() + { + // Check if the selection is being changed. + if (selected != false) + { + if (MultiSelectTreeView != null) MultiSelectTreeView.UnSelect(this); + } + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawList.sln b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawList.sln new file mode 100644 index 0000000..1ff0c71 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawList.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OwnerDrawLists", "OwnerDrawLists.csproj", "{426C6446-5E2A-4D7F-9664-AC74BD4D00BA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {426C6446-5E2A-4D7F-9664-AC74BD4D00BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {426C6446-5E2A-4D7F-9664-AC74BD4D00BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {426C6446-5E2A-4D7F-9664-AC74BD4D00BA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {426C6446-5E2A-4D7F-9664-AC74BD4D00BA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawList.suo b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawList.suo new file mode 100644 index 0000000..32c87d3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawList.suo differ diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawLists.csproj b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawLists.csproj new file mode 100644 index 0000000..3da7183 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawLists.csproj @@ -0,0 +1,109 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {426C6446-5E2A-4D7F-9664-AC74BD4D00BA} + WinExe + OwnerDrawList + OwnerDrawList + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + + + Form + + + OwnerDrawTreeViewControl.cs + + + + Form + + + Menu.cs + + + Component + + + Form + + + OwnerDrawTreeView.cs + + + + + OwnerDrawTreeViewControl.cs + Designer + + + Menu.cs + Designer + + + OwnerDrawTreeView.cs + Designer + + + ResXFileCodeGenerator + Resources.cs + + + SimpleOwnerDrawList.cs + + + VariableOwnerDrawList.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + Form + + + SimpleOwnerDrawList.cs + + + Form + + + VariableOwnerDrawList.cs + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawLists.csproj.user b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawLists.csproj.user new file mode 100644 index 0000000..eba6f5d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawLists.csproj.user @@ -0,0 +1,7 @@ + + + 8.0.50215 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeView.Designer.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeView.Designer.cs new file mode 100644 index 0000000..150670e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeView.Designer.cs @@ -0,0 +1,80 @@ +namespace OwnerDrawList +{ + partial class OwnerDrawTreeView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.treeView1 = new System.Windows.Forms.TreeView(); + this.cmdGetSelected = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // treeView1 + // + this.treeView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.treeView1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawText; + this.treeView1.Location = new System.Drawing.Point(7, 6); + this.treeView1.Name = "treeView1"; + this.treeView1.Scrollable = false; + this.treeView1.Size = new System.Drawing.Size(277, 251); + this.treeView1.TabIndex = 0; + this.treeView1.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(this.treeView1_DrawNode); + this.treeView1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseDown); + // + // cmdGetSelected + // + this.cmdGetSelected.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdGetSelected.Location = new System.Drawing.Point(144, 263); + this.cmdGetSelected.Name = "cmdGetSelected"; + this.cmdGetSelected.Size = new System.Drawing.Size(140, 23); + this.cmdGetSelected.TabIndex = 1; + this.cmdGetSelected.Text = "Get Selected Nodes"; + this.cmdGetSelected.UseVisualStyleBackColor = true; + this.cmdGetSelected.Click += new System.EventHandler(this.button1_Click); + // + // OwnerDrawTreeView + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 291); + this.Controls.Add(this.cmdGetSelected); + this.Controls.Add(this.treeView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "OwnerDrawTreeView"; + this.Text = "OwnerDrawnTreeView"; + this.Load += new System.EventHandler(this.OwnerDrawnTreeView_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView treeView1; + private System.Windows.Forms.Button cmdGetSelected; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeView.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeView.cs new file mode 100644 index 0000000..5b879e4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeView.cs @@ -0,0 +1,232 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Runtime.InteropServices; +using System.Diagnostics; + +namespace OwnerDrawList +{ + public partial class OwnerDrawTreeView : Form + { + public OwnerDrawTreeView() + { + InitializeComponent(); + } + + private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) + { + // Check for multiple selection support. + MultiSelectTreeNode multiNode = e.Node as MultiSelectTreeNode; + if (multiNode != null) + { + // Retrieve the node font. If the node font has not been set, + // use the TreeView font. + Font nodeFont = multiNode.NodeFont; + if (nodeFont == null) nodeFont = ((TreeView)sender).Font; + + // Create brushes for the background and foreground. + Brush backBrush, foreBrush; + if (multiNode.IsSelected) + { + foreBrush = SystemBrushes.HighlightText; + backBrush = SystemBrushes.Highlight; + } + else + { + if (multiNode.ForeColor != Color.Empty) + { + foreBrush = new SolidBrush(multiNode.ForeColor); + } + else + { + foreBrush = new SolidBrush(multiNode.TreeView.ForeColor); + } + if (multiNode.BackColor != Color.Empty) + { + backBrush = new SolidBrush(multiNode.BackColor); + } + else + { + backBrush = new SolidBrush(multiNode.TreeView.BackColor); + } + } + + // Draw the background of the selected node. + Rectangle bounds = e.Bounds; + bounds.X += 1; + e.Graphics.FillRectangle(backBrush, bounds); + + // Draw the node text. + e.Graphics.DrawString(e.Node.Text, nodeFont, foreBrush, e.Bounds.X,e.Bounds.Y); + + // If the node has focus, draw the focus rectangle. + if ((e.State & TreeNodeStates.Focused) != 0) + { + using (Pen focusPen = new Pen(Color.Black)) + { + focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; + Rectangle focusBounds = e.Bounds; + focusBounds.Size = new Size(focusBounds.Width, + focusBounds.Height - 1); + + e.Graphics.DrawRectangle(focusPen, focusBounds); + } + } + + // Dispose brushes if they were created + // just for this node. + if (!multiNode.IsSelected) + { + backBrush.Dispose(); + foreBrush.Dispose(); + } + } + else + { + // No multiple selection support. + e.DrawDefault = true; + } + } + + private void OwnerDrawnTreeView_Load(object sender, EventArgs e) + { + MultiSelectTreeNode nodeP = new MultiSelectTreeNode("Node Group", selectedNodes ); + treeView1.Nodes.Add(nodeP); + + MultiSelectTreeNode node = new MultiSelectTreeNode("First Node", selectedNodes); + node.Select(); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode("Second Node", selectedNodes); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode("Third Node", selectedNodes); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode("Fourth Node", selectedNodes); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode("Fifth Node", selectedNodes); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode("Sixth Node", selectedNodes); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode("Seventh Node", selectedNodes); + nodeP.Nodes.Add(node); + + treeView1.ExpandAll(); + } + + private List selectedNodes = + new List(); + + + private void treeView1_MouseDown(object sender, MouseEventArgs e) + { + TreeNode nodeHit = treeView1.HitTest(e.X, e.Y).Node; + if (nodeHit != null) + { + MultiSelectTreeNode multiNode = nodeHit as MultiSelectTreeNode; + if (multiNode != null) + { + // Use advanced selection rules. + if ((Control.ModifierKeys & Keys.Control) == 0) + { + // Ctrl is not held down. + // Remove previous selection. + List nodesToDelete = + new List(); + foreach (MultiSelectTreeNode node in selectedNodes) + { + if (node != multiNode) + { + nodesToDelete.Add(node); + } + } + foreach (MultiSelectTreeNode node in nodesToDelete) + { + node.UnSelect(); + } + } + + if (multiNode.IsSelected) + { + // Node is already selected. + // Toggle it off. + multiNode.UnSelect(); + } + else + { + // Add new selection. + multiNode.Select(); + } + } + } + } + + private void button1_Click(object sender, EventArgs e) + { + string nodeText = ""; + foreach (TreeNode node in selectedNodes) + { + nodeText += node.Text + "\n"; + } + + MessageBox.Show(nodeText); + } + } +} + +public class MultiSelectTreeNode : TreeNode +{ + private List selectedNodes; + + public MultiSelectTreeNode(string text, List selectedNodes) : base(text) + { + this.selectedNodes = selectedNodes; + } + + private bool selected = false; + public new bool IsSelected + { + get { return selected; } + } + + public void Select() + { + // Check if the selection is being changed. + if (selected != true) + { + selected = true; + + // Update the collection. + selectedNodes.Add(this); + RepaintNode(); + } + + } + + public void UnSelect() + { + // Check if the selection is being changed. + if (selected != false) + { + selected = false; + + // Update the collection. + selectedNodes.Remove(this); + RepaintNode(); + } + + } + + private void RepaintNode() + { + // TreeView will be null if the node hasn't been + // added yet. + if (base.TreeView != null) + { + // Repaint the node. + base.TreeView.Invalidate(base.Bounds); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeView.resx b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeView.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeView.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeViewControl.Designer.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeViewControl.Designer.cs new file mode 100644 index 0000000..1e7700f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeViewControl.Designer.cs @@ -0,0 +1,79 @@ +namespace OwnerDrawList +{ + partial class OwnerDrawTreeViewControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.multiSelectTreeView1 = new OwnerDrawList.MultiSelectTreeView(); + this.cmdGetSelected = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // multiSelectTreeView1 + // + this.multiSelectTreeView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.multiSelectTreeView1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawText; + this.multiSelectTreeView1.Location = new System.Drawing.Point(7, 5); + this.multiSelectTreeView1.Name = "multiSelectTreeView1"; + this.multiSelectTreeView1.Size = new System.Drawing.Size(276, 226); + this.multiSelectTreeView1.TabIndex = 0; + // + // cmdGetSelected + // + this.cmdGetSelected.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdGetSelected.Location = new System.Drawing.Point(144, 237); + this.cmdGetSelected.Name = "cmdGetSelected"; + this.cmdGetSelected.Size = new System.Drawing.Size(140, 23); + this.cmdGetSelected.TabIndex = 2; + this.cmdGetSelected.Text = "Get Selected Nodes"; + this.cmdGetSelected.UseVisualStyleBackColor = true; + this.cmdGetSelected.Click += new System.EventHandler(this.cmdGetSelected_Click); + // + // OwnerDrawTreeViewControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.cmdGetSelected); + this.Controls.Add(this.multiSelectTreeView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "OwnerDrawTreeViewControl"; + this.Text = "CustomTreeView"; + this.Load += new System.EventHandler(this.CustomTreeView_Load); + this.ResumeLayout(false); + + } + + #endregion + + private MultiSelectTreeView multiSelectTreeView1; + private System.Windows.Forms.Button cmdGetSelected; + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeViewControl.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeViewControl.cs new file mode 100644 index 0000000..422878d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeViewControl.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace OwnerDrawList +{ + public partial class OwnerDrawTreeViewControl : Form + { + public OwnerDrawTreeViewControl() + { + InitializeComponent(); + } + + private void CustomTreeView_Load(object sender, EventArgs e) + { + MultiSelectTreeNode2 nodeP = new MultiSelectTreeNode2("Node Group"); + multiSelectTreeView1.Nodes.Add(nodeP); + + MultiSelectTreeNode2 node = new MultiSelectTreeNode2("First Node"); + node.Select(); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode2("Second Node"); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode2("Third Node"); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode2("Fourth Node"); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode2("Fifth Node"); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode2("Sixth Node"); + nodeP.Nodes.Add(node); + node = new MultiSelectTreeNode2("Seventh Node"); + nodeP.Nodes.Add(node); + + multiSelectTreeView1.ExpandAll(); + } + + private void button1_Click(object sender, EventArgs e) + { + MessageBox.Show(multiSelectTreeView1.SelectedNodes.Count.ToString()); + } + + private void cmdGetSelected_Click(object sender, EventArgs e) + { + string nodeText = ""; + foreach (TreeNode node in multiSelectTreeView1.SelectedNodes) + { + nodeText += node.Text + "\n"; + } + + MessageBox.Show(nodeText); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeViewControl.resx b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeViewControl.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/OwnerDrawTreeViewControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Program.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Program.cs new file mode 100644 index 0000000..bbc55fc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Program.cs @@ -0,0 +1,26 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +#endregion + +namespace OwnerDrawList +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + //Application.Run(new VariableOwnerDrawList()); + + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..326e049 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OwnerDrawList")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OwnerDrawList")] +[assembly: AssemblyCopyright("Copyright @ 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Resources.cs new file mode 100644 index 0000000..a0379da --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Resources.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace OwnerDrawList.Properties +{ + using System; + using System.IO; + using System.Resources; + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources + { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager + { + get + { + if ((_resMgr == null)) + { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture + { + get + { + return _resCulture; + } + set + { + _resCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Settings.cs new file mode 100644 index 0000000..129b8ed --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Settings.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace OwnerDrawList.Properties +{ + public partial class Settings : System.Configuration.ApplicationSettingsBase + { + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + public static Settings Value + { + get + { + if ((Settings.m_Value == null)) + { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) + { + try + { + Settings.m_Value = new Settings(); + } + finally + { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Settings.settings new file mode 100644 index 0000000..4024694 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/SimpleOwnerDrawList.Designer.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/SimpleOwnerDrawList.Designer.cs new file mode 100644 index 0000000..283e984 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/SimpleOwnerDrawList.Designer.cs @@ -0,0 +1,64 @@ +namespace OwnerDrawList +{ + partial class SimpleOwnerDrawList + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.listBox1 = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // listBox1 + // + this.listBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; + this.listBox1.FormattingEnabled = true; + this.listBox1.Items.AddRange(new object[] { + "Test 1", + "Test 2", + "Test 3"}); + this.listBox1.Location = new System.Drawing.Point(12, 12); + this.listBox1.Name = "listBox1"; + this.listBox1.Size = new System.Drawing.Size(179, 160); + this.listBox1.TabIndex = 0; + this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem); + this.listBox1.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.listBox1_MeasureItem); + // + // SimpleOwnerDrawList + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.listBox1); + this.Name = "SimpleOwnerDrawList"; + this.Text = "SimpleOwnerDrawList"; + this.Load += new System.EventHandler(this.SimpleOwnerDrawList_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ListBox listBox1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/SimpleOwnerDrawList.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/SimpleOwnerDrawList.cs new file mode 100644 index 0000000..bca21a5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/SimpleOwnerDrawList.cs @@ -0,0 +1,60 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +#endregion + +namespace OwnerDrawList +{ + partial class SimpleOwnerDrawList : Form + { + public SimpleOwnerDrawList() + { + InitializeComponent(); + } + + private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e) + { + // Specify a fixed height. + e.ItemHeight = 15; + + } + + private void listBox1_DrawItem(object sender, DrawItemEventArgs e) + { + // Draw the background. + // The color (white or blue) depends on selection. + e.DrawBackground(); + + // Determine the forecolor based on whether or not + // the item is selected. + Brush brush; + if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) + { + brush = Brushes.White; + } + else + { + brush = Brushes.Black; + } + + // Get the item text. + string text = ((ListBox)sender).Items[e.Index].ToString(); + + // Draw the item text. + e.Graphics.DrawString(text, ((Control)sender).Font, + brush, e.Bounds.X, e.Bounds.Y); + } + + private void SimpleOwnerDrawList_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/SimpleOwnerDrawList.resx b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/SimpleOwnerDrawList.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/SimpleOwnerDrawList.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/VariableOwnerDrawList.Designer.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/VariableOwnerDrawList.Designer.cs new file mode 100644 index 0000000..a11a7e3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/VariableOwnerDrawList.Designer.cs @@ -0,0 +1,67 @@ +namespace OwnerDrawList +{ + partial class VariableOwnerDrawList + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.listBox1 = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // listBox1 + // + this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; + this.listBox1.FormattingEnabled = true; + this.listBox1.Items.AddRange(new object[] { + "Test 1", + "Test 2", + "Test 3"}); + this.listBox1.Location = new System.Drawing.Point(12, 12); + this.listBox1.Name = "listBox1"; + this.listBox1.Size = new System.Drawing.Size(268, 242); + this.listBox1.TabIndex = 1; + this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem); + this.listBox1.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.listBox1_MeasureItem); + // + // VariableOwnerDrawList + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.listBox1); + this.Name = "VariableOwnerDrawList"; + this.Text = "Variable Owner-Draw List"; + this.Load += new System.EventHandler(this.VariableOwnerDrawList_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ListBox listBox1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/VariableOwnerDrawList.cs b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/VariableOwnerDrawList.cs new file mode 100644 index 0000000..12b3d1b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/VariableOwnerDrawList.cs @@ -0,0 +1,131 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Drawing.Text; +using System.Text; +using System.Windows.Forms; + +#endregion + +namespace OwnerDrawList +{ + partial class VariableOwnerDrawList : Form + { + public VariableOwnerDrawList() + { + InitializeComponent(); + } + + private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e) + { + + ListBox list = (ListBox)sender; + FormattedListItemWrapper item = list.Items[e.Index] as FormattedListItemWrapper; + if (item == null || item.Font == null) + { + e.ItemHeight = 15; + } + else + { + // Get the height from the current item's font. + Font font = item.Font; + e.ItemHeight = font.Height; + } + } + + private void listBox1_DrawItem(object sender, DrawItemEventArgs e) + { + + ListBox list = (ListBox)sender; + FormattedListItemWrapper item = list.Items[e.Index] as FormattedListItemWrapper; + + Font font = null; + Color foreColor = Color.Empty; + Color backColor = Color.Empty; + + if (item != null) + { + font = item.Font; + foreColor = item.ForeColor; + backColor = item.BackColor; + } + + + // Get the font from the current item. + // It could be null if there is no + // ListItemWrapper or the ListItemWrapper doesn't + // specify a font. + if (font == null) + { + // Use the ListBox font if no custom font is provided. + font = list.Font; + } + + // Set the color. It could be empty if there is no + // ListItemWrapper or the ListItemWrapper doesn't + // specify a color. + Brush brush; + if (foreColor == Color.Empty) + { + // Use the default color. + brush = Brushes.Black; + } + else + { + // Use the custom color. + brush = new SolidBrush(item.ForeColor); + } + + // Override the color if the item is selected. + // Alternatively, you could add SelectedForeColor and + // SelectedBackColor properties to the wrapper. + if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) + { + brush = Brushes.White; + } + + // Paint the background. + if (backColor == Color.Empty) + { + // Draw the background. + e.DrawBackground(); + } + else + { + Brush brushBackground = new SolidBrush(item.BackColor); + e.Graphics.FillRectangle(brushBackground, e.Bounds); + } + + // Get the item text. + string text = list.Items[e.Index].ToString(); + + // Draw the item text. + e.Graphics.DrawString(text, font, + brush, e.Bounds.X, e.Bounds.Y); + } + + private void VariableOwnerDrawList_Load(object sender, EventArgs e) + { + + InstalledFontCollection families = new InstalledFontCollection(); + + foreach (FontFamily family in families.Families) + { + try + { + Font font = new Font(family.Name, 12); + FormattedListItemWrapper item = new FormattedListItemWrapper(family.Name, font); + listBox1.Items.Add(item); + } + catch (ArgumentException err) + { + // Ignore fonts that don't support the default size. + } + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/VariableOwnerDrawList.resx b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/VariableOwnerDrawList.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/VariableOwnerDrawList.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/bin/Debug/OwnerDrawList.exe b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/bin/Debug/OwnerDrawList.exe new file mode 100644 index 0000000..6cb2f28 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/bin/Debug/OwnerDrawList.exe differ diff --git a/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/bin/Release/OwnerDrawList.exe b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/bin/Release/OwnerDrawList.exe new file mode 100644 index 0000000..ef955ae Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/OwnerDrawListControls/bin/Release/OwnerDrawList.exe differ diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChart.sln b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChart.sln new file mode 100644 index 0000000..6f5309a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChart.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleChartHost", "SimpleChartHost\SimpleChartHost.csproj", "{3CD20CA2-3CDA-4102-9A25-B76CF3B692AF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleChartControl", "SimpleChartControl\SimpleChartControl.csproj", "{68E24D61-5B4F-4657-BF86-796C101D5614}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3CD20CA2-3CDA-4102-9A25-B76CF3B692AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3CD20CA2-3CDA-4102-9A25-B76CF3B692AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3CD20CA2-3CDA-4102-9A25-B76CF3B692AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3CD20CA2-3CDA-4102-9A25-B76CF3B692AF}.Release|Any CPU.Build.0 = Release|Any CPU + {68E24D61-5B4F-4657-BF86-796C101D5614}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68E24D61-5B4F-4657-BF86-796C101D5614}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68E24D61-5B4F-4657-BF86-796C101D5614}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68E24D61-5B4F-4657-BF86-796C101D5614}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChart.suo b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChart.suo new file mode 100644 index 0000000..70f543d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChart.suo differ diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/BarItem.cs b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/BarItem.cs new file mode 100644 index 0000000..9380a5a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/BarItem.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Globalization; +using System.Reflection; +using System.ComponentModel.Design.Serialization; +using System.Collections; + +namespace SimpleChart +{ + /// + /// Summary description for BarItem. + /// + /// + [Serializable()] + [TypeConverter(typeof(BarItemConverter))] + public class BarItem + { + private string shortForm; + public string ShortForm + { + get { return shortForm; } + set { shortForm = value; } + } + + private float barValue; + public float Value + { + get { return barValue; } + set { barValue = value; } + } + + public BarItem() + { + } + public BarItem(string shortForm, float value) + { + this.ShortForm = shortForm; + this.Value = value; + } + } + + + +} diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/BarItemConverter.cs b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/BarItemConverter.cs new file mode 100644 index 0000000..c3eadff --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/BarItemConverter.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; +using System.Globalization; +using System.ComponentModel.Design.Serialization; +using System.Reflection; + +namespace SimpleChart +{ + public class BarItemConverter : ExpandableObjectConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext context, Type t) + { + if (t == typeof(string)) + return true; + else + return base.CanConvertFrom(context, t); + } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destType) + { + if (destType == typeof(InstanceDescriptor) || destType == typeof(string)) + return true; + else + return base.CanConvertTo(context, destType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo info, object value) + { + if (value is string) + { + try + { + string[] elements = ((string)value).Split(','); + return new BarItem(elements[0], float.Parse(elements[1])); + } + catch + { + throw new ArgumentException("Could not convert the value"); + } + } + return base.ConvertFrom(context, info, value); + } + + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo info, object value, Type destType) + { + if (destType == typeof(string)) + { + BarItem item = (BarItem)value; + return String.Format("{0}, {1}", item.ShortForm, item.Value); + } + else if (destType == typeof(InstanceDescriptor)) + { + BarItem item = (BarItem)value; + ConstructorInfo ctor = + typeof(BarItem).GetConstructor( + new Type[] { typeof(string), typeof(float) }); + + return new InstanceDescriptor(ctor, + new object[] { item.ShortForm, item.Value }); + } + else + { + return base.ConvertTo(context, info, value, destType); + } + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChart.cs b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChart.cs new file mode 100644 index 0000000..6047341 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChart.cs @@ -0,0 +1,239 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Windows.Forms.VisualStyles; + +namespace SimpleChart +{ + /// + /// Summary description for SimpleChart. + /// + public class SimpleChart : Control + { + private IContainer components; + + public SimpleChart() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + // TODO: Add any initialization after the InitForm call + DoubleBuffered = true; + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.SuspendLayout(); + // + // SimpleChart + // + this.Size = new System.Drawing.Size(372, 228); + this.Resize += new System.EventHandler(this.SimpleChart_Resize); + this.ResumeLayout(false); + + } + #endregion + + private List bars = new List(); + + public List Bars + { + get + { + return bars; + } + set + { + bars = value; + RebuildChart(); + } + } + + // This prevents serialization errors by telling Visual Studio + // not to serialize the Bars property. Refer to Chapter 26 + // for an advanced example that solves this problem + // and allows design-time chart creation. + public bool ShouldSerializeBars() + { + return false; + } + + private List barRectangles = new List(); + + public void RebuildChart() + { + int barWidth; + float maxValue; + + if (bars.Count == 0) + { + return; + } + + // Find out how much space a single bar can occupy. + barWidth = (int)(base.Width / bars.Count); + + // Set the maximum value on the chart. + maxValue = 0; + + // Determine the maximum value. + foreach (BarItem bar in bars) + { + if (bar.Value > maxValue) + { + maxValue = bar.Value; + } + } + + // Create the rectangle shapes. + barRectangles.Clear(); + + // Track the x-coordinate while laying out the bars. + int x = 0; + // Leave some space at the top. + int topMargin = 5; + // Leave some space between bars. + int barGap = 4; + + foreach (BarItem bar in bars) + { + int height = (int)(bar.Value / maxValue * (Height - topMargin)); + int top = Height - height; + + barRectangles.Add(new Rectangle(x + barGap / 2, top, barWidth - barGap, height)); + x += barWidth; + } + + base.Invalidate(); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + // Fill the background. + if (Application.RenderWithVisualStyles) + { + VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupBackground.Normal); + renderer.DrawBackground(e.Graphics, e.ClipRectangle); + } + else + { + // Use a solid fill with the BackColor. + Brush brush = new SolidBrush(base.BackColor); + e.Graphics.FillRectangle(brush, e.ClipRectangle); + brush.Dispose(); + } + } + + protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) + { + base.OnPaint(e); + + if (barRectangles.Count == 0) return; + + foreach (Rectangle rect in barRectangles) + { + if (Application.RenderWithVisualStyles) + { + VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.StartPanel.UserPane.Normal); + renderer.DrawBackground(e.Graphics, rect); + } + else + { + // Draw bar (two rectangles are used for a shadowed effect). + int shadowMargin = 4; + Rectangle rectShadow = rect; + rectShadow.Offset(shadowMargin, shadowMargin); + + e.Graphics.FillRectangle(Brushes.White, rectShadow); + e.Graphics.FillRectangle(Brushes.SteelBlue, rect); + } + } + + // Draw text separately so it's superimposed on any + // overlapping bars. + int index = 0; + foreach (Rectangle rect in barRectangles) + { + // Get title. + string text = bars[index].ShortForm; + + // Get the position. + int textTopOffset = 10, textLeftOffset = 15; + Point ptText = rect.Location; + ptText.Offset(textTopOffset, textLeftOffset); + + // Draw the title. + e.Graphics.DrawString(text, Font, Brushes.White, + ptText); + + index++; + } + + // Draw bottom line of the the grid. + Pen pen = new Pen(Color.Black, 3); + e.Graphics.DrawLine(pen, 0, Height - 1, Width, + Height - 1); + pen.Dispose(); + //e.Graphics.DrawLine(Pens.Black, 0, 0, 0, base.Height); + + } + + private ToolTip toolTip; + protected override void OnMouseMove(MouseEventArgs e) + { + // Hit test all the bars. + int index = 0; + foreach (Rectangle rect in barRectangles) + { + if (rect.Contains(e.Location)) + { + // Get matching value. + string text = String.Format("{0:C}", bars[index].Value); + + // Get point in form coordinates. + Point pt = e.Location; + pt.Offset(base.Location); + toolTip.Show(text, base.FindForm(), pt); + return; + } + index++; + } + // No bar found. + toolTip.Hide(base.FindForm()); + + } + + private void SimpleChart_Resize(object sender, System.EventArgs e) + { + RebuildChart(); + base.Invalidate(); + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChart.resx b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChart.resx new file mode 100644 index 0000000..ca50931 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChart.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + False + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChartControl.csproj b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChartControl.csproj new file mode 100644 index 0000000..14fe686 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChartControl.csproj @@ -0,0 +1,106 @@ + + + Local + 8.0.50727 + 2.0 + {68E24D61-5B4F-4657-BF86-796C101D5614} + Debug + AnyCPU + + + + + SimpleChart + + + JScript + Grid + IE50 + false + Library + SimpleChart + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + + Component + + + SimpleChart.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChartControl.csproj.user b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChartControl.csproj.user new file mode 100644 index 0000000..7562390 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/SimpleChartControl.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/bin/Debug/SimpleChart.dll b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/bin/Debug/SimpleChart.dll new file mode 100644 index 0000000..479be57 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/bin/Debug/SimpleChart.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/bin/Release/SimpleChart.dll b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/bin/Release/SimpleChart.dll new file mode 100644 index 0000000..333371c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartControl/bin/Release/SimpleChart.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/App.ico b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/Program.cs b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/Program.cs new file mode 100644 index 0000000..2b6d9a3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace SimpleChartHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new SimpleChartTest()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartHost.csproj b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartHost.csproj new file mode 100644 index 0000000..84dee58 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartHost.csproj @@ -0,0 +1,109 @@ + + + Local + 8.0.50727 + 2.0 + {3CD20CA2-3CDA-4102-9A25-B76CF3B692AF} + Debug + AnyCPU + App.ico + + + SimpleChartHost + + + JScript + Grid + IE50 + false + WinExe + SimpleChartHost + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + + + Form + + + SimpleChartTest.cs + + + + + + {68E24D61-5B4F-4657-BF86-796C101D5614} + SimpleChartControl + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartHost.csproj.user b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartHost.csproj.user new file mode 100644 index 0000000..0b5586b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 13\SimpleChart\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartTest.Designer.cs b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartTest.Designer.cs new file mode 100644 index 0000000..e18b9d5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartTest.Designer.cs @@ -0,0 +1,77 @@ +namespace SimpleChartHost +{ + partial class SimpleChartTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SimpleChartTest)); + this.simpleChart1 = new SimpleChart.SimpleChart(); + this.Label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // simpleChart1 + // + this.simpleChart1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + + this.simpleChart1.Location = new System.Drawing.Point(15, 10); + this.simpleChart1.Name = "simpleChart1"; + this.simpleChart1.Size = new System.Drawing.Size(475, 281); + this.simpleChart1.TabIndex = 5; + this.simpleChart1.Text = "simpleChart1"; + // + // Label1 + // + this.Label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.Label1.Font = new System.Drawing.Font("Verdana", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Label1.Location = new System.Drawing.Point(10, 304); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(357, 36); + this.Label1.TabIndex = 4; + this.Label1.Text = "Historical Sales Report"; + // + // SimpleChartTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(508, 355); + this.Controls.Add(this.simpleChart1); + this.Controls.Add(this.Label1); + this.Name = "SimpleChartTest"; + this.Text = "SimpleChartTest"; + this.Load += new System.EventHandler(this.SimpleChartTest_Load); + this.ResumeLayout(false); + + } + + #endregion + + private SimpleChart.SimpleChart simpleChart1; + internal System.Windows.Forms.Label Label1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartTest.cs b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartTest.cs new file mode 100644 index 0000000..95cd4b5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/SimpleChartTest.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using SimpleChart; + +namespace SimpleChartHost +{ + public partial class SimpleChartTest : Form + { + public SimpleChartTest() + { + InitializeComponent(); + } + + private void SimpleChartTest_Load(object sender, EventArgs e) + { + simpleChart1.Bars.Add(new BarItem("Sales 2002", 10000)); + simpleChart1.Bars.Add(new BarItem("Sales 2003", 20000)); + simpleChart1.Bars.Add(new BarItem("Sales 2004", 5000)); + simpleChart1.Bars.Add(new BarItem("Sales 2005", 27000)); + simpleChart1.RebuildChart(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Debug/SimpleChart.dll b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Debug/SimpleChart.dll new file mode 100644 index 0000000..479be57 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Debug/SimpleChart.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Debug/SimpleChartHost.exe b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Debug/SimpleChartHost.exe new file mode 100644 index 0000000..f4467fc Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Debug/SimpleChartHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Release/SimpleChart.dll b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Release/SimpleChart.dll new file mode 100644 index 0000000..333371c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Release/SimpleChart.dll differ diff --git a/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Release/SimpleChartHost.exe b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Release/SimpleChartHost.exe new file mode 100644 index 0000000..e45341c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter12/SimpleChart/SimpleChartHost/bin/Release/SimpleChartHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog.sln b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog.sln new file mode 100644 index 0000000..b6a4ab7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DesignModeDialog", "DesignModeDialog\DesignModeDialog.csproj", "{2265A4D6-ED1B-47F4-B730-7D6B77368431}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp\TestApp.csproj", "{314151E4-8355-4573-A7E9-3C11AC5983DB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2265A4D6-ED1B-47F4-B730-7D6B77368431}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2265A4D6-ED1B-47F4-B730-7D6B77368431}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2265A4D6-ED1B-47F4-B730-7D6B77368431}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2265A4D6-ED1B-47F4-B730-7D6B77368431}.Release|Any CPU.Build.0 = Release|Any CPU + {314151E4-8355-4573-A7E9-3C11AC5983DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {314151E4-8355-4573-A7E9-3C11AC5983DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {314151E4-8355-4573-A7E9-3C11AC5983DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {314151E4-8355-4573-A7E9-3C11AC5983DB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog.suo b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog.suo new file mode 100644 index 0000000..f5b2f9c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog.suo differ diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignForm.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignForm.cs new file mode 100644 index 0000000..6dba55d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignForm.cs @@ -0,0 +1,261 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms.Design; +using System.Drawing.Design; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using System.Collections; + +namespace Microsoft.Samples +{ + class DesignForm : Form + { + // Fields + PropertyGrid _grid; + ISelectionService _selection; + IDesignerHost _host; + DesignSurface _surface; + Form _originalForm; + Hashtable _reparentedControls; + System.Collections.ObjectModel.Collection _propertiesToDesign; + Hashtable _customTypeDescriptors; + + public DesignForm(Form originalForm, System.Collections.ObjectModel.Collection propertiesToDesign) + { + // Copy parameters to fields + _originalForm = originalForm; + _propertiesToDesign = propertiesToDesign; + + // Create hashtables + _reparentedControls = new Hashtable(); + _customTypeDescriptors = new Hashtable(); + + // Create the DesignSurface and get the View from it; + _surface = new DesignSurface(typeof(Form)); + + // Setup UI, note, this can't be called until _surface is non-null + SetupUI(); + + // Get the IDesignerHost for the surface + _host = _surface.GetService(typeof(IDesignerHost)) as IDesignerHost; + + // Get the ISelectionService and hook the SelectionChanged event + _selection = _surface.GetService(typeof(ISelectionService)) as ISelectionService; + + if (_selection != null) + { + _selection.SelectionChanged += new EventHandler(SelectionChanged); + } + + // Get the rootForm from the IDesignerHost + Form rootForm = _host.RootComponent as Form; + if (rootForm != null) + { + // Clone the Form's properties + CloneControlProperties(_originalForm, rootForm); + + // Now that a customTypeDescriptor is around for the Form, use it + SampleCustomTypeDescriptor formDesc = _customTypeDescriptors[rootForm] as SampleCustomTypeDescriptor; + if (formDesc != null) + { + _grid.SelectedObject = formDesc; + } + + // Clone the controls on the Form + CloneControlsRecursive(_originalForm.Controls, rootForm); + } + } + + private void CloneControlProperties(Control original, Control clone) + { + // Create two PropertyDescriptorCollections, one for the original control's + // props and one for the clone's props + PropertyDescriptorCollection originalProps = TypeDescriptor.GetProperties(original); + PropertyDescriptorCollection cloneProps = TypeDescriptor.GetProperties(clone); + + // Create a third empty PropertyDescriptorCollection to give the the + // ICustomTypeDescriptor that the property grid will use + PropertyDescriptorCollection propsForCustomDescriptor = new PropertyDescriptorCollection(null); + + // Go through all the properties that the caller has told us to care about + PropertyDescriptor originalTemp, cloneTemp; + foreach (string propName in _propertiesToDesign) + { + // Special case Form location property + if (!((propName == "Location") && (typeof(Form).IsAssignableFrom(original.GetType())))) + { + // Fish out the property descriptors + originalTemp = originalProps[propName]; + cloneTemp = cloneProps[propName]; + + // Make sure the PropertyDescriptors aren't null and + // That we should set the property (that is, it's non-default) + if ((originalTemp != null) && (originalTemp.ShouldSerializeValue(original))) + { + // Set the clone's value to that of the original + cloneTemp.SetValue(clone, originalTemp.GetValue(original)); + } + + // Add the property to the collection for the ICustomTypeDescriptor + propsForCustomDescriptor.Add(cloneTemp); + } + } + + // Create a customTypeDescriptor, add it to the table + _customTypeDescriptors.Add(clone, new SampleCustomTypeDescriptor(clone, propsForCustomDescriptor)); + + // Finally, stuff away original control + clone.Tag = original; + } + + private void CloneControlsRecursive(System.Windows.Forms.Control.ControlCollection originalControls, Control cloneContainer) + { + // Go through each control in the original container + Control clone; + foreach (Control original in originalControls) + { + // Create a fresh control of the proper type + clone = _host.CreateComponent(original.GetType()) as Control; + if (clone != null) + { + // Clone the control properties + CloneControlProperties(original, clone); + + // Add the control to the new parent + cloneContainer.Controls.Add(clone); + + // If we've already got the same number of controls as the original + // don't recurse through the controls collection + if (clone.Controls.Count != original.Controls.Count) + { + // Recursively continue for child controls + CloneControlsRecursive(original.Controls, clone); + } + } + + } + } + + private void me_FormClosing(object sender, FormClosingEventArgs e) + { + Form rootForm = _host.RootComponent as Form; + + if (rootForm != null) + { + // Restore Form proeprties + CloneControlProperties(rootForm, _originalForm); + + // Restore child control properties + RestoreControlsRecursive(rootForm.Controls, _originalForm.Controls); + + // Deal with any reparented controls + ReparentControls(); + } + } + + private void ReparentControls() + { + // Look through all the reparented controls and reparent + // them on the original form as well + IDictionaryEnumerator enumerator = _reparentedControls.GetEnumerator(); + + Control original; + Control originalParent; + + while (enumerator.MoveNext()) + { + // Fish out the control and it's new parent + original = enumerator.Key as Control; + originalParent = enumerator.Value as Control; + + if ((original != null) && (originalParent != null)) + { + // Once we find the control and it's parent on the original form + // we can reparent it + Control destinationControl = original.Tag as Control; + Control destinationParent = originalParent.Tag as Control; + + if ((destinationControl != null) && (destinationParent != null)) { + destinationParent.Controls.Add(destinationControl); + } + } + } + } + + private void RestoreControlsRecursive(System.Windows.Forms.Control.ControlCollection newControls, System.Windows.Forms.Control.ControlCollection originalControls) + { + bool found; + foreach (Control newControl in newControls) + { + // Fish out the + Control originalControlFromTag = newControl.Tag as Control; + + if (originalControlFromTag != null) + { + // Restore properties + CloneControlProperties(newControl, originalControlFromTag); + + // Restore child controls + RestoreControlsRecursive(newControl.Controls, originalControlFromTag.Controls); + } + + // Look for the control to make sure it hasn't been reparented + found = false; + foreach (Control originalControl in originalControls) + { + if (originalControlFromTag == originalControl) + { + found = true; + break; + } + } + // If it's been reparented, stash it away so we can change it's parent later + if (!found) + { + _reparentedControls[newControl] = newControls.Owner; + } + } + } + + private void SelectionChanged(object sender, EventArgs e) + { + // Fish out the custom type descriptor and use it + SampleCustomTypeDescriptor controlDesc = _customTypeDescriptors[_selection.PrimarySelection] as SampleCustomTypeDescriptor; + if (controlDesc != null) + { + _grid.SelectedObject = controlDesc; + } + } + + private void SetupUI() + { + // Create controls + Control view = _surface.View as Control; + Splitter splitter = new Splitter(); + + // If we got a view control out of the DesignSurface, setup the Form + if (view != null) + { + _grid = new PropertyGrid(); + _grid.Size = new Size(250, _grid.Size.Height); + _grid.Dock = DockStyle.Right; + _grid.PropertySort = PropertySort.Alphabetical; + _grid.ToolbarVisible = false; + _grid.CommandsVisibleIfAvailable = false; + + splitter.Dock = DockStyle.Right; + + view.Dock = DockStyle.Fill; + + this.Size = new Size(_originalForm.Size.Width + 315, _originalForm.Size.Height + 85); + this.FormClosing += new FormClosingEventHandler(me_FormClosing); + this.Controls.Add(view); + this.Controls.Add(splitter); + this.Controls.Add(_grid); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialog.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialog.cs new file mode 100644 index 0000000..7b7c123 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialog.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms.Design; +using System.Drawing.Design; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using System.Collections; +using System.Collections.ObjectModel; + +namespace Microsoft.Samples +{ + [Designer(typeof(DesignModeDialogDesigner))] + public class DesignModeDialog : Component + { + // Fields + Form _hostForm; + Collection _propertiesToDesign; + + public DesignModeDialog() + { + _propertiesToDesign = new Collection(); + } + + public Form HostForm + { + get + { + return _hostForm; + } + set + { + _hostForm = value; + } + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + public Collection PropertiesToDesign + { + get + { + return _propertiesToDesign; + } + } + + public DialogResult ShowDialog() + { + DesignForm form = new DesignForm(_hostForm, _propertiesToDesign); + return form.ShowDialog(); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialog.csproj b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialog.csproj new file mode 100644 index 0000000..9e222f5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialog.csproj @@ -0,0 +1,63 @@ + + + Debug + 8.0.40413 + 2.0 + {2265A4D6-ED1B-47F4-B730-7D6B77368431} + Library + Microsoft.Samples + DesignModeDialog + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + + Form + + + Component + + + + + + ResXFileCodeGenerator + Resources.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialog.csproj.user b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialog.csproj.user new file mode 100644 index 0000000..40dd968 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialog.csproj.user @@ -0,0 +1,7 @@ + + + 8.0.40413 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialogDesigner.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialogDesigner.cs new file mode 100644 index 0000000..3dc6b1b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/DesignModeDialogDesigner.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms.Design; +using System.Drawing.Design; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using System.Collections; +using System.Collections.ObjectModel; + +namespace Microsoft.Samples +{ + public class DesignModeDialogDesigner : ComponentDesigner + { + public override void Initialize(IComponent component) + { + base.Initialize(component); + + ITypeDiscoveryService discoveryService = this.GetService(typeof(ITypeDiscoveryService)) as ITypeDiscoveryService; + IDesignerHost host = this.GetService(typeof(IDesignerHost)) as IDesignerHost; + + if (host != null) + { + PropertyDescriptor hostFormProp = TypeDescriptor.GetProperties(this.Component)["HostForm"]; + Form hostForm = host.RootComponent as Form; + if ((hostFormProp != null) && (hostForm != null)) + { + hostFormProp.SetValue(this.Component, hostForm); + } + } + } + + + public override void InitializeNewComponent(IDictionary defaultValues) + { + PropertyDescriptor propertiesToDesignProp = TypeDescriptor.GetProperties(this.Component)["PropertiesToDesign"]; + Collection _propertiesToDesign = propertiesToDesignProp.GetValue(this.Component) as Collection; + + // Add some defaults + if (_propertiesToDesign.Count == 0) + { + string[] props = new string[] { "Items", "AutoSize", "Size", "Text", "Font", "Location", "ForeColor", "BackColor", "Anchor", "Dock", "ClientSize" }; + foreach (string s in props) + { + _propertiesToDesign.Add(s); + } + } + + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..3f6ce48 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("FormInDesignMode")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("FormInDesignMode")] +[assembly: AssemblyCopyright("Copyright @ Microsoft 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Resources.cs new file mode 100644 index 0000000..a2a9694 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Resources.cs @@ -0,0 +1,46 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40218.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace FormInDesignMode +{ + using System; + using System.IO; + using System.Resources; + + + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + sealed class Resources + { + + private static System.Resources.ResourceManager _resMgr; + + private Resources() + { + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager + { + get + { + if ((_resMgr == null)) + { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager(typeof(Resources)); + System.Threading.Thread.MemoryBarrier(); + _resMgr = temp; + } + return _resMgr; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Settings.cs new file mode 100644 index 0000000..c9bde69 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Settings.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40413.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace FormInDesignMode +{ + + + public partial class Settings : System.Configuration.ApplicationSettingsBase + { + + private static Settings m_DefaultInstance; + + private static object m_SyncObject = new object(); + + public static Settings DefaultInstance + { + get + { + if ((Settings.m_DefaultInstance == null)) + { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_DefaultInstance == null)) + { + try + { + Settings.m_DefaultInstance = new Settings(); + } + finally + { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_DefaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Settings.settings new file mode 100644 index 0000000..4024694 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/SampleCustomTypeDescriptor.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/SampleCustomTypeDescriptor.cs new file mode 100644 index 0000000..b93db78 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/SampleCustomTypeDescriptor.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms.Design; +using System.Drawing.Design; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using System.Collections; + +namespace Microsoft.Samples +{ + class SampleCustomTypeDescriptor : ICustomTypeDescriptor + { + // Fields + Control _hostControl; + PropertyDescriptorCollection _props; + + public SampleCustomTypeDescriptor(Control hostControl, PropertyDescriptorCollection props) + { + _hostControl = hostControl; + _props = props; + } + + public AttributeCollection GetAttributes() + { + return new AttributeCollection(null); + } + + public String GetClassName() + { + return null; + } + + public String GetComponentName() + { + return null; + } + + public TypeConverter GetConverter() + { + return null; + } + + public EventDescriptor GetDefaultEvent() + { + return null; + } + + public PropertyDescriptor GetDefaultProperty() + { + return null; + } + + public Object GetEditor(Type editorBaseType) + { + return null; + } + + public EventDescriptorCollection GetEvents() + { + return new EventDescriptorCollection(null); + } + + public EventDescriptorCollection GetEvents(Attribute[] attributes) + { + return new EventDescriptorCollection(null); + } + + public PropertyDescriptorCollection GetProperties() + { + return _props; + } + + public PropertyDescriptorCollection GetProperties(Attribute[] attributes) + { + return _props; + } + + public Object GetPropertyOwner (PropertyDescriptor pd) + { + return _hostControl; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/bin/Debug/DesignModeDialog.dll b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/bin/Debug/DesignModeDialog.dll new file mode 100644 index 0000000..8693110 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/bin/Debug/DesignModeDialog.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/bin/Release/DesignModeDialog.dll b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/bin/Release/DesignModeDialog.dll new file mode 100644 index 0000000..ae998b1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/DesignModeDialog/bin/Release/DesignModeDialog.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Form1.Designer.cs new file mode 100644 index 0000000..e9c2bf0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Form1.Designer.cs @@ -0,0 +1,196 @@ +namespace TestApp +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.button2 = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.button4 = new System.Windows.Forms.Button(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.button1 = new System.Windows.Forms.Button(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + this.designModeDialog1 = new Microsoft.Samples.DesignModeDialog(); + this.button3 = new System.Windows.Forms.Button(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + this.SuspendLayout(); +// +// tabControl1 +// + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Location = new System.Drawing.Point(87, 88); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(403, 260); + this.tabControl1.TabIndex = 0; +// +// tabPage1 +// + this.tabPage1.Controls.Add(this.button2); + this.tabPage1.Controls.Add(this.groupBox1); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(395, 234); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "tabPage1"; +// +// button2 +// + this.button2.Location = new System.Drawing.Point(37, 178); + this.button2.Name = "button2"; + this.button2.TabIndex = 1; + this.button2.Text = "button2"; +// +// groupBox1 +// + this.groupBox1.Controls.Add(this.button4); + this.groupBox1.Location = new System.Drawing.Point(71, 62); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "groupBox1"; +// +// button4 +// + this.button4.Location = new System.Drawing.Point(53, 20); + this.button4.Name = "button4"; + this.button4.TabIndex = 0; + this.button4.Text = "button4"; +// +// tabPage2 +// + this.tabPage2.Controls.Add(this.dataGridView1); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(395, 234); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "tabPage2"; +// +// dataGridView1 +// + this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.dataGridView1.Location = new System.Drawing.Point(3, 3); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(389, 228); + this.dataGridView1.TabIndex = 0; +// +// button1 +// + this.button1.Location = new System.Drawing.Point(323, 58); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(160, 23); + this.button1.TabIndex = 0; + this.button1.Text = "Click to go to design mode"; + this.button1.Click += new System.EventHandler(this.button1_Click); +// +// comboBox1 +// + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(81, 46); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.TabIndex = 1; +// +// numericUpDown1 +// + this.numericUpDown1.Location = new System.Drawing.Point(242, 28); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.TabIndex = 2; +// +// designModeDialog1 +// + this.designModeDialog1.HostForm = this; + this.designModeDialog1.PropertiesToDesign.Add("Items"); + this.designModeDialog1.PropertiesToDesign.Add("AutoSize"); + this.designModeDialog1.PropertiesToDesign.Add("Size"); + this.designModeDialog1.PropertiesToDesign.Add("Text"); + this.designModeDialog1.PropertiesToDesign.Add("Font"); + this.designModeDialog1.PropertiesToDesign.Add("Location"); + this.designModeDialog1.PropertiesToDesign.Add("ForeColor"); + this.designModeDialog1.PropertiesToDesign.Add("BackColor"); + this.designModeDialog1.PropertiesToDesign.Add("Anchor"); + this.designModeDialog1.PropertiesToDesign.Add("Dock"); + this.designModeDialog1.PropertiesToDesign.Add("ClientSize"); +// +// button3 +// + this.button3.Location = new System.Drawing.Point(25, 4); + this.button3.Name = "button3"; + this.button3.TabIndex = 3; + this.button3.Text = "button3"; +// +// Form1 +// + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(502, 360); + this.Controls.Add(this.button3); + this.Controls.Add(this.numericUpDown1); + this.Controls.Add(this.button1); + this.Controls.Add(this.comboBox1); + this.Controls.Add(this.tabControl1); + this.Name = "Form1"; + this.Text = "Form1"; + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.DataGridView dataGridView1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.NumericUpDown numericUpDown1; + private Microsoft.Samples.DesignModeDialog designModeDialog1; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + + + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Form1.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Form1.cs new file mode 100644 index 0000000..142b8c8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Form1.cs @@ -0,0 +1,27 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Windows.Forms; + +#endregion + +namespace TestApp +{ + partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void button1_Click(object sender, EventArgs e) + { + MessageBox.Show("When in the design dialog, you can select and move controls. Other properties can be set using the property grid. \n\nClose the dialog to save the changes."); + this.designModeDialog1.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Program.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Program.cs new file mode 100644 index 0000000..7f77bf8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Program.cs @@ -0,0 +1,24 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +#endregion + +namespace TestApp +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f6ac53c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("TestApp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("TestApp")] +[assembly: AssemblyCopyright("Copyright @ Microsoft 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Resources.cs new file mode 100644 index 0000000..949dea7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Resources.cs @@ -0,0 +1,46 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40218.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace TestApp +{ + using System; + using System.IO; + using System.Resources; + + + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + sealed class Resources + { + + private static System.Resources.ResourceManager _resMgr; + + private Resources() + { + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager + { + get + { + if ((_resMgr == null)) + { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager(typeof(Resources)); + System.Threading.Thread.MemoryBarrier(); + _resMgr = temp; + } + return _resMgr; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Settings.cs new file mode 100644 index 0000000..e022309 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Settings.cs @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40413.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace TestApp +{ + + + public partial class Settings : System.Configuration.ApplicationSettingsBase + { + + private static Settings m_DefaultInstance; + + private static object m_SyncObject = new object(); + + public static Settings DefaultInstance + { + get + { + if ((Settings.m_DefaultInstance == null)) + { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_DefaultInstance == null)) + { + try + { + Settings.m_DefaultInstance = new Settings(); + } + finally + { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_DefaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Settings.settings new file mode 100644 index 0000000..4024694 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/TestApp.csproj b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/TestApp.csproj new file mode 100644 index 0000000..78f0059 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/TestApp.csproj @@ -0,0 +1,67 @@ + + + Debug + 8.0.50727 + 2.0 + {314151E4-8355-4573-A7E9-3C11AC5983DB} + WinExe + TestApp + TestApp + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + + Form + + + Form1.cs + + + + + ResXFileCodeGenerator + Resources.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + + + + {2265A4D6-ED1B-47F4-B730-7D6B77368431} + DesignModeDialog + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/TestApp.csproj.user b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/TestApp.csproj.user new file mode 100644 index 0000000..6fe9855 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/TestApp.csproj.user @@ -0,0 +1,7 @@ + + + 8.0.50215 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Debug/DesignModeDialog.dll b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Debug/DesignModeDialog.dll new file mode 100644 index 0000000..8693110 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Debug/DesignModeDialog.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Debug/DesignModeDialog.exe b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Debug/DesignModeDialog.exe new file mode 100644 index 0000000..d5580f2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Debug/DesignModeDialog.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Debug/TestApp.exe b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Debug/TestApp.exe new file mode 100644 index 0000000..0477cee Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Debug/TestApp.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Release/DesignModeDialog.dll b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Release/DesignModeDialog.dll new file mode 100644 index 0000000..ae998b1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Release/DesignModeDialog.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Release/TestApp.exe b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Release/TestApp.exe new file mode 100644 index 0000000..e2ac6fb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DesignModeAtRuntime/TestApp/bin/Release/TestApp.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTree.sln b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTree.sln new file mode 100644 index 0000000..6a5ec5f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTree.sln @@ -0,0 +1,28 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryTreeControl", "DirectoryTreeControl\DirectoryTreeControl.csproj", "{3BAAC556-742E-413E-B3EC-12E23DB99DB8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryTreeHost", "DirectoryTreeHost\DirectoryTreeHost.csproj", "{822BA761-DEC0-48C6-BA50-290B02E1BF77}" + ProjectSection(ProjectDependencies) = postProject + {3BAAC556-742E-413E-B3EC-12E23DB99DB8} = {3BAAC556-742E-413E-B3EC-12E23DB99DB8} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Release|Any CPU.Build.0 = Release|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTree.suo b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTree.suo new file mode 100644 index 0000000..b294ecf Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTree.suo differ diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTree.bmp b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTree.bmp new file mode 100644 index 0000000..ce685df Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTree.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTree.cs b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTree.cs new file mode 100644 index 0000000..2e8717e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTree.cs @@ -0,0 +1,114 @@ +using System; +using System.IO; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Drawing.Design; +using System.Drawing; + +namespace DirectoryTreeControl +{ + [ToolboxBitmap(typeof(DirectoryTree), "DirectoryTree.bmp")] + [DefaultEvent("DirectorySelected"), + DefaultProperty("Drive")] + public class DirectoryTree : TreeView + { + public delegate void DirectorySelectedDelegate(object sender, + DirectorySelectedEventArgs e); + public event DirectorySelectedDelegate DirectorySelected; + + private Char drive; + //[Editor(typeof(DriveEditor), typeof(UITypeEditor))] + [TypeConverter(typeof(DriveCharConverter))] + public Char Drive + { + get + { + return drive; + } + set + { + drive = value; + RefreshDisplay(); + } + } + + // This is public so a Refresh can be triggered manually. + public void RefreshDisplay() + { + // Nodes aren't generated at design-time. + // Instead, they're created at runtime. + // Otherwise, these nodes will be serialized + // into the designer code, which isn't what we want. + // A more elegant approach is to use a control designer, + // as shown in the version of the DirectoryTree control + // used in Chapter 26. + if (this.DesignMode) return; + + // Erase the existing tree. + this.Nodes.Clear(); + + // Set the first node. + TreeNode rootNode = new TreeNode(drive + ":\\"); + this.Nodes.Add(rootNode); + + // Fill the first level and expand it. + Fill(rootNode); + this.Nodes[0].Expand(); + } + + private void Fill(TreeNode dirNode) + { + DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath); + + // An exception could be thrown in this code if you don't + // have sufficient security permissions for a file or directory. + // You can catch and then ignore this exception. + + foreach (DirectoryInfo dirItem in dir.GetDirectories()) + { + // Add node for the directory. + TreeNode newNode = new TreeNode(dirItem.Name); + dirNode.Nodes.Add(newNode); + newNode.Nodes.Add("*"); + } + } + + protected override void OnBeforeExpand(TreeViewCancelEventArgs e) + { + base.OnBeforeExpand(e); + + // If a dummy node is found, remove it and read the real directory list. + if (e.Node.Nodes[0].Text == "*") + { + e.Node.Nodes.Clear(); + Fill(e.Node); + } + } + + protected override void OnAfterSelect(TreeViewEventArgs e) + { + base.OnAfterSelect(e); + + // Raise the DirectorySelected event. + if (DirectorySelected != null) + { + DirectorySelected(this, + new DirectorySelectedEventArgs(e.Node.FullPath)); + } + } + } + + public class DirectorySelectedEventArgs : EventArgs + { + public string DirectoryName; + + public DirectorySelectedEventArgs(string directoryName) + { + this.DirectoryName = directoryName; + } + } + + +} diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTree.resx b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTree.resx new file mode 100644 index 0000000..7e32396 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTree.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj new file mode 100644 index 0000000..f54af24 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj @@ -0,0 +1,117 @@ + + + Local + 8.0.50727 + 2.0 + {3BAAC556-742E-413E-B3EC-12E23DB99DB8} + Debug + AnyCPU + + + + + DirectoryTreeControl + + + JScript + Grid + IE50 + false + Library + DirectoryTreeControl + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Design + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Design.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Component + + + + Code + + + Form + + + + DirectoryTree.cs + + + SelectDrive.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj.user b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj.user new file mode 100644 index 0000000..9a93a83 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.sln b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.sln new file mode 100644 index 0000000..11228a9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryTreeControl", "DirectoryTreeControl.csproj", "{3BAAC556-742E-413E-B3EC-12E23DB99DB8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryTreeHost", "..\DirectoryTreeHost\DirectoryTreeHost.csproj", "{822BA761-DEC0-48C6-BA50-290B02E1BF77}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Release|Any CPU.Build.0 = Release|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.suo b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.suo new file mode 100644 index 0000000..cb751eb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.suo differ diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DriveCharConverter.cs b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DriveCharConverter.cs new file mode 100644 index 0000000..8e778d6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DriveCharConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; +using System.Collections; + +namespace DirectoryTreeControl +{ + public class DriveCharConverter : CharConverter + { + + private static TypeConverter.StandardValuesCollection svc; + + public override System.ComponentModel.TypeConverter.StandardValuesCollection + GetStandardValues(ITypeDescriptorContext context) + { + if (svc == null) + { + + ArrayList drives = new ArrayList(); + foreach (string drive in System.IO.Directory.GetLogicalDrives()) + { + drives.Add(drive[0]); + } + svc = new TypeConverter.StandardValuesCollection(drives); + } + + + return svc; + } + + public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) + { return false; } + + public override bool GetStandardValuesSupported( + ITypeDescriptorContext context) + { return true; } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DriveEditor.cs b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DriveEditor.cs new file mode 100644 index 0000000..e3b872a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/DriveEditor.cs @@ -0,0 +1,44 @@ +using System; +using System.IO; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Drawing.Design; + +namespace DirectoryTreeControl +{ + public class DriveEditor : UITypeEditor + { + public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle( + System.ComponentModel.ITypeDescriptorContext context) + { + // We will use a window for property editing. + return UITypeEditorEditStyle.Modal; + + } + + public override object EditValue( + System.ComponentModel.ITypeDescriptorContext context, + System.IServiceProvider provider, object value) + { + SelectDrive frm = new SelectDrive(); + + // Set current drive in window. + frm.DriveSelection = (char)value; + frm.ShowDialog(); + + // Return the new value. + return frm.DriveSelection; + } + + public override bool GetPaintValueSupported( + System.ComponentModel.ITypeDescriptorContext context) + { + // No special thumbnail will be shown for the grid. + return false; + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/SelectDrive.cs b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/SelectDrive.cs new file mode 100644 index 0000000..d3b2ae9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/SelectDrive.cs @@ -0,0 +1,131 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace DirectoryTreeControl +{ + /// + /// Summary description for SelectDrive. + /// + public class SelectDrive : System.Windows.Forms.Form + { + internal System.Windows.Forms.Button cmdClose; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.ListBox lstDrives; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public SelectDrive() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdClose = new System.Windows.Forms.Button(); + this.Label1 = new System.Windows.Forms.Label(); + this.lstDrives = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); + // + // cmdClose + // + this.cmdClose.DialogResult = System.Windows.Forms.DialogResult.OK; + this.cmdClose.Location = new System.Drawing.Point(80, 224); + this.cmdClose.Name = "cmdClose"; + this.cmdClose.Size = new System.Drawing.Size(104, 24); + this.cmdClose.TabIndex = 5; + this.cmdClose.Text = "OK"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(8, 8); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(208, 16); + this.Label1.TabIndex = 4; + this.Label1.Text = "Choose a Drive:"; + // + // lstDrives + // + this.lstDrives.Location = new System.Drawing.Point(8, 24); + this.lstDrives.Name = "lstDrives"; + this.lstDrives.Size = new System.Drawing.Size(248, 173); + this.lstDrives.TabIndex = 3; + // + // SelectDrive + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(266, 260); + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.cmdClose, + this.Label1, + this.lstDrives}); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SelectDrive"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "SelectDrive"; + this.Load += new System.EventHandler(this.SelectDrive_Load); + this.ResumeLayout(false); + + } + #endregion + + public Char DriveSelection; + + private void SelectDrive_Load(object sender, System.EventArgs e) + { + string[] drives = System.IO.Directory.GetLogicalDrives(); + lstDrives.DataSource = drives; + + // Select the current drive. + lstDrives.SelectedIndex = lstDrives.FindString(DriveSelection.ToString()); + + // Attach the event handler. + // This step is performed after the selected index is set, + // to prevent it from being overwritten as the list is built. + lstDrives.SelectedIndexChanged += new + EventHandler(lstDrives_SelectedIndexChanged); + + } + + private void lstDrives_SelectedIndexChanged(object sender, + System.EventArgs e) + { + DriveSelection = lstDrives.Text[0]; + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/SelectDrive.resx b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/SelectDrive.resx new file mode 100644 index 0000000..f001600 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/SelectDrive.resx @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + + Assembly + + + Assembly + + + SelectDrive + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/bin/Debug/DirectoryTreeControl.dll b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/bin/Debug/DirectoryTreeControl.dll new file mode 100644 index 0000000..9105616 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/bin/Debug/DirectoryTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/bin/Release/DirectoryTreeControl.dll b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/bin/Release/DirectoryTreeControl.dll new file mode 100644 index 0000000..4300e69 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeControl/bin/Release/DirectoryTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/App.ico b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj new file mode 100644 index 0000000..e752ff6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj @@ -0,0 +1,117 @@ + + + Local + 8.0.50727 + 2.0 + {822BA761-DEC0-48C6-BA50-290B02E1BF77} + Debug + AnyCPU + App.ico + + + DirectoryTreeHost + + + JScript + Grid + IE50 + false + WinExe + DirectoryTreeHost + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Design + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Design.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + + Form + + + DirectoryTreeTest.cs + + + + Designer + DirectoryTreeTest.cs + + + + + + {3BAAC556-742E-413E-B3EC-12E23DB99DB8} + DirectoryTreeControl + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj.user b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj.user new file mode 100644 index 0000000..1fceeb3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 08\DirectoryTreeControl\bin\Debug\;D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 07\DirectoryTreeControl\bin\Debug\;D:\Matthew\2002\Writing\Books\User Interfaces in VB .NET (and C#)\C#\Code\Chapter 08\DirectoryTreeControl\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.Designer.cs b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.Designer.cs new file mode 100644 index 0000000..2090f4c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.Designer.cs @@ -0,0 +1,90 @@ +namespace DirectoryTreeHost +{ + partial class DirectoryTreeTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DirectoryTreeTest)); + this.directoryTree1 = new DirectoryTreeControl.DirectoryTree(); + this.propertyGrid1 = new System.Windows.Forms.PropertyGrid(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // directoryTree1 + // + this.directoryTree1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.directoryTree1.Drive = 'C'; + this.directoryTree1.Location = new System.Drawing.Point(277, 8); + this.directoryTree1.Name = "directoryTree1"; + this.directoryTree1.Size = new System.Drawing.Size(331, 250); + this.directoryTree1.TabIndex = 4; + // + // propertyGrid1 + // + this.propertyGrid1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.propertyGrid1.LineColor = System.Drawing.SystemColors.ScrollBar; + this.propertyGrid1.Location = new System.Drawing.Point(4, 4); + this.propertyGrid1.Name = "propertyGrid1"; + this.propertyGrid1.SelectedObject = this.directoryTree1; + this.propertyGrid1.Size = new System.Drawing.Size(260, 329); + this.propertyGrid1.TabIndex = 3; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.Location = new System.Drawing.Point(277, 263); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(334, 68); + this.label1.TabIndex = 5; + this.label1.Text = resources.GetString("label1.Text"); + // + // DirectoryTreeTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(617, 339); + this.Controls.Add(this.label1); + this.Controls.Add(this.directoryTree1); + this.Controls.Add(this.propertyGrid1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "DirectoryTreeTest"; + this.Text = "DirectoryTreeTest"; + this.ResumeLayout(false); + + } + + #endregion + + private DirectoryTreeControl.DirectoryTree directoryTree1; + private System.Windows.Forms.PropertyGrid propertyGrid1; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.cs b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.cs new file mode 100644 index 0000000..d325f87 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DirectoryTreeHost +{ + public partial class DirectoryTreeTest : Form + { + public DirectoryTreeTest() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.resx b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.resx new file mode 100644 index 0000000..40a016e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The tree only appears at runtime, which is a valid design decision (after all, the drive might not be accessible, or enumerating the directories might be very slow). However, Chapter 26 shows how you can use a control designer to make this feature work at design-time without causing any serialization problems. + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/Program.cs b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/Program.cs new file mode 100644 index 0000000..c609036 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DirectoryTreeHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new DirectoryTreeTest()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeControl.dll b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeControl.dll new file mode 100644 index 0000000..9105616 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeHost.exe b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeHost.exe new file mode 100644 index 0000000..84c335d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeControl.dll b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeControl.dll new file mode 100644 index 0000000..4300e69 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeHost.exe b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeHost.exe new file mode 100644 index 0000000..a56659d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanel.sln b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanel.sln new file mode 100644 index 0000000..47d9663 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanel.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GradientPanelControl", "GradientPanelControl\GradientPanelControl.csproj", "{249E3320-5FB8-48DC-AD25-DBE71195209A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GradientPanelHost", "GradientPanelHost\GradientPanelHost.csproj", "{9BA9D88F-A938-44BF-ACDE-29F63B54D586}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Release|Any CPU.Build.0 = Release|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanel.suo b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanel.suo new file mode 100644 index 0000000..275d47e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanel.suo differ diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientFill.cs b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientFill.cs new file mode 100644 index 0000000..2800d28 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientFill.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.ComponentModel; +using System.Drawing.Drawing2D; +using System.Drawing.Design; + +namespace GradientPanelControl +{ + //[TypeConverter(typeof(ExpandableObjectConverter)), + [Editor(typeof(GradientFillEditor), typeof(UITypeEditor))] + [TypeConverter(typeof(GradientFillConverter))] + public class GradientFill + { + private Color colorA = Color.LightBlue; + private Color colorB = Color.Purple; + private LinearGradientMode gradientStyle = LinearGradientMode.ForwardDiagonal; + + public event EventHandler GradientChanged; + + [RefreshProperties(RefreshProperties.Repaint)] + [NotifyParentProperty(true)] + [DefaultValue(typeof(Color), "LightBlue")] + public Color ColorA + { + get + { + return colorA; + } + set + { + colorA = value; + OnGradientChanged(EventArgs.Empty); + } + } + + [RefreshProperties(RefreshProperties.Repaint)] + [NotifyParentProperty(true)] + [DefaultValue(typeof(Color), "Purple")] + public Color ColorB + { + get + { + return colorB; + } + set + { + colorB = value; + OnGradientChanged(EventArgs.Empty); + } + } + + [RefreshProperties(RefreshProperties.Repaint)] + [NotifyParentProperty(true)] + [DefaultValue(typeof(LinearGradientMode), "ForwardDiagonal")] + public LinearGradientMode GradientFillStyle + { + get + { + return gradientStyle; + } + set + { + gradientStyle = value; + OnGradientChanged(EventArgs.Empty); + } + } + + private void OnGradientChanged(EventArgs e) + { + if (GradientChanged != null) + { + GradientChanged(this, e); + } + } + + public GradientFill() + { + } + public GradientFill(Color colorA, Color colorB, LinearGradientMode gradientFillStyle) + { + ColorA = colorA; + ColorB = colorB; + GradientFillStyle = gradientFillStyle; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientFillConverter.cs b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientFillConverter.cs new file mode 100644 index 0000000..3e43af8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientFillConverter.cs @@ -0,0 +1,104 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing.Drawing2D; +using System.Drawing; +using System.ComponentModel; +using System.Globalization; +#endregion + +namespace GradientPanelControl +{ + public class GradientFillConverter : ExpandableObjectConverter + { + private string ToString(object value) + { + GradientFill fill = (GradientFill)value; + ColorConverter converter = new ColorConverter(); + return String.Format("{0}, {1}, {2}", converter.ConvertToString(fill.ColorA), converter.ConvertToString(fill.ColorB), fill.GradientFillStyle.ToString()); + } + + private GradientFill FromString(object value) + { + string[] values = ((string)value).Split(','); + if (values.Length != 3) + throw new ArgumentException("Could not convert the value"); + + try + { + GradientFill gradient = new GradientFill(); + + ColorConverter converter = new ColorConverter(); + + gradient.ColorA = (Color)converter.ConvertFromString(values[0]); + gradient.ColorB = (Color)converter.ConvertFromString(values[1]); + + // Convert the name of the enumerated value into the corresponding + // enumerated value (which is actually an integer constant). + gradient.GradientFillStyle = (LinearGradientMode)Enum.Parse( + typeof(LinearGradientMode), values[2], true); + + return gradient; + } + catch + { + throw new ArgumentException("Could not convert the value"); + } + } + + public override bool CanConvertFrom(ITypeDescriptorContext context, + Type sourceType) + { + if (sourceType == typeof(string)) + { + return true; + } + else + { + return base.CanConvertFrom(context, sourceType); + } + } + + public override object ConvertFrom(ITypeDescriptorContext context, + CultureInfo culture, object value) + { + if (value is string) + { + return FromString(value); + } + else + { + return base.ConvertFrom(context, culture, value); + } + } + public override bool CanConvertTo(ITypeDescriptorContext context, + Type destinationType) + { + if (destinationType == typeof(string)) + { + return true; + } + else + { + return base.CanConvertTo(context, destinationType); + } + } + + public override object ConvertTo(ITypeDescriptorContext context, + CultureInfo culture, object value, Type destinationType) + { + if (destinationType == typeof(string)) + { + return ToString(value); + } + else + { + return base.ConvertTo(context, culture, value, destinationType); + } + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientFillEditor.cs b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientFillEditor.cs new file mode 100644 index 0000000..c811ba8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientFillEditor.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing.Design; +using System.Drawing.Drawing2D; + +namespace GradientPanelControl +{ + public class GradientFillEditor : UITypeEditor + { + + public override bool GetPaintValueSupported( + System.ComponentModel.ITypeDescriptorContext context) + { + return true; + } + + public override void PaintValue( + System.Drawing.Design.PaintValueEventArgs e) + { + GradientFill fill = (GradientFill)e.Value; + LinearGradientBrush brush = new LinearGradientBrush(e.Bounds, + fill.ColorA, fill.ColorB, fill.GradientFillStyle); + + // Paint the thumbnail. + e.Graphics.FillRectangle(brush, e.Bounds); + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanel.cs b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanel.cs new file mode 100644 index 0000000..7f21ea8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanel.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Drawing.Drawing2D; +using System.Drawing.Design; +// Needed for advanced visual styles scenarios +using System.Windows.Forms.VisualStyles; + +namespace GradientPanelControl +{ + /// + /// Summary description for GradientLabel. + /// + public class GradientPanel : Panel + { + private GradientFill gradient = new GradientFill(); + + public GradientPanel() + { + handlerGradientChanged = new EventHandler(GradientChanged); + gradient.GradientChanged += handlerGradientChanged; + ResizeRedraw = true; + } + + private EventHandler handlerGradientChanged; + + private Brush gradientBrush; + private Brush GradientBrush + { + get + { + if (gradientBrush == null) + { + gradientBrush = + new LinearGradientBrush(ClientRectangle, gradient.ColorA, + gradient.ColorB, gradient.GradientFillStyle); + } + return gradientBrush; + } + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + public GradientFill GradientFill + { + get + { + return gradient; + } + set + { + gradient = value; + if (handlerGradientChanged != null) gradient.GradientChanged -= handlerGradientChanged; + handlerGradientChanged = new EventHandler(GradientChanged); + gradient.GradientChanged += handlerGradientChanged; + if (gradientBrush != null) gradientBrush.Dispose(); + gradientBrush = null; + Invalidate(); + } + } + + protected override void OnPaintBackground( + System.Windows.Forms.PaintEventArgs e) + { + // Fill the rest of the background + e.Graphics.FillRectangle(GradientBrush, ClientRectangle); + } + + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (gradientBrush != null) gradientBrush.Dispose(); + } + base.Dispose(disposing); + } + + protected override void OnScroll(ScrollEventArgs se) + { + Invalidate(); + } + + private void GradientChanged(object sender, EventArgs e) + { + if (gradientBrush != null) gradientBrush.Dispose(); + gradientBrush = null; + Invalidate(); + } + + } + + +} diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanel.resx b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanel.resx new file mode 100644 index 0000000..cde0d27 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanel.resx @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + GradientLabel + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanelControl.csproj b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanelControl.csproj new file mode 100644 index 0000000..7d37bbf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanelControl.csproj @@ -0,0 +1,114 @@ + + + Local + 8.0.50727 + 2.0 + {249E3320-5FB8-48DC-AD25-DBE71195209A} + Debug + AnyCPU + + + + + GradientPanelControl + + + JScript + Grid + IE50 + false + Library + GradientPanelControl + OnBuildSuccess + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + Code + + + + + + Component + + + GradientPanel.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanelControl.csproj.user b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanelControl.csproj.user new file mode 100644 index 0000000..5414047 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanelControl.csproj.user @@ -0,0 +1,58 @@ + + + 7.10.3077 + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanelControl.suo b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanelControl.suo new file mode 100644 index 0000000..82348c8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/GradientPanelControl.suo differ diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/bin/Debug/GradientPanelControl.dll b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/bin/Debug/GradientPanelControl.dll new file mode 100644 index 0000000..6f82fb8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelControl/bin/Debug/GradientPanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/App.ico b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelHost.csproj b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelHost.csproj new file mode 100644 index 0000000..6f757e4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelHost.csproj @@ -0,0 +1,126 @@ + + + Local + 8.0.50727 + 2.0 + {9BA9D88F-A938-44BF-ACDE-29F63B54D586} + Debug + AnyCPU + App.ico + + + GradientPanelHost + + + JScript + Grid + IE50 + false + WinExe + GradientPanelHost + OnBuildSuccess + GradientPanelHost.Program + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + Form + + + GradientPanelTest.cs + + + + Designer + GradientPanelTest.cs + + + + + + {249E3320-5FB8-48DC-AD25-DBE71195209A} + GradientPanelControl + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelHost.csproj.user b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelHost.csproj.user new file mode 100644 index 0000000..9c11a20 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelHost.csproj.user @@ -0,0 +1,57 @@ + + + 8.0.50215 + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 13\GradientLabel\bin\Debug\;C:\Code\UserInterfaces\Code\Chapter 13\GradientLabel\bin\Debug\;D:\Code\UserInterfaces\Chapter 17\GradientLabel\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelTest.Designer.cs b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelTest.Designer.cs new file mode 100644 index 0000000..3f749cd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelTest.Designer.cs @@ -0,0 +1,125 @@ +namespace GradientPanelHost +{ + partial class GradientPanelTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.gradientPanel1 = new GradientPanelControl.GradientPanel(); + this.label3 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.gradientPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // gradientPanel1 + // + this.gradientPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gradientPanel1.AutoScroll = true; + this.gradientPanel1.Controls.Add(this.label3); + this.gradientPanel1.Controls.Add(this.button1); + this.gradientPanel1.Controls.Add(this.label2); + this.gradientPanel1.Controls.Add(this.label1); + this.gradientPanel1.GradientFill.ColorA = System.Drawing.Color.Lime; + this.gradientPanel1.GradientFill.ColorB = System.Drawing.Color.DarkOrchid; + this.gradientPanel1.Location = new System.Drawing.Point(4, 6); + this.gradientPanel1.Name = "gradientPanel1"; + this.gradientPanel1.Size = new System.Drawing.Size(427, 190); + this.gradientPanel1.TabIndex = 1; + // + // label3 + // + this.label3.BackColor = System.Drawing.Color.Transparent; + this.label3.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.Location = new System.Drawing.Point(18, 57); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(328, 39); + this.label3.TabIndex = 2; + this.label3.Text = "These labels have a transparent background, which lets the gradient show through." + + ""; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(231, 109); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "Test Button"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(40, 226); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(108, 37); + this.label2.TabIndex = 1; + this.label2.Text = "label2"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(17, 12); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(277, 37); + this.label1.TabIndex = 0; + this.label1.Text = "Transparent Text"; + // + // GradientPanelTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(435, 260); + this.Controls.Add(this.gradientPanel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "GradientPanelTest"; + this.Text = "GradientPanel"; + this.gradientPanel1.ResumeLayout(false); + this.gradientPanel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private GradientPanelControl.GradientPanel gradientPanel1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelTest.cs b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelTest.cs new file mode 100644 index 0000000..0cb237b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelTest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace GradientPanelHost +{ + public partial class GradientPanelTest : Form + { + public GradientPanelTest() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelTest.resx b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelTest.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/GradientPanelTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/Program.cs b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/Program.cs new file mode 100644 index 0000000..dfed262 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace GradientPanelHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new GradientPanelTest()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelControl.dll b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelControl.dll new file mode 100644 index 0000000..6f82fb8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelHost.exe b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelHost.exe new file mode 100644 index 0000000..44295ed Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.csproj b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.csproj new file mode 100644 index 0000000..ec80378 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.csproj @@ -0,0 +1,80 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {4A5926D1-18EE-401B-BD8E-E65877A1DE64} + WinExe + Properties + LocalizableControl + LocalizableControl + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + UserControl + + + LocalizableUserControl.cs + + + Form + + + LocalizedForm.cs + + + + + Designer + LocalizableUserControl.cs + + + LocalizedForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.csproj.user b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.sln b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.sln new file mode 100644 index 0000000..3c25d1d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocalizableControl", "LocalizableControl.csproj", "{4A5926D1-18EE-401B-BD8E-E65877A1DE64}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4A5926D1-18EE-401B-BD8E-E65877A1DE64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A5926D1-18EE-401B-BD8E-E65877A1DE64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A5926D1-18EE-401B-BD8E-E65877A1DE64}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A5926D1-18EE-401B-BD8E-E65877A1DE64}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.suo b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.suo new file mode 100644 index 0000000..4ae8b7e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableControl.suo differ diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableUserControl.Designer.cs b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableUserControl.Designer.cs new file mode 100644 index 0000000..643a161 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableUserControl.Designer.cs @@ -0,0 +1,71 @@ +namespace LocalizableControl +{ + partial class LocalizableUserControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.localizable = new System.Windows.Forms.Label(); + this.nonLocalizable = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // localizable + // + this.localizable.AutoSize = true; + this.localizable.Location = new System.Drawing.Point(14, 23); + this.localizable.Name = "localizable"; + this.localizable.Size = new System.Drawing.Size(56, 13); + this.localizable.TabIndex = 0; + this.localizable.Text = "localizable"; + // + // nonLocalizable + // + this.nonLocalizable.AutoSize = true; + this.nonLocalizable.Location = new System.Drawing.Point(14, 59); + this.nonLocalizable.Name = "nonLocalizable"; + this.nonLocalizable.Size = new System.Drawing.Size(78, 13); + this.nonLocalizable.TabIndex = 1; + this.nonLocalizable.Text = "nonLocalizable"; + // + // LocalizableUserControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.nonLocalizable); + this.Controls.Add(this.localizable); + this.Name = "LocalizableUserControl"; + this.Size = new System.Drawing.Size(265, 220); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label localizable; + private System.Windows.Forms.Label nonLocalizable; + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableUserControl.cs b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableUserControl.cs new file mode 100644 index 0000000..6b8e692 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableUserControl.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +namespace LocalizableControl +{ + public partial class LocalizableUserControl : UserControl + { + public LocalizableUserControl() + { + InitializeComponent(); + } + + private string nonLocalizableText; + public string NonLocalizableText + { + get { return nonLocalizable.Text; } + set { nonLocalizable.Text = value; } + } + + private string localizableText; + [Localizable(true)] + public string LocalizableText + { + get { return localizable.Text; } + set { localizable.Text = value; } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableUserControl.resx b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableUserControl.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizableUserControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizedForm.Designer.cs b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizedForm.Designer.cs new file mode 100644 index 0000000..f6c1d47 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizedForm.Designer.cs @@ -0,0 +1,64 @@ +namespace LocalizableControl +{ + partial class LocalizedForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LocalizedForm)); + this.localizableUserControl2 = new LocalizableControl.LocalizableUserControl(); + this.localizableUserControl1 = new LocalizableControl.LocalizableUserControl(); + this.SuspendLayout(); + // + // localizableUserControl2 + // + resources.ApplyResources(this.localizableUserControl2, "localizableUserControl2"); + this.localizableUserControl2.Name = "localizableUserControl2"; + this.localizableUserControl2.NonLocalizableText = "Non localizable."; + // + // localizableUserControl1 + // + resources.ApplyResources(this.localizableUserControl1, "localizableUserControl1"); + this.localizableUserControl1.Name = "localizableUserControl1"; + this.localizableUserControl1.NonLocalizableText = "Test"; + // + // LocalizedForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.localizableUserControl2); + this.Controls.Add(this.localizableUserControl1); + this.Name = "LocalizedForm"; + this.ResumeLayout(false); + + } + + #endregion + + private LocalizableUserControl localizableUserControl1; + private LocalizableUserControl localizableUserControl2; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizedForm.cs b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizedForm.cs new file mode 100644 index 0000000..1288dde --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizedForm.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace LocalizableControl +{ + public partial class LocalizedForm : Form + { + public LocalizedForm() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizedForm.resx b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizedForm.resx new file mode 100644 index 0000000..c8d3911 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/LocalizedForm.resx @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Localizable. + + + + 34, 32 + + + 150, 150 + + + + 1 + + + localizableUserControl2 + + + LocalizableControl.LocalizableUserControl, LocalizableControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + $this + + + 0 + + + Test + + + 21, 16 + + + 150, 150 + + + 0 + + + localizableUserControl1 + + + LocalizableControl.LocalizableUserControl, LocalizableControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + $this + + + 1 + + + True + + + 6, 13 + + + 292, 266 + + + LocalizedForm + + + LocalizedForm + + + System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Program.cs b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Program.cs new file mode 100644 index 0000000..b0ed935 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace LocalizableControl +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new LocalizedForm()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9fd2821 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("LocalizableControl")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("LocalizableControl")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("427b3c59-fc26-4e4f-97f5-7c32f552f65a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d3a7b3c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "LocalizableControl.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "LocalizableControl.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "LocalizableControl.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace LocalizableControl.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LocalizableControl.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Settings.Designer.cs new file mode 100644 index 0000000..3cedaeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "LocalizableControl.Properties.Settings.get_Default():LocalizableControl.Properties.Settings")] + +namespace LocalizableControl.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/bin/Debug/LocalizableControl.exe b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/bin/Debug/LocalizableControl.exe new file mode 100644 index 0000000..22b6b46 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/bin/Debug/LocalizableControl.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/LocalizableControl/bin/Release/LocalizableControl.exe b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/bin/Release/LocalizableControl.exe new file mode 100644 index 0000000..89b13c3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/LocalizableControl/bin/Release/LocalizableControl.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabel.sln b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabel.sln new file mode 100644 index 0000000..df43bb8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabel.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarqueeLabelHost", "MarqueeLabelHost\MarqueeLabelHost.csproj", "{F933461B-85EC-4C6C-8DE8-C2B65C51E696}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarqueeLabel", "..\..\Chapter12\MarqueeLabel\MarqueeLabelControl\MarqueeLabel.csproj", "{2ED8BBD1-D421-450A-92A5-A6CAAACCE155}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Release|Any CPU.Build.0 = Release|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabel.suo b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabel.suo new file mode 100644 index 0000000..aa81c42 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabel.suo differ diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.cs b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.cs new file mode 100644 index 0000000..dc8d561 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.cs @@ -0,0 +1,152 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace MarqueeLabel +{ + /// + /// Summary description for MarqueeLabel. + /// + public class MarqueeLabel : Control, ISupportInitialize + { + private System.ComponentModel.IContainer components; + + public MarqueeLabel() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + DoubleBuffered = true; + ResizeRedraw = true; + } + + public void Scroll(bool state) + { + tmrScroll.Enabled = state; + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmrScroll = new System.Windows.Forms.Timer(this.components); + // + // tmrScroll + // + this.tmrScroll.Tick += new System.EventHandler(this.tmrScroll_Tick); + // + // MarqueeLabel + // + this.Name = "MarqueeLabel"; + this.Size = new System.Drawing.Size(360, 104); + + + } + #endregion + + private string text; + private int scrollAmount = 10; + internal System.Windows.Forms.Timer tmrScroll; + private int position = 0; + + private void tmrScroll_Tick(object sender, System.EventArgs e) + { + position += scrollAmount; + + // Force a refresh. + Invalidate(); + } + + [Browsable(true), + DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public override string Text + { + get + { + return text; + } + set + { + text = value; + Invalidate(); + } + } + + public int ScrollTimeInterval + { + get + { + return tmrScroll.Interval; + } + set + { + tmrScroll.Interval = value; + } + } + + [DefaultValue(10)] + public int ScrollPixelAmount + { + get + { + return scrollAmount; + } + set + { + scrollAmount = value; + } + } + + + protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) + { + base.OnPaint(e); + + + if (position > Width) + { + // Reset the text to scroll back onto the control. + position = -(int)e.Graphics.MeasureString(text, Font).Width; + } + + //e.Graphics.FillRectangle(new SolidBrush(BackColor), e.ClipRectangle); + e.Graphics.DrawString(text, Font, new SolidBrush(ForeColor), position, 0); + } + + // ISupportInitialize members. + void ISupportInitialize.BeginInit() + { + // Do nothing. + } + + void ISupportInitialize.EndInit() + { + if (!DesignMode) + { + tmrScroll.Enabled = true; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj new file mode 100644 index 0000000..d1e21c1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj @@ -0,0 +1,107 @@ + + + Local + 8.0.40607 + 2.0 + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155} + Debug + AnyCPU + + + + + MarqueeLabel + + + JScript + Grid + IE50 + false + Library + MarqueeLabel + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + Code + + + Component + + + MarqueeLabel.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj.user b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj.user new file mode 100644 index 0000000..277f465 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.resx b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.resx new file mode 100644 index 0000000..c15e6d4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/MarqueeLabel.resx @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 317, 30 + + + Assembly + + + MarqueeLabel + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll new file mode 100644 index 0000000..a8a1c6d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/bin/Release/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/bin/Release/MarqueeLabel.dll new file mode 100644 index 0000000..624367b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelControl/bin/Release/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/App.ico b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj new file mode 100644 index 0000000..1aaad47 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj @@ -0,0 +1,112 @@ + + + Local + 8.0.50727 + 2.0 + {F933461B-85EC-4C6C-8DE8-C2B65C51E696} + Debug + AnyCPU + App.ico + + + MarqueeLabelHost + + + JScript + Grid + IE50 + false + WinExe + MarqueeLabelHost + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + Form + + + MarqueeTestForm.cs + + + + Designer + MarqueeTestForm.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj.user b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj.user new file mode 100644 index 0000000..5b35e22 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeLabelHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 13\MarqueeLabel\bin\Debug\;D:\Matthew\2002\Writing\Books\User Interfaces in .NET\C#\Code\Chapter 13\MarqueeLabel\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.Designer.cs b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.Designer.cs new file mode 100644 index 0000000..9469dd4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.Designer.cs @@ -0,0 +1,140 @@ +namespace MarqueeLabelHost +{ + partial class MarqueeTestForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.tbInterval = new System.Windows.Forms.TrackBar(); + this.Label1 = new System.Windows.Forms.Label(); + this.tbAmount = new System.Windows.Forms.TrackBar(); + this.marqueeLabel1 = new MarqueeLabel.MarqueeLabel(); + this.GroupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tbInterval)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.tbAmount)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.marqueeLabel1)).BeginInit(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.tbInterval); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.tbAmount); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(22, 177); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(336, 132); + this.GroupBox1.TabIndex = 6; + this.GroupBox1.TabStop = false; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(12, 76); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(80, 23); + this.Label2.TabIndex = 6; + this.Label2.Text = "Scroll Interval:"; + // + // tbInterval + // + this.tbInterval.Location = new System.Drawing.Point(96, 72); + this.tbInterval.Maximum = 500; + this.tbInterval.Minimum = 10; + this.tbInterval.Name = "tbInterval"; + this.tbInterval.Size = new System.Drawing.Size(228, 45); + this.tbInterval.TabIndex = 5; + this.tbInterval.TickFrequency = 10; + this.tbInterval.Value = 100; + this.tbInterval.ValueChanged += new System.EventHandler(this.tbInterval_ValueChanged); + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(12, 20); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(80, 23); + this.Label1.TabIndex = 4; + this.Label1.Text = "Scroll Amount:"; + // + // tbAmount + // + this.tbAmount.Location = new System.Drawing.Point(96, 16); + this.tbAmount.Maximum = 20; + this.tbAmount.Name = "tbAmount"; + this.tbAmount.Size = new System.Drawing.Size(228, 45); + this.tbAmount.TabIndex = 3; + this.tbAmount.Value = 10; + this.tbAmount.ValueChanged += new System.EventHandler(this.tbAmount_ValueChanged); + // + // marqueeLabel1 + // + this.marqueeLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.marqueeLabel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); + this.marqueeLabel1.Font = new System.Drawing.Font("Verdana", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.marqueeLabel1.ForeColor = System.Drawing.Color.Navy; + this.marqueeLabel1.Location = new System.Drawing.Point(-2, 7); + this.marqueeLabel1.Name = "marqueeLabel1"; + this.marqueeLabel1.ScrollTimeInterval = 100; + this.marqueeLabel1.Size = new System.Drawing.Size(384, 156); + this.marqueeLabel1.TabIndex = 7; + this.marqueeLabel1.Tag = ""; + this.marqueeLabel1.Text = "This scrolls!"; + // + // MarqueeTestForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(381, 322); + this.Controls.Add(this.marqueeLabel1); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "MarqueeTestForm"; + this.Text = "MarqueeTestForm"; + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tbInterval)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.tbAmount)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.marqueeLabel1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private MarqueeLabel.MarqueeLabel marqueeLabel1; + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.TrackBar tbInterval; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.TrackBar tbAmount; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.cs b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.cs new file mode 100644 index 0000000..502847c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MarqueeLabelHost +{ + public partial class MarqueeTestForm : Form + { + public MarqueeTestForm() + { + InitializeComponent(); + } + + private void tbAmount_ValueChanged(object sender, EventArgs e) + { + marqueeLabel1.ScrollPixelAmount = tbAmount.Value; + } + + private void tbInterval_ValueChanged(object sender, EventArgs e) + { + marqueeLabel1.ScrollTimeInterval = tbInterval.Value; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.resx b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/MarqueeTestForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/Program.cs b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/Program.cs new file mode 100644 index 0000000..33a6330 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace MarqueeLabelHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new MarqueeTestForm()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll new file mode 100644 index 0000000..a8a1c6d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe new file mode 100644 index 0000000..69c55ca Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabel.dll new file mode 100644 index 0000000..624367b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe new file mode 100644 index 0000000..22af8f9 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/MarqueeLabel/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/Progress.sln b/Pro Windows Forms 2.0/Chapter13/Progress/Progress.sln new file mode 100644 index 0000000..cc26c64 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/Progress.sln @@ -0,0 +1,28 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProgressControl", "ProgressBarControl\ProgressControl.csproj", "{374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProgressHost", "ProgressBarHost\ProgressHost.csproj", "{1760F81F-8541-42C6-9649-A4FDFAD6C2B2}" + ProjectSection(ProjectDependencies) = postProject + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3} = {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Release|Any CPU.Build.0 = Release|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/Progress.suo b/Pro Windows Forms 2.0/Chapter13/Progress/Progress.suo new file mode 100644 index 0000000..22883fa Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/Progress/Progress.suo differ diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/Progress.cs b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/Progress.cs new file mode 100644 index 0000000..5f326ce --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/Progress.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Drawing.Design; + +namespace ProgressBarControl +{ + /// + /// Summary description for Progress. + /// + public class Progress : System.Windows.Forms.UserControl + { + internal System.Windows.Forms.Label lblProgress; + internal System.Windows.Forms.ProgressBar Bar; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Progress() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + // TODO: Add any initialization after the InitForm call + + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblProgress = new System.Windows.Forms.Label(); + this.Bar = new System.Windows.Forms.ProgressBar(); + this.SuspendLayout(); + // + // lblProgress + // + this.lblProgress.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.lblProgress.Location = new System.Drawing.Point(5, 46); + this.lblProgress.Name = "lblProgress"; + this.lblProgress.Size = new System.Drawing.Size(152, 16); + this.lblProgress.TabIndex = 3; + this.lblProgress.Text = "0% Done"; + this.lblProgress.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // Bar + // + this.Bar.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right); + this.Bar.Location = new System.Drawing.Point(5, 6); + this.Bar.Name = "Bar"; + this.Bar.Size = new System.Drawing.Size(154, 32); + this.Bar.TabIndex = 2; + // + // Progress + // + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.lblProgress, + this.Bar}); + this.Name = "Progress"; + this.Size = new System.Drawing.Size(164, 68); + this.ResumeLayout(false); + + } + #endregion + [Description("The current value (between 0 and Maximum) which sets " + + "the position of the progress bar")] + [Category("Behavior")] + [Editor(typeof(ProgressValueEditor), typeof(UITypeEditor))] + public int Value + { + get + { + return Bar.Value; + } + set + { + Bar.Value = value; + UpdateLabel(); + } + } + + [Description("The maximum value of the progress bar")] + [Category("Behavior")] + [DefaultValue(100)] + public int Maximum + { + get + { + return Bar.Maximum; + } + set + { + Bar.Maximum = value; + } + } + + [Description("The increment that the value is increased when PerformStep() is called.")] + [Category("Behavior")] + public int Step + { + get + { + return Bar.Step; + } + set + { + Bar.Step = value; + } + } + + public void PerformStep() + { + Bar.PerformStep(); + UpdateLabel(); + } + + private void UpdateLabel() + { + lblProgress.Text = (Math.Round((decimal)(Bar.Value * 100) / + Bar.Maximum)).ToString(); + lblProgress.Text += "% Done"; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/Progress.resx b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/Progress.resx new file mode 100644 index 0000000..1bd4ec9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/Progress.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressControl.csproj b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressControl.csproj new file mode 100644 index 0000000..3b265ce --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressControl.csproj @@ -0,0 +1,116 @@ + + + Local + 8.0.50727 + 2.0 + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3} + Debug + AnyCPU + + + + + ProgressBarControl + + + JScript + Grid + IE50 + false + Library + ProgressBarControl + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + UserControl + + + UserControl + + + ProgressValueDropDown.cs + + + + + Progress.cs + + + ProgressValueDropDown.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressControl.csproj.user b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressControl.csproj.user new file mode 100644 index 0000000..1a55117 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressControl.csproj.user @@ -0,0 +1,56 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exe + + + + + true + + + false + false + false + false + false + + + Project + + + + + D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exe + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueDropDown.Designer.cs b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueDropDown.Designer.cs new file mode 100644 index 0000000..5976651 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueDropDown.Designer.cs @@ -0,0 +1,100 @@ +namespace ProgressBarControl +{ + partial class ProgressValueDropDown + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblRange = new System.Windows.Forms.Label(); + this.trackBar1 = new System.Windows.Forms.TrackBar(); + this.lblValue = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit(); + this.SuspendLayout(); + // + // lblRange + // + this.lblRange.AutoSize = true; + this.lblRange.Location = new System.Drawing.Point(4, 3); + this.lblRange.Name = "lblRange"; + this.lblRange.Size = new System.Drawing.Size(78, 13); + this.lblRange.TabIndex = 0; + this.lblRange.Text = "Allowed Range:"; + // + // trackBar1 + // + this.trackBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.trackBar1.Location = new System.Drawing.Point(-2, 20); + this.trackBar1.Name = "trackBar1"; + this.trackBar1.Size = new System.Drawing.Size(192, 45); + this.trackBar1.TabIndex = 1; + this.trackBar1.TickStyle = System.Windows.Forms.TickStyle.None; + this.trackBar1.ValueChanged += new System.EventHandler(this.trackBar1_ValueChanged); + // + // lblValue + // + this.lblValue.Location = new System.Drawing.Point(4, 55); + this.lblValue.Name = "lblValue"; + this.lblValue.Size = new System.Drawing.Size(186, 12); + this.lblValue.TabIndex = 2; + this.lblValue.Text = "Current Value = "; + this.lblValue.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // button1 + // + this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.button1.Location = new System.Drawing.Point(182, 0); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(16, 16); + this.button1.TabIndex = 3; + this.button1.Text = "X"; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // ProgressValueDropDown + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.button1); + this.Controls.Add(this.lblValue); + this.Controls.Add(this.trackBar1); + this.Controls.Add(this.lblRange); + this.Name = "ProgressValueDropDown"; + this.Size = new System.Drawing.Size(198, 71); + ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblRange; + private System.Windows.Forms.TrackBar trackBar1; + private System.Windows.Forms.Label lblValue; + private System.Windows.Forms.Button button1; + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueDropDown.cs b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueDropDown.cs new file mode 100644 index 0000000..421967f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueDropDown.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +namespace ProgressBarControl +{ + [ToolboxItem(false)] + public partial class ProgressValueDropDown : UserControl + { + public ProgressValueDropDown() + { + // Default constructor required for designing + // this control in Visual Studio. + InitializeComponent(); + } + + + private void trackBar1_ValueChanged(object sender, EventArgs e) + { + Value = trackBar1.Value; + lblValue.Text = "Current Value = " + trackBar1.Value.ToString(); + } + + private int progressValue; + public int Value + { + get { return progressValue; } + set { progressValue = value; } + } + + private IWindowsFormsEditorService editorService; + + public ProgressValueDropDown(int value, int maximum, IWindowsFormsEditorService editorService) + { + InitializeComponent(); + + // Store this information for later use. + Value = value; + this.editorService = editorService; + + // Apply the current information. + trackBar1.Maximum = maximum; + lblRange.Text = "Allowed Range: (0, " + maximum.ToString() + ")"; + trackBar1.Value = value; + + trackBar1.SmallChange = 1; + trackBar1.LargeChange = 5; + } + + private void button1_Click(object sender, EventArgs e) + { + editorService.CloseDropDown(); + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueDropDown.resx b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueDropDown.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueDropDown.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueEditor.cs b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueEditor.cs new file mode 100644 index 0000000..a2da88e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/ProgressValueEditor.cs @@ -0,0 +1,59 @@ +using System; +using System.IO; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Drawing.Design; + +namespace ProgressBarControl +{ + public class ProgressValueEditor : UITypeEditor + { + + public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle( + System.ComponentModel.ITypeDescriptorContext context) + { + return UITypeEditorEditStyle.DropDown; + } + + public override object EditValue( + System.ComponentModel.ITypeDescriptorContext context, + System.IServiceProvider provider, object value) + { + + if (provider != null) + { + IWindowsFormsEditorService editorService = + provider.GetService( + typeof(IWindowsFormsEditorService)) + as IWindowsFormsEditorService; + + + if (editorService != null) + { + Progress ctrl = (Progress)context.Instance; + ProgressValueDropDown selectionControl = + new ProgressValueDropDown( + (int)value, ctrl.Maximum, + editorService); + + editorService.DropDownControl(selectionControl); + + value = selectionControl.Value; + } + } + return value; + + } + + public override bool GetPaintValueSupported( + System.ComponentModel.ITypeDescriptorContext context) + { + // No special thumbnail will be shown for the grid. + return false; + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/bin/Debug/ProgressBarControl.dll b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/bin/Debug/ProgressBarControl.dll new file mode 100644 index 0000000..787e5c3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/bin/Debug/ProgressBarControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/bin/Release/ProgressBarControl.dll b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/bin/Release/ProgressBarControl.dll new file mode 100644 index 0000000..778a780 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarControl/bin/Release/ProgressBarControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/App.ico b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Form1.cs b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Form1.cs new file mode 100644 index 0000000..1ba8893 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Form1.cs @@ -0,0 +1,132 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +namespace ProgressBarHost +{ + /// + /// Summary description for Form1. + /// + public class Form1 : System.Windows.Forms.Form + { + internal System.Windows.Forms.Timer tmrIncrementBar; + private System.Windows.Forms.Button cmdStart; + private ProgressBarControl.Progress status; + private System.ComponentModel.IContainer components; + + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmrIncrementBar = new System.Windows.Forms.Timer(this.components); + this.cmdStart = new System.Windows.Forms.Button(); + this.status = new ProgressBarControl.Progress(); + this.SuspendLayout(); + // + // tmrIncrementBar + // + this.tmrIncrementBar.Interval = 1000; + this.tmrIncrementBar.Tick += new System.EventHandler(this.tmrIncrementBar_Tick); + // + // cmdStart + // + this.cmdStart.Location = new System.Drawing.Point(88, 152); + this.cmdStart.Name = "cmdStart"; + this.cmdStart.Size = new System.Drawing.Size(92, 24); + this.cmdStart.TabIndex = 1; + this.cmdStart.Text = "Start"; + this.cmdStart.Click += new System.EventHandler(this.cmdStart_Click); + // + // status + // + this.status.Font = new System.Drawing.Font("Tahoma", 8.25F); + this.status.Location = new System.Drawing.Point(12, 8); + this.status.Name = "status"; + this.status.Size = new System.Drawing.Size(272, 88); + this.status.Step = 10; + this.status.TabIndex = 0; + this.status.Value = 10; + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(292, 194); + this.Controls.Add(this.cmdStart); + this.Controls.Add(this.status); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Progress Host"; + this.ResumeLayout(false); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + + private void tmrIncrementBar_Tick(object sender, System.EventArgs e) + { + status.PerformStep(); + if (status.Maximum == status.Value) + { + tmrIncrementBar.Enabled = false; + } + + } + + private void cmdStart_Click(object sender, System.EventArgs e) + { + tmrIncrementBar.Enabled = false; + + status.Value = 0; + status.Maximum = 20; + status.Step = 1; + + tmrIncrementBar.Enabled = true; + + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Form1.resx b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Form1.resx new file mode 100644 index 0000000..4496289 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Form1.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Progress.sln b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Progress.sln new file mode 100644 index 0000000..0a421c9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Progress.sln @@ -0,0 +1,28 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProgressControl", "..\ProgressBarControl\ProgressControl.csproj", "{374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProgressHost", "ProgressHost.csproj", "{1760F81F-8541-42C6-9649-A4FDFAD6C2B2}" + ProjectSection(ProjectDependencies) = postProject + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3} = {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3}.Release|Any CPU.Build.0 = Release|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Progress.suo b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Progress.suo new file mode 100644 index 0000000..6b3de27 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/Progress.suo differ diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/ProgressHost.csproj b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/ProgressHost.csproj new file mode 100644 index 0000000..06b12fe --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/ProgressHost.csproj @@ -0,0 +1,115 @@ + + + Local + 8.0.50727 + 2.0 + {1760F81F-8541-42C6-9649-A4FDFAD6C2B2} + Debug + AnyCPU + App.ico + + + ProgressBarHost + + + JScript + Grid + IE50 + false + WinExe + ProgressBarHost + ProgressBarHost.Form1 + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + ProgressBarControl + ..\ProgressBarControl\bin\Debug\ProgressBarControl.dll + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + + Form + + + Form1.cs + + + + + + {374ABB57-24BA-40E2-A2E3-AACF5DB8D7C3} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ProgressControl + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/ProgressHost.csproj.user b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/ProgressHost.csproj.user new file mode 100644 index 0000000..2f664cd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/ProgressHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 07\ProgressBarControl\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/bin/Debug/ProgressBarControl.dll b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/bin/Debug/ProgressBarControl.dll new file mode 100644 index 0000000..787e5c3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/bin/Debug/ProgressBarControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/bin/Debug/ProgressBarHost.exe b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/bin/Debug/ProgressBarHost.exe new file mode 100644 index 0000000..ea3186d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter13/Progress/ProgressBarHost/bin/Debug/ProgressBarHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/ColorTableChange.Designer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/ColorTableChange.Designer.cs new file mode 100644 index 0000000..28d2e9d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/ColorTableChange.Designer.cs @@ -0,0 +1,177 @@ +namespace Strips +{ + partial class ColorTableChange + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ColorTableChange)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.printToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.pasteToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.printToolStripButton, + this.toolStripSeparator, + this.cutToolStripButton, + this.copyToolStripButton, + this.pasteToolStripButton, + this.toolStripSeparator1, + this.helpToolStripButton}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(292, 25); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Size = new System.Drawing.Size(23, 22); + this.newToolStripButton.Text = "&New"; + // + // openToolStripButton + // + this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Size = new System.Drawing.Size(23, 22); + this.openToolStripButton.Text = "&Open"; + // + // saveToolStripButton + // + this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveToolStripButton.Text = "&Save"; + // + // printToolStripButton + // + this.printToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image"))); + this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripButton.Name = "printToolStripButton"; + this.printToolStripButton.Size = new System.Drawing.Size(23, 22); + this.printToolStripButton.Text = "&Print"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + this.toolStripSeparator.Size = new System.Drawing.Size(6, 25); + // + // cutToolStripButton + // + this.cutToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Size = new System.Drawing.Size(23, 22); + this.cutToolStripButton.Text = "C&ut"; + // + // copyToolStripButton + // + this.copyToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Size = new System.Drawing.Size(23, 22); + this.copyToolStripButton.Text = "&Copy"; + // + // pasteToolStripButton + // + this.pasteToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.pasteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripButton.Image"))); + this.pasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripButton.Name = "pasteToolStripButton"; + this.pasteToolStripButton.Size = new System.Drawing.Size(23, 22); + this.pasteToolStripButton.Text = "&Paste"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // helpToolStripButton + // + this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image"))); + this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Size = new System.Drawing.Size(23, 22); + this.helpToolStripButton.Text = "He&lp"; + // + // ColorTableChange + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.toolStrip1); + this.Name = "ColorTableChange"; + this.Text = "ColorTableChange"; + this.Load += new System.EventHandler(this.ColorTableChange_Load); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripButton printToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton pasteToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/ColorTableChange.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/ColorTableChange.cs new file mode 100644 index 0000000..fb7b60a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/ColorTableChange.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class ColorTableChange : Form + { + public ColorTableChange() + { + InitializeComponent(); + } + + private void ColorTableChange_Load(object sender, EventArgs e) + { + toolStrip1.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/ColorTableChange.resx b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/ColorTableChange.resx new file mode 100644 index 0000000..296c8e0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/ColorTableChange.resx @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomColorTable.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomColorTable.cs new file mode 100644 index 0000000..8e09d7f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomColorTable.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Drawing; + +namespace Strips +{ + public class CustomColorTable : ProfessionalColorTable + { + public override Color ToolStripGradientBegin + { get { return Color.FromArgb(50, 50, 50); } } + + public override Color ToolStripGradientMiddle + { get { return Color.FromArgb(60, 50, 50); } } + + public override Color ToolStripGradientEnd + { get { return Color.LimeGreen; } } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomOverflow.Designer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomOverflow.Designer.cs new file mode 100644 index 0000000..3816913 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomOverflow.Designer.cs @@ -0,0 +1,164 @@ +namespace Strips +{ + partial class CustomOverflow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CustomOverflow)); + this.toolStrip2 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton3 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton4 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton5 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton6 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton7 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton8 = new System.Windows.Forms.ToolStripButton(); + this.toolStrip2.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip2 + // + this.toolStrip2.AllowItemReorder = true; + this.toolStrip2.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton1, + this.toolStripButton2, + this.toolStripButton3, + this.toolStripButton4, + this.toolStripSeparator2, + this.toolStripButton5, + this.toolStripButton6, + this.toolStripButton7, + this.toolStripSeparator3, + this.toolStripButton8}); + this.toolStrip2.Location = new System.Drawing.Point(0, 0); + this.toolStrip2.Name = "toolStrip2"; + this.toolStrip2.Size = new System.Drawing.Size(453, 25); + this.toolStrip2.TabIndex = 1; + this.toolStrip2.Text = "toolStrip2"; + this.toolStrip2.LayoutCompleted += new System.EventHandler(this.toolStrip2_LayoutCompleted); + this.toolStrip2.Layout += new System.Windows.Forms.LayoutEventHandler(this.toolStrip2_Layout); + // + // toolStripButton1 + // + this.toolStripButton1.AutoToolTip = false; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Text = "&New"; + // + // toolStripButton2 + // + this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); + this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton2.Name = "toolStripButton2"; + this.toolStripButton2.Text = "&Open"; + // + // toolStripButton3 + // + this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image"))); + this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton3.Name = "toolStripButton3"; + this.toolStripButton3.Text = "&Save"; + // + // toolStripButton4 + // + this.toolStripButton4.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton4.Image"))); + this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton4.Name = "toolStripButton4"; + this.toolStripButton4.Text = "&Print"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + // + // toolStripButton5 + // + this.toolStripButton5.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton5.Image"))); + this.toolStripButton5.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton5.Name = "toolStripButton5"; + this.toolStripButton5.Text = "C&ut"; + // + // toolStripButton6 + // + this.toolStripButton6.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton6.Image"))); + this.toolStripButton6.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton6.Name = "toolStripButton6"; + this.toolStripButton6.Text = "&Copy"; + // + // toolStripButton7 + // + this.toolStripButton7.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton7.Image"))); + this.toolStripButton7.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton7.Name = "toolStripButton7"; + this.toolStripButton7.Text = "&Paste"; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + // + // toolStripButton8 + // + this.toolStripButton8.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton8.Image"))); + this.toolStripButton8.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton8.Name = "toolStripButton8"; + this.toolStripButton8.Text = "He&lp"; + // + // CustomOverflow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(453, 210); + this.Controls.Add(this.toolStrip2); + this.Name = "CustomOverflow"; + this.Text = "CustomOverflow"; + this.Load += new System.EventHandler(this.CustomOverflow_Load); + this.toolStrip2.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip2; + private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.ToolStripButton toolStripButton2; + private System.Windows.Forms.ToolStripButton toolStripButton3; + private System.Windows.Forms.ToolStripButton toolStripButton4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripButton toolStripButton5; + private System.Windows.Forms.ToolStripButton toolStripButton6; + private System.Windows.Forms.ToolStripButton toolStripButton7; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripButton toolStripButton8; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomOverflow.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomOverflow.cs new file mode 100644 index 0000000..ecc2a43 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomOverflow.cs @@ -0,0 +1,221 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class CustomOverflow : Form + { + //private int textAndImageSize = 0; + //private int textOnlySize = 0; + public CustomOverflow() + { + InitializeComponent(); + + + //// Determine bar sizes. + //foreach (ToolStripItem item in toolStrip2.Items) + //{ + // item.DisplayStyle = ToolStripItemDisplayStyle.Text; + // textOnlySize += item.Bounds.Width + item.Margin.Horizontal; + //} + //foreach (ToolStripItem item in toolStrip2.Items) + //{ + // item.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; + // textAndImageSize += item.Bounds.Width + item.Margin.Horizontal; + //} + //textAndImageSize += threshold; + //textOnlySize += threshold; + + } + + //private enum ShrinkLevel + //{ + // ImageAndText, + // TextOnly, + // ImageOnly + //} + + private int threshold = 25; + // Track how far we've shrunk. + //private ShrinkLevel shrinkAmount = ShrinkLevel.ImageAndText; + + + private int MeasureToolStrip() + { + int totalItemWidth = 0; + foreach (ToolStripItem item in toolStrip2.Items) + { + totalItemWidth += item.Bounds.Width + item.Margin.Horizontal; + } + return totalItemWidth + threshold; + } + + // Occurs at the beginning of a layout operation. + // Try enlarging the ToolStrip if needed. + private void toolStrip2_Layout(object sender, LayoutEventArgs e) + { + if (toolStrip2.DisplayRectangle.Width > MeasureToolStrip()) + { + // Right now everything fits. + // Check if a larger size is appropriate. + foreach (ToolStripItem item in toolStrip2.Items) + { + if (!(item is ToolStripSeparator)) + { + // Look to expand any image-only buttons. + if (item.DisplayStyle == ToolStripItemDisplayStyle.Image) + { + item.DisplayStyle = ToolStripItemDisplayStyle.Text; + return; + } + } + } + + // If we reach here, there are no image-only buttons. + // Look to expand any text-only buttons. + foreach (ToolStripItem item in toolStrip2.Items) + { + if (!(item is ToolStripSeparator)) + { + if (item.DisplayStyle == ToolStripItemDisplayStyle.Text) + { + item.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; + return; + } + } + } + // If we reach here, the bar is fully expanded. + } + } + //private void toolStrip2_Layout(object sender, LayoutEventArgs e) + //{ + // if (shrinkAmount == ShrinkLevel.ImageAndText) + // { + // // We're already using the largest display mode, + // // so no enlargement is necessary. + // return; + // } + + // if (toolStrip2.DisplayRectangle.Width > MeasureToolStrip()) + // { + // // Right now everything fits. + // // Check if a larger size is appropriate. + + // // Will ImageAndText fit? + // if (toolStrip2.DisplayRectangle.Width > textAndImageSize) + // { + // shrinkAmount = ShrinkLevel.ImageAndText; + // ChangeButtonSize(ToolStripItemDisplayStyle.ImageAndText); + // } + // else if (shrinkAmount == ShrinkLevel.ImageOnly) + // { + // // Will TextOnly fit? + // if (toolStrip2.DisplayRectangle.Width > textOnlySize) + // { + // ChangeButtonSize(ToolStripItemDisplayStyle.Text); + // } + // } + + // } + //} + + // Occurs at the end of a layout operation. + // Try removing any overflow menus by shrinking items. + private void toolStrip2_LayoutCompleted(object sender, EventArgs e) + { + // Check if the overflow menu is in use. + if (toolStrip2.OverflowButton.HasDropDownItems) + { + // Step backwards. + for (int i = toolStrip2.Items.Count - 1; i >= 0; i--) + { + ToolStripItem item = toolStrip2.Items[i]; + if (!(item is ToolStripSeparator)) + { + if (item.DisplayStyle == ToolStripItemDisplayStyle.ImageAndText) + { + item.DisplayStyle = ToolStripItemDisplayStyle.Text; + return; + } + } + } + // If we reached here, all buttons are shrunk to text. + // Try reducing them further. + for (int i = toolStrip2.Items.Count-1; i >= 0; i--) + { + ToolStripItem item = toolStrip2.Items[i]; + if (!(item is ToolStripSeparator)) + { + if (item.DisplayStyle == ToolStripItemDisplayStyle.Text) + { + item.DisplayStyle = ToolStripItemDisplayStyle.Image; + return; + } + } + } + + // If we reach here, the bar is fully collapsed. + } + } + //private void toolStrip2_LayoutCompleted(object sender, EventArgs e) + //{ + // // Check if the overflow menu is in use. + // if (toolStrip2.OverflowButton.HasDropDownItems) + // { + // if (shrinkAmount == ShrinkLevel.ImageOnly) + // { + // // No more shrinking is possible. You may + // // as well fix up the overflow menu to show + // // full text and image. + // foreach (ToolStripItem item in toolStrip2.Items) + // { + // if (item.Placement == ToolStripItemPlacement.Overflow) + // { + // item.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText; + // } + // else + // { + // item.DisplayStyle = ToolStripItemDisplayStyle.Image; + // } + // } + // return; + // } + + // // Will TextOnly fit? + // if (toolStrip2.DisplayRectangle.Width > textOnlySize) + // { + // shrinkAmount = ShrinkLevel.TextOnly; + // ChangeButtonSize(ToolStripItemDisplayStyle.Text); + // } + // // We need to go with ImageOnly. + // else + // { + // shrinkAmount = ShrinkLevel.ImageOnly; + // ChangeButtonSize(ToolStripItemDisplayStyle.Image); + // } + // } + //} + private void ChangeButtonSize(ToolStripItemDisplayStyle displayStyle) + { + toolStrip2.SuspendLayout(); + foreach (ToolStripItem item in toolStrip2.Items) + { + if (!(item is ToolStripSeparator)) + { + item.DisplayStyle = displayStyle; + } + } + toolStrip2.ResumeLayout(); + } + + private void CustomOverflow_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomOverflow.resx b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomOverflow.resx new file mode 100644 index 0000000..c85e4d3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomOverflow.resx @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRenderer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRenderer.cs new file mode 100644 index 0000000..1d3c28e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRenderer.cs @@ -0,0 +1,90 @@ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Drawing; +using System.Drawing.Drawing2D; + +namespace Strips +{ + + + public class MyRenderer : ToolStripRenderer + { + public MyRenderer() + : base() + { + } + + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) + { + e.TextColor = Color.White; + base.OnRenderItemText(e); + } + + protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) + { + base.OnRenderImageMargin(e); + + Graphics g = e.Graphics; + + using (LinearGradientBrush b = new LinearGradientBrush(e.AffectedBounds, Color.Yellow, Color.Green, 0.0)) + { + g.FillRectangle(b, e.AffectedBounds); + } + } + + protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) + { + base.OnRenderMenuItemBackground(e); + + Graphics g = e.Graphics; + + if (e.Item.Selected || e.Item.Pressed) + { + using (LinearGradientBrush b = new LinearGradientBrush(new Rectangle(0, 0, e.Item.Bounds.Width, e.Item.Bounds.Height), Color.LightGreen, Color.DarkGreen, 90)) + { + SolidBrush b1 = new SolidBrush(Color.Pink); + g.FillRectangle(b, 0, 0, e.Item.Bounds.Width, e.Item.Bounds.Height); + b1.Dispose(); + } + } + } + + + protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e) + { + base.OnRenderButtonBackground(e); + + // Check if the item is selected. + LinearGradientBrush brush = null; + if (e.Item.Pressed || e.Item.Selected) + { + brush = new LinearGradientBrush(e.Item.Bounds, + Color.FromArgb(Color.Yellow.R, Color.Yellow.G, Color.Yellow.B + 50), + Color.DarkGreen, 90); + + brush = new LinearGradientBrush(e.Item.Bounds, + Color.Yellow, Color.Green, 90); + + e.Graphics.FillRectangle(brush, 0, 0, e.Item.Width, e.Item.Height); + } + } + + + protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) + { + Graphics g = e.Graphics; + LinearGradientBrush b = new LinearGradientBrush(e.AffectedBounds, Color.DarkGray, Color.Black, 90); + g.FillRectangle(b, e.AffectedBounds); + b.Dispose(); + + base.OnRenderToolStripBackground(e); + } + + + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRendering.Designer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRendering.Designer.cs new file mode 100644 index 0000000..cdc1b57 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRendering.Designer.cs @@ -0,0 +1,568 @@ +namespace Strips +{ + partial class CustomRendering + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CustomRendering)); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.printPreviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.undoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.redoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.customizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.indexToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.optCust = new System.Windows.Forms.RadioButton(); + this.optSys = new System.Windows.Forms.RadioButton(); + this.optPro = new System.Windows.Forms.RadioButton(); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.printToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.pasteToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.chkContentPanel = new System.Windows.Forms.CheckBox(); + this.menuStrip1.SuspendLayout(); + this.toolStripContainer1.ContentPanel.SuspendLayout(); + this.toolStripContainer1.TopToolStripPanel.SuspendLayout(); + this.toolStripContainer1.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Dock = System.Windows.Forms.DockStyle.None; + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem, + this.toolsToolStripMenuItem, + this.helpToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(373, 24); + this.menuStrip1.TabIndex = 1; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.openToolStripMenuItem, + this.toolStripSeparator, + this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.toolStripSeparator1, + this.printToolStripMenuItem, + this.printPreviewToolStripMenuItem, + this.toolStripSeparator2, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20); + this.fileToolStripMenuItem.Text = "&File"; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripMenuItem.Image"))); + this.newToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.newToolStripMenuItem.Size = new System.Drawing.Size(148, 22); + this.newToolStripMenuItem.Text = "&New"; + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripMenuItem.Image"))); + this.openToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.Size = new System.Drawing.Size(148, 22); + this.openToolStripMenuItem.Text = "&Open"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + this.toolStripSeparator.Size = new System.Drawing.Size(145, 6); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripMenuItem.Image"))); + this.saveToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.Size = new System.Drawing.Size(148, 22); + this.saveToolStripMenuItem.Text = "&Save"; + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(148, 22); + this.saveAsToolStripMenuItem.Text = "Save &As"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(145, 6); + // + // printToolStripMenuItem + // + this.printToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripMenuItem.Image"))); + this.printToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripMenuItem.Name = "printToolStripMenuItem"; + this.printToolStripMenuItem.Size = new System.Drawing.Size(148, 22); + this.printToolStripMenuItem.Text = "&Print"; + // + // printPreviewToolStripMenuItem + // + this.printPreviewToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("printPreviewToolStripMenuItem.Image"))); + this.printPreviewToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printPreviewToolStripMenuItem.Name = "printPreviewToolStripMenuItem"; + this.printPreviewToolStripMenuItem.Size = new System.Drawing.Size(148, 22); + this.printPreviewToolStripMenuItem.Text = "Print Pre&view"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(145, 6); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(148, 22); + this.exitToolStripMenuItem.Text = "E&xit"; + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.undoToolStripMenuItem, + this.redoToolStripMenuItem, + this.toolStripSeparator3, + this.cutToolStripMenuItem, + this.copyToolStripMenuItem, + this.pasteToolStripMenuItem, + this.toolStripSeparator4, + this.selectAllToolStripMenuItem}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.editToolStripMenuItem.Text = "&Edit"; + // + // undoToolStripMenuItem + // + this.undoToolStripMenuItem.Name = "undoToolStripMenuItem"; + this.undoToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.undoToolStripMenuItem.Text = "&Undo"; + // + // redoToolStripMenuItem + // + this.redoToolStripMenuItem.Name = "redoToolStripMenuItem"; + this.redoToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.redoToolStripMenuItem.Text = "&Redo"; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(125, 6); + // + // cutToolStripMenuItem + // + this.cutToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripMenuItem.Image"))); + this.cutToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; + this.cutToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.cutToolStripMenuItem.Text = "Cu&t"; + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripMenuItem.Image"))); + this.copyToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.copyToolStripMenuItem.Text = "&Copy"; + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripMenuItem.Image"))); + this.pasteToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.pasteToolStripMenuItem.Text = "&Paste"; + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(125, 6); + // + // selectAllToolStripMenuItem + // + this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.selectAllToolStripMenuItem.Text = "Select &All"; + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.customizeToolStripMenuItem, + this.optionsToolStripMenuItem}); + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.toolsToolStripMenuItem.Text = "&Tools"; + // + // customizeToolStripMenuItem + // + this.customizeToolStripMenuItem.Name = "customizeToolStripMenuItem"; + this.customizeToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.customizeToolStripMenuItem.Text = "&Customize"; + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.optionsToolStripMenuItem.Text = "&Options"; + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.contentsToolStripMenuItem, + this.indexToolStripMenuItem, + this.searchToolStripMenuItem, + this.toolStripSeparator5, + this.aboutToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(40, 20); + this.helpToolStripMenuItem.Text = "&Help"; + // + // contentsToolStripMenuItem + // + this.contentsToolStripMenuItem.Name = "contentsToolStripMenuItem"; + this.contentsToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.contentsToolStripMenuItem.Text = "&Contents"; + // + // indexToolStripMenuItem + // + this.indexToolStripMenuItem.Name = "indexToolStripMenuItem"; + this.indexToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.indexToolStripMenuItem.Text = "&Index"; + // + // searchToolStripMenuItem + // + this.searchToolStripMenuItem.Name = "searchToolStripMenuItem"; + this.searchToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.searchToolStripMenuItem.Text = "&Search"; + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(126, 6); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.aboutToolStripMenuItem.Text = "&About..."; + // + // toolStripContainer1 + // + // + // toolStripContainer1.ContentPanel + // + this.toolStripContainer1.ContentPanel.Controls.Add(this.groupBox1); + this.toolStripContainer1.ContentPanel.Controls.Add(this.toolStrip1); + this.toolStripContainer1.ContentPanel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(373, 242); + this.toolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.toolStripContainer1.Location = new System.Drawing.Point(0, 0); + this.toolStripContainer1.Name = "toolStripContainer1"; + this.toolStripContainer1.Size = new System.Drawing.Size(373, 266); + this.toolStripContainer1.TabIndex = 3; + this.toolStripContainer1.Text = "toolStripContainer1"; + // + // toolStripContainer1.TopToolStripPanel + // + this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.menuStrip1); + // + // groupBox1 + // + this.groupBox1.BackColor = System.Drawing.Color.Transparent; + this.groupBox1.Controls.Add(this.chkContentPanel); + this.groupBox1.Controls.Add(this.optCust); + this.groupBox1.Controls.Add(this.optSys); + this.groupBox1.Controls.Add(this.optPro); + this.groupBox1.Location = new System.Drawing.Point(24, 46); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(200, 125); + this.groupBox1.TabIndex = 4; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Rendering Type"; + // + // optCust + // + this.optCust.AutoSize = true; + this.optCust.Location = new System.Drawing.Point(11, 64); + this.optCust.Name = "optCust"; + this.optCust.Size = new System.Drawing.Size(61, 17); + this.optCust.TabIndex = 2; + this.optCust.Text = "Custom"; + this.optCust.CheckedChanged += new System.EventHandler(this.optCust_CheckedChanged); + // + // optSys + // + this.optSys.AutoSize = true; + this.optSys.Location = new System.Drawing.Point(11, 41); + this.optSys.Name = "optSys"; + this.optSys.Size = new System.Drawing.Size(60, 17); + this.optSys.TabIndex = 1; + this.optSys.Text = "System"; + this.optSys.CheckedChanged += new System.EventHandler(this.optSys_CheckedChanged); + // + // optPro + // + this.optPro.AutoSize = true; + this.optPro.Checked = true; + this.optPro.Location = new System.Drawing.Point(11, 20); + this.optPro.Name = "optPro"; + this.optPro.Size = new System.Drawing.Size(83, 17); + this.optPro.TabIndex = 0; + this.optPro.TabStop = true; + this.optPro.Text = "Professional"; + this.optPro.CheckedChanged += new System.EventHandler(this.optPro_CheckedChanged); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.printToolStripButton, + this.toolStripSeparator6, + this.cutToolStripButton, + this.copyToolStripButton, + this.pasteToolStripButton, + this.toolStripSeparator7, + this.helpToolStripButton}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(373, 25); + this.toolStrip1.TabIndex = 1; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Size = new System.Drawing.Size(23, 22); + this.newToolStripButton.Text = "&New"; + // + // openToolStripButton + // + this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Size = new System.Drawing.Size(23, 22); + this.openToolStripButton.Text = "&Open"; + // + // saveToolStripButton + // + this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveToolStripButton.Text = "&Save"; + // + // printToolStripButton + // + this.printToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image"))); + this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripButton.Name = "printToolStripButton"; + this.printToolStripButton.Size = new System.Drawing.Size(23, 22); + this.printToolStripButton.Text = "&Print"; + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new System.Drawing.Size(6, 25); + // + // cutToolStripButton + // + this.cutToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Size = new System.Drawing.Size(23, 22); + this.cutToolStripButton.Text = "C&ut"; + // + // copyToolStripButton + // + this.copyToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Size = new System.Drawing.Size(23, 22); + this.copyToolStripButton.Text = "&Copy"; + // + // pasteToolStripButton + // + this.pasteToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.pasteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripButton.Image"))); + this.pasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripButton.Name = "pasteToolStripButton"; + this.pasteToolStripButton.Size = new System.Drawing.Size(23, 22); + this.pasteToolStripButton.Text = "&Paste"; + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new System.Drawing.Size(6, 25); + // + // helpToolStripButton + // + this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image"))); + this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Size = new System.Drawing.Size(23, 22); + this.helpToolStripButton.Text = "He&lp"; + // + // chkContentPanel + // + this.chkContentPanel.AutoSize = true; + this.chkContentPanel.Location = new System.Drawing.Point(11, 94); + this.chkContentPanel.Name = "chkContentPanel"; + this.chkContentPanel.Size = new System.Drawing.Size(176, 17); + this.chkContentPanel.TabIndex = 3; + this.chkContentPanel.Text = "Apply to ToolStripContentPanel"; + this.chkContentPanel.UseVisualStyleBackColor = true; + this.chkContentPanel.CheckedChanged += new System.EventHandler(this.chkContentPanel_CheckedChanged); + // + // CustomRendering + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(373, 266); + this.Controls.Add(this.toolStripContainer1); + this.MainMenuStrip = this.menuStrip1; + this.Name = "CustomRendering"; + this.Text = "CustomRendering"; + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.toolStripContainer1.ContentPanel.ResumeLayout(false); + this.toolStripContainer1.ContentPanel.PerformLayout(); + this.toolStripContainer1.TopToolStripPanel.ResumeLayout(false); + this.toolStripContainer1.TopToolStripPanel.PerformLayout(); + this.toolStripContainer1.ResumeLayout(false); + this.toolStripContainer1.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem printToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem printPreviewToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem undoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem redoToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem customizeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem contentsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem indexToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.ToolStripContainer toolStripContainer1; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.RadioButton optCust; + private System.Windows.Forms.RadioButton optSys; + private System.Windows.Forms.RadioButton optPro; + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripButton printToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton pasteToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + private System.Windows.Forms.CheckBox chkContentPanel; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRendering.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRendering.cs new file mode 100644 index 0000000..9a8dd39 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRendering.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class CustomRendering : Form + { + public CustomRendering() + { + InitializeComponent(); + } + + private void optPro_CheckedChanged(object sender, EventArgs e) + { + ToolStripManager.RenderMode = ToolStripManagerRenderMode.Professional; + } + + private void optSys_CheckedChanged(object sender, EventArgs e) + { + ToolStripManager.RenderMode = ToolStripManagerRenderMode.System; + } + + private void optCust_CheckedChanged(object sender, EventArgs e) + { + ToolStripManager.Renderer = new MyRenderer(); + } + + private void chkContentPanel_CheckedChanged(object sender, EventArgs e) + { + if (chkContentPanel.Checked) + { + toolStripContainer1.ContentPanel.RenderMode = ToolStripRenderMode.ManagerRenderMode; + } + else + { + toolStripContainer1.ContentPanel.RenderMode = ToolStripRenderMode.System; + } + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRendering.resx b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRendering.resx new file mode 100644 index 0000000..59c7d5e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomRendering.resx @@ -0,0 +1,366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 116, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAY5JREFUOE+d081L + AkEUAPD1T+hYhzoERV77OHUo8JBBt+4RRkSQ4U0SunaJOkSRKQWZWCiF5kdroa0WRAoRFXXoEEkWCUFY + Wbvrvnqz7NK6OxANPIZh5v1m3uyOKZK5AaamiaLICILACDzPtDXXM+3mRlPtGnWMAK15g4fQabVBYDej + 20QFdtJXVGBxg4Xk8aWMRDhjJLh/TgUW1hPQ1T+ihmEZgXieCghiFRBRIEPAFzkxBO4fSsByOfBsRkkE + 4xkoFEv6Mla3szoAF2Jy+E2A0KMc/nyRINe3BS2yspXSAf4YR5Kfq/LUE1QJopxEU8qSP6kD5nwxFUAE + A0E8hdM1rz0BXtDvhheHwMEnwKkkJ2OPAJMuw+TUDB2QJAneKzxgCRNnHwTBUJJd3ijYx8fowBcvwstr + BXIXdxBOZAmCu2JgssMxBGvOOmNA+d5KP+sJw17qiJRjn3bDwOAocF4LQMWtRTABf9W/hLWjFcpsA0Fc + tm76+6C+vJ+J4b4WgmAp/0bMTXVg6ekFNrQM3y3xMcC3lb+tAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + 17, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem.Designer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem.Designer.cs new file mode 100644 index 0000000..1dcdaaa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem.Designer.cs @@ -0,0 +1,85 @@ +namespace Strips +{ + partial class CustomToolStripItem + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CustomToolStripItem)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton1, + this.toolStripButton2}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(292, 25); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // toolStripButton1 + // + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Text = "toolStripButton1"; + this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click); + // + // toolStripButton2 + // + this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); + this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton2.Name = "toolStripButton2"; + this.toolStripButton2.Text = "toolStripButton2"; + // + // CustomToolStripItem + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.toolStrip1); + this.Name = "CustomToolStripItem"; + this.Text = "CustomToolStripItem"; + this.Load += new System.EventHandler(this.CustomToolStripItem_Load); + this.toolStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.ToolStripButton toolStripButton2; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem.cs new file mode 100644 index 0000000..61efcbc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class CustomToolStripItem : Form + { + public CustomToolStripItem() + { + InitializeComponent(); + } + + private void CustomToolStripItem_Load(object sender, EventArgs e) + { + DateTimePicker dt = new DateTimePicker(); + dt.Value = DateTime.Now; + dt.Format = DateTimePickerFormat.Short; + dt.Width /= 2; + dt.Font = new Font("Tahoma", dt.Font.Size); + item = new ToolStripControlHost(dt); + toolStrip1.Items.Insert(1,item); + } + + private ToolStripControlHost item; + private void toolStripButton1_Click(object sender, EventArgs e) + { + MessageBox.Show("The current date is " + item.Text); + MessageBox.Show("The current date is " + ((DateTimePicker)item.Control).Format.ToString()); + + } + } +} + diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem.resx b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem.resx new file mode 100644 index 0000000..e1f2385 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem2.Designer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem2.Designer.cs new file mode 100644 index 0000000..cb10c4e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem2.Designer.cs @@ -0,0 +1,75 @@ +namespace Strips +{ + partial class CustomToolStripItem2 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CustomToolStripItem2)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.customToolStripButton1 = new Strips.CustomToolStripButton(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.customToolStripButton1}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(292, 25); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // customToolStripButton1 + // + this.customToolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.customToolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("customToolStripButton1.Image"))); + this.customToolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.customToolStripButton1.Name = "customToolStripButton1"; + this.customToolStripButton1.Text = "customToolStripButton1"; + // + // CustomToolStripItem2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.toolStrip1); + this.Name = "CustomToolStripItem2"; + this.Text = "CustomToolStripItem2"; + this.Load += new System.EventHandler(this.CustomToolStripItem2_Load); + this.toolStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private CustomToolStripButton customToolStripButton1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem2.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem2.cs new file mode 100644 index 0000000..f72c417 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem2.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +namespace Strips +{ + public partial class CustomToolStripItem2 : Form + { + public CustomToolStripItem2() + { + InitializeComponent(); + } + + private void CustomToolStripItem2_Load(object sender, EventArgs e) + { + CheckTextBoxToolStripItem item = new CheckTextBoxToolStripItem(); + toolStrip1.Items.Add(item); + + } + } + + + [ToolboxBitmap(typeof(Button))] + [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip | ToolStripItemDesignerAvailability.StatusStrip)] + public class CheckTextBoxToolStripItem : ToolStripControlHost + { + // Controls in this item. + private FlowLayoutPanel controlPanel; + private CheckBox chk = new CheckBox(); + private TextBox txt = new TextBox(); + + public CheckTextBoxToolStripItem() : base(new FlowLayoutPanel()) + { + // Set up the FlowLayouPanel. + controlPanel = (FlowLayoutPanel)base.Control; + controlPanel.BackColor = Color.Transparent; + + // Add two child controls. + chk.AutoSize = true; + controlPanel.Controls.Add(chk); + controlPanel.Controls.Add(txt); + + TextEnabled = true; + } + + + public bool TextEnabled + { + get { return chk.Checked; } + set { chk.Checked = value; } + } + + protected override void OnSubscribeControlEvents(Control control) + { + chk.CheckedChanged += new EventHandler(CheckedChanged); + } + + protected override void OnUnsubscribeControlEvents(Control control) + { + chk.CheckedChanged -= new EventHandler(CheckedChanged); + } + + private void CheckedChanged(object sender, EventArgs e) + { + // Enable or disable the TextBox according to the + // current CheckBox selection. + txt.Enabled = TextEnabled; + } + } + + public class CustomToolStripButton : ToolStripButton + { + protected override void OnPaint(PaintEventArgs pe) + { + Parent.Renderer.DrawButtonBackground(new ToolStripItemRenderEventArgs(pe.Graphics,this)); + pe.Graphics.DrawEllipse(Pens.Blue,0,0,this.Width,this.Height); + pe.Graphics.FillEllipse(Brushes.Yellow, 0, 0, this.Width, this.Height); + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem2.resx b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem2.resx new file mode 100644 index 0000000..07f2072 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomToolStripItem2.resx @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizableStrip.Designer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizableStrip.Designer.cs new file mode 100644 index 0000000..c280f10 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizableStrip.Designer.cs @@ -0,0 +1,193 @@ +namespace Strips +{ + partial class CustomizableStrip + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CustomizableStrip)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.printToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.pasteToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.cmdSave = new System.Windows.Forms.Button(); + this.cmdRestore = new System.Windows.Forms.Button(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.AllowItemReorder = true; + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.printToolStripButton, + this.toolStripSeparator, + this.cutToolStripButton, + this.copyToolStripButton, + this.pasteToolStripButton, + this.toolStripSeparator1, + this.helpToolStripButton}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(292, 25); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + this.toolStrip1.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.toolStrip1_ItemClicked); + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // newToolStripButton + // + this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Text = "&New"; + this.newToolStripButton.MouseDown += new System.Windows.Forms.MouseEventHandler(this.newToolStripButton_MouseDown); + // + // openToolStripButton + // + this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Text = "&Open"; + // + // saveToolStripButton + // + this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Text = "&Save"; + // + // printToolStripButton + // + this.printToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image"))); + this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripButton.Name = "printToolStripButton"; + this.printToolStripButton.Text = "&Print"; + // + // cutToolStripButton + // + this.cutToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Text = "C&ut"; + // + // copyToolStripButton + // + this.copyToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Text = "&Copy"; + // + // pasteToolStripButton + // + this.pasteToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.pasteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripButton.Image"))); + this.pasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripButton.Name = "pasteToolStripButton"; + this.pasteToolStripButton.Text = "&Paste"; + // + // helpToolStripButton + // + this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image"))); + this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Text = "He&lp"; + // + // cmdSave + // + this.cmdSave.Location = new System.Drawing.Point(49, 74); + this.cmdSave.Name = "cmdSave"; + this.cmdSave.Size = new System.Drawing.Size(75, 23); + this.cmdSave.TabIndex = 1; + this.cmdSave.Text = "Save"; + this.cmdSave.Click += new System.EventHandler(this.cmdSave_Click); + // + // cmdRestore + // + this.cmdRestore.Location = new System.Drawing.Point(49, 103); + this.cmdRestore.Name = "cmdRestore"; + this.cmdRestore.Size = new System.Drawing.Size(75, 23); + this.cmdRestore.TabIndex = 2; + this.cmdRestore.Text = "Restore"; + this.cmdRestore.Click += new System.EventHandler(this.cmdRestore_Click); + // + // CustomizableStrip + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.cmdRestore); + this.Controls.Add(this.cmdSave); + this.Controls.Add(this.toolStrip1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "CustomizableStrip"; + this.Text = "CustomizableStrip"; + this.toolStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripButton printToolStripButton; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton pasteToolStripButton; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + private System.Windows.Forms.Button cmdSave; + private System.Windows.Forms.Button cmdRestore; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizableStrip.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizableStrip.cs new file mode 100644 index 0000000..d0bcc77 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizableStrip.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class CustomizableStrip : Form + { + public CustomizableStrip() + { + InitializeComponent(); + } + + private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + + } + + private void newToolStripButton_MouseDown(object sender, MouseEventArgs e) + { + + } + + private void cmdSave_Click(object sender, EventArgs e) + { + ToolStripManager.SaveSettings(this,"Test"); + } + + private void cmdRestore_Click(object sender, EventArgs e) + { + ToolStripManager.LoadSettings(this,"Test"); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizableStrip.resx b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizableStrip.resx new file mode 100644 index 0000000..d9e3e74 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizableStrip.resx @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizingStrips.csproj b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizingStrips.csproj new file mode 100644 index 0000000..35adef6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizingStrips.csproj @@ -0,0 +1,136 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {0C7BA361-10BB-48C0-9093-7FDEA0D4BB05} + WinExe + Properties + Strips + Strips + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + Form + + + ColorTableChange.cs + + + + Form + + + CustomizableStrip.cs + + + Form + + + CustomOverflow.cs + + + + Form + + + CustomRendering.cs + + + Form + + + CustomToolStripItem.cs + + + Component + + + CustomToolStripItem2.cs + + + Form + + + Menu.cs + + + + + Designer + ColorTableChange.cs + + + CustomizableStrip.cs + + + CustomOverflow.cs + + + CustomRendering.cs + + + CustomToolStripItem.cs + + + CustomToolStripItem2.cs + + + Menu.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizingStrips.sln b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizingStrips.sln new file mode 100644 index 0000000..005afaf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizingStrips.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomizingStrips", "CustomizingStrips.csproj", "{0C7BA361-10BB-48C0-9093-7FDEA0D4BB05}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0C7BA361-10BB-48C0-9093-7FDEA0D4BB05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C7BA361-10BB-48C0-9093-7FDEA0D4BB05}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C7BA361-10BB-48C0-9093-7FDEA0D4BB05}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C7BA361-10BB-48C0-9093-7FDEA0D4BB05}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizingStrips.suo b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizingStrips.suo new file mode 100644 index 0000000..f467d0d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/CustomizingStrips.suo differ diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/DesignableToolStrip.Designer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/DesignableToolStrip.Designer.cs new file mode 100644 index 0000000..835976d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/DesignableToolStrip.Designer.cs @@ -0,0 +1,38 @@ +namespace Strips +{ + partial class DesignableToolStrip + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "DesignableToolStrip"; + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/DesignableToolStrip.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/DesignableToolStrip.cs new file mode 100644 index 0000000..8831c8e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/DesignableToolStrip.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class DesignableToolStrip : Form + { + public DesignableToolStrip() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Menu.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Menu.cs new file mode 100644 index 0000000..0560dc4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace Strips +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("Strips." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Menu.designer.cs new file mode 100644 index 0000000..7dc1e31 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Menu.designer.cs @@ -0,0 +1,122 @@ +namespace Strips +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 7); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(124, 23); + this.button1.TabIndex = 0; + this.button1.Text = "CustomOverflow"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 33); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(124, 23); + this.button2.TabIndex = 1; + this.button2.Text = "CustomRendering"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 57); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(124, 23); + this.button3.TabIndex = 2; + this.button3.Text = "CustomToolStripItem"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 82); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(124, 23); + this.button4.TabIndex = 3; + this.button4.Text = "CustomToolStripItem2"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(12, 107); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(124, 23); + this.button5.TabIndex = 4; + this.button5.Text = "CustomizableStrip"; + this.button5.Click += new System.EventHandler(this.cmd_Click); + // + // button6 + // + this.button6.Location = new System.Drawing.Point(12, 133); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(124, 23); + this.button6.TabIndex = 5; + this.button6.Text = "ColorTableChange"; + this.button6.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 167); + this.Controls.Add(this.button6); + this.Controls.Add(this.button5); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Menu.resx b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Program.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Program.cs new file mode 100644 index 0000000..6ad395b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Strips +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + + Application.Run(new Menu()); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d19470c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Strips")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Strips")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("8f2e219d-aadc-4f9c-937d-b3ddc6dcd2f3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Resources.Designer.cs new file mode 100644 index 0000000..fd258d9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Resources.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="Strips.Properties.Resources.get_ResourceManager():System.Resources.ResourceManage" + + "r")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="Strips.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="Strips.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace Strips.Properties { + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Strips.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap err { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("err", resourceCulture))); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Resources.resx new file mode 100644 index 0000000..a22ce14 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\err.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\err1.ico;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Settings.Designer.cs new file mode 100644 index 0000000..90a7046 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Strips.Properties.Settings.get_Default():Strips.Properties.Settings")] + +namespace Strips.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Resources/err.ico b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Resources/err.ico new file mode 100644 index 0000000..2ceab73 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Resources/err.ico differ diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Resources/err1.ico b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Resources/err1.ico new file mode 100644 index 0000000..2ceab73 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/Resources/err1.ico differ diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/bin/Debug/Strips.exe b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/bin/Debug/Strips.exe new file mode 100644 index 0000000..7c22043 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/bin/Debug/Strips.exe differ diff --git a/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/bin/Release/Strips.exe b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/bin/Release/Strips.exe new file mode 100644 index 0000000..c67da90 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/CustomizingStrips/bin/Release/Strips.exe differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip.sln b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip.sln new file mode 100644 index 0000000..a1daa35 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomizeToolStrip", "CustomizeToolStrip\CustomizeToolStrip.csproj", "{F56F929A-7F84-46E8-8E09-63213497205C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomizeToolStripTest", "CustomizeToolStripTest\CustomizeToolStripTest.csproj", "{9CCC3E0E-464C-49F7-B038-FC795ED4A2C3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F56F929A-7F84-46E8-8E09-63213497205C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F56F929A-7F84-46E8-8E09-63213497205C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F56F929A-7F84-46E8-8E09-63213497205C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F56F929A-7F84-46E8-8E09-63213497205C}.Release|Any CPU.Build.0 = Release|Any CPU + {9CCC3E0E-464C-49F7-B038-FC795ED4A2C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9CCC3E0E-464C-49F7-B038-FC795ED4A2C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9CCC3E0E-464C-49F7-B038-FC795ED4A2C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9CCC3E0E-464C-49F7-B038-FC795ED4A2C3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip.suo b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip.suo new file mode 100644 index 0000000..59558f4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip.suo differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.Designer.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.Designer.cs new file mode 100644 index 0000000..3096d9a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.Designer.cs @@ -0,0 +1,35 @@ +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStrip +{ + partial class CustomizeToolStrip + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.bmp b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.bmp new file mode 100644 index 0000000..13a1d2f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.cs new file mode 100644 index 0000000..5116c04 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.cs @@ -0,0 +1,645 @@ +//--------------------------------------------------------------------- +// This file is part of the Microsoft .NET Framework SDK Code Samples. +// +// Copyright (C) Microsoft Corporation. All rights reserved. +// +//This source code is intended only as a supplement to Microsoft +//Development Tools and/or on-line documentation. See these other +//materials for detailed information regarding Microsoft code samples. +// +//THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY +//KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +//IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +//PARTICULAR PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Diagnostics; +using System.Windows.Forms; +using System.ComponentModel; +using System.ComponentModel.Design; + + +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStrip +{ + + /// + /// + /// This delegate is declared for the SelectedToolStripChanged event + /// on the CustomizeToolStrip component. The EventArgs-based object + /// simply contains a reference to the strip that is newly selected, + /// and a place to put the array of ToolStripItem objects which should + /// be shown for this event. + /// + /// + /// + /// Sending CustomizeToolStrip object. + /// + /// + /// + /// CustomizeToolStripEventArgs object containgin the relevant ToolStrip + /// reference, as well as a place to put the items to be shown as + /// "available" for it. + /// + /// + public delegate void SelectedToolStripChangedEventHandler( + object sender, + CustomizeToolStripAvailableEventArgs ctsea + ); + + + + //=----------------------------------------------------------------------= + // CustomizeToolStrip + //=----------------------------------------------------------------------= + /// + /// A non-visual component that can be placed on a form (or otherwise + /// used directly) that will show a little dialog letting users + /// customize the ToolStrips and MenuStrips that the programmer wishes + /// them to. + /// + /// + [DefaultProperty("ApplyChangesAfterShow"), + DefaultEvent("SelectedToolStripChanged")] + public partial class CustomizeToolStrip : Component + { + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Private Members/Types/etc... + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + /// + /// + /// This is the list of all ToolStrips (and derived classes such as + /// MenuStrips) to show in the list of available strips which the + /// user will be permitted to customize. + /// + /// + private ToolStrip [] toolStripsToInclude; + + /// + /// + /// This is the ToolStrip that should be shown as selected in the + /// dialog's "Toolbar / Menu" ComboBox. + /// + /// + private ToolStrip selectedToolStrip; + + + /// + /// + /// Controls whether or not we actually apply the changes + /// the user made to the toolstrips after showing the dialog, or + /// whether the task is left up to the programmer, who may wish to + /// do some checking and otherwise control the process. + /// + /// + private bool applyChangesAfterShow; + + + /// + /// + /// After the user closes the dialog, we'll save the array of + /// strips and proposed item collections in case the programmer + /// doesn't want US to make the changes, but would rather do it + /// themselves. + /// + /// + private ToolStripWithItems[] stripsWithItems; + + + + + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Publicly Consumable Methods/Properties/Functions + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + + //=------------------------------------------------------------------= + // CustomizeToolStrip + //=------------------------------------------------------------------= + /// + /// Initializes a new instance of this component. + /// + /// + public CustomizeToolStrip() + { + InitializeComponent(); + + this.applyChangesAfterShow = true; + } + + + //=------------------------------------------------------------------= + // CustomizeToolStrip + //=------------------------------------------------------------------= + /// + /// Initializes a new instance of this component. + /// + /// + /// + /// The container in which this component will be hosted. + /// + /// + public CustomizeToolStrip(IContainer container) + { + container.Add(this); + + InitializeComponent(); + + this.applyChangesAfterShow = true; + } + + + //=------------------------------------------------------------------= + // StripsToShow + //=------------------------------------------------------------------= + /// + /// This is the list of available ToolStrips (and MenuStrips) which + /// will be shown in the "Toolbar / Menu" ComboBox. They form the + /// set of strips that the user will be permitted to modify. + /// + /// + /// + /// An array of ToolStrips + /// + /// + [Browsable(false)] + public ToolStrip[] StripsToShow + { + get + { + return this.toolStripsToInclude; + } + + set + { + // + // we'll check that the values are valid when the programmer + // goes to show the dialog for the first time! + // + this.toolStripsToInclude = value; + } + } + + + //=------------------------------------------------------------------= + // SelectedToolStrip + //=------------------------------------------------------------------= + /// + /// This is the ToolStrip that should be shown as selected in the + /// dialog's "Toolbar / Menu" ComboBox when the dialog is shown. + /// + /// + /// + /// The ToolSTrip to select when showing the dialog. + /// + /// + [Browsable(false)] + public ToolStrip SelectedToolStrip + { + get + { + return this.selectedToolStrip; + } + + set + { + // + // we'll check that this is a valid value when the programmer + // goes to show the dialog for the first time. + // + this.selectedToolStrip = value; + } + } + + + //=------------------------------------------------------------------= + // ShowDialog + //=------------------------------------------------------------------= + /// + /// Shows the CustomizeToolStrip dialog which lets users customize + /// the various ToolStrips and MenuStrips on their form. Depending + /// on the value of the ApplyChangesAfterShow property on this + /// control, the dialog may go ahead and set the values, or leave + /// that as a task to the programmer + /// + /// + /// + /// The form to use as the parent for the modal dialog (this dialog + /// cannot be shown modeless). + /// + /// + public DialogResult ShowDialog(IWin32Window in_parentForm) + { + CustomizeToolStripForm ctsf; + DialogResult dr; + + // + // first thing we want to do is make sure that they have given + // us a valid list of Strips to show as well as a valid initially + // selected strip, + // + if (this.toolStripsToInclude == null + || this.toolStripsToInclude.Length == 0) + { + throw new ArgumentException((CustomizeToolStripMain.GetResourceManager()).GetString("excInvalidToolStripsToShow")); + } + else if (this.selectedToolStrip == null) + { + throw new ArgumentException(CustomizeToolStripMain.GetResourceManager().GetString("excNullSelectedToolStrip")); + } + else if (!CustomizeToolStripMain.ArrayContainsStrip(this.toolStripsToInclude, this.selectedToolStrip)) + { + throw new ArgumentException(CustomizeToolStripMain.GetResourceManager().GetString("excInvalidSelectedToolStrip")); + } + + // + // create the new dialog to show. This will fire the first + // SelectedToolStripChanged event for the user to populate + // the list of available items for that strip. + // + ctsf = new CustomizeToolStripForm(this, + this.toolStripsToInclude, + this.selectedToolStrip); + dr = ctsf.ShowDialog(in_parentForm); + if (dr != DialogResult.Cancel) + { + // + // Save the changes the user made in case the programmer + // queries the StripsWithItems property. + // + this.stripsWithItems = ctsf.GetToolStripsAndItems(); + + // + // if we're supposed to apply the changes ourselves, go and do + // so now. + // + if (this.applyChangesAfterShow) + { + try + { + if (in_parentForm is Control) + { + ((Control)in_parentForm).SuspendLayout(); + } + applyChangesToStrips(); + } + finally + { + if (in_parentForm is Control) + { + ((Control)in_parentForm).ResumeLayout(); + } + } + + } + } + + return dr; + } + + + //=------------------------------------------------------------------= + // ApplyChangesAfterShow + //=------------------------------------------------------------------= + /// + /// Controls whether or not we actually apply the changes + /// the user made to the toolstrips after showing the dialog, or + /// whether the task is left up to the programmer, who may wish to + /// do some checking and otherwise control the process. + /// + /// + /// + /// A boolean indicating whether or this component applies the + /// changes made by the user (true), or whether it leaves the + /// ToolStrips and MenuStrips alone (false). + /// + /// + [DefaultValue(true)] + public bool ApplyChangesAfterShow + { + get + { + return this.applyChangesAfterShow; + } + + set + { + this.applyChangesAfterShow = value; + } + } + + + //=------------------------------------------------------------------= + // StripsAndItems + //=------------------------------------------------------------------= + /// + /// After the user has finished working with the dialog, the + /// application author might wish to go and see what changes were + /// made (especially if the ApplyChangesAfterShow property was set + /// to false). This property returns an array of items holding both + /// each of the strips in the dialog, along with the set of items + /// the user indicated they would like to see with said strips. + /// + /// + /// + /// An array of items; each holding a strip handle and the set of + /// items the user said they wished to see associated with that + /// strip. + /// + /// + [Browsable(false)] + public ToolStripWithItems[] StripsAndItems + { + get + { + return this.stripsWithItems; + } + } + + + //=------------------------------------------------------------------= + // GetItemsForStrip + //=------------------------------------------------------------------= + /// + /// The user has changed the selected Toolbar or Menu in the + /// CustomizeToolStripForm form. We need to get the list of + /// available items for this strip from the user now. We'll raise + /// an event to get them to tell us. + /// + /// + /// + /// The ToolStrip (or MenuStrip) that was newly selected. + /// + /// + /// + /// An array of ToolStripItems that should be considered available + /// to this ToolStrip. + /// + /// + internal ToolStripItem[] GetItemsForStrip(ToolStrip in_strip) + { + CustomizeToolStripAvailableEventArgs ctsaea; + + ctsaea = new CustomizeToolStripAvailableEventArgs(in_strip); + + // + // fire the event with the user in the normal overridable + // fashion and then return the list of available items + // for this strip. + // + OnSelectedToolStripChanged(ctsaea); + return ctsaea.AvailableItems; + } + + + + + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Private/Protected Methods/Functions/Properties + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + + //=------------------------------------------------------------------= + // OnSelectedToolStripChanged + //=------------------------------------------------------------------= + /// + /// A method to invoke the SelectedToolStripChanged event. The pattern + /// of having an overridable protected OnXXX method to actually do + /// the event raising is followed here to encourage people + /// subclassing this control to not hook up events on themselves. + /// + /// + /// + /// Event details with the ToolStrip affected as well as a place to + /// put the resulting available items. + /// + /// + protected void OnSelectedToolStripChanged + ( + CustomizeToolStripAvailableEventArgs in_ctsaea + ) + { + if (SelectedToolStripChanged != null) + { + SelectedToolStripChanged(this, in_ctsaea); + } + } + + + //=------------------------------------------------------------------= + // applyChangesToStrips + //=------------------------------------------------------------------= + /// + /// The user has closed the CustomizeToolStripForm dialog, and the + /// ApplyChangesAfterShow property is set to True, which means they + /// want us to apply the changes for them. We do sow now. + /// + /// + private void applyChangesToStrips() + { + int x; + + // + // First step, clear out ALL strips. We have to do this before + // ANY setting is done so that there are no accidental attempts + // to give an item a second parent ... + // + for (x = 0; x < this.stripsWithItems.Length; x++) + { + this.StripsAndItems[x].Strip.Items.Clear(); + } + + // + // Next, for each strip, go and set the buttons on it. + // + for (x = 0; x < this.StripsAndItems.Length; x++) + { + this.StripsAndItems[x].Strip.Items.AddRange(this.StripsAndItems[x].Items); + } + + // + // and that should do it!! + // + } + + + + + + + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Events + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + //=------------------------------------------------------------------= + // SelectedToolStripChanged + //=------------------------------------------------------------------= + /// + /// This event is raised whenever the user selects a new ToolStrip + /// or MenuStrip in the "Toolbar / Menu" ComboBox in the + /// CustomizeToolStrip dialog that is shown from this component. + /// + /// + public event SelectedToolStripChangedEventHandler SelectedToolStripChanged; + + } + + + + + //=----------------------------------------------------------------------= + // CustomizeToolStripEventArgs + //=----------------------------------------------------------------------= + /// + /// + /// + /// + public class CustomizeToolStripEventArgs : EventArgs + { + /// + /// summary> + /// + /// + /// + private ToolStrip affectedStrip; + + //=------------------------------------------------------------------= + // CustomizeToolStripEventArgs + //=------------------------------------------------------------------= + /// + /// + /// + /// + /// + /// + /// + /// + internal CustomizeToolStripEventArgs(ToolStrip in_affectedStrip) + { + Debug.Assert(in_affectedStrip != null); + this.affectedStrip = in_affectedStrip; + } + + + //=------------------------------------------------------------------= + // Strip + //=------------------------------------------------------------------= + /// + /// + /// + /// + /// + /// + /// + /// + public ToolStrip Strip + { + get + { + return this.affectedStrip; + } + } + } + + //=----------------------------------------------------------------------= + // CustomizeToolStripAvailableEventArgs + //=----------------------------------------------------------------------= + /// + /// This class is included in the SelectedToolStripChanged event raised + /// by the CustomizeToolStrip class. It contains a handle to the newly + /// selected ToolStrip or MenuStrip, as well as a place to put all the + /// ToolStripItems that should be shown as "available" to the + /// ToolStrip. Please note that the callee should just show all items + /// that would normally be available to the strip; the dialog will + /// remove any items that are already included in the ToolStrip. + /// + /// + public class CustomizeToolStripAvailableEventArgs + : CustomizeToolStripEventArgs + { + /// + /// + /// The array of items to be shown as available to be placed on + /// the given ToolStrip (or MenuStrip). + /// + /// + private ToolStripItem [] availableItems; + + //=------------------------------------------------------------------= + // CustomizeToolStripAvailableEventArgs + //=------------------------------------------------------------------= + /// + /// Initializes a new instance of our class. + /// + /// + /// + /// The ToolStrip for which we want to get the list of available + /// ToolStripItems to show. + /// + /// + internal CustomizeToolStripAvailableEventArgs + ( + ToolStrip in_affectedStrip + ) + : base(in_affectedStrip) + { + } + + + //=------------------------------------------------------------------= + // AvailableItems + //=------------------------------------------------------------------= + /// + /// An array containing the list of available items for this + /// ToolStrip. The invoked event handler should set this array to + /// those items that should be possibly listed for this + /// ToolStrip (or MenuStrip). The invoked handler should simply + /// return a set of all possible items. The dialog will + /// make sure to remove any from the list that are actually already + /// on the ToolStrip or MenuStrip. + /// + /// + /// + /// An array of ToolStripItems (or derived classes) that should + /// be shown as available to be placed in the given ToolStrip. + /// + /// + public ToolStripItem[] AvailableItems + { + get + { + return this.availableItems; + } + + set + { + this.availableItems = value; + } + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.csproj b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.csproj new file mode 100644 index 0000000..6dc80b6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStrip.csproj @@ -0,0 +1,79 @@ + + + Debug + 8.0.50727 + 2.0 + {F56F929A-7F84-46E8-8E09-63213497205C} + Library + Microsoft.Samples.BoosterSamples.CustomizeToolStrip + CustomizeToolStrip + 4 + + + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + Component + + + CustomizeToolStrip.cs + + + Form + + + CustomizeToolStripForm.cs + + + + + + ResXFileCodeGenerator + Resources.cs + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + + + + + + + CustomizeToolStripForm.cs + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripForm.Designer.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripForm.Designer.cs new file mode 100644 index 0000000..7d2a11d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripForm.Designer.cs @@ -0,0 +1,212 @@ +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStrip +{ + partial class CustomizeToolStripForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.availableItemsLabel = new System.Windows.Forms.Label(); + this.availableItemsListBox = new System.Windows.Forms.ListBox(); + this.closeButton = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.resetButton = new System.Windows.Forms.Button(); + this.moveUpButton = new System.Windows.Forms.Button(); + this.moveDownButton = new System.Windows.Forms.Button(); + this.toolbarMenuLabel = new System.Windows.Forms.Label(); + this.toolbarMenuComboBox = new System.Windows.Forms.ComboBox(); + this.addButton = new System.Windows.Forms.Button(); + this.removeButton = new System.Windows.Forms.Button(); + this.currentItemsLabel = new System.Windows.Forms.Label(); + this.currentItemsListBox = new System.Windows.Forms.ListBox(); + this.SuspendLayout(); +// +// availableItemsLabel +// + this.availableItemsLabel.AutoSize = true; + this.availableItemsLabel.Location = new System.Drawing.Point(8, 11); + this.availableItemsLabel.Name = "availableItemsLabel"; + this.availableItemsLabel.Size = new System.Drawing.Size(133, 14); + this.availableItemsLabel.TabIndex = 0; + this.availableItemsLabel.Text = "&Available ToolStrip Items:"; +// +// availableItemsListBox +// + this.availableItemsListBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.availableItemsListBox.FormattingEnabled = true; + this.availableItemsListBox.IntegralHeight = false; + this.availableItemsListBox.Location = new System.Drawing.Point(8, 29); + this.availableItemsListBox.Name = "availableItemsListBox"; + this.availableItemsListBox.Size = new System.Drawing.Size(174, 210); + this.availableItemsListBox.TabIndex = 1; + this.availableItemsListBox.SelectedIndexChanged += new System.EventHandler(this.availableItemsListBox_SelectedIndexChanged); + this.availableItemsListBox.DoubleClick += new System.EventHandler(this.availableItemsListBox_DoubleClick); + this.availableItemsListBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.availableItemsListBox_DrawItem); +// +// closeButton +// + this.closeButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.closeButton.Location = new System.Drawing.Point(472, 42); + this.closeButton.Name = "closeButton"; + this.closeButton.TabIndex = 11; + this.closeButton.Text = "&Close"; + this.closeButton.Click += new System.EventHandler(this.closeButton_Click); +// +// cancelButton +// + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(472, 72); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.TabIndex = 12; + this.cancelButton.Text = "Ca&ncel"; +// +// resetButton +// + this.resetButton.Location = new System.Drawing.Point(472, 102); + this.resetButton.Name = "resetButton"; + this.resetButton.TabIndex = 13; + this.resetButton.Text = "R&eset"; + this.resetButton.Click += new System.EventHandler(this.resetButton_Click); +// +// moveUpButton +// + this.moveUpButton.Location = new System.Drawing.Point(473, 171); + this.moveUpButton.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2); + this.moveUpButton.Name = "moveUpButton"; + this.moveUpButton.TabIndex = 14; + this.moveUpButton.Text = "Move &Up"; + this.moveUpButton.Click += new System.EventHandler(this.moveUpButton_Click); +// +// moveDownButton +// + this.moveDownButton.Location = new System.Drawing.Point(473, 199); + this.moveDownButton.Margin = new System.Windows.Forms.Padding(3, 1, 3, 3); + this.moveDownButton.Name = "moveDownButton"; + this.moveDownButton.TabIndex = 15; + this.moveDownButton.Text = "Move &Down"; + this.moveDownButton.Click += new System.EventHandler(this.moveDownButton_Click); +// +// toolbarMenuLabel +// + this.toolbarMenuLabel.AutoSize = true; + this.toolbarMenuLabel.Location = new System.Drawing.Point(191, 11); + this.toolbarMenuLabel.Name = "toolbarMenuLabel"; + this.toolbarMenuLabel.Size = new System.Drawing.Size(83, 14); + this.toolbarMenuLabel.TabIndex = 2; + this.toolbarMenuLabel.Text = "&Toolbar / Menu:"; +// +// toolbarMenuComboBox +// + this.toolbarMenuComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.toolbarMenuComboBox.FormattingEnabled = true; + this.toolbarMenuComboBox.Location = new System.Drawing.Point(272, 8); + this.toolbarMenuComboBox.Name = "toolbarMenuComboBox"; + this.toolbarMenuComboBox.Size = new System.Drawing.Size(275, 21); + this.toolbarMenuComboBox.TabIndex = 3; + this.toolbarMenuComboBox.SelectedIndexChanged += new System.EventHandler(this.toolbarMenuComboBox_SelectedIndexChanged); +// +// addButton +// + this.addButton.Location = new System.Drawing.Point(190, 95); + this.addButton.Name = "addButton"; + this.addButton.TabIndex = 4; + this.addButton.Text = "A&dd >>"; + this.addButton.Click += new System.EventHandler(this.addButton_Click); +// +// removeButton +// + this.removeButton.Location = new System.Drawing.Point(191, 125); + this.removeButton.Name = "removeButton"; + this.removeButton.TabIndex = 5; + this.removeButton.Text = "<< &Remove"; + this.removeButton.Click += new System.EventHandler(this.removeButton_Click); +// +// currentItemsLabel +// + this.currentItemsLabel.AutoSize = true; + this.currentItemsLabel.Location = new System.Drawing.Point(272, 42); + this.currentItemsLabel.Name = "currentItemsLabel"; + this.currentItemsLabel.Size = new System.Drawing.Size(117, 14); + this.currentItemsLabel.TabIndex = 6; + this.currentItemsLabel.Text = "Current Toolbar &Items:"; +// +// currentItemsListBox +// + this.currentItemsListBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.currentItemsListBox.FormattingEnabled = true; + this.currentItemsListBox.IntegralHeight = false; + this.currentItemsListBox.Location = new System.Drawing.Point(273, 62); + this.currentItemsListBox.Name = "currentItemsListBox"; + this.currentItemsListBox.Size = new System.Drawing.Size(188, 176); + this.currentItemsListBox.TabIndex = 7; + this.currentItemsListBox.SelectedIndexChanged += new System.EventHandler(this.currentItemsListBox_SelectedIndexChanged); + this.currentItemsListBox.DoubleClick += new System.EventHandler(this.currentItemsListBox_DoubleClick); + this.currentItemsListBox.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.currentItemsListBox_DrawItem); +// +// CustomizeToolStripForm +// + this.ClientSize = new System.Drawing.Size(560, 256); + this.Controls.Add(this.currentItemsListBox); + this.Controls.Add(this.currentItemsLabel); + this.Controls.Add(this.removeButton); + this.Controls.Add(this.addButton); + this.Controls.Add(this.toolbarMenuComboBox); + this.Controls.Add(this.toolbarMenuLabel); + this.Controls.Add(this.moveDownButton); + this.Controls.Add(this.moveUpButton); + this.Controls.Add(this.resetButton); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.closeButton); + this.Controls.Add(this.availableItemsListBox); + this.Controls.Add(this.availableItemsLabel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Location = new System.Drawing.Point(13, 14); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "CustomizeToolStripForm"; + this.Text = "CustomizeToolStrip"; + this.Load += new System.EventHandler(this.CustomizeToolStripForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label availableItemsLabel; + private System.Windows.Forms.ListBox availableItemsListBox; + private System.Windows.Forms.Button closeButton; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button resetButton; + private System.Windows.Forms.Button moveUpButton; + private System.Windows.Forms.Button moveDownButton; + private System.Windows.Forms.Label toolbarMenuLabel; + private System.Windows.Forms.Button addButton; + private System.Windows.Forms.Button removeButton; + private System.Windows.Forms.Label currentItemsLabel; + private System.Windows.Forms.ListBox currentItemsListBox; + + internal System.Windows.Forms.ComboBox toolbarMenuComboBox; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripForm.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripForm.cs new file mode 100644 index 0000000..78c7a57 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripForm.cs @@ -0,0 +1,1621 @@ +//--------------------------------------------------------------------- +// This file is part of the Microsoft .NET Framework SDK Code Samples. +// +// Copyright (C) Microsoft Corporation. All rights reserved. +// +//This source code is intended only as a supplement to Microsoft +//Development Tools and/or on-line documentation. See these other +//materials for detailed information regarding Microsoft code samples. +// +//THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY +//KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +//IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +//PARTICULAR PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Drawing; +using System.Diagnostics; +using System.Collections; +using System.Windows.Forms; + + +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStrip +{ + //=----------------------------------------------------------------------= + // CustomizeToolStripForm + //=----------------------------------------------------------------------= + /// + /// A little dialog that can be brought up to let users customize the + /// ToolStrips and MenuStrips in their application. + /// + /// + partial class CustomizeToolStripForm : Form + { + + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Private Members/Types/etc... + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + private const string SEPARATOR_NAME = "___SEPARATOR"; + private const string ANCHOR_SEPARATOR = "___ANCHORSEP"; + + + /// + /// + /// This structure is used in the toolMenuComboBox, which holds a list + /// of all ToolStrips and MenuStrips that can be customized. + /// + /// + private class StripAndName + { + public string Name; + public ToolStrip Strip; + + public override string ToString() + { + return Name; + } + } + + /// + /// + /// This is a simple structure used by the two list boxes to + /// let us store Items in them (so we can paint their icons + /// properly in addition to being able to identify them) as + /// as well as friendly text for them. (By default, + /// ToolStripItem.ToString() doesn't print what we want it + /// to.) + /// + /// + private class ItemAndName + { + public string Name; + public ToolStripItem Item; + + + public override string ToString() + { + if (this.Name.Equals(SEPARATOR_NAME) + || this.Name.Equals(ANCHOR_SEPARATOR)) + { + return CustomizeToolStripMain.GetResourceManager().GetString("separatorText"); + } + else + { + return Name.Replace("&", ""); + } + } + } + + /// + /// + /// This struct is used to track the base list of available + /// items for a given ToolStrip-based strip, as well as those + /// items that the user selected for this strip. + /// + /// + private class ToolStripItemMap + { + public ToolStripItem[] baseAvailableItems; + public ToolStripItem[] userSelectedItems; + } + + /// + /// + /// This table will be keyed off the handles to ToolStrips and + /// will contain the list of available items they are permitted + /// to use, as well as the list of items that the user last + /// selected in the User Interface. + /// + /// + private Hashtable toolStripToItemsMapping; + + /// + /// + /// The last value of SelectedIndex in the toolbarMenuComboBox. + /// + /// + private int lastSelectedStripIndex; + + /// + /// + /// This is the first strip that will be selected in the dialog. + /// we save it here because if we set the value before the form + /// is fully loaded/shown, then the SelectedIndexChanged event + /// isn't fired, which means we can't populate the lists. + /// + /// + private ToolStrip initialStripToSelect; + + /// + /// + /// This is the CustomizeToolStrip in which we are operating. + /// We need to know this to forward them certain events and + /// get the return values ... + /// + /// + private CustomizeToolStrip parentCustomizer; + + + + + + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Publicly Consumable Methods/Properties/Functions + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + + //=------------------------------------------------------------------= + // CustomizeToolStripForm + //=------------------------------------------------------------------= + /// + /// Initializes a new instance of our dialog. + /// + /// + /// + /// The parent CustomizeToolStrip in which we are operating. We need + /// to hold on to this so we can send them event notifications. + /// + /// + /// An array of ToolStrips and/or ToolStrip-based MenuStrips to + /// list in the "Toolbar / Menu" ComboBox. + /// + /// + /// A reference to the ToolStrip in the array of strips to list that + /// should find itself the first to be selected in the ComboBox. It + /// is an error for this parameter to not be a member of the list of + /// available ToolStrips. + /// + /// + protected internal CustomizeToolStripForm + ( + CustomizeToolStrip in_cts, + ToolStrip [] in_stripsToList, + ToolStrip in_initialSelected + ) + { + // + // Sets up all the Windows Forms code behind this class. + // + InitializeComponent(); + + // + // these are checked with exceptions in the calling class. + // + Debug.Assert(in_stripsToList != null); + Debug.Assert(in_initialSelected != null); + Debug.Assert(in_cts != null); + + this.parentCustomizer = in_cts; + this.toolStripToItemsMapping = new Hashtable(); + this.lastSelectedStripIndex = -1; + + // + // set the heights of the list boxes to something reasonable + // for the current font. + // + this.availableItemsListBox.ItemHeight = (int)this.Font.GetHeight() + 4; + this.currentItemsListBox.ItemHeight = (int)this.Font.GetHeight() + 4; + this.toolbarMenuComboBox.ItemHeight = (int)this.Font.GetHeight() + 4; + + // + // add the ToolStrips and ilk to the dropdown combobox of + // available strips. + // + insertStripsIntoCombo(in_stripsToList); + + // + // set the selected item in the ComboBox. + // + this.initialStripToSelect = in_initialSelected; + } + + + //=------------------------------------------------------------------= + // GetToolStripsAndItems + //=------------------------------------------------------------------= + /// + /// Used by the CustomizeToolStrip component to get the list of + /// ToolStrips and the list of buttons the user wanted selected for + /// each. + /// + /// + /// + /// An array of ToolStripWithItem objects holding the strips and + /// arrays of selected items for them. + /// + /// + protected internal ToolStripWithItems [] GetToolStripsAndItems() + { + ArrayList al = new ArrayList(); + ToolStripWithItems tswi; + StripAndName san; + + // + // loop through all the strips about which we know, getting + // their currently 'chosen' items. + // + for (int x = 0; x < this.toolbarMenuComboBox.Items.Count; x++) + { + san = (StripAndName)this.toolbarMenuComboBox.Items[x]; + + tswi = new ToolStripWithItems(); + tswi.Strip = san.Strip; + tswi.Items = fetchSelectedItemsForStrip(san.Strip); + al.Add(tswi); + } + + return (ToolStripWithItems[])al.ToArray(typeof(ToolStripWithItems)); + } + + + + + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Private Methods/Functions/etc + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + + //=------------------------------------------------------------------= + // insertStripsIntoCombo + //=------------------------------------------------------------------= + /// + /// Takes the given array of ToolStrips and MenuStrips and inserts + /// them into the "Toolbar / Menu" ComboBox on the dialog from which + /// the user can select which ToolStrip t customize. + /// + /// + /// + /// Array of ToolStrips and friends to insert into the ComboBox. + /// + /// + private void insertStripsIntoCombo(ToolStrip[] in_strips) + { + // + // This is checked above more robustly. + // + System.Diagnostics.Debug.Assert(in_strips != null + && in_strips.Length != 0); + + // + // insert them all into the ComboBox one at a time. + // + for (int x = 0; x < in_strips.Length; x++) + { + StripAndName san = new StripAndName(); + + san.Name = in_strips[x].Text; + san.Strip = in_strips[x]; + + this.toolbarMenuComboBox.Items.Add(san); + } + } + + + //=------------------------------------------------------------------= + // selectToolStripInCombo + //=------------------------------------------------------------------= + /// + /// Goes and selects the given ToolStrip in the combo of all strips + /// available for customization, toolMenuComboBox. + /// + /// + /// + /// The strip to mark as the selected item. + /// + /// + private void selectToolStripInCombo(ToolStrip in_strip) + { + StripAndName san; + + for (int x = 0; x < this.toolbarMenuComboBox.Items.Count; x++) + { + san = (StripAndName)this.toolbarMenuComboBox.Items[x]; + + if (san.Strip == in_strip) + { + this.toolbarMenuComboBox.SelectedIndex = x; + return; + } + } + + // + // wait a minute! how come it's not there any more?? + // + System.Diagnostics.Debug.Fail("Asked to select an item that " + + "doesn't exist!"); + } + + + //=------------------------------------------------------------------= + // toolbarMenuComboBox_SelectedIndexChanged + //=------------------------------------------------------------------= + /// + /// The user has selected a new Toolbar or Menu to customize in the + /// "Toolbar / Menu" combo box. We will go and get the new set of + /// available Items for this strip now. + /// + /// + /// + /// Source of the event. + /// + /// + /// + /// Details about the event (in this case -- none) + /// + /// + private void toolbarMenuComboBox_SelectedIndexChanged + ( + object sender, + EventArgs e + ) + { + ToolStripItem[] items; + StripAndName san; + + // + // okay, first go and store away any changed information for the + // last selected strip (since we're on a new one now). + // + storeSelectedItemsForLastStrip(); + + // + // now, get the strip newly selected. + // + Debug.Assert(this.toolbarMenuComboBox.SelectedItem is StripAndName); + san = (StripAndName)this.toolbarMenuComboBox.SelectedItem; + + // + // get the parent CustomizeToolStrip component to raise the + // event which will have the user get the items for this strip. + // + items = this.parentCustomizer.GetItemsForStrip(san.Strip); + + // + // okay, given these items, store them away in our mapping + // table. + // + storeAvailableItemsForStrip(san.Strip, items); + this.lastSelectedStripIndex = this.toolbarMenuComboBox.SelectedIndex; + + // + // finally, set the items in the list box of available items + // as well as the list of currently used items. + // + populateAvailableItemsForStrip(san.Strip, items); + populateCurrentItemsForStrip(san.Strip); + updateButtons(); + } + + + //=------------------------------------------------------------------= + // populateAvailableItemsForStrip + //=------------------------------------------------------------------= + /// + /// Given a list of items that are "available" to be used for a + /// given ToolStrip (or MenuStrip), go and populate the + /// availableItemsListBox with these items, removing those that + /// are already in the strip. + /// + /// + /// + /// The ToolStrip for which we have a list of available items. + /// + /// + /// + /// The list of available items (or derived objects, of course). + /// + /// + /// + /// There are two minor limitations in this code: + /// + /// 1. For those cases where there is a ToolStrip Label that is + /// clearly never intended to be on its own, such as one + /// labelled "Search" next to a drop-down ComboBox, we have + /// no way to group those right now. + /// + /// 2. Since ToolStripItems are parented strongly (each has an + /// Owner property), we make sure that any button we have is + /// not owned by another ToolStrip. This wouldn't be a 100% + /// accurate search (in those cases where we were given items + /// from ToolStrips about which we did not know), but it's + /// good for the 90% case. + /// + /// + private void populateAvailableItemsForStrip + ( + ToolStrip in_strip, + ToolStripItem[] in_items + ) + { + ItemAndName ian; + + this.availableItemsListBox.Items.Clear(); + + // + // firstly, add the separator item. + // + ian = new ItemAndName(); + ian.Name = SEPARATOR_NAME; + ian.Item = null; + this.availableItemsListBox.Items.Add(ian); + + // + // loop through the list of "available" items, adding those + // which are not already in the list of items on the strip. + // + for (int x = 0; x < in_items.Length; x++) + { + // + // add non separator items (we handle seps ourselves) + // + if (!(in_items[x] is ToolStripSeparator)) + { + if (!stripContainsItem(in_strip, in_items[x]) + && !anyStripsContainItem(in_items[x])) + { + ian = new ItemAndName(); + ian.Name = in_items[x].Text; + ian.Item = in_items[x]; + + this.availableItemsListBox.Items.Add(ian); + } + } + } + } + + + //=------------------------------------------------------------------= + // populateCurrentItemsForStrip + //=------------------------------------------------------------------= + /// + /// Given a ToolStrip, go and populate the currentItemsListBOx + /// list with all the buttons in it. + /// + /// + /// + /// The ToolStrip to process. + /// + /// + private void populateCurrentItemsForStrip(ToolStrip in_strip) + { + ToolStripItem[] items; + ItemAndName ian; + + this.currentItemsListBox.Items.Clear(); + + items = fetchSelectedItemsForStrip(in_strip); + + // + // for each item, go and add it to the list of currently + // included items. + // + for (int x = 0; x < items.Length; x++) + { + ian = new ItemAndName(); + + // + // replace any separators with our own special separator + // item. + // + if (items[x] is ToolStripSeparator) + { + ian.Name = SEPARATOR_NAME; + ian.Item = null; + } + else + { + ian.Name = items[x].Text; + ian.Item = items[x]; + } + + this.currentItemsListBox.Items.Add(ian); + } + + // + // Finally, add the special Anchor Spearator Item that cannot + // be removed. + // + ian = new ItemAndName(); + ian.Name = ANCHOR_SEPARATOR; + ian.Item = null; + this.currentItemsListBox.Items.Add(ian); + } + + + //=------------------------------------------------------------------= + // drawItemForListBox + //=------------------------------------------------------------------= + /// + /// We've been asked to paint an item in one of the list boxes, and + /// the code is so similar, we've factored it out into one routine. + /// + /// + /// + /// ListBox asking for painting. + /// + /// + /// + /// DrawItemEventArgs with the details. + /// + /// + private void drawItemForListBox + ( + ListBox in_listBox, + DrawItemEventArgs in_diea + ) + { + SolidBrush b = null; + ItemAndName ian; + bool selected; + + // + // draw the the background for the dude. This does the right + // thing for selection as well, which is nice. + // + Debug.Assert(in_listBox != null && in_diea != null); + in_diea.DrawBackground(); + + Debug.Assert(in_listBox.Items[in_diea.Index] is ItemAndName); + ian = (ItemAndName)in_listBox.Items[in_diea.Index]; + + // + // if the item is a special separator item, then don't draw the + // image for it. Otherwise, draw the image now, if there is one. + // + if (!ian.Name.Equals(SEPARATOR_NAME) + && !ian.Name.Equals(ANCHOR_SEPARATOR)) + { + in_diea.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + + // + // we first have to figure out from where the image is to + // come... + // + if (ian.Item.Image != null) + { + in_diea.Graphics.DrawImage(ian.Item.Image, + new Point(in_diea.Bounds.Left + 1, + in_diea.Bounds.Top + 1)); + } + else if (ian.Item.ImageIndex >= 0) + { + ian.Item.Owner.ImageList.Draw(in_diea.Graphics, + new Point(in_diea.Bounds.Left + 1, + in_diea.Bounds.Top + 1), + ian.Item.ImageIndex); + } + } + + // + // finally, draw the text + // + try + { + selected = (in_diea.State & DrawItemState.Selected) != 0; + + // + // figure out what color brush we need. + // + if (selected) + { + b = new SolidBrush(this.availableItemsListBox.BackColor); + } + else if (ian.Name.Equals(ANCHOR_SEPARATOR)) + { + b = new SolidBrush(SystemColors.ControlDark); + } + else + { + b = new SolidBrush(SystemColors.ControlText); + } + + in_diea.Graphics.DrawString(ian.ToString(), this.Font, + b, 18, in_diea.Bounds.Top + 2); + + // + // don't forget to draw the focus rectangle if we're selected + // + if (selected) + { + in_diea.DrawFocusRectangle(); + } + } + finally + { + // + // clean up! + // + if (b != null) + { + b.Dispose(); + } + } + } + + + //=------------------------------------------------------------------= + // availableItemsListBox_DrawItem + //=------------------------------------------------------------------= + /// + /// We've been asked to paint an item in the availableItemsListBox + /// control. Do so now. + /// + /// + /// + /// ListBox that wants to be painted. + /// + /// + /// + /// Details (in this case, none) + /// + /// + private void availableItemsListBox_DrawItem + ( + object sender, + DrawItemEventArgs e + ) + { + drawItemForListBox(this.availableItemsListBox, e); + } + + + //=------------------------------------------------------------------= + // currentItemsListBox_DrawItem + //=------------------------------------------------------------------= + /// + /// We've been asked to paint an item in the currentItemsListBox + /// control. Do so now. + /// + /// + /// + /// ListBox that wants to be painted. + /// + /// + /// + /// Details (in this case, none) + /// + /// + private void currentItemsListBox_DrawItem + ( + object sender, + DrawItemEventArgs e + ) + { + drawItemForListBox(this.currentItemsListBox, e); + } + + + //=------------------------------------------------------------------= + // addButton_Click + //=------------------------------------------------------------------= + /// + /// The user has clicked on the "Add >>" button, to move the + /// currently selected button from the available list box to the + /// currently used list box. This code attempts to execute that + /// move. + /// + /// + /// + /// From whence cometh the event (Add button). + /// + /// + /// + /// Information about the event (in this case, none). + /// + /// + private void addButton_Click(object sender, EventArgs e) + { + int insertAt, insertFrom; + ItemAndName ian; + + // + // get the selected index, making sure it's valid. + // + insertFrom = this.availableItemsListBox.SelectedIndex; + if (insertFrom == -1) + { + return; + } + + // + // add the item to the currentItemsListBox before the currently + // selection. If it's a separator, we'll create a new instance + // of it. + // + ian = (ItemAndName)this.availableItemsListBox.Items[insertFrom]; + if (ian.Item == null) + { + ian = new ItemAndName(); + ian.Name = SEPARATOR_NAME; + ian.Item = null; + } + + insertAt = this.currentItemsListBox.SelectedIndex; + if (insertAt == -1) + { + insertAt = this.currentItemsListBox.Items.Count - 1; + } + this.currentItemsListBox.Items.Insert(insertAt, ian); + + // + // remove it from the available list, provided it's not the + // separator + // + if (ian.Item != null) + { + this.availableItemsListBox.Items.Remove(ian); + + // + // make sure some item is still selected. + // + if (insertFrom < this.availableItemsListBox.Items.Count) + { + this.availableItemsListBox.SelectedIndex = insertFrom; + } + else + { + this.availableItemsListBox.SelectedIndex = insertFrom - 1; + } + } + + // + // enable and disable the appropriate buttons. + // + updateButtons(); + } + + + //=------------------------------------------------------------------= + // removeButton_Click + //=------------------------------------------------------------------= + /// + /// The user has clicked on the "Remove >>" button, to move the + /// currently selected button from the currently usedlist box to the + /// available list box. This code attempts to execute that + /// move. + /// + /// + /// + /// From whence cometh the event (Add button). + /// + /// + /// + /// Information about the event (in this case, none). + /// + /// + private void removeButton_Click(object sender, EventArgs e) + { + int insertFrom, insertTo; + ItemAndName ian; + ToolStrip ts; + + // + // find out from where we're removing and make sure it's a valid + // item to remove. + // + insertFrom = this.currentItemsListBox.SelectedIndex; + if (insertFrom == -1 + || insertFrom == this.currentItemsListBox.Items.Count - 1) + { + return; + } + + // + // add the item back to the available list box, provided it's not a + // separator + // + ian = (ItemAndName)this.currentItemsListBox.Items[insertFrom]; + if (ian.Item != null) + { + // + // it's not a separator -- figure out where to re-insert this + // into the array of available items (we will attempt to + // preserve the order when we move things around so as not to + // mess this up terribly.) + // + ts = ((StripAndName)this.toolbarMenuComboBox.SelectedItem).Strip; + insertTo = determineReinsertIndex(ts, + this.availableItemsListBox, + ian.Item); + if (insertTo != -1) + { + this.availableItemsListBox.Items.Insert(insertTo, ian); + } + } + + // + // remove that puppy! + // + this.currentItemsListBox.Items.Remove(ian); + + // + // make sure there's still an item selected. + // + if (insertFrom < this.currentItemsListBox.Items.Count - 1) + { + this.currentItemsListBox.SelectedIndex = insertFrom; + } + else + { + this.currentItemsListBox.SelectedIndex = insertFrom - 1; + } + + // + // finally, udpate da butttons. + // + updateButtons(); + } + + + //=------------------------------------------------------------------= + // resetButton_Click + //=------------------------------------------------------------------= + /// + /// This isn't too complicated -- when the user presses this button, + /// we want to restore the buttons to their 'original' state, which + /// just so happens to be recorded in their Items collections, since + /// we don't actually apply the changes in this dialog class. + /// + /// + /// + /// Reset Button + /// + /// + /// + /// EventArgs.Empty + /// + /// + private void resetButton_Click(object sender, EventArgs e) + { + ToolStripItemMap tsim; + StripAndName san; + object o; + + // + // all we have to do is clear out the collections of items for + // the various strips we have handy. + // + for (int x = 0; x < this.toolbarMenuComboBox.Items.Count; x++) + { + san = (StripAndName)this.toolbarMenuComboBox.Items[x]; + o = this.toolStripToItemsMapping[san.Strip]; + if (o != null) + { + // + // clear these out and re-set them in the map. + // + tsim = (ToolStripItemMap)o; + // commenting this out to avoid setting the base items to null - there likely are base items. + //tsim.baseAvailableItems = null; + tsim.userSelectedItems = null; + this.toolStripToItemsMapping[san.Strip] = tsim; + } + } + } + + + //=------------------------------------------------------------------= + // moveUpButton_Click + //=------------------------------------------------------------------= + /// + /// The user has clicked on the "Move Up" button. Moves up the + /// selected item in the currently selected list box, provided there + /// are items to select. + /// + /// + /// + /// The "Move Up" Button + /// + /// + /// + /// EventArgs.Empty + /// + /// + private void moveUpButton_Click(object sender, EventArgs e) + { + int indexFrom; + object o; + + // + // get the currently selected index and item. if there is no + // selection, or it's the first item in the list (or the very + // special Anchor Separator), then we do nothing. + // + indexFrom = this.currentItemsListBox.SelectedIndex; + if (indexFrom == -1 + || indexFrom == 0 + || indexFrom == this.currentItemsListBox.Items.Count - 1) + { + return; + } + + o = this.currentItemsListBox.SelectedItem; + + // + // remove this item and insert it one item earlier. + // + this.currentItemsListBox.Items.RemoveAt(indexFrom); + this.currentItemsListBox.Items.Insert(indexFrom - 1, o); + + // + // make sure it's selected, update our buttons, and go to bed. + // + this.currentItemsListBox.SelectedIndex = indexFrom - 1; + updateButtons(); + } + + + //=------------------------------------------------------------------= + // moveDownButton_Click + //=------------------------------------------------------------------= + /// + /// The user has clicked on the "Move Down" button. Moves down the + /// selected item in the currently selected list box, provided there + /// are items to select. + /// + /// + /// + /// The "Move Down" Button + /// + /// + /// + /// EventArgs.Empty + /// + /// + private void moveDownButton_Click(object sender, EventArgs e) + { + int indexFrom; + object o; + + // + // get the currently selected index and item. if there is no + // selection or it's the last item in the list, then go away. + // + indexFrom = this.currentItemsListBox.SelectedIndex; + if (indexFrom == -1 + || indexFrom == this.currentItemsListBox.Items.Count - 2 + || indexFrom == this.currentItemsListBox.Items.Count - 1) + { + return; + } + o = this.currentItemsListBox.SelectedItem; + + // + // remove this item and insert it one later. + // + //this.currentItemsListBox.Items.RemoveAt(indexFrom); + this.currentItemsListBox.Items.Remove(o); + this.currentItemsListBox.Items.Insert(indexFrom + 1, o); + + // + // make sure it's still selected, update the buttons, and go home + // + this.currentItemsListBox.SelectedIndex = indexFrom + 1; + updateButtons(); + } + + + //=------------------------------------------------------------------= + // updateButtons + //=------------------------------------------------------------------= + /// + /// This routine makes sure that the appropriate buttons are enabled + /// and disabled at the appropraite times. + /// + /// + private void updateButtons() + { + // + // the add and remove buttons. + // + this.addButton.Enabled = this.availableItemsListBox.SelectedIndex != -1; + this.removeButton.Enabled = this.currentItemsListBox.Items.Count > 0; + + // + // move "up" button. + // + if (this.currentItemsListBox.Items.Count > 1 + && this.currentItemsListBox.SelectedIndex > 0 + && (this.currentItemsListBox.SelectedIndex + != this.currentItemsListBox.Items.Count - 1)) + { + this.moveUpButton.Enabled = true; + } + else + { + this.moveUpButton.Enabled = false; + } + + // + // move "down" button + // + if (this.currentItemsListBox.Items.Count > 0 + && this.currentItemsListBox.SelectedIndex >= 0 + && (this.currentItemsListBox.SelectedIndex + < this.currentItemsListBox.Items.Count - 2)) + { + this.moveDownButton.Enabled = true; + } + else + { + this.moveDownButton.Enabled = false; + } + + // + // "Remove" button + // + if (this.currentItemsListBox.Items.Count > 0 + && this.currentItemsListBox.SelectedIndex >= 0 + && (this.currentItemsListBox.SelectedIndex + != this.currentItemsListBox.Items.Count - 1)) + { + this.removeButton.Enabled = true; + } + else + { + this.removeButton.Enabled = false; + } + } + + + //=------------------------------------------------------------------= + // storeAvailableItemsForStrip + //=------------------------------------------------------------------= + /// + /// Goes and sets up the list of available buttons in our table + /// that maps strips and available and selected buttons. If this + /// strip isn't in the table yet, this routine goes and creates an + /// entry for it. + /// + /// + /// + /// ToolStrip whose settings are being remembered. + /// + /// + /// + /// Items to remember as available for this strip. + /// + /// + private void storeAvailableItemsForStrip + ( + ToolStrip in_strip, + ToolStripItem[] in_items + ) + { + ToolStripItemMap tsim; + + if (this.toolStripToItemsMapping.ContainsKey(in_strip)) + { + tsim = (ToolStripItemMap)this.toolStripToItemsMapping[in_strip]; + tsim.baseAvailableItems = in_items; + this.toolStripToItemsMapping[in_strip] = tsim; + } + else + { + tsim = new ToolStripItemMap(); + tsim.baseAvailableItems = in_items; + tsim.userSelectedItems = null; + this.toolStripToItemsMapping.Add(in_strip, tsim); + } + } + + + //=------------------------------------------------------------------= + // storeSelectedItemsForStrip + //=------------------------------------------------------------------= + /// + /// Something has caused us to either switch the currently viewed + /// strip or shut the dialog down. Save out the current state of + /// selected items for the last ToolStrip with which we were + /// working. + /// + /// + private void storeSelectedItemsForLastStrip() + { + ToolStripItemMap tsim; + StripAndName san; + + if (this.lastSelectedStripIndex != -1) + { + san = (StripAndName)this.toolbarMenuComboBox.Items[this.lastSelectedStripIndex]; + if (this.toolStripToItemsMapping.ContainsKey(san.Strip)) + { + tsim = (ToolStripItemMap)this.toolStripToItemsMapping[san.Strip]; + tsim.userSelectedItems = getCurrentSelectedItems(); + this.toolStripToItemsMapping[san.Strip] = tsim; + } + else + { + Debug.Fail("This should have been inserted into the table by now!"); + } + } + } + + + //=------------------------------------------------------------------= + // fetchSelectedItemsForStrip + //=------------------------------------------------------------------= + /// + /// If the user has already fiddled with this ToolStrip a bit, then + /// this routine returns the list of buttons they have selected for + /// it from the Hashtable in which we store such info. + /// If not, then it just returns the buttons that already exist + /// for it. + /// + /// + /// + /// Toolstrip whose selected items we want to obtain. + /// + /// + /// + /// An array of ToolStripItems which the user has selected for this + /// strip, or just the existing set on the ToolStrip itself if the + /// user hasn't touched this strip yet. + /// + /// + private ToolStripItem[] fetchSelectedItemsForStrip(ToolStrip in_strip) + { + ToolStripItem [] items; + ToolStripItemMap tsim; + + if (this.toolStripToItemsMapping.ContainsKey(in_strip)) + { + tsim = (ToolStripItemMap)this.toolStripToItemsMapping[in_strip]; + if (tsim.userSelectedItems != null) + { + return tsim.userSelectedItems; + } + } + + // + // if we're here, that means the user hasn't fiddled with this + // strip yet. + // + items = new ToolStripItem[in_strip.Items.Count]; + in_strip.Items.CopyTo(items, 0); + return items; + } + + + //=------------------------------------------------------------------= + // fetchAvailableItemsForStrip + //=------------------------------------------------------------------= + /// + /// This routine returns the array of available items for this + /// ToolStrip. + /// + /// + /// + /// Toolstrip whose available items we want to obtain. + /// + /// + /// + /// An array of ToolStripItems which the user has available for this + /// strip. + /// + /// + private ToolStripItem[] fetchAvailableItemsForStrip(ToolStrip in_strip) + { + ToolStripItemMap tsim; + + if (this.toolStripToItemsMapping.ContainsKey(in_strip)) + { + tsim = (ToolStripItemMap)this.toolStripToItemsMapping[in_strip]; + return tsim.baseAvailableItems; + } + else + { + throw new ArgumentException("LOCALISE ME: bogus strip"); + } + } + + + //=------------------------------------------------------------------= + // getCurrentSelectedItems + //=------------------------------------------------------------------= + /// + /// Returns a list of all items that are selected to be in the + /// currently selected ToolStrip control. Does not include the + /// placeholding/final terminating [Separator] item, but does + /// include other separators the user has added. + /// + /// + /// + /// An array of ToolStripItems representing the way the user + /// has configured the ToolStrip. + /// + /// + private ToolStripItem[] getCurrentSelectedItems() + { + ArrayList al = new ArrayList(); + ItemAndName ian; + + for (int x = 0; x < this.currentItemsListBox.Items.Count - 1; x++) + { + ian = (ItemAndName)this.currentItemsListBox.Items[x]; + if (ian.Name.Equals(SEPARATOR_NAME)) + { + al.Add(new ToolStripSeparator()); + } + else + { + al.Add(ian.Item); + } + Debug.Assert(!ian.Name.Equals(ANCHOR_SEPARATOR)); + } + + return (ToolStripItem[])al.ToArray(typeof(ToolStripItem)); + } + + + + //=------------------------------------------------------------------= + // determineReinsertIndex + //=------------------------------------------------------------------= + /// + /// We have been asked to remove an item from the currently selected + /// list box and put it back in the available list box. We can + /// put it back in the "right place" by looking at the original list + /// of available items we were given and finding its location in + /// that list. + /// + /// + /// + /// The ToolStrip in which this item is currently slated to live. + /// + /// + /// + /// The current list of available items in the + /// availableItemsListBox. + /// + /// + /// + /// The ToolStripItem we want to put back in the available list. + /// + /// + /// + /// An integer index into the available list box where this item + /// should be reinserted. + /// + /// + private int determineReinsertIndex + ( + ToolStrip in_strip, + ListBox in_currentAvailable, + ToolStripItem in_item + ) + { + ToolStripItem[] availableItems; + int idx; + int x; + + // + // okay, we have to get the list of original available items for + // this strip. + // + availableItems = fetchAvailableItemsForStrip(in_strip); + + // + // find the index of this item in the original array. + // + for (x = 0; x < availableItems.Length - 1; x++) + { + if (availableItems[x] == in_item) + { + break; + } + } + + // + // if it isn't there, that's killer bad. + // + if (x == availableItems.Length) + { + Debug.Fail("Unable to determine re-insertion index. Item shoudl be here!"); + return -1; + } + + // + // okay, we're only half way done: now we need to see which + // items before this one are actually in the ListBox ... + // + for (int y = x - 1; y >= 0; y--) + { + idx = getIndexOfToolStripItem(availableItems[x], + in_currentAvailable); + if (idx != -1) + { + // + // + 1 because we want to insert AFTER this item. + // + return idx + 1; + } + } + + // + // if we're here then none of the items that are supposed to + // come before are in the available list any longer. we're the + // first (after the [Separator] item ...) + // + return 1; + } + + + //=------------------------------------------------------------------= + // getIndexOfToolStripItem + //=------------------------------------------------------------------= + /// + /// Given a ToolStripItem and a ListBox containing creatures of + /// this sort, get the index of this item in the list or -1 if + /// it's not in the list. + /// + /// + /// + /// ToolStripItem for which to seek. + /// + /// + /// + /// ListBox in which to seek. + /// + /// + /// + /// The integer index within the ListBox's items of this item, or + /// -1 if it wasn't found. + /// + /// + private int getIndexOfToolStripItem + ( + ToolStripItem in_item, + ListBox in_listBox + ) + { + ItemAndName ian; + + for (int x = 0; x < in_listBox.Items.Count; x++) + { + ian = (ItemAndName)in_listBox.Items[x]; + if (ian.Item != null && ian.Item == in_item) + { + return x; + } + } + + return -1; + } + + + //=------------------------------------------------------------------= + // availableItemsListBox_SelectedIndexChanged + //=------------------------------------------------------------------= + /// + /// Whenever the user selects a new item, we need to update all + /// the buttons on the form. + /// + /// + /// + /// From whence comes the event. + /// + /// + /// + /// EventArgs.Empty. + /// + /// + private void availableItemsListBox_SelectedIndexChanged(object sender, EventArgs e) + { + updateButtons(); + } + + + //=------------------------------------------------------------------= + // currentItemsListBox_SelectedIndexChanged + //=------------------------------------------------------------------= + /// + /// Whenever the user selects a new item, we need to update all + /// the buttons on the form. + /// + /// + /// + /// From whence comes the event. + /// + /// + /// + /// EventArgs.Empty. + /// + /// + private void currentItemsListBox_SelectedIndexChanged(object sender, EventArgs e) + { + updateButtons(); + } + + + //=------------------------------------------------------------------= + // CustomizeToolStripForm_Load + //=------------------------------------------------------------------= + /// + /// Called when the form is fully loaded and ready to show. + /// + /// + /// + /// The form. + /// + /// + /// + /// EventArgs.Empty + /// + /// + private void CustomizeToolStripForm_Load(object sender, EventArgs e) + { + selectToolStripInCombo(this.initialStripToSelect); + updateButtons(); + } + + + //=------------------------------------------------------------------= + // stripContainsItem + //=------------------------------------------------------------------= + /// + /// Figures out if the "current version" of the given ToolStrip + /// contains the given item or not. The current version is what + /// the ToolStrip would look like if the user committed the current + /// changes to the strip. + /// + /// + /// + /// The strip we want to search. + /// + /// + /// + /// The item which we seek. + /// + /// + /// + /// A boolean value indicating whether or not the current version + /// of the ToolStrip contains the given button. + /// + /// + private bool stripContainsItem(ToolStrip in_strip, ToolStripItem in_item) + { + ToolStripItem[] items = fetchSelectedItemsForStrip(in_strip); + + for (int x = 0; x < items.Length; x++) + { + if (items[x] == in_item) + { + return true; + } + } + + return false; + } + + + //=------------------------------------------------------------------= + // anyStripsContainItem + //=------------------------------------------------------------------= + /// + /// Searches through all the strips with which we are working, and, + /// looking at their current state, determines if any of them is + /// already hosting this button. + /// + /// + /// + /// The ToolStripItem which we seek in any of the ToolStrips about + /// which we know. + /// + /// + /// + /// A boolean indicating whether any ToolStrip with which we are + /// working contains this button in its "current version" according + /// to the dialog. + /// + /// + public bool anyStripsContainItem(ToolStripItem in_item) + { + StripAndName san; + + // + // zip through all the strips we know about and see if they + // contain this item. + // + for (int x = 0; x < this.toolbarMenuComboBox.Items.Count; x++) + { + san = (StripAndName)this.toolbarMenuComboBox.Items[x]; + if (stripContainsItem(san.Strip, in_item)) + { + return true; + } + } + + return false; + } + + + //=------------------------------------------------------------------= + // availableItemsListBox_DoubleClick + //=------------------------------------------------------------------= + /// + /// This is the same as clicking the Add Button + /// + /// + /// + /// The availableItemsListBox + /// + /// + /// + /// EventArgs.Empty + /// + /// + private void availableItemsListBox_DoubleClick(object sender, EventArgs e) + { + addButton_Click(sender, e); + } + + + //=------------------------------------------------------------------= + // currentItemsListBox_DoubleClick + //=------------------------------------------------------------------= + /// + /// This is the same as clicking the Remove Button + /// + /// + /// + /// The currentItemsListBox + /// + /// + /// + /// EventArgs.Empty + /// + /// + private void currentItemsListBox_DoubleClick(object sender, EventArgs e) + { + removeButton_Click(sender, e); + } + + + //=------------------------------------------------------------------= + // closeButton_Click + //=------------------------------------------------------------------= + /// + /// Make sure we save out the items the user was working on when + /// we close the dialog. + /// + /// + /// + /// From whence cometh the event. + /// + /// + /// + /// EventArgs.Empty + /// + /// + private void closeButton_Click(object sender, EventArgs e) + { + // + // before we close our dialog, make sure we take a snapshot + // of the currently selected strip's view. + // + storeSelectedItemsForLastStrip(); + } + + } + +} + + diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripForm.resx b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripForm.resx new file mode 100644 index 0000000..bbd4b2e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripMain.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripMain.cs new file mode 100644 index 0000000..13d413b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripMain.cs @@ -0,0 +1,148 @@ +//--------------------------------------------------------------------- +// This file is part of the Microsoft .NET Framework SDK Code Samples. +// +// Copyright (C) Microsoft Corporation. All rights reserved. +// +//This source code is intended only as a supplement to Microsoft +//Development Tools and/or on-line documentation. See these other +//materials for detailed information regarding Microsoft code samples. +// +//THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY +//KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +//IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +//PARTICULAR PURPOSE. +//--------------------------------------------------------------------- +using System.Resources; +using System.Windows.Forms; + +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStrip +{ + //=----------------------------------------------------------------------= + // CustomizeToolStripMain + //=----------------------------------------------------------------------= + /// + /// This class holds global routines for our sample, and doesn't actualy + /// contain any instance members. The static routines are useful for such + /// things as getting localized reosurces, etc. + /// + /// + public class CustomizeToolStripMain + { + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Private Members/Types/etc. + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + /// + /// + /// The resource manager with which we will work for this dialog, + /// particularly for loading in error strings, etc. + /// + /// + private static ResourceManager s_resourceManager; + + + private const string RESFILE_NAMESPACE = "Microsoft.Samples.BoosterSamples.CustomizeToolStrip.CustomizeToolStripResources"; + + + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Publicly Consumable Methods/Functions/Properties + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + + //=------------------------------------------------------------------= + // GetResourceManager + //=------------------------------------------------------------------= + /// + /// Loads in the resource manager for this library if we haven't done + /// so already. This just loads in the .resx file containing our + /// primary set of localized resources, such as error strings, etc. + /// + /// + /// + /// A System.Resources.ResourceManager object + /// + /// + public static ResourceManager GetResourceManager() + { + System.Type t; + + // + // load in the resource manager if we have not yet done so. + // + if (s_resourceManager == null) + { + t = typeof(Microsoft.Samples.BoosterSamples.CustomizeToolStrip.CustomizeToolStripForm); + s_resourceManager = new ResourceManager(RESFILE_NAMESPACE, + t.Assembly); + } + + System.Diagnostics.Debug.Assert(s_resourceManager != null); + + // + // now we return what we have. We'd have thrown an exception + // if we didn't have this yet. + // + return s_resourceManager; + } + + + //=------------------------------------------------------------------= + // ArrayContainsStrip + //=------------------------------------------------------------------= + /// + /// A simple little Array.Contains-like method, since that doesn't + /// actually appear to exist on the Array class. + /// + /// + /// + /// Array in which to search. + /// + /// + /// Item to be found. + /// + /// + /// + /// True means it was found, false means it wasn't + /// + /// + public static bool ArrayContainsStrip + ( + ToolStrip[] in_array, + ToolStrip in_item + ) + { + // + // this is already checked above more robustly, but we'll put + // this here to be safe. + // + System.Diagnostics.Debug.Assert(in_array != null); + + // + // look for it. + // + for (int x = 0; x < in_array.Length; x++) + { + if (in_array[x] == in_item) + { + return true; + } + } + + // + // didna' find it. + // + return false; + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripResources.resx b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripResources.resx new file mode 100644 index 0000000..eeb1a3d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/CustomizeToolStripResources.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The ToolStrip chosen to be selected initially (via the SelectedToolStrip property) is not in the array of available ToolStrips specified in the ToolStripsToShow property. + + + The list of ToolStrips or MenuStrips to be shown in the "Toolbar / Menu" ComboBox was either empty or null. It must be a valid array of ToolStrips or derived classes. + + + The ToolStrip to be selected initially (in the SelectedToolStrip property) is null. It must be one of the members of the array of available ToolStrips and MenuStrips specified in the ToolStripsToShow property. + + + [Separator] + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e5e300f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("CustomizeToolStrip")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft Corporation")] +[assembly: AssemblyProduct("CustomizeToolStrip")] +[assembly: AssemblyCopyright("Copyright (C) Microsoft Corporation")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Resources.cs new file mode 100644 index 0000000..d3791dc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Resources.cs @@ -0,0 +1,61 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40527.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStrip.Properties { + using System; + using System.IO; + using System.Resources; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager { + get { + if ((_resMgr == null)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Microsoft.Samples.BoosterSamples.CustomizeToolStrip.Properties.Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture { + get { + return _resCulture; + } + set { + _resCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Settings.cs new file mode 100644 index 0000000..146770b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Settings.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40527.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStrip.Properties { + + + sealed partial class Settings : System.Configuration.ApplicationSettingsBase { + + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + [System.Diagnostics.DebuggerNonUserCode()] + public static Settings Value { + get { + if ((Settings.m_Value == null)) { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) { + try { + Settings.m_Value = new Settings(); + } + finally { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Settings.settings new file mode 100644 index 0000000..10b23ca --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/ToolStripWithItems.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/ToolStripWithItems.cs new file mode 100644 index 0000000..7cfc390 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/ToolStripWithItems.cs @@ -0,0 +1,49 @@ +//--------------------------------------------------------------------- +// This file is part of the Microsoft .NET Framework SDK Code Samples. +// +// Copyright (C) Microsoft Corporation. All rights reserved. +// +//This source code is intended only as a supplement to Microsoft +//Development Tools and/or on-line documentation. See these other +//materials for detailed information regarding Microsoft code samples. +// +//THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY +//KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +//IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +//PARTICULAR PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Windows.Forms; + + +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStrip +{ + //=----------------------------------------------------------------------= + // ToolStripWithItems + //=----------------------------------------------------------------------= + /// + /// This is a simple little class to hold a reference to a ToolStrip + /// as well as a collection of buttons that the user would like + /// assigned to it. The Items collection does not reflect the + /// list of actul buttons assigned to this strip. + /// + /// + public class ToolStripWithItems + { + /// + /// + /// A handle to a ToolStrip of some sort. + /// + /// + public ToolStrip Strip; + + /// + /// + /// The collection of items that the user would like to + /// see assigned to this ToolStrip + /// + /// + public ToolStripItem[] Items; + } + +} diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/app.config b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/app.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/app.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Debug/CustomizeToolStrip.dll b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Debug/CustomizeToolStrip.dll new file mode 100644 index 0000000..ac8333c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Debug/CustomizeToolStrip.dll differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Debug/CustomizeToolStrip.dll.config b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Debug/CustomizeToolStrip.dll.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Debug/CustomizeToolStrip.dll.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Release/CustomizeToolStrip.dll b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Release/CustomizeToolStrip.dll new file mode 100644 index 0000000..cac1c32 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Release/CustomizeToolStrip.dll differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Release/CustomizeToolStrip.dll.config b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Release/CustomizeToolStrip.dll.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStrip/bin/Release/CustomizeToolStrip.dll.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/CustomizeToolStripTest.csproj b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/CustomizeToolStripTest.csproj new file mode 100644 index 0000000..cf5e270 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/CustomizeToolStripTest.csproj @@ -0,0 +1,93 @@ + + + Debug + 8.0.50727 + 2.0 + {9CCC3E0E-464C-49F7-B038-FC795ED4A2C3} + WinExe + Microsoft.Samples.BoosterSamples.CustomizeToolStripTest + CustomizeToolStripTest + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.cs + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {F56F929A-7F84-46E8-8E09-63213497205C} + CustomizeToolStrip + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Form1.Designer.cs new file mode 100644 index 0000000..f7d40b7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Form1.Designer.cs @@ -0,0 +1,902 @@ +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStripTest +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.toolbarContext = new System.Windows.Forms.ContextMenuStrip(this.components); + this.standardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.clientsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.appointmentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.billingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.miscToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripSeparator(); + this.customizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem10 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.clientsMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.addNewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator(); + this.findClientToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.appointmentsMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.addNewToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); + this.removeToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.showAppointmentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showAllToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator(); + this.findAppointmentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.billingMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.enterBillToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeBillToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.updateBillToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripSeparator(); + this.showBillToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showAllToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripSeparator(); + this.findBillToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.manageProvidersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripSeparator(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripMenuItem(); + this.helpMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.contentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.standardToolStrip = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.printToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.pasteToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.clientsToolStrip = new System.Windows.Forms.ToolStrip(); + this.addClientToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.removeClientToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.showClientToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.showAllClientsToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.findClientToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.appointmentsToolStrip = new System.Windows.Forms.ToolStrip(); + this.scheduleApptToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.updateApptToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.removeApptToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.showApptToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.showAllApptsToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.billingToolStrip = new System.Windows.Forms.ToolStrip(); + this.enterBillToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.removeBillToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.updateBillToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.showBillToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.showAllBillsToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.findBillToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.miscToolStrip = new System.Windows.Forms.ToolStrip(); + this.manageProvidersToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.applicationOptionsToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.helpContentsToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.customizeToolStrip1 = new Microsoft.Samples.BoosterSamples.CustomizeToolStrip.CustomizeToolStrip(this.components); + this.customizeToolStrip2 = new Microsoft.Samples.BoosterSamples.CustomizeToolStrip.CustomizeToolStrip(this.components); + this.toolbarContext.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.standardToolStrip.SuspendLayout(); + this.clientsToolStrip.SuspendLayout(); + this.appointmentsToolStrip.SuspendLayout(); + this.billingToolStrip.SuspendLayout(); + this.miscToolStrip.SuspendLayout(); + this.SuspendLayout(); + // + // toolbarContext + // + this.toolbarContext.AllowDrop = true; + this.toolbarContext.Enabled = true; + this.toolbarContext.GripMargin = new System.Windows.Forms.Padding(2); + this.toolbarContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.standardToolStripMenuItem, + this.clientsToolStripMenuItem, + this.appointmentsToolStripMenuItem, + this.billingToolStripMenuItem, + this.miscToolStripMenuItem, + this.toolStripMenuItem13, + this.customizeToolStripMenuItem}); + this.toolbarContext.Location = new System.Drawing.Point(25, 215); + this.toolbarContext.Name = "toolbarContext"; + this.toolbarContext.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.toolbarContext.Size = new System.Drawing.Size(153, 164); + this.toolbarContext.Visible = true; + this.toolbarContext.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.toolbarContext_ItemClicked); + // + // standardToolStripMenuItem + // + this.standardToolStripMenuItem.Checked = true; + this.standardToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.standardToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.standardToolStripMenuItem.DoubleClickEnabled = true; + this.standardToolStripMenuItem.Name = "standardToolStripMenuItem"; + this.standardToolStripMenuItem.Text = "&Standard"; + // + // clientsToolStripMenuItem + // + this.clientsToolStripMenuItem.Checked = true; + this.clientsToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.clientsToolStripMenuItem.DoubleClickEnabled = true; + this.clientsToolStripMenuItem.Name = "clientsToolStripMenuItem"; + this.clientsToolStripMenuItem.Text = "&Clients"; + // + // appointmentsToolStripMenuItem + // + this.appointmentsToolStripMenuItem.Checked = true; + this.appointmentsToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.appointmentsToolStripMenuItem.DoubleClickEnabled = true; + this.appointmentsToolStripMenuItem.Name = "appointmentsToolStripMenuItem"; + this.appointmentsToolStripMenuItem.Text = "&Appointments"; + // + // billingToolStripMenuItem + // + this.billingToolStripMenuItem.Checked = true; + this.billingToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.billingToolStripMenuItem.DoubleClickEnabled = true; + this.billingToolStripMenuItem.Name = "billingToolStripMenuItem"; + this.billingToolStripMenuItem.Text = "&Billing"; + // + // miscToolStripMenuItem + // + this.miscToolStripMenuItem.Checked = true; + this.miscToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.miscToolStripMenuItem.DoubleClickEnabled = true; + this.miscToolStripMenuItem.Name = "miscToolStripMenuItem"; + this.miscToolStripMenuItem.Text = "&Misc"; + // + // toolStripMenuItem13 + // + this.toolStripMenuItem13.DoubleClickEnabled = true; + this.toolStripMenuItem13.Name = "toolStripMenuItem13"; + // + // customizeToolStripMenuItem + // + this.customizeToolStripMenuItem.DoubleClickEnabled = true; + this.customizeToolStripMenuItem.Name = "customizeToolStripMenuItem"; + this.customizeToolStripMenuItem.Text = "Cus&tomize..."; + this.customizeToolStripMenuItem.Click += new System.EventHandler(this.customizeToolStripMenuItem_Click); + // + // menuStrip1 + // + this.menuStrip1.ContextMenuStrip = this.toolbarContext; + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem, + this.clientsMenu, + this.appointmentsMenu, + this.billingMenu, + this.toolsMenu, + this.helpMenu}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Padding = new System.Windows.Forms.Padding(6, 2, 0, 2); + + this.menuStrip1.TabIndex = 0; + this.menuStrip1.Text = "Application Main Menu"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DoubleClickEnabled = true; + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.openToolStripMenuItem, + this.closeToolStripMenuItem, + this.toolStripMenuItem10, + this.toolStripSeparator2, + this.toolStripMenuItem11, + this.toolStripMenuItem1, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Text = "&File"; + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.DoubleClickEnabled = true; + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.Text = "&Open"; + // + // closeToolStripMenuItem + // + this.closeToolStripMenuItem.DoubleClickEnabled = true; + this.closeToolStripMenuItem.Name = "closeToolStripMenuItem"; + this.closeToolStripMenuItem.Text = "&Close"; + // + // toolStripMenuItem10 + // + this.toolStripMenuItem10.DoubleClickEnabled = true; + this.toolStripMenuItem10.Name = "toolStripMenuItem10"; + this.toolStripMenuItem10.Text = "&Save"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + // + // toolStripMenuItem11 + // + this.toolStripMenuItem11.DoubleClickEnabled = true; + this.toolStripMenuItem11.Name = "toolStripMenuItem11"; + this.toolStripMenuItem11.Text = "&Print"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.DoubleClickEnabled = true; + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.DoubleClickEnabled = true; + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Text = "Exit"; + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DoubleClickEnabled = true; + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cutToolStripMenuItem, + this.copyToolStripMenuItem, + this.pasteToolStripMenuItem}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Text = "&Edit"; + // + // cutToolStripMenuItem + // + this.cutToolStripMenuItem.DoubleClickEnabled = true; + this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; + this.cutToolStripMenuItem.Text = "&Cut"; + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.DoubleClickEnabled = true; + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.Text = "Co&py"; + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.DoubleClickEnabled = true; + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.Text = "Pa&ste"; + // + // clientsMenu + // + this.clientsMenu.DoubleClickEnabled = true; + this.clientsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addNewToolStripMenuItem, + this.removeToolStripMenuItem, + this.showAllToolStripMenuItem, + this.toolStripMenuItem2, + this.toolStripMenuItem3, + this.findClientToolStripMenuItem}); + this.clientsMenu.Name = "clientsMenu"; + this.clientsMenu.Text = "&Clients"; + // + // addNewToolStripMenuItem + // + this.addNewToolStripMenuItem.DoubleClickEnabled = true; + this.addNewToolStripMenuItem.Name = "addNewToolStripMenuItem"; + this.addNewToolStripMenuItem.Text = "A&dd New"; + // + // removeToolStripMenuItem + // + this.removeToolStripMenuItem.DoubleClickEnabled = true; + this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; + this.removeToolStripMenuItem.Text = "&Remove ..."; + // + // showAllToolStripMenuItem + // + this.showAllToolStripMenuItem.DoubleClickEnabled = true; + this.showAllToolStripMenuItem.Name = "showAllToolStripMenuItem"; + this.showAllToolStripMenuItem.Text = "&Show Individual..."; + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.DoubleClickEnabled = true; + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Text = "Show A&ll"; + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.DoubleClickEnabled = true; + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + // + // findClientToolStripMenuItem + // + this.findClientToolStripMenuItem.DoubleClickEnabled = true; + this.findClientToolStripMenuItem.Name = "findClientToolStripMenuItem"; + this.findClientToolStripMenuItem.Text = "&Find Client ..."; + // + // appointmentsMenu + // + this.appointmentsMenu.DoubleClickEnabled = true; + this.appointmentsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addNewToolStripMenuItem1, + this.toolStripMenuItem5, + this.removeToolStripMenuItem1, + this.showAppointmentToolStripMenuItem, + this.showAllToolStripMenuItem1, + this.toolStripMenuItem4, + this.findAppointmentToolStripMenuItem}); + this.appointmentsMenu.Name = "appointmentsMenu"; + this.appointmentsMenu.Text = "&Appointments"; + // + // addNewToolStripMenuItem1 + // + this.addNewToolStripMenuItem1.DoubleClickEnabled = true; + this.addNewToolStripMenuItem1.Name = "addNewToolStripMenuItem1"; + this.addNewToolStripMenuItem1.Text = "S&chedule New..."; + // + // toolStripMenuItem5 + // + this.toolStripMenuItem5.DoubleClickEnabled = true; + this.toolStripMenuItem5.Name = "toolStripMenuItem5"; + this.toolStripMenuItem5.Text = "&Update Appointment..."; + // + // removeToolStripMenuItem1 + // + this.removeToolStripMenuItem1.DoubleClickEnabled = true; + this.removeToolStripMenuItem1.Name = "removeToolStripMenuItem1"; + this.removeToolStripMenuItem1.Text = "&Remove..."; + // + // showAppointmentToolStripMenuItem + // + this.showAppointmentToolStripMenuItem.DoubleClickEnabled = true; + this.showAppointmentToolStripMenuItem.Name = "showAppointmentToolStripMenuItem"; + this.showAppointmentToolStripMenuItem.Text = "&Show Appointment..."; + // + // showAllToolStripMenuItem1 + // + this.showAllToolStripMenuItem1.DoubleClickEnabled = true; + this.showAllToolStripMenuItem1.Name = "showAllToolStripMenuItem1"; + this.showAllToolStripMenuItem1.Text = "Show A&ll"; + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.DoubleClickEnabled = true; + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + // + // findAppointmentToolStripMenuItem + // + this.findAppointmentToolStripMenuItem.DoubleClickEnabled = true; + this.findAppointmentToolStripMenuItem.Name = "findAppointmentToolStripMenuItem"; + this.findAppointmentToolStripMenuItem.Text = "&Find Appointment..."; + // + // billingMenu + // + this.billingMenu.DoubleClickEnabled = true; + this.billingMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.enterBillToolStripMenuItem, + this.removeBillToolStripMenuItem, + this.updateBillToolStripMenuItem, + this.toolStripMenuItem6, + this.showBillToolStripMenuItem, + this.showAllToolStripMenuItem2, + this.toolStripMenuItem7, + this.findBillToolStripMenuItem}); + this.billingMenu.Name = "billingMenu"; + this.billingMenu.Text = "&Billing"; + // + // enterBillToolStripMenuItem + // + this.enterBillToolStripMenuItem.DoubleClickEnabled = true; + this.enterBillToolStripMenuItem.Name = "enterBillToolStripMenuItem"; + this.enterBillToolStripMenuItem.Text = "&Enter New..."; + // + // removeBillToolStripMenuItem + // + this.removeBillToolStripMenuItem.DoubleClickEnabled = true; + this.removeBillToolStripMenuItem.Name = "removeBillToolStripMenuItem"; + this.removeBillToolStripMenuItem.Text = "&Remove..."; + // + // updateBillToolStripMenuItem + // + this.updateBillToolStripMenuItem.DoubleClickEnabled = true; + this.updateBillToolStripMenuItem.Name = "updateBillToolStripMenuItem"; + this.updateBillToolStripMenuItem.Text = "&Update Bill..."; + // + // toolStripMenuItem6 + // + this.toolStripMenuItem6.DoubleClickEnabled = true; + this.toolStripMenuItem6.Name = "toolStripMenuItem6"; + // + // showBillToolStripMenuItem + // + this.showBillToolStripMenuItem.DoubleClickEnabled = true; + this.showBillToolStripMenuItem.Name = "showBillToolStripMenuItem"; + this.showBillToolStripMenuItem.Text = "&Show Bill..."; + // + // showAllToolStripMenuItem2 + // + this.showAllToolStripMenuItem2.DoubleClickEnabled = true; + this.showAllToolStripMenuItem2.Name = "showAllToolStripMenuItem2"; + this.showAllToolStripMenuItem2.Text = "Show A&ll "; + // + // toolStripMenuItem7 + // + this.toolStripMenuItem7.DoubleClickEnabled = true; + this.toolStripMenuItem7.Name = "toolStripMenuItem7"; + // + // findBillToolStripMenuItem + // + this.findBillToolStripMenuItem.DoubleClickEnabled = true; + this.findBillToolStripMenuItem.Name = "findBillToolStripMenuItem"; + this.findBillToolStripMenuItem.Text = "&Find Bill..."; + // + // toolsMenu + // + this.toolsMenu.DoubleClickEnabled = true; + this.toolsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.manageProvidersToolStripMenuItem, + this.toolStripMenuItem8, + this.optionsToolStripMenuItem, + this.toolStripMenuItem14}); + this.toolsMenu.Name = "toolsMenu"; + this.toolsMenu.Text = "&Tools"; + // + // manageProvidersToolStripMenuItem + // + this.manageProvidersToolStripMenuItem.DoubleClickEnabled = true; + this.manageProvidersToolStripMenuItem.Name = "manageProvidersToolStripMenuItem"; + this.manageProvidersToolStripMenuItem.Text = "&Manage Providers"; + // + // toolStripMenuItem8 + // + this.toolStripMenuItem8.DoubleClickEnabled = true; + this.toolStripMenuItem8.Name = "toolStripMenuItem8"; + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.DoubleClickEnabled = true; + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.Text = "&Options..."; + // + // toolStripMenuItem14 + // + this.toolStripMenuItem14.DoubleClickEnabled = true; + this.toolStripMenuItem14.Name = "toolStripMenuItem14"; + this.toolStripMenuItem14.Text = "&Customize..."; + this.toolStripMenuItem14.Click += new System.EventHandler(this.toolStripMenuItem14_Click); + // + // helpMenu + // + this.helpMenu.DoubleClickEnabled = true; + this.helpMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.contentsToolStripMenuItem, + this.toolStripMenuItem9, + this.aboutToolStripMenuItem}); + this.helpMenu.Name = "helpMenu"; + this.helpMenu.Text = "&Help"; + // + // contentsToolStripMenuItem + // + this.contentsToolStripMenuItem.DoubleClickEnabled = true; + this.contentsToolStripMenuItem.Name = "contentsToolStripMenuItem"; + this.contentsToolStripMenuItem.Text = "&Contents"; + // + // toolStripMenuItem9 + // + this.toolStripMenuItem9.DoubleClickEnabled = true; + this.toolStripMenuItem9.Name = "toolStripMenuItem9"; + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.DoubleClickEnabled = true; + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Text = "&About"; + // + // standardToolStrip + // + this.standardToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.printToolStripButton, + this.toolStripSeparator, + this.cutToolStripButton, + this.copyToolStripButton, + this.pasteToolStripButton, + this.toolStripSeparator1, + this.helpToolStripButton}); + this.standardToolStrip.Location = new System.Drawing.Point(0, 124); + this.standardToolStrip.Name = "standardToolStrip"; + this.standardToolStrip.TabIndex = 1; + this.standardToolStrip.Text = "Main File Toolbar"; + // + // newToolStripButton + // + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Lime; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Text = "&New"; + // + // openToolStripButton + // + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Lime; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Text = "&Open"; + // + // saveToolStripButton + // + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Lime; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Text = "&Save"; + // + // printToolStripButton + // + this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image"))); + this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Lime; + this.printToolStripButton.Name = "printToolStripButton"; + this.printToolStripButton.Text = "&Print"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + // + // cutToolStripButton + // + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Lime; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Text = "Cu&t"; + // + // copyToolStripButton + // + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Lime; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Text = "&Copy"; + // + // pasteToolStripButton + // + this.pasteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripButton.Image"))); + this.pasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Lime; + this.pasteToolStripButton.Name = "pasteToolStripButton"; + this.pasteToolStripButton.Text = "&Paste"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // helpToolStripButton + // + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Text = "&Help"; + // + // clientsToolStrip + // + this.clientsToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addClientToolStripButton, + this.removeClientToolStripButton, + this.showClientToolStripButton, + this.showAllClientsToolStripButton, + this.findClientToolStripButton}); + this.clientsToolStrip.Location = new System.Drawing.Point(0, 99); + this.clientsToolStrip.Name = "clientsToolStrip"; + this.clientsToolStrip.TabIndex = 2; + this.clientsToolStrip.Text = "Clients Toolbar"; + // + // addClientToolStripButton + // + this.addClientToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.addclient; + this.addClientToolStripButton.Name = "addClientToolStripButton"; + this.addClientToolStripButton.Text = "&Add Client"; + // + // removeClientToolStripButton + // + this.removeClientToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.removeclient; + this.removeClientToolStripButton.Name = "removeClientToolStripButton"; + this.removeClientToolStripButton.Text = "&Remove Client"; + // + // showClientToolStripButton + // + this.showClientToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.showindclient; + this.showClientToolStripButton.Name = "showClientToolStripButton"; + this.showClientToolStripButton.Text = "&Show Client"; + // + // showAllClientsToolStripButton + // + this.showAllClientsToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.showallclients; + this.showAllClientsToolStripButton.Name = "showAllClientsToolStripButton"; + this.showAllClientsToolStripButton.Text = "Show &All Clients"; + // + // findClientToolStripButton + // + this.findClientToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.findclient; + this.findClientToolStripButton.Name = "findClientToolStripButton"; + this.findClientToolStripButton.Text = "&Find Client"; + // + // appointmentsToolStrip + // + this.appointmentsToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.scheduleApptToolStripButton, + this.updateApptToolStripButton, + this.removeApptToolStripButton, + this.showApptToolStripButton, + this.showAllApptsToolStripButton}); + this.appointmentsToolStrip.Location = new System.Drawing.Point(0, 74); + this.appointmentsToolStrip.Name = "appointmentsToolStrip"; + this.appointmentsToolStrip.TabIndex = 3; + this.appointmentsToolStrip.Text = "Scheduling Toolbar"; + // + // scheduleApptToolStripButton + // + this.scheduleApptToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.schednewappt; + this.scheduleApptToolStripButton.Name = "scheduleApptToolStripButton"; + this.scheduleApptToolStripButton.Text = "&Schedule Appt"; + // + // updateApptToolStripButton + // + this.updateApptToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.updateappt; + this.updateApptToolStripButton.Name = "updateApptToolStripButton"; + this.updateApptToolStripButton.Text = "&Update Appt"; + // + // removeApptToolStripButton + // + this.removeApptToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.removeappt; + this.removeApptToolStripButton.Name = "removeApptToolStripButton"; + this.removeApptToolStripButton.Text = "&Remove Appt"; + // + // showApptToolStripButton + // + this.showApptToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.showappt; + this.showApptToolStripButton.Name = "showApptToolStripButton"; + this.showApptToolStripButton.Text = "&Show Appt"; + // + // showAllApptsToolStripButton + // + this.showAllApptsToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.showallappts; + this.showAllApptsToolStripButton.Name = "showAllApptsToolStripButton"; + this.showAllApptsToolStripButton.Text = "Show A&ll Appts"; + // + // billingToolStrip + // + this.billingToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.enterBillToolStripButton, + this.removeBillToolStripButton, + this.updateBillToolStripButton, + this.showBillToolStripButton, + this.showAllBillsToolStripButton, + this.findBillToolStripButton}); + this.billingToolStrip.Location = new System.Drawing.Point(0, 49); + this.billingToolStrip.Name = "billingToolStrip"; + this.billingToolStrip.TabIndex = 4; + this.billingToolStrip.Text = "Billing Toolbar"; + // + // enterBillToolStripButton + // + this.enterBillToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.enterbill; + this.enterBillToolStripButton.Name = "enterBillToolStripButton"; + this.enterBillToolStripButton.Text = "&Enter Bill"; + // + // removeBillToolStripButton + // + this.removeBillToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.removebill; + this.removeBillToolStripButton.Name = "removeBillToolStripButton"; + this.removeBillToolStripButton.Text = "&Remove Bill"; + // + // updateBillToolStripButton + // + this.updateBillToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.updatebill; + this.updateBillToolStripButton.Name = "updateBillToolStripButton"; + this.updateBillToolStripButton.Text = "&Update Bill"; + // + // showBillToolStripButton + // + this.showBillToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.showbill; + this.showBillToolStripButton.Name = "showBillToolStripButton"; + this.showBillToolStripButton.Text = "&Show Bill"; + // + // showAllBillsToolStripButton + // + this.showAllBillsToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.showallbills; + this.showAllBillsToolStripButton.Name = "showAllBillsToolStripButton"; + this.showAllBillsToolStripButton.Text = "Show A&ll Bills"; + // + // findBillToolStripButton + // + this.findBillToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.findbill; + this.findBillToolStripButton.Name = "findBillToolStripButton"; + this.findBillToolStripButton.Text = "&Find Bill"; + // + // miscToolStrip + // + this.miscToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.manageProvidersToolStripButton, + this.applicationOptionsToolStripButton, + this.helpContentsToolStripButton}); + this.miscToolStrip.Location = new System.Drawing.Point(0, 24); + this.miscToolStrip.Name = "miscToolStrip"; + this.miscToolStrip.TabIndex = 5; + this.miscToolStrip.Text = "Miscellaneous Toolbar"; + // + // manageProvidersToolStripButton + // + this.manageProvidersToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.toolsmngprov; + this.manageProvidersToolStripButton.Name = "manageProvidersToolStripButton"; + this.manageProvidersToolStripButton.Text = "&Manage Providers"; + // + // applicationOptionsToolStripButton + // + this.applicationOptionsToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.toolsoptions; + this.applicationOptionsToolStripButton.Name = "applicationOptionsToolStripButton"; + this.applicationOptionsToolStripButton.Text = "&Application Options"; + // + // helpContentsToolStripButton + // + this.helpContentsToolStripButton.Image = Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources.helpcontents; + this.helpContentsToolStripButton.Name = "helpContentsToolStripButton"; + this.helpContentsToolStripButton.Text = "&Help Contents"; + // + // customizeToolStrip1 + // + this.customizeToolStrip1.SelectedToolStrip = null; + this.customizeToolStrip1.StripsToShow = null; + this.customizeToolStrip1.SelectedToolStripChanged += new Microsoft.Samples.BoosterSamples.CustomizeToolStrip.SelectedToolStripChangedEventHandler(this.customizeToolStrip1_SelectedToolStripChanged); + // + // customizeToolStrip2 + // + this.customizeToolStrip2.SelectedToolStrip = null; + this.customizeToolStrip2.StripsToShow = null; + // + // Form1 + // + this.ClientSize = new System.Drawing.Size(547, 345); + this.ContextMenuStrip = this.toolbarContext; + this.Controls.Add(this.standardToolStrip); + this.Controls.Add(this.clientsToolStrip); + this.Controls.Add(this.appointmentsToolStrip); + this.Controls.Add(this.billingToolStrip); + this.Controls.Add(this.miscToolStrip); + this.Controls.Add(this.menuStrip1); + this.Name = "Form1"; + this.Text = "CustomizeToolStripTest"; + this.toolbarContext.ResumeLayout(false); + this.menuStrip1.ResumeLayout(false); + this.standardToolStrip.ResumeLayout(false); + this.clientsToolStrip.ResumeLayout(false); + this.appointmentsToolStrip.ResumeLayout(false); + this.billingToolStrip.ResumeLayout(false); + this.miscToolStrip.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStrip standardToolStrip; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripButton printToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton pasteToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStrip clientsToolStrip; + private System.Windows.Forms.ToolStripMenuItem clientsMenu; + private System.Windows.Forms.ToolStripMenuItem appointmentsMenu; + private System.Windows.Forms.ToolStripMenuItem billingMenu; + private System.Windows.Forms.ToolStripMenuItem toolsMenu; + private System.Windows.Forms.ToolStripMenuItem helpMenu; + private System.Windows.Forms.ToolStripMenuItem addNewToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3; + private System.Windows.Forms.ToolStripMenuItem findClientToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addNewToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5; + private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem showAppointmentToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showAllToolStripMenuItem1; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4; + private System.Windows.Forms.ToolStripMenuItem findAppointmentToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem enterBillToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeBillToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem updateBillToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem6; + private System.Windows.Forms.ToolStripMenuItem showBillToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showAllToolStripMenuItem2; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem7; + private System.Windows.Forms.ToolStripMenuItem findBillToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem manageProvidersToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem8; + private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem contentsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem9; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem10; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem11; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.ToolStrip appointmentsToolStrip; + private System.Windows.Forms.ToolStrip billingToolStrip; + private System.Windows.Forms.ToolStrip miscToolStrip; + private System.Windows.Forms.ContextMenuStrip toolbarContext; + private System.Windows.Forms.ToolStripMenuItem standardToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem clientsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem appointmentsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem billingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem miscToolStripMenuItem; + private System.Windows.Forms.ToolStripButton addClientToolStripButton; + private System.Windows.Forms.ToolStripButton removeClientToolStripButton; + private System.Windows.Forms.ToolStripButton showClientToolStripButton; + private System.Windows.Forms.ToolStripButton showAllClientsToolStripButton; + private System.Windows.Forms.ToolStripButton findClientToolStripButton; + private System.Windows.Forms.ToolStripButton scheduleApptToolStripButton; + private System.Windows.Forms.ToolStripButton updateApptToolStripButton; + private System.Windows.Forms.ToolStripButton removeApptToolStripButton; + private System.Windows.Forms.ToolStripButton showApptToolStripButton; + private System.Windows.Forms.ToolStripButton showAllApptsToolStripButton; + private System.Windows.Forms.ToolStripButton enterBillToolStripButton; + private System.Windows.Forms.ToolStripButton removeBillToolStripButton; + private System.Windows.Forms.ToolStripButton updateBillToolStripButton; + private System.Windows.Forms.ToolStripButton showBillToolStripButton; + private System.Windows.Forms.ToolStripButton showAllBillsToolStripButton; + private System.Windows.Forms.ToolStripButton findBillToolStripButton; + private System.Windows.Forms.ToolStripButton manageProvidersToolStripButton; + private System.Windows.Forms.ToolStripButton applicationOptionsToolStripButton; + private System.Windows.Forms.ToolStripButton helpContentsToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem13; + private System.Windows.Forms.ToolStripMenuItem customizeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem14; + private Microsoft.Samples.BoosterSamples.CustomizeToolStrip.CustomizeToolStrip customizeToolStrip1; + private Microsoft.Samples.BoosterSamples.CustomizeToolStrip.CustomizeToolStrip customizeToolStrip2; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Form1.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Form1.cs new file mode 100644 index 0000000..568a0b6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Form1.cs @@ -0,0 +1,247 @@ +//--------------------------------------------------------------------- +// This file is part of the Microsoft .NET Framework SDK Code Samples. +// +// Copyright (C) 2004 Microsoft Corporation. All rights reserved. +// +//This source code is intended only as a supplement to Microsoft +//Development Tools and/or on-line documentation. See these other +//materials for detailed information regarding Microsoft code samples. +// +//THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY +//KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +//IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +//PARTICULAR PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Reflection; +using System.Collections; +using System.Windows.Forms; +using System.ComponentModel; +using Microsoft.Samples.BoosterSamples.CustomizeToolStrip; + + + +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStripTest +{ + //=----------------------------------------------------------------------= + // Form1 + //=----------------------------------------------------------------------= + /// + /// A simple form that has a bunch of ToolStrips on it which are used + /// to demonstrate the use of the CustomizeToolStrip component and + /// dialog. The component's dialog is shown via a context menu in the + /// rafting container. After that, + /// + /// + partial class Form1 : Form + { + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Publicly Consumable Methods/Properties/Functions + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + + //=------------------------------------------------------------------= + // Form1 + //=------------------------------------------------------------------= + /// + /// Initializes a new instance of this class and sets up the forms + /// designer-created components. + /// + /// + public Form1() + { + InitializeComponent(); + } + + + + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + // Private Methods/Functions/etc + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + //=------------------------------------------------------------------= + + + //=------------------------------------------------------------------= + // customizeToolStripMenuItem_Click + //=------------------------------------------------------------------= + /// + /// The user has selected the "Customize" Menu Item. We'll go + /// ahead and get our non-visual customizer component to do its + /// work now. + /// + /// + /// + /// The menu from whence this notification came. + /// + /// + /// + /// EventArgs.Empty + /// + /// + private void customizeToolStripMenuItem_Click(object sender, EventArgs e) + { + RaiseCustomizeDialog(); + } + + /// + /// Handle showing/hiding the toolstrips + /// + /// + /// + private void toolbarContext_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + // Just switch off the text within the item + switch (e.ClickedItem.Text.Trim('&')) + { + case "Standard": + standardToolStrip.Visible = !standardToolStrip.Visible; + standardToolStripMenuItem.Checked = standardToolStrip.Visible; + break; + case "Clients": + clientsToolStrip.Visible = !clientsToolStrip.Visible; + clientsToolStripMenuItem.Checked = clientsToolStrip.Visible; + break; + case "Appointments": + appointmentsToolStrip.Visible = !appointmentsToolStrip.Visible; + appointmentsToolStripMenuItem.Checked = appointmentsToolStrip.Visible; + break; + case "Billing": + billingToolStrip.Visible = !billingToolStrip.Visible; + billingToolStripMenuItem.Checked = billingToolStrip.Visible; + break; + case "Misc": + miscToolStrip.Visible = !miscToolStrip.Visible; + miscToolStripMenuItem.Checked = miscToolStrip.Visible; + break; + default: + break; + + } + } + + + + + private void RaiseCustomizeDialog() + { + // + // we're going to all the user to customize all of our ToolStrips. + // Theoretically, the dialog could also handle MenuStrips, but + // since it doesn't support hierarchical data, it doesn't interact + // as well with forms designer-created menus. + // + this.customizeToolStrip1.StripsToShow = new ToolStrip[] { + this.standardToolStrip, + this.clientsToolStrip, + this.appointmentsToolStrip, + this.billingToolStrip, + this.miscToolStrip + }; + + // + // we'll have it start with customizing the Standard Toolbar. + // Please note that we've given all of our ToolStrips friendly + // names by setting their Text properties ... + // + this.customizeToolStrip1.SelectedToolStrip = this.standardToolStrip; + + // + // show the dialog. It will almost immediately fire the + // SelectedToolStripChanged event so it can get the list of + // available buttons for the first strip. + // + this.customizeToolStrip1.ShowDialog(this); + + } + + + //=------------------------------------------------------------------= + // customizeToolStrip1_SelectedToolStripChanged + //=------------------------------------------------------------------= + /// + /// This is fired whenever the selected ToolStrip changes in the + /// "Toolbar/Menu" ComboBox, as well as when the dialog is first + /// shown. + /// + /// + /// + /// The CustomizeToolStrip component from whence this event comes. + /// + /// + /// + /// The CustomizeToolStripAvailableEventArgs event information + /// object. Upon exiting, we need to set the AvailableItems + /// Property of this object to contain the list of buttons we want + /// shown. + /// + /// + private void customizeToolStrip1_SelectedToolStripChanged + ( + object sender, + CustomizeToolStripAvailableEventArgs ctsea) + { + System.Reflection.FieldInfo[] fields; + ArrayList al = new ArrayList(); + + // + // okay, instead of maintaining a huge array of buttons that could + // change every time we update the sample, we're just going to go + // and look at ALL of our member variables and just include those + // that are of a type that we would include in a ToolStrip, + // notably buttons, dropdowns, bombox, labels, textbox, and split + // buttons. + // + + // + // we'll first use reflect to get our member variables. + // + fields = typeof(Form1).GetFields(BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance); + + // + // for each field on our object, see if it's the right type, and + // if so, include that puppy! + // + for (int x = 0; x < fields.Length; x++) + { + Type t; + t = fields[x].FieldType; + if (t == typeof(ToolStripButton) + || t == typeof(ToolStripSeparator) + || t == typeof(ToolStripComboBox) + || t == typeof(ToolStripDropDownButton) + || t == typeof(ToolStripLabel) + || t == typeof(ToolStripTextBox) + || t == typeof(ToolStripSplitButton)) + { + al.Add(fields[x].GetValue(this)); + } + } + + // + // cast the array to the right type and return it. + // + ctsea.AvailableItems = (ToolStripItem[])al.ToArray(typeof(ToolStripItem)); + } + + private void toolStripMenuItem14_Click(object sender, EventArgs e) + { + RaiseCustomizeDialog(); + } + + + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Form1.resx b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Form1.resx new file mode 100644 index 0000000..ddc29fe --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Form1.resx @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAERJREFUOE9jYKAy + +A80Dx8maN1/XADJYLyG4DUAJAk1CKchxLgAryE4DUCWwOeKUQOAiYgYMMgDkUBeQM4nBPMFfRQAAE9F + mHa8P0uiAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAG9JREFUOE+9U1sO + wCAI4+jenI0h6BTDysdI8N1SUIl+NL5jmcNhBTibzdd1iHhTg0jczrIaaTtyjcahTAcbSdR34hPBUHAi + SQhU/sc08hq0Rpz5rOgVOQPK/pqOV78Clqo+jFWwEyT3X/4H0PuGD1/34/EzekWnggAAAABJRU5ErkJg + gg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAFtJREFUOE9jYKAS + +A80hxwMt/5/QwPEgAMHDuDFMDVQC8kzAMm15BkAcy1y8JHkhUFsAJLTcEYpSA1OL8AkiaGxRiMxLgBp + xOsCXCkSlsAGrwGgREVRZiI7UwMACXFkDZul3iAAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAHdJREFUOE+1UwsK + wCAI7egezZtZ1hwamTZaIEHg+2ml/HSo4UblUlN0HvA9wEoBA6eadwpSAAG7zsbYiKz3RkQ0tyBEiXvN + /D5QM+UpSLHrXIRMAnXZAYCkdJPk8Pr35Lep8+R7TaxmHz5ZmPfhOMTVHp8oufeHKxTSeQLsDNFRAAAA + AElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAFRJREFUOE9jYKAh + +I9mNjqfoNWDwwCYK0A0yV4A+RHZAIJ+xqYAZjNZtsMMpERzA9QFYJocANMIomGYKHPQNSC7gKBrsCke + eANA/iYrDIgKMMoUAQAqwjZX15oapQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAH1JREFUOE+1ktsO + wCAIQ/10/1zdkMilCA+bCYkh5thCW/vojMVBVcYPewSwBIGAp7lBKeQF8K/n3lcPlec5BQTpQBkDNUQp + OP4xgOEScVWgrVlLhCkrkD/RfATAr5IsoIxYG0GQ/AwiBcGe6wquADjhveYkYVGQZD8N6c8PJmE9Y70r + 51X3AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAJxJREFUOE+1k4sN + gCAMRDs6o7FZpWC/tGJMJGlQ5I7XMwD8OHB42zoeFQWICLOCEb87Q2ytjYI5k8AK+Zm/03ybiokT994x + KxLZQyyCEBS40gaTlgQW07YV1xMDzUAxKY+qZg57Bj6oNsLch5o6g5ygMqD1ZbSGpJsR2DZUyK2JwXsC + pvpEwDSxhdnGXnmIGUFxUZ5+o8/geNOqDRdq1Xx6UZWhkAAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/addclient.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/addclient.PNG new file mode 100644 index 0000000..4003551 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/addclient.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/enterbill.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/enterbill.PNG new file mode 100644 index 0000000..581d479 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/enterbill.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/findappt.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/findappt.PNG new file mode 100644 index 0000000..c6eaa39 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/findappt.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/findbill.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/findbill.PNG new file mode 100644 index 0000000..be81142 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/findbill.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/findclient.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/findclient.PNG new file mode 100644 index 0000000..3fb31d8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/findclient.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/helpcontents.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/helpcontents.PNG new file mode 100644 index 0000000..4944241 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/helpcontents.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/removeappt.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/removeappt.PNG new file mode 100644 index 0000000..3b900c7 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/removeappt.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/removebill.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/removebill.PNG new file mode 100644 index 0000000..2260d1d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/removebill.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/removeclient.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/removeclient.PNG new file mode 100644 index 0000000..43292a0 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/removeclient.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/schednewappt.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/schednewappt.PNG new file mode 100644 index 0000000..71299d2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/schednewappt.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showallappts.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showallappts.PNG new file mode 100644 index 0000000..37ad714 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showallappts.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showallbills.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showallbills.PNG new file mode 100644 index 0000000..bdfa5ea Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showallbills.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showallclients.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showallclients.PNG new file mode 100644 index 0000000..5f9a491 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showallclients.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showappt.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showappt.PNG new file mode 100644 index 0000000..a1a8e9e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showappt.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showbill.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showbill.PNG new file mode 100644 index 0000000..78a2cf1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showbill.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showindclient.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showindclient.PNG new file mode 100644 index 0000000..6896f48 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/showindclient.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/toolsmngprov.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/toolsmngprov.PNG new file mode 100644 index 0000000..b5426e2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/toolsmngprov.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/toolsoptions.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/toolsoptions.PNG new file mode 100644 index 0000000..ad6f4ce Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/toolsoptions.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/updateappt.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/updateappt.PNG new file mode 100644 index 0000000..059304b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/updateappt.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/updatebill.PNG b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/updatebill.PNG new file mode 100644 index 0000000..8f964a8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Images/updatebill.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Program.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Program.cs new file mode 100644 index 0000000..4040b89 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Program.cs @@ -0,0 +1,23 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +#endregion + +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStripTest +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8a0b23b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("CustomizeToolStripTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft Corporation")] +[assembly: AssemblyProduct("CustomizeToolStripTest")] +[assembly: AssemblyCopyright("Copyright (C) Microsoft Corporation")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Resources.cs new file mode 100644 index 0000000..3c4606a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Resources.cs @@ -0,0 +1,181 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40527.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties { + using System; + using System.IO; + using System.Resources; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager { + get { + if ((_resMgr == null)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties.Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture { + get { + return _resCulture; + } + set { + _resCulture = value; + } + } + + public static System.Drawing.Bitmap addclient { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("addclient", _resCulture))); + } + } + + public static System.Drawing.Bitmap enterbill { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("enterbill", _resCulture))); + } + } + + public static System.Drawing.Bitmap findappt { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("findappt", _resCulture))); + } + } + + public static System.Drawing.Bitmap findbill { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("findbill", _resCulture))); + } + } + + public static System.Drawing.Bitmap findclient { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("findclient", _resCulture))); + } + } + + public static System.Drawing.Bitmap helpcontents { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("helpcontents", _resCulture))); + } + } + + public static System.Drawing.Bitmap removeappt { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("removeappt", _resCulture))); + } + } + + public static System.Drawing.Bitmap removebill { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("removebill", _resCulture))); + } + } + + public static System.Drawing.Bitmap removeclient { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("removeclient", _resCulture))); + } + } + + public static System.Drawing.Bitmap schednewappt { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("schednewappt", _resCulture))); + } + } + + public static System.Drawing.Bitmap showallappts { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("showallappts", _resCulture))); + } + } + + public static System.Drawing.Bitmap showallbills { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("showallbills", _resCulture))); + } + } + + public static System.Drawing.Bitmap showallclients { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("showallclients", _resCulture))); + } + } + + public static System.Drawing.Bitmap showappt { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("showappt", _resCulture))); + } + } + + public static System.Drawing.Bitmap showbill { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("showbill", _resCulture))); + } + } + + public static System.Drawing.Bitmap showindclient { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("showindclient", _resCulture))); + } + } + + public static System.Drawing.Bitmap toolsmngprov { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("toolsmngprov", _resCulture))); + } + } + + public static System.Drawing.Bitmap toolsoptions { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("toolsoptions", _resCulture))); + } + } + + public static System.Drawing.Bitmap updateappt { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("updateappt", _resCulture))); + } + } + + public static System.Drawing.Bitmap updatebill { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("updatebill", _resCulture))); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Resources.resx new file mode 100644 index 0000000..0c3de26 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Resources.resx @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Images\addclient.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\enterbill.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\findappt.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\findbill.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\findclient.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\helpcontents.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\removeappt.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\removebill.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\removeclient.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\schednewappt.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\showallappts.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\showallbills.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\showallclients.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\showappt.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\showbill.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\showindclient.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\toolsmngprov.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\toolsoptions.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\updateappt.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\updatebill.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Settings.cs new file mode 100644 index 0000000..6fe3791 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Settings.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40527.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.Samples.BoosterSamples.CustomizeToolStripTest.Properties { + + + sealed partial class Settings : System.Configuration.ApplicationSettingsBase { + + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + [System.Diagnostics.DebuggerNonUserCode()] + public static Settings Value { + get { + if ((Settings.m_Value == null)) { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) { + try { + Settings.m_Value = new Settings(); + } + finally { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Settings.settings new file mode 100644 index 0000000..e8cf4f7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/app.config b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/app.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/app.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStrip.dll b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStrip.dll new file mode 100644 index 0000000..ac8333c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStrip.dll differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStripTest.exe b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStripTest.exe new file mode 100644 index 0000000..3dcdcec Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStripTest.exe differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStripTest.exe.config b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStripTest.exe.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStripTest.exe.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStripTest.vshost.exe.config b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStripTest.vshost.exe.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Debug/CustomizeToolStripTest.vshost.exe.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Release/CustomizeToolStrip.dll b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Release/CustomizeToolStrip.dll new file mode 100644 index 0000000..cac1c32 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Release/CustomizeToolStrip.dll differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Release/CustomizeToolStripTest.exe b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Release/CustomizeToolStripTest.exe new file mode 100644 index 0000000..cfc179f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Release/CustomizeToolStripTest.exe differ diff --git a/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Release/CustomizeToolStripTest.exe.config b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Release/CustomizeToolStripTest.exe.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/RuntimeToolStripCustomization/CustomizeToolStripTest/bin/Release/CustomizeToolStripTest.exe.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ContainerTest.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ContainerTest.Designer.cs new file mode 100644 index 0000000..644876b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ContainerTest.Designer.cs @@ -0,0 +1,673 @@ +namespace Strips +{ + partial class ContainerTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ContainerTest)); + this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer(); + this.toolStrip2 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton3 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton4 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton5 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton6 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton7 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton8 = new System.Windows.Forms.ToolStripButton(); + this.toolStrip3 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton9 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton10 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton11 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton12 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton13 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton14 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton15 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton16 = new System.Windows.Forms.ToolStripButton(); + this.toolStrip4 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton17 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton18 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton19 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton20 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton21 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton22 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton23 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton24 = new System.Windows.Forms.ToolStripButton(); + this.toolStrip5 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton25 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton26 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton27 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton28 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton29 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton30 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton31 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton32 = new System.Windows.Forms.ToolStripButton(); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.printToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.pasteToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripContainer1.BottomToolStripPanel.SuspendLayout(); + this.toolStripContainer1.RightToolStripPanel.SuspendLayout(); + this.toolStripContainer1.TopToolStripPanel.SuspendLayout(); + this.toolStripContainer1.SuspendLayout(); + this.toolStrip2.SuspendLayout(); + this.toolStrip3.SuspendLayout(); + this.toolStrip4.SuspendLayout(); + this.toolStrip5.SuspendLayout(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStripContainer1 + // + // + // toolStripContainer1.BottomToolStripPanel + // + this.toolStripContainer1.BottomToolStripPanel.Controls.Add(this.toolStrip2); + this.toolStripContainer1.BottomToolStripPanel.Controls.Add(this.toolStrip3); + this.toolStripContainer1.BottomToolStripPanelVisible = false; + // + // toolStripContainer1.ContentPanel + // + this.toolStripContainer1.ContentPanel.BackColor = System.Drawing.Color.White; + this.toolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.toolStripContainer1.Location = new System.Drawing.Point(0, 0); + this.toolStripContainer1.Name = "toolStripContainer1"; + // + // toolStripContainer1.RightToolStripPanel + // + this.toolStripContainer1.RightToolStripPanel.Controls.Add(this.toolStrip4); + this.toolStripContainer1.Size = new System.Drawing.Size(536, 324); + this.toolStripContainer1.TabIndex = 0; + this.toolStripContainer1.Text = "toolStripContainer1"; + // + // toolStripContainer1.TopToolStripPanel + // + this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip1); + this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip5); + // + // toolStrip2 + // + this.toolStrip2.Dock = System.Windows.Forms.DockStyle.None; + this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton1, + this.toolStripButton2, + this.toolStripButton3, + this.toolStripButton4, + this.toolStripSeparator2, + this.toolStripButton5, + this.toolStripButton6, + this.toolStripButton7, + this.toolStripSeparator3, + this.toolStripButton8}); + this.toolStrip2.Location = new System.Drawing.Point(0, 0); + this.toolStrip2.Name = "toolStrip2"; + this.toolStrip2.Size = new System.Drawing.Size(207, 25); + this.toolStrip2.TabIndex = 1; + this.toolStrip2.Text = "toolStrip2"; + // + // toolStripButton1 + // + this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Text = "&New"; + // + // toolStripButton2 + // + this.toolStripButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); + this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton2.Name = "toolStripButton2"; + this.toolStripButton2.Text = "&Open"; + // + // toolStripButton3 + // + this.toolStripButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image"))); + this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton3.Name = "toolStripButton3"; + this.toolStripButton3.Text = "&Save"; + // + // toolStripButton4 + // + this.toolStripButton4.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton4.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton4.Image"))); + this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton4.Name = "toolStripButton4"; + this.toolStripButton4.Text = "&Print"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + // + // toolStripButton5 + // + this.toolStripButton5.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton5.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton5.Image"))); + this.toolStripButton5.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton5.Name = "toolStripButton5"; + this.toolStripButton5.Text = "C&ut"; + // + // toolStripButton6 + // + this.toolStripButton6.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton6.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton6.Image"))); + this.toolStripButton6.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton6.Name = "toolStripButton6"; + this.toolStripButton6.Text = "&Copy"; + // + // toolStripButton7 + // + this.toolStripButton7.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton7.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton7.Image"))); + this.toolStripButton7.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton7.Name = "toolStripButton7"; + this.toolStripButton7.Text = "&Paste"; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + // + // toolStripButton8 + // + this.toolStripButton8.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton8.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton8.Image"))); + this.toolStripButton8.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton8.Name = "toolStripButton8"; + this.toolStripButton8.Text = "He&lp"; + // + // toolStrip3 + // + this.toolStrip3.Dock = System.Windows.Forms.DockStyle.None; + this.toolStrip3.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton9, + this.toolStripButton10, + this.toolStripButton11, + this.toolStripButton12, + this.toolStripSeparator4, + this.toolStripButton13, + this.toolStripButton14, + this.toolStripButton15, + this.toolStripSeparator5, + this.toolStripButton16}); + this.toolStrip3.Location = new System.Drawing.Point(207, 0); + this.toolStrip3.Name = "toolStrip3"; + this.toolStrip3.Size = new System.Drawing.Size(207, 25); + this.toolStrip3.TabIndex = 2; + this.toolStrip3.Text = "toolStrip3"; + // + // toolStripButton9 + // + this.toolStripButton9.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton9.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton9.Image"))); + this.toolStripButton9.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton9.Name = "toolStripButton9"; + this.toolStripButton9.Text = "&New"; + // + // toolStripButton10 + // + this.toolStripButton10.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton10.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton10.Image"))); + this.toolStripButton10.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton10.Name = "toolStripButton10"; + this.toolStripButton10.Text = "&Open"; + // + // toolStripButton11 + // + this.toolStripButton11.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton11.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton11.Image"))); + this.toolStripButton11.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton11.Name = "toolStripButton11"; + this.toolStripButton11.Text = "&Save"; + // + // toolStripButton12 + // + this.toolStripButton12.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton12.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton12.Image"))); + this.toolStripButton12.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton12.Name = "toolStripButton12"; + this.toolStripButton12.Text = "&Print"; + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + // + // toolStripButton13 + // + this.toolStripButton13.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton13.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton13.Image"))); + this.toolStripButton13.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton13.Name = "toolStripButton13"; + this.toolStripButton13.Text = "C&ut"; + // + // toolStripButton14 + // + this.toolStripButton14.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton14.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton14.Image"))); + this.toolStripButton14.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton14.Name = "toolStripButton14"; + this.toolStripButton14.Text = "&Copy"; + // + // toolStripButton15 + // + this.toolStripButton15.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton15.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton15.Image"))); + this.toolStripButton15.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton15.Name = "toolStripButton15"; + this.toolStripButton15.Text = "&Paste"; + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + // + // toolStripButton16 + // + this.toolStripButton16.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton16.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton16.Image"))); + this.toolStripButton16.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton16.Name = "toolStripButton16"; + this.toolStripButton16.Text = "He&lp"; + // + // toolStrip4 + // + this.toolStrip4.Dock = System.Windows.Forms.DockStyle.None; + this.toolStrip4.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.toolStrip4.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton17, + this.toolStripButton18, + this.toolStripButton19, + this.toolStripButton20, + this.toolStripSeparator6, + this.toolStripButton21, + this.toolStripButton22, + this.toolStripButton23, + this.toolStripSeparator7, + this.toolStripButton24}); + this.toolStrip4.Location = new System.Drawing.Point(0, 24); + this.toolStrip4.Name = "toolStrip4"; + this.toolStrip4.Size = new System.Drawing.Size(31, 217); + this.toolStrip4.TabIndex = 1; + this.toolStrip4.Text = "toolStrip4"; + // + // toolStripButton17 + // + this.toolStripButton17.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton17.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton17.Image"))); + this.toolStripButton17.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton17.Name = "toolStripButton17"; + this.toolStripButton17.Text = "&New"; + // + // toolStripButton18 + // + this.toolStripButton18.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton18.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton18.Image"))); + this.toolStripButton18.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton18.Name = "toolStripButton18"; + this.toolStripButton18.Text = "&Open"; + // + // toolStripButton19 + // + this.toolStripButton19.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton19.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton19.Image"))); + this.toolStripButton19.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton19.Name = "toolStripButton19"; + this.toolStripButton19.Text = "&Save"; + // + // toolStripButton20 + // + this.toolStripButton20.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton20.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton20.Image"))); + this.toolStripButton20.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton20.Name = "toolStripButton20"; + this.toolStripButton20.Text = "&Print"; + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + // + // toolStripButton21 + // + this.toolStripButton21.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton21.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton21.Image"))); + this.toolStripButton21.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton21.Name = "toolStripButton21"; + this.toolStripButton21.Text = "C&ut"; + // + // toolStripButton22 + // + this.toolStripButton22.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton22.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton22.Image"))); + this.toolStripButton22.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton22.Name = "toolStripButton22"; + this.toolStripButton22.Text = "&Copy"; + // + // toolStripButton23 + // + this.toolStripButton23.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton23.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton23.Image"))); + this.toolStripButton23.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton23.Name = "toolStripButton23"; + this.toolStripButton23.Text = "&Paste"; + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + // + // toolStripButton24 + // + this.toolStripButton24.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton24.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton24.Image"))); + this.toolStripButton24.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton24.Name = "toolStripButton24"; + this.toolStripButton24.Text = "He&lp"; + // + // toolStrip5 + // + this.toolStrip5.Dock = System.Windows.Forms.DockStyle.None; + this.toolStrip5.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton25, + this.toolStripButton26, + this.toolStripButton27, + this.toolStripButton28, + this.toolStripSeparator8, + this.toolStripButton29, + this.toolStripButton30, + this.toolStripButton31, + this.toolStripSeparator9, + this.toolStripButton32}); + this.toolStrip5.Location = new System.Drawing.Point(0, 0); + this.toolStrip5.Name = "toolStrip5"; + this.toolStrip5.Size = new System.Drawing.Size(207, 25); + this.toolStrip5.TabIndex = 2; + this.toolStrip5.Text = "toolStrip5"; + // + // toolStripButton25 + // + this.toolStripButton25.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton25.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton25.Image"))); + this.toolStripButton25.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton25.Name = "toolStripButton25"; + this.toolStripButton25.Text = "&New"; + // + // toolStripButton26 + // + this.toolStripButton26.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton26.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton26.Image"))); + this.toolStripButton26.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton26.Name = "toolStripButton26"; + this.toolStripButton26.Text = "&Open"; + // + // toolStripButton27 + // + this.toolStripButton27.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton27.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton27.Image"))); + this.toolStripButton27.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton27.Name = "toolStripButton27"; + this.toolStripButton27.Text = "&Save"; + // + // toolStripButton28 + // + this.toolStripButton28.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton28.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton28.Image"))); + this.toolStripButton28.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton28.Name = "toolStripButton28"; + this.toolStripButton28.Text = "&Print"; + // + // toolStripSeparator8 + // + this.toolStripSeparator8.Name = "toolStripSeparator8"; + // + // toolStripButton29 + // + this.toolStripButton29.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton29.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton29.Image"))); + this.toolStripButton29.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton29.Name = "toolStripButton29"; + this.toolStripButton29.Text = "C&ut"; + // + // toolStripButton30 + // + this.toolStripButton30.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton30.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton30.Image"))); + this.toolStripButton30.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton30.Name = "toolStripButton30"; + this.toolStripButton30.Text = "&Copy"; + // + // toolStripButton31 + // + this.toolStripButton31.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton31.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton31.Image"))); + this.toolStripButton31.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton31.Name = "toolStripButton31"; + this.toolStripButton31.Text = "&Paste"; + // + // toolStripSeparator9 + // + this.toolStripSeparator9.Name = "toolStripSeparator9"; + // + // toolStripButton32 + // + this.toolStripButton32.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton32.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton32.Image"))); + this.toolStripButton32.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton32.Name = "toolStripButton32"; + this.toolStripButton32.Text = "He&lp"; + // + // toolStrip1 + // + this.toolStrip1.Dock = System.Windows.Forms.DockStyle.None; + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.printToolStripButton, + this.toolStripSeparator, + this.cutToolStripButton, + this.copyToolStripButton, + this.pasteToolStripButton, + this.toolStripSeparator1, + this.helpToolStripButton}); + this.toolStrip1.Location = new System.Drawing.Point(226, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(238, 25); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Text = "&New"; + // + // openToolStripButton + // + this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Text = "&Open"; + // + // saveToolStripButton + // + this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Text = "&Save"; + // + // printToolStripButton + // + this.printToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image"))); + this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripButton.Name = "printToolStripButton"; + this.printToolStripButton.Text = "&Print"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + // + // cutToolStripButton + // + this.cutToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Text = "C&ut"; + // + // copyToolStripButton + // + this.copyToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Text = "&Copy"; + // + // pasteToolStripButton + // + this.pasteToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.pasteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripButton.Image"))); + this.pasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripButton.Name = "pasteToolStripButton"; + this.pasteToolStripButton.Text = "&Paste"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // helpToolStripButton + // + this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image"))); + this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Text = "He&lp"; + // + // Rafting + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(536, 324); + this.Controls.Add(this.toolStripContainer1); + this.Name = "Rafting"; + this.Text = "Rafting"; + this.toolStripContainer1.BottomToolStripPanel.ResumeLayout(false); + this.toolStripContainer1.BottomToolStripPanel.PerformLayout(); + this.toolStripContainer1.RightToolStripPanel.ResumeLayout(false); + this.toolStripContainer1.RightToolStripPanel.PerformLayout(); + this.toolStripContainer1.TopToolStripPanel.ResumeLayout(false); + this.toolStripContainer1.TopToolStripPanel.PerformLayout(); + this.toolStripContainer1.ResumeLayout(false); + this.toolStripContainer1.PerformLayout(); + this.toolStrip2.ResumeLayout(false); + this.toolStrip3.ResumeLayout(false); + this.toolStrip4.ResumeLayout(false); + this.toolStrip5.ResumeLayout(false); + this.toolStrip1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ToolStripContainer toolStripContainer1; + private System.Windows.Forms.ToolStrip toolStrip3; + private System.Windows.Forms.ToolStripButton toolStripButton9; + private System.Windows.Forms.ToolStripButton toolStripButton10; + private System.Windows.Forms.ToolStripButton toolStripButton11; + private System.Windows.Forms.ToolStripButton toolStripButton12; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripButton toolStripButton13; + private System.Windows.Forms.ToolStripButton toolStripButton14; + private System.Windows.Forms.ToolStripButton toolStripButton15; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripButton toolStripButton16; + private System.Windows.Forms.ToolStrip toolStrip2; + private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.ToolStripButton toolStripButton2; + private System.Windows.Forms.ToolStripButton toolStripButton3; + private System.Windows.Forms.ToolStripButton toolStripButton4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripButton toolStripButton5; + private System.Windows.Forms.ToolStripButton toolStripButton6; + private System.Windows.Forms.ToolStripButton toolStripButton7; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripButton toolStripButton8; + private System.Windows.Forms.ToolStrip toolStrip4; + private System.Windows.Forms.ToolStripButton toolStripButton17; + private System.Windows.Forms.ToolStripButton toolStripButton18; + private System.Windows.Forms.ToolStripButton toolStripButton19; + private System.Windows.Forms.ToolStripButton toolStripButton20; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.ToolStripButton toolStripButton21; + private System.Windows.Forms.ToolStripButton toolStripButton22; + private System.Windows.Forms.ToolStripButton toolStripButton23; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.ToolStripButton toolStripButton24; + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripButton printToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton pasteToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + private System.Windows.Forms.ToolStrip toolStrip5; + private System.Windows.Forms.ToolStripButton toolStripButton25; + private System.Windows.Forms.ToolStripButton toolStripButton26; + private System.Windows.Forms.ToolStripButton toolStripButton27; + private System.Windows.Forms.ToolStripButton toolStripButton28; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; + private System.Windows.Forms.ToolStripButton toolStripButton29; + private System.Windows.Forms.ToolStripButton toolStripButton30; + private System.Windows.Forms.ToolStripButton toolStripButton31; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; + private System.Windows.Forms.ToolStripButton toolStripButton32; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ContainerTest.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ContainerTest.cs new file mode 100644 index 0000000..6fb9726 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ContainerTest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class ContainerTest : Form + { + public ContainerTest() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ContainerTest.resx b/Pro Windows Forms 2.0/Chapter14/Strips/ContainerTest.resx new file mode 100644 index 0000000..e657797 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ContainerTest.resx @@ -0,0 +1,738 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + + 17, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + + 17, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + + 17, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + + 17, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ContextMenus.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ContextMenus.Designer.cs new file mode 100644 index 0000000..8c06860 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ContextMenus.Designer.cs @@ -0,0 +1,407 @@ +namespace Strips +{ + partial class ContextMenus + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ContextMenus)); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.printPreviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.undoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.redoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.customizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.indexToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.cutToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.label1 = new System.Windows.Forms.Label(); + this.contextMenuStrip1.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cutToolStripMenuItem1, + this.copyToolStripMenuItem1, + this.pasteToolStripMenuItem1}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(113, 70); + this.contextMenuStrip1.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip1_Opening); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem, + this.toolsToolStripMenuItem, + this.helpToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(292, 24); + this.menuStrip1.TabIndex = 2; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.openToolStripMenuItem, + this.toolStripSeparator, + this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.toolStripSeparator1, + this.printToolStripMenuItem, + this.printPreviewToolStripMenuItem, + this.toolStripSeparator2, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20); + this.fileToolStripMenuItem.Text = "&File"; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripMenuItem.Image"))); + this.newToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.newToolStripMenuItem.Text = "&New"; + this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripMenuItem.Image"))); + this.openToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.openToolStripMenuItem.Text = "&Open"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + this.toolStripSeparator.Size = new System.Drawing.Size(149, 6); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripMenuItem.Image"))); + this.saveToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.saveToolStripMenuItem.Text = "&Save"; + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.saveAsToolStripMenuItem.Text = "Save &As"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6); + // + // printToolStripMenuItem + // + this.printToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripMenuItem.Image"))); + this.printToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripMenuItem.Name = "printToolStripMenuItem"; + this.printToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.printToolStripMenuItem.Text = "&Print"; + // + // printPreviewToolStripMenuItem + // + this.printPreviewToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("printPreviewToolStripMenuItem.Image"))); + this.printPreviewToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printPreviewToolStripMenuItem.Name = "printPreviewToolStripMenuItem"; + this.printPreviewToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.printPreviewToolStripMenuItem.Text = "Print Pre&view"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.exitToolStripMenuItem.Text = "E&xit"; + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.undoToolStripMenuItem, + this.redoToolStripMenuItem, + this.toolStripSeparator3, + this.cutToolStripMenuItem, + this.copyToolStripMenuItem, + this.pasteToolStripMenuItem, + this.toolStripSeparator4, + this.selectAllToolStripMenuItem}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.editToolStripMenuItem.Text = "&Edit"; + // + // undoToolStripMenuItem + // + this.undoToolStripMenuItem.Name = "undoToolStripMenuItem"; + this.undoToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.undoToolStripMenuItem.Text = "&Undo"; + // + // redoToolStripMenuItem + // + this.redoToolStripMenuItem.Name = "redoToolStripMenuItem"; + this.redoToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.redoToolStripMenuItem.Text = "&Redo"; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(125, 6); + // + // cutToolStripMenuItem + // + this.cutToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripMenuItem.Image"))); + this.cutToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; + this.cutToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.cutToolStripMenuItem.Text = "Cu&t"; + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripMenuItem.Image"))); + this.copyToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.copyToolStripMenuItem.Text = "&Copy"; + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripMenuItem.Image"))); + this.pasteToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.pasteToolStripMenuItem.Text = "&Paste"; + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(125, 6); + // + // selectAllToolStripMenuItem + // + this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(128, 22); + this.selectAllToolStripMenuItem.Text = "Select &All"; + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.customizeToolStripMenuItem, + this.optionsToolStripMenuItem}); + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.toolsToolStripMenuItem.Text = "&Tools"; + // + // customizeToolStripMenuItem + // + this.customizeToolStripMenuItem.Name = "customizeToolStripMenuItem"; + this.customizeToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.customizeToolStripMenuItem.Text = "&Customize"; + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.optionsToolStripMenuItem.Text = "&Options"; + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.contentsToolStripMenuItem, + this.indexToolStripMenuItem, + this.searchToolStripMenuItem, + this.toolStripSeparator5, + this.aboutToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(40, 20); + this.helpToolStripMenuItem.Text = "&Help"; + // + // contentsToolStripMenuItem + // + this.contentsToolStripMenuItem.Name = "contentsToolStripMenuItem"; + this.contentsToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.contentsToolStripMenuItem.Text = "&Contents"; + // + // indexToolStripMenuItem + // + this.indexToolStripMenuItem.Name = "indexToolStripMenuItem"; + this.indexToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.indexToolStripMenuItem.Text = "&Index"; + // + // searchToolStripMenuItem + // + this.searchToolStripMenuItem.Name = "searchToolStripMenuItem"; + this.searchToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.searchToolStripMenuItem.Text = "&Search"; + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(126, 6); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.aboutToolStripMenuItem.Text = "&About..."; + // + // textBox1 + // + this.textBox1.ContextMenuStrip = this.contextMenuStrip1; + this.textBox1.Location = new System.Drawing.Point(31, 106); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(154, 62); + this.textBox1.TabIndex = 3; + this.textBox1.Text = "textBox"; + // + // cutToolStripMenuItem1 + // + this.cutToolStripMenuItem1.Name = "cutToolStripMenuItem1"; + this.cutToolStripMenuItem1.Size = new System.Drawing.Size(152, 22); + this.cutToolStripMenuItem1.Text = "Cut"; + // + // copyToolStripMenuItem1 + // + this.copyToolStripMenuItem1.Name = "copyToolStripMenuItem1"; + this.copyToolStripMenuItem1.Size = new System.Drawing.Size(152, 22); + this.copyToolStripMenuItem1.Text = "Copy"; + // + // pasteToolStripMenuItem1 + // + this.pasteToolStripMenuItem1.Name = "pasteToolStripMenuItem1"; + this.pasteToolStripMenuItem1.Size = new System.Drawing.Size(152, 22); + this.pasteToolStripMenuItem1.Text = "Paste"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.ContextMenuStrip = this.contextMenuStrip1; + this.label1.Location = new System.Drawing.Point(28, 61); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(35, 13); + this.label1.TabIndex = 4; + this.label1.Text = "label1"; + // + // ContextMenus + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.label1); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.Name = "ContextMenus"; + this.Text = "ContextMenus"; + this.Load += new System.EventHandler(this.ContextMenus_Load); + this.contextMenuStrip1.ResumeLayout(false); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem printToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem printPreviewToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem undoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem redoToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem customizeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem contentsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem indexToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem1; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ContextMenus.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ContextMenus.cs new file mode 100644 index 0000000..df93b59 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ContextMenus.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class ContextMenus : Form + { + public ContextMenus() + { + InitializeComponent(); + } + + private void ContextMenus_Load(object sender, EventArgs e) + { + + } + + private void listBox1_MouseUp(object sender, MouseEventArgs e) + { + + } + + private void newToolStripMenuItem_Click(object sender, EventArgs e) + { + + } + + private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) + { + // Enable everything. + foreach (ToolStripItem item in contextMenuStrip1.Items) + { + item.Visible = true; + } + + // Disable what isn't appropriate. + if (contextMenuStrip1.SourceControl is Label) + { + cutToolStripMenuItem1.Visible = false; + pasteToolStripMenuItem1.Visible = false; + } + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ContextMenus.resx b/Pro Windows Forms 2.0/Chapter14/Strips/ContextMenus.resx new file mode 100644 index 0000000..8631f9c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ContextMenus.resx @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 162, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAY5JREFUOE+d081L + AkEUAPD1T+hYhzoERV77OHUo8JBBt+4RRkSQ4U0SunaJOkSRKQWZWCiF5kdroa0WRAoRFXXoEEkWCUFY + Wbvrvnqz7NK6OxANPIZh5v1m3uyOKZK5AaamiaLICILACDzPtDXXM+3mRlPtGnWMAK15g4fQabVBYDej + 20QFdtJXVGBxg4Xk8aWMRDhjJLh/TgUW1hPQ1T+ihmEZgXieCghiFRBRIEPAFzkxBO4fSsByOfBsRkkE + 4xkoFEv6Mla3szoAF2Jy+E2A0KMc/nyRINe3BS2yspXSAf4YR5Kfq/LUE1QJopxEU8qSP6kD5nwxFUAE + A0E8hdM1rz0BXtDvhheHwMEnwKkkJ2OPAJMuw+TUDB2QJAneKzxgCRNnHwTBUJJd3ijYx8fowBcvwstr + BXIXdxBOZAmCu2JgssMxBGvOOmNA+d5KP+sJw17qiJRjn3bDwOAocF4LQMWtRTABf9W/hLWjFcpsA0Fc + tm76+6C+vJ+J4b4WgmAp/0bMTXVg6ekFNrQM3y3xMcC3lb+tAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/DesignableToolStrip.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/DesignableToolStrip.Designer.cs new file mode 100644 index 0000000..835976d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/DesignableToolStrip.Designer.cs @@ -0,0 +1,38 @@ +namespace Strips +{ + partial class DesignableToolStrip + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "DesignableToolStrip"; + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/DesignableToolStrip.cs b/Pro Windows Forms 2.0/Chapter14/Strips/DesignableToolStrip.cs new file mode 100644 index 0000000..8831c8e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/DesignableToolStrip.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class DesignableToolStrip : Form + { + public DesignableToolStrip() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Menu.cs b/Pro Windows Forms 2.0/Chapter14/Strips/Menu.cs new file mode 100644 index 0000000..0560dc4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace Strips +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("Strips." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/Menu.designer.cs new file mode 100644 index 0000000..2443106 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Menu.designer.cs @@ -0,0 +1,182 @@ +namespace Strips +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button12 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 7); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(124, 23); + this.button1.TabIndex = 0; + this.button1.Text = "ToolStripImages"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 33); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(124, 23); + this.button2.TabIndex = 1; + this.button2.Text = "ToolStripLink"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 57); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(124, 23); + this.button3.TabIndex = 2; + this.button3.Text = "ToolStripSizes"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 82); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(124, 23); + this.button4.TabIndex = 3; + this.button4.Text = "ToolStripAlignment"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(12, 107); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(124, 23); + this.button5.TabIndex = 4; + this.button5.Text = "VerticalToolStrip"; + this.button5.Click += new System.EventHandler(this.cmd_Click); + // + // button6 + // + this.button6.Location = new System.Drawing.Point(12, 132); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(124, 23); + this.button6.TabIndex = 5; + this.button6.Text = "ContainerTest"; + this.button6.Click += new System.EventHandler(this.cmd_Click); + // + // button7 + // + this.button7.Location = new System.Drawing.Point(12, 157); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(124, 23); + this.button7.TabIndex = 6; + this.button7.Text = "ToolStripFloat"; + this.button7.Click += new System.EventHandler(this.cmd_Click); + // + // button8 + // + this.button8.Location = new System.Drawing.Point(12, 182); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(124, 23); + this.button8.TabIndex = 7; + this.button8.Text = "StatusStripSpring"; + this.button8.Click += new System.EventHandler(this.cmd_Click); + // + // button9 + // + this.button9.Location = new System.Drawing.Point(12, 207); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(124, 23); + this.button9.TabIndex = 8; + this.button9.Text = "StatusStripBorders"; + this.button9.Click += new System.EventHandler(this.cmd_Click); + // + // button10 + // + this.button10.Location = new System.Drawing.Point(12, 232); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(124, 23); + this.button10.TabIndex = 9; + this.button10.Text = "StripMenu"; + this.button10.Click += new System.EventHandler(this.cmd_Click); + // + // button12 + // + this.button12.Location = new System.Drawing.Point(12, 257); + this.button12.Name = "button12"; + this.button12.Size = new System.Drawing.Size(124, 23); + this.button12.TabIndex = 11; + this.button12.Text = "ContextMenus"; + this.button12.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 301); + this.Controls.Add(this.button12); + this.Controls.Add(this.button10); + this.Controls.Add(this.button9); + this.Controls.Add(this.button8); + this.Controls.Add(this.button7); + this.Controls.Add(this.button6); + this.Controls.Add(this.button5); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button12; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Menu.resx b/Pro Windows Forms 2.0/Chapter14/Strips/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Program.cs b/Pro Windows Forms 2.0/Chapter14/Strips/Program.cs new file mode 100644 index 0000000..6ad395b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Strips +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + + Application.Run(new Menu()); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter14/Strips/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d19470c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Strips")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Strips")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("8f2e219d-aadc-4f9c-937d-b3ddc6dcd2f3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Resources.Designer.cs new file mode 100644 index 0000000..fd258d9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Resources.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="Strips.Properties.Resources.get_ResourceManager():System.Resources.ResourceManage" + + "r")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="Strips.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="Strips.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace Strips.Properties { + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Strips.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap err { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("err", resourceCulture))); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Resources.resx new file mode 100644 index 0000000..a22ce14 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\err.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\err1.ico;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Settings.Designer.cs new file mode 100644 index 0000000..90a7046 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "Strips.Properties.Settings.get_Default():Strips.Properties.Settings")] + +namespace Strips.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Resources/err.ico b/Pro Windows Forms 2.0/Chapter14/Strips/Resources/err.ico new file mode 100644 index 0000000..2ceab73 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/Strips/Resources/err.ico differ diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Resources/err1.ico b/Pro Windows Forms 2.0/Chapter14/Strips/Resources/err1.ico new file mode 100644 index 0000000..2ceab73 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/Strips/Resources/err1.ico differ diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripBorders.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripBorders.Designer.cs new file mode 100644 index 0000000..6696441 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripBorders.Designer.cs @@ -0,0 +1,209 @@ +namespace Strips +{ + partial class StatusStripBorders + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.checkedListBox1 = new System.Windows.Forms.CheckedListBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.checkedListBox2 = new System.Windows.Forms.CheckedListBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.comboBox3 = new System.Windows.Forms.ComboBox(); + this.checkedListBox3 = new System.Windows.Forms.CheckedListBox(); + this.statusStrip1.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripStatusLabel1, + this.toolStripStatusLabel2, + this.toolStripStatusLabel3}); + this.statusStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Table; + this.statusStrip1.Location = new System.Drawing.Point(0, 206); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(502, 22); + this.statusStrip1.TabIndex = 0; + this.statusStrip1.Text = "statusStrip1"; + // + // toolStripStatusLabel1 + // + this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; + this.toolStripStatusLabel1.Spring = true; + this.toolStripStatusLabel1.Text = "toolStripStatusLabel1"; + // + // toolStripStatusLabel2 + // + this.toolStripStatusLabel2.Name = "toolStripStatusLabel2"; + this.toolStripStatusLabel2.Spring = true; + this.toolStripStatusLabel2.Text = "toolStripStatusLabel2"; + // + // toolStripStatusLabel3 + // + this.toolStripStatusLabel3.Name = "toolStripStatusLabel3"; + this.toolStripStatusLabel3.Spring = true; + this.toolStripStatusLabel3.Text = "toolStripStatusLabel3"; + // + // comboBox1 + // + this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(13, 23); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(121, 21); + this.comboBox1.TabIndex = 4; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + // + // checkedListBox1 + // + this.checkedListBox1.FormattingEnabled = true; + this.checkedListBox1.Location = new System.Drawing.Point(14, 48); + this.checkedListBox1.Name = "checkedListBox1"; + this.checkedListBox1.Size = new System.Drawing.Size(120, 112); + this.checkedListBox1.TabIndex = 7; + this.checkedListBox1.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.checkedListBox1_ItemCheck); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.comboBox1); + this.groupBox1.Controls.Add(this.checkedListBox1); + this.groupBox1.Location = new System.Drawing.Point(12, 9); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(147, 179); + this.groupBox1.TabIndex = 10; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "toolStripStatusLabel1"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.comboBox2); + this.groupBox2.Controls.Add(this.checkedListBox2); + this.groupBox2.Location = new System.Drawing.Point(171, 9); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(147, 179); + this.groupBox2.TabIndex = 11; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "toolStripStatusLabel2"; + // + // comboBox2 + // + this.comboBox2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Location = new System.Drawing.Point(13, 23); + this.comboBox2.Name = "comboBox2"; + this.comboBox2.Size = new System.Drawing.Size(121, 21); + this.comboBox2.TabIndex = 4; + this.comboBox2.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + // + // checkedListBox2 + // + this.checkedListBox2.FormattingEnabled = true; + this.checkedListBox2.Location = new System.Drawing.Point(14, 48); + this.checkedListBox2.Name = "checkedListBox2"; + this.checkedListBox2.Size = new System.Drawing.Size(120, 112); + this.checkedListBox2.TabIndex = 7; + this.checkedListBox2.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.checkedListBox1_ItemCheck); + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.comboBox3); + this.groupBox3.Controls.Add(this.checkedListBox3); + this.groupBox3.Location = new System.Drawing.Point(329, 9); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(147, 179); + this.groupBox3.TabIndex = 12; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "toolStripStatusLabel3"; + // + // comboBox3 + // + this.comboBox3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox3.FormattingEnabled = true; + this.comboBox3.Location = new System.Drawing.Point(13, 23); + this.comboBox3.Name = "comboBox3"; + this.comboBox3.Size = new System.Drawing.Size(121, 21); + this.comboBox3.TabIndex = 4; + this.comboBox3.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + // + // checkedListBox3 + // + this.checkedListBox3.FormattingEnabled = true; + this.checkedListBox3.Location = new System.Drawing.Point(14, 48); + this.checkedListBox3.Name = "checkedListBox3"; + this.checkedListBox3.Size = new System.Drawing.Size(120, 112); + this.checkedListBox3.TabIndex = 7; + this.checkedListBox3.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.checkedListBox1_ItemCheck); + // + // StatusStripBorders + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(502, 228); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.statusStrip1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "StatusStripBorders"; + this.Text = "StatusStripBorders"; + this.Load += new System.EventHandler(this.StatusStripBorders_Load); + this.statusStrip1.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox3.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.CheckedListBox checkedListBox1; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.CheckedListBox checkedListBox2; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.ComboBox comboBox3; + private System.Windows.Forms.CheckedListBox checkedListBox3; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripBorders.cs b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripBorders.cs new file mode 100644 index 0000000..497911a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripBorders.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class StatusStripBorders : Form + { + public StatusStripBorders() + { + InitializeComponent(); + } + + private void StatusStripBorders_Load(object sender, EventArgs e) + { + string[] names = Enum.GetNames(typeof(Border3DStyle)); + comboBox1.Items.AddRange(names); + comboBox2.Items.AddRange(names); + comboBox3.Items.AddRange(names); + names = Enum.GetNames(typeof(ToolStripStatusLabelBorderSides)); + checkedListBox1.Items.AddRange(names); + checkedListBox2.Items.AddRange(names); + checkedListBox3.Items.AddRange(names); + groupBox1.Tag = toolStripStatusLabel1; + groupBox2.Tag = toolStripStatusLabel2; + groupBox3.Tag = toolStripStatusLabel3; + + comboBox1.Text = toolStripStatusLabel1.BorderStyle.ToString(); + comboBox2.Text = toolStripStatusLabel2.BorderStyle.ToString(); + comboBox3.Text = toolStripStatusLabel3.BorderStyle.ToString(); + } + + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + Border3DStyle selection; + Control ctrl = (Control)sender; + selection = (Border3DStyle)Enum.Parse(typeof(Border3DStyle), ctrl.Text); + ToolStripStatusLabel lbl = (ToolStripStatusLabel)ctrl.Parent.Tag; + if (lbl!=null) lbl.BorderStyle = selection; + } + + + + private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) + { + CheckedListBox ctrl = (CheckedListBox)sender; + + + ToolStripStatusLabelBorderSides totalSelection = ToolStripStatusLabelBorderSides.None; + foreach (string item in ctrl.CheckedItems) + { + ToolStripStatusLabelBorderSides selection = (ToolStripStatusLabelBorderSides)Enum.Parse(typeof(ToolStripStatusLabelBorderSides), item); + + totalSelection = totalSelection | selection; + } + + ToolStripStatusLabel lbl = (ToolStripStatusLabel)ctrl.Parent.Tag; + lbl.BorderSides = totalSelection; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripBorders.resx b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripBorders.resx new file mode 100644 index 0000000..ab569af --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripBorders.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripSpring.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripSpring.Designer.cs new file mode 100644 index 0000000..b1e1fe4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripSpring.Designer.cs @@ -0,0 +1,99 @@ +namespace Strips +{ + partial class StatusStripSpring + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel(); + this.statusStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripStatusLabel1, + this.toolStripStatusLabel3, + this.toolStripStatusLabel2}); + this.statusStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Table; + this.statusStrip1.Location = new System.Drawing.Point(0, 140); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(434, 22); + this.statusStrip1.TabIndex = 0; + this.statusStrip1.Text = "statusStrip1"; + // + // toolStripStatusLabel1 + // + this.toolStripStatusLabel1.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; + this.toolStripStatusLabel1.Spring = true; + this.toolStripStatusLabel1.Text = "Spring = true"; + // + // toolStripStatusLabel2 + // + this.toolStripStatusLabel2.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.toolStripStatusLabel2.Name = "toolStripStatusLabel2"; + this.toolStripStatusLabel2.Spring = true; + this.toolStripStatusLabel2.Text = "Spring = true"; + // + // toolStripStatusLabel3 + // + this.toolStripStatusLabel3.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right) + | System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom))); + this.toolStripStatusLabel3.Name = "toolStripStatusLabel3"; + this.toolStripStatusLabel3.Text = "Spring = false"; + // + // StatusBar + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(434, 162); + this.Controls.Add(this.statusStrip1); + this.Name = "StatusBar"; + this.Text = "StatusStrip"; + this.Load += new System.EventHandler(this.StatusBar_Load); + this.statusStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripSpring.cs b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripSpring.cs new file mode 100644 index 0000000..cb51232 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripSpring.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class StatusStripSpring : Form + { + public StatusStripSpring() + { + InitializeComponent(); + } + + private void StatusBar_Load(object sender, EventArgs e) + { + + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripSpring.resx b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripSpring.resx new file mode 100644 index 0000000..ab569af --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/StatusStripSpring.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/StripMenu.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/StripMenu.Designer.cs new file mode 100644 index 0000000..6bef80c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/StripMenu.Designer.cs @@ -0,0 +1,434 @@ +namespace Strips +{ + partial class StripMenu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(StripMenu)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.mnuFont = new System.Windows.Forms.ToolStripDropDownButton(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.printPreviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.undoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.redoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.customizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.indexToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.panel1 = new System.Windows.Forms.Panel(); + this.menuStrip2 = new System.Windows.Forms.MenuStrip(); + this.menuInAPanelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStrip1.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.panel1.SuspendLayout(); + this.menuStrip2.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuFont}); + this.toolStrip1.Location = new System.Drawing.Point(0, 24); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(374, 25); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // mnuFont + // + this.mnuFont.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.mnuFont.Image = ((System.Drawing.Image)(resources.GetObject("mnuFont.Image"))); + this.mnuFont.ImageTransparentColor = System.Drawing.Color.Magenta; + this.mnuFont.Name = "mnuFont"; + this.mnuFont.Size = new System.Drawing.Size(42, 22); + this.mnuFont.Text = "Font"; + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem, + this.toolsToolStripMenuItem, + this.helpToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(374, 24); + this.menuStrip1.TabIndex = 1; + this.menuStrip1.Text = "menuStrip1"; + this.menuStrip1.MenuActivate += new System.EventHandler(this.menuStrip1_MenuActivate); + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.openToolStripMenuItem, + this.toolStripSeparator, + this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.toolStripSeparator1, + this.printToolStripMenuItem, + this.printPreviewToolStripMenuItem, + this.toolStripSeparator2, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20); + this.fileToolStripMenuItem.Text = "&File"; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripMenuItem.Image"))); + this.newToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.newToolStripMenuItem.Text = "&New"; + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripMenuItem.Image"))); + this.openToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.openToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.openToolStripMenuItem.Text = "&Open"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + this.toolStripSeparator.Size = new System.Drawing.Size(149, 6); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripMenuItem.Image"))); + this.saveToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.saveToolStripMenuItem.Text = "&Save"; + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.saveAsToolStripMenuItem.Text = "Save &As"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6); + // + // printToolStripMenuItem + // + this.printToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripMenuItem.Image"))); + this.printToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripMenuItem.Name = "printToolStripMenuItem"; + this.printToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P))); + this.printToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.printToolStripMenuItem.Text = "&Print"; + // + // printPreviewToolStripMenuItem + // + this.printPreviewToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("printPreviewToolStripMenuItem.Image"))); + this.printPreviewToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printPreviewToolStripMenuItem.Name = "printPreviewToolStripMenuItem"; + this.printPreviewToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.printPreviewToolStripMenuItem.Text = "Print Pre&view"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.exitToolStripMenuItem.Text = "E&xit"; + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.undoToolStripMenuItem, + this.redoToolStripMenuItem, + this.toolStripSeparator3, + this.cutToolStripMenuItem, + this.copyToolStripMenuItem, + this.pasteToolStripMenuItem, + this.toolStripSeparator4, + this.selectAllToolStripMenuItem}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.editToolStripMenuItem.Text = "&Edit"; + // + // undoToolStripMenuItem + // + this.undoToolStripMenuItem.Name = "undoToolStripMenuItem"; + this.undoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z))); + this.undoToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.undoToolStripMenuItem.Text = "&Undo"; + // + // redoToolStripMenuItem + // + this.redoToolStripMenuItem.Name = "redoToolStripMenuItem"; + this.redoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y))); + this.redoToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.redoToolStripMenuItem.Text = "&Redo"; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(147, 6); + // + // cutToolStripMenuItem + // + this.cutToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripMenuItem.Image"))); + this.cutToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; + this.cutToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); + this.cutToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.cutToolStripMenuItem.Text = "Cu&t"; + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripMenuItem.Image"))); + this.copyToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); + this.copyToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.copyToolStripMenuItem.Text = "&Copy"; + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripMenuItem.Image"))); + this.pasteToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.pasteToolStripMenuItem.Text = "&Paste"; + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(147, 6); + // + // selectAllToolStripMenuItem + // + this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(150, 22); + this.selectAllToolStripMenuItem.Text = "Select &All"; + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.customizeToolStripMenuItem, + this.optionsToolStripMenuItem}); + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.toolsToolStripMenuItem.Text = "&Tools"; + // + // customizeToolStripMenuItem + // + this.customizeToolStripMenuItem.Name = "customizeToolStripMenuItem"; + this.customizeToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.customizeToolStripMenuItem.Text = "&Customize"; + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(134, 22); + this.optionsToolStripMenuItem.Text = "&Options"; + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.contentsToolStripMenuItem, + this.indexToolStripMenuItem, + this.searchToolStripMenuItem, + this.toolStripSeparator5, + this.aboutToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(40, 20); + this.helpToolStripMenuItem.Text = "&Help"; + // + // contentsToolStripMenuItem + // + this.contentsToolStripMenuItem.Name = "contentsToolStripMenuItem"; + this.contentsToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.contentsToolStripMenuItem.Text = "&Contents"; + // + // indexToolStripMenuItem + // + this.indexToolStripMenuItem.Name = "indexToolStripMenuItem"; + this.indexToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.indexToolStripMenuItem.Text = "&Index"; + // + // searchToolStripMenuItem + // + this.searchToolStripMenuItem.Name = "searchToolStripMenuItem"; + this.searchToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.searchToolStripMenuItem.Text = "&Search"; + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(126, 6); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(129, 22); + this.aboutToolStripMenuItem.Text = "&About..."; + // + // panel1 + // + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.Controls.Add(this.menuStrip2); + this.panel1.Location = new System.Drawing.Point(58, 95); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(200, 100); + this.panel1.TabIndex = 2; + // + // menuStrip2 + // + this.menuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuInAPanelToolStripMenuItem}); + this.menuStrip2.Location = new System.Drawing.Point(0, 0); + this.menuStrip2.Name = "menuStrip2"; + this.menuStrip2.Size = new System.Drawing.Size(198, 24); + this.menuStrip2.TabIndex = 0; + this.menuStrip2.Text = "menuStrip2"; + // + // menuInAPanelToolStripMenuItem + // + this.menuInAPanelToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem2, + this.toolStripMenuItem3}); + this.menuInAPanelToolStripMenuItem.Name = "menuInAPanelToolStripMenuItem"; + this.menuInAPanelToolStripMenuItem.Size = new System.Drawing.Size(94, 20); + this.menuInAPanelToolStripMenuItem.Text = "Menu in a Panel"; + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(152, 22); + this.toolStripMenuItem2.Text = "1"; + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(152, 22); + this.toolStripMenuItem3.Text = "2"; + // + // StripMenu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(374, 255); + this.Controls.Add(this.panel1); + this.Controls.Add(this.toolStrip1); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.Name = "StripMenu"; + this.Text = "StripMenu"; + this.Load += new System.EventHandler(this.StripMenu_Load); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.menuStrip2.ResumeLayout(false); + this.menuStrip2.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripDropDownButton mnuFont; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem printToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem printPreviewToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem undoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem redoToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem customizeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem contentsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem indexToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.MenuStrip menuStrip2; + private System.Windows.Forms.ToolStripMenuItem menuInAPanelToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/StripMenu.cs b/Pro Windows Forms 2.0/Chapter14/Strips/StripMenu.cs new file mode 100644 index 0000000..c909643 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/StripMenu.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Text; + +namespace Strips +{ + public partial class StripMenu : Form + { + + public StripMenu() + { + InitializeComponent(); + } + + private void StripMenu_Load(object sender, EventArgs e) + { + + // Create the font collection. + InstalledFontCollection fontFamilies = new InstalledFontCollection(); + + // Iterate through all font families. + foreach (FontFamily family in fontFamilies.Families) + { + try + { + // Create a ToolStripMenuItem that will display text in this font. + ToolStripMenuItem item = new ToolStripMenuItem(family.Name); + item.Font = new Font(family, 8); + + mnuFont.DropDownItems.Add(item); + } + catch + { + // An error will occur if the selected font does + // not support normal style (the default used when + // creating a Font object). This problem can be + // harmlessly ignored. + } + + } + + // Code for the table-like File menu: + + // Create a new drop-down menu. + ToolStripDropDown menu = new ToolStripDropDown(); + + // Copy the existing items. + ToolStripItem[] items = new ToolStripItem[fileToolStripMenuItem.DropDown.Items.Count]; + fileToolStripMenuItem.DropDown.Items.CopyTo(items, 0); + + // Transfer the items into the drop-down menu. + foreach (ToolStripItem item in items) + { + if (!(item is ToolStripSeparator)) menu.Items.Add(item); + } + + // Adjust the layout of the new menu. + menu.LayoutStyle = ToolStripLayoutStyle.Table; + ((TableLayoutSettings)menu.LayoutSettings).ColumnCount = 2; + + // Attach it to the File menu. + fileToolStripMenuItem.DropDown = menu; + } + + private void menuStrip1_MenuActivate(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/StripMenu.resx b/Pro Windows Forms 2.0/Chapter14/Strips/StripMenu.resx new file mode 100644 index 0000000..6fe5643 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/StripMenu.resx @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + 116, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAY5JREFUOE+d081L + AkEUAPD1T+hYhzoERV77OHUo8JBBt+4RRkSQ4U0SunaJOkSRKQWZWCiF5kdroa0WRAoRFXXoEEkWCUFY + Wbvrvnqz7NK6OxANPIZh5v1m3uyOKZK5AaamiaLICILACDzPtDXXM+3mRlPtGnWMAK15g4fQabVBYDej + 20QFdtJXVGBxg4Xk8aWMRDhjJLh/TgUW1hPQ1T+ihmEZgXieCghiFRBRIEPAFzkxBO4fSsByOfBsRkkE + 4xkoFEv6Mla3szoAF2Jy+E2A0KMc/nyRINe3BS2yspXSAf4YR5Kfq/LUE1QJopxEU8qSP6kD5nwxFUAE + A0E8hdM1rz0BXtDvhheHwMEnwKkkJ2OPAJMuw+TUDB2QJAneKzxgCRNnHwTBUJJd3ijYx8fowBcvwstr + BXIXdxBOZAmCu2JgssMxBGvOOmNA+d5KP+sJw17qiJRjn3bDwOAocF4LQMWtRTABf9W/hLWjFcpsA0Fc + tm76+6C+vJ+J4b4WgmAp/0bMTXVg6ekFNrQM3y3xMcC3lb+tAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + 225, 17 + + + 52 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Strips.csproj b/Pro Windows Forms 2.0/Chapter14/Strips/Strips.csproj new file mode 100644 index 0000000..7f541bd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Strips.csproj @@ -0,0 +1,181 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {0C7BA361-10BB-48C0-9093-7FDEA0D4BB05} + WinExe + Properties + Strips + Strips + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + Form + + + ContextMenus.cs + + + Form + + + Menu.cs + + + Form + + + ContainerTest.cs + + + Form + + + StatusStripBorders.cs + + + Form + + + StatusStripSpring.cs + + + Form + + + StripMenu.cs + + + Form + + + ToolStripAlignment.cs + + + Form + + + ToolStripFloat.cs + + + Form + + + ToolStripImages.cs + + + + + ContextMenus.cs + + + Menu.cs + Designer + + + ContainerTest.cs + Designer + + + StatusStripBorders.cs + + + StatusStripSpring.cs + + + StripMenu.cs + + + ToolStripAlignment.cs + Designer + + + Designer + ToolStripFloat.cs + + + ToolStripImages.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + ToolStripLink.cs + + + ToolStripSizes.cs + + + VerticalToolStrip.cs + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Form + + + ToolStripLink.cs + + + Form + + + ToolStripSizes.cs + + + Form + + + VerticalToolStrip.cs + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Strips.csproj.user b/Pro Windows Forms 2.0/Chapter14/Strips/Strips.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Strips.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Strips.sln b/Pro Windows Forms 2.0/Chapter14/Strips/Strips.sln new file mode 100644 index 0000000..469b4cf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/Strips.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Strips", "Strips.csproj", "{0C7BA361-10BB-48C0-9093-7FDEA0D4BB05}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0C7BA361-10BB-48C0-9093-7FDEA0D4BB05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C7BA361-10BB-48C0-9093-7FDEA0D4BB05}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C7BA361-10BB-48C0-9093-7FDEA0D4BB05}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C7BA361-10BB-48C0-9093-7FDEA0D4BB05}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/Strips.suo b/Pro Windows Forms 2.0/Chapter14/Strips/Strips.suo new file mode 100644 index 0000000..d01369b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/Strips/Strips.suo differ diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripAlignment.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripAlignment.Designer.cs new file mode 100644 index 0000000..439ed4b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripAlignment.Designer.cs @@ -0,0 +1,171 @@ +namespace Strips +{ + partial class ToolStripAlignment + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ToolStripAlignment)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.printToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.pasteToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.printToolStripButton, + this.toolStripSeparator, + this.cutToolStripButton, + this.copyToolStripButton, + this.pasteToolStripButton, + this.helpToolStripButton}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(313, 25); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Size = new System.Drawing.Size(23, 22); + this.newToolStripButton.Text = "&New"; + // + // openToolStripButton + // + this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Size = new System.Drawing.Size(23, 22); + this.openToolStripButton.Text = "&Open"; + // + // saveToolStripButton + // + this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveToolStripButton.Text = "&Save"; + // + // printToolStripButton + // + this.printToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image"))); + this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripButton.Name = "printToolStripButton"; + this.printToolStripButton.Size = new System.Drawing.Size(23, 22); + this.printToolStripButton.Text = "&Print"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + this.toolStripSeparator.Size = new System.Drawing.Size(6, 25); + // + // cutToolStripButton + // + this.cutToolStripButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.cutToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Size = new System.Drawing.Size(23, 22); + this.cutToolStripButton.Text = "C&ut"; + // + // copyToolStripButton + // + this.copyToolStripButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.copyToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Size = new System.Drawing.Size(23, 22); + this.copyToolStripButton.Text = "&Copy"; + // + // pasteToolStripButton + // + this.pasteToolStripButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.pasteToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.pasteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripButton.Image"))); + this.pasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripButton.Name = "pasteToolStripButton"; + this.pasteToolStripButton.Size = new System.Drawing.Size(23, 22); + this.pasteToolStripButton.Text = "&Paste"; + // + // helpToolStripButton + // + this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image"))); + this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Size = new System.Drawing.Size(23, 22); + this.helpToolStripButton.Text = "He&lp"; + // + // ToolStripAlignment + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(313, 96); + this.Controls.Add(this.toolStrip1); + this.Name = "ToolStripAlignment"; + this.Text = "ToolStripAlignment"; + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripButton printToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton pasteToolStripButton; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripAlignment.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripAlignment.cs new file mode 100644 index 0000000..592e4a2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripAlignment.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class ToolStripAlignment : Form + { + public ToolStripAlignment() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripAlignment.resx b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripAlignment.resx new file mode 100644 index 0000000..296c8e0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripAlignment.resx @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripFloat.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripFloat.Designer.cs new file mode 100644 index 0000000..4cee1c2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripFloat.Designer.cs @@ -0,0 +1,193 @@ +namespace Strips +{ + partial class ToolStripFloat + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ToolStripFloat)); + this.floatToolStrip1 = new Strips.FloatToolStrip(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.printToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.pasteToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.floatToolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // floatToolStrip1 + // + this.floatToolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton1, + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.printToolStripButton, + this.toolStripSeparator, + this.cutToolStripButton, + this.copyToolStripButton, + this.pasteToolStripButton, + this.toolStripSeparator1, + this.helpToolStripButton}); + this.floatToolStrip1.Location = new System.Drawing.Point(0, 0); + this.floatToolStrip1.Name = "floatToolStrip1"; + this.floatToolStrip1.Size = new System.Drawing.Size(292, 25); + this.floatToolStrip1.TabIndex = 0; + this.floatToolStrip1.Text = "Standard Controls"; + this.floatToolStrip1.Undocked += new System.EventHandler(this.floatToolStrip1_Undocked); + // + // toolStripButton1 + // + this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripButton1.Enabled = false; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(34, 22); + this.toolStripButton1.Text = "Dock"; + this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click); + // + // newToolStripButton + // + this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Size = new System.Drawing.Size(23, 22); + this.newToolStripButton.Text = "&New"; + // + // openToolStripButton + // + this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Size = new System.Drawing.Size(23, 22); + this.openToolStripButton.Text = "&Open"; + // + // saveToolStripButton + // + this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveToolStripButton.Text = "&Save"; + // + // printToolStripButton + // + this.printToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image"))); + this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripButton.Name = "printToolStripButton"; + this.printToolStripButton.Size = new System.Drawing.Size(23, 22); + this.printToolStripButton.Text = "&Print"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + this.toolStripSeparator.Size = new System.Drawing.Size(6, 25); + // + // cutToolStripButton + // + this.cutToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Size = new System.Drawing.Size(23, 22); + this.cutToolStripButton.Text = "C&ut"; + // + // copyToolStripButton + // + this.copyToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Size = new System.Drawing.Size(23, 22); + this.copyToolStripButton.Text = "&Copy"; + // + // pasteToolStripButton + // + this.pasteToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.pasteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripButton.Image"))); + this.pasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripButton.Name = "pasteToolStripButton"; + this.pasteToolStripButton.Size = new System.Drawing.Size(23, 22); + this.pasteToolStripButton.Text = "&Paste"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // helpToolStripButton + // + this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image"))); + this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Size = new System.Drawing.Size(23, 22); + this.helpToolStripButton.Text = "He&lp"; + // + // ToolStripFloat + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.floatToolStrip1); + this.IsMdiContainer = true; + this.Name = "ToolStripFloat"; + this.Text = "ToolStripFloat"; + this.floatToolStrip1.ResumeLayout(false); + this.floatToolStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private FloatToolStrip floatToolStrip1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripButton printToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton pasteToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + private System.Windows.Forms.ToolStripButton toolStripButton1; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripFloat.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripFloat.cs new file mode 100644 index 0000000..5b32f8a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripFloat.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class ToolStripFloat : Form + { + public ToolStripFloat() + { + InitializeComponent(); + } + + private void toolStripButton1_Click(object sender, EventArgs e) + { + this.Controls.Add(floatToolStrip1); + floatToolStrip1.FloatForm.Close(); + floatToolStrip1.FloatForm.Dispose(); + + toolStripButton1.Enabled = false; + } + + private void floatToolStrip1_Undocked(object sender, EventArgs e) + { + toolStripButton1.Enabled = true; + } + } + + public class FloatToolStrip : ToolStrip + { + private Form floatForm; + public Form FloatForm + { + get { return floatForm; } + } + + public event EventHandler Undocked; + + protected override void OnMouseDown(MouseEventArgs mea) + { + if (this.GripRectangle.Contains(mea.Location)) + { + Point location = PointToScreen(Point.Empty); + + // For more control, this would be a custom form. + // You could then event handlers that would react when + // it is dragged, and re-dock it automatically. + floatForm = new Form(); + floatForm.Owner = this.FindForm(); + floatForm.StartPosition = FormStartPosition.Manual; + Point pt = location; + pt.Offset(5, 5); + floatForm.Location = pt; + floatForm.Text = this.Text; + + floatForm.FormBorderStyle = FormBorderStyle.FixedToolWindow; + floatForm.ClientSize = this.Size; + + floatForm.Controls.Add(this); + floatForm.Show(); + + if (Undocked != null) Undocked(this, EventArgs.Empty); + } + else + { + base.OnMouseDown(mea); + } + } + + // Another approach. + //protected override void OnMouseDown(MouseEventArgs mea) + //{ + // if (this.GripRectangle.Contains(mea.Location)) + // { + // isDragging = true; + // clickOffsetX = mea.X; + // clickOffsetY = mea.Y; + // } + // else + // { + // base.OnMouseDown(mea); + // } + //} + + //protected override void OnMouseUp(MouseEventArgs mea) + //{ + // isDragging = false; + // base.OnMouseUp(mea); + //} + + //// Keep track of when fake "drag and drop" mode is enabled. + //private bool isDragging = false; + + //// Store the location where the user clicked the control. + //private int clickOffsetX, clickOffsetY; + + + //protected override void OnMouseMove(MouseEventArgs mea) + //{ + // if (isDragging) + // { + // // The control coordinates are converted into form coordinates + // // by adding the label position offset. + // // The offset where the user clicked in the control is also + // // accounted for. Otherwise, it looks like the top-left corner + // // of the label is attached to the mouse. + // this.Location = new Point(mea.X + this.Left - clickOffsetX, + // mea.Y + this.Top - clickOffsetY); + // } + // else + // { + // base.OnMouseMove(mea); + // } + //} + + + } + + +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripFloat.resx b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripFloat.resx new file mode 100644 index 0000000..699880f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripFloat.resx @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL + U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI + VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ + QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 + /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 + cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j + 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR + dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb + NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE + s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripImages.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripImages.Designer.cs new file mode 100644 index 0000000..af492f9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripImages.Designer.cs @@ -0,0 +1,209 @@ +namespace Strips +{ + partial class ToolStripImages + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ToolStripImages)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.printToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.pasteToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.grp = new System.Windows.Forms.GroupBox(); + this.cmdApply = new System.Windows.Forms.Button(); + this.lstRelationship = new System.Windows.Forms.ListBox(); + this.toolStrip1.SuspendLayout(); + this.grp.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.printToolStripButton, + this.toolStripSeparator, + this.cutToolStripButton, + this.copyToolStripButton, + this.pasteToolStripButton, + this.toolStripSeparator1, + this.helpToolStripButton}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(504, 26); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.AutoToolTip = false; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Margin = new System.Windows.Forms.Padding(0, 1, 0, 5); + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Text = "&New"; + this.newToolStripButton.Click += new System.EventHandler(this.newToolStripButton_Click); + // + // openToolStripButton + // + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Text = "&Open"; + // + // saveToolStripButton + // + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Text = "&Save"; + // + // printToolStripButton + // + this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image"))); + this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripButton.Name = "printToolStripButton"; + this.printToolStripButton.Text = "&Print"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + // + // cutToolStripButton + // + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Text = "C&ut"; + // + // copyToolStripButton + // + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Text = "&Copy"; + // + // pasteToolStripButton + // + this.pasteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripButton.Image"))); + this.pasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripButton.Name = "pasteToolStripButton"; + this.pasteToolStripButton.Text = "&Paste"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // helpToolStripButton + // + this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image"))); + this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Text = "He&lp"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Text = "toolStripMenuItem1"; + // + // grp + // + this.grp.Controls.Add(this.cmdApply); + this.grp.Controls.Add(this.lstRelationship); + this.grp.Location = new System.Drawing.Point(12, 53); + this.grp.Name = "grp"; + this.grp.Size = new System.Drawing.Size(256, 150); + this.grp.TabIndex = 1; + this.grp.TabStop = false; + this.grp.Text = "TextImageRelationship"; + // + // cmdApply + // + this.cmdApply.Location = new System.Drawing.Point(175, 121); + this.cmdApply.Name = "cmdApply"; + this.cmdApply.Size = new System.Drawing.Size(75, 23); + this.cmdApply.TabIndex = 3; + this.cmdApply.Text = "Apply"; + this.cmdApply.Click += new System.EventHandler(this.cmdApply_Click); + // + // lstRelationship + // + this.lstRelationship.FormattingEnabled = true; + this.lstRelationship.Location = new System.Drawing.Point(6, 20); + this.lstRelationship.Name = "lstRelationship"; + this.lstRelationship.Size = new System.Drawing.Size(244, 95); + this.lstRelationship.TabIndex = 2; + // + // ToolStripImages + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.ClientSize = new System.Drawing.Size(504, 252); + this.Controls.Add(this.grp); + this.Controls.Add(this.toolStrip1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "ToolStripImages"; + this.Text = "ToolStrip Test"; + this.Load += new System.EventHandler(this.ToolStripImages_Load); + this.toolStrip1.ResumeLayout(false); + this.grp.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.GroupBox grp; + private System.Windows.Forms.ListBox lstRelationship; + private System.Windows.Forms.Button cmdApply; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripButton printToolStripButton; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton pasteToolStripButton; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripImages.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripImages.cs new file mode 100644 index 0000000..effd8ed --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripImages.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class ToolStripImages : Form + { + public ToolStripImages() + { + InitializeComponent(); + } + + private void ToolStripImages_Load(object sender, EventArgs e) + { + lstRelationship.DataSource = Enum.GetNames(typeof(TextImageRelation)); + } + + private void newToolStripButton_Click(object sender, EventArgs e) + { + ToolStripItem item = (ToolStripItem)sender; + MessageBox.Show("You clicked" + item.Text); + } + + private void cmdApply_Click(object sender, EventArgs e) + { + TextImageRelation selection; + selection = (TextImageRelation)Enum.Parse(typeof(TextImageRelation), lstRelationship.Text); + foreach (ToolStripItem item in toolStrip1.Items) + { + item.TextImageRelation = selection; + } + } + + + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripImages.resx b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripImages.resx new file mode 100644 index 0000000..d9e3e74 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripImages.resx @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripLink.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripLink.Designer.cs new file mode 100644 index 0000000..2975029 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripLink.Designer.cs @@ -0,0 +1,81 @@ +namespace Strips +{ + partial class ToolStripLink + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel(); + this.toolStripLabel2 = new System.Windows.Forms.ToolStripLabel(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripLabel1, + this.toolStripLabel2}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(236, 25); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // toolStripLabel1 + // + this.toolStripLabel1.Margin = new System.Windows.Forms.Padding(2, 1, 2, 2); + this.toolStripLabel1.Name = "toolStripLabel1"; + this.toolStripLabel1.Text = "Ordinary Label"; + // + // toolStripLabel2 + // + this.toolStripLabel2.IsLink = true; + this.toolStripLabel2.Margin = new System.Windows.Forms.Padding(2, 1, 2, 2); + this.toolStripLabel2.Name = "toolStripLabel2"; + this.toolStripLabel2.Text = "Link Label"; + // + // ToolStripLink + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(236, 82); + this.Controls.Add(this.toolStrip1); + this.Name = "ToolStripLink"; + this.Text = "ToolStripLink"; + this.toolStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripLabel toolStripLabel1; + private System.Windows.Forms.ToolStripLabel toolStripLabel2; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripLink.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripLink.cs new file mode 100644 index 0000000..2c4bfe7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripLink.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class ToolStripLink : Form + { + public ToolStripLink() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripLink.resx b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripLink.resx new file mode 100644 index 0000000..c1463e4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripLink.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripSizes.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripSizes.Designer.cs new file mode 100644 index 0000000..af6d344 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripSizes.Designer.cs @@ -0,0 +1,292 @@ +namespace Strips +{ + partial class ToolStripSizes + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ToolStripSizes)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton3 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton4 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton5 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton6 = new System.Windows.Forms.ToolStripButton(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton1, + this.toolStripSeparator1, + this.newToolStripButton, + this.toolStripSeparator2, + this.toolStripButton3, + this.toolStripSeparator3, + this.toolStripButton4, + this.toolStripSeparator4, + this.toolStripButton5, + this.toolStripSeparator5, + this.toolStripButton6, + this.toolStripSeparator6, + this.toolStripButton2}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(552, 53); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.AutoSize = false; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageAlign = System.Drawing.ContentAlignment.TopCenter; + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Size = new System.Drawing.Size(50, 50); + this.newToolStripButton.Text = "New"; + this.newToolStripButton.TextAlign = System.Drawing.ContentAlignment.TopCenter; + this.newToolStripButton.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // toolStripButton1 + // + this.toolStripButton1.AutoSize = false; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(50, 50); + this.toolStripButton1.Text = "New"; + this.toolStripButton1.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + // + // toolStripButton2 + // + this.toolStripButton2.AutoSize = false; + this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); + this.toolStripButton2.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton2.Name = "toolStripButton2"; + this.toolStripButton2.Size = new System.Drawing.Size(75, 50); + this.toolStripButton2.Text = "New"; + this.toolStripButton2.TextAlign = System.Drawing.ContentAlignment.BottomCenter; + this.toolStripButton2.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + // + // toolStripButton3 + // + this.toolStripButton3.AutoSize = false; + this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image"))); + this.toolStripButton3.ImageAlign = System.Drawing.ContentAlignment.BottomCenter; + this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton3.Name = "toolStripButton3"; + this.toolStripButton3.Size = new System.Drawing.Size(50, 50); + this.toolStripButton3.Text = "New"; + this.toolStripButton3.TextAlign = System.Drawing.ContentAlignment.BottomCenter; + this.toolStripButton3.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal; + // + // toolStripButton4 + // + this.toolStripButton4.AutoSize = false; + this.toolStripButton4.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton4.Image"))); + this.toolStripButton4.ImageAlign = System.Drawing.ContentAlignment.TopRight; + this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton4.Name = "toolStripButton4"; + this.toolStripButton4.Size = new System.Drawing.Size(75, 50); + this.toolStripButton4.Text = "New"; + this.toolStripButton4.TextAlign = System.Drawing.ContentAlignment.TopRight; + this.toolStripButton4.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal; + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + // + // toolStripButton5 + // + this.toolStripButton5.AutoSize = false; + this.toolStripButton5.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton5.Image"))); + this.toolStripButton5.ImageAlign = System.Drawing.ContentAlignment.TopCenter; + this.toolStripButton5.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton5.Name = "toolStripButton5"; + this.toolStripButton5.Size = new System.Drawing.Size(75, 50); + this.toolStripButton5.Text = "New"; + this.toolStripButton5.TextAlign = System.Drawing.ContentAlignment.TopRight; + this.toolStripButton5.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal; + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + // + // toolStripButton6 + // + this.toolStripButton6.AutoSize = false; + this.toolStripButton6.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton6.Image"))); + this.toolStripButton6.ImageAlign = System.Drawing.ContentAlignment.BottomCenter; + this.toolStripButton6.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton6.Name = "toolStripButton6"; + this.toolStripButton6.Size = new System.Drawing.Size(75, 50); + this.toolStripButton6.Text = "New"; + this.toolStripButton6.TextAlign = System.Drawing.ContentAlignment.TopCenter; + this.toolStripButton6.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal; + // + // label1 + // + this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(12, 58); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(42, 46); + this.label1.TabIndex = 1; + this.label1.Text = "Both Center Middle"; + // + // label2 + // + this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.Location = new System.Drawing.Point(73, 58); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(40, 46); + this.label2.TabIndex = 2; + this.label2.Text = "Both Top Middle"; + // + // label3 + // + this.label3.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.Location = new System.Drawing.Point(126, 58); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(40, 46); + this.label3.TabIndex = 3; + this.label3.Text = "Both Center Bottom"; + // + // label4 + // + this.label4.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label4.Location = new System.Drawing.Point(197, 58); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(40, 46); + this.label4.TabIndex = 4; + this.label4.Text = "Both Top Right"; + // + // label5 + // + this.label5.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label5.Location = new System.Drawing.Point(277, 58); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(40, 46); + this.label5.TabIndex = 5; + this.label5.Text = "Both Top Middle"; + // + // label6 + // + this.label6.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label6.Location = new System.Drawing.Point(343, 58); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(69, 46); + this.label6.TabIndex = 6; + this.label6.Text = "Text Top Middle, Image Bottom Left"; + // + // label7 + // + this.label7.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label7.Location = new System.Drawing.Point(425, 58); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(69, 46); + this.label7.TabIndex = 7; + this.label7.Text = "Text Bottom Middle, Image Center Left"; + // + // ToolStripSizes + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(552, 146); + this.Controls.Add(this.label7); + this.Controls.Add(this.label6); + this.Controls.Add(this.label5); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.toolStrip1); + this.Name = "ToolStripSizes"; + this.Text = "ToolStripSizes"; + this.toolStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripButton toolStripButton3; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripButton toolStripButton4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripButton toolStripButton5; + private System.Windows.Forms.ToolStripButton toolStripButton2; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripButton toolStripButton6; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label7; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripSizes.cs b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripSizes.cs new file mode 100644 index 0000000..3d42e27 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripSizes.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class ToolStripSizes : Form + { + public ToolStripSizes() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripSizes.resx b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripSizes.resx new file mode 100644 index 0000000..95c2459 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/ToolStripSizes.resx @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/VerticalToolStrip.Designer.cs b/Pro Windows Forms 2.0/Chapter14/Strips/VerticalToolStrip.Designer.cs new file mode 100644 index 0000000..bdc9646 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/VerticalToolStrip.Designer.cs @@ -0,0 +1,302 @@ +namespace Strips +{ + partial class VerticalToolStrip + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(VerticalToolStrip)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.printToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.pasteToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStrip2 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton3 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton4 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton5 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton6 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton7 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton8 = new System.Windows.Forms.ToolStripButton(); + this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel(); + this.toolStripLabel2 = new System.Windows.Forms.ToolStripLabel(); + this.toolStrip1.SuspendLayout(); + this.toolStrip2.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Dock = System.Windows.Forms.DockStyle.Left; + this.toolStrip1.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.printToolStripButton, + this.toolStripSeparator, + this.cutToolStripButton, + this.copyToolStripButton, + this.pasteToolStripButton, + this.toolStripSeparator1, + this.helpToolStripButton}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(50, 321); + this.toolStrip1.TabIndex = 1; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.AutoToolTip = false; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Margin = new System.Windows.Forms.Padding(0, 1, 0, 5); + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Text = "&New"; + // + // openToolStripButton + // + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Text = "&Open"; + // + // saveToolStripButton + // + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Text = "&Save"; + // + // printToolStripButton + // + this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image"))); + this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripButton.Name = "printToolStripButton"; + this.printToolStripButton.Text = "&Print"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + // + // cutToolStripButton + // + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Text = "C&ut"; + // + // copyToolStripButton + // + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Text = "&Copy"; + // + // pasteToolStripButton + // + this.pasteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripButton.Image"))); + this.pasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripButton.Name = "pasteToolStripButton"; + this.pasteToolStripButton.Text = "&Paste"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // helpToolStripButton + // + this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image"))); + this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Text = "He&lp"; + // + // toolStrip2 + // + this.toolStrip2.AutoSize = false; + this.toolStrip2.Dock = System.Windows.Forms.DockStyle.Right; + this.toolStrip2.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripLabel1, + this.toolStripButton1, + this.toolStripButton2, + this.toolStripButton3, + this.toolStripButton4, + this.toolStripSeparator2, + this.toolStripLabel2, + this.toolStripButton5, + this.toolStripButton6, + this.toolStripButton7, + this.toolStripSeparator3, + this.toolStripButton8}); + this.toolStrip2.Location = new System.Drawing.Point(262, 0); + this.toolStrip2.Name = "toolStrip2"; + this.toolStrip2.Size = new System.Drawing.Size(30, 321); + this.toolStrip2.TabIndex = 2; + this.toolStrip2.Text = "toolStrip2"; + // + // toolStripButton1 + // + this.toolStripButton1.AutoToolTip = false; + this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Margin = new System.Windows.Forms.Padding(0, 1, 0, 5); + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Text = "&New"; + this.toolStripButton1.TextDirection = System.Windows.Forms.ToolStripTextDirection.Vertical90; + this.toolStripButton1.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + // + // toolStripButton2 + // + this.toolStripButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); + this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton2.Name = "toolStripButton2"; + this.toolStripButton2.Text = "&Open"; + // + // toolStripButton3 + // + this.toolStripButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image"))); + this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton3.Name = "toolStripButton3"; + this.toolStripButton3.Text = "&Save"; + // + // toolStripButton4 + // + this.toolStripButton4.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton4.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton4.Image"))); + this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton4.Name = "toolStripButton4"; + this.toolStripButton4.Text = "&Print"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + // + // toolStripButton5 + // + this.toolStripButton5.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton5.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton5.Image"))); + this.toolStripButton5.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton5.Name = "toolStripButton5"; + this.toolStripButton5.Text = "C&ut"; + // + // toolStripButton6 + // + this.toolStripButton6.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton6.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton6.Image"))); + this.toolStripButton6.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton6.Name = "toolStripButton6"; + this.toolStripButton6.Text = "&Copy"; + // + // toolStripButton7 + // + this.toolStripButton7.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton7.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton7.Image"))); + this.toolStripButton7.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton7.Name = "toolStripButton7"; + this.toolStripButton7.Text = "&Paste"; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + // + // toolStripButton8 + // + this.toolStripButton8.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton8.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton8.Image"))); + this.toolStripButton8.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton8.Name = "toolStripButton8"; + this.toolStripButton8.Text = "He&lp"; + // + // toolStripLabel1 + // + this.toolStripLabel1.Name = "toolStripLabel1"; + this.toolStripLabel1.Text = "File"; + this.toolStripLabel1.TextDirection = System.Windows.Forms.ToolStripTextDirection.Vertical90; + // + // toolStripLabel2 + // + this.toolStripLabel2.Name = "toolStripLabel2"; + this.toolStripLabel2.Text = "Editing"; + this.toolStripLabel2.TextDirection = System.Windows.Forms.ToolStripTextDirection.Vertical90; + // + // VerticalToolStrip + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 321); + this.Controls.Add(this.toolStrip2); + this.Controls.Add(this.toolStrip1); + this.Name = "VerticalToolStrip"; + this.Text = "VerticalToolStrip"; + this.toolStrip1.ResumeLayout(false); + this.toolStrip2.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripButton printToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton pasteToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + private System.Windows.Forms.ToolStrip toolStrip2; + private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.ToolStripButton toolStripButton2; + private System.Windows.Forms.ToolStripButton toolStripButton3; + private System.Windows.Forms.ToolStripButton toolStripButton4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripButton toolStripButton5; + private System.Windows.Forms.ToolStripButton toolStripButton6; + private System.Windows.Forms.ToolStripButton toolStripButton7; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripButton toolStripButton8; + private System.Windows.Forms.ToolStripLabel toolStripLabel1; + private System.Windows.Forms.ToolStripLabel toolStripLabel2; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/VerticalToolStrip.cs b/Pro Windows Forms 2.0/Chapter14/Strips/VerticalToolStrip.cs new file mode 100644 index 0000000..a4e95ea --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/VerticalToolStrip.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Strips +{ + public partial class VerticalToolStrip : Form + { + public VerticalToolStrip() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/VerticalToolStrip.resx b/Pro Windows Forms 2.0/Chapter14/Strips/VerticalToolStrip.resx new file mode 100644 index 0000000..a23f998 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter14/Strips/VerticalToolStrip.resx @@ -0,0 +1,366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + + 17, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/bin/Debug/Strips.exe b/Pro Windows Forms 2.0/Chapter14/Strips/bin/Debug/Strips.exe new file mode 100644 index 0000000..3776045 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/Strips/bin/Debug/Strips.exe differ diff --git a/Pro Windows Forms 2.0/Chapter14/Strips/bin/Release/Strips.exe b/Pro Windows Forms 2.0/Chapter14/Strips/bin/Release/Strips.exe new file mode 100644 index 0000000..b8bdd4a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter14/Strips/bin/Release/Strips.exe differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarCell.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarCell.cs new file mode 100644 index 0000000..3970ee2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarCell.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewCustomization +{ + public class CalendarColumn : DataGridViewColumn + { + public CalendarColumn() + : base(new CalendarCell()) {} + + public override DataGridViewCell CellTemplate + { + get + { + return base.CellTemplate; + } + set + { + // Ensure that the cell used for the template is a CalendarCell. + if (value != null && + !value.GetType().IsAssignableFrom(typeof(CalendarCell))) + { + throw new InvalidCastException("Must be a CalendarCell"); + } + base.CellTemplate = value; + } + } + } + + public class CalendarCell : DataGridViewTextBoxCell + { + + public CalendarCell() + : base() + { + // Use the short date format. + this.Style.Format = "d"; + } + + public override void InitializeEditingControl(int rowIndex, object + initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) + { + // Set the value of the editing control to the current cell value. + base.InitializeEditingControl(rowIndex, initialFormattedValue, + dataGridViewCellStyle); + CalendarEditingControl ctl = + DataGridView.EditingControl as CalendarEditingControl; + ctl.Value = (DateTime)this.Value; + } + + public override Type EditType + { + get + { + // Return the type of the editing contol that CalendarCell uses. + return typeof(CalendarEditingControl); + } + } + + public override Type ValueType + { + get + { + // Return the type of the value that CalendarCell contains. + return typeof(DateTime); + } + } + + public override object DefaultNewRowValue + { + get + { + // Use the current date and time as the default value. + return DateTime.Now; + } + } + } + + public class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl + { + private DataGridView dataGridView; + private bool valueChanged = false; + private int rowIndex; + + public CalendarEditingControl() + { + this.Format = DateTimePickerFormat.Short; + } + + // Implements the IDataGridViewEditingControl.EditingControlFormattedValue + // property. + public object EditingControlFormattedValue + { + get + { + return this.Value.ToShortDateString(); + } + set + { + String newValue = value as String; + if (newValue != null) + { + this.Value = DateTime.Parse(newValue); + } + } + } + + // Implements the + // IDataGridViewEditingControl.GetEditingControlFormattedValue method. + public object GetEditingControlFormattedValue( + DataGridViewDataErrorContexts context) + { + return EditingControlFormattedValue; + } + + // Implements the + // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method. + public void ApplyCellStyleToEditingControl( + DataGridViewCellStyle dataGridViewCellStyle) + { + this.Font = dataGridViewCellStyle.Font; + this.CalendarForeColor = dataGridViewCellStyle.ForeColor; + this.CalendarMonthBackground = dataGridViewCellStyle.BackColor; + } + + // Implements the IDataGridViewEditingControl.EditingControlRowIndex + // property. + public int EditingControlRowIndex + { + get + { + return rowIndex; + } + set + { + rowIndex = value; + } + } + + // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey + // method. + public bool EditingControlWantsInputKey( + Keys key, bool dataGridViewWantsInputKey) + { + // Let the DateTimePicker handle the keys listed. + switch (key & Keys.KeyCode) + { + case Keys.Left: + case Keys.Up: + case Keys.Down: + case Keys.Right: + case Keys.Home: + case Keys.End: + case Keys.PageDown: + case Keys.PageUp: + return true; + default: + return false; + } + } + + // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit + // method. + public void PrepareEditingControlForEdit(bool selectAll) + { + // No preparation needs to be done. + } + + // Implements the IDataGridViewEditingControl + // .RepositionEditingControlOnValueChange property. + public bool RepositionEditingControlOnValueChange + { + get + { + return false; + } + } + + // Implements the IDataGridViewEditingControl + // .EditingControlDataGridView property. + public DataGridView EditingControlDataGridView + { + get + { + return dataGridView; + } + set + { + dataGridView = value; + } + } + + // Implements the IDataGridViewEditingControl + // .EditingControlValueChanged property. + public bool EditingControlValueChanged + { + get + { + return valueChanged; + } + set + { + valueChanged = value; + } + } + + // Implements the IDataGridViewEditingControl + // .EditingPanelCursor property. + public Cursor EditingPanelCursor + { + get + { + return base.Cursor; + } + } + + protected override void OnValueChanged(EventArgs eventargs) + { + + // Notify the DataGridView that the contents of the cell + // have changed. + valueChanged = true; + this.EditingControlDataGridView.NotifyCurrentCellDirty(true); + base.OnValueChanged(eventargs); + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarControlCell.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarControlCell.Designer.cs new file mode 100644 index 0000000..856ccb5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarControlCell.Designer.cs @@ -0,0 +1,64 @@ +namespace DataGridViewCustomization +{ + partial class CalendarControlCell + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(4, 4); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(387, 315); + this.dataGridView1.TabIndex = 2; + this.dataGridView1.Text = "dataGridView1"; + // + // CalendarControlCell + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(395, 325); + this.Controls.Add(this.dataGridView1); + this.Name = "CalendarControlCell"; + this.Text = "CalendarControlCell"; + this.Load += new System.EventHandler(this.CalendarControlCell_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarControlCell.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarControlCell.cs new file mode 100644 index 0000000..f9d8ffa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarControlCell.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewCustomization +{ + public partial class CalendarControlCell : Form + { + public CalendarControlCell() + { + InitializeComponent(); + } + + private void CalendarControlCell_Load(object sender, EventArgs e) + { + CalendarColumn col = new CalendarColumn(); + this.dataGridView1.Columns.Add(col); + this.dataGridView1.RowCount = 5; + foreach (DataGridViewRow row in this.dataGridView1.Rows) + { + row.Cells[0].Value = DateTime.Now; + } + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarControlCell.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarControlCell.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CalendarControlCell.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CellPainting.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CellPainting.Designer.cs new file mode 100644 index 0000000..52558d5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CellPainting.Designer.cs @@ -0,0 +1,66 @@ +namespace DataGridViewCustomization +{ + partial class CellPainting + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(5, 3); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(388, 315); + this.dataGridView1.TabIndex = 0; + this.dataGridView1.Text = "dataGridView1"; + this.dataGridView1.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.dataGridView1_CellPainting); + // + // CellPainting + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(399, 330); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "CellPainting"; + this.Text = "CellPainting"; + this.Load += new System.EventHandler(this.CellPainting_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CellPainting.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CellPainting.cs new file mode 100644 index 0000000..268af0c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CellPainting.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace DataGridViewCustomization +{ + public partial class CellPainting : Form + { + public CellPainting() + { + InitializeComponent(); + } + + private void CellPainting_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + + } + + //private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) + //{ + // // Only paint the desired column and + // // don't paint headers. + // if ((e.ColumnIndex == 0) && (e.RowIndex >= 0)) + // { + // // If the cell is selected, use the normal painting + // // instead of the custom painting. + // if ((e.State & DataGridViewElementStates.Selected) != + // DataGridViewElementStates.Selected) + // { + // // Suppress normal cell painting. + // e.Handled = true; + + // // Get the rectangle where painting will take place. + // Rectangle rect = new Rectangle(e.CellBounds.X, e.CellBounds.Y, + // e.CellBounds.Width - 1, e.CellBounds.Height - 1); + + // // Render the custom cell background. + // using (LinearGradientBrush brush = new LinearGradientBrush(rect, + // Color.White, Color.YellowGreen, 35f)) + // { + // e.Graphics.FillRectangle(brush, rect); + // } + + // // Render the standard cell border. + // using (Pen pen = new Pen(dataGridView1.GridColor)) + // { + // e.Graphics.DrawRectangle(pen, e.CellBounds.X - 1, + // e.CellBounds.Y - 1, e.CellBounds.Width, e.CellBounds.Height); + // } + + // // Render the cell text. + // string cellValue = e.FormattedValue.ToString(); + + // // Set the alignment settings. Unfortunately, there's no + // // straightforward way to get the cell style settings and + // // convert them to the text alignment values you need here. + // StringFormat format = new StringFormat(); + // format.LineAlignment = StringAlignment.Center; + // format.Alignment = StringAlignment.Near; + + // using (Brush valueBrush = new SolidBrush(e.CellStyle.ForeColor)) + // { + // e.Graphics.DrawString(cellValue, e.CellStyle.Font, valueBrush, + // rect, format); + // } + // } + // } + + private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) + { + // Only paint the desired column and + // don't paint headers. + if ((e.ColumnIndex == 0) && (e.RowIndex >= 0)) + { + // If the cell is selected, use the normal painting + // instead of the custom painting. + if ((e.State & DataGridViewElementStates.Selected) != + DataGridViewElementStates.Selected) + { + // Suppress normal cell painting. + e.Handled = true; + + // Get the rectangle where painting will take place. + Rectangle rect = new Rectangle(e.CellBounds.X, e.CellBounds.Y, + e.CellBounds.Width - 1, e.CellBounds.Height - 1); + + // Render the custom cell background. + using (LinearGradientBrush brush = new LinearGradientBrush(rect, + Color.White, Color.YellowGreen, 35f)) + { + e.Graphics.FillRectangle(brush, rect); + } + + // Paint the cell text, the border, and the error icon (if needed). + // Don't worry about the focus rectangle or selection background, + // because we aren't painting selected cells. + e.Paint(e.ClipBounds, + DataGridViewPaintParts.ContentForeground | + DataGridViewPaintParts.Border | + DataGridViewPaintParts.ErrorIcon | + DataGridViewPaintParts.Focus); + } + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CellPainting.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CellPainting.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CellPainting.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CustomCell.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CustomCell.Designer.cs new file mode 100644 index 0000000..31de9c2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CustomCell.Designer.cs @@ -0,0 +1,64 @@ +namespace DataGridViewCustomization +{ + partial class CustomCell + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(8, 9); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(403, 315); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.Text = "dataGridView1"; + // + // CustomCell + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(421, 333); + this.Controls.Add(this.dataGridView1); + this.Name = "CustomCell"; + this.Text = "CustomCell"; + this.Load += new System.EventHandler(this.CustomCell_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CustomCell.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CustomCell.cs new file mode 100644 index 0000000..87657f5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CustomCell.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewCustomization +{ + public partial class CustomCell : Form + { + public CustomCell() + { + InitializeComponent(); + } + + private void CustomCell_Load(object sender, EventArgs e) + { + + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + + // Hide the ordinary version of this column. + dataGridView1.Columns[0].Visible = false; + + // Create custom column. + GradientRolloverColumn colGradient = new GradientRolloverColumn(Color.SlateBlue); + colGradient.DataPropertyName = dataGridView1.Columns[0].DataPropertyName; + colGradient.HeaderText = dataGridView1.Columns[0].HeaderText; + colGradient.Width = dataGridView1.Columns[0].Width; + colGradient.ReadOnly = dataGridView1.Columns[0].ReadOnly; + colGradient.ValueType = dataGridView1.Columns[0].ValueType; + colGradient.DisplayIndex = 0; + + // Add the custom column. + dataGridView1.Columns.Add(colGradient); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CustomCell.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CustomCell.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/CustomCell.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.csproj b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.csproj new file mode 100644 index 0000000..7443c3f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.csproj @@ -0,0 +1,105 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {25C2AF07-223C-4F69-983F-7F3CB7A2B9AA} + WinExe + Properties + DataGridViewCustomization + DataGridViewCustomization + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Component + + + Form + + + CalendarControlCell.cs + + + Form + + + CellPainting.cs + + + Form + + + CustomCell.cs + + + + + Form + + + Menu.cs + + + + + Designer + CalendarControlCell.cs + + + CellPainting.cs + + + CustomCell.cs + + + Menu.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.csproj.user b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.sln b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.sln new file mode 100644 index 0000000..d8b215b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataGridViewCustomization", "DataGridViewCustomization.csproj", "{25C2AF07-223C-4F69-983F-7F3CB7A2B9AA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {25C2AF07-223C-4F69-983F-7F3CB7A2B9AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {25C2AF07-223C-4F69-983F-7F3CB7A2B9AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25C2AF07-223C-4F69-983F-7F3CB7A2B9AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {25C2AF07-223C-4F69-983F-7F3CB7A2B9AA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.suo b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.suo new file mode 100644 index 0000000..44a599a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/DataGridViewCustomization.suo differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/GradientRolloverCell.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/GradientRolloverCell.cs new file mode 100644 index 0000000..5e6342b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/GradientRolloverCell.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; +using System.Drawing; + +namespace DataGridViewCustomization +{ + public class GradientRolloverCell : DataGridViewTextBoxCell + { + private static int inCell = -1; + + protected override void OnMouseEnter(int rowIndex) + { + inCell = rowIndex; + + // Invalidate the cell. + this.DataGridView.InvalidateCell(this.ColumnIndex, rowIndex); + } + + protected override void OnMouseLeave(int rowIndex) + { + inCell = -1; + + // Invalidate the cell. + this.DataGridView.InvalidateCell(this.ColumnIndex, rowIndex); + } + + protected override void Paint(System.Drawing.Graphics graphics, System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) + { + // Is the mouse hovering over this cell? + if ((inCell == rowIndex) && + ((cellState & DataGridViewElementStates.Selected) != + DataGridViewElementStates.Selected)) + { + // Get the rectangle where painting will take place. + Rectangle rect = new Rectangle(cellBounds.X, cellBounds.Y, + cellBounds.Width - 1, cellBounds.Height - 1); + + // Render the custom cell background. + Color gradientColor; + GradientRolloverColumn gradientColumn = this.OwningColumn as GradientRolloverColumn; + if (gradientColumn != null) + { + gradientColor = ((GradientRolloverColumn)base.OwningColumn).GradientColor; + } + else + { + gradientColor = Color.Blue; + } + + + using (LinearGradientBrush brush = new LinearGradientBrush(rect, + Color.White, gradientColor, 35f)) + { + graphics.FillRectangle(brush, rect); + } + + base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, + value, formattedValue, errorText, cellStyle, advancedBorderStyle, + paintParts & ~(DataGridViewPaintParts.Background | DataGridViewPaintParts.SelectionBackground)); + } + else + { + // Perform the standard painting. + base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, + value, formattedValue, errorText, cellStyle, advancedBorderStyle, + paintParts); + } + } + } + public class GradientRolloverColumn : System.Windows.Forms.DataGridViewColumn + { + public GradientRolloverColumn(Color gradientColor) + { + GradientColor = gradientColor; + base.CellTemplate = new GradientRolloverCell(); + } + + private Color color; + public Color GradientColor + { + get { return color; } + set { color = value; } + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Menu.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Menu.cs new file mode 100644 index 0000000..8f24706 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Menu.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace DataGridViewCustomization +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("DataGridViewCustomization." + ctrl.Text); + frm.ShowDialog(); + } + + private void Menu_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Menu.designer.cs new file mode 100644 index 0000000..248cf8a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Menu.designer.cs @@ -0,0 +1,87 @@ +namespace DataGridViewCustomization +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 7); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(124, 23); + this.button1.TabIndex = 0; + this.button1.Text = "CellPainting"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button11 + // + this.button11.Location = new System.Drawing.Point(12, 31); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(124, 23); + this.button11.TabIndex = 10; + this.button11.Text = "CustomCell"; + this.button11.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 57); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(124, 23); + this.button2.TabIndex = 11; + this.button2.Text = "CalendarControlCell"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 205); + this.Controls.Add(this.button2); + this.Controls.Add(this.button11); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.Load += new System.EventHandler(this.Menu_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.Button button2; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Menu.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Program.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Program.cs new file mode 100644 index 0000000..ae6e052 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DataGridViewCustomization +{ + static class Program + { + private static StoreDB storeDB = new StoreDB(); + public static StoreDB StoreDB + { + get { return storeDB; } + } + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5684946 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DataGridViewCustomization")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DataGridViewCustomization")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3d73d20d-56d7-4486-bd37-f10e2e56081a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Resources.Designer.cs new file mode 100644 index 0000000..e23a3d5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DataGridViewCustomization.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DataGridViewCustomization.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DataGridViewCustomization.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace DataGridViewCustomization.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DataGridViewCustomization.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Settings.Designer.cs new file mode 100644 index 0000000..70d36b4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Settings.Designer.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="DataGridViewCustomization.Properties.Settings.get_Default():DataGridViewCustomiza" + + "tion.Properties.Settings")] + +namespace DataGridViewCustomization.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=localhost;Initial Catalog=Store;Integrated Security=True")] + public string Store { + get { + return ((string)(this["Store"])); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Settings.settings new file mode 100644 index 0000000..c33915a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/Properties/Settings.settings @@ -0,0 +1,11 @@ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/StoreDB.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/StoreDB.cs new file mode 100644 index 0000000..90a7a55 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/StoreDB.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +namespace DataGridViewCustomization +{ + public class StoreDB + { + public DataTable GetProducts() + { + string connectionString = Properties.Settings.Default.Store; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetProducts", con); + cmd.CommandType = CommandType.StoredProcedure; + SqlDataAdapter adapter = new SqlDataAdapter(cmd); + + DataSet ds = new DataSet(); + // Get read-only column info. + adapter.FillSchema(ds, SchemaType.Mapped, "Products"); + // Fill the table. + adapter.Fill(ds, "Products"); + return ds.Tables[0]; + } + + public DataSet GetCategoriesAndProducts() + { + string connectionString = Properties.Settings.Default.Store; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetProducts", con); + cmd.CommandType = CommandType.StoredProcedure; + SqlDataAdapter adapter = new SqlDataAdapter(cmd); + + DataSet ds = new DataSet(); + adapter.Fill(ds, "Products"); + cmd.CommandText = "GetCategories"; + adapter.Fill(ds, "Categories"); + + ds.Relations.Add("Cat_Prod", + ds.Tables["Categories"].Columns["CategoryID"], + ds.Tables["Products"].Columns["CategoryID"]); + return ds; + } + + public string ValidateProduct(DataRow row) + { + string errors = ""; + + if (((decimal)row["UnitCost"]) <= 0) + { + errors += "* UnitCost value too low\n"; + } + if (row["ModelNumber"].ToString() == "") + { + errors += "* You must specify a ModelNumber\n"; + } + if (row["ModelName"].ToString() == "") + { + errors += "* You must specify a ModelName\n"; + } + return errors; + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/app.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/app.config new file mode 100644 index 0000000..4bb61c9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/app.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Debug/DataGridViewCustomization.exe b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Debug/DataGridViewCustomization.exe new file mode 100644 index 0000000..d1e722d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Debug/DataGridViewCustomization.exe differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Debug/DataGridViewCustomization.exe.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Debug/DataGridViewCustomization.exe.config new file mode 100644 index 0000000..879c558 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Debug/DataGridViewCustomization.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Debug/DataGridViewCustomization.vshost.exe.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Debug/DataGridViewCustomization.vshost.exe.config new file mode 100644 index 0000000..879c558 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Debug/DataGridViewCustomization.vshost.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Release/DataGridViewCustomization.exe b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Release/DataGridViewCustomization.exe new file mode 100644 index 0000000..c49d09f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Release/DataGridViewCustomization.exe differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Release/DataGridViewCustomization.exe.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Release/DataGridViewCustomization.exe.config new file mode 100644 index 0000000..879c558 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewCustomization/bin/Release/DataGridViewCustomization.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/AutoResize.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/AutoResize.Designer.cs new file mode 100644 index 0000000..feafe28 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/AutoResize.Designer.cs @@ -0,0 +1,171 @@ +namespace DataGridViewTest +{ + partial class AutoResize + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.panel1 = new System.Windows.Forms.Panel(); + this.optWrapDesc = new System.Windows.Forms.RadioButton(); + this.optNoWrap = new System.Windows.Forms.RadioButton(); + this.optAllWrap = new System.Windows.Forms.RadioButton(); + this.lstAutoSizeRows = new System.Windows.Forms.ComboBox(); + this.lstAutoSizeColumns = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(5, 5); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(493, 317); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.Text = "dataGridView1"; + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.Controls.Add(this.optWrapDesc); + this.panel1.Controls.Add(this.optNoWrap); + this.panel1.Controls.Add(this.optAllWrap); + this.panel1.Controls.Add(this.lstAutoSizeRows); + this.panel1.Controls.Add(this.lstAutoSizeColumns); + this.panel1.Controls.Add(this.label2); + this.panel1.Controls.Add(this.label1); + this.panel1.Location = new System.Drawing.Point(5, 332); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(493, 51); + this.panel1.TabIndex = 2; + // + // optWrapDesc + // + this.optWrapDesc.AutoSize = true; + this.optWrapDesc.Location = new System.Drawing.Point(331, 33); + this.optWrapDesc.Name = "optWrapDesc"; + this.optWrapDesc.Size = new System.Drawing.Size(132, 17); + this.optWrapDesc.TabIndex = 6; + this.optWrapDesc.Text = "Wrap Description Only"; + this.optWrapDesc.CheckedChanged += new System.EventHandler(this.optWrapDesc_CheckedChanged); + // + // optNoWrap + // + this.optNoWrap.AutoSize = true; + this.optNoWrap.Location = new System.Drawing.Point(331, 17); + this.optNoWrap.Name = "optNoWrap"; + this.optNoWrap.Size = new System.Drawing.Size(110, 17); + this.optNoWrap.TabIndex = 5; + this.optNoWrap.Text = "Wrap No Columns"; + this.optNoWrap.CheckedChanged += new System.EventHandler(this.optNoWrap_CheckedChanged); + // + // optAllWrap + // + this.optAllWrap.AutoSize = true; + this.optAllWrap.Location = new System.Drawing.Point(331, 1); + this.optAllWrap.Name = "optAllWrap"; + this.optAllWrap.Size = new System.Drawing.Size(108, 17); + this.optAllWrap.TabIndex = 4; + this.optAllWrap.Text = "Wrap All Columns"; + this.optAllWrap.CheckedChanged += new System.EventHandler(this.optAllWrap_CheckedChanged); + // + // lstAutoSizeRows + // + this.lstAutoSizeRows.CausesValidation = false; + this.lstAutoSizeRows.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.lstAutoSizeRows.FormattingEnabled = true; + this.lstAutoSizeRows.Location = new System.Drawing.Point(133, 24); + this.lstAutoSizeRows.Name = "lstAutoSizeRows"; + this.lstAutoSizeRows.Size = new System.Drawing.Size(144, 21); + this.lstAutoSizeRows.TabIndex = 3; + this.lstAutoSizeRows.SelectedIndexChanged += new System.EventHandler(this.lst_SelectedIndexChanged); + // + // lstAutoSizeColumns + // + this.lstAutoSizeColumns.CausesValidation = false; + this.lstAutoSizeColumns.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.lstAutoSizeColumns.FormattingEnabled = true; + this.lstAutoSizeColumns.Location = new System.Drawing.Point(133, 1); + this.lstAutoSizeColumns.Name = "lstAutoSizeColumns"; + this.lstAutoSizeColumns.Size = new System.Drawing.Size(144, 21); + this.lstAutoSizeColumns.TabIndex = 2; + this.lstAutoSizeColumns.SelectedIndexChanged += new System.EventHandler(this.lst_SelectedIndexChanged); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(26, 27); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(105, 13); + this.label2.TabIndex = 1; + this.label2.Text = "AutoSizeRowsMode:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 7); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(119, 13); + this.label1.TabIndex = 0; + this.label1.Text = "AutoSizeColumnsMode:"; + // + // AutoResize + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(510, 389); + this.Controls.Add(this.panel1); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "AutoResize"; + this.Text = "AutoResize"; + this.Load += new System.EventHandler(this.AutoResize_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.ComboBox lstAutoSizeColumns; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox lstAutoSizeRows; + private System.Windows.Forms.RadioButton optNoWrap; + private System.Windows.Forms.RadioButton optAllWrap; + private System.Windows.Forms.RadioButton optWrapDesc; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/AutoResize.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/AutoResize.cs new file mode 100644 index 0000000..4c5fb79 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/AutoResize.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class AutoResize : Form + { + public AutoResize() + { + InitializeComponent(); + } + + private void AutoResize_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + + foreach (DataGridViewColumn col in dataGridView1.Columns) + { + col.Visible = false; + } + dataGridView1.Columns["ProductID"].Visible = true; + dataGridView1.Columns["ModelName"].Visible = true; + dataGridView1.Columns["Description"].Visible = true; + + lstAutoSizeRows.Items.AddRange(Enum.GetNames(typeof(DataGridViewAutoSizeRowsMode))); + lstAutoSizeColumns.Items.AddRange(Enum.GetNames(typeof(DataGridViewAutoSizeColumnsMode))); + + lstAutoSizeColumns.Text = dataGridView1.AutoSizeColumnsMode.ToString(); + lstAutoSizeRows.Text = dataGridView1.AutoSizeRowsMode.ToString(); + + + } + + + private void lst_SelectedIndexChanged(object sender, EventArgs e) + { + if (lstAutoSizeColumns.Text == "" || lstAutoSizeRows.Text == "") return; + dataGridView1.AutoSizeColumnsMode = (DataGridViewAutoSizeColumnsMode)Enum.Parse(typeof(DataGridViewAutoSizeColumnsMode), lstAutoSizeColumns.Text); + dataGridView1.AutoSizeRowsMode = (DataGridViewAutoSizeRowsMode)Enum.Parse(typeof(DataGridViewAutoSizeRowsMode), lstAutoSizeRows.Text); + } + + private void optAllWrap_CheckedChanged(object sender, EventArgs e) + { + dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True; + } + + private void optNoWrap_CheckedChanged(object sender, EventArgs e) + { + dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.False; + dataGridView1.Columns["Description"].DefaultCellStyle.WrapMode = DataGridViewTriState.False; + } + + private void optWrapDesc_CheckedChanged(object sender, EventArgs e) + { + dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.False; + dataGridView1.Columns["Description"].DefaultCellStyle.WrapMode = DataGridViewTriState.True; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/AutoResize.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/AutoResize.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/AutoResize.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Barebones.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Barebones.Designer.cs new file mode 100644 index 0000000..b6df32d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Barebones.Designer.cs @@ -0,0 +1,66 @@ +namespace DataGridViewTest +{ + partial class Barebones + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(4, 3); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(390, 291); + this.dataGridView1.TabIndex = 0; + this.dataGridView1.Text = "dataGridView1"; + // + // Barebones + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(397, 318); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Barebones"; + this.Text = "Bare-Bones Data Binding"; + this.Load += new System.EventHandler(this.Barebones_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Barebones.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Barebones.cs new file mode 100644 index 0000000..b8d978b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Barebones.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Diagnostics; +using System.Text.RegularExpressions; + +namespace DataGridViewTest +{ + public partial class Barebones : Form + { + public Barebones() + { + InitializeComponent(); + } + + private void Barebones_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + + foreach (DataGridViewRow row in dataGridView1.Rows) + { + if (!row.IsNewRow && Convert.ToInt32(row.Cells["UnitCost"].Value) > 50) + { + Debug.WriteLine(row.Cells["ProductID"].Value); + } + } + + foreach (DataGridViewColumn col in dataGridView1.Columns) + { + col.HeaderText = Regex.Replace(col.HeaderText, @"(\p{Ll})(\p{Lu})|_+", "$1 $2"); + } + } + + + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Barebones.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Barebones.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Barebones.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/BoundImage.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/BoundImage.Designer.cs new file mode 100644 index 0000000..a43d5a2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/BoundImage.Designer.cs @@ -0,0 +1,66 @@ +namespace DataGridViewTest +{ + partial class BoundImage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(4, 5); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(405, 306); + this.dataGridView1.TabIndex = 2; + this.dataGridView1.Text = "dataGridView1"; + this.dataGridView1.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dataGridView1_CellFormatting); + // + // BoundImage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(413, 324); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "BoundImage"; + this.Text = "BoundImage"; + this.Load += new System.EventHandler(this.BoundImage_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/BoundImage.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/BoundImage.cs new file mode 100644 index 0000000..2cd4a52 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/BoundImage.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.IO; + +namespace DataGridViewTest +{ + public partial class BoundImage : Form + { + public BoundImage() + { + InitializeComponent(); + } + + private void BoundImage_Load(object sender, EventArgs e) + { + // Bind the grid. + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + + foreach (DataGridViewColumn col in dataGridView1.Columns) + { + col.Visible = false; + } + // Retrieve the columns you need to work with. + DataGridViewColumn colID = dataGridView1.Columns["ProductID"]; + DataGridViewColumn colModel = dataGridView1.Columns["ModelName"]; + + colID.Visible = true; + colModel.Visible = true; + + // Create a new image column. + DataGridViewImageColumn imageCol = new DataGridViewImageColumn(); + imageCol.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + imageCol.ImageLayout = DataGridViewImageCellLayout.Normal; + imageCol.Name = "Image"; + dataGridView1.Columns.Add(imageCol); + + // Make sure pictures are visible. + dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; + } + + private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + // Check if it's the Image column. + if ((dataGridView1.Columns[e.ColumnIndex].Name == "Image")) + { + // Set the value based on the hidden ProductImage column. + string fileName = Application.StartupPath + "\\" + + dataGridView1.Rows[e.RowIndex].Cells["ProductImage"].Value; + if (File.Exists(fileName)) + { + e.Value = Image.FromFile(fileName); + } + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/BoundImage.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/BoundImage.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/BoundImage.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonColumn.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonColumn.Designer.cs new file mode 100644 index 0000000..77dd181 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonColumn.Designer.cs @@ -0,0 +1,66 @@ +namespace DataGridViewTest +{ + partial class ButtonColumn + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(3, 3); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(390, 291); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.Text = "dataGridView1"; + this.dataGridView1.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellClick); + // + // ButtonColumn + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(396, 304); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "ButtonColumn"; + this.Text = "ButtonColumn"; + this.Load += new System.EventHandler(this.ButtonColumn_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonColumn.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonColumn.cs new file mode 100644 index 0000000..33f8910 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonColumn.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class ButtonColumn : Form + { + public ButtonColumn() + { + InitializeComponent(); + } + + private void ButtonColumn_Load(object sender, EventArgs e) + { + DataSet ds = Program.StoreDB.GetCategoriesAndProducts(); + dataGridView1.DataSource = ds.Tables["Categories"]; + + DataGridViewButtonColumn detailsCol = new DataGridViewButtonColumn(); + detailsCol.Name = "Details"; + detailsCol.Text = "Details..."; + + detailsCol.UseColumnTextForButtonValue = true; + dataGridView1.Columns.Insert(dataGridView1.Columns.Count, detailsCol); + + dataGridView1.AllowUserToAddRows = false; + } + + private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) + { + if (dataGridView1.Columns[e.ColumnIndex].Name == "Details") + { + // Create the new form. + ChildForm frm = new ChildForm(); + + // Provide the OrderID to the new form. + frm.CategoryID = Convert.ToInt32( + dataGridView1.Rows[e.RowIndex].Cells["CategoryID"].Value); + + // Show the form. + frm.ShowDialog(); + frm.Dispose(); + } + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonColumn.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonColumn.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonColumn.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonForm.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonForm.Designer.cs new file mode 100644 index 0000000..b106b8c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonForm.Designer.cs @@ -0,0 +1,38 @@ +namespace DataGridViewTest +{ + partial class ButtonForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "ButtonForm"; + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonForm.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonForm.cs new file mode 100644 index 0000000..44492d6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonForm.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class ButtonForm : Form + { + public ButtonForm() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonForm.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonForm.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ButtonForm.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ChildForm.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ChildForm.Designer.cs new file mode 100644 index 0000000..d38ff46 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ChildForm.Designer.cs @@ -0,0 +1,65 @@ +namespace DataGridViewTest +{ + partial class ChildForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(3, 2); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(380, 322); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.Text = "dataGridView1"; + // + // ChildForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(387, 357); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "ChildForm"; + this.Text = "ChildForm"; + this.Load += new System.EventHandler(this.ChildForm_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ChildForm.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ChildForm.cs new file mode 100644 index 0000000..1134496 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ChildForm.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class ChildForm : Form + { + public ChildForm() + { + InitializeComponent(); + } + + private void ChildForm_Load(object sender, EventArgs e) + { + + } + + private int categoryID; + + public int CategoryID + { + get + { + return categoryID; + } + set + { + categoryID = value; + DataSet ds = Program.StoreDB.GetCategoriesAndProducts(); + dataGridView1.DataSource = ds.Tables["Products"]; + ds.Tables["Products"].DefaultView.RowFilter = + "CategoryID =" + categoryID.ToString(); + } + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ChildForm.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ChildForm.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ChildForm.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/CustomSorting.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/CustomSorting.Designer.cs new file mode 100644 index 0000000..7cf72e2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/CustomSorting.Designer.cs @@ -0,0 +1,67 @@ +namespace DataGridViewTest +{ + partial class CustomSorting + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(5, 6); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(378, 291); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.Text = "dataGridView1"; + this.dataGridView1.SortCompare += new System.Windows.Forms.DataGridViewSortCompareEventHandler(this.dataGridView1_SortCompare); + this.dataGridView1.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridView1_ColumnHeaderMouseClick); + // + // CustomSorting + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(389, 326); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "CustomSorting"; + this.Text = "Custom Sorting"; + this.Load += new System.EventHandler(this.CustomSorting_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/CustomSorting.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/CustomSorting.cs new file mode 100644 index 0000000..66f72d0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/CustomSorting.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class CustomSorting : Form + { + public CustomSorting() + { + InitializeComponent(); + } + + private void CustomSorting_Load(object sender, EventArgs e) + { + DataTable dt = Program.StoreDB.GetProducts(); + dt.Columns.Add("InStock", typeof(Boolean)); + dataGridView1.DataSource = dt; + + foreach (DataGridViewColumn col in dataGridView1.Columns) + { + col.SortMode = DataGridViewColumnSortMode.Programmatic; + } + dataGridView1.Columns["InStock"].SortMode = DataGridViewColumnSortMode.Automatic; + } + + private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) + { + + } + + private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) + { + if (dataGridView1.Columns[e.ColumnIndex].Name == "InStock") return; + dataGridView1.Sort(dataGridView1.Columns[e.ColumnIndex], ListSortDirection.Ascending); + dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/CustomSorting.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/CustomSorting.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/CustomSorting.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.csproj b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.csproj new file mode 100644 index 0000000..8cc050a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.csproj @@ -0,0 +1,199 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {12349226-A8CC-4783-800D-91091304021C} + WinExe + Properties + DataGridViewTest + DataGridViewTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + AutoResize.cs + + + Form + + + Barebones.cs + + + Form + + + BoundImage.cs + + + Form + + + ButtonColumn.cs + + + Form + + + ChildForm.cs + + + Form + + + CustomSorting.cs + + + Form + + + Formatting.cs + + + Form + + + ListColumn.cs + + + Form + + + Menu.cs + + + + + AutoResize.cs + + + Barebones.cs + + + BoundImage.cs + + + ButtonColumn.cs + + + ChildForm.cs + + + CustomSorting.cs + + + Formatting.cs + + + ListColumn.cs + + + Menu.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + ProportionateFill.cs + + + Selection.cs + + + Unbound.cs + + + UnboundImage.cs + + + ValidateErrors.cs + + + Wrapping.cs + + + True + Resources.resx + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Form + + + ProportionateFill.cs + + + Form + + + Selection.cs + + + + Form + + + Unbound.cs + + + Form + + + UnboundImage.cs + + + + Form + + + ValidateErrors.cs + + + Form + + + Wrapping.cs + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.csproj.user b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.sln b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.sln new file mode 100644 index 0000000..24a1171 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataGridViewTest", "DataGridViewTest.csproj", "{12349226-A8CC-4783-800D-91091304021C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {12349226-A8CC-4783-800D-91091304021C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {12349226-A8CC-4783-800D-91091304021C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {12349226-A8CC-4783-800D-91091304021C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {12349226-A8CC-4783-800D-91091304021C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.suo b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.suo new file mode 100644 index 0000000..0107304 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/DataGridViewTest.suo differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Formatting.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Formatting.Designer.cs new file mode 100644 index 0000000..cd0acd3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Formatting.Designer.cs @@ -0,0 +1,66 @@ +namespace DataGridViewTest +{ + partial class Formatting + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(4, 5); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(401, 291); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.Text = "dataGridView1"; + this.dataGridView1.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dataGridView1_CellFormatting); + // + // Formatting + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(411, 324); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Formatting"; + this.Text = "Formatting"; + this.Load += new System.EventHandler(this.Formatting_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Formatting.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Formatting.cs new file mode 100644 index 0000000..4c6c916 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Formatting.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class Formatting : Form + { + public Formatting() + { + InitializeComponent(); + } + + private void Formatting_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + + dataGridView1.Columns["ProductImage"].Visible = false; + dataGridView1.Columns["CategoryID"].Visible = false; + dataGridView1.Columns["ModelNumber"].DisplayIndex = 4; + + dataGridView1.Columns["ProductID"].Frozen = true; + dataGridView1.Columns["ProductID"].Resizable = DataGridViewTriState.False; + + // Clean up all the columns. + foreach (DataGridViewColumn col in dataGridView1.Columns) + { + col.HeaderCell.Value = Utility.SplitStringByCase(col.HeaderText); + } + + dataGridView1.Columns["UnitCost"].DefaultCellStyle.Format = "C"; + dataGridView1.Columns["UnitCost"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; + dataGridView1.Columns["UnitCost"].DefaultCellStyle.BackColor = Color.LightYellow; + + // Remove cells with the objectionable description. + foreach (DataGridViewRow row in dataGridView1.Rows) + { + if (TestForWords(Convert.ToString(row.Cells["Description"].Value))) + row.Visible = false; + } + } + + private bool TestForWords(string stringToTest) + { + stringToTest = stringToTest.ToLower(); + return (stringToTest.Contains("warning") || stringToTest.Contains("danger")); + } + + private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + if (dataGridView1.Columns[e.ColumnIndex].Name == "UnitCost") + { + if (Convert.ToInt32(e.Value) >= 1000) + { + e.CellStyle.ForeColor = Color.Red; + e.CellStyle.BackColor = Color.Yellow; + e.CellStyle.Font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Bold); + } + } + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Formatting.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Formatting.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Formatting.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ListColumn.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ListColumn.Designer.cs new file mode 100644 index 0000000..a0fb4b7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ListColumn.Designer.cs @@ -0,0 +1,65 @@ +namespace DataGridViewTest +{ + partial class ListColumn + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(9, 8); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(390, 291); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.Text = "dataGridView1"; + // + // ListColumn + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(411, 314); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "ListColumn"; + this.Text = "ListColumn"; + this.Load += new System.EventHandler(this.ListColumn_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ListColumn.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ListColumn.cs new file mode 100644 index 0000000..1db7cdf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ListColumn.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class ListColumn : Form + { + public ListColumn() + { + InitializeComponent(); + } + + private void ListColumn_Load(object sender, EventArgs e) + { + DataSet ds = Program.StoreDB.GetCategoriesAndProducts(); + dataGridView1.DataSource = ds.Tables["Products"]; + + // Remove the auto-generated CategoryID column. + dataGridView1.Columns.Remove("CategoryID"); + + // Create a list column for the CategoryID. + DataGridViewComboBoxColumn listCol = new DataGridViewComboBoxColumn(); + listCol.DisplayIndex = 0; + listCol.HeaderText = "Category"; + + // This column is bound to the Products.CategoryID field. + listCol.DataPropertyName = "CategoryID"; + + // The list is filled from the Categories table. + listCol.DataSource = ds.Tables["Categories"]; + listCol.DisplayMember = "CategoryName"; + listCol.ValueMember = "CategoryID"; + + // Add the column. + dataGridView1.Columns.Add(listCol); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ListColumn.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ListColumn.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ListColumn.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Menu.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Menu.cs new file mode 100644 index 0000000..63979ca --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace DataGridViewTest +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("DataGridViewTest." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Menu.designer.cs new file mode 100644 index 0000000..e249cd6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Menu.designer.cs @@ -0,0 +1,206 @@ +namespace DataGridViewTest +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button12 = new System.Windows.Forms.Button(); + this.button13 = new System.Windows.Forms.Button(); + this.button14 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 7); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(124, 23); + this.button1.TabIndex = 0; + this.button1.Text = "Barebones"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 33); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(124, 23); + this.button2.TabIndex = 1; + this.button2.Text = "Unbound"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 57); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(124, 23); + this.button3.TabIndex = 2; + this.button3.Text = "Selection"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 82); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(124, 23); + this.button4.TabIndex = 3; + this.button4.Text = "CustomSorting"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(12, 107); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(124, 23); + this.button5.TabIndex = 4; + this.button5.Text = "Formatting"; + this.button5.Click += new System.EventHandler(this.cmd_Click); + // + // button6 + // + this.button6.Location = new System.Drawing.Point(12, 132); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(124, 23); + this.button6.TabIndex = 5; + this.button6.Text = "AutoResize"; + this.button6.Click += new System.EventHandler(this.cmd_Click); + // + // button7 + // + this.button7.Location = new System.Drawing.Point(12, 157); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(124, 23); + this.button7.TabIndex = 6; + this.button7.Text = "ProportionateFill"; + this.button7.Click += new System.EventHandler(this.cmd_Click); + // + // button8 + // + this.button8.Location = new System.Drawing.Point(12, 182); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(124, 23); + this.button8.TabIndex = 7; + this.button8.Text = "Wrapping"; + this.button8.Click += new System.EventHandler(this.cmd_Click); + // + // button9 + // + this.button9.Location = new System.Drawing.Point(12, 207); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(124, 23); + this.button9.TabIndex = 8; + this.button9.Text = "UnboundImage"; + this.button9.Click += new System.EventHandler(this.cmd_Click); + // + // button10 + // + this.button10.Location = new System.Drawing.Point(12, 232); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(124, 23); + this.button10.TabIndex = 9; + this.button10.Text = "BoundImage"; + this.button10.Click += new System.EventHandler(this.cmd_Click); + // + // button12 + // + this.button12.Location = new System.Drawing.Point(12, 257); + this.button12.Name = "button12"; + this.button12.Size = new System.Drawing.Size(124, 23); + this.button12.TabIndex = 11; + this.button12.Text = "ButtonColumn"; + this.button12.Click += new System.EventHandler(this.cmd_Click); + // + // button13 + // + this.button13.Location = new System.Drawing.Point(12, 283); + this.button13.Name = "button13"; + this.button13.Size = new System.Drawing.Size(124, 23); + this.button13.TabIndex = 12; + this.button13.Text = "ValidateErrors"; + this.button13.Click += new System.EventHandler(this.cmd_Click); + // + // button14 + // + this.button14.Location = new System.Drawing.Point(12, 310); + this.button14.Name = "button14"; + this.button14.Size = new System.Drawing.Size(124, 23); + this.button14.TabIndex = 13; + this.button14.Text = "ListColumn"; + this.button14.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 350); + this.Controls.Add(this.button14); + this.Controls.Add(this.button13); + this.Controls.Add(this.button12); + this.Controls.Add(this.button10); + this.Controls.Add(this.button9); + this.Controls.Add(this.button8); + this.Controls.Add(this.button7); + this.Controls.Add(this.button6); + this.Controls.Add(this.button5); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button12; + private System.Windows.Forms.Button button13; + private System.Windows.Forms.Button button14; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Menu.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Program.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Program.cs new file mode 100644 index 0000000..204bcfb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + static class Program + { + private static StoreDB storeDB = new StoreDB(); + public static StoreDB StoreDB + { + get { return storeDB; } + } + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..3bb0493 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DataGridViewTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DataGridViewTest")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("881c7e26-e945-4c16-911d-9ec743c9cd35")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Resources.Designer.cs new file mode 100644 index 0000000..04be5e7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DataGridViewTest.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DataGridViewTest.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DataGridViewTest.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace DataGridViewTest.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DataGridViewTest.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Settings.Designer.cs new file mode 100644 index 0000000..9bfdbba --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Settings.Designer.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="DataGridViewTest.Properties.Settings.get_Default():DataGridViewTest.Properties.Se" + + "ttings")] + +namespace DataGridViewTest.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=localhost;Initial Catalog=Store;Integrated Security=True")] + public string Store { + get { + return ((string)(this["Store"])); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Settings.settings new file mode 100644 index 0000000..ca7a549 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Properties/Settings.settings @@ -0,0 +1,11 @@ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ProportionateFill.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ProportionateFill.Designer.cs new file mode 100644 index 0000000..77ee492 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ProportionateFill.Designer.cs @@ -0,0 +1,77 @@ +namespace DataGridViewTest +{ + partial class ProportionateFill + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Tahoma", 18.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle1.FormatProvider = new System.Globalization.CultureInfo("en-US"); + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle1; + this.dataGridView1.Location = new System.Drawing.Point(7, 7); + this.dataGridView1.Margin = new System.Windows.Forms.Padding(3, 3, 3, 3); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(391, 319); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.Text = "dataGridView1"; + // + // ProportionateFill + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(406, 353); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Margin = new System.Windows.Forms.Padding(3, 3, 3, 3); + this.Name = "ProportionateFill"; + this.Text = "ProportionateFill"; + this.Load += new System.EventHandler(this.ProportionateFill_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ProportionateFill.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ProportionateFill.cs new file mode 100644 index 0000000..580f1c5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ProportionateFill.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class ProportionateFill : Form + { + public ProportionateFill() + { + InitializeComponent(); + } + + private void ProportionateFill_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + foreach (DataGridViewColumn col in dataGridView1.Columns) + { + col.Visible = false; + } + // Retrieve the columns you need to work with. + DataGridViewColumn colID = dataGridView1.Columns["ProductID"]; + DataGridViewColumn colModel = dataGridView1.Columns["ModelName"]; + DataGridViewColumn colDesc = dataGridView1.Columns["Description"]; + + colID.Visible = true; + colModel.Visible = true; + colDesc.Visible = true; + + // Give much more weigth to the description. + colID.FillWeight = 25; + colModel.FillWeight = 25; + colDesc.FillWeight = 100; + + // However, keep a minimum width that ensures + // the first two columns are readable. + // Another option in this scenario is to only + // assign fill mode to the description column. + colID.MinimumWidth = 75; + colModel.MinimumWidth = 125; + colDesc.MinimumWidth = 100; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ProportionateFill.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ProportionateFill.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ProportionateFill.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Selection.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Selection.Designer.cs new file mode 100644 index 0000000..5a9b552 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Selection.Designer.cs @@ -0,0 +1,124 @@ +namespace DataGridViewTest +{ + partial class Selection + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txtSelectionInfo = new System.Windows.Forms.TextBox(); + this.cmdSelectionInfo = new System.Windows.Forms.Button(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // txtSelectionInfo + // + this.txtSelectionInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSelectionInfo.Location = new System.Drawing.Point(7, 7); + this.txtSelectionInfo.Multiline = true; + this.txtSelectionInfo.Name = "txtSelectionInfo"; + this.txtSelectionInfo.ReadOnly = true; + this.txtSelectionInfo.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtSelectionInfo.Size = new System.Drawing.Size(395, 89); + this.txtSelectionInfo.TabIndex = 5; + // + // cmdSelectionInfo + // + this.cmdSelectionInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdSelectionInfo.Location = new System.Drawing.Point(408, 13); + this.cmdSelectionInfo.Name = "cmdSelectionInfo"; + this.cmdSelectionInfo.Size = new System.Drawing.Size(89, 54); + this.cmdSelectionInfo.TabIndex = 4; + this.cmdSelectionInfo.Text = "Get Selection Info"; + this.cmdSelectionInfo.Click += new System.EventHandler(this.cmdSelectionInfo_Click); + // + // splitContainer1 + // + this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.splitContainer1.Location = new System.Drawing.Point(0, -2); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.dataGridView1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.txtSelectionInfo); + this.splitContainer1.Panel2.Controls.Add(this.cmdSelectionInfo); + this.splitContainer1.Size = new System.Drawing.Size(509, 370); + this.splitContainer1.SplitterDistance = 263; + this.splitContainer1.TabIndex = 2; + this.splitContainer1.Text = "splitContainer1"; + // + // dataGridView1 + // + this.dataGridView1.AllowUserToOrderColumns = true; + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(8, 7); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(495, 251); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView1_SelectionChanged); + // + // Selection + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(509, 367); + this.Controls.Add(this.splitContainer1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Selection"; + this.Text = "Selection"; + this.Load += new System.EventHandler(this.Selection_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.Panel2.PerformLayout(); + this.splitContainer1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TextBox txtSelectionInfo; + private System.Windows.Forms.Button cmdSelectionInfo; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Selection.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Selection.cs new file mode 100644 index 0000000..c38507c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Selection.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class Selection : Form + { + public Selection() + { + InitializeComponent(); + } + + private void Selection_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + + } + + private void cmdSelectionInfo_Click(object sender, EventArgs e) + { + DisplaySelection(); + } + + private void dataGridView1_SelectionChanged(object sender, EventArgs e) + { + DisplaySelection(); + } + + private void DisplaySelection() + { + StringBuilder info = new StringBuilder(); + info.Append(String.Format("Selected Cells: {0}", dataGridView1.SelectedCells.Count)); + info.Append(Environment.NewLine); + info.Append(String.Format("Selected Rows: {0}", dataGridView1.SelectedRows.Count)); + info.Append(Environment.NewLine); + info.Append(String.Format("Selected Columns: {0}", dataGridView1.SelectedColumns.Count)); + info.Append(Environment.NewLine); + + info.Append("Values: "); + info.Append(Environment.NewLine); + foreach (DataGridViewCell cell in dataGridView1.SelectedCells) + { + info.Append(String.Format(" {0} at ({1}, {2})", cell.Value, cell.RowIndex, cell.ColumnIndex)); + info.Append(Environment.NewLine); + } + + if (dataGridView1.CurrentCell != null) + { + info.Append(String.Format("Current Cell Value: {0}", dataGridView1.CurrentCell.Value)); + info.Append(Environment.NewLine); + info.Append(String.Format("Current Cell Location: ({0}, {1})", dataGridView1.CurrentCellAddress.X, dataGridView1.CurrentCellAddress.Y)); + } + txtSelectionInfo.Text = info.ToString(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Selection.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Selection.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Selection.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/StoreDB.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/StoreDB.cs new file mode 100644 index 0000000..2c631f2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/StoreDB.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data; +using System.Data.SqlClient; + +namespace DataGridViewTest +{ + public class StoreDB + { + public DataTable GetProducts() + { + string connectionString = Properties.Settings.Default.Store; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetProducts", con); + cmd.CommandType = CommandType.StoredProcedure; + SqlDataAdapter adapter = new SqlDataAdapter(cmd); + + DataSet ds = new DataSet(); + // Get read-only column info. + adapter.FillSchema(ds, SchemaType.Mapped, "Products"); + // Fill the table. + adapter.Fill(ds, "Products"); + return ds.Tables[0]; + } + + public DataSet GetCategoriesAndProducts() + { + string connectionString = Properties.Settings.Default.Store; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetProducts", con); + cmd.CommandType = CommandType.StoredProcedure; + SqlDataAdapter adapter = new SqlDataAdapter(cmd); + + DataSet ds = new DataSet(); + adapter.Fill(ds, "Products"); + cmd.CommandText = "GetCategories"; + adapter.Fill(ds, "Categories"); + + ds.Relations.Add("Cat_Prod", + ds.Tables["Categories"].Columns["CategoryID"], + ds.Tables["Products"].Columns["CategoryID"]); + return ds; + } + + public string ValidateProduct(DataRow row) + { + string errors = ""; + + if (((decimal)row["UnitCost"]) <= 0) + { + errors += "* UnitCost value too low\n"; + } + if (row["ModelNumber"].ToString() == "") + { + errors += "* You must specify a ModelNumber\n"; + } + if (row["ModelName"].ToString() == "") + { + errors += "* You must specify a ModelName\n"; + } + return errors; + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Unbound.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Unbound.Designer.cs new file mode 100644 index 0000000..03e9a89 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Unbound.Designer.cs @@ -0,0 +1,66 @@ +namespace DataGridViewTest +{ + partial class Unbound + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(4, 3); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(284, 234); + this.dataGridView1.TabIndex = 0; + this.dataGridView1.Text = "dataGridView1"; + this.dataGridView1.SortCompare += new System.Windows.Forms.DataGridViewSortCompareEventHandler(this.dataGridView1_SortCompare); + // + // Unbound + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Unbound"; + this.Text = "Unbound"; + this.Load += new System.EventHandler(this.Unbound_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Unbound.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Unbound.cs new file mode 100644 index 0000000..06f1f21 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Unbound.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class Unbound : Form + { + public Unbound() + { + InitializeComponent(); + } + + private void Unbound_Load(object sender, EventArgs e) + { + DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn(); + col1.Name = "ProductID"; + col1.HeaderText = "Product ID"; + dataGridView1.Columns.Add(col1); + + // The easiest way to add a column, with name and header text. + dataGridView1.Columns.Add("ModelName", "Model Name"); + dataGridView1.Columns.Add("Description", "Description"); + dataGridView1.Columns.Add("UnitCost", "Unit Cost"); + dataGridView1.Columns["UnitCost"].ValueType = typeof(decimal); + + + // Fill in a row of data (as a list of values). + dataGridView1.Rows.Add(100, "Emergency Travel Gear", "Be prepared for vacation disasters.", 34.44m); + + // Add another row (the hard way). + DataGridViewRow row = (DataGridViewRow)dataGridView1.Rows[0].Clone(); + row.SetValues(101, "Supreme Flight", "Sail over the trees with this glider.", 138.25m); + dataGridView1.Rows.Add(row); + + // Disable editing features. + dataGridView1.AllowUserToAddRows = false; + dataGridView1.AllowUserToDeleteRows = false; + dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; + } + + private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Unbound.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Unbound.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Unbound.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/UnboundImage.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/UnboundImage.Designer.cs new file mode 100644 index 0000000..a2af74d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/UnboundImage.Designer.cs @@ -0,0 +1,76 @@ +namespace DataGridViewTest +{ + partial class UnboundImage + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UnboundImage)); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.imageList = new System.Windows.Forms.ImageList(this.components); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(5, 4); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(405, 306); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.Text = "dataGridView1"; + this.dataGridView1.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellValueChanged); + // + // imageList + // + this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream"))); + this.imageList.Images.SetKeyName(0, "new2.bmp"); + this.imageList.Images.SetKeyName(1, "folder.bmp"); + // + // UnboundImage + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(417, 322); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "UnboundImage"; + this.Text = "UnboundImage"; + this.Load += new System.EventHandler(this.UnboundImage_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + private System.Windows.Forms.ImageList imageList; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/UnboundImage.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/UnboundImage.cs new file mode 100644 index 0000000..f6a16e1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/UnboundImage.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class UnboundImage : Form + { + public UnboundImage() + { + InitializeComponent(); + } + + private Image genericImage; + private Image newImage; + + private void UnboundImage_Load(object sender, EventArgs e) + { + genericImage = imageList.Images[1]; + newImage = imageList.Images[0]; + + // Bind the grid. + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + + // Create the image column. + DataGridViewImageColumn imageCol = new DataGridViewImageColumn(); + imageCol.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; + imageCol.ImageLayout = DataGridViewImageCellLayout.Normal; + imageCol.Frozen = true; + imageCol.Name = "Image"; + imageCol.HeaderText = ""; + + // Move the column to the left, and move the ProductID + // column out of the way. + imageCol.DisplayIndex = 0; + dataGridView1.Columns["ProductID"].DisplayIndex = 1; + + // By default, show the generic image. + imageCol.Image = genericImage; + + // Add the image column to the grid. + dataGridView1.Columns.Add(imageCol); + + } + + private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) + { + if (e.RowIndex != -1) + { + // Retrieve the image column for this row. + DataGridViewImageCell col = + (DataGridViewImageCell)dataGridView1.Rows[e.RowIndex].Cells["Image"]; + + // Set the image. + col.Value = newImage; + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/UnboundImage.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/UnboundImage.resx new file mode 100644 index 0000000..906673b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/UnboundImage.resx @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD8 + CAAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABGQEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABZAMAARADAAEBAQABCAUAAUABBhgAAYACAAGAAwACgAEAAYADAAGAAQABgAEAAoACAAPAAQABwAHc + AcABAAHwAcoBpgEAATMFAAEzAQABMwEAATMBAAIzAgADFgEAAxwBAAMiAQADKQEAA1UBAANNAQADQgEA + AzkBAAGAAXwB/wEAAlAB/wEAAZMBAAHWAQAB/wHsAcwBAAHGAdYB7wEAAdYC5wEAAZABqQGtAgAB/wEz + AwABZgMAAZkDAAHMAgABMwMAAjMCAAEzAWYCAAEzAZkCAAEzAcwCAAEzAf8CAAFmAwABZgEzAgACZgIA + AWYBmQIAAWYBzAIAAWYB/wIAAZkDAAGZATMCAAGZAWYCAAKZAgABmQHMAgABmQH/AgABzAMAAcwBMwIA + AcwBZgIAAcwBmQIAAswCAAHMAf8CAAH/AWYCAAH/AZkCAAH/AcwBAAEzAf8CAAH/AQABMwEAATMBAAFm + AQABMwEAAZkBAAEzAQABzAEAATMBAAH/AQAB/wEzAgADMwEAAjMBZgEAAjMBmQEAAjMBzAEAAjMB/wEA + ATMBZgIAATMBZgEzAQABMwJmAQABMwFmAZkBAAEzAWYBzAEAATMBZgH/AQABMwGZAgABMwGZATMBAAEz + AZkBZgEAATMCmQEAATMBmQHMAQABMwGZAf8BAAEzAcwCAAEzAcwBMwEAATMBzAFmAQABMwHMAZkBAAEz + AswBAAEzAcwB/wEAATMB/wEzAQABMwH/AWYBAAEzAf8BmQEAATMB/wHMAQABMwL/AQABZgMAAWYBAAEz + AQABZgEAAWYBAAFmAQABmQEAAWYBAAHMAQABZgEAAf8BAAFmATMCAAFmAjMBAAFmATMBZgEAAWYBMwGZ + AQABZgEzAcwBAAFmATMB/wEAAmYCAAJmATMBAANmAQACZgGZAQACZgHMAQABZgGZAgABZgGZATMBAAFm + AZkBZgEAAWYCmQEAAWYBmQHMAQABZgGZAf8BAAFmAcwCAAFmAcwBMwEAAWYBzAGZAQABZgLMAQABZgHM + Af8BAAFmAf8CAAFmAf8BMwEAAWYB/wGZAQABZgH/AcwBAAHMAQAB/wEAAf8BAAHMAQACmQIAAZkBMwGZ + AQABmQEAAZkBAAGZAQABzAEAAZkDAAGZAjMBAAGZAQABZgEAAZkBMwHMAQABmQEAAf8BAAGZAWYCAAGZ + AWYBMwEAAZkBMwFmAQABmQFmAZkBAAGZAWYBzAEAAZkBMwH/AQACmQEzAQACmQFmAQADmQEAApkBzAEA + ApkB/wEAAZkBzAIAAZkBzAEzAQABZgHMAWYBAAGZAcwBmQEAAZkCzAEAAZkBzAH/AQABmQH/AgABmQH/ + ATMBAAGZAcwBZgEAAZkB/wGZAQABmQH/AcwBAAGZAv8BAAHMAwABmQEAATMBAAHMAQABZgEAAcwBAAGZ + AQABzAEAAcwBAAGZATMCAAHMAjMBAAHMATMBZgEAAcwBMwGZAQABzAEzAcwBAAHMATMB/wEAAcwBZgIA + AcwBZgEzAQABmQJmAQABzAFmAZkBAAHMAWYBzAEAAZkBZgH/AQABzAGZAgABzAGZATMBAAHMAZkBZgEA + AcwCmQEAAcwBmQHMAQABzAGZAf8BAALMAgACzAEzAQACzAFmAQACzAGZAQADzAEAAswB/wEAAcwB/wIA + AcwB/wEzAQABmQH/AWYBAAHMAf8BmQEAAcwB/wHMAQABzAL/AQABzAEAATMBAAH/AQABZgEAAf8BAAGZ + AQABzAEzAgAB/wIzAQAB/wEzAWYBAAH/ATMBmQEAAf8BMwHMAQAB/wEzAf8BAAH/AWYCAAH/AWYBMwEA + AcwCZgEAAf8BZgGZAQAB/wFmAcwBAAHMAWYB/wEAAf8BmQIAAf8BmQEzAQAB/wGZAWYBAAH/ApkBAAH/ + AZkBzAEAAf8BmQH/AQAB/wHMAgAB/wHMATMBAAH/AcwBZgEAAf8BzAGZAQAB/wLMAQAB/wHMAf8BAAL/ + ATMBAAHMAf8BZgEAAv8BmQEAAv8BzAEAAmYB/wEAAWYB/wFmAQABZgL/AQAB/wJmAQAB/wFmAf8BAAL/ + AWYBAAEhAQABpQEAA18BAAN3AQADhgEAA5YBAAPLAQADsgEAA9cBAAPdAQAD4wEAA+oBAAPxAQAD+AEA + AfAB+wH/AQABpAKgAQADgAMAAf8CAAH/AwAC/wEAAf8DAAH/AQAB/wEAAv8CAAP/gQABTmMAAU4BAAE0 + YQABTgEAAzRfAAFOAQAFNF0AAU4BAAc0WwABTgEABzRGAAf7CAAD+wMAAU4BAAc0PwAD+wIAA/sFAAj7 + AQAB+wEAAfsDAAFOAQAHND8AAfsBAAH7AQAC+wEAAfsBAAb7AgAB+wIABfsDAAFOAQAHND8AAfsBAAP7 + AgAB+wEABvsBAAH7AQAB+wEAA/sBAAH7AwACTgIABTQ/AAH7AQAC+wEAAfsBAAH7AwAD+wEAAvsBAAL7 + AQAC+wEAAfsEAANOAgADND8AAfsBAAH7AQAC+wEAAfsBAAX7AQAC+wEAAvsBAAL7AQAB+wYAATQCTgIA + ATQ/AAH7AgAD+wEAAfsFAAH7AQAF+wEAAvsBAAH7BgADNAJOQAAB+wEAAvsBAAH7AQAH+wEAAfsDAAH7 + AQAE+wcAAjRCAAP7AgAD+wUAA/sDAAP7TgABQgFNAT4HAAE+AwABKAMAAWQDAAEQAwABAQEAAQEGAAEB + FgAD/wEAA/8B8wL/AcAJAAP/AeEC/wHACQAD/wHgAX8B/wHACQAD/wHgAR8B/wHACQAD/wHgAQcB/wHA + CQAD/wHgAQMB/wHACQAD/wHgAQMB/wHACQAB/gEDAfwBYAEDAf8BwAkAARgBAAEEAWABAwH/AcAJAAEQ + AgABYAEDAf8BwAwAAWABAwH/AcAMAAFgAQMB/wHADAABeAEDAf8BwAwAAXwBAwH/AcAJAAEIAQAB4AF8 + AQMB/wHACQABGAH4AeMB/wE/Af8BwAkACw== + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Utility.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Utility.cs new file mode 100644 index 0000000..a7fce8d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Utility.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace DataGridViewTest +{ + public static class Utility + { + public static string SplitStringByCase(string inputString) + { + if (inputString == "") + { + return ""; + } + else + { + StringBuilder sb = new System.Text.StringBuilder(); + + // Add first character. + sb.Append(inputString[0]); + + // Add middle characters. Insert space before capitals. + for (int i = 1; i < inputString.Length - 1; i++) + { + char c = inputString[i]; + // Skip existing spaces (if any). + if (c == ' ') + { + sb.Append(c); + i++; + sb.Append(Char.ToUpper(inputString[i])); + continue; + } + + if (Char.IsUpper(c)) + { + sb.Append(" "); + } + + sb.Append(c); + } + + // Add last character. + sb.Append(inputString[inputString.Length - 1]); + return sb.ToString(); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ValidateErrors.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ValidateErrors.Designer.cs new file mode 100644 index 0000000..36d5c2f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ValidateErrors.Designer.cs @@ -0,0 +1,68 @@ +namespace DataGridViewTest +{ + partial class ValidateErrors + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.Location = new System.Drawing.Point(4, 8); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(376, 306); + this.dataGridView1.TabIndex = 1; + this.dataGridView1.Text = "dataGridView1"; + this.dataGridView1.UserDeletingRow += new System.Windows.Forms.DataGridViewRowCancelEventHandler(this.dataGridView1_UserDeletingRow); + this.dataGridView1.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dataGridView1_CellValidating); + this.dataGridView1.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler(this.dataGridView1_DataError); + // + // ValidateErrors + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(385, 339); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "ValidateErrors"; + this.Text = "ValidateErrors"; + this.Load += new System.EventHandler(this.ValidateErrors_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ValidateErrors.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ValidateErrors.cs new file mode 100644 index 0000000..429cbf9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ValidateErrors.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class ValidateErrors : Form + { + public ValidateErrors() + { + InitializeComponent(); + } + + private void ValidateErrors_Load(object sender, EventArgs e) + { + DataSet ds = Program.StoreDB.GetCategoriesAndProducts(); + dataGridView1.DataSource = ds.Tables["Products"]; + + } + + private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) + { + // Check if it's an error during the commit stage. + if ((e.Context & DataGridViewDataErrorContexts.Commit) == + DataGridViewDataErrorContexts.Commit) + { + // Check the column. + if (dataGridView1.Columns[e.ColumnIndex].Name == "CategoryID") + { + // Check if it's a constraint exception. + if (e.Exception is System.Data.InvalidConstraintException) + { + MessageBox.Show("This category does not exist."); + // The following two lines suppress the exception for this error + // and cancel the attempted action (like row navigation) so focus + // remains on the cell. However, these are the defaults, so these + // lines aren't required. + e.ThrowException = false; + e.Cancel = true; + } + // Check if it's a formatting exception. + else if ((e.Exception.InnerException != null) && + (e.Exception.InnerException is FormatException)) + { + MessageBox.Show("This field can only contain numbers."); + e.ThrowException = false; + e.Cancel = true; + } + } + } + } + + private void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) + { + string id = e.Row.Cells["ProductID"].FormattedValue.ToString(); + string name = e.Row.Cells["ModelName"].FormattedValue.ToString(); + + DialogResult result = MessageBox.Show( + "Are you sure you want to delete product " + id + " - " + name + "?", + "Delete?", MessageBoxButtons.OKCancel); + + if (result == DialogResult.Cancel) + { + // Cancel the delete operation. + e.Cancel = true; + } + + } + + + + private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) + { + if (dataGridView1.Columns[e.ColumnIndex].Name == "ProductImage") + { + if (System.IO.Path.GetExtension(e.FormattedValue.ToString()) != ".gif") + { + dataGridView1.Rows[e.RowIndex].ErrorText = "Invalid Product Image"; + dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = + "The file name must end with '.gif'."; + } + } + + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ValidateErrors.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ValidateErrors.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/ValidateErrors.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Wrapping.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Wrapping.Designer.cs new file mode 100644 index 0000000..2e02154 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Wrapping.Designer.cs @@ -0,0 +1,75 @@ +namespace DataGridViewTest +{ + partial class Wrapping + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle1.FormatProvider = new System.Globalization.CultureInfo("en-US"); + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle1; + this.dataGridView1.Location = new System.Drawing.Point(6, 8); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(561, 374); + this.dataGridView1.TabIndex = 2; + this.dataGridView1.Text = "dataGridView1"; + // + // Wrapping + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(573, 414); + this.Controls.Add(this.dataGridView1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Wrapping"; + this.Text = "Wrapping"; + this.Load += new System.EventHandler(this.Wrapping_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Wrapping.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Wrapping.cs new file mode 100644 index 0000000..60f43b4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Wrapping.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewTest +{ + public partial class Wrapping : Form + { + public Wrapping() + { + InitializeComponent(); + } + + private void Wrapping_Load(object sender, EventArgs e) + { + dataGridView1.DataSource = Program.StoreDB.GetProducts(); + foreach (DataGridViewColumn col in dataGridView1.Columns) + { + col.Visible = false; + } + // Retrieve the columns you need to work with. + DataGridViewColumn colID = dataGridView1.Columns["ProductID"]; + DataGridViewColumn colModel = dataGridView1.Columns["ModelName"]; + DataGridViewColumn colDesc = dataGridView1.Columns["Description"]; + + colID.Visible = true; + colModel.Visible = true; + colDesc.Visible = true; + + + colID.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; + colModel.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; + + colDesc.DefaultCellStyle.WrapMode = DataGridViewTriState.True; + colDesc.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Wrapping.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Wrapping.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/Wrapping.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/app.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/app.config new file mode 100644 index 0000000..517dc9d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/app.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/360.gif b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/360.gif new file mode 100644 index 0000000..4f2d3ae Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/360.gif differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/362.gif b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/362.gif new file mode 100644 index 0000000..48e7a3f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/362.gif differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/397.gif b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/397.gif new file mode 100644 index 0000000..558b66f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/397.gif differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/401.gif b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/401.gif new file mode 100644 index 0000000..c00e843 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/401.gif differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/404.gif b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/404.gif new file mode 100644 index 0000000..55e6ed8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/404.gif differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/DataGridViewTest.exe b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/DataGridViewTest.exe new file mode 100644 index 0000000..66e833f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/DataGridViewTest.exe differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/DataGridViewTest.exe.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/DataGridViewTest.exe.config new file mode 100644 index 0000000..517dc9d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/DataGridViewTest.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/DataGridViewTest.vshost.exe.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/DataGridViewTest.vshost.exe.config new file mode 100644 index 0000000..517dc9d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewTest/bin/Debug/DataGridViewTest.vshost.exe.config @@ -0,0 +1,21 @@ + + + + +
+ + +
+ + + + + + + + + Data Source=localhost;Initial Catalog=Store;Integrated Security=True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/DataGridViewVirtualization.csproj b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/DataGridViewVirtualization.csproj new file mode 100644 index 0000000..7832b72 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/DataGridViewVirtualization.csproj @@ -0,0 +1,74 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {A29E52EE-9D27-428C-AD59-6F69855706CC} + WinExe + Properties + DataGridViewVirtualization + DataGridViewVirtualization + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + + Form1.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/DataGridViewVirtualization.sln b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/DataGridViewVirtualization.sln new file mode 100644 index 0000000..e49b0f5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/DataGridViewVirtualization.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataGridViewVirtualization", "DataGridViewVirtualization.csproj", "{A29E52EE-9D27-428C-AD59-6F69855706CC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A29E52EE-9D27-428C-AD59-6F69855706CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A29E52EE-9D27-428C-AD59-6F69855706CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A29E52EE-9D27-428C-AD59-6F69855706CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A29E52EE-9D27-428C-AD59-6F69855706CC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/DataGridViewVirtualization.suo b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/DataGridViewVirtualization.suo new file mode 100644 index 0000000..8d35152 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/DataGridViewVirtualization.suo differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Form1.Designer.cs new file mode 100644 index 0000000..0f5a6e9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Form1.Designer.cs @@ -0,0 +1,80 @@ +namespace DataGridViewVirtualization +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lblStatus = new System.Windows.Forms.Label(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // lblStatus + // + this.lblStatus.AutoSize = true; + this.lblStatus.Location = new System.Drawing.Point(12, 328); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Size = new System.Drawing.Size(0, 13); + this.lblStatus.TabIndex = 5; + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView1.Location = new System.Drawing.Point(12, 12); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.Size = new System.Drawing.Size(392, 313); + this.dataGridView1.TabIndex = 6; + this.dataGridView1.VirtualMode = true; + this.dataGridView1.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(this.dataGridView1_CellValueNeeded); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(416, 350); + this.Controls.Add(this.dataGridView1); + this.Controls.Add(this.lblStatus); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "ListView Virtualization"; + this.Load += new System.EventHandler(this.Form1_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblStatus; + private System.Windows.Forms.DataGridView dataGridView1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Form1.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Form1.cs new file mode 100644 index 0000000..2484164 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Form1.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DataGridViewVirtualization +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + dataGridView1.Columns.Clear(); + dataGridView1.RowCount = NorthwindDB.GetOrdersCount(); + + // Suspending automatic refreshes as items are added/removed. + dataGridView1.SuspendLayout(); + + // Add column headers for Details view. + dataGridView1.Columns[0].HeaderText = "ID"; + dataGridView1.Columns.Add("ShippedDate", "ShippedDate"); + dataGridView1.Columns[1].Width = 125; + + // Re-enable the display. + dataGridView1.ResumeLayout(); + } + + private DataTable dtCachedItems; + + private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) + { + // Check if the item is in the local cache. + DataRow match = null; + if (dtCachedItems != null) + match = dtCachedItems.Rows.Find(e.RowIndex + 1); + + if (match == null) + { + // The item isn't in memory. + // Get a new range of 100 records. + int from, to; + if (e.RowIndex < 50) + from = 0; + else + from = (e.RowIndex - 50); + + to = from + 100; + dtCachedItems = NorthwindDB.GetOrders(from, to); + + // Don't use the MessageBox to show this information. + // Hiding any part of the ListView can retrigger this event. + lblStatus.Text = String.Format( + "Fetched rows from {0} to {1} at {2}.", + from.ToString(), to.ToString(), + DateTime.Now.ToLongTimeString()); + + match = dtCachedItems.Rows.Find(e.RowIndex + 1); + } + + switch (e.ColumnIndex) + { + case 0: + e.Value = match["OrderID"]; + break; + case 1: + e.Value = match["ShippedDate"]; + break; + } + + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Form1.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/NorthwindDB.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/NorthwindDB.cs new file mode 100644 index 0000000..9e29a73 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/NorthwindDB.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data.SqlClient; +using System.Data; + +namespace DataGridViewVirtualization +{ + public class NorthwindDB + { + private static string connectionString = Properties.Settings.Default.ConnectionString; + + public static int GetOrdersCount() + { + // Create the command and the connection. + string sql = "SELECT COUNT(*) FROM Orders"; + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand(sql, con); + + // Get the number of records. + using (con) + { + con.Open(); + return (int)cmd.ExecuteScalar(); + } + } + + public static DataTable GetOrders(int fromOrderID, int toOrderID) + { + SqlConnection con = new SqlConnection(connectionString); + SqlCommand cmd = new SqlCommand("GetOrdersByPage", con); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new SqlParameter("@FromID", SqlDbType.Int, 4)); + cmd.Parameters["@FromID"].Value = fromOrderID; + cmd.Parameters.Add(new SqlParameter("@ToID", SqlDbType.Int, 4)); + cmd.Parameters["@ToID"].Value = toOrderID; + + // Prepare to fill a new DataSet. + SqlDataAdapter adapter = new SqlDataAdapter(cmd); + DataSet ds = new DataSet(); + + // Get the appropriate "page" of order records. + adapter.Fill(ds); + ds.Tables[0].PrimaryKey = new DataColumn[] { ds.Tables[0].Columns["ID"] }; + return ds.Tables[0]; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/OrdersByPage.sql b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/OrdersByPage.sql new file mode 100644 index 0000000..9868f60 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/OrdersByPage.sql differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Program.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Program.cs new file mode 100644 index 0000000..dfc507d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DataGridViewVirtualization +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..acb9967 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ListViewVirtualization")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ListViewVirtualization")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("63d11d88-7494-47c4-8370-d8849fdd51fe")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d99dc43 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DataGridViewVirtualization.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DataGridViewVirtualization.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Settings.Designer.cs new file mode 100644 index 0000000..7e84e61 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Settings.Designer.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DataGridViewVirtualization.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI")] + public string ConnectionString { + get { + return ((string)(this["ConnectionString"])); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Settings.settings new file mode 100644 index 0000000..7d6871f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/Properties/Settings.settings @@ -0,0 +1,9 @@ + + + + + + Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/app.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/app.config new file mode 100644 index 0000000..712a74b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/app.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/DataGridViewVirtualization.exe b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/DataGridViewVirtualization.exe new file mode 100644 index 0000000..cdc1757 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/DataGridViewVirtualization.exe differ diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/DataGridViewVirtualization.exe.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/DataGridViewVirtualization.exe.config new file mode 100644 index 0000000..b3cf630 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/DataGridViewVirtualization.exe.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/DataGridViewVirtualization.vshost.exe.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/DataGridViewVirtualization.vshost.exe.config new file mode 100644 index 0000000..b3cf630 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/DataGridViewVirtualization.vshost.exe.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/ListViewVirtualization.vshost.exe.config b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/ListViewVirtualization.vshost.exe.config new file mode 100644 index 0000000..240207b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter15/DataGridViewVirtualization/bin/Debug/ListViewVirtualization.vshost.exe.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/App.ico b/Pro Windows Forms 2.0/Chapter16/QuartVideo/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartVideo/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter16/QuartVideo/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartVideo/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/MoviePlayer.Designer.cs b/Pro Windows Forms 2.0/Chapter16/QuartVideo/MoviePlayer.Designer.cs new file mode 100644 index 0000000..08100b8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartVideo/MoviePlayer.Designer.cs @@ -0,0 +1,78 @@ +namespace Video +{ + partial class MoviePlayer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdOpen = new System.Windows.Forms.Button(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // cmdOpen + // + this.cmdOpen.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdOpen.Location = new System.Drawing.Point(188, 255); + this.cmdOpen.Name = "cmdOpen"; + this.cmdOpen.Size = new System.Drawing.Size(96, 28); + this.cmdOpen.TabIndex = 3; + this.cmdOpen.Text = "Open"; + this.cmdOpen.Click += new System.EventHandler(this.cmdOpen_Click); + // + // pictureBox1 + // + this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pictureBox1.Location = new System.Drawing.Point(8, 3); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(276, 244); + this.pictureBox1.TabIndex = 2; + this.pictureBox1.TabStop = false; + // + // MoviePlayer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 287); + this.Controls.Add(this.cmdOpen); + this.Controls.Add(this.pictureBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "MoviePlayer"; + this.Text = "MoviePlayer"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button cmdOpen; + private System.Windows.Forms.PictureBox pictureBox1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/MoviePlayer.cs b/Pro Windows Forms 2.0/Chapter16/QuartVideo/MoviePlayer.cs new file mode 100644 index 0000000..671188c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartVideo/MoviePlayer.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using QuartzTypeLib; +using System.IO; + +namespace Video +{ + public partial class MoviePlayer : Form + { + public MoviePlayer() + { + InitializeComponent(); + } + + // Define constants used for specifying the window style. + private const int WM_APP = 0x8000; + private const int WM_GRAPHNOTIFY = WM_APP + 1; + private const int EC_COMPLETE = 0x01; + private const int WS_CHILD = 0x40000000; + private const int WS_CLIPCHILDREN = 0x2000000; + + // Hold a form-level reference to the media control interface, + // so the code can control playback of the currently loaded + // movie. + private IMediaControl mc = null; + + // Hold a form-level reference to the video window in case it + // needs to be resized. + private IVideoWindow videoWindow = null; + + private void cmdOpen_Click(object sender, EventArgs e) + { + // Allow the user to choose a file. + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.Filter = "Media Files|*.mpg;*.avi;*.wma;*.mov;*.wav;*.mp2;*.mp3|All Files|*.*"; + + if (DialogResult.OK == openFileDialog.ShowDialog()) + { + // Stop the playback for the current movie, if it exists. + if (mc != null) mc.Stop(); + mc = null; + videoWindow = null; + + // Load the movie file. + FilgraphManager graphManager = new FilgraphManager(); + graphManager.RenderFile(openFileDialog.FileName); + + // Attach the view to a picture box on the form. + try + { + videoWindow = (IVideoWindow)graphManager; + videoWindow.Owner = (int)pictureBox1.Handle; + videoWindow.WindowStyle = WS_CHILD | WS_CLIPCHILDREN; + videoWindow.SetWindowPosition(pictureBox1.ClientRectangle.Left, + pictureBox1.ClientRectangle.Top, + pictureBox1.ClientRectangle.Width, + pictureBox1.ClientRectangle.Height); + } + catch + { + // An error can occur if the file does not have a vide + // source (for example, an MP3 file.) + // You can ignore this error and still allow playback to + // continue (without any visualization). + } + + // Start the playback (asynchronously). + mc = (IMediaControl)graphManager; + mc.Run(); + } + } + + private void ShowMovie_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + if (mc != null) mc.Stop(); + } + + private void pictureBox1_SizeChanged(object sender, System.EventArgs e) + { + if (videoWindow != null) + { + try + { + videoWindow.SetWindowPosition( + pictureBox1.ClientRectangle.Left, + pictureBox1.ClientRectangle.Top, + pictureBox1.ClientRectangle.Width, + pictureBox1.ClientRectangle.Height); + } + catch { } + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/MoviePlayer.resx b/Pro Windows Forms 2.0/Chapter16/QuartVideo/MoviePlayer.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartVideo/MoviePlayer.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/Program.cs b/Pro Windows Forms 2.0/Chapter16/QuartVideo/Program.cs new file mode 100644 index 0000000..1599fa7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartVideo/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Video +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MoviePlayer()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/Video.csproj b/Pro Windows Forms 2.0/Chapter16/QuartVideo/Video.csproj new file mode 100644 index 0000000..3268bc5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartVideo/Video.csproj @@ -0,0 +1,122 @@ + + + Local + 8.0.50727 + 2.0 + {F4C60126-074E-460B-918C-435EF0566FBF} + Debug + App.ico + + + Video + + + JScript + Grid + IE50 + false + WinExe + Video + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + true + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + {56A868B0-0AD4-11CE-B03A-0020AF0BA770} + 1 + 0 + 0 + tlbimp + + + + + + Code + + + Form + + + MoviePlayer.cs + + + + Designer + MoviePlayer.cs + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/Video.sln b/Pro Windows Forms 2.0/Chapter16/QuartVideo/Video.sln new file mode 100644 index 0000000..8a549b3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartVideo/Video.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Video", "Video.csproj", "{F4C60126-074E-460B-918C-435EF0566FBF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F4C60126-074E-460B-918C-435EF0566FBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4C60126-074E-460B-918C-435EF0566FBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4C60126-074E-460B-918C-435EF0566FBF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4C60126-074E-460B-918C-435EF0566FBF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/Video.suo b/Pro Windows Forms 2.0/Chapter16/QuartVideo/Video.suo new file mode 100644 index 0000000..f3d6df1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartVideo/Video.suo differ diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Debug/Interop.QuartzTypeLib.dll b/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Debug/Interop.QuartzTypeLib.dll new file mode 100644 index 0000000..f95d870 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Debug/Interop.QuartzTypeLib.dll differ diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Debug/Video.exe b/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Debug/Video.exe new file mode 100644 index 0000000..df97a02 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Debug/Video.exe differ diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Release/Interop.QuartzTypeLib.dll b/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Release/Interop.QuartzTypeLib.dll new file mode 100644 index 0000000..7b99969 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Release/Interop.QuartzTypeLib.dll differ diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Release/Video.exe b/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Release/Video.exe new file mode 100644 index 0000000..259748b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartVideo/bin/Release/Video.exe differ diff --git a/Pro Windows Forms 2.0/Chapter16/QuartVideo/test.mpg b/Pro Windows Forms 2.0/Chapter16/QuartVideo/test.mpg new file mode 100644 index 0000000..86c2b37 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartVideo/test.mpg differ diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/MediaPlayer.Designer.cs b/Pro Windows Forms 2.0/Chapter16/QuartzSound/MediaPlayer.Designer.cs new file mode 100644 index 0000000..551790e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/MediaPlayer.Designer.cs @@ -0,0 +1,139 @@ +namespace QuartzMediaPlayer +{ + partial class MediaPlayer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.statusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.statusLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); + this.statusLabel3 = new System.Windows.Forms.ToolStripStatusLabel(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.cmdPlay = new System.Windows.Forms.Button(); + this.cmdStop = new System.Windows.Forms.Button(); + this.cmdPause = new System.Windows.Forms.Button(); + this.statusStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.statusLabel1, + this.statusLabel2, + this.statusLabel3}); + this.statusStrip1.Location = new System.Drawing.Point(0, 93); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(378, 32); + this.statusStrip1.TabIndex = 0; + this.statusStrip1.Text = "statusStrip1"; + // + // statusLabel1 + // + this.statusLabel1.Name = "statusLabel1"; + this.statusLabel1.Padding = new System.Windows.Forms.Padding(5); + this.statusLabel1.Size = new System.Drawing.Size(10, 27); + // + // statusLabel2 + // + this.statusLabel2.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left; + this.statusLabel2.Name = "statusLabel2"; + this.statusLabel2.Padding = new System.Windows.Forms.Padding(5); + this.statusLabel2.Size = new System.Drawing.Size(14, 27); + // + // statusLabel3 + // + this.statusLabel3.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right))); + this.statusLabel3.Name = "statusLabel3"; + this.statusLabel3.Padding = new System.Windows.Forms.Padding(5); + this.statusLabel3.Size = new System.Drawing.Size(93, 27); + this.statusLabel3.Text = "Using test.mp3"; + // + // timer1 + // + this.timer1.Interval = 500; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // cmdPlay + // + this.cmdPlay.Location = new System.Drawing.Point(24, 25); + this.cmdPlay.Name = "cmdPlay"; + this.cmdPlay.Size = new System.Drawing.Size(75, 26); + this.cmdPlay.TabIndex = 1; + this.cmdPlay.Text = "Play"; + this.cmdPlay.Click += new System.EventHandler(this.cmdPlay_Click); + // + // cmdStop + // + this.cmdStop.Location = new System.Drawing.Point(186, 25); + this.cmdStop.Name = "cmdStop"; + this.cmdStop.Size = new System.Drawing.Size(75, 26); + this.cmdStop.TabIndex = 2; + this.cmdStop.Text = "Stop"; + this.cmdStop.Click += new System.EventHandler(this.cmdStop_Click); + // + // cmdPause + // + this.cmdPause.Location = new System.Drawing.Point(105, 25); + this.cmdPause.Name = "cmdPause"; + this.cmdPause.Size = new System.Drawing.Size(75, 26); + this.cmdPause.TabIndex = 3; + this.cmdPause.Text = "Pause"; + this.cmdPause.Click += new System.EventHandler(this.cmdPause_Click); + // + // MediaPlayer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(378, 125); + this.Controls.Add(this.cmdPause); + this.Controls.Add(this.cmdStop); + this.Controls.Add(this.cmdPlay); + this.Controls.Add(this.statusStrip1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "MediaPlayer"; + this.Text = "MediaPlayer"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MediaPlayer_FormClosed); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel statusLabel1; + private System.Windows.Forms.ToolStripStatusLabel statusLabel2; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Button cmdPlay; + private System.Windows.Forms.Button cmdStop; + private System.Windows.Forms.Button cmdPause; + private System.Windows.Forms.ToolStripStatusLabel statusLabel3; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/MediaPlayer.cs b/Pro Windows Forms 2.0/Chapter16/QuartzSound/MediaPlayer.cs new file mode 100644 index 0000000..a350131 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/MediaPlayer.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.IO; +using System.Runtime.InteropServices; + +namespace QuartzMediaPlayer +{ + public partial class MediaPlayer : Form + { + public MediaPlayer() + { + InitializeComponent(); + } + + // The FilgraphManager is the central source for all other interfaces. + private QuartzTypeLib.FilgraphManager graphManager; + + // The IMediate control interface allows you control playback. + private QuartzTypeLib.IMediaControl mc; + + // IBasicAudio exposes Volume and Balance properties. + private QuartzTypeLib.IBasicAudio audio; + + // IMediaPosition exposes the CurrentPosition property. + private QuartzTypeLib.IMediaPosition position; + + // IMediaEventEx allows you to receive events, including when playback stops. + private QuartzTypeLib.IMediaEventEx mEventEx; + + private void MediaPlayer_FormClosed(object sender, FormClosedEventArgs e) + { + timer1.Stop(); + if (mc != null) mc.Stop(); + } + + + + + private string ConvertTimeToString(int seconds) + { + int hours = seconds / 3600; + int minutes = (seconds - (hours * 3600)) / 60; + seconds = seconds - (hours * 3600 + minutes * 60); + return String.Format("{0:D2}:{1:D2}:{2:D2}", hours, minutes, seconds); + } + + private void timer1_Tick(object sender, EventArgs e) + { + if (position != null) + { + statusLabel2.Text = "Current: " + + ConvertTimeToString((int)position.CurrentPosition); + } + } + + private const int WM_APP = 0x8000; + private const int WM_GRAPHNOTIFY = WM_APP + 1; + private const int EC_COMPLETE = 0x01; + + protected override void WndProc(ref Message m) + { + // Check if it's a notification message from the Quart component. + if (m.Msg == WM_GRAPHNOTIFY) + { + int lEventCode; + int lParam1, lParam2; + + try + { + // Retrieve the message. + mEventEx.GetEvent(out lEventCode, out lParam1, + out lParam2, 0); + mEventEx.FreeEventParams(lEventCode, lParam1, lParam2); + + // Check if it's the end-of-file message. + if (lEventCode == EC_COMPLETE) + { + // Restart the playback. + mc.Stop(); + position.CurrentPosition = 0; + mc.Run(); + } + } + catch (Exception) + { + // Never throw an exception from WndProc(). + // You may want to log it, however. + } + } + // Pass the message along to .NET. + base.WndProc(ref m); + } + + private void cmdPlay_Click(object sender, EventArgs e) + { + if (mc == null) + { + // This audio is being played for the first time. + // Load the file. + + // Access the IMediaControl interface. + graphManager = new QuartzTypeLib.FilgraphManager(); + mc = (QuartzTypeLib.IMediaControl)graphManager; + audio = (QuartzTypeLib.IBasicAudio)graphManager; + position = (QuartzTypeLib.IMediaPosition)graphManager; + mEventEx = (QuartzTypeLib.IMediaEventEx)graphManager; + + try + { + // Choose a file. + mc.RenderFile(Application.StartupPath + "\\test.mp3"); + mEventEx.SetNotifyWindow((int)this.Handle, WM_GRAPHNOTIFY, 0); + } + catch (FileNotFoundException err) + { + MessageBox.Show("File not found."); + return; + } + catch (COMException err) + { + MessageBox.Show("COM error."); + return; + } + } + + // Start playing the audio asynchronously. + try + { + statusLabel1.Text = "Total: " + + ConvertTimeToString((int)position.Duration); + + mc.Run(); + timer1.Start(); + } + catch (COMException err) + { + MessageBox.Show("COM error."); + } + } + + private void cmdStop_Click(object sender, EventArgs e) + { + timer1.Stop(); + if (mc != null) mc.Stop(); + position.CurrentPosition = 0; + statusLabel2.Text = "Current: 00:00:00"; + } + + private void cmdPause_Click(object sender, EventArgs e) + { + if (mc != null) mc.Pause(); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/MediaPlayer.resx b/Pro Windows Forms 2.0/Chapter16/QuartzSound/MediaPlayer.resx new file mode 100644 index 0000000..e4692cf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/MediaPlayer.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 127, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/Program.cs b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Program.cs new file mode 100644 index 0000000..2adb781 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace QuartzMediaPlayer +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new MediaPlayer()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..feb5c8f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("QuartzMediaPlayer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("QuartzMediaPlayer")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0f7da33b-6e47-4929-8477-7099310fb7ff")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Resources.Designer.cs new file mode 100644 index 0000000..bc8b75e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "QuartzMediaPlayer.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "QuartzMediaPlayer.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "QuartzMediaPlayer.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace QuartzMediaPlayer.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("QuartzMediaPlayer.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Settings.Designer.cs new file mode 100644 index 0000000..f7f4805 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "QuartzMediaPlayer.Properties.Settings.get_Default():QuartzMediaPlayer.Properties.Settings")] + +namespace QuartzMediaPlayer.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.csproj b/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.csproj new file mode 100644 index 0000000..7a5e3c8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.csproj @@ -0,0 +1,88 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {15E352A2-5477-4CC1-96BD-C865B2676B27} + WinExe + Properties + QuartzMediaPlayer + QuartzMediaPlayer + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + MediaPlayer.cs + + + + + MediaPlayer.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {56A868B0-0AD4-11CE-B03A-0020AF0BA770} + 1 + 0 + 0 + tlbimp + False + + + {00020430-0000-0000-C000-000000000046} + 2 + 0 + 0 + primary + False + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.csproj.user b/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.csproj.user new file mode 100644 index 0000000..e4a7c97 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.csproj.user @@ -0,0 +1,6 @@ + + + 8.0.50215 + ProjectFiles + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.sln b/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.sln new file mode 100644 index 0000000..ff273c1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuartzMediaPlayer", "QuartzMediaPlayer.csproj", "{15E352A2-5477-4CC1-96BD-C865B2676B27}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {15E352A2-5477-4CC1-96BD-C865B2676B27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {15E352A2-5477-4CC1-96BD-C865B2676B27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15E352A2-5477-4CC1-96BD-C865B2676B27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {15E352A2-5477-4CC1-96BD-C865B2676B27}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.suo b/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.suo new file mode 100644 index 0000000..1564fed Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartzSound/QuartzMediaPlayer.suo differ diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/bin/Debug/Interop.QuartzTypeLib.dll b/Pro Windows Forms 2.0/Chapter16/QuartzSound/bin/Debug/Interop.QuartzTypeLib.dll new file mode 100644 index 0000000..760f2ad Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartzSound/bin/Debug/Interop.QuartzTypeLib.dll differ diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/bin/Debug/QuartzMediaPlayer.exe b/Pro Windows Forms 2.0/Chapter16/QuartzSound/bin/Debug/QuartzMediaPlayer.exe new file mode 100644 index 0000000..471564c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartzSound/bin/Debug/QuartzMediaPlayer.exe differ diff --git a/Pro Windows Forms 2.0/Chapter16/QuartzSound/bin/Debug/test.mp3 b/Pro Windows Forms 2.0/Chapter16/QuartzSound/bin/Debug/test.mp3 new file mode 100644 index 0000000..c3dc086 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/QuartzSound/bin/Debug/test.mp3 differ diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/App.ico b/Pro Windows Forms 2.0/Chapter16/Sound/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/Sound/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter16/Sound/AssemblyInfo.cs new file mode 100644 index 0000000..f7a486e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/Sound/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/Player.Designer.cs b/Pro Windows Forms 2.0/Chapter16/Sound/Player.Designer.cs new file mode 100644 index 0000000..7b8453f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/Sound/Player.Designer.cs @@ -0,0 +1,182 @@ +namespace Sound +{ + partial class Player + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.loadAsyncButton = new System.Windows.Forms.Button(); + this.playLoopAsyncButton = new System.Windows.Forms.Button(); + this.stopButton = new System.Windows.Forms.Button(); + this.playOnceAsyncButton = new System.Windows.Forms.Button(); + this.playOnceSyncButton = new System.Windows.Forms.Button(); + this.loadSyncButton = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.selectFileButton = new System.Windows.Forms.Button(); + this.filepathTextbox = new System.Windows.Forms.TextBox(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.statusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.statusStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // loadAsyncButton + // + this.loadAsyncButton.Location = new System.Drawing.Point(149, 50); + this.loadAsyncButton.Name = "loadAsyncButton"; + this.loadAsyncButton.Size = new System.Drawing.Size(147, 23); + this.loadAsyncButton.TabIndex = 20; + this.loadAsyncButton.Text = "Load Asynchronously"; + this.loadAsyncButton.Click += new System.EventHandler(this.loadAsyncButton_Click); + // + // playLoopAsyncButton + // + this.playLoopAsyncButton.Location = new System.Drawing.Point(7, 106); + this.playLoopAsyncButton.Name = "playLoopAsyncButton"; + this.playLoopAsyncButton.Size = new System.Drawing.Size(142, 23); + this.playLoopAsyncButton.TabIndex = 18; + this.playLoopAsyncButton.Text = "Loop Asynchronously"; + this.playLoopAsyncButton.Click += new System.EventHandler(this.playLoopAsyncButton_Click); + // + // stopButton + // + this.stopButton.Location = new System.Drawing.Point(149, 106); + this.stopButton.Name = "stopButton"; + this.stopButton.Size = new System.Drawing.Size(147, 23); + this.stopButton.TabIndex = 17; + this.stopButton.Text = "Stop"; + this.stopButton.Click += new System.EventHandler(this.stopButton_Click); + // + // playOnceAsyncButton + // + this.playOnceAsyncButton.Location = new System.Drawing.Point(149, 83); + this.playOnceAsyncButton.Name = "playOnceAsyncButton"; + this.playOnceAsyncButton.Size = new System.Drawing.Size(147, 23); + this.playOnceAsyncButton.TabIndex = 16; + this.playOnceAsyncButton.Text = "Play Once Asynchronously"; + this.playOnceAsyncButton.Click += new System.EventHandler(this.playOnceAsyncButton_Click); + // + // playOnceSyncButton + // + this.playOnceSyncButton.Location = new System.Drawing.Point(7, 83); + this.playOnceSyncButton.Name = "playOnceSyncButton"; + this.playOnceSyncButton.Size = new System.Drawing.Size(142, 23); + this.playOnceSyncButton.TabIndex = 15; + this.playOnceSyncButton.Text = "Play Once Synchronously"; + this.playOnceSyncButton.Click += new System.EventHandler(this.playOnceSyncButton_Click); + // + // loadSyncButton + // + this.loadSyncButton.Location = new System.Drawing.Point(7, 50); + this.loadSyncButton.Name = "loadSyncButton"; + this.loadSyncButton.Size = new System.Drawing.Size(142, 23); + this.loadSyncButton.TabIndex = 14; + this.loadSyncButton.Text = "Load Synchronously"; + this.loadSyncButton.Click += new System.EventHandler(this.loadSyncButton_Click); + // + // label1 + // + this.label1.Location = new System.Drawing.Point(7, 4); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(145, 17); + this.label1.TabIndex = 13; + this.label1.Text = ".wav path or URL:"; + // + // selectFileButton + // + this.selectFileButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.selectFileButton.Location = new System.Drawing.Point(274, 22); + this.selectFileButton.Name = "selectFileButton"; + this.selectFileButton.Size = new System.Drawing.Size(23, 21); + this.selectFileButton.TabIndex = 12; + this.selectFileButton.Text = "..."; + this.selectFileButton.Click += new System.EventHandler(this.selectFileButton_Click); + // + // filepathTextbox + // + this.filepathTextbox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.filepathTextbox.Location = new System.Drawing.Point(7, 22); + this.filepathTextbox.Name = "filepathTextbox"; + this.filepathTextbox.Size = new System.Drawing.Size(261, 21); + this.filepathTextbox.TabIndex = 11; + this.filepathTextbox.TextChanged += new System.EventHandler(this.filepathTextbox_TextChanged); + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.statusLabel}); + this.statusStrip1.Location = new System.Drawing.Point(0, 164); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(363, 22); + this.statusStrip1.TabIndex = 21; + this.statusStrip1.Text = "statusStrip1"; + // + // statusLabel + // + this.statusLabel.Name = "statusLabel"; + this.statusLabel.Size = new System.Drawing.Size(0, 17); + // + // Player + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(363, 186); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.loadAsyncButton); + this.Controls.Add(this.playLoopAsyncButton); + this.Controls.Add(this.stopButton); + this.Controls.Add(this.playOnceAsyncButton); + this.Controls.Add(this.playOnceSyncButton); + this.Controls.Add(this.loadSyncButton); + this.Controls.Add(this.label1); + this.Controls.Add(this.selectFileButton); + this.Controls.Add(this.filepathTextbox); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Player"; + this.Text = "Player"; + this.Load += new System.EventHandler(this.SoundTestForm_Load); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button loadAsyncButton; + private System.Windows.Forms.Button playLoopAsyncButton; + private System.Windows.Forms.Button stopButton; + private System.Windows.Forms.Button playOnceAsyncButton; + private System.Windows.Forms.Button playOnceSyncButton; + private System.Windows.Forms.Button loadSyncButton; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button selectFileButton; + private System.Windows.Forms.TextBox filepathTextbox; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel statusLabel; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/Player.cs b/Pro Windows Forms 2.0/Chapter16/Sound/Player.cs new file mode 100644 index 0000000..4f18fc5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/Sound/Player.cs @@ -0,0 +1,198 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Media; + +namespace Sound +{ + public partial class Player : Form + { + public Player() + { + InitializeComponent(); + + // This method has been added to configure the SoundPlayer. + InitializeSound(); + } + + + private System.Media.SoundPlayer sound; + + + // Sets up the Sound object. + private void InitializeSound() + { + // Create an instance of the Sound class. + sound = new SoundPlayer(); + + // Listen for the LoadCompleted event. + sound.LoadCompleted += new AsyncCompletedEventHandler(sound_LoadCompleted); + + // Listen for the SoundLocationChanged event. + sound.SoundLocationChanged += new EventHandler(sound_LocationChanged); + } + + + private void selectFileButton_Click(object sender, System.EventArgs e) + { + // Create a new OpenFileDialog. + OpenFileDialog dlg = new OpenFileDialog(); + + // Make sure the dialog checks for existence of the + // selected file. + dlg.CheckFileExists = true; + + // Allow selection of .wav files only. + dlg.Filter = "WAV files (*.wav)|*.wav"; + dlg.DefaultExt = ".wav"; + + // Activate the file selection dialog. + if (dlg.ShowDialog() == DialogResult.OK) + { + // Get the selected file's path from the dialog. + this.filepathTextbox.Text = dlg.FileName; + + // Assign the selected file's path to + // the Sound object. + sound.SoundLocation = filepathTextbox.Text; + } + } + + + // Convenience method for setting message text in + // the status bar. + private void ReportStatus(string statusMessage) + { + // If the caller passed in a message... + if ((statusMessage != null) && (statusMessage != String.Empty)) + { + // ...post the caller's message to the status bar. + statusLabel.Text = statusMessage; + } + } + + + // Enables and disables play controls. + private void EnablePlaybackControls(bool enabled) + { + this.playOnceSyncButton.Enabled = enabled; + this.playOnceAsyncButton.Enabled = enabled; + this.playLoopAsyncButton.Enabled = enabled; + this.stopButton.Enabled = enabled; + } + + + private void filepathTextbox_TextChanged(object sender, EventArgs e) + { + // Disable playback controls until the new .wav is loaded. + EnablePlaybackControls(false); + } + + + private void loadSyncButton_Click(object sender, System.EventArgs e) + { + // Disable playback controls until the .wav is + // successfully loaded. The LoadCompleted event + // handler will enable them. + EnablePlaybackControls(false); + + try + { + // Assign the selected file's path to + // the Sound object. + sound.SoundLocation = filepathTextbox.Text; + + // Load the .wav file. + sound.Load(); + } + catch (Exception ex) + { + ReportStatus(ex.Message); + } + } + + + private void loadAsyncButton_Click(System.Object sender, EventArgs e) + { + // Disable playback controls until the .wav is + // successfully loaded. The LoadCompleted event + // handler will enable them. + EnablePlaybackControls(false); + + try + { + // Assign the selected file's path to + // the Sound object. + sound.SoundLocation = this.filepathTextbox.Text; + + // Load the .wav file. + sound.LoadAsync(); + } + catch (Exception ex) + { + ReportStatus(ex.Message); + } + } + + + // Synchronously plays the selected .wav file once. + // If the file is large, UI response will be visibly + // affected. + private void playOnceSyncButton_Click(object sender, System.EventArgs e) + { + ReportStatus("Playing .wav file synchronously."); + sound.PlaySync(); + ReportStatus("Finished playing .wav file synchronously."); + } + + + // Asynchronously plays the selected .wav file once. + private void playOnceAsyncButton_Click(object sender, System.EventArgs e) + { + ReportStatus("Playing .wav file asynchronously."); + sound.Play(); + } + + + // Asynchronously plays the selected .wav file until the user + // clicks the Stop button. + private void playLoopAsyncButton_Click(object sender, System.EventArgs e) + { + ReportStatus("Looping .wav file asynchronously."); + sound.PlayLooping(); + } + + // Stops the currently playing .wav file, if any. + private void stopButton_Click(System.Object sender, System.EventArgs e) + { + sound.Stop(); + ReportStatus("Stopped by user."); + } + + + private void sound_LoadCompleted(object sender, AsyncCompletedEventArgs e) + { + string message = String.Format("LoadCompleted: {0}", this.filepathTextbox.Text); + + ReportStatus(message); + EnablePlaybackControls(true); + } + + + private void sound_LocationChanged(object sender, EventArgs e) + { + string message = String.Format("SoundLocationChanged: {0}", sound.SoundLocation); + + ReportStatus(message); + } + + private void SoundTestForm_Load(object sender, System.EventArgs e) + { + SystemSounds.Beep.Play(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/Player.resx b/Pro Windows Forms 2.0/Chapter16/Sound/Player.resx new file mode 100644 index 0000000..b9c202b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/Sound/Player.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/Program.cs b/Pro Windows Forms 2.0/Chapter16/Sound/Program.cs new file mode 100644 index 0000000..c112b3d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/Sound/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Sound +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Player()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/Sound.csproj b/Pro Windows Forms 2.0/Chapter16/Sound/Sound.csproj new file mode 100644 index 0000000..3f2d3a7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/Sound/Sound.csproj @@ -0,0 +1,78 @@ + + + Debug + 8.0.50727 + 2.0 + {4F66DFCF-B889-47C0-8AFC-DED445064919} + WinExe + + + Sound + false + Sound + + + + + true + false + .\bin\Debug\ + false + DEBUG;TRACE + 4 + false + + + false + true + .\bin\Release\ + false + TRACE + 4 + false + + + + + + + + App.ico + + + + + + + + + Form + + + Player.cs + + + + + + + + + + + + + + + + + + + Designer + Player.cs + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/Sound.sln b/Pro Windows Forms 2.0/Chapter16/Sound/Sound.sln new file mode 100644 index 0000000..cb70e52 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter16/Sound/Sound.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sound", "Sound.csproj", "{4F66DFCF-B889-47C0-8AFC-DED445064919}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4F66DFCF-B889-47C0-8AFC-DED445064919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4F66DFCF-B889-47C0-8AFC-DED445064919}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F66DFCF-B889-47C0-8AFC-DED445064919}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F66DFCF-B889-47C0-8AFC-DED445064919}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/Sound.suo b/Pro Windows Forms 2.0/Chapter16/Sound/Sound.suo new file mode 100644 index 0000000..f33de42 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/Sound/Sound.suo differ diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/bin/Debug/Sound.exe b/Pro Windows Forms 2.0/Chapter16/Sound/bin/Debug/Sound.exe new file mode 100644 index 0000000..302e082 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/Sound/bin/Debug/Sound.exe differ diff --git a/Pro Windows Forms 2.0/Chapter16/Sound/bin/Release/Sound.exe b/Pro Windows Forms 2.0/Chapter16/Sound/bin/Release/Sound.exe new file mode 100644 index 0000000..4403286 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter16/Sound/bin/Release/Sound.exe differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ExploreDOM.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ExploreDOM.cs new file mode 100644 index 0000000..14bc7d9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ExploreDOM.cs @@ -0,0 +1,189 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace WebBrowserTest +{ + /// + /// Summary description for ExploreDOM. + /// + public class ExploreDOM : System.Windows.Forms.Form + { + private System.Windows.Forms.Button button1; + + private System.Windows.Forms.TreeView treeDOM; + private System.Windows.Forms.WebBrowser webBrowser; + private SplitContainer splitContainer1; + + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + public ExploreDOM() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.treeDOM = new System.Windows.Forms.TreeView(); + this.webBrowser = new System.Windows.Forms.WebBrowser(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.button1.Enabled = false; + this.button1.Location = new System.Drawing.Point(3, 375); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(88, 36); + this.button1.TabIndex = 4; + this.button1.Text = "Analyze Page"; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // treeDOM + // + this.treeDOM.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeDOM.Location = new System.Drawing.Point(0, 0); + this.treeDOM.Name = "treeDOM"; + this.treeDOM.Size = new System.Drawing.Size(392, 358); + this.treeDOM.TabIndex = 5; + // + // webBrowser + // + this.webBrowser.Dock = System.Windows.Forms.DockStyle.Fill; + this.webBrowser.Location = new System.Drawing.Point(0, 0); + this.webBrowser.Name = "webBrowser"; + this.webBrowser.Size = new System.Drawing.Size(196, 358); + this.webBrowser.TabIndex = 6; + this.webBrowser.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser_DocumentCompleted); + // + // splitContainer1 + // + this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.splitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.splitContainer1.Location = new System.Drawing.Point(3, 4); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.webBrowser); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.treeDOM); + this.splitContainer1.Size = new System.Drawing.Size(600, 362); + this.splitContainer1.SplitterDistance = 200; + this.splitContainer1.TabIndex = 7; + this.splitContainer1.Text = "splitContainer1"; + // + // ExploreDOM + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(615, 426); + this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "ExploreDOM"; + this.Text = "ExploreDOM"; + this.Load += new System.EventHandler(this.ExploreDOM_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + private void ExploreDOM_Load(object sender, System.EventArgs e) + { + webBrowser.Navigate("http://www.nytimes.com"); + } + + private void button1_Click(object sender, System.EventArgs e) + { + // Analyzing a page takes a non-trivial amount of time. + // Use the hourglass cursor to warn the user. + this.Cursor = Cursors.WaitCursor; + + // Show the title. + this.Text = webBrowser.Document.Title; + + treeDOM.SuspendLayout(); + + // Process all the HTML elements on the page. + ProcessElement(webBrowser.Document.Body.Children, treeDOM.Nodes); + + treeDOM.ExpandAll(); + treeDOM.ResumeLayout(); + this.Cursor = Cursors.Default; + + } + + private void ProcessElement(HtmlElementCollection elements, TreeNodeCollection nodes) + { + // Scan through the collection of elements. + foreach (HtmlElement element in elements) + { + // Create a new node that shows the tag name. + TreeNode node = new TreeNode("<" + element.TagName + ">"); + nodes.Add(node); + + if ((element.Children.Count == 0) && (element.InnerText != null)) + { + // If this element doesn't contain any other elements, add + // any leftover text content as a new node. + node.Nodes.Add(element.InnerText); + } + else + { + // If this element contains other elements, process them recursively. + ProcessElement(element.Children, node.Nodes); + } + } + } + + private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) + { + button1.Enabled = true; + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ExploreDOM.resx b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ExploreDOM.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ExploreDOM.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/GetAllLinks.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/GetAllLinks.cs new file mode 100644 index 0000000..6d1bf79 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/GetAllLinks.cs @@ -0,0 +1,185 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace WebBrowserTest +{ + /// + /// Summary description for GetAllLinks. + /// + public class GetAllLinks : System.Windows.Forms.Form + { + + private System.Windows.Forms.Button cmdGetAllLinks; + + private System.Windows.Forms.ListBox lstLinks; + private SplitContainer splitContainer1; + private WebBrowser webBrowser; + + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + public GetAllLinks() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdGetAllLinks = new System.Windows.Forms.Button(); + this.lstLinks = new System.Windows.Forms.ListBox(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.webBrowser = new System.Windows.Forms.WebBrowser(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // cmdGetAllLinks + // + this.cmdGetAllLinks.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.cmdGetAllLinks.Enabled = false; + this.cmdGetAllLinks.Location = new System.Drawing.Point(3, 352); + this.cmdGetAllLinks.Name = "cmdGetAllLinks"; + this.cmdGetAllLinks.Size = new System.Drawing.Size(122, 30); + this.cmdGetAllLinks.TabIndex = 1; + this.cmdGetAllLinks.Text = "Get Links"; + this.cmdGetAllLinks.Click += new System.EventHandler(this.cmdGetAllLinks_Click); + // + // lstLinks + // + this.lstLinks.Dock = System.Windows.Forms.DockStyle.Fill; + this.lstLinks.FormattingEnabled = true; + this.lstLinks.IntegralHeight = false; + this.lstLinks.Location = new System.Drawing.Point(0, 0); + this.lstLinks.Name = "lstLinks"; + this.lstLinks.Size = new System.Drawing.Size(279, 337); + this.lstLinks.TabIndex = 2; + this.lstLinks.SelectedIndexChanged += new System.EventHandler(this.lstLinks_SelectedIndexChanged); + // + // splitContainer1 + // + this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.splitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.splitContainer1.Location = new System.Drawing.Point(3, 4); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.webBrowser); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.lstLinks); + this.splitContainer1.Size = new System.Drawing.Size(580, 341); + this.splitContainer1.SplitterDistance = 293; + this.splitContainer1.TabIndex = 8; + this.splitContainer1.Text = "splitContainer1"; + // + // webBrowser + // + this.webBrowser.Dock = System.Windows.Forms.DockStyle.Fill; + this.webBrowser.Location = new System.Drawing.Point(0, 0); + this.webBrowser.Name = "webBrowser"; + this.webBrowser.Size = new System.Drawing.Size(289, 337); + this.webBrowser.TabIndex = 0; + this.webBrowser.Url = new System.Uri("http://www.zdnet.com", System.UriKind.Absolute); + this.webBrowser.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser_DocumentCompleted); + // + // GetAllLinks + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(591, 391); + this.Controls.Add(this.splitContainer1); + this.Controls.Add(this.cmdGetAllLinks); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "GetAllLinks"; + this.Text = "Get All Links"; + this.Load += new System.EventHandler(this.GetAllLinks_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + private void GetAllLinks_Load(object sender, System.EventArgs e) + { + + } + + private void cmdGetAllLinks_Click(object sender, System.EventArgs e) + { + if (webBrowser.ReadyState == WebBrowserReadyState.Complete) + { + this.Cursor = Cursors.WaitCursor; + lstLinks.SuspendLayout(); + lstLinks.Items.Clear(); + + HtmlElementCollection elements = webBrowser.Document.GetElementsByTagName("A"); + foreach (HtmlElement element in elements) + { + lstLinks.Items.Add(element.GetAttribute("href")); + } + lstLinks.ResumeLayout(); + this.Cursor = Cursors.Default; + } + } + + + + HtmlElement previous = null; + + private void lstLinks_SelectedIndexChanged(object sender, System.EventArgs e) + { + HtmlElementCollection elements = webBrowser.Document.GetElementsByTagName("A"); + + if (previous != null) previous.InnerText = previous.InnerText.Substring(3); + + previous = elements[lstLinks.SelectedIndex]; + previous.InnerText = ">>>" + previous.InnerText; + + + } + + private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) + { + cmdGetAllLinks.Enabled = true; + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/GetAllLinks.resx b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/GetAllLinks.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/GetAllLinks.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button10.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button10.jpg new file mode 100644 index 0000000..90093d3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button10.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button11.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button11.jpg new file mode 100644 index 0000000..24df256 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button11.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button12.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button12.jpg new file mode 100644 index 0000000..9169af2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button12.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button13.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button13.jpg new file mode 100644 index 0000000..73276ce Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button13.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button14.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button14.jpg new file mode 100644 index 0000000..1949022 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button14.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button15.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button15.jpg new file mode 100644 index 0000000..9f21192 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button15.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button16.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button16.jpg new file mode 100644 index 0000000..ad9ec84 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button16.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button17.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button17.jpg new file mode 100644 index 0000000..26b6213 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button17.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button18.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button18.jpg new file mode 100644 index 0000000..26b28d5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button18.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button24.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button24.jpg new file mode 100644 index 0000000..66fad10 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button24.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button25.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button25.jpg new file mode 100644 index 0000000..eb189ad Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button25.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button26.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button26.jpg new file mode 100644 index 0000000..e90e3dd Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/button26.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/buttonC.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/buttonC.jpg new file mode 100644 index 0000000..d7e21a5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/buttonC.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/buttonD.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/buttonD.jpg new file mode 100644 index 0000000..60a9ea0 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/buttonD.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/buttonE.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/buttonE.jpg new file mode 100644 index 0000000..8b9ded8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/buttonE.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/feedback.htm b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/feedback.htm new file mode 100644 index 0000000..ca8d2bb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/feedback.htm @@ -0,0 +1,68 @@ + + + + + +Tell us what you think about our + + + + +
+

Tell us what you think about our web site, our products, our organization, or +anything else that comes to mind. We welcome all of your comments and +suggestions.

+
+ +

What kind of comment would you like to send?

+
+
Complaint + Problem + Suggestion + Praise
+
+

What about us do you want to comment on?

+
+
Other: +
+
+

Enter your comments in the space provided below:

+
+
+
+

Tell us how to get in touch with you:

+
+
+ + + + + + + + + +
Name +
E-mail +
+
+
+

+

+
+
+
http://www.prosetech.com
+Copyright © 2004. All rights reserved.
+Revised: +06/29/05.
+ + + + diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/sample.htm b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/sample.htm new file mode 100644 index 0000000..39a6e88 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/HTML/sample.htm @@ -0,0 +1,63 @@ + + + + + +New Page 1 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Menu.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Menu.cs new file mode 100644 index 0000000..b38ecc0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace WebBrowserTest +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("WebBrowserTest." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Menu.designer.cs new file mode 100644 index 0000000..4a11836 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Menu.designer.cs @@ -0,0 +1,122 @@ +namespace WebBrowserTest +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(167, 23); + this.button1.TabIndex = 0; + this.button1.Text = "WebBrowserDynamicContent"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(167, 23); + this.button2.TabIndex = 1; + this.button2.Text = "WebBrowserRestricted"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 70); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(167, 23); + this.button3.TabIndex = 2; + this.button3.Text = "ExploreDOM"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 99); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(167, 23); + this.button4.TabIndex = 3; + this.button4.Text = "GetAllLinks"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(12, 157); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(167, 23); + this.button5.TabIndex = 5; + this.button5.Text = "ScriptedWindow"; + this.button5.Click += new System.EventHandler(this.cmd_Click); + // + // button6 + // + this.button6.Location = new System.Drawing.Point(12, 128); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(167, 23); + this.button6.TabIndex = 4; + this.button6.Text = "ScriptedMenu"; + this.button6.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(197, 215); + this.Controls.Add(this.button5); + this.Controls.Add(this.button6); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Menu.resx b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Program.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Program.cs new file mode 100644 index 0000000..5fe60e1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace WebBrowserTest +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..706095f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WebBrowserTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WebBrowserTest")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3c797bd1-106c-40db-bcfa-2200cfaa7507")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Resources.Designer.cs new file mode 100644 index 0000000..9cd611c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "WebBrowserTest.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "WebBrowserTest.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "WebBrowserTest.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace WebBrowserTest.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebBrowserTest.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Settings.Designer.cs new file mode 100644 index 0000000..cbe2b60 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "WebBrowserTest.Properties.Settings.get_Default():WebBrowserTest.Properties.Settings")] + +namespace WebBrowserTest.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedMenu.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedMenu.cs new file mode 100644 index 0000000..0759fd2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedMenu.cs @@ -0,0 +1,100 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Runtime.InteropServices; +using System.Security; +using System.Security.Permissions; + +namespace WebBrowserTest +{ + /// + /// Summary description for ScriptedMenu. + /// + [ComVisible(true)] + public class ScriptedMenu : System.Windows.Forms.Form + { + private System.Windows.Forms.WebBrowser webBrowser; + + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + public ScriptedMenu() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.webBrowser = new System.Windows.Forms.WebBrowser(); + this.SuspendLayout(); + // + // webBrowser + // + this.webBrowser.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.webBrowser.Location = new System.Drawing.Point(4, 3); + this.webBrowser.Name = "webBrowser"; + this.webBrowser.Size = new System.Drawing.Size(422, 341); + this.webBrowser.TabIndex = 0; + // + // ScriptedMenu + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(429, 348); + this.Controls.Add(this.webBrowser); + this.Name = "ScriptedMenu"; + this.Text = "Scripted Menu"; + this.Load += new System.EventHandler(this.ScriptedMenu_Load); + this.ResumeLayout(false); + + } + #endregion + + private void ScriptedMenu_Load(object sender, System.EventArgs e) + { + webBrowser.ObjectForScripting = this; + webBrowser.Navigate(System.IO.Path.Combine(Application.StartupPath, "..\\..\\HTML\\sample.htm")); + } + + + public void WebClick(string source) + { + MessageBox.Show("Received: " + source); + } + + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedMenu.resx b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedMenu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedMenu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedWindow.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedWindow.cs new file mode 100644 index 0000000..5871104 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedWindow.cs @@ -0,0 +1,124 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Runtime.InteropServices; + +namespace WebBrowserTest +{ + /// + /// Summary description for ScriptedWindow. + /// + [ComVisible(true)] + public class ScriptedWindow : System.Windows.Forms.Form + { + private System.Windows.Forms.WebBrowser webBrowser1; + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + public ScriptedWindow() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.webBrowser1 = new System.Windows.Forms.WebBrowser(); + this.SuspendLayout(); + // + // webBrowser1 + // + this.webBrowser1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.webBrowser1.Location = new System.Drawing.Point(4, 4); + this.webBrowser1.Name = "webBrowser1"; + this.webBrowser1.Size = new System.Drawing.Size(387, 334); + this.webBrowser1.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(this.WebBrowser1_Navigating); + // + // ScriptedWindow + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(397, 345); + this.Controls.Add(this.webBrowser1); + this.Name = "ScriptedWindow"; + this.Text = "Scripted Window"; + this.Load += new System.EventHandler(this.ScriptedWindow_Load); + this.ResumeLayout(false); + + } + #endregion + + + // Configures WebBrowser1 so script code can access the form. + // Displays an initial document in WebBrowser1 which asks for the + // name of the user and passes the name to the Welcome method. + private void ScriptedWindow_Load(object sender, System.EventArgs e) + { + webBrowser1.ObjectForScripting = this; + webBrowser1.Navigate(System.IO.Path.Combine(Application.StartupPath, "..\\..\\HTML\\feedback.htm")); + } + + + + public void Feedback(string userName, string email) + { + if (userName != null) + MessageBox.Show("Welcome, " + userName + " at " + email + "."); + + MessageBox.Show("Was this a complaint? " + webBrowser1.Document.GetElementById("Complaint").GetAttribute("checked")); + // You can also interrogate other properties like this: + // Retrieve comments. + //MessageBox.Show(webBrowser1.Document.All["Comments"].GetAttribute("value")); + // Test if + //MessageBox.Show(webBrowser1.Document.All["MessageType"].GetAttribute("checked")); + //if (webBrowser1.Document.All["MessageType"].GetAttribute("Value")) + //{ + //MessageBox.Show("Complaint."); + //} + } + + + // Halts navigation if the user has not entered a name. + private void WebBrowser1_Navigating(object sender, System.Windows.Forms.WebBrowserNavigatingEventArgs e) + { + if (webBrowser1.Document.All["userName"].GetAttribute("value").Equals("")) + { + e.Cancel = true; + System.Windows.Forms.MessageBox.Show("Please enter your name."); + } + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedWindow.resx b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedWindow.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/ScriptedWindow.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserDynamicContent.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserDynamicContent.cs new file mode 100644 index 0000000..9f222f6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserDynamicContent.cs @@ -0,0 +1,38 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +#endregion + +namespace WebBrowserTest +{ + partial class WebBrowserDynamicContent : Form + { + public WebBrowserDynamicContent() + { + InitializeComponent(); + } + + private void txtHtml_KeyPress(object sender, KeyPressEventArgs e) + { + + } + + + private void txtHtml_TextChanged(object sender, EventArgs e) + { + webBrowser.DocumentText = txtHtml.Text; + } + + private void WebBrowserDynamicContent_Load(object sender, EventArgs e) + { + webBrowser.DocumentText = txtHtml.Text; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserDynamicContent.designer.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserDynamicContent.designer.cs new file mode 100644 index 0000000..0544c58 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserDynamicContent.designer.cs @@ -0,0 +1,132 @@ +namespace WebBrowserTest +{ + partial class WebBrowserDynamicContent + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txtHtml = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.panel1 = new System.Windows.Forms.Panel(); + this.webBrowser = new System.Windows.Forms.WebBrowser(); + this.groupBox1.SuspendLayout(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); +// +// txtHtml +// + this.txtHtml.AcceptsReturn = true; + this.txtHtml.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtHtml.AutoSize = false; + this.txtHtml.Location = new System.Drawing.Point(7, 20); + this.txtHtml.Multiline = true; + this.txtHtml.Name = "txtHtml"; + this.txtHtml.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtHtml.Size = new System.Drawing.Size(377, 138); + this.txtHtml.TabIndex = 0; + this.txtHtml.Text = "\r\n\r\n\r\n\r\n\r\nNew Pa" + + "ge 1\r\n\r\n\r\n\r\n\r\n

Table of Contents

\r" + + "\n
    \r\n\t
  1. How do I ... ?
  2. \r\n\t
  3. Where can I find ... ?
  4. \r\n\t
  5. Why doesn\'t ... ?
  6. \r\n\t
  7. Who is" + + " ... ?
  8. \r\n\t
  9. What is ... ?
  10. \r\n\t
  11. When is ... ?
  12. \r\n
\r\n\r\n

How do I ... ?

\r\n

[This is the answer to the ques" + + "tion.]

\r\n
Back to Top
\r\n
\r\n

W" + + "here can I find ... ?

\r\n

[This is the answer to the question.]

\r\nBack to Top\r\n
\r\n

Why doesn\'t ... ?" + + "

\r\n

[This is the answer to the question.]

\r\n
Back" + + " to Top
\r\n
\r\n

Who is ... ?

\r\n

[This is the" + + " answer to the question.]

\r\n
Back to Top
\r\n
\r\nWhat is ... ?\r\n

[This is the answer to the question." + + "]

\r\n
Back to Top
\r\n
\r\n

When is" + + " ... ?

\r\n

[This is the answer to the question.]

\r\n
Back to Top
\r\n
\r\n
Author information goes here.
\r\nCopyright ©" + + " 2001  [OrganizationName]. All rights reserved.
\r\nRevised: .
\r\n\r\n\r\n\r\n"; + this.txtHtml.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtHtml_KeyPress); + this.txtHtml.TextChanged += new System.EventHandler(this.txtHtml_TextChanged); +// +// groupBox1 +// + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.Controls.Add(this.txtHtml); + this.groupBox1.Location = new System.Drawing.Point(7, 9); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(390, 164); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Enter HTML Here"; +// +// panel1 +// + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.Controls.Add(this.webBrowser); + this.panel1.Location = new System.Drawing.Point(10, 189); + this.panel1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 3); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(384, 247); + this.panel1.TabIndex = 8; +// +// webBrowser +// + this.webBrowser.Dock = System.Windows.Forms.DockStyle.Fill; + this.webBrowser.Location = new System.Drawing.Point(0, 0); + this.webBrowser.Margin = new System.Windows.Forms.Padding(3, 1, 3, 3); + this.webBrowser.Name = "webBrowser"; + this.webBrowser.Size = new System.Drawing.Size(382, 245); + this.webBrowser.TabIndex = 1; +// +// WebBrowserDynamicContent +// + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(409, 448); + this.Controls.Add(this.panel1); + this.Controls.Add(this.groupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "WebBrowserDynamicContent"; + this.Text = "WebBrowser With Dynamic Content"; + this.Load += new System.EventHandler(this.WebBrowserDynamicContent_Load); + this.groupBox1.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TextBox txtHtml; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.WebBrowser webBrowser; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserRestricted.Designer.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserRestricted.Designer.cs new file mode 100644 index 0000000..d8b6ac2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserRestricted.Designer.cs @@ -0,0 +1,117 @@ +namespace WebBrowserTest +{ + partial class WebBrowserRestricted + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.statusBar = new System.Windows.Forms.ToolStripStatusLabel(); + this.progressBar = new System.Windows.Forms.ToolStripProgressBar(); + this.panel1 = new System.Windows.Forms.Panel(); + this.webBrowser1 = new System.Windows.Forms.WebBrowser(); + this.statusStrip1.SuspendLayout(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.progressBar, + this.statusBar}); + this.statusStrip1.Location = new System.Drawing.Point(0, 349); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(425, 22); + this.statusStrip1.TabIndex = 1; + this.statusStrip1.Text = "statusStrip1"; + // + // statusBar + // + this.statusBar.Name = "statusBar"; + this.statusBar.Size = new System.Drawing.Size(277, 17); + this.statusBar.Spring = true; + // + // progressBar + // + this.progressBar.Name = "progressBar"; + this.progressBar.Size = new System.Drawing.Size(100, 16); + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.Controls.Add(this.webBrowser1); + this.panel1.Location = new System.Drawing.Point(12, 12); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(401, 323); + this.panel1.TabIndex = 2; + // + // webBrowser1 + // + this.webBrowser1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.webBrowser1.Location = new System.Drawing.Point(0, 0); + this.webBrowser1.Name = "webBrowser1"; + this.webBrowser1.Size = new System.Drawing.Size(399, 321); + this.webBrowser1.TabIndex = 0; + this.webBrowser1.StatusTextChanged += new System.EventHandler(this.webBrowser1_StatusTextChanged); + this.webBrowser1.Navigated += new System.Windows.Forms.WebBrowserNavigatedEventHandler(this.webBrowser1_Navigated); + this.webBrowser1.ProgressChanged += new System.Windows.Forms.WebBrowserProgressChangedEventHandler(this.webBrowser1_ProgressChanged); + this.webBrowser1.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(this.webBrowser1_Navigating); + this.webBrowser1.NewWindow += new System.ComponentModel.CancelEventHandler(this.webBrowser1_NewWindow); + this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted); + // + // WebBrowserRestricted + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(425, 371); + this.Controls.Add(this.panel1); + this.Controls.Add(this.statusStrip1); + this.Name = "WebBrowserRestricted"; + this.Text = "WebBrowserRestricted"; + this.Load += new System.EventHandler(this.WebBrowserRestricted_Load); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.panel1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.WebBrowser webBrowser1; + private System.Windows.Forms.ToolStripStatusLabel statusBar; + private System.Windows.Forms.ToolStripProgressBar progressBar; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserRestricted.cs b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserRestricted.cs new file mode 100644 index 0000000..ecad67a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserRestricted.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace WebBrowserTest +{ + public partial class WebBrowserRestricted : Form + { + public WebBrowserRestricted() + { + InitializeComponent(); + } + + private void WebBrowserRestricted_Load(object sender, EventArgs e) + { + webBrowser1.Navigate("http://msdn.microsoft.com"); + } + + private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) + { + // This is the key event. + // Here you decide whether to allow navigation to the selected page. + + + // Check the domain. + // In this case, only allow the home site. + if (!e.Url.Host.Contains("microsoft.com")) + { + MessageBox.Show("Site restricted for demonstration purposes."); + e.Cancel = true; + } + + // Check the page. + string page = System.IO.Path.GetFileName(e.Url.LocalPath); + if (page.StartsWith("s")) + { + MessageBox.Show("Page restricted for demonstration purposes."); + e.Cancel = true; + } + } + + private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) + { + // Show the progress bar. + progressBar.Visible = true; + } + + private void webBrowser1_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e) + { + // Update the progress bar. + progressBar.Maximum = (int)e.MaximumProgress; + if (e.CurrentProgress >= 0 && e.CurrentProgress <= e.MaximumProgress) + { + progressBar.Value = (int)e.CurrentProgress; + } + } + + private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) + { + // Hide the progress bar. + progressBar.Visible = false; + } + + private void webBrowser1_StatusTextChanged(object sender, EventArgs e) + { + // Display the text that IE would ordinarily show + // in the status bar. + statusBar.Text = webBrowser1.StatusText; + } + + private void webBrowser1_NewWindow(object sender, CancelEventArgs e) + { + // Never allow external windows. + e.Cancel = true; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserRestricted.resx b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserRestricted.resx new file mode 100644 index 0000000..b9c202b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserRestricted.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.csproj b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.csproj new file mode 100644 index 0000000..32cd88f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.csproj @@ -0,0 +1,166 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {C60B5F66-7E1A-4739-B0DB-CAF0526F2BF6} + WinExe + Properties + WebBrowserTest + WebBrowserTest + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form + + + Form + + + Menu.cs + + + Form + + + Form + + + Form + + + WebBrowserDynamicContent.cs + + + Form + + + WebBrowserRestricted.cs + + + + + Designer + ExploreDOM.cs + + + GetAllLinks.cs + + + Menu.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + Designer + ScriptedMenu.cs + + + ScriptedWindow.cs + + + Designer + WebBrowserRestricted.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.csproj.user b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.sln b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.sln new file mode 100644 index 0000000..e87fca6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebBrowserTest", "WebBrowserTest.csproj", "{C60B5F66-7E1A-4739-B0DB-CAF0526F2BF6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C60B5F66-7E1A-4739-B0DB-CAF0526F2BF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C60B5F66-7E1A-4739-B0DB-CAF0526F2BF6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C60B5F66-7E1A-4739-B0DB-CAF0526F2BF6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C60B5F66-7E1A-4739-B0DB-CAF0526F2BF6}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.suo b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.suo new file mode 100644 index 0000000..b7847bd Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/WebBrowserTest.suo differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button10.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button10.jpg new file mode 100644 index 0000000..90093d3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button10.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button11.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button11.jpg new file mode 100644 index 0000000..24df256 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button11.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button12.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button12.jpg new file mode 100644 index 0000000..9169af2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button12.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button13.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button13.jpg new file mode 100644 index 0000000..73276ce Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button13.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button14.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button14.jpg new file mode 100644 index 0000000..1949022 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button14.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button15.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button15.jpg new file mode 100644 index 0000000..9f21192 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button15.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button16.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button16.jpg new file mode 100644 index 0000000..ad9ec84 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button16.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button17.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button17.jpg new file mode 100644 index 0000000..26b6213 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button17.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button18.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button18.jpg new file mode 100644 index 0000000..26b28d5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button18.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button24.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button24.jpg new file mode 100644 index 0000000..66fad10 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button24.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button25.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button25.jpg new file mode 100644 index 0000000..eb189ad Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button25.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button26.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button26.jpg new file mode 100644 index 0000000..e90e3dd Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/button26.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/buttonC.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/buttonC.jpg new file mode 100644 index 0000000..d7e21a5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/buttonC.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/buttonD.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/buttonD.jpg new file mode 100644 index 0000000..60a9ea0 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/buttonD.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/buttonE.jpg b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/buttonE.jpg new file mode 100644 index 0000000..8b9ded8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/buttonE.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/feedback.htm b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/feedback.htm new file mode 100644 index 0000000..ca8d2bb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/feedback.htm @@ -0,0 +1,68 @@ + + + + + +Tell us what you think about our + + + + +
+

Tell us what you think about our web site, our products, our organization, or +anything else that comes to mind. We welcome all of your comments and +suggestions.

+
+ +

What kind of comment would you like to send?

+
+
Complaint + Problem + Suggestion + Praise
+
+

What about us do you want to comment on?

+
+
Other: +
+
+

Enter your comments in the space provided below:

+
+
+
+

Tell us how to get in touch with you:

+
+
+ + + + + + + + + +
Name +
E-mail +
+
+
+

+

+
+
+
http://www.prosetech.com
+Copyright © 2004. All rights reserved.
+Revised: +06/29/05.
+ + + + diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/sample.htm b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/sample.htm new file mode 100644 index 0000000..39a6e88 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/HTML/sample.htm @@ -0,0 +1,63 @@ + + + + + +New Page 1 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/WebBrowserTest.exe b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/WebBrowserTest.exe new file mode 100644 index 0000000..3417833 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter17/WebBrowserTest/bin/Debug/WebBrowserTest.exe differ diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.csproj b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.csproj new file mode 100644 index 0000000..c735227 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {626E2545-F739-460B-9CED-9D04C6C1834F} + WinExe + Properties + ErrorProviderValidation + ErrorProviderValidation + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.csproj.user b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.sln b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.sln new file mode 100644 index 0000000..ade9f58 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ErrorProviderValidation", "ErrorProviderValidation.csproj", "{626E2545-F739-460B-9CED-9D04C6C1834F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {626E2545-F739-460B-9CED-9D04C6C1834F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {626E2545-F739-460B-9CED-9D04C6C1834F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {626E2545-F739-460B-9CED-9D04C6C1834F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {626E2545-F739-460B-9CED-9D04C6C1834F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.suo b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.suo new file mode 100644 index 0000000..b6b286c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/ErrorProviderValidation.suo differ diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Form1.Designer.cs new file mode 100644 index 0000000..a47a217 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Form1.Designer.cs @@ -0,0 +1,165 @@ +namespace ErrorProviderValidation +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.errProvider = new System.Windows.Forms.ErrorProvider(this.components); + this.grpValidation = new System.Windows.Forms.GroupBox(); + this.Label3 = new System.Windows.Forms.Label(); + this.txtEmail = new System.Windows.Forms.TextBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtFirstName = new System.Windows.Forms.TextBox(); + this.txtLastName = new System.Windows.Forms.TextBox(); + this.cmdOK = new System.Windows.Forms.Button(); + this.cmdClose = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.errProvider)).BeginInit(); + this.grpValidation.SuspendLayout(); + this.SuspendLayout(); + // + // errProvider + // + this.errProvider.ContainerControl = this; + this.errProvider.DataMember = ""; + // + // grpValidation + // + this.grpValidation.Controls.Add(this.Label3); + this.grpValidation.Controls.Add(this.txtEmail); + this.grpValidation.Controls.Add(this.Label2); + this.grpValidation.Controls.Add(this.Label1); + this.grpValidation.Controls.Add(this.txtFirstName); + this.grpValidation.Controls.Add(this.txtLastName); + this.grpValidation.Location = new System.Drawing.Point(5, 9); + this.grpValidation.Name = "grpValidation"; + this.grpValidation.Size = new System.Drawing.Size(368, 124); + this.grpValidation.TabIndex = 15; + this.grpValidation.TabStop = false; + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(16, 88); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(64, 16); + this.Label3.TabIndex = 10; + this.Label3.Text = "Email:"; + // + // txtEmail + // + this.txtEmail.Location = new System.Drawing.Point(84, 84); + this.txtEmail.Name = "txtEmail"; + this.txtEmail.Size = new System.Drawing.Size(152, 21); + this.txtEmail.TabIndex = 9; + this.txtEmail.TextChanged += new System.EventHandler(this.txtEmail_TextChanged); + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 52); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(64, 16); + this.Label2.TabIndex = 8; + this.Label2.Text = "Last Name:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 28); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(64, 16); + this.Label1.TabIndex = 7; + this.Label1.Text = "First Name:"; + // + // txtFirstName + // + this.txtFirstName.Location = new System.Drawing.Point(84, 24); + this.txtFirstName.Name = "txtFirstName"; + this.txtFirstName.Size = new System.Drawing.Size(152, 21); + this.txtFirstName.TabIndex = 4; + this.txtFirstName.Validating += new System.ComponentModel.CancelEventHandler(this.txtName_Validating); + // + // txtLastName + // + this.txtLastName.Location = new System.Drawing.Point(84, 48); + this.txtLastName.Name = "txtLastName"; + this.txtLastName.Size = new System.Drawing.Size(152, 21); + this.txtLastName.TabIndex = 5; + this.txtLastName.Validating += new System.ComponentModel.CancelEventHandler(this.txtName_Validating); + // + // cmdOK + // + this.cmdOK.Location = new System.Drawing.Point(118, 206); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size(76, 24); + this.cmdOK.TabIndex = 14; + this.cmdOK.Text = "OK"; + this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); + // + // cmdClose + // + this.cmdClose.CausesValidation = false; + this.cmdClose.Location = new System.Drawing.Point(200, 206); + this.cmdClose.Name = "cmdClose"; + this.cmdClose.Size = new System.Drawing.Size(76, 24); + this.cmdClose.TabIndex = 16; + this.cmdClose.Text = "Cancel"; + this.cmdClose.Click += new System.EventHandler(this.cmdClose_Click); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(385, 242); + this.Controls.Add(this.cmdClose); + this.Controls.Add(this.cmdOK); + this.Controls.Add(this.grpValidation); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + ((System.ComponentModel.ISupportInitialize)(this.errProvider)).EndInit(); + this.grpValidation.ResumeLayout(false); + this.grpValidation.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ErrorProvider errProvider; + private System.Windows.Forms.Button cmdClose; + private System.Windows.Forms.Button cmdOK; + private System.Windows.Forms.GroupBox grpValidation; + private System.Windows.Forms.Label Label3; + private System.Windows.Forms.TextBox txtEmail; + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.TextBox txtFirstName; + private System.Windows.Forms.TextBox txtLastName; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Form1.cs b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Form1.cs new file mode 100644 index 0000000..629dcf4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Form1.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ErrorProviderValidation +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void cmdClose_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void cmdOK_Click(object sender, EventArgs e) + { + bool invalidInput = false; + + foreach (Control ctrl in this.grpValidation.Controls) + { + if (errProvider.GetError(ctrl) != "") + { + invalidInput = true; + break; + } + } + + if (invalidInput) + { + MessageBox.Show("You still have invalid input.", "Invalid Input", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + else + { + this.Close(); + } + + } + + private void txtName_Validating(object sender, System.ComponentModel.CancelEventArgs e) + { + Control ctrl = (Control)sender; + if (ctrl.Text == "") + { + errProvider.SetError(ctrl, "You must enter a first and last name."); + } + else + { + errProvider.SetError(ctrl, ""); + } + } + + + private void txtEmail_TextChanged(object sender, System.EventArgs e) + { + System.Text.RegularExpressions.Regex regex; + regex = new System.Text.RegularExpressions.Regex(@"^\S+@\S+\.\S+$"); + + Control ctrl = (Control)sender; + if (regex.IsMatch(ctrl.Text)) + { + errProvider.SetError(ctrl, ""); + } + else + { + errProvider.SetError(ctrl, "Not a valid email."); + } + } + + private void Form1_Load(object sender, EventArgs e) + { + txtFirstName.Select(); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Form1.resx b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Form1.resx new file mode 100644 index 0000000..88b5d4b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Program.cs b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Program.cs new file mode 100644 index 0000000..6aafcc4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ErrorProviderValidation +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f84f1e2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ErrorProviderValidation")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ErrorProviderValidation")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6230f064-6b5d-4ae6-b03c-1198c1a5f7e8")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Resources.Designer.cs new file mode 100644 index 0000000..3e9c1d7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ErrorProviderValidation.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ErrorProviderValidation.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ErrorProviderValidation.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace ErrorProviderValidation.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ErrorProviderValidation.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Settings.Designer.cs new file mode 100644 index 0000000..bc83446 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ErrorProviderValidation.Properties.Settings.get_Default():ErrorProviderValidation.Properties.Settings")] + +namespace ErrorProviderValidation.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/bin/Debug/ErrorProviderValidation.exe b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/bin/Debug/ErrorProviderValidation.exe new file mode 100644 index 0000000..2487b7c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/ErrorProviderValidation/bin/Debug/ErrorProviderValidation.exe differ diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Form2.Designer.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Form2.Designer.cs new file mode 100644 index 0000000..dfa3339 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Form2.Designer.cs @@ -0,0 +1,81 @@ +namespace MaskedComboBoxControl +{ + partial class Form2 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.maskedTextBox1 = new System.Windows.Forms.MaskedTextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.SuspendLayout(); + // + // maskedTextBox1 + // + this.maskedTextBox1.InsertKeyMode = System.Windows.Forms.InsertKeyMode.Overwrite; + this.maskedTextBox1.Location = new System.Drawing.Point(142, 38); + this.maskedTextBox1.Mask = "(999) 000-0000"; + this.maskedTextBox1.Name = "maskedTextBox1"; + this.maskedTextBox1.ResetOnPrompt = false; + this.maskedTextBox1.ResetOnSpace = false; + this.maskedTextBox1.Size = new System.Drawing.Size(100, 21); + this.maskedTextBox1.TabIndex = 0; + this.maskedTextBox1.MaskInputRejected += new System.Windows.Forms.MaskInputRejectedEventHandler(this.maskedTextBox1_MaskInputRejected); + this.maskedTextBox1.TextChanged += new System.EventHandler(this.maskedTextBox1_TextChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(34, 41); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(81, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Phone Number:"; + // + // Form2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(324, 132); + this.Controls.Add(this.label1); + this.Controls.Add(this.maskedTextBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form2"; + this.Text = "MaskedTextBox Test"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MaskedTextBox maskedTextBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ToolTip toolTip1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Form2.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Form2.cs new file mode 100644 index 0000000..42eb6eb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Form2.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MaskedComboBoxControl +{ + public partial class Form2 : Form + { + public Form2() + { + InitializeComponent(); + } + + private void maskedTextBox1_MaskInputRejected(object sender, + MaskInputRejectedEventArgs e) + { + Control control = (Control)sender; + // Show an error notification. + toolTip1.Show("That character is not allowed in this text box.", + control, new Point(control.Height, control.Height + 1)); + } + + private void maskedTextBox1_TextChanged(object sender, EventArgs e) + { + // Hide any error messages. + toolTip1.Hide((IWin32Window)sender); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Form2.resx b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Form2.resx new file mode 100644 index 0000000..9454f3d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Form2.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBox.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBox.cs new file mode 100644 index 0000000..7a2c539 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBox.cs @@ -0,0 +1,167 @@ +using System; +using System.ComponentModel; +using System.Drawing.Design; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.Runtime.InteropServices; + +namespace MaskedComboBoxControl +{ + public class MaskedComboBox : ComboBox + { + private MaskedTextProvider maskProvider = null; + + // Used to check Insert key state. + [DllImport("user32.dll")] + extern static int GetKeyState(int key); + + + public string Mask + { + get + { + if (maskProvider == null) + { + return ""; + } + else + { + return maskProvider.Mask; + } + } + set + { + if (value == "") + { + maskProvider = null; + this.Text = ""; + } + else + { + // This seems to be necessary because Mask is read-only. + maskProvider = new MaskedTextProvider(value); + this.Text = maskProvider.ToDisplayString(); + } + } + } + + + + public bool MaskCompleted + { + get + { + if (maskProvider == null) + { + return false; + } + else + { + return maskProvider.MaskCompleted; + } + } + } + + protected override void OnKeyDown(KeyEventArgs e) + { + int pos = this.SelectionStart; + + // Deleting a character (Delete key). + // Currently this does nothing if you try to delete + // a format character (unliked MaskedTextBox, which + // deletes the next input character). + // Could use our private SkipToEditableCharacter + // method to change this behavior. + if ((int)e.KeyCode == (int)Keys.Delete && pos < (this.Text.Length)) + { + if (maskProvider.RemoveAt(pos)) + { + RefreshText(pos); + } + e.Handled = true; + } + base.OnKeyDown(e); + } + + protected override void OnKeyPress(KeyPressEventArgs e) + { + if (maskProvider != null) + { + int pos = this.SelectionStart; + + // Deleting a character (backspace). + // Currently this steps over a format character + // (unliked MaskedTextBox, which steps over and + // deletes the next input character). + // Could use our private SkipToEditableCharacter + // method to change this behavior. + if ((int)e.KeyChar == (int)Keys.Back) + { + if (pos > 0) + { + pos--; + maskProvider.RemoveAt(pos); + } + } + // Adding a character. + else if (pos < this.Text.Length) + { + pos = SkipToEditableCharacter(pos); + + // Overwrite mode is on. + if (GetKeyState((int)Keys.Insert) == 1) + { + if (maskProvider.Replace(e.KeyChar, pos)) + { + pos++; + } + } + // Insert mode is on. + else + { + if (maskProvider.InsertAt(e.KeyChar, pos)) + { + pos++; + } + } + + // Find the new cursor position. + pos = SkipToEditableCharacter(pos); + } + RefreshText(pos); + e.Handled = true; + } + + base.OnKeyPress(e); + } + + + private void RefreshText(int pos) + { + // Refresh string. + // Any way to do this more efficiently? + // Spec mentions enumerating over characters, but I don't + // think that makes a difference here (as changing any character + // in essence creates a new string object). + this.Text = maskProvider.ToDisplayString(); + + // Position cursor. + this.SelectionStart = pos; + } + + // Finds the next non-mask character. + private int SkipToEditableCharacter(int startPos) + { + int newPos = maskProvider.FindEditPositionFrom(startPos, true); + if (newPos == -1) + { + // Already at the end of the string. + return startPos; + } + else + { + return newPos; + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.csproj b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.csproj new file mode 100644 index 0000000..1c8a46d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.csproj @@ -0,0 +1,93 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {CBAA14D4-7D86-4676-AED7-06E53FEDCC5D} + WinExe + Properties + MaskedComboBoxControl + MaskedComboBoxControl + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + Form + + + MaskedComboBoxPropertyGrid.cs + + + Form + + + MaskedComboBoxTest.cs + + + Form + + + Form2.cs + + + Component + + + + + MaskedComboBoxPropertyGrid.cs + + + MaskedComboBoxTest.cs + + + Form2.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.csproj.user b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.sln b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.sln new file mode 100644 index 0000000..e63a5e4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MaskedComboBoxControl", "MaskedComboBoxControl.csproj", "{CBAA14D4-7D86-4676-AED7-06E53FEDCC5D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CBAA14D4-7D86-4676-AED7-06E53FEDCC5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CBAA14D4-7D86-4676-AED7-06E53FEDCC5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CBAA14D4-7D86-4676-AED7-06E53FEDCC5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CBAA14D4-7D86-4676-AED7-06E53FEDCC5D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.suo b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.suo new file mode 100644 index 0000000..f826353 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxControl.suo differ diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxPropertyGrid.Designer.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxPropertyGrid.Designer.cs new file mode 100644 index 0000000..3a3c79e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxPropertyGrid.Designer.cs @@ -0,0 +1,71 @@ +namespace MaskedComboBoxControl +{ + partial class MaskedComboBoxPropertyGrid + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.maskedComboBox1 = new MaskedComboBoxControl.MaskedComboBox(); + this.propertyGrid1 = new System.Windows.Forms.PropertyGrid(); + this.SuspendLayout(); + // + // maskedComboBox1 + // + this.maskedComboBox1.FormattingEnabled = true; + this.maskedComboBox1.Location = new System.Drawing.Point(12, 12); + this.maskedComboBox1.Mask = ""; + this.maskedComboBox1.Name = "maskedComboBox1"; + this.maskedComboBox1.Size = new System.Drawing.Size(121, 21); + this.maskedComboBox1.TabIndex = 0; + // + // propertyGrid1 + // + this.propertyGrid1.Location = new System.Drawing.Point(12, 52); + this.propertyGrid1.Name = "propertyGrid1"; + this.propertyGrid1.SelectedObject = this.maskedComboBox1; + this.propertyGrid1.Size = new System.Drawing.Size(242, 202); + this.propertyGrid1.TabIndex = 1; + // + // MaskedComboBoxPropertyGrid + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.propertyGrid1); + this.Controls.Add(this.maskedComboBox1); + this.Name = "MaskedComboBoxPropertyGrid"; + this.Text = "MaskedComboBoxPropertyGrid"; + this.Load += new System.EventHandler(this.MaskedComboBoxPropertyGrid_Load); + this.ResumeLayout(false); + + } + + #endregion + + private MaskedComboBox maskedComboBox1; + private System.Windows.Forms.PropertyGrid propertyGrid1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxPropertyGrid.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxPropertyGrid.cs new file mode 100644 index 0000000..269b62c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxPropertyGrid.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MaskedComboBoxControl +{ + public partial class MaskedComboBoxPropertyGrid : Form + { + public MaskedComboBoxPropertyGrid() + { + InitializeComponent(); + } + + private void MaskedComboBoxPropertyGrid_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxPropertyGrid.resx b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxPropertyGrid.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxPropertyGrid.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxTest.Designer.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxTest.Designer.cs new file mode 100644 index 0000000..6effcb5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxTest.Designer.cs @@ -0,0 +1,72 @@ +namespace MaskedComboBoxControl +{ + partial class MaskedComboBoxTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.maskedComboBox1 = new MaskedComboBoxControl.MaskedComboBox(); + this.maskedTextBox1 = new System.Windows.Forms.MaskedTextBox(); + this.SuspendLayout(); + // + // maskedComboBox1 + // + this.maskedComboBox1.FormattingEnabled = true; + this.maskedComboBox1.Location = new System.Drawing.Point(48, 70); + this.maskedComboBox1.Mask = ""; + this.maskedComboBox1.Name = "maskedComboBox1"; + this.maskedComboBox1.Size = new System.Drawing.Size(121, 21); + this.maskedComboBox1.TabIndex = 0; + // + // maskedTextBox1 + // + this.maskedTextBox1.Location = new System.Drawing.Point(48, 97); + this.maskedTextBox1.Mask = "(999) 000-0000"; + this.maskedTextBox1.Name = "maskedTextBox1"; + this.maskedTextBox1.Size = new System.Drawing.Size(121, 20); + this.maskedTextBox1.TabIndex = 1; + // + // MaskedComboBoxTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.maskedTextBox1); + this.Controls.Add(this.maskedComboBox1); + this.Name = "MaskedComboBoxTest"; + this.Text = "MaskedComboBox Test"; + this.Load += new System.EventHandler(this.MaskedComboBoxTest_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private MaskedComboBox maskedComboBox1; + private System.Windows.Forms.MaskedTextBox maskedTextBox1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxTest.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxTest.cs new file mode 100644 index 0000000..0373074 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxTest.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MaskedComboBoxControl +{ + public partial class MaskedComboBoxTest : Form + { + public MaskedComboBoxTest() + { + InitializeComponent(); + } + + private void MaskedComboBoxTest_Load(object sender, EventArgs e) + { + maskedComboBox1.Mask = maskedTextBox1.Mask; + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxTest.resx b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxTest.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/MaskedComboBoxTest.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Program.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Program.cs new file mode 100644 index 0000000..7327c1c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace MaskedComboBoxControl +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new MaskedComboBoxTest()); + //Application.Run(new MaskedComboBoxPropertyGrid()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1f92245 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MaskedComboBox")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MaskedComboBox")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7bea78b8-944c-4a94-a7a3-2712bc1dc667")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Resources.Designer.cs new file mode 100644 index 0000000..c61c69e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Resources.Designer.cs @@ -0,0 +1,68 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="MaskedComboBoxControl.Properties.Resources.get_ResourceManager():System.Resources" + + ".ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="MaskedComboBoxControl.Properties.Resources.get_Culture():System.Globalization.Cul" + + "tureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="MaskedComboBoxControl.Properties.Resources.set_Culture(System.Globalization.Cultu" + + "reInfo):Void")] + +namespace MaskedComboBoxControl.Properties { + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MaskedComboBoxControl.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Settings.Designer.cs new file mode 100644 index 0000000..26f3e95 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Settings.Designer.cs @@ -0,0 +1,28 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="MaskedComboBoxControl.Properties.Settings.get_Default():MaskedComboBoxControl.Pro" + + "perties.Settings")] + +namespace MaskedComboBoxControl.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/bin/Debug/MaskedComboBox.exe b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/bin/Debug/MaskedComboBox.exe new file mode 100644 index 0000000..ddaf9d7 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/bin/Debug/MaskedComboBox.exe differ diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/bin/Debug/MaskedComboBoxControl.exe b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/bin/Debug/MaskedComboBoxControl.exe new file mode 100644 index 0000000..d56c5bd Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/bin/Debug/MaskedComboBoxControl.exe differ diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/bin/Release/MaskedComboBox.exe b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/bin/Release/MaskedComboBox.exe new file mode 100644 index 0000000..355fb85 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/MaskedComboBoxControl/bin/Release/MaskedComboBox.exe differ diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/App.ico b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/AssemblyInfo.cs new file mode 100644 index 0000000..9f020af --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/AssemblyInfo.cs @@ -0,0 +1,73 @@ +//--------------------------------------------------------------------- +// This file is part of the Microsoft .NET Framework SDK Code Samples. +// +// Copyright (C) 2004 Microsoft Corporation. All rights reserved. +// +//This source code is intended only as a supplement to Microsoft +//Development Tools and/or on-line documentation. See these other +//materials for detailed information regarding Microsoft code samples. +// +//THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY +//KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +//IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +//PARTICULAR PURPOSE. +//--------------------------------------------------------------------- + +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Form1.cs b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Form1.cs new file mode 100644 index 0000000..fae561f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Form1.cs @@ -0,0 +1,213 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; +using System.Reflection; +using System.IO; +using Microsoft.VisualBasic; +using System.Globalization; + +namespace Microsoft.Samples +{ + /// + /// Summary description for form. + /// + public partial class Form1 : System.Windows.Forms.Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + private IPv5 ip; + + private static uint logCount = 1; + + public Form1() + { + InitializeComponent(); + } + + // Event handlers + private void Form1_Load(object sender, System.EventArgs e) + { + // Add items to the ComboBoxes + this.prompCharComboBox.Items.AddRange(new object[] { + "_", + " ", + "$", + "#", + "N", + "A"}); + + this.passwordCharCombo.Items.AddRange(new object[] { + " ", + "*", + "#", + "^", + "P", + "O"}); + + this.textMaskFormatComboBox.Items.AddRange(Enum.GetNames(typeof(MaskFormat))); + this.copyMaskFormatComboBox.Items.AddRange(Enum.GetNames(typeof(MaskFormat))); + + // Sync up properties UI to MaskedTextBox + SyncUIToControl(); + + // Setup MaskedTextBox validating type + this.maskedTextBox1.ValidatingType = typeof(IPv5); + + // Bind outPutTextBox.Text to MaskedTextBox.Text + this.outputTextBox.DataBindings.Add(new Binding("Text", this.maskedTextBox1, "Text", false, DataSourceUpdateMode.OnPropertyChanged, CultureInfo.CurrentCulture)); + } + + private void maskedTextBox1_MaskInputRejected(object sender, System.Windows.Forms.MaskInputRejectedEventArgs e) + { + AppendLog("Mask input rejected at position: " + e.Position.ToString(CultureInfo.CurrentCulture)); + this.eventLogTextBox.ScrollToCaret(); + } + + private void maskedTextBox1_TypeValidationCompleted(object sender, System.Windows.Forms.TypeValidationEventArgs e) + { + if (e.IsValidInput) + { + AppendLog("Type validation succeeded. Message: " + e.Message); + ip = e.ReturnValue as IPv5; + } + else + { + ip = IPv5.InvalidIPv5; + + AppendLog("Type validation failed. Message: " + e.Message); + this.eventLogTextBox.ScrollToCaret(); + } + } + + // Methods + private void SyncUIToControl() + { + this.hidePromptOnLeaveCheckBox.Checked = this.maskedTextBox1.HidePromptOnLeave; + this.useSystemPasswordCharCheckBox.Checked = this.maskedTextBox1.UseSystemPasswordChar; + this.beepOnErrorCheckBox.Checked = this.maskedTextBox1.BeepOnError; + + this.passwordCharCombo.SelectedIndex = 0; + this.prompCharComboBox.SelectedIndex = 0; + this.textMaskFormatComboBox.SelectedIndex = 3; + this.copyMaskFormatComboBox.SelectedIndex = 3; + + // Set the Insert key mode checkbox + this.maskedTextBox1.InsertKeyMode = InsertKeyMode.Insert; + this.InsertKeyModeCheckBox.Checked = true; + + // Set read only properties + this.maskCompletedStatusStripPanel.Text = "Mask Completed: " + this.maskedTextBox1.MaskCompleted.ToString(); + this.maskFullStatusStripPanel.Text = "Mask Full: " + this.maskedTextBox1.MaskFull.ToString(); + } + + private void maskedTextBox1_TextChanged(object sender, System.EventArgs e) + { + this.maskCompletedStatusStripPanel.Text = "Mask Completed: " + this.maskedTextBox1.MaskCompleted.ToString(); + this.maskFullStatusStripPanel.Text = "Mask Full: " + this.maskedTextBox1.MaskFull.ToString(); + } + + private void propertyCheckBox_CheckedChanged(object sender, System.EventArgs e) + { + // Cast the sender to a CheckBox + CheckBox cb = sender as CheckBox; + + // Make sure we don't have a null ref + if (cb != null) + { + // Switch on the CheckBoxes name and + // set the corresponding property value + switch (cb.Name) + { + case "hidePromptOnLeaveCheckBox": + this.maskedTextBox1.HidePromptOnLeave = cb.Checked; + break; + case "includeLiteralsCheckBox": + this.maskedTextBox1.SkipLiterals = cb.Checked; + break; + case "includePromptCheckBox": + this.maskedTextBox1.AllowPromptAsInput = cb.Checked; + break; + case "useSystemPasswordCharCheckBox": + this.maskedTextBox1.UseSystemPasswordChar = cb.Checked; + break; + case "beepOnErrorCheckBox": + this.maskedTextBox1.BeepOnError = cb.Checked; + break; + case "InsertKeyModeCheckBox": + if (cb.Checked) + { + this.maskedTextBox1.InsertKeyMode = InsertKeyMode.Insert; + } + else + { + this.maskedTextBox1.InsertKeyMode = InsertKeyMode.Overwrite; + } + break; + } + } + } + + private void passwordCharCombo_SelectedIndexChanged(object sender, System.EventArgs e) + { + try + { + // Set the PasswordChar + char pwdChar = this.passwordCharCombo.SelectedItem.ToString().ToCharArray()[0]; + + // Special case a space as the null char + if( pwdChar == ' ') + { + pwdChar = '\0'; + } + + this.maskedTextBox1.PasswordChar = pwdChar; + } + catch(InvalidOperationException ex ) + { + MessageBox.Show( ex.Message ); + this.passwordCharCombo.SelectedIndex = 0; + } + } + + private void prompCharComboBox_SelectedIndexChanged(object sender, System.EventArgs e) + { + try + { + // Set the PromptChar + this.maskedTextBox1.PromptChar = this.prompCharComboBox.SelectedItem.ToString().ToCharArray()[0]; + } + catch (InvalidOperationException ex) + { + MessageBox.Show(ex.Message); + this.prompCharComboBox.SelectedIndex = 0; + } + } + + private void textMaskFormatComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + this.maskedTextBox1.TextMaskFormat = (MaskFormat)Enum.Parse(typeof(MaskFormat), this.textMaskFormatComboBox.SelectedItem.ToString()); + } + + private void copyMaskFormatComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + this.maskedTextBox1.CutCopyMaskFormat = (MaskFormat)Enum.Parse(typeof(MaskFormat), this.textMaskFormatComboBox.SelectedItem.ToString()); + } + + private void button1_Click(object sender, System.EventArgs e) + { + MessageBox.Show("IP Address: " + ip.ToString(), "MaskedTextBox.Value", MessageBoxButtons.OK); + } + + private void AppendLog(string msg) + { + this.eventLogTextBox.AppendText(logCount + ". " + msg + "\r\n"); + logCount++; + } + } +} + diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Form1.designer.cs b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Form1.designer.cs new file mode 100644 index 0000000..006ce14 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Form1.designer.cs @@ -0,0 +1,363 @@ +namespace Microsoft.Samples +{ + public partial class Form1 : System.Windows.Forms.Form + { + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.maskCompletedStatusStripPanel = new System.Windows.Forms.ToolStripStatusLabel(); + this.maskFullStatusStripPanel = new System.Windows.Forms.ToolStripStatusLabel(); + this.propertiesGroupBox = new System.Windows.Forms.GroupBox(); + this.copyMaskFormatComboBox = new System.Windows.Forms.ComboBox(); + this.label4 = new System.Windows.Forms.Label(); + this.textMaskFormatComboBox = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.InsertKeyModeCheckBox = new System.Windows.Forms.CheckBox(); + this.beepOnErrorCheckBox = new System.Windows.Forms.CheckBox(); + this.hidePromptOnLeaveCheckBox = new System.Windows.Forms.CheckBox(); + this.prompCharComboBox = new System.Windows.Forms.ComboBox(); + this.promptCharLabel = new System.Windows.Forms.Label(); + this.useSystemPasswordCharCheckBox = new System.Windows.Forms.CheckBox(); + this.eventLogTextBox = new System.Windows.Forms.TextBox(); + this.eventLogLabel = new System.Windows.Forms.Label(); + this.passwordCharLabel = new System.Windows.Forms.Label(); + this.passwordCharCombo = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.maskedTextBox1 = new System.Windows.Forms.MaskedTextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.outputTextBox = new System.Windows.Forms.TextBox(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.button1 = new System.Windows.Forms.Button(); + this.statusStrip1.SuspendLayout(); + this.propertiesGroupBox.SuspendLayout(); + this.SuspendLayout(); + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.maskCompletedStatusStripPanel, + this.maskFullStatusStripPanel}); + this.statusStrip1.Location = new System.Drawing.Point(0, 442); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(522, 22); + this.statusStrip1.TabIndex = 0; + this.statusStrip1.Text = "statusStrip1"; + // + // maskCompletedStatusStripPanel + // + this.maskCompletedStatusStripPanel.Name = "maskCompletedStatusStripPanel"; + this.maskCompletedStatusStripPanel.Size = new System.Drawing.Size(85, 17); + this.maskCompletedStatusStripPanel.Text = "Mask Completed"; + // + // maskFullStatusStripPanel + // + this.maskFullStatusStripPanel.Name = "maskFullStatusStripPanel"; + this.maskFullStatusStripPanel.Size = new System.Drawing.Size(50, 17); + this.maskFullStatusStripPanel.Text = "Mask Full"; + // + // propertiesGroupBox + // + this.propertiesGroupBox.Controls.Add(this.copyMaskFormatComboBox); + this.propertiesGroupBox.Controls.Add(this.label4); + this.propertiesGroupBox.Controls.Add(this.textMaskFormatComboBox); + this.propertiesGroupBox.Controls.Add(this.label3); + this.propertiesGroupBox.Controls.Add(this.InsertKeyModeCheckBox); + this.propertiesGroupBox.Controls.Add(this.beepOnErrorCheckBox); + this.propertiesGroupBox.Controls.Add(this.hidePromptOnLeaveCheckBox); + this.propertiesGroupBox.Controls.Add(this.prompCharComboBox); + this.propertiesGroupBox.Controls.Add(this.promptCharLabel); + this.propertiesGroupBox.Controls.Add(this.useSystemPasswordCharCheckBox); + this.propertiesGroupBox.Controls.Add(this.eventLogTextBox); + this.propertiesGroupBox.Controls.Add(this.eventLogLabel); + this.propertiesGroupBox.Controls.Add(this.passwordCharLabel); + this.propertiesGroupBox.Controls.Add(this.passwordCharCombo); + this.propertiesGroupBox.Location = new System.Drawing.Point(11, 66); + this.propertiesGroupBox.Name = "propertiesGroupBox"; + this.propertiesGroupBox.Size = new System.Drawing.Size(499, 310); + this.propertiesGroupBox.TabIndex = 1; + this.propertiesGroupBox.TabStop = false; + this.propertiesGroupBox.Text = "Properties"; + // + // copyMaskFormatComboBox + // + this.copyMaskFormatComboBox.DropDownWidth = 150; + this.copyMaskFormatComboBox.FormattingEnabled = true; + this.copyMaskFormatComboBox.Location = new System.Drawing.Point(373, 111); + this.copyMaskFormatComboBox.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2); + this.copyMaskFormatComboBox.Name = "copyMaskFormatComboBox"; + this.copyMaskFormatComboBox.Size = new System.Drawing.Size(116, 21); + this.copyMaskFormatComboBox.TabIndex = 14; + this.toolTip1.SetToolTip(this.copyMaskFormatComboBox, "Setting the CutCopyMaskFormat property changes \r\nwhether prompt and / or literal " + + "chracters are \r\nincluded in the string captured on cut and copy operations."); + this.copyMaskFormatComboBox.SelectedIndexChanged += new System.EventHandler(this.copyMaskFormatComboBox_SelectedIndexChanged); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(258, 114); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(107, 13); + this.label4.TabIndex = 15; + this.label4.Text = "Mask Format in Copy"; + this.toolTip1.SetToolTip(this.label4, "Setting the PromptChar property changes \r\nall the prompt characters in the \r\nMask" + + "edTextBox to the specified character."); + // + // textMaskFormatComboBox + // + this.textMaskFormatComboBox.DropDownWidth = 150; + this.textMaskFormatComboBox.FormattingEnabled = true; + this.textMaskFormatComboBox.Location = new System.Drawing.Point(373, 80); + this.textMaskFormatComboBox.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2); + this.textMaskFormatComboBox.Name = "textMaskFormatComboBox"; + this.textMaskFormatComboBox.Size = new System.Drawing.Size(116, 21); + this.textMaskFormatComboBox.TabIndex = 12; + this.toolTip1.SetToolTip(this.textMaskFormatComboBox, "Setting the TextMaskFormat property changes \r\nwhether prompt and / or literal chr" + + "acters are \r\nincluded in the Text property. "); + this.textMaskFormatComboBox.SelectedIndexChanged += new System.EventHandler(this.textMaskFormatComboBox_SelectedIndexChanged); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(258, 83); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(104, 13); + this.label3.TabIndex = 13; + this.label3.Text = "Mask Format in Text"; + this.toolTip1.SetToolTip(this.label3, "Setting the PromptChar property changes \r\nall the prompt characters in the \r\nMask" + + "edTextBox to the specified character."); + // + // InsertKeyModeCheckBox + // + this.InsertKeyModeCheckBox.Location = new System.Drawing.Point(7, 109); + this.InsertKeyModeCheckBox.Margin = new System.Windows.Forms.Padding(3, 1, 3, 3); + this.InsertKeyModeCheckBox.Name = "InsertKeyModeCheckBox"; + this.InsertKeyModeCheckBox.Size = new System.Drawing.Size(157, 24); + this.InsertKeyModeCheckBox.TabIndex = 9; + this.InsertKeyModeCheckBox.Text = "Insert key mode"; + this.toolTip1.SetToolTip(this.InsertKeyModeCheckBox, resources.GetString("InsertKeyModeCheckBox.ToolTip")); + this.InsertKeyModeCheckBox.CheckedChanged += new System.EventHandler(this.propertyCheckBox_CheckedChanged); + // + // beepOnErrorCheckBox + // + this.beepOnErrorCheckBox.Location = new System.Drawing.Point(7, 78); + this.beepOnErrorCheckBox.Margin = new System.Windows.Forms.Padding(3, 3, 3, 1); + this.beepOnErrorCheckBox.Name = "beepOnErrorCheckBox"; + this.beepOnErrorCheckBox.Size = new System.Drawing.Size(104, 24); + this.beepOnErrorCheckBox.TabIndex = 7; + this.beepOnErrorCheckBox.Text = "Beep on error"; + this.toolTip1.SetToolTip(this.beepOnErrorCheckBox, "Setting the BeepOnError property to true casues the\r\nMaskedTextBox to play a beep" + + " when a character is entered\r\nthat does not conform to the current position in t" + + "he mask."); + this.beepOnErrorCheckBox.CheckedChanged += new System.EventHandler(this.propertyCheckBox_CheckedChanged); + // + // hidePromptOnLeaveCheckBox + // + this.hidePromptOnLeaveCheckBox.Location = new System.Drawing.Point(7, 47); + this.hidePromptOnLeaveCheckBox.Name = "hidePromptOnLeaveCheckBox"; + this.hidePromptOnLeaveCheckBox.Size = new System.Drawing.Size(157, 24); + this.hidePromptOnLeaveCheckBox.TabIndex = 5; + this.hidePromptOnLeaveCheckBox.Text = "Hide prompt on leave"; + this.toolTip1.SetToolTip(this.hidePromptOnLeaveCheckBox, "Setting the HidePromptOnLeave property causes\r\nthe prompt characters to be hidden" + + " when the \r\nMaskedTextBox loses focus."); + this.hidePromptOnLeaveCheckBox.CheckedChanged += new System.EventHandler(this.propertyCheckBox_CheckedChanged); + // + // prompCharComboBox + // + this.prompCharComboBox.FormattingEnabled = true; + this.prompCharComboBox.Location = new System.Drawing.Point(373, 49); + this.prompCharComboBox.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2); + this.prompCharComboBox.Name = "prompCharComboBox"; + this.prompCharComboBox.Size = new System.Drawing.Size(116, 21); + this.prompCharComboBox.TabIndex = 2; + this.toolTip1.SetToolTip(this.prompCharComboBox, "Setting the PromptChar property changes \r\nall the prompt characters in the \r\nMask" + + "edTextBox to the specified character."); + this.prompCharComboBox.SelectedIndexChanged += new System.EventHandler(this.prompCharComboBox_SelectedIndexChanged); + // + // promptCharLabel + // + this.promptCharLabel.AutoSize = true; + this.promptCharLabel.Location = new System.Drawing.Point(258, 52); + this.promptCharLabel.Name = "promptCharLabel"; + this.promptCharLabel.Size = new System.Drawing.Size(92, 13); + this.promptCharLabel.TabIndex = 11; + this.promptCharLabel.Text = "Prompt Character"; + this.toolTip1.SetToolTip(this.promptCharLabel, "Setting the PromptChar property changes \r\nall the prompt characters in the \r\nMask" + + "edTextBox to the specified character."); + // + // useSystemPasswordCharCheckBox + // + this.useSystemPasswordCharCheckBox.Location = new System.Drawing.Point(7, 16); + this.useSystemPasswordCharCheckBox.Margin = new System.Windows.Forms.Padding(3, 1, 3, 3); + this.useSystemPasswordCharCheckBox.Name = "useSystemPasswordCharCheckBox"; + this.useSystemPasswordCharCheckBox.Size = new System.Drawing.Size(202, 24); + this.useSystemPasswordCharCheckBox.TabIndex = 3; + this.useSystemPasswordCharCheckBox.Text = "Use system password character"; + this.toolTip1.SetToolTip(this.useSystemPasswordCharCheckBox, resources.GetString("useSystemPasswordCharCheckBox.ToolTip")); + this.useSystemPasswordCharCheckBox.CheckedChanged += new System.EventHandler(this.propertyCheckBox_CheckedChanged); + // + // eventLogTextBox + // + this.eventLogTextBox.BackColor = System.Drawing.SystemColors.Window; + this.eventLogTextBox.Location = new System.Drawing.Point(6, 153); + this.eventLogTextBox.Multiline = true; + this.eventLogTextBox.Name = "eventLogTextBox"; + this.eventLogTextBox.ReadOnly = true; + this.eventLogTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.eventLogTextBox.Size = new System.Drawing.Size(487, 151); + this.eventLogTextBox.TabIndex = 11; + // + // eventLogLabel + // + this.eventLogLabel.AutoSize = true; + this.eventLogLabel.Location = new System.Drawing.Point(4, 136); + this.eventLogLabel.Name = "eventLogLabel"; + this.eventLogLabel.Size = new System.Drawing.Size(59, 13); + this.eventLogLabel.TabIndex = 3; + this.eventLogLabel.Text = "Event Log:"; + this.toolTip1.SetToolTip(this.eventLogLabel, "The TextBox below will echo the MaskInputRejected\r\nand TypeValidationFailed event" + + "s."); + // + // passwordCharLabel + // + this.passwordCharLabel.AutoSize = true; + this.passwordCharLabel.Location = new System.Drawing.Point(258, 22); + this.passwordCharLabel.Name = "passwordCharLabel"; + this.passwordCharLabel.Size = new System.Drawing.Size(104, 13); + this.passwordCharLabel.TabIndex = 0; + this.passwordCharLabel.Text = "Password Character"; + this.toolTip1.SetToolTip(this.passwordCharLabel, resources.GetString("passwordCharLabel.ToolTip")); + // + // passwordCharCombo + // + this.passwordCharCombo.FormattingEnabled = true; + this.passwordCharCombo.Location = new System.Drawing.Point(373, 19); + this.passwordCharCombo.Margin = new System.Windows.Forms.Padding(3, 3, 3, 2); + this.passwordCharCombo.Name = "passwordCharCombo"; + this.passwordCharCombo.Size = new System.Drawing.Size(116, 21); + this.passwordCharCombo.TabIndex = 1; + this.toolTip1.SetToolTip(this.passwordCharCombo, resources.GetString("passwordCharCombo.ToolTip")); + this.passwordCharCombo.SelectedIndexChanged += new System.EventHandler(this.passwordCharCombo_SelectedIndexChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(131, 29); + this.label1.Margin = new System.Windows.Forms.Padding(3, 3, 0, 3); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(92, 13); + this.label1.TabIndex = 8; + this.label1.Text = "Enter IP Address:"; + this.toolTip1.SetToolTip(this.label1, resources.GetString("label1.ToolTip")); + // + // maskedTextBox1 + // + this.maskedTextBox1.Location = new System.Drawing.Point(225, 26); + this.maskedTextBox1.Margin = new System.Windows.Forms.Padding(1, 3, 3, 3); + this.maskedTextBox1.Mask = "099.099.099.099"; + this.maskedTextBox1.Name = "maskedTextBox1"; + this.maskedTextBox1.Size = new System.Drawing.Size(137, 21); + this.maskedTextBox1.TabIndex = 0; + this.maskedTextBox1.MaskInputRejected += new System.Windows.Forms.MaskInputRejectedEventHandler(this.maskedTextBox1_MaskInputRejected); + this.maskedTextBox1.TextChanged += new System.EventHandler(this.maskedTextBox1_TextChanged); + this.maskedTextBox1.TypeValidationCompleted += new System.Windows.Forms.TypeValidationEventHandler(this.maskedTextBox1_TypeValidationCompleted); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(131, 404); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(78, 13); + this.label2.TabIndex = 9; + this.label2.Text = "Text Property:"; + this.toolTip1.SetToolTip(this.label2, "The Text property of the TextBox is set to the\r\nText property of the MaskedTextBo" + + "x above."); + // + // outputTextBox + // + this.outputTextBox.BackColor = System.Drawing.SystemColors.Window; + this.outputTextBox.Location = new System.Drawing.Point(224, 401); + this.outputTextBox.Name = "outputTextBox"; + this.outputTextBox.ReadOnly = true; + this.outputTextBox.Size = new System.Drawing.Size(138, 21); + this.outputTextBox.TabIndex = 2; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(399, 399); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(111, 23); + this.button1.TabIndex = 10; + this.button1.Text = "Create IP Object"; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // Form1 + // + this.ClientSize = new System.Drawing.Size(522, 464); + this.Controls.Add(this.button1); + this.Controls.Add(this.outputTextBox); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.maskedTextBox1); + this.Controls.Add(this.propertiesGroupBox); + this.Controls.Add(this.statusStrip1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "MaskedTextBox Sample"; + this.Load += new System.EventHandler(this.Form1_Load); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.propertiesGroupBox.ResumeLayout(false); + this.propertiesGroupBox.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel maskCompletedStatusStripPanel; + private System.Windows.Forms.ToolStripStatusLabel maskFullStatusStripPanel; + private System.Windows.Forms.GroupBox propertiesGroupBox; + private System.Windows.Forms.Label passwordCharLabel; + private System.Windows.Forms.ComboBox passwordCharCombo; + private System.Windows.Forms.TextBox eventLogTextBox; + private System.Windows.Forms.Label eventLogLabel; + private System.Windows.Forms.CheckBox useSystemPasswordCharCheckBox; + private System.Windows.Forms.CheckBox hidePromptOnLeaveCheckBox; + private System.Windows.Forms.CheckBox beepOnErrorCheckBox; + private System.Windows.Forms.CheckBox InsertKeyModeCheckBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.MaskedTextBox maskedTextBox1; + private System.Windows.Forms.Label promptCharLabel; + private System.Windows.Forms.ComboBox prompCharComboBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox outputTextBox; + private System.Windows.Forms.ToolTip toolTip1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ComboBox copyMaskFormatComboBox; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.ComboBox textMaskFormatComboBox; + private System.Windows.Forms.Label label3; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Form1.resx b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Form1.resx new file mode 100644 index 0000000..8e99b27 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Form1.resx @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 109, 17 + + + 17, 17 + + + Checking Insert key mode sets the MaskedTextBox InsertKeyMode Property +to 'Insert' enabling insertion mode, regardless of the INSERT key mode of the keyboard. + +Unchecking Insert key mode sets the MaskedTextBox InsertKeyMode Property +to 'Overwrite' enabling overwrite mode, regardless of the INSERT key mode of the keyboard. + +Setting the InsertKeyMode property to Default, honors the current INSERT key mode of the keyboard. + + + Setting the UseSystemPasswordChar property to +true cuases all non-prompt and non-mask characters +in the MaskedTextBox to be the system's password character +In WindowsXP this is a black dot. This property overrides the +PasswordChar property. + + + Setting the PasswordChar property changes +all the non-prompt and non-mask characters in the +MaskedTextBox to the specified character. The +UseSystemPasswordChar property overrides +the PasswordChar property. + + + Setting the PasswordChar property changes +all the non-prompt and non-mask characters in the +MaskedTextBox to the specified character. The +UseSystemPasswordChar property overrides +the PasswordChar property. + + + Enter an IPv5 IP address into the MaskedTextBox +to the right. + +When this sample app starts up, the selected values +in the controls below represent the default values for +the MaskedTextBox. + +Paste a string into the MaskedTextBox to test the paste +behavior. + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/IPv5.cs b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/IPv5.cs new file mode 100644 index 0000000..6cf074b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/IPv5.cs @@ -0,0 +1,131 @@ +using System; +using System.Globalization; + +namespace Microsoft.Samples +{ + public class IPv5 + { + // property fields + int firstByteValue; + int secondByteValue; + int thirdByteValue; + int fourthByteValue; + + public IPv5() + { + } + + public IPv5(string ip) + { + } + + public IPv5(int firstByte, int secondByte, int thirdByte, int fourthByte) + { + firstByteValue = firstByte; + secondByteValue = secondByte; + thirdByteValue = thirdByte; + fourthByteValue = fourthByte; + } + + public static IPv5 InvalidIPv5 + { + get + { + return new IPv5(0, 0, 0, 0); + } + } + + // properties + public int FirstByteValue + { + get + { + return firstByteValue; + } + set + { + firstByteValue = value; + } + } + + public int SecondByteValue + { + get + { + return secondByteValue; + } + set + { + secondByteValue = value; + } + } + + public int ThirdByteValue + { + get + { + return thirdByteValue; + } + set + { + thirdByteValue = value; + } + } + + public int FourthByteValue + { + get + { + return fourthByteValue; + } + set + { + fourthByteValue = value; + } + } + + // Methods + public static IPv5 Parse(string s) + { + int[] bytes = new int[4]; + + // Remove any spaces in the string + s = s.Replace(" ", ""); + + // Split the string into byte strings + string[] strBytes = s.Split(new char[] { '.' }); + + try + { + int byteIndex = 0; + foreach (string strByte in strBytes) + { + // Try to parse to an integer + bytes[byteIndex] = int.Parse(strByte); + + // Check bounds + // Verify that the last byte is within the valid range + // (1 - 255 for the first three bytes, 0 - 255 for the last byte) + if ((bytes[byteIndex] > 255) || ((bytes[byteIndex] < 1) && (byteIndex < 3))) + { + throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, "The provided string {0} is not a valid IPv5 IP address", s)); + } + byteIndex++; + } + } + catch + { + throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, "The provided string {0} is not a valid IPv5 IP address", s)); + } + + return new IPv5(bytes[0], bytes[1], bytes[2], bytes[3]); + + } + + public override string ToString() + { + return string.Format(CultureInfo.CurrentCulture, "{0}.{1}.{2}.{3}", firstByteValue.ToString(CultureInfo.CurrentCulture), secondByteValue.ToString(CultureInfo.CurrentCulture), thirdByteValue.ToString(CultureInfo.CurrentCulture), fourthByteValue.ToString(CultureInfo.CurrentCulture)); + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/IPv5MaskDescriptor.cs b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/IPv5MaskDescriptor.cs new file mode 100644 index 0000000..03cd9d9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/IPv5MaskDescriptor.cs @@ -0,0 +1,29 @@ +using System; +using System.Windows.Forms.Design; + +namespace Microsoft.Samples +{ + public class IPv5MaskDescriptor : MaskDescriptor + { + public override string Mask + { + get { return "099.099.099.099"; } + } + + public override string Name + { + get { return "IPv5 IP address"; } + } + + public override string Sample + { + get { return "128.128.128.128"; } + } + + public override Type ValidatingType + { + get { return typeof(IPv5); } + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/MaskedTextBox.csproj b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/MaskedTextBox.csproj new file mode 100644 index 0000000..5934543 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/MaskedTextBox.csproj @@ -0,0 +1,97 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {649447E9-03C3-4ACF-A4D4-862D0A82A7E2} + WinExe + + + Microsoft.Samples + false + MaskedTextBoxSample + App.ico + + + true + false + .\bin\Debug\ + false + DEBUG;TRACE + 4 + false + + + false + true + .\bin\Release\ + false + TRACE + 4 + false + + + + + + + + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + + + Code + + + Code + + + Form + + + Form1.cs + Form + + + Code + + + Code + + + + + + + + + + + Form1.cs + Designer + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/MaskedTextBox.sln b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/MaskedTextBox.sln new file mode 100644 index 0000000..67b3ec2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/MaskedTextBox.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MaskedTextBox", "MaskedTextBox.csproj", "{649447E9-03C3-4ACF-A4D4-862D0A82A7E2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {649447E9-03C3-4ACF-A4D4-862D0A82A7E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {649447E9-03C3-4ACF-A4D4-862D0A82A7E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {649447E9-03C3-4ACF-A4D4-862D0A82A7E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {649447E9-03C3-4ACF-A4D4-862D0A82A7E2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/MaskedTextBox.suo b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/MaskedTextBox.suo new file mode 100644 index 0000000..4b2e623 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/MaskedTextBox.suo differ diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Program.cs b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Program.cs new file mode 100644 index 0000000..7bf4365 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/Program.cs @@ -0,0 +1,18 @@ +using System; +using System.Windows.Forms; + +namespace Microsoft.Samples +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/bin/Debug/MaskedTextBoxSample.exe b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/bin/Debug/MaskedTextBoxSample.exe new file mode 100644 index 0000000..5b38750 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/bin/Debug/MaskedTextBoxSample.exe differ diff --git a/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/bin/Release/MaskedTextBoxSample.exe b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/bin/Release/MaskedTextBoxSample.exe new file mode 100644 index 0000000..4771d6e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/MaskedTextBox/bin/Release/MaskedTextBoxSample.exe differ diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Form1.Designer.cs new file mode 100644 index 0000000..4edfe11 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Form1.Designer.cs @@ -0,0 +1,134 @@ +namespace SimpleValidation +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtFirstName = new System.Windows.Forms.TextBox(); + this.txtLastName = new System.Windows.Forms.TextBox(); + this.Button1 = new System.Windows.Forms.Button(); + this.cmdClose = new System.Windows.Forms.Button(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.txtFirstName); + this.GroupBox1.Controls.Add(this.txtLastName); + this.GroupBox1.Location = new System.Drawing.Point(12, 12); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(368, 88); + this.GroupBox1.TabIndex = 13; + this.GroupBox1.TabStop = false; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 52); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(64, 16); + this.Label2.TabIndex = 8; + this.Label2.Text = "Last Name:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 28); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(64, 16); + this.Label1.TabIndex = 7; + this.Label1.Text = "First Name:"; + // + // txtFirstName + // + this.txtFirstName.Location = new System.Drawing.Point(84, 24); + this.txtFirstName.Name = "txtFirstName"; + this.txtFirstName.Size = new System.Drawing.Size(152, 21); + this.txtFirstName.TabIndex = 4; + this.txtFirstName.Validating += new System.ComponentModel.CancelEventHandler(this.txtName_Validating); + // + // txtLastName + // + this.txtLastName.Location = new System.Drawing.Point(84, 48); + this.txtLastName.Name = "txtLastName"; + this.txtLastName.Size = new System.Drawing.Size(152, 21); + this.txtLastName.TabIndex = 5; + this.txtLastName.Validating += new System.ComponentModel.CancelEventHandler(this.txtName_Validating); + // + // Button1 + // + this.Button1.Location = new System.Drawing.Point(122, 214); + this.Button1.Name = "Button1"; + this.Button1.Size = new System.Drawing.Size(76, 24); + this.Button1.TabIndex = 12; + this.Button1.Text = "OK"; + this.Button1.Click += new System.EventHandler(this.Button1_Click); + // + // cmdClose + // + this.cmdClose.CausesValidation = false; + this.cmdClose.Location = new System.Drawing.Point(204, 214); + this.cmdClose.Name = "cmdClose"; + this.cmdClose.Size = new System.Drawing.Size(76, 24); + this.cmdClose.TabIndex = 14; + this.cmdClose.Text = "Cancel"; + this.cmdClose.Click += new System.EventHandler(this.cmdClose_Click); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(402, 250); + this.Controls.Add(this.cmdClose); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.Button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Simple Validation"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); + this.Load += new System.EventHandler(this.Form1_Load); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.TextBox txtFirstName; + private System.Windows.Forms.TextBox txtLastName; + private System.Windows.Forms.Button Button1; + private System.Windows.Forms.Button cmdClose; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Form1.cs b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Form1.cs new file mode 100644 index 0000000..3fcd373 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Form1.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace SimpleValidation +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Button1_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void txtName_Validating(object sender, System.ComponentModel.CancelEventArgs e) + { + if (((TextBox)sender).Text == "") + { + MessageBox.Show("You must enter a first and last name.", "Invalid Input", MessageBoxButtons.OK, MessageBoxIcon.Warning); + e.Cancel = true; + } + } + + private void cmdClose_Click(object sender, EventArgs e) + { + // This triggers validation. + this.Close(); + } + + private void Form1_Load(object sender, EventArgs e) + { + txtFirstName.Select(); + } + + private void Form1_FormClosing(object sender, FormClosingEventArgs e) + { + if (e.Cancel) + { + DialogResult result = MessageBox.Show( + "There are still errors on the form. Do you wish to close the form?", + "Errors found", MessageBoxButtons.YesNo); + if (result == DialogResult.Yes) e.Cancel = false; + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Form1.resx b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Form1.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Program.cs b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Program.cs new file mode 100644 index 0000000..e3f8354 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace SimpleValidation +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ffa4375 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SimpleValidation")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SimpleValidation")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3da1458d-1049-4b0f-8c11-146032d4da79")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Resources.Designer.cs new file mode 100644 index 0000000..4baad6c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SimpleValidation.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SimpleValidation.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SimpleValidation.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace SimpleValidation.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SimpleValidation.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Settings.Designer.cs new file mode 100644 index 0000000..5278a77 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SimpleValidation.Properties.Settings.get_Default():SimpleValidation.Properties.Settings")] + +namespace SimpleValidation.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.csproj b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.csproj new file mode 100644 index 0000000..f92d2b4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {AA95AB7C-419D-42A2-BB5A-F571F585E3E3} + WinExe + Properties + SimpleValidation + SimpleValidation + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.csproj.user b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.sln b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.sln new file mode 100644 index 0000000..a89e144 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleValidation", "SimpleValidation.csproj", "{AA95AB7C-419D-42A2-BB5A-F571F585E3E3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AA95AB7C-419D-42A2-BB5A-F571F585E3E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA95AB7C-419D-42A2-BB5A-F571F585E3E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA95AB7C-419D-42A2-BB5A-F571F585E3E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA95AB7C-419D-42A2-BB5A-F571F585E3E3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.suo b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.suo new file mode 100644 index 0000000..0028e42 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/SimpleValidation.suo differ diff --git a/Pro Windows Forms 2.0/Chapter18/SimpleValidation/bin/Debug/SimpleValidation.exe b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/bin/Debug/SimpleValidation.exe new file mode 100644 index 0000000..d024511 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/SimpleValidation/bin/Debug/SimpleValidation.exe differ diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents.sln b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents.sln new file mode 100644 index 0000000..d62099f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ValidationComponentsClient", "ValidationComponentsClient\ValidationComponentsClient.csproj", "{3EF1A765-61F8-4A90-BE17-1F7ACC10DBBF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ValidationComponents", "ValidationComponents\ValidationComponents.csproj", "{20F1C950-9939-4C59-8EDE-B421A3123E94}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3EF1A765-61F8-4A90-BE17-1F7ACC10DBBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3EF1A765-61F8-4A90-BE17-1F7ACC10DBBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3EF1A765-61F8-4A90-BE17-1F7ACC10DBBF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3EF1A765-61F8-4A90-BE17-1F7ACC10DBBF}.Release|Any CPU.Build.0 = Release|Any CPU + {20F1C950-9939-4C59-8EDE-B421A3123E94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20F1C950-9939-4C59-8EDE-B421A3123E94}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20F1C950-9939-4C59-8EDE-B421A3123E94}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20F1C950-9939-4C59-8EDE-B421A3123E94}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents.suo b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents.suo new file mode 100644 index 0000000..268a5b2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents.suo differ diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/BaseValidator.Designer.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/BaseValidator.Designer.cs new file mode 100644 index 0000000..4714125 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/BaseValidator.Designer.cs @@ -0,0 +1,36 @@ +namespace ValidationComponents +{ + partial class BaseValidator + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/BaseValidator.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/BaseValidator.cs new file mode 100644 index 0000000..d2db3c0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/BaseValidator.cs @@ -0,0 +1,137 @@ +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Windows.Forms; +using System.Drawing; + +namespace ValidationComponents +{ + public abstract partial class BaseValidator : Component + { + public BaseValidator() + { + InitializeComponent(); + } + + public BaseValidator(IContainer container) + { + container.Add(this); + + InitializeComponent(); + } + + // Use an internal error provider to show error icons. + private ErrorProvider errorProvider = new ErrorProvider(); + + // Expose whatever ErrorProvider settings you want the + // user to be able to modify (like Icon, BlinkStyle, and BlinkRate). + // This class only exposes Icon. + public Icon Icon + { + get { return errorProvider.Icon; } + set { errorProvider.Icon = value; } + } + + // This is the error message that will be shown if validation fails. + private string errorMessage; + public string ErrorMessage + { + get { return errorMessage; } + set { errorMessage = value; } + } + + private bool cancelFocus = false; + public bool CancelFocusChangeWhenInvalid + { + get { return cancelFocus; } + set { cancelFocus = value; } + } + + // This is the control that will be validated. + // The ReferenceConverter allows the user to choose a control from + // a drop-down list with all the controls on the form. + private Control controlToValidate; + [TypeConverter(typeof(ReferenceConverter))] + public Control ControlToValidate + { + get { return controlToValidate; } + set + { + // Detach from previous control. + if ((controlToValidate != null) && (!DesignMode)) + { + controlToValidate.Validating -= new CancelEventHandler(ControlToValidate_Validating); + } + + controlToValidate = value; + // Hook up the control's Validating event. + if ((controlToValidate != null) && (!DesignMode)) + { + controlToValidate.Validating += new CancelEventHandler(ControlToValidate_Validating); + } + } + } + + // This property allows you to check if validation succeeded. + // The safest option is to default to false, and assume that + // any unvalidated data is not valid. + private bool isValid = false; + public bool IsValid + { + get { return isValid; } + } + + // Validate the control when the Validating event fires. + private void ControlToValidate_Validating(object sender, CancelEventArgs e) + { + Validate(); + // Cancel the focus change if the data is invalid, + // and this is the configured behavior. + if (!isValid && cancelFocus) e.Cancel = true; + } + + // This is a public method so that validation can be triggered + // manually if you want, not just in response to the Validating event. + public bool Validate() + { + // Validate the control (using whatever functionality + // is provided in the derived class). + isValid = EvaluateIsValid(); + + if (isValid) + { + // Clear the error message. + errorProvider.SetError(controlToValidate, ""); + } + else + { + // Display the error message. + errorProvider.SetError(controlToValidate, errorMessage); + } + return isValid; + } + + // This is the method where the derived classes will + // execute their validation logic. + protected abstract bool EvaluateIsValid(); + + public static bool IsFormValid(IContainer formComponents) + { + bool invalidInput = false; + + // Make sure all the validation is performed. + foreach (IComponent component in formComponents.Components) + { + BaseValidator validator = component as BaseValidator; + if (validator != null) + { + validator.Validate(); + if (!validator.IsValid) invalidInput = true; + } + } + return !invalidInput; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..43de2e6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ValidationComponents")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ValidationComponents")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("519f02db-3c21-4d25-95bc-3f91f80d7925")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RangeValidator.Designer.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RangeValidator.Designer.cs new file mode 100644 index 0000000..5edb419 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RangeValidator.Designer.cs @@ -0,0 +1,36 @@ +namespace ValidationComponents +{ + partial class RangeValidator + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RangeValidator.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RangeValidator.cs new file mode 100644 index 0000000..db32890 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RangeValidator.cs @@ -0,0 +1,94 @@ +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace ValidationComponents +{ + // Allow for different types of range comparison. + // You could add different options to support more + // data types, like dates. + public enum ValidationDataType + { + Integer, + Double, + Text + } + + public partial class RangeValidator : BaseValidator + { + public RangeValidator() + { + InitializeComponent(); + } + + public RangeValidator(IContainer container) + { + container.Add(this); + + InitializeComponent(); + } + + // Determines how the ranges are compared + // (numerically or alphabetically). + private ValidationDataType validationDataType; + public ValidationDataType Type + { + get { return validationDataType; } + set { validationDataType = value; } + } + + // Set a minimum and maximum allowed value. + // You could add checks to make sure the minimum value + // isn't greater than the maximum value. + private string minimumValue = ""; + public string MinimumValue + { + get { return minimumValue; } + set { minimumValue = value; } + } + + private string maximumValue = ""; + public string MaximumValue + { + get { return maximumValue; } + set { maximumValue = value; } + } + + // Check if the value falls in the range. + protected override bool EvaluateIsValid() + { + // Don't validate if empty (that's a job for the RequiredFieldValidator). + if (ControlToValidate.Text.Trim() == "") return true; + + switch (validationDataType) + { + case ValidationDataType.Double: + case ValidationDataType.Integer: + if (validationDataType == ValidationDataType.Integer) + { + // Check there's no decimal point. + if (ControlToValidate.Text.IndexOf(".") != -1) return false; + } + + try + { + double valD = Double.Parse(ControlToValidate.Text); + return ((valD >= Double.Parse(minimumValue)) && (valD <= Double.Parse(maximumValue))); + } + catch + { + // The text can't be converted to a number + return false; + } + case ValidationDataType.Text: + string valS = ControlToValidate.Text; + return ((String.Compare(valS, minimumValue) >= 0) && (String.Compare(valS, maximumValue) <= 0)); + default: + return false; + } + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RegularExpressionValidator.Designer.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RegularExpressionValidator.Designer.cs new file mode 100644 index 0000000..a7dde7a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RegularExpressionValidator.Designer.cs @@ -0,0 +1,36 @@ +namespace ValidationComponents +{ + partial class RegularExpressionValidator + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RegularExpressionValidator.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RegularExpressionValidator.cs new file mode 100644 index 0000000..4db4128 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RegularExpressionValidator.cs @@ -0,0 +1,44 @@ +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Text.RegularExpressions; + +namespace ValidationComponents +{ + public partial class RegularExpressionValidator : BaseValidator + { + public RegularExpressionValidator() + { + InitializeComponent(); + } + + public RegularExpressionValidator(IContainer container) + { + container.Add(this); + + InitializeComponent(); + } + + // Store the regular expression. + private string validationExpression; + public string ValidationExpression + { + get { return validationExpression; } + set { validationExpression = value; } + } + + // Validate with the regular expression. + protected override bool EvaluateIsValid() + { + // Don't validate if empty (that's a job for the RequiredFieldValidator). + if (ControlToValidate.Text.Trim() == "") return true; + + // Evaluate the regular expression. + Regex regex = new Regex(validationExpression); + return regex.IsMatch(ControlToValidate.Text); + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RequiredFieldValidator.Designer.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RequiredFieldValidator.Designer.cs new file mode 100644 index 0000000..4f0462e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RequiredFieldValidator.Designer.cs @@ -0,0 +1,36 @@ +namespace ValidationComponents +{ + partial class RequiredFieldValidator + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RequiredFieldValidator.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RequiredFieldValidator.cs new file mode 100644 index 0000000..18e20d7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/RequiredFieldValidator.cs @@ -0,0 +1,30 @@ +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace ValidationComponents +{ + public partial class RequiredFieldValidator : BaseValidator + { + public RequiredFieldValidator() + { + InitializeComponent(); + } + + public RequiredFieldValidator(IContainer container) + { + container.Add(this); + + InitializeComponent(); + } + + protected override bool EvaluateIsValid() + { + // This is valid, as long as the value is not blank. + return (ControlToValidate.Text.Trim() != ""); + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/ValidationComponents.csproj b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/ValidationComponents.csproj new file mode 100644 index 0000000..98ae94e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/ValidationComponents.csproj @@ -0,0 +1,66 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {20F1C950-9939-4C59-8EDE-B421A3123E94} + Library + Properties + ValidationComponents + ValidationComponents + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + Component + + + BaseValidator.cs + + + + Component + + + RangeValidator.cs + + + Component + + + RegularExpressionValidator.cs + + + Component + + + RequiredFieldValidator.cs + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/ValidationComponents.csproj.user b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/ValidationComponents.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/ValidationComponents.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/bin/Debug/ValidationComponents.dll b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/bin/Debug/ValidationComponents.dll new file mode 100644 index 0000000..c0773b5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/bin/Debug/ValidationComponents.dll differ diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/bin/Release/ValidationComponents.dll b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/bin/Release/ValidationComponents.dll new file mode 100644 index 0000000..db8df0e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponents/bin/Release/ValidationComponents.dll differ diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Form1.Designer.cs new file mode 100644 index 0000000..eb8eaef --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Form1.Designer.cs @@ -0,0 +1,181 @@ +namespace ValidationComponentsClient +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.txtLastName = new System.Windows.Forms.TextBox(); + this.txtEmail = new System.Windows.Forms.TextBox(); + this.txtFirstName = new System.Windows.Forms.TextBox(); + this.grpValidation = new System.Windows.Forms.GroupBox(); + this.Label3 = new System.Windows.Forms.Label(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.Button1 = new System.Windows.Forms.Button(); + this.cmdClose = new System.Windows.Forms.Button(); + this.requiredFirstName = new ValidationComponents.RequiredFieldValidator(this.components); + this.requiredLastName = new ValidationComponents.RequiredFieldValidator(this.components); + this.regularExpressionValidator1 = new ValidationComponents.RegularExpressionValidator(this.components); + this.grpValidation.SuspendLayout(); + this.SuspendLayout(); + // + // txtLastName + // + this.txtLastName.Location = new System.Drawing.Point(84, 48); + this.txtLastName.Name = "txtLastName"; + this.txtLastName.Size = new System.Drawing.Size(152, 21); + this.txtLastName.TabIndex = 5; + // + // txtEmail + // + this.txtEmail.Location = new System.Drawing.Point(84, 84); + this.txtEmail.Name = "txtEmail"; + this.txtEmail.Size = new System.Drawing.Size(152, 21); + this.txtEmail.TabIndex = 9; + // + // txtFirstName + // + this.txtFirstName.Location = new System.Drawing.Point(84, 24); + this.txtFirstName.Name = "txtFirstName"; + this.txtFirstName.Size = new System.Drawing.Size(152, 21); + this.txtFirstName.TabIndex = 4; + // + // grpValidation + // + this.grpValidation.Controls.Add(this.Label3); + this.grpValidation.Controls.Add(this.txtEmail); + this.grpValidation.Controls.Add(this.Label2); + this.grpValidation.Controls.Add(this.Label1); + this.grpValidation.Controls.Add(this.txtFirstName); + this.grpValidation.Controls.Add(this.txtLastName); + this.grpValidation.Location = new System.Drawing.Point(12, 12); + this.grpValidation.Name = "grpValidation"; + this.grpValidation.Size = new System.Drawing.Size(368, 124); + this.grpValidation.TabIndex = 15; + this.grpValidation.TabStop = false; + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(16, 88); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(64, 16); + this.Label3.TabIndex = 10; + this.Label3.Text = "Email:"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 52); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(64, 16); + this.Label2.TabIndex = 8; + this.Label2.Text = "Last Name:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 28); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(64, 16); + this.Label1.TabIndex = 7; + this.Label1.Text = "First Name:"; + // + // Button1 + // + this.Button1.Location = new System.Drawing.Point(117, 211); + this.Button1.Name = "Button1"; + this.Button1.Size = new System.Drawing.Size(76, 24); + this.Button1.TabIndex = 14; + this.Button1.Text = "OK"; + this.Button1.Click += new System.EventHandler(this.Button1_Click); + // + // cmdClose + // + this.cmdClose.CausesValidation = false; + this.cmdClose.Location = new System.Drawing.Point(199, 211); + this.cmdClose.Name = "cmdClose"; + this.cmdClose.Size = new System.Drawing.Size(76, 24); + this.cmdClose.TabIndex = 16; + this.cmdClose.Text = "Cancel"; + this.cmdClose.Click += new System.EventHandler(this.cmdClose_Click); + // + // requiredFirstName + // + this.requiredFirstName.CancelFocusChangeWhenInvalid = false; + this.requiredFirstName.ControlToValidate = this.txtFirstName; + this.requiredFirstName.ErrorMessage = "A first name is required."; + this.requiredFirstName.Icon = ((System.Drawing.Icon)(resources.GetObject("requiredFirstName.Icon"))); + // + // requiredLastName + // + this.requiredLastName.CancelFocusChangeWhenInvalid = false; + this.requiredLastName.ControlToValidate = this.txtLastName; + this.requiredLastName.ErrorMessage = "A last name is required."; + this.requiredLastName.Icon = ((System.Drawing.Icon)(resources.GetObject("requiredLastName.Icon"))); + // + // regularExpressionValidator1 + // + this.regularExpressionValidator1.CancelFocusChangeWhenInvalid = true; + this.regularExpressionValidator1.ControlToValidate = this.txtEmail; + this.regularExpressionValidator1.ErrorMessage = "Not a valid email address."; + this.regularExpressionValidator1.Icon = ((System.Drawing.Icon)(resources.GetObject("regularExpressionValidator1.Icon"))); + this.regularExpressionValidator1.ValidationExpression = "^\\S+@\\S+\\.\\S+$"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(402, 247); + this.Controls.Add(this.cmdClose); + this.Controls.Add(this.grpValidation); + this.Controls.Add(this.Button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Validation Component Test"; + this.grpValidation.ResumeLayout(false); + this.grpValidation.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TextBox txtLastName; + private System.Windows.Forms.TextBox txtEmail; + private System.Windows.Forms.TextBox txtFirstName; + private System.Windows.Forms.GroupBox grpValidation; + private System.Windows.Forms.Label Label3; + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.Label Label1; + private System.Windows.Forms.Button Button1; + private System.Windows.Forms.Button cmdClose; + private ValidationComponents.RequiredFieldValidator requiredFirstName; + private ValidationComponents.RequiredFieldValidator requiredLastName; + private ValidationComponents.RegularExpressionValidator regularExpressionValidator1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Form1.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Form1.cs new file mode 100644 index 0000000..60dbdf8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Form1.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using ValidationComponents; + +namespace ValidationComponentsClient +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Button1_Click(object sender, EventArgs e) + { + if (BaseValidator.IsFormValid(this.components)) + { + this.Close(); + } + else + { + MessageBox.Show("You still have invalid input.", "Invalid Input", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void cmdClose_Click(object sender, EventArgs e) + { + // Allow form closing regardless of the allow focus change + // settings of individual validators. + this.AutoValidate = AutoValidate.Disable; + this.Close(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Form1.resx b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Form1.resx new file mode 100644 index 0000000..79dc37f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Form1.resx @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 209, 22 + + + + + AAABAAMAEBAQAAAAAAAoAQAANgAAABAQAAABAAgAaAUAAF4BAAAQEAAAAQAgAGgEAADGBgAAKAAAABAA + AAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/wD/AIAAgAD/AAAAgAAAAP// + AACAgAAAAAAAAACAAAAA//8AAICAAAAA/wAAAIAAwMDAAICAgACIiIiIiIiIiIiIiIiIiIiIiIiIzMyI + iIiIiMzMzMyIiIiMzMEczMiIiIzMwRzMyIiIzMzMzMzMiIjMzMzMzMyIiMzMwRzMzIiIzMzBHMzMiIiM + zMEczMiIiIzMwRzMyIiIiMzMzMyIiIiIiMzMiIiIiIiIiIiIiIiIiIiIiIiIiP//AAD//wAA/D8AAPAP + AADgBwAA4AcAAMADAADAAwAAwAMAAMADAADgBwAA4AcAAPAPAAD8PwAA//8AAP//AAAoAAAAEAAAACAA + AAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICA + gADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA/18qAAB/KgBVfyoAqn8qAP9/KgAAnyoAVZ8qAKqf + KgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV3yoAqt8qAP/fKgAA/yoAVf8qAKr/KgD//yoAAABVAFUA + VQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8fVQAAP1UAVT9VAKo/VQD/P1UAAF9VAFVfVQCqX1UA/19VAAB/ + VQBVf1UAqn9VAP9/VQAAn1UAVZ9VAKqfVQD/n1UAAL9VAFW/VQCqv1UA/79VAADfVQBV31UAqt9VAP/f + VQAA/1UAVf9VAKr/VQD//1UAAAB/AFUAfwCqAH8A/wB/AAAffwBVH38Aqh9/AP8ffwAAP38AVT9/AKo/ + fwD/P38AAF9/AFVffwCqX38A/19/AAB/fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqffwD/n38AAL9/AFW/ + fwCqv38A/79/AADffwBV338Aqt9/AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUAqgCqAKoA/wCqAAAf + qgBVH6oAqh+qAP8fqgAAP6oAVT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/qgBVf6oAqn+qAP9/ + qgAAn6oAVZ+qAKqfqgD/n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/fqgAA/6oAVf+qAKr/ + qgD//6oAAADUAFUA1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/1AD/P9QAAF/UAFVf + 1ACqX9QA/1/UAAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/1ACqv9QA/7/UAADf + 1ABV39QAqt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof/wD/H/8AAD//AFU/ + /wCqP/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf/wCqn/8A/5//AAC/ + /wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP//MwD//2YA//+ZAP// + zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8AAP+/AAAA3wAAVd8AAKrf + AAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA/x8qAAA/KgBVPyoA8Pv/AKSg + oACAgIAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AP39/f39/f39/f39/f39/f39/f39/VFNTCgo + KP39/f39/f39dXV0mJiYlHAoJP39/f39eHScurrDv5iYcCQk/f39/Xidur7D///Duph0JP39/Xmdvr++ + w///w7q6mEwo/f15w7/Dv8PDw766upiUKP39ncPDw8PD//+/urq6mCj9/XnDw8fDyP//x766uphM/f2d + yMfIx8z//8y/urqYTf39naXIx8jQ///Mv766dVD9/f2dyMzHzP//yL6+mXT9/f39nZ3MyMfDw76/nHR0 + /f39/f2dnaalw8PDnXl0/f39/f39/f2dnZ15nXn9/f39/f39/f39/f39/f39/f39/f3//wAA+B8AAOAH + AADAAwAAwAMAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAADAAwAA4AcAAPgfAAD//wAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL0OXNCk6 + ioAjMX3AHilw7RggZO0TGFjADhFOgAoLRDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANEujZyhA + ndocQbj/DDzQ/wM54f8CNtv/BjO8/wgqlv8ID1TaBgQ6ZwAAAAAAAAAAAAAAAAAAAAAAAAAAOVOvZyhG + rfQcTN3/CUP6/wZB+f9Hc/r/RnH2/wA47P8ANuP/BS+1/wUQXvQGBDpnAAAAAAAAAAAAAAAAP1u7NDNQ + tdouWuP/HVL9/xpQ/f9Wf/z//v7+//7+/v9ZgPr/ADvv/wA35P8FL7b/CA9U2goLRDQAAAAAAAAAAEBc + vYBNcNn/LF///y1h//8tX///Y4n+//7+/v/+/v7/UHn7/wM/+f8AOu7/ADbk/wkqlv8OEU6AAAAAAAAA + AABBXsDAS3Lu/z9t//9Bb///Pm3//zlq//9qjv//Yof+/xtS/P8NSPv/AD34/wA56v8GM73/ExhYwAAA + AAAAAAAAQmDD7VF4+/9SfP//VX///1J8//9ehf///v7+//7+/v89bf3/GFD7/wpF+f8AO/P/Ajbd/xgg + ZO0AAAAAAAAAAERixu1ghvv/ZYr//2iO//9mjP//la////7+/v/+/v7/eZr//yFX/f8RSfv/Aj74/wM5 + 4v8eKXDtAAAAAAAAAABFZcrAeZby/3ia//98nP//eZn//7HE///+/v7//v7+/6K4/v8oXP7/F0/7/wdB + +P8MO9D/IzF9wAAAAAAAAAAAR2fNgI2i5f+Hpf//jaj//4ij///F0/7//v7+//7+/v+1x/7/LF///xtS + /P8JQ/r/HEG4/yk6ioAAAAAAAAAAAEhp0DRHaNHalKrx/5my//+NqP//qb7///7+/v/+/v7/g6H//y5i + //8cU/3/HEzc/yhAndovQ5c0AAAAAAAAAAAAAAAASGnQZ0tt1vSVq/H/h6X//3ia//9ki///Unz//z9t + //8tYf//Llrj/ytIr/Q0S6NnAAAAAAAAAAAAAAAAAAAAAAAAAABIadBnSWrR2o2j5f95lvL/YIb7/1B6 + +/9Mc+7/TXDY/zVStto5U69nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhp0DRHZ82ARWXKwERi + xu1CYMPtQV7AwEBcvYA/W7s0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///398A/9/eAH/f3AA/39gAH9/YAB + TUyAASj9gAH9/YAB/XWAAZiYgAFwKIAB/f3AA3h04Ae6w/APmHD///39 + + + + 349, 23 + + + + AAABAAMAEBAQAAAAAAAoAQAANgAAABAQAAABAAgAaAUAAF4BAAAQEAAAAQAgAGgEAADGBgAAKAAAABAA + AAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/wD/AIAAgAD/AAAAgAAAAP// + AACAgAAAAAAAAACAAAAA//8AAICAAAAA/wAAAIAAwMDAAICAgACIiIiIiIiIiIiIiIiIiIiIiIiIzMyI + iIiIiMzMzMyIiIiMzMEczMiIiIzMwRzMyIiIzMzMzMzMiIjMzMzMzMyIiMzMwRzMzIiIzMzBHMzMiIiM + zMEczMiIiIzMwRzMyIiIiMzMzMyIiIiIiMzMiIiIiIiIiIiIiIiIiIiIiIiIiP//AAD//wAA/D8AAPAP + AADgBwAA4AcAAMADAADAAwAAwAMAAMADAADgBwAA4AcAAPAPAAD8PwAA//8AAP//AAAoAAAAEAAAACAA + AAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICA + gADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA/18qAAB/KgBVfyoAqn8qAP9/KgAAnyoAVZ8qAKqf + KgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV3yoAqt8qAP/fKgAA/yoAVf8qAKr/KgD//yoAAABVAFUA + VQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8fVQAAP1UAVT9VAKo/VQD/P1UAAF9VAFVfVQCqX1UA/19VAAB/ + VQBVf1UAqn9VAP9/VQAAn1UAVZ9VAKqfVQD/n1UAAL9VAFW/VQCqv1UA/79VAADfVQBV31UAqt9VAP/f + VQAA/1UAVf9VAKr/VQD//1UAAAB/AFUAfwCqAH8A/wB/AAAffwBVH38Aqh9/AP8ffwAAP38AVT9/AKo/ + fwD/P38AAF9/AFVffwCqX38A/19/AAB/fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqffwD/n38AAL9/AFW/ + fwCqv38A/79/AADffwBV338Aqt9/AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUAqgCqAKoA/wCqAAAf + qgBVH6oAqh+qAP8fqgAAP6oAVT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/qgBVf6oAqn+qAP9/ + qgAAn6oAVZ+qAKqfqgD/n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/fqgAA/6oAVf+qAKr/ + qgD//6oAAADUAFUA1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/1AD/P9QAAF/UAFVf + 1ACqX9QA/1/UAAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/1ACqv9QA/7/UAADf + 1ABV39QAqt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof/wD/H/8AAD//AFU/ + /wCqP/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf/wCqn/8A/5//AAC/ + /wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP//MwD//2YA//+ZAP// + zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8AAP+/AAAA3wAAVd8AAKrf + AAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA/x8qAAA/KgBVPyoA8Pv/AKSg + oACAgIAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AP39/f39/f39/f39/f39/f39/f39/VFNTCgo + KP39/f39/f39dXV0mJiYlHAoJP39/f39eHScurrDv5iYcCQk/f39/Xidur7D///Duph0JP39/Xmdvr++ + w///w7q6mEwo/f15w7/Dv8PDw766upiUKP39ncPDw8PD//+/urq6mCj9/XnDw8fDyP//x766uphM/f2d + yMfIx8z//8y/urqYTf39naXIx8jQ///Mv766dVD9/f2dyMzHzP//yL6+mXT9/f39nZ3MyMfDw76/nHR0 + /f39/f2dnaalw8PDnXl0/f39/f39/f2dnZ15nXn9/f39/f39/f39/f39/f39/f39/f3//wAA+B8AAOAH + AADAAwAAwAMAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAADAAwAA4AcAAPgfAAD//wAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL0OXNCk6 + ioAjMX3AHilw7RggZO0TGFjADhFOgAoLRDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANEujZyhA + ndocQbj/DDzQ/wM54f8CNtv/BjO8/wgqlv8ID1TaBgQ6ZwAAAAAAAAAAAAAAAAAAAAAAAAAAOVOvZyhG + rfQcTN3/CUP6/wZB+f9Hc/r/RnH2/wA47P8ANuP/BS+1/wUQXvQGBDpnAAAAAAAAAAAAAAAAP1u7NDNQ + tdouWuP/HVL9/xpQ/f9Wf/z//v7+//7+/v9ZgPr/ADvv/wA35P8FL7b/CA9U2goLRDQAAAAAAAAAAEBc + vYBNcNn/LF///y1h//8tX///Y4n+//7+/v/+/v7/UHn7/wM/+f8AOu7/ADbk/wkqlv8OEU6AAAAAAAAA + AABBXsDAS3Lu/z9t//9Bb///Pm3//zlq//9qjv//Yof+/xtS/P8NSPv/AD34/wA56v8GM73/ExhYwAAA + AAAAAAAAQmDD7VF4+/9SfP//VX///1J8//9ehf///v7+//7+/v89bf3/GFD7/wpF+f8AO/P/Ajbd/xgg + ZO0AAAAAAAAAAERixu1ghvv/ZYr//2iO//9mjP//la////7+/v/+/v7/eZr//yFX/f8RSfv/Aj74/wM5 + 4v8eKXDtAAAAAAAAAABFZcrAeZby/3ia//98nP//eZn//7HE///+/v7//v7+/6K4/v8oXP7/F0/7/wdB + +P8MO9D/IzF9wAAAAAAAAAAAR2fNgI2i5f+Hpf//jaj//4ij///F0/7//v7+//7+/v+1x/7/LF///xtS + /P8JQ/r/HEG4/yk6ioAAAAAAAAAAAEhp0DRHaNHalKrx/5my//+NqP//qb7///7+/v/+/v7/g6H//y5i + //8cU/3/HEzc/yhAndovQ5c0AAAAAAAAAAAAAAAASGnQZ0tt1vSVq/H/h6X//3ia//9ki///Unz//z9t + //8tYf//Llrj/ytIr/Q0S6NnAAAAAAAAAAAAAAAAAAAAAAAAAABIadBnSWrR2o2j5f95lvL/YIb7/1B6 + +/9Mc+7/TXDY/zVStto5U69nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhp0DRHZ82ARWXKwERi + xu1CYMPtQV7AwEBcvYA/W7s0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///398A/9/eAH/f3AA/39gAH9/YAB + TUyAASj9gAH9/YAB/XWAAZiYgAFwKIAB/f3AA3h04Ae6w/APmHD///39 + + + + 30, 22 + + + + AAABAAMAEBAQAAAAAAAoAQAANgAAABAQAAABAAgAaAUAAF4BAAAQEAAAAQAgAGgEAADGBgAAKAAAABAA + AAAgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/wD/AIAAgAD/AAAAgAAAAP// + AACAgAAAAAAAAACAAAAA//8AAICAAAAA/wAAAIAAwMDAAICAgACIiIiIiIiIiIiIiIiIiIiIiIiIzMyI + iIiIiMzMzMyIiIiMzMEczMiIiIzMwRzMyIiIzMzMzMzMiIjMzMzMzMyIiMzMwRzMzIiIzMzBHMzMiIiM + zMEczMiIiIzMwRzMyIiIiMzMzMyIiIiIiMzMiIiIiIiIiIiIiIiIiIiIiIiIiP//AAD//wAA/D8AAPAP + AADgBwAA4AcAAMADAADAAwAAwAMAAMADAADgBwAA4AcAAPAPAAD8PwAA//8AAP//AAAoAAAAEAAAACAA + AAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICA + gADA3MAA8MqmAKo/KgD/PyoAAF8qAFVfKgCqXyoA/18qAAB/KgBVfyoAqn8qAP9/KgAAnyoAVZ8qAKqf + KgD/nyoAAL8qAFW/KgCqvyoA/78qAADfKgBV3yoAqt8qAP/fKgAA/yoAVf8qAKr/KgD//yoAAABVAFUA + VQCqAFUA/wBVAAAfVQBVH1UAqh9VAP8fVQAAP1UAVT9VAKo/VQD/P1UAAF9VAFVfVQCqX1UA/19VAAB/ + VQBVf1UAqn9VAP9/VQAAn1UAVZ9VAKqfVQD/n1UAAL9VAFW/VQCqv1UA/79VAADfVQBV31UAqt9VAP/f + VQAA/1UAVf9VAKr/VQD//1UAAAB/AFUAfwCqAH8A/wB/AAAffwBVH38Aqh9/AP8ffwAAP38AVT9/AKo/ + fwD/P38AAF9/AFVffwCqX38A/19/AAB/fwBVf38Aqn9/AP9/fwAAn38AVZ9/AKqffwD/n38AAL9/AFW/ + fwCqv38A/79/AADffwBV338Aqt9/AP/ffwAA/38AVf9/AKr/fwD//38AAACqAFUAqgCqAKoA/wCqAAAf + qgBVH6oAqh+qAP8fqgAAP6oAVT+qAKo/qgD/P6oAAF+qAFVfqgCqX6oA/1+qAAB/qgBVf6oAqn+qAP9/ + qgAAn6oAVZ+qAKqfqgD/n6oAAL+qAFW/qgCqv6oA/7+qAADfqgBV36oAqt+qAP/fqgAA/6oAVf+qAKr/ + qgD//6oAAADUAFUA1ACqANQA/wDUAAAf1ABVH9QAqh/UAP8f1AAAP9QAVT/UAKo/1AD/P9QAAF/UAFVf + 1ACqX9QA/1/UAAB/1ABVf9QAqn/UAP9/1AAAn9QAVZ/UAKqf1AD/n9QAAL/UAFW/1ACqv9QA/7/UAADf + 1ABV39QAqt/UAP/f1AAA/9QAVf/UAKr/1AD//9QAVQD/AKoA/wAAH/8AVR//AKof/wD/H/8AAD//AFU/ + /wCqP/8A/z//AABf/wBVX/8Aql//AP9f/wAAf/8AVX//AKp//wD/f/8AAJ//AFWf/wCqn/8A/5//AAC/ + /wBVv/8Aqr//AP+//wAA3/8AVd//AKrf/wD/3/8AVf//AKr//wD/zMwA/8z/AP//MwD//2YA//+ZAP// + zAAAfwAAVX8AAKp/AAD/fwAAAJ8AAFWfAACqnwAA/58AAAC/AABVvwAAqr8AAP+/AAAA3wAAVd8AAKrf + AAD/3wAAVf8AAKr/AAAAACoAVQAqAKoAKgD/ACoAAB8qAFUfKgCqHyoA/x8qAAA/KgBVPyoA8Pv/AKSg + oACAgIAAAAD/AAD/AAAA//8A/wAAAAAAAAD//wAA////AP39/f39/f39/f39/f39/f39/f39/VFNTCgo + KP39/f39/f39dXV0mJiYlHAoJP39/f39eHScurrDv5iYcCQk/f39/Xidur7D///Duph0JP39/Xmdvr++ + w///w7q6mEwo/f15w7/Dv8PDw766upiUKP39ncPDw8PD//+/urq6mCj9/XnDw8fDyP//x766uphM/f2d + yMfIx8z//8y/urqYTf39naXIx8jQ///Mv766dVD9/f2dyMzHzP//yL6+mXT9/f39nZ3MyMfDw76/nHR0 + /f39/f2dnaalw8PDnXl0/f39/f39/f2dnZ15nXn9/f39/f39/f39/f39/f39/f39/f3//wAA+B8AAOAH + AADAAwAAwAMAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAADAAwAA4AcAAPgfAAD//wAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL0OXNCk6 + ioAjMX3AHilw7RggZO0TGFjADhFOgAoLRDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANEujZyhA + ndocQbj/DDzQ/wM54f8CNtv/BjO8/wgqlv8ID1TaBgQ6ZwAAAAAAAAAAAAAAAAAAAAAAAAAAOVOvZyhG + rfQcTN3/CUP6/wZB+f9Hc/r/RnH2/wA47P8ANuP/BS+1/wUQXvQGBDpnAAAAAAAAAAAAAAAAP1u7NDNQ + tdouWuP/HVL9/xpQ/f9Wf/z//v7+//7+/v9ZgPr/ADvv/wA35P8FL7b/CA9U2goLRDQAAAAAAAAAAEBc + vYBNcNn/LF///y1h//8tX///Y4n+//7+/v/+/v7/UHn7/wM/+f8AOu7/ADbk/wkqlv8OEU6AAAAAAAAA + AABBXsDAS3Lu/z9t//9Bb///Pm3//zlq//9qjv//Yof+/xtS/P8NSPv/AD34/wA56v8GM73/ExhYwAAA + AAAAAAAAQmDD7VF4+/9SfP//VX///1J8//9ehf///v7+//7+/v89bf3/GFD7/wpF+f8AO/P/Ajbd/xgg + ZO0AAAAAAAAAAERixu1ghvv/ZYr//2iO//9mjP//la////7+/v/+/v7/eZr//yFX/f8RSfv/Aj74/wM5 + 4v8eKXDtAAAAAAAAAABFZcrAeZby/3ia//98nP//eZn//7HE///+/v7//v7+/6K4/v8oXP7/F0/7/wdB + +P8MO9D/IzF9wAAAAAAAAAAAR2fNgI2i5f+Hpf//jaj//4ij///F0/7//v7+//7+/v+1x/7/LF///xtS + /P8JQ/r/HEG4/yk6ioAAAAAAAAAAAEhp0DRHaNHalKrx/5my//+NqP//qb7///7+/v/+/v7/g6H//y5i + //8cU/3/HEzc/yhAndovQ5c0AAAAAAAAAAAAAAAASGnQZ0tt1vSVq/H/h6X//3ia//9ki///Unz//z9t + //8tYf//Llrj/ytIr/Q0S6NnAAAAAAAAAAAAAAAAAAAAAAAAAABIadBnSWrR2o2j5f95lvL/YIb7/1B6 + +/9Mc+7/TXDY/zVStto5U69nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEhp0DRHZ82ARWXKwERi + xu1CYMPtQV7AwEBcvYA/W7s0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///398A/9/eAH/f3AA/39gAH9/YAB + TUyAASj9gAH9/YAB/XWAAZiYgAFwKIAB/f3AA3h04Ae6w/APmHD///39 + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Program.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Program.cs new file mode 100644 index 0000000..47cc921 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ValidationComponentsClient +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..bfe4064 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ValidationComponentsClient")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ValidationComponentsClient")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2e3b233b-7be4-4743-93cf-61bbf8769eb3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Resources.Designer.cs new file mode 100644 index 0000000..22f3d05 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ValidationComponentsClient.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ValidationComponentsClient.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ValidationComponentsClient.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace ValidationComponentsClient.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ValidationComponentsClient.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Settings.Designer.cs new file mode 100644 index 0000000..fb11b8c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ValidationComponentsClient.Properties.Settings.get_Default():ValidationComponentsClient.Properties.Settings")] + +namespace ValidationComponentsClient.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/ValidationComponentsClient.csproj b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/ValidationComponentsClient.csproj new file mode 100644 index 0000000..1498ca4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/ValidationComponentsClient.csproj @@ -0,0 +1,76 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {3EF1A765-61F8-4A90-BE17-1F7ACC10DBBF} + WinExe + Properties + ValidationComponentsClient + ValidationComponentsClient + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {20F1C950-9939-4C59-8EDE-B421A3123E94} + ValidationComponents + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/ValidationComponentsClient.csproj.user b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/ValidationComponentsClient.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/ValidationComponentsClient.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Debug/ValidationComponents.dll b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Debug/ValidationComponents.dll new file mode 100644 index 0000000..c0773b5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Debug/ValidationComponents.dll differ diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Debug/ValidationComponentsClient.exe b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Debug/ValidationComponentsClient.exe new file mode 100644 index 0000000..ea22e1d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Debug/ValidationComponentsClient.exe differ diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Release/ValidationComponents.dll b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Release/ValidationComponents.dll new file mode 100644 index 0000000..db8df0e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Release/ValidationComponents.dll differ diff --git a/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Release/ValidationComponentsClient.exe b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Release/ValidationComponentsClient.exe new file mode 100644 index 0000000..2479559 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter18/ValidationComponents/ValidationComponentsClient/bin/Release/ValidationComponentsClient.exe differ diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Child.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/Child.Designer.cs new file mode 100644 index 0000000..bc02c8a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Child.Designer.cs @@ -0,0 +1,47 @@ +namespace DocumentView +{ + partial class Child + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // Child + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Child"; + this.Text = "Child"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Child.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/Child.cs new file mode 100644 index 0000000..51f4c83 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Child.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DocumentView +{ + public partial class Child : Form + { + public Child() + { + InitializeComponent(); + } + public enum ViewType + { + ItemGrid, + PrintPreview + } + + public Order Document; + + public Child(Order doc, ViewType viewType) + : this() + { + // Configure the title. + this.Text = doc.LastFileName; + this.Document = doc; + + // Create a reference for the view. + // This reference can accomodate any type of control. + Control view = null; + + // Instantiate the appropriate view. + switch (viewType) + { + case ViewType.ItemGrid: + view = new OrderGridView(doc); + break; + case ViewType.PrintPreview: + view = new OrderPrintPreview(doc); + break; + } + + // Add the view to the form. + view.Dock = DockStyle.Fill; + this.Controls.Add(view); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Child.resx b/Pro Windows Forms 2.0/Chapter19/DocumentView/Child.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Child.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Document.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/Document.cs new file mode 100644 index 0000000..06259ae --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Document.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections; +using System.IO; + +namespace DocumentView +{ + public class OrderItem + { + private int id; + public int ID + { + get { return id; } + set { id = value; } + } + + public OrderItem(int id) + { + ID = id; + } + } + + public class Order : CollectionBase + { + public event EventHandler DocumentChanged; + + private string lastFilename = "[New Order]"; + public string LastFileName + { + get + { + return lastFilename; + } + set + { + lastFilename = value; + } + } + + public void Add(OrderItem item) + { + base.List.Add(item); + OnDocumentChanged(new EventArgs()); + } + + public void Remove(int index) + { + // Check to see if there is an item at the supplied index. + if (index > (this.Count - 1) || index < 0) + { + throw new System.IndexOutOfRangeException(); + } + else + { + base.List.RemoveAt(index); + } + OnDocumentChanged(new EventArgs()); + } + + // Indexer. + public OrderItem this[int index] + { + get { return (OrderItem)base.List[index]; } + set { base.List[index] = value; } + } + + protected void OnDocumentChanged(System.EventArgs e) + { + // Note that this currently occurs as items are added or removed, + // but not when they are edited. To overcome this would require adding + // an additional OrderItem change event. + + // Raise the DocumentChanged event. + if (DocumentChanged != null) + { + DocumentChanged(this, e); + } + } + + + public void Open(string filename) + { + using (FileStream fs = new FileStream(filename, FileMode.Open)) + { + StreamReader r = new StreamReader(fs); + + do + { + this.Add(new OrderItem(int.Parse(r.ReadLine()))); + } while (r.Peek() != -1); + + r.Close(); + } + + // By placing this last we ensure that the file will not be updated + // if a load error occurs. + this.LastFileName = filename; + } + + public void Save(string filename) + { + using (FileStream fs = new FileStream(filename, FileMode.Create)) + { + StreamWriter w = new StreamWriter(fs); + + foreach (OrderItem item in this.List) + { + w.WriteLine(item.ID); + } + + w.Close(); + } + + // Note: a real pricing program would probably store the price in the file + // (required for orders) but update it to correspond with the current + // price for the item when the file is opened. + + // By placing this last we ensure that the file will not be updated + // if a save error occurs. + this.LastFileName = filename; + } + + } + + + public class Product + { + private int id; + public int ID + { + get { return id; } + set { id = value; } + } + + private string name; + public string Name + { + get { return name; } + set { name = value; } + } + + private string description; + public string Description + { + get { return description; } + set { description = value; } + } + + private decimal price; + public decimal Price + { + get { return price; } + set { price = value; } + } + + public Product(int id, string name, string description, decimal price) + { + ID = id; + Name = name; + Description = description; + Price = price; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.csproj b/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.csproj new file mode 100644 index 0000000..426f1a1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.csproj @@ -0,0 +1,99 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {1225E391-460B-43D7-BFEF-0105CB81CE7C} + WinExe + Properties + DocumentView + DocumentView + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Child.cs + + + + UserControl + + + OrderGridView.cs + + + UserControl + + + OrderPrintPreview.cs + + + Form + + + Parent.cs + + + + + + Child.cs + + + OrderGridView.cs + + + OrderPrintPreview.cs + + + Parent.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.csproj.user b/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.sln b/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.sln new file mode 100644 index 0000000..f01d6fd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocumentView", "DocumentView.csproj", "{1225E391-460B-43D7-BFEF-0105CB81CE7C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1225E391-460B-43D7-BFEF-0105CB81CE7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1225E391-460B-43D7-BFEF-0105CB81CE7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1225E391-460B-43D7-BFEF-0105CB81CE7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1225E391-460B-43D7-BFEF-0105CB81CE7C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.suo b/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.suo new file mode 100644 index 0000000..eb64d1e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter19/DocumentView/DocumentView.suo differ diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderGridView.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderGridView.Designer.cs new file mode 100644 index 0000000..d120602 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderGridView.Designer.cs @@ -0,0 +1,123 @@ +namespace DocumentView +{ + partial class OrderGridView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdRemove = new System.Windows.Forms.Button(); + this.cmdAdd = new System.Windows.Forms.Button(); + this.list = new System.Windows.Forms.ListView(); + this.ColumnHeader1 = new System.Windows.Forms.ColumnHeader(); + this.ColumnHeader2 = new System.Windows.Forms.ColumnHeader(); + this.ColumnHeader3 = new System.Windows.Forms.ColumnHeader(); + this.ColumnHeader4 = new System.Windows.Forms.ColumnHeader(); + this.SuspendLayout(); + // + // cmdRemove + // + this.cmdRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdRemove.Location = new System.Drawing.Point(280, 37); + this.cmdRemove.Name = "cmdRemove"; + this.cmdRemove.Size = new System.Drawing.Size(112, 28); + this.cmdRemove.TabIndex = 8; + this.cmdRemove.Text = "Remove Item"; + this.cmdRemove.Click += new System.EventHandler(this.cmdRemove_Click); + // + // cmdAdd + // + this.cmdAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAdd.Location = new System.Drawing.Point(280, 5); + this.cmdAdd.Name = "cmdAdd"; + this.cmdAdd.Size = new System.Drawing.Size(112, 28); + this.cmdAdd.TabIndex = 7; + this.cmdAdd.Text = "Add Random Item"; + this.cmdAdd.Click += new System.EventHandler(this.cmdAdd_Click); + // + // list + // + this.list.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.list.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.ColumnHeader1, + this.ColumnHeader2, + this.ColumnHeader3, + this.ColumnHeader4}); + this.list.FullRowSelect = true; + this.list.Location = new System.Drawing.Point(4, 5); + this.list.MultiSelect = false; + this.list.Name = "list"; + this.list.Size = new System.Drawing.Size(264, 136); + this.list.TabIndex = 6; + this.list.View = System.Windows.Forms.View.Details; + // + // ColumnHeader1 + // + this.ColumnHeader1.Text = "ID"; + this.ColumnHeader1.Width = 30; + // + // ColumnHeader2 + // + this.ColumnHeader2.Text = "Name"; + this.ColumnHeader2.Width = 100; + // + // ColumnHeader3 + // + this.ColumnHeader3.Text = "Price"; + this.ColumnHeader3.Width = 50; + // + // ColumnHeader4 + // + this.ColumnHeader4.Text = "Description"; + this.ColumnHeader4.Width = 200; + // + // OrderGridView + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.cmdRemove); + this.Controls.Add(this.cmdAdd); + this.Controls.Add(this.list); + this.Name = "OrderGridView"; + this.Size = new System.Drawing.Size(397, 146); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button cmdRemove; + private System.Windows.Forms.Button cmdAdd; + private System.Windows.Forms.ListView list; + private System.Windows.Forms.ColumnHeader ColumnHeader1; + private System.Windows.Forms.ColumnHeader ColumnHeader2; + private System.Windows.Forms.ColumnHeader ColumnHeader3; + private System.Windows.Forms.ColumnHeader ColumnHeader4; + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderGridView.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderGridView.cs new file mode 100644 index 0000000..eb8fcdd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderGridView.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +namespace DocumentView +{ + public partial class OrderGridView : UserControl + { + public OrderGridView() + { + InitializeComponent(); + } + + private Order document; + public Order Document + { + set + { + // Store a reference to the document, attach the event handler, + // and refresh the display. + document = value; + document.DocumentChanged += new EventHandler(RefreshList); + RefreshList(); + } + get { return document; } + } + + + public OrderGridView(Order document) + : this() + { + // Store a reference to the document, attach the event handler, + // and refresh the display. + Document = document; + } + + private void RefreshList(object sender, System.EventArgs e) + { + RefreshList(); + } + + private void RefreshList() + { + // Update the ListView control with the new document contents. + if (list != null) + { + // For best performance, disable refreshes while updating the list. + list.SuspendLayout(); + + list.Items.Clear(); + + // Step through the list of items in the document. + Product itemProduct; + ListViewItem itemDisplay; + foreach (OrderItem item in this.Document) + { + itemDisplay = list.Items.Add(item.ID.ToString()); + itemProduct = PriceList.GetItem(item.ID); + itemDisplay.SubItems.Add(itemProduct.Name); + itemDisplay.SubItems.Add(itemProduct.Price.ToString()); + itemDisplay.SubItems.Add(itemProduct.Description); + } + + list.ResumeLayout(); + } + } + + // Triggered when the Add button is clicked. + private void cmdAdd_Click(object sender, System.EventArgs e) + { + // Add a random item. + Random randomItem = new Random(); + Document.Add(new OrderItem(randomItem.Next(1, 4))); + } + + // Triggered when the Remove button is clicked. + private void cmdRemove_Click(object sender, System.EventArgs e) + { + // Remove the current item. + // The ListView Is configured for single-selection only. + if (list.SelectedIndices.Count == 1) + Document.Remove(list.SelectedIndices[0]); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderGridView.resx b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderGridView.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderGridView.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderPrintPreview.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderPrintPreview.Designer.cs new file mode 100644 index 0000000..cc4831e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderPrintPreview.Designer.cs @@ -0,0 +1,61 @@ +namespace DocumentView +{ + partial class OrderPrintPreview + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Preview = new System.Windows.Forms.PrintPreviewControl(); + this.SuspendLayout(); + // + // Preview + // + this.Preview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.Preview.AutoZoom = false; + this.Preview.Location = new System.Drawing.Point(4, 4); + this.Preview.Name = "Preview"; + this.Preview.Size = new System.Drawing.Size(401, 204); + this.Preview.TabIndex = 2; + this.Preview.Zoom = 1; + // + // OrderPrintPreview + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.Preview); + this.Name = "OrderPrintPreview"; + this.Size = new System.Drawing.Size(408, 212); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PrintPreviewControl Preview; + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderPrintPreview.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderPrintPreview.cs new file mode 100644 index 0000000..af2c872 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderPrintPreview.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Printing; + +namespace DocumentView +{ + public partial class OrderPrintPreview : UserControl + { + public OrderPrintPreview() + { + InitializeComponent(); + } + + private Order document; + public Order Document + { + set + { + // Store a reference to the document, attach the event handler, + // and refresh the display. + document = value; + document.DocumentChanged += new EventHandler(RefreshList); + printDoc.PrintPage += new PrintPageEventHandler(PrintDoc); + RefreshList(); + } + get { return document; } + } + + private PrintDocument printDoc = new PrintDocument(); + + public OrderPrintPreview(Order document) + : this() + { + // Store a reference to the document, attach the document event handlers, + // and refresh the display. + Document = document; + + } + + private void RefreshList(object sender, System.EventArgs e) + { + RefreshList(); + } + + private void RefreshList() + { + // Setting this property starts the preview, + // even if the PrintDoc document is already assigned. + Preview.Document = printDoc; + Preview.InvalidatePreview(); + } + + // Tracks placement while printing. + private int itemNumber; + + // The print font. + private Font printFont = new Font("Tahoma", 14, FontStyle.Bold); + + private void PrintDoc(object sender, + System.Drawing.Printing.PrintPageEventArgs e) + { + + // Tracks the line position on the page. + int y = 70; + + // Step through the items and write them to the page. + OrderItem item; + Product itemProduct; + + for (itemNumber = 0; itemNumber < Document.Count; itemNumber++) + { + item = Document[itemNumber]; + e.Graphics.DrawString(item.ID.ToString(), printFont, + Brushes.Black, 70, y); + itemProduct = PriceList.GetItem(item.ID); + e.Graphics.DrawString(itemProduct.Name, printFont, + Brushes.Black, 120, y); + e.Graphics.DrawString(itemProduct.Price.ToString(), printFont, + Brushes.Black, 350, y); + + // Check if more pages are required. + if ((y + 30) > e.MarginBounds.Height && + itemNumber < (Document.Count - 1)) + { + e.HasMorePages = true; + return; + } + + // Move to the next line. + y += 20; + } + + // Printing is finished. + e.HasMorePages = false; + itemNumber = 0; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderPrintPreview.resx b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderPrintPreview.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/OrderPrintPreview.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Parent.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/Parent.Designer.cs new file mode 100644 index 0000000..30c4f42 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Parent.Designer.cs @@ -0,0 +1,145 @@ +namespace DocumentView +{ + partial class Parent + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Parent)); + this.imgButtons = new System.Windows.Forms.ImageList(this.components); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton3 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton4 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton5 = new System.Windows.Forms.ToolStripButton(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // imgButtons + // + this.imgButtons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgButtons.ImageStream"))); + this.imgButtons.Images.SetKeyName(0, ""); + this.imgButtons.Images.SetKeyName(1, ""); + this.imgButtons.Images.SetKeyName(2, ""); + this.imgButtons.Images.SetKeyName(3, ""); + this.imgButtons.Images.SetKeyName(4, ""); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton1, + this.toolStripButton2, + this.toolStripButton3, + this.toolStripButton4, + this.toolStripSeparator1, + this.toolStripButton5}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(521, 36); + this.toolStrip1.TabIndex = 1; + this.toolStrip1.Text = "toolStrip1"; + // + // toolStripButton1 + // + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Text = "New"; + this.toolStripButton1.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton1.Click += new System.EventHandler(this.cmdNew); + // + // toolStripButton2 + // + this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); + this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton2.Name = "toolStripButton2"; + this.toolStripButton2.Text = "Open"; + this.toolStripButton2.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton2.Click += new System.EventHandler(this.cmdOpen); + // + // toolStripButton3 + // + this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image"))); + this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton3.Name = "toolStripButton3"; + this.toolStripButton3.Text = "Close"; + this.toolStripButton3.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton3.Click += new System.EventHandler(this.cmdClose); + // + // toolStripButton4 + // + this.toolStripButton4.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton4.Image"))); + this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton4.Name = "toolStripButton4"; + this.toolStripButton4.Text = "Save"; + this.toolStripButton4.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton4.Click += new System.EventHandler(this.cmdSave); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // toolStripButton5 + // + this.toolStripButton5.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton5.Image"))); + this.toolStripButton5.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton5.Name = "toolStripButton5"; + this.toolStripButton5.Text = "Preview"; + this.toolStripButton5.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton5.Click += new System.EventHandler(this.cmdPreview); + // + // Parent + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(521, 408); + this.Controls.Add(this.toolStrip1); + this.IsMdiContainer = true; + this.Name = "Parent"; + this.Text = "Parent"; + this.Load += new System.EventHandler(this.Parent_Load); + this.toolStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ImageList imgButtons; + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.ToolStripButton toolStripButton2; + private System.Windows.Forms.ToolStripButton toolStripButton3; + private System.Windows.Forms.ToolStripButton toolStripButton4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton toolStripButton5; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Parent.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/Parent.cs new file mode 100644 index 0000000..7c942a6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Parent.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DocumentView +{ + public partial class Parent : Form + { + public Parent() + { + InitializeComponent(); + } + private string lastDir = "C:\\Temp"; + + private void cmdOpen(object sender, EventArgs e) + { + OpenFileDialog dlgOpen = new OpenFileDialog(); + dlgOpen.InitialDirectory = lastDir; + dlgOpen.Filter = "Order Files (*.ord)|*.ord"; + + // Show the open dialog. + if (dlgOpen.ShowDialog() == DialogResult.OK) + { + Order doc = new Order(); + + try + { + doc.Open(dlgOpen.FileName); + } + catch (Exception err) + { + // All exceptions bubble up to this level. + MessageBox.Show(err.ToString()); + return; + } + + // Create the child form for the selected file. + Child frmChild = new Child(doc, Child.ViewType.ItemGrid); + frmChild.MdiParent = this; + frmChild.Show(); + } + } + + private void cmdNew(object sender, EventArgs e) + { + // Create a new order. + Order doc = new Order(); + Child frmChild = new Child(doc, Child.ViewType.ItemGrid); + frmChild.MdiParent = this; + frmChild.Show(); + } + + private void cmdSave(object sender, EventArgs e) + { + // Save the current order. + if (ActiveMdiChild != null) + { + SaveFileDialog dlgSave = new SaveFileDialog(); + Order doc = ((Child)ActiveMdiChild).Document; + dlgSave.FileName = doc.LastFileName; + dlgSave.Filter = "Order Files (*.ord)|*.ord"; + + if (dlgSave.ShowDialog() == DialogResult.OK) + { + try + { + doc.Save(dlgSave.FileName); + ActiveMdiChild.Text = dlgSave.FileName; + } + catch (Exception err) + { + // All exceptions bubble up to this level. + MessageBox.Show(err.ToString()); + return; + } + } + } + } + + private void cmdClose(object sender, EventArgs e) + { + if (ActiveMdiChild != null) + ActiveMdiChild.Close(); + } + + private void cmdPreview(object sender, EventArgs e) + { + // Launch a print preview child for the active order. + if (ActiveMdiChild != null) + { + Order doc = ((Child)ActiveMdiChild).Document; + + Child frmChild = new Child(doc, Child.ViewType.PrintPreview); + frmChild.MdiParent = this; + frmChild.Show(); + } + } + + private void Parent_Load(object sender, EventArgs e) + { + toolStrip1.Items[0].Image = imgButtons.Images[0]; + toolStrip1.Items[1].Image = imgButtons.Images[1]; + toolStrip1.Items[2].Image = imgButtons.Images[2]; + toolStrip1.Items[3].Image = imgButtons.Images[3]; + toolStrip1.Items[5].Image = imgButtons.Images[4]; + + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Parent.resx b/Pro Windows Forms 2.0/Chapter19/DocumentView/Parent.resx new file mode 100644 index 0000000..a33301d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Parent.resx @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA6 + DAAAAk1TRnQBSQFMAgEBBQEAAQkBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/w0AAsg9AAHIAf4B0wEE + NQABbQQSARMBDwH+AdMBBAISNAABbQS8AcgB/gHTAQQBkgG8ARI0AAFtA/8ByAH+AdMBBAGSAfIBvAES + NAABbQLyAcgC0wEEAW0BkgH/AbwBEjIAAW0BEwEPARABkgH/AW0BBAGSAvIB/wG8ARIxAAFtAeIBBwLi + ARABkgEEAW0DkgH/AbwBEjAAAW0B4gH/AQcB4gKSAQ8BkgTyAf8BvAESMAABbQHiAfQBBwHiAt8BDwFt + BJIB/wG8ARIwAAFtAeIB/wEHAeICkgEPAZIF8gG8ARIwAAFtAeIB9AEHAeIC3wEPAW0CkgH/AfICvAES + MQABbQHiAQcC4gEPAZIBvALyAf8CEgITMgACbQEPARABkgG8AfID/wGSAf8BvAFtNAABbQLyBf8BkgG8 + ARI1AAltARJtAAMBAgcTAAH/HQAB/wgAAgEB/wIBAQcTAAH7AQAB+wwAAgMGAAK8AQABAwMAAfsBAAH7 + BQADAQH/AwEGAAH/AfsLAAH/AQAB/wEHAfsKAAIDBgACvAEAAQMDAAH/AQAB/wEHAfsDAAEBBf8BAQQA + Af8BAAH7Af8B+wH/CQAB+wEAAfsBBwH/AQcB+wgAAgMGAAK8AQABAwMAAfsBAAH7AQcB/wEHAfsBAAMB + Af8DAQMAAfsCAAH/AfsB/wH7Af8B+wcAAf8BAAL/AfsBBwH/AQcB+wYAAgMJAAEDAwAB/wEAAv8B+wEH + Af8BBwH7AgEB/wIBAwAB/wEAAf8BAAH7Af8B+wH/AfsB/wH7Af8FAAH7AQAB+wL/AQcB+wEHAf8GAAwD + AwAB+wEAAfsC/wEHAfsBBwH/AQADAQMAAfsBAAL/AQAB/wH7Af8B+wH/AfsB/wH7Af8EAAH/AQAC/wH7 + AQcB/wEHAfsGAAIDCAACAwMAAf8BAAL/AfsBBwH/AQcB+wgAA/8CAAH/AfsB/wH7Af8B+wH/AfsEAAH7 + AQAB+wP/AfsBBwH/BgABAwEACLwBAAEDAwAB+wEAAfsD/wH7AQcB/woAA/8CAAH7Af8B+wH/AfsB/wQA + Af8BAAL/AfsC/wEHAfsGAAEDAQAIvAEAAQMDAAH/AQAC/wH7Av8BBwH7CAAB+wH/AgAC/wEAAf8B+wH/ + AfsB/wH7BAAB+wH/AgAC/wH7AQcB/wYAAQMBAAi8AQABAwMAAfsB/wIAAv8B+wEHAf8JAAH7Af8B+wEA + Av8CAAH7Af8B+wH/BQAB+wH/AfsCAAH/AQcB+wYAAQMBAAi8AQABAwQAAfsB/wH7AgAB/wEHAfsLAAH/ + AfsBAAL/AwAB/wH7BwAB/wH7Af8CAAH/BgABAwEACLwIAAH/AfsB/wIAAf8QAAH/AfsKAAH7Af8B+wH/ + AfsHAAEDAQAIvAEAAbwGAAH7Af8B+wH/AfseAAH7Af8cAAH7Af9JAAFCAU0BPgcAAT4DAAEoAwABQAMA + ASADAAEBAQABAQYAAQEWAAP/AQAB/wHzBgAB/wHhBgAB8AcAAfAHAAHwBwAB8AcAAcAHAAGAJwABgAcA + AcAHAAHwAQEGAAHwAQMGAAL/AecD/wGfAeAC/wHDAf8BwAEBAQ8BwAH4Af8BwAH/AYABAQEDAYAB8AE/ + AcABPwGAAQEBAAGAAeABDwHAAQ8BgAEBAgABwAEDAcABBwGAAQEBAAEBAYABAAHAAQcBgAEBAQABAwIA + AcABBwGAAQEBAAEfAgABwAEHAYABAQEAAR8BgAEAAcABBwGAAQEBAAEfAYABAAHAAQcBgAEBAQABHwHA + AQABwAEHAYABAQEAAR8B4AEAAfABBwGAAQEBwAEfAfkBAAH4AQcBgAEBAeABHwH/Ac8B+AEHAYABAQHg + AR8C/wH+AX8C/wH5Af8L + + + + 125, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/PriceList.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/PriceList.cs new file mode 100644 index 0000000..4c998a0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/PriceList.cs @@ -0,0 +1,30 @@ +using System; + +namespace DocumentView +{ + /// + /// Summary description for PriceList. + /// + public class PriceList + { + public static Product GetItem(int ID) + { + switch (ID) + { + case 1: + return new Product(ID, "Sample Product 1", "Sample Description 1", (decimal)14.99); + + case 2: + return new Product(ID, "Sample Product 2", "Sample Description 2", (decimal)14.99); + + case 3: + return new Product(ID, "Sample Product 3", "Sample Description 3", (decimal)14.99); + + default: + throw new IndexOutOfRangeException("Not a valid product ID."); + } + + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Program.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/Program.cs new file mode 100644 index 0000000..b34da4f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DocumentView +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Parent()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..22176a1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DocumentView")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DocumentView")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("acfd0ce5-492a-4ff7-9b60-ccce24c25a86")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Resources.Designer.cs new file mode 100644 index 0000000..35fcd43 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DocumentView.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DocumentView.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DocumentView.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace DocumentView.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DocumentView.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Settings.Designer.cs new file mode 100644 index 0000000..acc50b2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DocumentView.Properties.Settings.get_Default():DocumentView.Properties.Settings")] + +namespace DocumentView.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentView/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentView/bin/Debug/DocumentView.exe b/Pro Windows Forms 2.0/Chapter19/DocumentView/bin/Debug/DocumentView.exe new file mode 100644 index 0000000..6b1857a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter19/DocumentView/bin/Debug/DocumentView.exe differ diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/ApplicationTasks.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/ApplicationTasks.cs new file mode 100644 index 0000000..ee34950 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/ApplicationTasks.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DocumentView +{ + public class ApplicationTasks + { + private string lastDir = "C:\\Temp"; + + public void Open() + { + OpenFileDialog dlgOpen = new OpenFileDialog(); + dlgOpen.InitialDirectory = lastDir; + dlgOpen.Filter = "Order Files (*.ord)|*.ord"; + + // Show the open dialog. + if (dlgOpen.ShowDialog() == DialogResult.OK) + { + Order doc = new Order(); + + try + { + doc.Open(dlgOpen.FileName); + } + catch (Exception err) + { + // All exceptions bubble up to this level. + MessageBox.Show(err.ToString()); + return; + } + + // Create the child form for the selected file. + Child frmChild = new Child(doc, Child.ViewType.ItemGrid); + Program.DocumentManager.AddForm(frmChild); + frmChild.Show(); + } + } + + public void New() + { + // Create a new order. + Order doc = new Order(); + Child frmChild = new Child(doc, Child.ViewType.ItemGrid); + Program.DocumentManager.AddForm(frmChild); + frmChild.Show(); + } + + public void Save() + { + // Save the current order. + if (Program.DocumentManager.ActiveDocumentForm != null) + { + SaveFileDialog dlgSave = new SaveFileDialog(); + Order doc = ((Child)Program.DocumentManager.ActiveDocumentForm).Document; + dlgSave.FileName = doc.LastFileName; + dlgSave.Filter = "Order Files (*.ord)|*.ord"; + + if (dlgSave.ShowDialog() == DialogResult.OK) + { + try + { + doc.Save(dlgSave.FileName); + Program.DocumentManager.ActiveDocumentForm.Text = dlgSave.FileName; + } + catch (Exception err) + { + // All exceptions bubble up to this level. + MessageBox.Show(err.ToString()); + return; + } + } + } + } + + public void Preview() + { + // Launch a print preview child for the active order. + if (Program.DocumentManager.ActiveDocumentForm != null) + { + Order doc = ((Child)Program.DocumentManager.ActiveDocumentForm).Document; + + Child frmChild = new Child(doc, Child.ViewType.PrintPreview); + Program.DocumentManager.AddForm(frmChild); + frmChild.Show(); + } + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Child.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Child.Designer.cs new file mode 100644 index 0000000..4105d56 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Child.Designer.cs @@ -0,0 +1,177 @@ +namespace DocumentView +{ + partial class Child + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Child)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton3 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton4 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton5 = new System.Windows.Forms.ToolStripButton(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.windowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.imgButtons = new System.Windows.Forms.ImageList(this.components); + this.toolStrip1.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton1, + this.toolStripButton2, + this.toolStripButton3, + this.toolStripButton4, + this.toolStripSeparator1, + this.toolStripButton5}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(473, 36); + this.toolStrip1.TabIndex = 3; + this.toolStrip1.Text = "toolStrip1"; + // + // toolStripButton1 + // + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(32, 33); + this.toolStripButton1.Text = "New"; + this.toolStripButton1.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click); + // + // toolStripButton2 + // + this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); + this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton2.Name = "toolStripButton2"; + this.toolStripButton2.Size = new System.Drawing.Size(37, 33); + this.toolStripButton2.Text = "Open"; + this.toolStripButton2.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton2.Click += new System.EventHandler(this.toolStripButton2_Click); + // + // toolStripButton3 + // + this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image"))); + this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton3.Name = "toolStripButton3"; + this.toolStripButton3.Size = new System.Drawing.Size(37, 33); + this.toolStripButton3.Text = "Close"; + this.toolStripButton3.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton3.Click += new System.EventHandler(this.toolStripButton3_Click); + // + // toolStripButton4 + // + this.toolStripButton4.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton4.Image"))); + this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton4.Name = "toolStripButton4"; + this.toolStripButton4.Size = new System.Drawing.Size(35, 33); + this.toolStripButton4.Text = "Save"; + this.toolStripButton4.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton4.Click += new System.EventHandler(this.toolStripButton4_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 36); + // + // toolStripButton5 + // + this.toolStripButton5.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton5.Image"))); + this.toolStripButton5.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton5.Name = "toolStripButton5"; + this.toolStripButton5.Size = new System.Drawing.Size(49, 33); + this.toolStripButton5.Text = "Preview"; + this.toolStripButton5.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton5.Click += new System.EventHandler(this.toolStripButton5_Click); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.windowToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 36); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(473, 24); + this.menuStrip1.TabIndex = 5; + this.menuStrip1.Text = "menuStrip1"; + // + // windowToolStripMenuItem + // + this.windowToolStripMenuItem.Name = "windowToolStripMenuItem"; + this.windowToolStripMenuItem.Size = new System.Drawing.Size(57, 20); + this.windowToolStripMenuItem.Text = "Window"; + this.windowToolStripMenuItem.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.windowToolStripMenuItem_DropDownItemClicked); + // + // imgButtons + // + this.imgButtons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgButtons.ImageStream"))); + this.imgButtons.TransparentColor = System.Drawing.Color.Transparent; + this.imgButtons.Images.SetKeyName(0, ""); + this.imgButtons.Images.SetKeyName(1, ""); + this.imgButtons.Images.SetKeyName(2, ""); + this.imgButtons.Images.SetKeyName(3, ""); + this.imgButtons.Images.SetKeyName(4, ""); + // + // Child + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.AliceBlue; + this.ClientSize = new System.Drawing.Size(473, 345); + this.Controls.Add(this.menuStrip1); + this.Controls.Add(this.toolStrip1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Child"; + this.Text = "Child"; + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.ToolStripButton toolStripButton2; + private System.Windows.Forms.ToolStripButton toolStripButton3; + private System.Windows.Forms.ToolStripButton toolStripButton4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton toolStripButton5; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem windowToolStripMenuItem; + private System.Windows.Forms.ImageList imgButtons; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Child.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Child.cs new file mode 100644 index 0000000..85d1361 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Child.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DocumentView +{ + public partial class Child : Form + { + public Child() + { + InitializeComponent(); + } + public enum ViewType + { + ItemGrid, + PrintPreview + } + + public Order Document; + + public Child(Order doc, ViewType viewType) + { + InitializeComponent(); + + toolStrip1.Items[0].Image = imgButtons.Images[0]; + toolStrip1.Items[1].Image = imgButtons.Images[1]; + toolStrip1.Items[2].Image = imgButtons.Images[2]; + toolStrip1.Items[3].Image = imgButtons.Images[3]; + toolStrip1.Items[5].Image = imgButtons.Images[4]; + + // Set up window list. + Program.DocumentManager.WindowListChanged += + new EventHandler(WindowListChanged); + + // Configure the title. + this.Text = doc.LastFileName; + this.Document = doc; + + // Create a reference for the view. + // This reference can accomodate any type of control. + Control view = null; + + // Instantiate the appropriate view. + switch (viewType) + { + case ViewType.ItemGrid: + view = new OrderGridView(doc); + break; + case ViewType.PrintPreview: + view = new OrderPrintPreview(doc); + this.Text += " (Preview)"; + toolStrip1.Visible = false; + menuStrip1.Visible = false; + break; + } + + // Add the view to the form. + view.Dock = DockStyle.Fill; + + this.Controls.Add(view); + view.BringToFront(); + } + + private void toolStripButton1_Click(object sender, EventArgs e) + { + Program.AppTasks.New(); + } + + private void toolStripButton2_Click(object sender, EventArgs e) + { + Program.AppTasks.Open(); + } + + private void toolStripButton3_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void toolStripButton4_Click(object sender, EventArgs e) + { + Program.AppTasks.Save(); + } + + private void toolStripButton5_Click(object sender, EventArgs e) + { + Program.AppTasks.Preview(); + } + + public void WindowListChanged(object sender, WindowListChangedEventArgs e) + { + windowToolStripMenuItem.DropDownItems.Clear(); + foreach (KeyValuePair name in e.WindowNames) + { + ToolStripItem menuItem = windowToolStripMenuItem.DropDownItems.Add(name.Value); + menuItem.Tag = name.Key; + } + } + + private void windowToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + // Show the linked form. + ((Form)e.ClickedItem.Tag).Activate(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Child.resx b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Child.resx new file mode 100644 index 0000000..06dc1dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Child.resx @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 333, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + 541, 17 + + + 17, 54 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA6 + DAAAAk1TRnQBSQFMAgEBBQEAAQkBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/w0AAsg9AAHIAf4B0wEE + NQABbQQSARMBDwH+AdMBBAISNAABbQS8AcgB/gHTAQQBkgG8ARI0AAFtA/8ByAH+AdMBBAGSAfIBvAES + NAABbQLyAcgC0wEEAW0BkgH/AbwBEjIAAW0BEwEPARABkgH/AW0BBAGSAvIB/wG8ARIxAAFtAeIBBwLi + ARABkgEEAW0DkgH/AbwBEjAAAW0B4gH/AQcB4gKSAQ8BkgTyAf8BvAESMAABbQHiAfQBBwHiAt8BDwFt + BJIB/wG8ARIwAAFtAeIB/wEHAeICkgEPAZIF8gG8ARIwAAFtAeIB9AEHAeIC3wEPAW0CkgH/AfICvAES + MQABbQHiAQcC4gEPAZIBvALyAf8CEgITMgACbQEPARABkgG8AfID/wGSAf8BvAFtNAABbQLyBf8BkgG8 + ARI1AAltARJtAAMBAgcTAAH/HQAB/wgAAgEB/wIBAQcTAAH7AQAB+wwAAgMGAAK8AQABAwMAAfsBAAH7 + BQADAQH/AwEGAAH/AfsLAAH/AQAB/wEHAfsKAAIDBgACvAEAAQMDAAH/AQAB/wEHAfsDAAEBBf8BAQQA + Af8BAAH7Af8B+wH/CQAB+wEAAfsBBwH/AQcB+wgAAgMGAAK8AQABAwMAAfsBAAH7AQcB/wEHAfsBAAMB + Af8DAQMAAfsCAAH/AfsB/wH7Af8B+wcAAf8BAAL/AfsBBwH/AQcB+wYAAgMJAAEDAwAB/wEAAv8B+wEH + Af8BBwH7AgEB/wIBAwAB/wEAAf8BAAH7Af8B+wH/AfsB/wH7Af8FAAH7AQAB+wL/AQcB+wEHAf8GAAwD + AwAB+wEAAfsC/wEHAfsBBwH/AQADAQMAAfsBAAL/AQAB/wH7Af8B+wH/AfsB/wH7Af8EAAH/AQAC/wH7 + AQcB/wEHAfsGAAIDCAACAwMAAf8BAAL/AfsBBwH/AQcB+wgAA/8CAAH/AfsB/wH7Af8B+wH/AfsEAAH7 + AQAB+wP/AfsBBwH/BgABAwEACLwBAAEDAwAB+wEAAfsD/wH7AQcB/woAA/8CAAH7Af8B+wH/AfsB/wQA + Af8BAAL/AfsC/wEHAfsGAAEDAQAIvAEAAQMDAAH/AQAC/wH7Av8BBwH7CAAB+wH/AgAC/wEAAf8B+wH/ + AfsB/wH7BAAB+wH/AgAC/wH7AQcB/wYAAQMBAAi8AQABAwMAAfsB/wIAAv8B+wEHAf8JAAH7Af8B+wEA + Av8CAAH7Af8B+wH/BQAB+wH/AfsCAAH/AQcB+wYAAQMBAAi8AQABAwQAAfsB/wH7AgAB/wEHAfsLAAH/ + AfsBAAL/AwAB/wH7BwAB/wH7Af8CAAH/BgABAwEACLwIAAH/AfsB/wIAAf8QAAH/AfsKAAH7Af8B+wH/ + AfsHAAEDAQAIvAEAAbwGAAH7Af8B+wH/AfseAAH7Af8cAAH7Af9JAAFCAU0BPgcAAT4DAAEoAwABQAMA + ASADAAEBAQABAQYAAQEWAAP/AQAB/wHzBgAB/wHhBgAB8AcAAfAHAAHwBwAB8AcAAcAHAAGAJwABgAcA + AcAHAAHwAQEGAAHwAQMGAAL/AecD/wGfAeAC/wHDAf8BwAEBAQ8BwAH4Af8BwAH/AYABAQEDAYAB8AE/ + AcABPwGAAQEBAAGAAeABDwHAAQ8BgAEBAgABwAEDAcABBwGAAQEBAAEBAYABAAHAAQcBgAEBAQABAwIA + AcABBwGAAQEBAAEfAgABwAEHAYABAQEAAR8BgAEAAcABBwGAAQEBAAEfAYABAAHAAQcBgAEBAQABHwHA + AQABwAEHAYABAQEAAR8B4AEAAfABBwGAAQEBwAEfAfkBAAH4AQcBgAEBAeABHwH/Ac8B+AEHAYABAQHg + AR8C/wH+AX8C/wH5Af8L + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Document.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Document.cs new file mode 100644 index 0000000..06259ae --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Document.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections; +using System.IO; + +namespace DocumentView +{ + public class OrderItem + { + private int id; + public int ID + { + get { return id; } + set { id = value; } + } + + public OrderItem(int id) + { + ID = id; + } + } + + public class Order : CollectionBase + { + public event EventHandler DocumentChanged; + + private string lastFilename = "[New Order]"; + public string LastFileName + { + get + { + return lastFilename; + } + set + { + lastFilename = value; + } + } + + public void Add(OrderItem item) + { + base.List.Add(item); + OnDocumentChanged(new EventArgs()); + } + + public void Remove(int index) + { + // Check to see if there is an item at the supplied index. + if (index > (this.Count - 1) || index < 0) + { + throw new System.IndexOutOfRangeException(); + } + else + { + base.List.RemoveAt(index); + } + OnDocumentChanged(new EventArgs()); + } + + // Indexer. + public OrderItem this[int index] + { + get { return (OrderItem)base.List[index]; } + set { base.List[index] = value; } + } + + protected void OnDocumentChanged(System.EventArgs e) + { + // Note that this currently occurs as items are added or removed, + // but not when they are edited. To overcome this would require adding + // an additional OrderItem change event. + + // Raise the DocumentChanged event. + if (DocumentChanged != null) + { + DocumentChanged(this, e); + } + } + + + public void Open(string filename) + { + using (FileStream fs = new FileStream(filename, FileMode.Open)) + { + StreamReader r = new StreamReader(fs); + + do + { + this.Add(new OrderItem(int.Parse(r.ReadLine()))); + } while (r.Peek() != -1); + + r.Close(); + } + + // By placing this last we ensure that the file will not be updated + // if a load error occurs. + this.LastFileName = filename; + } + + public void Save(string filename) + { + using (FileStream fs = new FileStream(filename, FileMode.Create)) + { + StreamWriter w = new StreamWriter(fs); + + foreach (OrderItem item in this.List) + { + w.WriteLine(item.ID); + } + + w.Close(); + } + + // Note: a real pricing program would probably store the price in the file + // (required for orders) but update it to correspond with the current + // price for the item when the file is opened. + + // By placing this last we ensure that the file will not be updated + // if a save error occurs. + this.LastFileName = filename; + } + + } + + + public class Product + { + private int id; + public int ID + { + get { return id; } + set { id = value; } + } + + private string name; + public string Name + { + get { return name; } + set { name = value; } + } + + private string description; + public string Description + { + get { return description; } + set { description = value; } + } + + private decimal price; + public decimal Price + { + get { return price; } + set { price = value; } + } + + public Product(int id, string name, string description, decimal price) + { + ID = id; + Name = name; + Description = description; + Price = price; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentManager.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentManager.cs new file mode 100644 index 0000000..e646e00 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentManager.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +namespace DocumentView +{ + public class DocumentManager + { + private Dictionary documents = + new Dictionary(); + public Dictionary Documents + { + get { return documents; } + } + + // Track the form that has focus. + private Form activeDocumentForm; + public Form ActiveDocumentForm + { + get { return activeDocumentForm; } + } + + public void AddForm(Form form) + { + if (!documents.ContainsKey(form)) + { + documents.Add(form, form.Text); + + // Watch for activation and close events. + form.Activated += new EventHandler(Form_Activated); + form.Closed += new EventHandler(Form_Closed); + + form.TextChanged += new EventHandler(Form_TextChanged); + OnWindowListChanged(); + } + } + + // Provide an automatic shut-down feature when + // last document is closed, if desired. + private bool quitWhenLastDocumentClosed = true; + public bool QuitWhenLastDocumentClosed + { + get { return quitWhenLastDocumentClosed; } + set { quitWhenLastDocumentClosed = value; } + } + + private void Form_Closed(object sender, EventArgs e) + { + Form form = (Form)sender; + documents.Remove(form); + + if (documents.Count == 0 && quitWhenLastDocumentClosed) + { + Application.Exit(); + } + OnWindowListChanged(); + } + + private void Form_Activated(object sender, EventArgs e) + { + activeDocumentForm = (Form)sender; + } + + private void Form_TextChanged(object sender, EventArgs e) + { + Form form = (Form)sender; + documents[form] = form.Text; + OnWindowListChanged(); + } + + public event EventHandler WindowListChanged; + public void OnWindowListChanged() + { + if (WindowListChanged != null) + { + WindowListChanged(this, + new WindowListChangedEventArgs(documents)); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.csproj b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.csproj new file mode 100644 index 0000000..1f7fd40 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.csproj @@ -0,0 +1,94 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {1225E391-460B-43D7-BFEF-0105CB81CE7C} + WinExe + Properties + DocumentView + DocumentView + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Child.cs + + + + + UserControl + + + OrderGridView.cs + + + UserControl + + + OrderPrintPreview.cs + + + + + + + + Child.cs + + + OrderGridView.cs + + + OrderPrintPreview.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.csproj.user b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.sln b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.sln new file mode 100644 index 0000000..f01d6fd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocumentView", "DocumentView.csproj", "{1225E391-460B-43D7-BFEF-0105CB81CE7C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1225E391-460B-43D7-BFEF-0105CB81CE7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1225E391-460B-43D7-BFEF-0105CB81CE7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1225E391-460B-43D7-BFEF-0105CB81CE7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1225E391-460B-43D7-BFEF-0105CB81CE7C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.suo b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.suo new file mode 100644 index 0000000..224c41e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/DocumentView.suo differ diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderGridView.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderGridView.Designer.cs new file mode 100644 index 0000000..d120602 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderGridView.Designer.cs @@ -0,0 +1,123 @@ +namespace DocumentView +{ + partial class OrderGridView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdRemove = new System.Windows.Forms.Button(); + this.cmdAdd = new System.Windows.Forms.Button(); + this.list = new System.Windows.Forms.ListView(); + this.ColumnHeader1 = new System.Windows.Forms.ColumnHeader(); + this.ColumnHeader2 = new System.Windows.Forms.ColumnHeader(); + this.ColumnHeader3 = new System.Windows.Forms.ColumnHeader(); + this.ColumnHeader4 = new System.Windows.Forms.ColumnHeader(); + this.SuspendLayout(); + // + // cmdRemove + // + this.cmdRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdRemove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdRemove.Location = new System.Drawing.Point(280, 37); + this.cmdRemove.Name = "cmdRemove"; + this.cmdRemove.Size = new System.Drawing.Size(112, 28); + this.cmdRemove.TabIndex = 8; + this.cmdRemove.Text = "Remove Item"; + this.cmdRemove.Click += new System.EventHandler(this.cmdRemove_Click); + // + // cmdAdd + // + this.cmdAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdAdd.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAdd.Location = new System.Drawing.Point(280, 5); + this.cmdAdd.Name = "cmdAdd"; + this.cmdAdd.Size = new System.Drawing.Size(112, 28); + this.cmdAdd.TabIndex = 7; + this.cmdAdd.Text = "Add Random Item"; + this.cmdAdd.Click += new System.EventHandler(this.cmdAdd_Click); + // + // list + // + this.list.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.list.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.ColumnHeader1, + this.ColumnHeader2, + this.ColumnHeader3, + this.ColumnHeader4}); + this.list.FullRowSelect = true; + this.list.Location = new System.Drawing.Point(4, 5); + this.list.MultiSelect = false; + this.list.Name = "list"; + this.list.Size = new System.Drawing.Size(264, 136); + this.list.TabIndex = 6; + this.list.View = System.Windows.Forms.View.Details; + // + // ColumnHeader1 + // + this.ColumnHeader1.Text = "ID"; + this.ColumnHeader1.Width = 30; + // + // ColumnHeader2 + // + this.ColumnHeader2.Text = "Name"; + this.ColumnHeader2.Width = 100; + // + // ColumnHeader3 + // + this.ColumnHeader3.Text = "Price"; + this.ColumnHeader3.Width = 50; + // + // ColumnHeader4 + // + this.ColumnHeader4.Text = "Description"; + this.ColumnHeader4.Width = 200; + // + // OrderGridView + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.cmdRemove); + this.Controls.Add(this.cmdAdd); + this.Controls.Add(this.list); + this.Name = "OrderGridView"; + this.Size = new System.Drawing.Size(397, 146); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button cmdRemove; + private System.Windows.Forms.Button cmdAdd; + private System.Windows.Forms.ListView list; + private System.Windows.Forms.ColumnHeader ColumnHeader1; + private System.Windows.Forms.ColumnHeader ColumnHeader2; + private System.Windows.Forms.ColumnHeader ColumnHeader3; + private System.Windows.Forms.ColumnHeader ColumnHeader4; + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderGridView.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderGridView.cs new file mode 100644 index 0000000..eb8fcdd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderGridView.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; + +namespace DocumentView +{ + public partial class OrderGridView : UserControl + { + public OrderGridView() + { + InitializeComponent(); + } + + private Order document; + public Order Document + { + set + { + // Store a reference to the document, attach the event handler, + // and refresh the display. + document = value; + document.DocumentChanged += new EventHandler(RefreshList); + RefreshList(); + } + get { return document; } + } + + + public OrderGridView(Order document) + : this() + { + // Store a reference to the document, attach the event handler, + // and refresh the display. + Document = document; + } + + private void RefreshList(object sender, System.EventArgs e) + { + RefreshList(); + } + + private void RefreshList() + { + // Update the ListView control with the new document contents. + if (list != null) + { + // For best performance, disable refreshes while updating the list. + list.SuspendLayout(); + + list.Items.Clear(); + + // Step through the list of items in the document. + Product itemProduct; + ListViewItem itemDisplay; + foreach (OrderItem item in this.Document) + { + itemDisplay = list.Items.Add(item.ID.ToString()); + itemProduct = PriceList.GetItem(item.ID); + itemDisplay.SubItems.Add(itemProduct.Name); + itemDisplay.SubItems.Add(itemProduct.Price.ToString()); + itemDisplay.SubItems.Add(itemProduct.Description); + } + + list.ResumeLayout(); + } + } + + // Triggered when the Add button is clicked. + private void cmdAdd_Click(object sender, System.EventArgs e) + { + // Add a random item. + Random randomItem = new Random(); + Document.Add(new OrderItem(randomItem.Next(1, 4))); + } + + // Triggered when the Remove button is clicked. + private void cmdRemove_Click(object sender, System.EventArgs e) + { + // Remove the current item. + // The ListView Is configured for single-selection only. + if (list.SelectedIndices.Count == 1) + Document.Remove(list.SelectedIndices[0]); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderGridView.resx b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderGridView.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderGridView.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderPrintPreview.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderPrintPreview.Designer.cs new file mode 100644 index 0000000..cc4831e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderPrintPreview.Designer.cs @@ -0,0 +1,61 @@ +namespace DocumentView +{ + partial class OrderPrintPreview + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Preview = new System.Windows.Forms.PrintPreviewControl(); + this.SuspendLayout(); + // + // Preview + // + this.Preview.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.Preview.AutoZoom = false; + this.Preview.Location = new System.Drawing.Point(4, 4); + this.Preview.Name = "Preview"; + this.Preview.Size = new System.Drawing.Size(401, 204); + this.Preview.TabIndex = 2; + this.Preview.Zoom = 1; + // + // OrderPrintPreview + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.Preview); + this.Name = "OrderPrintPreview"; + this.Size = new System.Drawing.Size(408, 212); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PrintPreviewControl Preview; + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderPrintPreview.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderPrintPreview.cs new file mode 100644 index 0000000..9bbbec2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderPrintPreview.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Printing; + +namespace DocumentView +{ + public partial class OrderPrintPreview : UserControl + { + public OrderPrintPreview() + { + InitializeComponent(); + } + + private Order document; + public Order Document + { + set + { + // Store a reference to the document, attach the event handler, + // and refresh the display. + document = value; + document.DocumentChanged += new EventHandler(RefreshList); + printDoc.PrintPage += new PrintPageEventHandler(PrintDoc); + RefreshList(); + } + get { return document; } + } + + private PrintDocument printDoc = new PrintDocument(); + + public OrderPrintPreview(Order document) + : this() + { + // Store a reference to the document, attach the document event handlers, + // and refresh the display. + Document = document; + + } + + private void RefreshList(object sender, System.EventArgs e) + { + RefreshList(); + } + + private void RefreshList() + { + Preview.Document = printDoc; + Preview.InvalidatePreview(); + } + + // Tracks placement while printing. + private int itemNumber; + + // The print font. + private Font printFont = new Font("Tahoma", 14, FontStyle.Bold); + + private void PrintDoc(object sender, + System.Drawing.Printing.PrintPageEventArgs e) + { + + // Tracks the line position on the page. + int y = 70; + + // Step through the items and write them to the page. + OrderItem item; + Product itemProduct; + + for (itemNumber = 0; itemNumber < Document.Count; itemNumber++) + { + item = Document[itemNumber]; + e.Graphics.DrawString(item.ID.ToString(), printFont, + Brushes.Black, 70, y); + itemProduct = PriceList.GetItem(item.ID); + e.Graphics.DrawString(itemProduct.Name, printFont, + Brushes.Black, 120, y); + e.Graphics.DrawString(itemProduct.Price.ToString(), printFont, + Brushes.Black, 350, y); + + // Check if more pages are required. + if ((y + 30) > e.MarginBounds.Height && + itemNumber < (Document.Count - 1)) + { + e.HasMorePages = true; + return; + } + + // Move to the next line. + y += 20; + } + + // Printing is finished. + e.HasMorePages = false; + itemNumber = 0; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderPrintPreview.resx b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderPrintPreview.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/OrderPrintPreview.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/PriceList.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/PriceList.cs new file mode 100644 index 0000000..4c998a0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/PriceList.cs @@ -0,0 +1,30 @@ +using System; + +namespace DocumentView +{ + /// + /// Summary description for PriceList. + /// + public class PriceList + { + public static Product GetItem(int ID) + { + switch (ID) + { + case 1: + return new Product(ID, "Sample Product 1", "Sample Description 1", (decimal)14.99); + + case 2: + return new Product(ID, "Sample Product 2", "Sample Description 2", (decimal)14.99); + + case 3: + return new Product(ID, "Sample Product 3", "Sample Description 3", (decimal)14.99); + + default: + throw new IndexOutOfRangeException("Not a valid product ID."); + } + + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Program.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Program.cs new file mode 100644 index 0000000..8c19bd1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Program.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DocumentView +{ + static class Program + { + private static ApplicationTasks appTasks = new ApplicationTasks(); + public static ApplicationTasks AppTasks + { + get { return appTasks; } + } + + private static DocumentManager documentManager = new DocumentManager(); + public static DocumentManager DocumentManager + { + get { return documentManager; } + } + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + + // Start with one document. + AppTasks.New(); + + Application.Run(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..22176a1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DocumentView")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DocumentView")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("acfd0ce5-492a-4ff7-9b60-ccce24c25a86")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Resources.Designer.cs new file mode 100644 index 0000000..35fcd43 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DocumentView.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DocumentView.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DocumentView.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace DocumentView.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DocumentView.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Settings.Designer.cs new file mode 100644 index 0000000..acc50b2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DocumentView.Properties.Settings.get_Default():DocumentView.Properties.Settings")] + +namespace DocumentView.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/WindowListChangedEventArgs.cs b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/WindowListChangedEventArgs.cs new file mode 100644 index 0000000..8ddab7f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/WindowListChangedEventArgs.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +namespace DocumentView +{ + public class WindowListChangedEventArgs : EventArgs + { + private Dictionary windowNames; + public Dictionary WindowNames + { + get { return windowNames; } + } + + public WindowListChangedEventArgs(Dictionary windowNames) + { + this.windowNames = windowNames; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/bin/Debug/DocumentView.exe b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/bin/Debug/DocumentView.exe new file mode 100644 index 0000000..36714a8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter19/DocumentViewMFI/bin/Debug/DocumentView.exe differ diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Child.Designer.cs b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Child.Designer.cs new file mode 100644 index 0000000..8634a69 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Child.Designer.cs @@ -0,0 +1,107 @@ +namespace MdiMenuMerge +{ + partial class Child + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.documentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mergedSubMenuToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.documentsToolStripMenuItem, + this.mergedSubMenuToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(233, 24); + this.menuStrip1.TabIndex = 0; + this.menuStrip1.Text = "menuStrip1"; + // + // documentsToolStripMenuItem + // + this.documentsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.testToolStripMenuItem}); + this.documentsToolStripMenuItem.MergeAction = System.Windows.Forms.MergeAction.Replace; + this.documentsToolStripMenuItem.MergeIndex = 0; + this.documentsToolStripMenuItem.Name = "documentsToolStripMenuItem"; + this.documentsToolStripMenuItem.Size = new System.Drawing.Size(67, 20); + this.documentsToolStripMenuItem.Text = "Document"; + // + // testToolStripMenuItem + // + this.testToolStripMenuItem.Name = "testToolStripMenuItem"; + this.testToolStripMenuItem.Size = new System.Drawing.Size(223, 22); + this.testToolStripMenuItem.Text = "Child (in a Replace submenu)"; + // + // mergedSubMenuToolStripMenuItem + // + this.mergedSubMenuToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.printToolStripMenuItem}); + this.mergedSubMenuToolStripMenuItem.MergeAction = System.Windows.Forms.MergeAction.MatchOnly; + this.mergedSubMenuToolStripMenuItem.Name = "mergedSubMenuToolStripMenuItem"; + this.mergedSubMenuToolStripMenuItem.Size = new System.Drawing.Size(102, 20); + this.mergedSubMenuToolStripMenuItem.Text = "Merged SubMenu"; + // + // printToolStripMenuItem + // + this.printToolStripMenuItem.MergeAction = System.Windows.Forms.MergeAction.Insert; + this.printToolStripMenuItem.MergeIndex = 3; + this.printToolStripMenuItem.Name = "printToolStripMenuItem"; + this.printToolStripMenuItem.Size = new System.Drawing.Size(188, 22); + this.printToolStripMenuItem.Text = "Print (Merge Index 3)"; + // + // Child + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(233, 104); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.Name = "Child"; + this.Text = "Child"; + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem documentsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem testToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mergedSubMenuToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem printToolStripMenuItem; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Child.cs b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Child.cs new file mode 100644 index 0000000..8662efe --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Child.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MdiMenuMerge +{ + public partial class Child : Form + { + public Child() + { + InitializeComponent(); + } + + public void SetNoMerge() + { + menuStrip1.AllowMerge = false; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Child.resx b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Child.resx new file mode 100644 index 0000000..541af56 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Child.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.csproj b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.csproj new file mode 100644 index 0000000..b7d756f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.csproj @@ -0,0 +1,79 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {4F50E5F0-9709-44C3-A668-5D86A66D4327} + WinExe + Properties + MdiMenuMerge + MdiMenuMerge + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Child.cs + + + Form + + + Parent.cs + + + + + Child.cs + + + Parent.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.csproj.user b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.sln b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.sln new file mode 100644 index 0000000..f6577cc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MdiMenuMerge", "MdiMenuMerge.csproj", "{4F50E5F0-9709-44C3-A668-5D86A66D4327}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4F50E5F0-9709-44C3-A668-5D86A66D4327}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4F50E5F0-9709-44C3-A668-5D86A66D4327}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F50E5F0-9709-44C3-A668-5D86A66D4327}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F50E5F0-9709-44C3-A668-5D86A66D4327}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.suo b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.suo new file mode 100644 index 0000000..38183e2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/MdiMenuMerge.suo differ diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Parent.Designer.cs b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Parent.Designer.cs new file mode 100644 index 0000000..012200e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Parent.Designer.cs @@ -0,0 +1,157 @@ +namespace MdiMenuMerge +{ + partial class Parent + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.noMergeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mergeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.documentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.parentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mergedSubMenuToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.quitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.documentToolStripMenuItem, + this.mergedSubMenuToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(292, 24); + this.menuStrip1.TabIndex = 1; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.noMergeToolStripMenuItem, + this.mergeToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Text = "File"; + // + // noMergeToolStripMenuItem + // + this.noMergeToolStripMenuItem.Name = "noMergeToolStripMenuItem"; + this.noMergeToolStripMenuItem.Text = "Show Without Merging"; + this.noMergeToolStripMenuItem.Click += new System.EventHandler(this.noMergeToolStripMenuItem_Click); + // + // mergeToolStripMenuItem + // + this.mergeToolStripMenuItem.Name = "mergeToolStripMenuItem"; + this.mergeToolStripMenuItem.Text = "Show With Merging"; + this.mergeToolStripMenuItem.Click += new System.EventHandler(this.mergeToolStripMenuItem_Click); + // + // documentToolStripMenuItem + // + this.documentToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.parentToolStripMenuItem}); + this.documentToolStripMenuItem.Name = "documentToolStripMenuItem"; + this.documentToolStripMenuItem.Text = "Document"; + // + // parentToolStripMenuItem + // + this.parentToolStripMenuItem.Name = "parentToolStripMenuItem"; + this.parentToolStripMenuItem.Text = "Parent"; + // + // mergedSubMenuToolStripMenuItem + // + this.mergedSubMenuToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.openToolStripMenuItem, + this.saveToolStripMenuItem, + this.toolStripSeparator1, + this.quitToolStripMenuItem}); + this.mergedSubMenuToolStripMenuItem.Name = "mergedSubMenuToolStripMenuItem"; + this.mergedSubMenuToolStripMenuItem.Text = "Merged SubMenu"; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.Text = "New"; + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.Text = "Open"; + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.Text = "Save"; + // + // quitToolStripMenuItem + // + this.quitToolStripMenuItem.Name = "quitToolStripMenuItem"; + this.quitToolStripMenuItem.Text = "Quit"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // Parent + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.menuStrip1); + this.IsMdiContainer = true; + this.MainMenuStrip = this.menuStrip1; + this.Name = "Parent"; + this.Text = "Parent"; + this.menuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem noMergeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mergeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem documentToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem parentToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mergedSubMenuToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem quitToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Parent.cs b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Parent.cs new file mode 100644 index 0000000..126ccfa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Parent.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MdiMenuMerge +{ + public partial class Parent : Form + { + public Parent() + { + InitializeComponent(); + } + + private void noMergeToolStripMenuItem_Click(object sender, EventArgs e) + { + Child child = new Child(); + child.MdiParent = this; + child.SetNoMerge(); + child.Show(); + } + + private void mergeToolStripMenuItem_Click(object sender, EventArgs e) + { + Child child = new Child(); + child.MdiParent = this; + child.Show(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Parent.resx b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Parent.resx new file mode 100644 index 0000000..669710a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Parent.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Program.cs b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Program.cs new file mode 100644 index 0000000..1e41d14 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace MdiMenuMerge +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Parent()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d6e5246 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MdiMenuMerge")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MdiMenuMerge")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6be4f1eb-bd9e-47ea-b3e6-66a6f4422490")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Resources.Designer.cs new file mode 100644 index 0000000..e4e822b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "MdiMenuMerge.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "MdiMenuMerge.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "MdiMenuMerge.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace MdiMenuMerge.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MdiMenuMerge.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Settings.Designer.cs new file mode 100644 index 0000000..0bc1703 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "MdiMenuMerge.Properties.Settings.get_Default():MdiMenuMerge.Properties.Settings")] + +namespace MdiMenuMerge.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/bin/Debug/MdiMenuMerge.exe b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/bin/Debug/MdiMenuMerge.exe new file mode 100644 index 0000000..b6e14b1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter19/MDIMenuMerge/bin/Debug/MdiMenuMerge.exe differ diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Child.Designer.cs b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Child.Designer.cs new file mode 100644 index 0000000..43dbe4c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Child.Designer.cs @@ -0,0 +1,64 @@ +namespace MdiSynchronized +{ + partial class Child + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.Location = new System.Drawing.Point(11, 11); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(269, 144); + this.textBox1.TabIndex = 2; + this.textBox1.TextChanged += new System.EventHandler(this.TextBox1_TextChanged); + // + // Child + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(293, 168); + this.Controls.Add(this.textBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Child"; + this.Text = "Child"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Child.cs b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Child.cs new file mode 100644 index 0000000..afae7b9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Child.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MdiSynchronized +{ + public partial class Child : Form + { + public Child() + { + InitializeComponent(); + } + + private bool isUpdating; + + private void TextBox1_TextChanged(object sender, System.EventArgs e) + { + if (this.MdiParent != null && !isUpdating) + { + // The reference to the MDI parent must be converted to the appropriate + // form class in order to access the custom RefreshChildren() method. + ((Parent)this.MdiParent).RefreshChildren(this, textBox1.Text); + } + + } + public void RefreshText(string text) + { + // Disable the event to prevent an endless string of updates. + isUpdating = true; + + // Update the control. + textBox1.Text = text; + + // Re-enable the event handler. + isUpdating = false; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Child.resx b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Child.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Child.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.csproj b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.csproj new file mode 100644 index 0000000..762131c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.csproj @@ -0,0 +1,79 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {84E9473C-4D81-4BBE-A847-FD0E3C4A0FAB} + WinExe + Properties + MdiSynchronized + MdiSynchronized + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Child.cs + + + Form + + + Parent.cs + + + + + Child.cs + + + Parent.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.csproj.user b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.sln b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.sln new file mode 100644 index 0000000..0f600c9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MdiSynchronized", "MdiSynchronized.csproj", "{84E9473C-4D81-4BBE-A847-FD0E3C4A0FAB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {84E9473C-4D81-4BBE-A847-FD0E3C4A0FAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84E9473C-4D81-4BBE-A847-FD0E3C4A0FAB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84E9473C-4D81-4BBE-A847-FD0E3C4A0FAB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84E9473C-4D81-4BBE-A847-FD0E3C4A0FAB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.suo b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.suo new file mode 100644 index 0000000..3ce4afc Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/MdiSynchronized.suo differ diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Parent.Designer.cs b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Parent.Designer.cs new file mode 100644 index 0000000..c9d48bd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Parent.Designer.cs @@ -0,0 +1,217 @@ +namespace MdiSynchronized +{ + partial class Parent + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Parent)); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.windowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tileHorizontalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tileVerticalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.cascadeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.minimizeAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStrip1.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton}); + this.toolStrip1.Location = new System.Drawing.Point(0, 24); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(412, 25); + this.toolStrip1.TabIndex = 1; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Text = "&New"; + this.newToolStripButton.Click += new System.EventHandler(this.cmdNew); + // + // openToolStripButton + // + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Text = "&Close"; + this.openToolStripButton.Click += new System.EventHandler(this.cmdClose); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.helpToolStripMenuItem, + this.windowToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.MdiWindowListItem = this.windowToolStripMenuItem; + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(412, 24); + this.menuStrip1.TabIndex = 2; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.closeToolStripMenuItem, + this.toolStripSeparator1, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Text = "File"; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.Text = "New"; + this.newToolStripMenuItem.Click += new System.EventHandler(this.cmdNew); + // + // closeToolStripMenuItem + // + this.closeToolStripMenuItem.Name = "closeToolStripMenuItem"; + this.closeToolStripMenuItem.Text = "Close"; + this.closeToolStripMenuItem.Click += new System.EventHandler(this.cmdClose); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Text = "Exit"; + this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.aboutToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Text = "Help"; + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Text = "About"; + // + // windowToolStripMenuItem + // + this.windowToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tileHorizontalToolStripMenuItem, + this.tileVerticalToolStripMenuItem, + this.cascadeToolStripMenuItem, + this.minimizeAllToolStripMenuItem, + this.toolStripSeparator2}); + this.windowToolStripMenuItem.Name = "windowToolStripMenuItem"; + this.windowToolStripMenuItem.Text = "Window"; + this.windowToolStripMenuItem.DropDownClosed += new System.EventHandler(this.windowToolStripMenuItem_DropDownClosed); + this.windowToolStripMenuItem.DropDownOpening += new System.EventHandler(this.windowToolStripMenuItem_DropDownOpening); + // + // tileHorizontalToolStripMenuItem + // + this.tileHorizontalToolStripMenuItem.Name = "tileHorizontalToolStripMenuItem"; + this.tileHorizontalToolStripMenuItem.Text = "Tile Horizontal"; + this.tileHorizontalToolStripMenuItem.Click += new System.EventHandler(this.mnuTileH_Click); + // + // tileVerticalToolStripMenuItem + // + this.tileVerticalToolStripMenuItem.Name = "tileVerticalToolStripMenuItem"; + this.tileVerticalToolStripMenuItem.Text = "Tile Vertical"; + this.tileVerticalToolStripMenuItem.Click += new System.EventHandler(this.mnuTileV_Click); + // + // cascadeToolStripMenuItem + // + this.cascadeToolStripMenuItem.Name = "cascadeToolStripMenuItem"; + this.cascadeToolStripMenuItem.Text = "Cascade"; + this.cascadeToolStripMenuItem.Click += new System.EventHandler(this.mnuCascade_Click); + // + // minimizeAllToolStripMenuItem + // + this.minimizeAllToolStripMenuItem.Name = "minimizeAllToolStripMenuItem"; + this.minimizeAllToolStripMenuItem.Text = "Minimize All"; + this.minimizeAllToolStripMenuItem.Click += new System.EventHandler(this.mnuMinimizeAll_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + // + // Parent + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(412, 339); + this.Controls.Add(this.toolStrip1); + this.Controls.Add(this.menuStrip1); + this.IsMdiContainer = true; + this.MainMenuStrip = this.menuStrip1; + this.Name = "Parent"; + this.Text = "Parent"; + this.toolStrip1.ResumeLayout(false); + this.menuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem windowToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem tileHorizontalToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem tileVerticalToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem cascadeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem minimizeAllToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Parent.cs b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Parent.cs new file mode 100644 index 0000000..53b9fce --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Parent.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MdiSynchronized +{ + public partial class Parent : Form + { + public Parent() + { + InitializeComponent(); + } + + private int mdiIndex = 0; + + private void cmdNew(object sender, EventArgs e) + { + // Show a new child form. + Child frmChild = new Child(); + frmChild.MdiParent = this; + + frmChild.RefreshText(synchronizedText); + mdiIndex++; + frmChild.Text = "MDI Child #" + mdiIndex.ToString(); + + frmChild.Show(); + } + + private void cmdClose(object sender, EventArgs e) + { + // Close the active child. + if (ActiveMdiChild != null) + ActiveMdiChild.Close(); + } + + private void exitToolStripMenuItem_Click(object sender, EventArgs e) + { + Close(); + } + + string synchronizedText; + public void RefreshChildren(Child sender, string text) + { + // Store text for use when creating a child form, or if needed later. + synchronizedText = text; + + // Update children. + foreach (Child frm in this.MdiChildren) + { + if (frm != sender) + { + frm.RefreshText(text); + } + } + } + + + + private void mnuMinimizeAll_Click(object sender, System.EventArgs e) + { + foreach (Form frm in this.MdiChildren) + { + frm.WindowState = FormWindowState.Minimized; + } + + } + + private void mnuTileH_Click(object sender, System.EventArgs e) + { + this.LayoutMdi(MdiLayout.TileHorizontal); + } + + private void mnuTileV_Click(object sender, System.EventArgs e) + { + this.LayoutMdi(MdiLayout.TileVertical); + } + + private void mnuCascade_Click(object sender, System.EventArgs e) + { + this.LayoutMdi(MdiLayout.Cascade); + } + + private void windowToolStripMenuItem_DropDownOpening(object sender, EventArgs e) + { + if (this.MdiChildren.Length == 0) + { + // There are no children. + // The last item in the menu must be a separator. + // Hide it. + int lastItem = windowToolStripMenuItem.DropDown.Items.Count - 1; + windowToolStripMenuItem.DropDown.Items[lastItem].Visible = false; + } + } + + private void windowToolStripMenuItem_DropDownClosed(object sender, EventArgs e) + { + if (this.MdiChildren.Length == 0) + { + int lastItem = windowToolStripMenuItem.DropDown.Items.Count - 1; + windowToolStripMenuItem.DropDown.Items[lastItem].Visible = true; + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Parent.resx b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Parent.resx new file mode 100644 index 0000000..d419ebc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Parent.resx @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + 116, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Program.cs b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Program.cs new file mode 100644 index 0000000..9d41b75 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace MdiSynchronized +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Parent()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b753dc7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MdiSynchronized")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MdiSynchronized")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("1df44121-bc3c-43bb-a6b0-24547be7a594")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Resources.Designer.cs new file mode 100644 index 0000000..a60a58b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "MdiSynchronized.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "MdiSynchronized.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "MdiSynchronized.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace MdiSynchronized.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MdiSynchronized.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Settings.Designer.cs new file mode 100644 index 0000000..48effd9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "MdiSynchronized.Properties.Settings.get_Default():MdiSynchronized.Properties.Settings")] + +namespace MdiSynchronized.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter19/MDISynchronized/bin/Debug/MdiSynchronized.exe b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/bin/Debug/MdiSynchronized.exe new file mode 100644 index 0000000..8fe61c3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter19/MDISynchronized/bin/Debug/MdiSynchronized.exe differ diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTest.Designer.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTest.Designer.cs new file mode 100644 index 0000000..c4b6121 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTest.Designer.cs @@ -0,0 +1,174 @@ +namespace MultithreadingClient +{ + partial class AsyncTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.lblTimeTaken = new System.Windows.Forms.Label(); + this.txtResults = new System.Windows.Forms.TextBox(); + this.Label4 = new System.Windows.Forms.Label(); + this.cmdFind = new System.Windows.Forms.Button(); + this.Label3 = new System.Windows.Forms.Label(); + this.txtTo = new System.Windows.Forms.TextBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtFrom = new System.Windows.Forms.TextBox(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); +// +// GroupBox1 +// + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.lblTimeTaken); + this.GroupBox1.Controls.Add(this.txtResults); + this.GroupBox1.Controls.Add(this.Label4); + this.GroupBox1.Controls.Add(this.cmdFind); + this.GroupBox1.Controls.Add(this.Label3); + this.GroupBox1.Controls.Add(this.txtTo); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.txtFrom); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(9, 11); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(487, 315); + this.GroupBox1.TabIndex = 1; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Find Prime Numbers"; +// +// lblTimeTaken +// + this.lblTimeTaken.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblTimeTaken.Location = new System.Drawing.Point(80, 279); + this.lblTimeTaken.Name = "lblTimeTaken"; + this.lblTimeTaken.Size = new System.Drawing.Size(395, 20); + this.lblTimeTaken.TabIndex = 8; +// +// txtResults +// + this.txtResults.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtResults.Location = new System.Drawing.Point(80, 108); + this.txtResults.Multiline = true; + this.txtResults.Name = "txtResults"; + this.txtResults.ReadOnly = true; + this.txtResults.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtResults.Size = new System.Drawing.Size(395, 155); + this.txtResults.TabIndex = 7; +// +// Label4 +// + this.Label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.Label4.Location = new System.Drawing.Point(16, 279); + this.Label4.Name = "Label4"; + this.Label4.Size = new System.Drawing.Size(72, 16); + this.Label4.TabIndex = 6; + this.Label4.Text = "Time Taken:"; +// +// cmdFind +// + this.cmdFind.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFind.Location = new System.Drawing.Point(210, 53); + this.cmdFind.Name = "cmdFind"; + this.cmdFind.Size = new System.Drawing.Size(112, 24); + this.cmdFind.TabIndex = 5; + this.cmdFind.Text = "Find Primes"; + this.cmdFind.Click += new System.EventHandler(this.cmdFind_Click); +// +// Label3 +// + this.Label3.Location = new System.Drawing.Point(16, 60); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(52, 20); + this.Label3.TabIndex = 4; + this.Label3.Text = "To:"; +// +// txtTo +// + this.txtTo.Location = new System.Drawing.Point(80, 56); + this.txtTo.Name = "txtTo"; + this.txtTo.TabIndex = 3; + this.txtTo.Text = "500000"; +// +// Label2 +// + this.Label2.Location = new System.Drawing.Point(16, 32); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(52, 20); + this.Label2.TabIndex = 2; + this.Label2.Text = "From:"; +// +// Label1 +// + this.Label1.Location = new System.Drawing.Point(16, 104); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(48, 16); + this.Label1.TabIndex = 1; + this.Label1.Text = "Results:"; +// +// txtFrom +// + this.txtFrom.Location = new System.Drawing.Point(80, 28); + this.txtFrom.Name = "txtFrom"; + this.txtFrom.TabIndex = 0; + this.txtFrom.Text = "1"; +// +// AsyncTest +// + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(508, 338); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MinimumSize = new System.Drawing.Size(354, 254); + this.Name = "AsyncTest"; + this.Text = "Asynchronous Test"; + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.Label lblTimeTaken; + internal System.Windows.Forms.TextBox txtResults; + internal System.Windows.Forms.Label Label4; + internal System.Windows.Forms.Button cmdFind; + internal System.Windows.Forms.Label Label3; + internal System.Windows.Forms.TextBox txtTo; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.TextBox txtFrom; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTest.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTest.cs new file mode 100644 index 0000000..b3363f8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTest.cs @@ -0,0 +1,91 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Windows.Forms; +using System.Text; + +#endregion + +namespace MultithreadingClient +{ + partial class AsyncTest : Form + { + public AsyncTest() + { + InitializeComponent(); + } + + private delegate void CallAsyncWorkerDelegate(int from, int to); + + private void CallAsyncWorker(int from, int to) + { + try + { + // Start the search for primes and wait. + DateTime startTime = DateTime.Now; + int[] primes = MultithreadingWorker.Worker.FindPrimes(from, to); + + // Calculate the time for the call to complete. + TimeSpan timeTaken = DateTime.Now.Subtract(startTime); + + // Paste the list of primes together into one long string. + StringBuilder sb = new StringBuilder(); + foreach (int prime in primes) + { + sb.Append(prime.ToString()); + sb.Append(" "); + } + + // Use the Control.Invoke() method of the current form, + // which is on the same thread as the rest of the controls. + this.Invoke(new UpdateFormDelegate(UpdateForm), + new object[] {timeTaken, sb.ToString()} ); + + } + catch (Exception err) + { + MessageBox.Show(err.Message); + } + } + + private delegate void UpdateFormDelegate(TimeSpan timeTaken, string primeList); + private void UpdateForm(TimeSpan timeTaken, string primeList) + { + lblTimeTaken.Text = timeTaken.TotalSeconds.ToString(); + txtResults.Text = primeList; + + cmdFind.Enabled = true; + } + + private void cmdFind_Click(object sender, EventArgs e) + { + // Disable the button. + cmdFind.Enabled = false; + + txtResults.Text = ""; + lblTimeTaken.Text = ""; + + // Get the search range. + int from, to; + if (!Int32.TryParse(txtFrom.Text, out from)) + { + MessageBox.Show("Invalid From value."); + return; + } + if (!Int32.TryParse(txtTo.Text, out to)) + { + MessageBox.Show("Invalid To value."); + return; + } + + // Start the search for primes on another thread. + CallAsyncWorkerDelegate doWork = new CallAsyncWorkerDelegate(CallAsyncWorker); + doWork.BeginInvoke(from, to, null, null); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTest.resx b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTest.resx new file mode 100644 index 0000000..aa2c502 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTest.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestBackgroundWorker.Designer.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestBackgroundWorker.Designer.cs new file mode 100644 index 0000000..6837d94 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestBackgroundWorker.Designer.cs @@ -0,0 +1,211 @@ +namespace MultithreadingClient +{ + partial class AsyncTestBackgroundWorker + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.cmdCancel = new System.Windows.Forms.Button(); + this.txtResults = new System.Windows.Forms.TextBox(); + this.cmdFind = new System.Windows.Forms.Button(); + this.Label3 = new System.Windows.Forms.Label(); + this.txtTo = new System.Windows.Forms.TextBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtFrom = new System.Windows.Forms.TextBox(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.progressPanel = new System.Windows.Forms.ToolStripProgressBar(); + this.statusPanel = new System.Windows.Forms.ToolStripStatusLabel(); + this.backgroundWorker = new System.ComponentModel.BackgroundWorker(); + this.GroupBox1.SuspendLayout(); + this.statusStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.cmdCancel); + this.GroupBox1.Controls.Add(this.txtResults); + this.GroupBox1.Controls.Add(this.cmdFind); + this.GroupBox1.Controls.Add(this.Label3); + this.GroupBox1.Controls.Add(this.txtTo); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.txtFrom); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(9, 11); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(475, 306); + this.GroupBox1.TabIndex = 1; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Find Prime Numbers"; + // + // cmdCancel + // + this.cmdCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCancel.Location = new System.Drawing.Point(211, 56); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size(112, 24); + this.cmdCancel.TabIndex = 8; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.Click += new System.EventHandler(this.cmdCancel_Click); + // + // txtResults + // + this.txtResults.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtResults.Location = new System.Drawing.Point(80, 116); + this.txtResults.Multiline = true; + this.txtResults.Name = "txtResults"; + this.txtResults.ReadOnly = true; + this.txtResults.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtResults.Size = new System.Drawing.Size(383, 173); + this.txtResults.TabIndex = 7; + // + // cmdFind + // + this.cmdFind.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFind.Location = new System.Drawing.Point(211, 28); + this.cmdFind.Name = "cmdFind"; + this.cmdFind.Size = new System.Drawing.Size(112, 24); + this.cmdFind.TabIndex = 5; + this.cmdFind.Text = "Find Primes"; + this.cmdFind.Click += new System.EventHandler(this.cmdFind_Click); + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(16, 60); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(52, 20); + this.Label3.TabIndex = 4; + this.Label3.Text = "To:"; + // + // txtTo + // + this.txtTo.Location = new System.Drawing.Point(80, 56); + this.txtTo.Name = "txtTo"; + this.txtTo.Size = new System.Drawing.Size(100, 21); + this.txtTo.TabIndex = 3; + this.txtTo.Text = "500000"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 32); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(52, 20); + this.Label2.TabIndex = 2; + this.Label2.Text = "From:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 104); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(48, 16); + this.Label1.TabIndex = 1; + this.Label1.Text = "Results:"; + // + // txtFrom + // + this.txtFrom.Location = new System.Drawing.Point(80, 28); + this.txtFrom.Name = "txtFrom"; + this.txtFrom.Size = new System.Drawing.Size(100, 21); + this.txtFrom.TabIndex = 0; + this.txtFrom.Text = "1"; + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.progressPanel, + this.statusPanel}); + this.statusStrip1.Location = new System.Drawing.Point(0, 329); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Padding = new System.Windows.Forms.Padding(0, 0, 12, 0); + this.statusStrip1.Size = new System.Drawing.Size(496, 22); + this.statusStrip1.TabIndex = 0; + this.statusStrip1.Text = "statusStrip1"; + this.statusStrip1.DoubleClick += new System.EventHandler(this.statusStrip1_DoubleClick); + // + // progressPanel + // + this.progressPanel.Name = "progressPanel"; + this.progressPanel.Size = new System.Drawing.Size(100, 16); + // + // statusPanel + // + this.statusPanel.Name = "statusPanel"; + this.statusPanel.Size = new System.Drawing.Size(351, 17); + this.statusPanel.Spring = true; + // + // backgroundWorker + // + this.backgroundWorker.WorkerReportsProgress = true; + this.backgroundWorker.WorkerSupportsCancellation = true; + this.backgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker_DoWork); + this.backgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker_RunWorkerCompleted); + this.backgroundWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker_ProgressChanged); + // + // AsyncTestBackgroundWorker + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(496, 351); + this.Controls.Add(this.GroupBox1); + this.Controls.Add(this.statusStrip1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MinimumSize = new System.Drawing.Size(354, 254); + this.Name = "AsyncTestBackgroundWorker"; + this.Text = "Asynchronous Test"; + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.TextBox txtResults; + internal System.Windows.Forms.Button cmdFind; + internal System.Windows.Forms.Label Label3; + internal System.Windows.Forms.TextBox txtTo; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.TextBox txtFrom; + private System.Windows.Forms.StatusStrip statusStrip1; + + private System.Windows.Forms.ToolStripStatusLabel statusPanel; + private System.ComponentModel.BackgroundWorker backgroundWorker; + private System.Windows.Forms.ToolStripProgressBar progressPanel; + internal System.Windows.Forms.Button cmdCancel; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestBackgroundWorker.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestBackgroundWorker.cs new file mode 100644 index 0000000..8bd0f70 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestBackgroundWorker.cs @@ -0,0 +1,153 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Windows.Forms; +using System.Text; + +#endregion + +namespace MultithreadingClient +{ + partial class AsyncTestBackgroundWorker : Form + { + public AsyncTestBackgroundWorker() + { + InitializeComponent(); + } + + + private void cmdFind_Click(object sender, EventArgs e) + { + // Disable the button. + cmdFind.Enabled = false; + statusPanel.Text = ""; + + // Get the search range. + int from, to; + if (!Int32.TryParse(txtFrom.Text, out from)) + { + MessageBox.Show("Invalid From value."); + return; + } + if (!Int32.TryParse(txtTo.Text, out to)) + { + MessageBox.Show("Invalid To value."); + return; + } + + // Start the search for primes on another thread. + FindPrimesInput input = new FindPrimesInput(from, to); + backgroundWorker.RunWorkerAsync(input); + } + + private void statusStrip1_DoubleClick(object sender, EventArgs e) + { + if (statusPanel.Text != "") + { + txtResults.Text = primeList; + primeList = ""; + statusPanel.Text = ""; + } + } + + private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) + { + // Get the input values. + FindPrimesInput input = (FindPrimesInput)e.Argument; + + // Start the search for primes and wait. + int[] primes = MultithreadingWorker.Worker.FindPrimes(input.From, input.To, backgroundWorker); + + if (backgroundWorker.CancellationPending) + { + e.Cancel = true; + return; + } + + // Paste the list of primes together into one long string. + StringBuilder sb = new StringBuilder(); + foreach (int prime in primes) + { + sb.Append(prime.ToString()); + sb.Append(" "); + } + + // Return the result. + e.Result = sb.ToString(); + } + + string primeList; + private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + primeList = ""; + statusPanel.Text = ""; + + if (e.Cancelled) + { + MessageBox.Show("Search cancelled."); + } + else if (e.Error != null) + { + // An error was thrown by the DoWork event handler. + MessageBox.Show(e.Error.Message, "An Error Occurred"); + } + else + { + primeList = (string)e.Result; + statusPanel.Text = "Double-click panel to see new prime list."; + } + cmdFind.Enabled = true; + } + + private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) + { + progressPanel.Value = e.ProgressPercentage; + } + + private void cmdCancel_Click(object sender, EventArgs e) + { + backgroundWorker.CancelAsync(); + } + + } + + public class FindPrimesInput + { + private int to; + public int To + { + get + { + return to; + } + set + { + to = value; + } + } + + private int from; + public int From + { + get + { + return from; + } + set + { + from = value; + } + } + + public FindPrimesInput(int from, int to) + { + To = to; + From = from; + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestBackgroundWorker.resx b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestBackgroundWorker.resx new file mode 100644 index 0000000..2e48856 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestBackgroundWorker.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 163, 17 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestLocking.Designer.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestLocking.Designer.cs new file mode 100644 index 0000000..e3622b4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestLocking.Designer.cs @@ -0,0 +1,178 @@ +namespace MultithreadingClient +{ + partial class AsyncTestLocking + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.txtResults = new System.Windows.Forms.TextBox(); + this.cmdFind = new System.Windows.Forms.Button(); + this.Label3 = new System.Windows.Forms.Label(); + this.txtTo = new System.Windows.Forms.TextBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtFrom = new System.Windows.Forms.TextBox(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.statusPanel = new System.Windows.Forms.ToolStripStatusLabel(); + this.GroupBox1.SuspendLayout(); + this.statusStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.txtResults); + this.GroupBox1.Controls.Add(this.cmdFind); + this.GroupBox1.Controls.Add(this.Label3); + this.GroupBox1.Controls.Add(this.txtTo); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.txtFrom); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(9, 11); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(475, 306); + this.GroupBox1.TabIndex = 1; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Find Prime Numbers"; + // + // txtResults + // + this.txtResults.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtResults.Location = new System.Drawing.Point(80, 110); + this.txtResults.Multiline = true; + this.txtResults.Name = "txtResults"; + this.txtResults.ReadOnly = true; + this.txtResults.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtResults.Size = new System.Drawing.Size(383, 179); + this.txtResults.TabIndex = 7; + // + // cmdFind + // + this.cmdFind.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFind.Location = new System.Drawing.Point(210, 53); + this.cmdFind.Name = "cmdFind"; + this.cmdFind.Size = new System.Drawing.Size(112, 24); + this.cmdFind.TabIndex = 5; + this.cmdFind.Text = "Find Primes"; + this.cmdFind.Click += new System.EventHandler(this.cmdFind_Click); + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(16, 60); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(52, 20); + this.Label3.TabIndex = 4; + this.Label3.Text = "To:"; + // + // txtTo + // + this.txtTo.Location = new System.Drawing.Point(80, 56); + this.txtTo.Name = "txtTo"; + this.txtTo.Size = new System.Drawing.Size(100, 21); + this.txtTo.TabIndex = 3; + this.txtTo.Text = "500000"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 32); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(52, 20); + this.Label2.TabIndex = 2; + this.Label2.Text = "From:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 104); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(48, 16); + this.Label1.TabIndex = 1; + this.Label1.Text = "Results:"; + // + // txtFrom + // + this.txtFrom.Location = new System.Drawing.Point(80, 28); + this.txtFrom.Name = "txtFrom"; + this.txtFrom.Size = new System.Drawing.Size(100, 21); + this.txtFrom.TabIndex = 0; + this.txtFrom.Text = "1"; + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.statusPanel}); + this.statusStrip1.Location = new System.Drawing.Point(0, 329); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(496, 22); + this.statusStrip1.TabIndex = 2; + this.statusStrip1.Text = "statusStrip1"; + // + // statusPanel + // + this.statusPanel.Name = "statusPanel"; + this.statusPanel.Size = new System.Drawing.Size(481, 17); + this.statusPanel.Spring = true; + this.statusPanel.Click += new System.EventHandler(this.statusStrip1_DoubleClick); + // + // AsyncTestLocking + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(496, 351); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MinimumSize = new System.Drawing.Size(354, 254); + this.Name = "AsyncTestLocking"; + this.Text = "Asynchronous Test"; + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.TextBox txtResults; + internal System.Windows.Forms.Button cmdFind; + internal System.Windows.Forms.Label Label3; + internal System.Windows.Forms.TextBox txtTo; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.TextBox txtFrom; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel statusPanel; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestLocking.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestLocking.cs new file mode 100644 index 0000000..e6f4486 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestLocking.cs @@ -0,0 +1,104 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Windows.Forms; +using System.Text; + +#endregion + +namespace MultithreadingClient +{ + partial class AsyncTestLocking : Form + { + public AsyncTestLocking() + { + InitializeComponent(); + } + + private delegate void CallAsyncWorkerDelegate(int from, int to); + + + // Shared data. + string primeList = ""; + + private void CallAsyncWorker(int from, int to) + { + try + { + // Start the search for primes and wait. + int[] primes = MultithreadingWorker.Worker.FindPrimes(from, to); + + // Paste the list of primes together into one long string. + StringBuilder sb = new StringBuilder(); + foreach (int prime in primes) + { + sb.Append(prime.ToString()); + sb.Append(" "); + } + + // Store the list of primes for later use. + lock (primeList) + { + primeList = sb.ToString(); + } + + // Indicate that the prime list is available. + this.Invoke(new MethodInvoker(NotifyComplete)); + } + catch (Exception err) + { + MessageBox.Show(err.Message); + } + } + + private bool dataAvailable = false; + private void NotifyComplete() + { + dataAvailable = true; + statusPanel.Text = "Double-click panel to see new prime list."; + cmdFind.Enabled = true; + } + + private void cmdFind_Click(object sender, EventArgs e) + { + // Disable the button. + cmdFind.Enabled = false; + + + statusPanel.Text = ""; + + // Get the search range. + int from, to; + if (!Int32.TryParse(txtFrom.Text, out from)) + { + MessageBox.Show("Invalid From value."); + return; + } + if (!Int32.TryParse(txtTo.Text, out to)) + { + MessageBox.Show("Invalid To value."); + return; + } + + // Start the search for primes on another thread. + CallAsyncWorkerDelegate doWork = new CallAsyncWorkerDelegate(CallAsyncWorker); + doWork.BeginInvoke(from, to, null, null); + } + + private void statusStrip1_DoubleClick(object sender, EventArgs e) + { + if (dataAvailable) + { + txtResults.Text = primeList; + primeList = ""; + statusPanel.Text = ""; + dataAvailable = false; + } + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestLocking.resx b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestLocking.resx new file mode 100644 index 0000000..b9c202b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestLocking.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestMultiple.Designer.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestMultiple.Designer.cs new file mode 100644 index 0000000..b6a9c62 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestMultiple.Designer.cs @@ -0,0 +1,97 @@ +namespace MultithreadingClient +{ + partial class AsyncTestMultiple + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.cmdNewSearch = new System.Windows.Forms.ToolStripButton(); + + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.statusPanel = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStrip1.SuspendLayout(); + + this.statusStrip1.SuspendLayout(); + this.SuspendLayout(); +// +// toolStrip1 +// + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cmdNewSearch + }); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; +// +// cmdNewSearch +// + this.cmdNewSearch.Name = "cmdNewSearch"; + + this.cmdNewSearch.Text = "New Search"; + this.cmdNewSearch.Click += new System.EventHandler(this.cmdNewSearch_Click); +// +// statusStrip1 +// + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.statusPanel + }); + this.statusStrip1.Location = new System.Drawing.Point(0, 0); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Padding = new System.Windows.Forms.Padding(0, 0, 12, 0); + this.statusStrip1.TabIndex = 1; + this.statusStrip1.Text = "statusStrip1"; +// +// statusPanel +// + this.statusPanel.Name = "statusPanel"; +// +// AsyncTestMultiple +// + this.Controls.Add(toolStrip1); + this.Controls.Add(statusStrip1); + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(448, 401); + this.IsMdiContainer = true; + this.Name = "AsyncTestMultiple"; + this.Text = "Prime Number Searcher"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.AsyncTestMultiple_FormClosed); + this.toolStrip1.ResumeLayout(false); + this.statusStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton cmdNewSearch; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel statusPanel; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestMultiple.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestMultiple.cs new file mode 100644 index 0000000..c740948 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestMultiple.cs @@ -0,0 +1,82 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using MultithreadingWorker; + +#endregion + +namespace MultithreadingClient +{ + partial class AsyncTestMultiple : Form + { + public AsyncTestMultiple() + { + InitializeComponent(); + } + + + // Track ongoing threads. + List workers = new List(); + + private void cmdNewSearch_Click(object sender, EventArgs e) + { + AsyncTestQuery search = new AsyncTestQuery(); + if (search.ShowDialog() == DialogResult.OK) + { + // Start the new search. + EratosthenesTask worker = new EratosthenesTask(search.From, search.To); + worker.Completed += new FindPrimesCompletedEventHandler(WorkerCompleted); + lock (workers) + { + workers.Add(worker); + statusPanel.Text = String.Format("Currently running {0} tasks.", workers.Count); + } + worker.Start(); + } + search.Dispose(); + } + + private void WorkerCompleted(object sender, FindPrimesCompletedEventArgs e) + { + // Stop tracking the worker. + lock (workers) + { + workers.Remove((EratosthenesTask)sender); + } + + // Show the results (on the user interface thread). + this.Invoke(new FindPrimesCompletedEventHandler(ShowResults), + new object[] {sender, e} ); + } + + private void ShowResults(object sender, FindPrimesCompletedEventArgs e) + { + AsyncTestResult result = new AsyncTestResult(); + result.Text = String.Format("Primes From {0} To {1}", + new object[] { e.From, e.To }); + result.ShowList(e.PrimeList); + result.MdiParent = this; + result.Show(); + + lock (workers) + { + statusPanel.Text = String.Format("Currently running {0} tasks.", workers.Count); + } + } + + private void AsyncTestMultiple_FormClosed(object sender, FormClosedEventArgs e) + { + // This would be a good place to loop through the workes and + // terminate each one. + // As it stands, they are background threads, so they will + // be aborted by the CLR when the application ends. + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestQuery.Designer.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestQuery.Designer.cs new file mode 100644 index 0000000..ef3b8cc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestQuery.Designer.cs @@ -0,0 +1,137 @@ +namespace MultithreadingClient +{ + partial class AsyncTestQuery + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label3 = new System.Windows.Forms.Label(); + this.txtTo = new System.Windows.Forms.TextBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.txtFrom = new System.Windows.Forms.TextBox(); + this.cmdFind = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Controls.Add(this.Label3); + this.GroupBox1.Controls.Add(this.txtTo); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.txtFrom); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(9, 11); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(223, 98); + this.GroupBox1.TabIndex = 1; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Find Prime Numbers"; + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(16, 60); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(52, 20); + this.Label3.TabIndex = 4; + this.Label3.Text = "To:"; + // + // txtTo + // + this.txtTo.Location = new System.Drawing.Point(80, 56); + this.txtTo.Name = "txtTo"; + this.txtTo.Size = new System.Drawing.Size(100, 21); + this.txtTo.TabIndex = 3; + this.txtTo.Text = "500000"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 32); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(52, 20); + this.Label2.TabIndex = 2; + this.Label2.Text = "From:"; + // + // txtFrom + // + this.txtFrom.Location = new System.Drawing.Point(80, 28); + this.txtFrom.Name = "txtFrom"; + this.txtFrom.Size = new System.Drawing.Size(100, 21); + this.txtFrom.TabIndex = 0; + this.txtFrom.Text = "1"; + // + // cmdFind + // + this.cmdFind.DialogResult = System.Windows.Forms.DialogResult.OK; + this.cmdFind.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFind.Location = new System.Drawing.Point(37, 135); + this.cmdFind.Name = "cmdFind"; + this.cmdFind.Size = new System.Drawing.Size(80, 24); + this.cmdFind.TabIndex = 5; + this.cmdFind.Text = "OK"; + + // + // button1 + // + this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button1.Location = new System.Drawing.Point(124, 135); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(80, 24); + this.button1.TabIndex = 6; + this.button1.Text = "Cancel"; + // + // AsyncTestQuery + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(252, 171); + this.Controls.Add(this.button1); + this.Controls.Add(this.cmdFind); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "AsyncTestQuery"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Asynchronous Test"; + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.Button cmdFind; + internal System.Windows.Forms.Label Label3; + internal System.Windows.Forms.TextBox txtTo; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.TextBox txtFrom; + internal System.Windows.Forms.Button button1; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestQuery.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestQuery.cs new file mode 100644 index 0000000..e47697b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestQuery.cs @@ -0,0 +1,43 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Windows.Forms; +using System.Text; + +#endregion + +namespace MultithreadingClient +{ + partial class AsyncTestQuery : Form + { + public AsyncTestQuery() + { + InitializeComponent(); + } + + public int From + { + get + { + int from; + Int32.TryParse(txtFrom.Text, out from); + return from; + } + } + + public int To + { + get + { + int to; + Int32.TryParse(txtTo.Text, out to); + return to; + } + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestQuery.resx b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestQuery.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestQuery.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestResult.Designer.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestResult.Designer.cs new file mode 100644 index 0000000..a035bed --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestResult.Designer.cs @@ -0,0 +1,65 @@ +namespace MultithreadingClient +{ + partial class AsyncTestResult + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txtResults = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); +// +// txtResults +// + this.txtResults.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtResults.AutoSize = false; + this.txtResults.Location = new System.Drawing.Point(13, 13); + this.txtResults.Multiline = true; + this.txtResults.Name = "txtResults"; + this.txtResults.ReadOnly = true; + this.txtResults.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtResults.Size = new System.Drawing.Size(450, 264); + this.txtResults.TabIndex = 8; +// +// AsyncTestResult +// + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(475, 289); + this.Controls.Add(this.txtResults); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "AsyncTestResult"; + this.Text = "Search Result"; + this.Load += new System.EventHandler(this.AsyncTestResult_Load); + this.ResumeLayout(false); + + } + + #endregion + + internal System.Windows.Forms.TextBox txtResults; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestResult.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestResult.cs new file mode 100644 index 0000000..01e94b3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestResult.cs @@ -0,0 +1,32 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +#endregion + +namespace MultithreadingClient +{ + partial class AsyncTestResult : Form + { + public AsyncTestResult() + { + InitializeComponent(); + } + + private void AsyncTestResult_Load(object sender, EventArgs e) + { + + } + + public void ShowList(string text) + { + txtResults.Text = text; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestResult.resx b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestResult.resx new file mode 100644 index 0000000..d972c2c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/AsyncTestResult.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Menu.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Menu.cs new file mode 100644 index 0000000..7c67ead --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace MultithreadingClient +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("MultithreadingClient." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Menu.designer.cs new file mode 100644 index 0000000..99b02a5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Menu.designer.cs @@ -0,0 +1,122 @@ +namespace MultithreadingClient +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(168, 23); + this.button1.TabIndex = 0; + this.button1.Text = "SyncTest"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(168, 23); + this.button2.TabIndex = 1; + this.button2.Text = "AsyncTest"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 70); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(168, 23); + this.button3.TabIndex = 2; + this.button3.Text = "AsyncTestLocking"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(12, 99); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(168, 23); + this.button4.TabIndex = 3; + this.button4.Text = "AsyncTestBackgroundWorker"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(12, 128); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(168, 23); + this.button5.TabIndex = 4; + this.button5.Text = "AsyncTestMultiple"; + this.button5.Click += new System.EventHandler(this.cmd_Click); + // + // button6 + // + this.button6.Location = new System.Drawing.Point(12, 157); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(168, 23); + this.button6.TabIndex = 5; + this.button6.Text = "TaskManagerClient"; + this.button6.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(194, 200); + this.Controls.Add(this.button6); + this.Controls.Add(this.button5); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Menu.resx b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Multithreading.sln b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Multithreading.sln new file mode 100644 index 0000000..5849291 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Multithreading.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultithreadingClient", "MultithreadingClient.csproj", "{7AD197C7-3B03-4424-AA4F-4BB75CF012C3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MultithreadingWorker", "..\MultithreadingWorker\MultithreadingWorker.csproj", "{C3697F48-4842-4712-BF8D-5EDC993EBB4F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7AD197C7-3B03-4424-AA4F-4BB75CF012C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7AD197C7-3B03-4424-AA4F-4BB75CF012C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7AD197C7-3B03-4424-AA4F-4BB75CF012C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7AD197C7-3B03-4424-AA4F-4BB75CF012C3}.Release|Any CPU.Build.0 = Release|Any CPU + {C3697F48-4842-4712-BF8D-5EDC993EBB4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3697F48-4842-4712-BF8D-5EDC993EBB4F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3697F48-4842-4712-BF8D-5EDC993EBB4F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3697F48-4842-4712-BF8D-5EDC993EBB4F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Multithreading.suo b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Multithreading.suo new file mode 100644 index 0000000..5722770 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Multithreading.suo differ diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/MultithreadingClient.csproj b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/MultithreadingClient.csproj new file mode 100644 index 0000000..391522d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/MultithreadingClient.csproj @@ -0,0 +1,143 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {7AD197C7-3B03-4424-AA4F-4BB75CF012C3} + WinExe + MultithreadingClient + MultithreadingClient + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + Form + + + AsyncTest.cs + + + Form + + + AsyncTestLocking.cs + + + Form + + + AsyncTestBackgroundWorker.cs + + + Form + + + AsyncTestMultiple.cs + + + Form + + + AsyncTestQuery.cs + + + Form + + + AsyncTestResult.cs + + + Form + + + Menu.cs + + + Form + + + SyncTest.cs + + + + + AsyncTest.cs + + + AsyncTestLocking.cs + + + AsyncTestBackgroundWorker.cs + + + AsyncTestQuery.cs + + + AsyncTestResult.cs + + + Menu.cs + Designer + + + SyncTest.cs + + + ResXFileCodeGenerator + Resources.cs + + + TaskManagerClient.cs + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + Form + + + TaskManagerClient.cs + + + + + + {C3697F48-4842-4712-BF8D-5EDC993EBB4F} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + MultithreadingWorker + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/MultithreadingClient.csproj.user b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/MultithreadingClient.csproj.user new file mode 100644 index 0000000..eba6f5d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/MultithreadingClient.csproj.user @@ -0,0 +1,7 @@ + + + 8.0.50215 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Program.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Program.cs new file mode 100644 index 0000000..a0cf201 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Program.cs @@ -0,0 +1,24 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +#endregion + +namespace MultithreadingClient +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..82eefd9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Multithreading")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Multithreading")] +[assembly: AssemblyCopyright("Copyright @ 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Resources.cs new file mode 100644 index 0000000..b64c716 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Resources.cs @@ -0,0 +1,61 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MultithreadingClient.Properties { + using System; + using System.IO; + using System.Resources; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager { + get { + if ((_resMgr == null)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("MultithreadingClient.Properties.Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture { + get { + return _resCulture; + } + set { + _resCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Settings.cs new file mode 100644 index 0000000..da2b8fa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Settings.cs @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MultithreadingClient.Properties { + + + sealed partial class Settings : System.Configuration.ApplicationSettingsBase { + + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + [System.Diagnostics.DebuggerNonUserCode()] + public static Settings Value { + get { + if ((Settings.m_Value == null)) { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) { + try { + Settings.m_Value = new Settings(); + } + finally { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Settings.settings new file mode 100644 index 0000000..1bd32f5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/SyncTest.Designer.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/SyncTest.Designer.cs new file mode 100644 index 0000000..d51387b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/SyncTest.Designer.cs @@ -0,0 +1,174 @@ +namespace MultithreadingClient +{ + partial class SyncTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.lblTimeTaken = new System.Windows.Forms.Label(); + this.txtResults = new System.Windows.Forms.TextBox(); + this.Label4 = new System.Windows.Forms.Label(); + this.cmdFind = new System.Windows.Forms.Button(); + this.Label3 = new System.Windows.Forms.Label(); + this.txtTo = new System.Windows.Forms.TextBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtFrom = new System.Windows.Forms.TextBox(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); +// +// GroupBox1 +// + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.lblTimeTaken); + this.GroupBox1.Controls.Add(this.txtResults); + this.GroupBox1.Controls.Add(this.Label4); + this.GroupBox1.Controls.Add(this.cmdFind); + this.GroupBox1.Controls.Add(this.Label3); + this.GroupBox1.Controls.Add(this.txtTo); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.txtFrom); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(9, 11); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(487, 315); + this.GroupBox1.TabIndex = 1; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Find Prime Numbers"; +// +// lblTimeTaken +// + this.lblTimeTaken.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblTimeTaken.Location = new System.Drawing.Point(80, 279); + this.lblTimeTaken.Name = "lblTimeTaken"; + this.lblTimeTaken.Size = new System.Drawing.Size(395, 20); + this.lblTimeTaken.TabIndex = 8; +// +// txtResults +// + this.txtResults.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtResults.Location = new System.Drawing.Point(80, 107); + this.txtResults.Multiline = true; + this.txtResults.Name = "txtResults"; + this.txtResults.ReadOnly = true; + this.txtResults.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtResults.Size = new System.Drawing.Size(395, 156); + this.txtResults.TabIndex = 7; +// +// Label4 +// + this.Label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.Label4.Location = new System.Drawing.Point(16, 279); + this.Label4.Name = "Label4"; + this.Label4.Size = new System.Drawing.Size(72, 16); + this.Label4.TabIndex = 6; + this.Label4.Text = "Time Taken:"; +// +// cmdFind +// + this.cmdFind.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFind.Location = new System.Drawing.Point(210, 53); + this.cmdFind.Name = "cmdFind"; + this.cmdFind.Size = new System.Drawing.Size(112, 24); + this.cmdFind.TabIndex = 5; + this.cmdFind.Text = "Find Primes"; + this.cmdFind.Click += new System.EventHandler(this.cmdFind_Click); +// +// Label3 +// + this.Label3.Location = new System.Drawing.Point(16, 60); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(52, 20); + this.Label3.TabIndex = 4; + this.Label3.Text = "To:"; +// +// txtTo +// + this.txtTo.Location = new System.Drawing.Point(80, 56); + this.txtTo.Name = "txtTo"; + this.txtTo.TabIndex = 3; + this.txtTo.Text = "500000"; +// +// Label2 +// + this.Label2.Location = new System.Drawing.Point(16, 32); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(52, 20); + this.Label2.TabIndex = 2; + this.Label2.Text = "From:"; +// +// Label1 +// + this.Label1.Location = new System.Drawing.Point(16, 104); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(48, 16); + this.Label1.TabIndex = 1; + this.Label1.Text = "Results:"; +// +// txtFrom +// + this.txtFrom.Location = new System.Drawing.Point(80, 28); + this.txtFrom.Name = "txtFrom"; + this.txtFrom.TabIndex = 0; + this.txtFrom.Text = "1"; +// +// Form1 +// + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(508, 338); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MinimumSize = new System.Drawing.Size(354, 254); + this.Name = "Form1"; + this.Text = "Synchronous Test"; + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.Label lblTimeTaken; + internal System.Windows.Forms.TextBox txtResults; + internal System.Windows.Forms.Label Label4; + internal System.Windows.Forms.Button cmdFind; + internal System.Windows.Forms.Label Label3; + internal System.Windows.Forms.TextBox txtTo; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.TextBox txtFrom; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/SyncTest.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/SyncTest.cs new file mode 100644 index 0000000..f2c03d1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/SyncTest.cs @@ -0,0 +1,71 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Windows.Forms; +using System.Text; + +#endregion + +namespace MultithreadingClient +{ + partial class SyncTest : Form + { + public SyncTest() + { + InitializeComponent(); + } + + private void cmdFind_Click(object sender, EventArgs e) + { + this.UseWaitCursor = true; + + txtResults.Text = ""; + lblTimeTaken.Text = ""; + + try + { + // Get the search range. + int from, to; + if (!Int32.TryParse(txtFrom.Text, out from)) + { + MessageBox.Show("Invalid From value."); + return; + } + if (!Int32.TryParse(txtTo.Text, out to)) + { + MessageBox.Show("Invalid To value."); + return; + } + + // Start the search for primes and wait. + DateTime startTime = DateTime.Now; + int[] primes = MultithreadingWorker.Worker.FindPrimes(from, to); + + // Display the time for the call to complete. + lblTimeTaken.Text = DateTime.Now.Subtract(startTime).TotalSeconds.ToString(); + + + // Paste the list of primes together into one long string. + StringBuilder sb = new StringBuilder(); + foreach (int prime in primes) + { + sb.Append(prime.ToString()); + sb.Append(" "); + } + txtResults.Text = sb.ToString(); + } + catch (Exception err) + { + MessageBox.Show(err.Message); + } + + this.UseWaitCursor = false; + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/SyncTest.resx b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/SyncTest.resx new file mode 100644 index 0000000..6cdb81d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/SyncTest.resx @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/TaskManagerClient.Designer.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/TaskManagerClient.Designer.cs new file mode 100644 index 0000000..5bd6031 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/TaskManagerClient.Designer.cs @@ -0,0 +1,195 @@ +namespace MultithreadingClient +{ + partial class TaskManagerClient + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.cmdFind = new System.Windows.Forms.Button(); + this.Label3 = new System.Windows.Forms.Label(); + this.txtTo = new System.Windows.Forms.TextBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.txtFrom = new System.Windows.Forms.TextBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.listTasks = new System.Windows.Forms.ListView(); + this.ID = new System.Windows.Forms.ColumnHeader(); + this.Range = new System.Windows.Forms.ColumnHeader(); + this.Status = new System.Windows.Forms.ColumnHeader(); + this.taskManager = new MultithreadingWorker.TaskManager(); + this.GroupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.cmdFind); + this.GroupBox1.Controls.Add(this.Label3); + this.GroupBox1.Controls.Add(this.txtTo); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.txtFrom); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(12, 12); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(443, 104); + this.GroupBox1.TabIndex = 2; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Find Prime Numbers"; + // + // cmdFind + // + this.cmdFind.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdFind.Location = new System.Drawing.Point(211, 28); + this.cmdFind.Name = "cmdFind"; + this.cmdFind.Size = new System.Drawing.Size(112, 24); + this.cmdFind.TabIndex = 5; + this.cmdFind.Text = "Find Primes"; + this.cmdFind.Click += new System.EventHandler(this.cmdFind_Click); + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point(16, 60); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size(52, 20); + this.Label3.TabIndex = 4; + this.Label3.Text = "To:"; + // + // txtTo + // + this.txtTo.Location = new System.Drawing.Point(80, 56); + this.txtTo.Name = "txtTo"; + this.txtTo.Size = new System.Drawing.Size(100, 21); + this.txtTo.TabIndex = 3; + this.txtTo.Text = "500000"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 32); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(52, 20); + this.Label2.TabIndex = 2; + this.Label2.Text = "From:"; + // + // txtFrom + // + this.txtFrom.Location = new System.Drawing.Point(80, 28); + this.txtFrom.Name = "txtFrom"; + this.txtFrom.Size = new System.Drawing.Size(100, 21); + this.txtFrom.TabIndex = 0; + this.txtFrom.Text = "1"; + // + // groupBox2 + // + this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox2.Controls.Add(this.listTasks); + this.groupBox2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.groupBox2.Location = new System.Drawing.Point(12, 122); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(443, 271); + this.groupBox2.TabIndex = 9; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Current Searches"; + // + // listTasks + // + this.listTasks.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.listTasks.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.ID, + this.Range, + this.Status}); + this.listTasks.Location = new System.Drawing.Point(11, 22); + this.listTasks.MultiSelect = false; + this.listTasks.Name = "listTasks"; + this.listTasks.Size = new System.Drawing.Size(417, 234); + this.listTasks.TabIndex = 0; + this.listTasks.UseCompatibleStateImageBehavior = false; + this.listTasks.View = System.Windows.Forms.View.Details; + this.listTasks.DoubleClick += new System.EventHandler(this.listTasks_DoubleClick); + // + // ID + // + this.ID.Name = "ID"; + this.ID.Text = "ID"; + this.ID.Width = 106; + // + // Range + // + this.Range.Name = "Range"; + this.Range.Text = "Range"; + this.Range.Width = 124; + // + // Status + // + this.Status.Name = "Status"; + this.Status.Text = "Status"; + this.Status.Width = 109; + // + // taskManager + // + this.taskManager.MaxThreads = 2; + this.taskManager.WorkerCompleted += new MultithreadingWorker.WorkerCompletedEventHandler(this.taskManager_WorkerCompleted); + this.taskManager.ReportWorkerProgress += new MultithreadingWorker.ReportWorkerProgressEventHandler(this.taskManager_ReportWorkerProgress); + // + // TaskManagerClient + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(467, 423); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "TaskManagerClient"; + this.Text = "Task Manager Client"; + this.Load += new System.EventHandler(this.TaskManagerClient_Load); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Button cmdFind; + private System.Windows.Forms.Label Label3; + private System.Windows.Forms.TextBox txtTo; + private System.Windows.Forms.Label Label2; + private System.Windows.Forms.TextBox txtFrom; + private System.Windows.Forms.GroupBox groupBox2; + private MultithreadingWorker.TaskManager taskManager; + private System.Windows.Forms.ListView listTasks; + private System.Windows.Forms.ColumnHeader ID; + private System.Windows.Forms.ColumnHeader Range; + private System.Windows.Forms.ColumnHeader Status; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/TaskManagerClient.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/TaskManagerClient.cs new file mode 100644 index 0000000..317ba50 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/TaskManagerClient.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using MultithreadingWorker; + +namespace MultithreadingClient +{ + public partial class TaskManagerClient : Form + { + public TaskManagerClient() + { + InitializeComponent(); + } + + private void taskManager_ReportWorkerProgress(object sender, MultithreadingWorker.ReportWorkerProgressEventArgs e) + { + // Find the matching item. + foreach (ListViewItem item in listTasks.Items) + { + if (item.Text == e.TaskID.ToString()) + { + item.SubItems[2].Text = e.Progress.ToString() + "% completed"; + break; + } + } + } + + private void taskManager_WorkerCompleted(object sender, MultithreadingWorker.WorkerCompletedEventArgs e) + { + // Find the matching item. + foreach (ListViewItem item in listTasks.Items) + { + if (item.Text == e.ID.ToString()) + { + item.SubItems[2].Text = "Completed"; + + // Store the results for later use. + // Could use a custom ListView here, but the + // Tag is a messier shortcut. + item.Tag = e.PrimeList; + break; + } + } + } + + private void cmdFind_Click(object sender, EventArgs e) + { + // Get the search range. + int from, to; + if (!Int32.TryParse(txtFrom.Text, out from)) + { + MessageBox.Show("Invalid From value."); + return; + } + if (!Int32.TryParse(txtTo.Text, out to)) + { + MessageBox.Show("Invalid To value."); + return; + } + + // Create the task. + EratosthenesTask task = new EratosthenesTask(from, to); + + // Add the task to the grid. + ListViewItem item = new ListViewItem(task.ID.ToString()); + item.SubItems.Add(from.ToString() + " to " + to.ToString()); + item.SubItems.Add("Queued"); + listTasks.Items.Add(item); + + // Enqueue the task. + taskManager.EnqueueTask(task); + } + + private void TaskManagerClient_Load(object sender, EventArgs e) + { + taskManager.StartAllocatingWork(this); + } + + private void listTasks_DoubleClick(object sender, EventArgs e) + { + // Check for item click. + if (listTasks.SelectedItems[0] != null) + { + // Check item is completed. + if (listTasks.SelectedItems[0].Tag != null) + { + AsyncTestResult result = new AsyncTestResult(); + result.ShowList((string)listTasks.SelectedItems[0].Tag); + result.ShowDialog(); + result.Dispose(); + } + } + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/TaskManagerClient.resx b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/TaskManagerClient.resx new file mode 100644 index 0000000..e01e483 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/TaskManagerClient.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/app.config b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/app.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/app.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingClient.exe b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingClient.exe new file mode 100644 index 0000000..8eecbac Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingClient.exe differ diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingClient.exe.config b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingClient.exe.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingClient.exe.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingClient.vshost.exe.config b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingClient.vshost.exe.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingClient.vshost.exe.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingWorker.dll b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingWorker.dll new file mode 100644 index 0000000..1ec91da Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Debug/MultithreadingWorker.dll differ diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingClient.exe b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingClient.exe new file mode 100644 index 0000000..9a20983 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingClient.exe differ diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingClient.exe.config b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingClient.exe.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingClient.exe.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingClient.vshost.exe.config b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingClient.vshost.exe.config new file mode 100644 index 0000000..1b99773 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingClient.vshost.exe.config @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingWorker.dll b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingWorker.dll new file mode 100644 index 0000000..96b246d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter20/Multithreading/Multithreading/bin/Release/MultithreadingWorker.dll differ diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/EratosthenesTask.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/EratosthenesTask.cs new file mode 100644 index 0000000..53c5596 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/EratosthenesTask.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MultithreadingWorker +{ + public delegate void FindPrimesCompletedEventHandler(object sender, FindPrimesCompletedEventArgs e); + + public class EratosthenesTask : ThreadWrapperBase + { + public event FindPrimesCompletedEventHandler Completed; + + // Store the input and output information. + private int fromNumber, toNumber; + string primeList; + + public EratosthenesTask(int from, int to) + { + this.fromNumber = from; + this.toNumber = to; + SupportsProgress = true; + } + + protected override void DoTask() + { + int[] list = new int[toNumber - fromNumber]; + int fromNumberCurrent = fromNumber; + + // Create an array containing all integers between the two specified numbers. + for (int i = 0; i < list.Length; i++) + { + list[i] = fromNumberCurrent; + fromNumberCurrent += 1; + } + + + //find out the module for each item in list, divided by each d, where + //d is < or == to sqrt(to) + //if the remainder is 0, the nubmer is a composite, and thus + //we mark its position with 0 in the marks array, + //otherwise the number is a prime, and thus mark it with 1 + int maxDiv = (int)Math.Floor(Math.Sqrt(toNumber)); + + int[] mark = new int[list.Length]; + + + for (int i = 0; i < list.Length; i++) + { + for (int j = 2; j <= maxDiv; j++) + { + + if ((list[i] != j) && (list[i] % j == 0)) + { + mark[i] = 1; + } + + } + + int iteration = list.Length / 100; + if (i % iteration == 0) + { + progress = i / iteration; + + } + + } + + //create new array that contains only the primes, and return that array + int primes = 0; + for (int i = 0; i < mark.Length; i++) + { + if (mark[i] == 0) primes += 1; + + } + + int[] ret = new int[primes]; + int curs = 0; + for (int i = 0; i < mark.Length; i++) + { + if (mark[i] == 0) + { + ret[curs] = list[i]; + curs += 1; + } + } + + // Paste the list of primes together into one long string. + StringBuilder sb = new StringBuilder(); + foreach (int prime in ret) + { + sb.Append(prime.ToString()); + sb.Append(" "); + } + // Store the result. + primeList = sb.ToString(); + } + + protected override void OnCompleted() + { + // Signal that the operation is complete. + if (Completed != null) + Completed(this, + new FindPrimesCompletedEventArgs(fromNumber, toNumber, primeList)); + } + + // Allow access to the result once the task is finished. + public string GetResultOfLastTask() + { + if (Status == StatusState.Completed) + return primeList; + else + return ""; + } + } + + + public class FindPrimesCompletedEventArgs : EventArgs + { + private string primeList; + public string PrimeList + { + get { return primeList; } + set { primeList = value; } + } + + private int from; + public int From + { + get { return from; } + set { from = value; } + } + + private int to; + public int To + { + get { return to; } + set { to = value; } + } + + public FindPrimesCompletedEventArgs(int from, int to, string primeList) + { + From = from; + To = to; + PrimeList = primeList; + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/MultithreadingWorker.csproj b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/MultithreadingWorker.csproj new file mode 100644 index 0000000..59d328d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/MultithreadingWorker.csproj @@ -0,0 +1,59 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {C3697F48-4842-4712-BF8D-5EDC993EBB4F} + Library + MultithreadingWorker + MultithreadingWorker + 4 + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + Component + + + + + ResXFileCodeGenerator + Resources.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/MultithreadingWorker.csproj.user b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/MultithreadingWorker.csproj.user new file mode 100644 index 0000000..eba6f5d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/MultithreadingWorker.csproj.user @@ -0,0 +1,7 @@ + + + 8.0.50215 + ProjectFiles + 0 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1608e16 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("MultithreadingWorker")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MultithreadingWorker")] +[assembly: AssemblyCopyright("Copyright @ 2004")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Resources.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Resources.cs new file mode 100644 index 0000000..bee1c6f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Resources.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MultithreadingWorker.Properties +{ + using System; + using System.IO; + using System.Resources; + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources + { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager + { + get + { + if ((_resMgr == null)) + { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture + { + get + { + return _resCulture; + } + set + { + _resCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Settings.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Settings.cs new file mode 100644 index 0000000..6d168cb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Settings.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.40607.85 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MultithreadingWorker.Properties +{ + public partial class Settings : System.Configuration.ApplicationSettingsBase + { + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + public static Settings Value + { + get + { + if ((Settings.m_Value == null)) + { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) + { + try + { + Settings.m_Value = new Settings(); + } + finally + { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Settings.settings new file mode 100644 index 0000000..4024694 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/TaskManager.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/TaskManager.cs new file mode 100644 index 0000000..6b3105e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/TaskManager.cs @@ -0,0 +1,227 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace MultithreadingWorker +{ + public delegate void ReportWorkerProgressEventHandler(object sender, ReportWorkerProgressEventArgs e); + public delegate void WorkerCompletedEventHandler(object sender, WorkerCompletedEventArgs e); + + // Inherit from component for design-time use. + public class TaskManager : System.ComponentModel.Component + { + private int maxThreads = 2; + public int MaxThreads + { + get { return maxThreads; } + set { maxThreads = value; } + } + + // Track ongoing workers. + List workers = new List(); + + // Track queued requests. + List workersQueued = new List(); + + // Task completed requests. + List workersCompleted = new List(); + + public ThreadWrapperBase[] CompletedTasks + { + get + { + // To avoid synchronization issues, make a copy of this + // information. + ThreadWrapperBase[] taskArray; + lock (workersCompleted) + { + taskArray = new ThreadWrapperBase[workersCompleted.Count]; + workersCompleted.CopyTo(taskArray); + } + return taskArray; + } + } + + public void EnqueueTask(ThreadWrapperBase task) + { + lock (workersQueued) + { + workersQueued.Add(task); + } + } + + + + private Thread allocateWork; + private bool working = false; + private Control invokeContext; + public void StartAllocatingWork(Control invokeContext) + { + if (working == false) + { + this.invokeContext = invokeContext; + allocateWork = new Thread(new ThreadStart(AllocateWork)); + allocateWork.IsBackground = true; + //allocateWork.Priority = ThreadPriority.BelowNormal; + working = true; + allocateWork.Start(); + } + + } + + public event ReportWorkerProgressEventHandler ReportWorkerProgress; + private void OnReportWorkerProgress(object sender, ReportWorkerProgressEventArgs e) + { + if (ReportWorkerProgress != null) + ReportWorkerProgress(sender, e); + } + + public event WorkerCompletedEventHandler WorkerCompleted; + private void OnWorkerCompleted(object sender, WorkerCompletedEventArgs e) + { + if (WorkerCompleted != null) + WorkerCompleted(sender, e); + } + + private void AllocateWork() + { + while (true) + { + // Remove completed tasks. + // Because we are not using foreach, the collection + // doesn't need to be locked. It could grow while this + // method is working, but that would only result in a + // slot being missed until the next pass, which is acceptable. + // It can't shrink, because no other methods remove work. + // We count in reverse order so a single pass can + // remove multiple entries without rearranging the items + // that haven't been scanned. + // Deferring the locking improves performance. + for (int i = workers.Count-1; i >= 0; i--) + { + if (workers[i].Status == StatusState.Completed) + { + ThreadWrapperBase worker = workers[i]; + lock (workersCompleted) + { + workersCompleted.Add(worker); + } + lock (workers) + { + workers.Remove(worker); + } + // Fire notification event. + invokeContext.Invoke(new WorkerCompletedEventHandler(OnWorkerCompleted), + new object[] { this, new WorkerCompletedEventArgs((EratosthenesTask)worker)}); + } + } + + // Allocate new work while threads are available. + while (workersQueued.Count > 0 && + workers.Count < maxThreads) + { + ThreadWrapperBase task = workersQueued[0]; + + // Some exception handling code here would be useful + // to prevent performing one part of this sequence + // (starting the task), without the other (removing it + // from the queue). + lock (workers) + { + workers.Add(task); + } + lock (workersQueued) + { + workersQueued.RemoveAt(0); + } + task.Start(); + } + + // Report progress. + for (int i = workers.Count - 1; i >= 0; i--) + { + ThreadWrapperBase worker = workers[i]; + if (worker.Status == StatusState.InProgress) + { + // Fire notification event. + if (invokeContext.Created) + { + invokeContext.Invoke(new ReportWorkerProgressEventHandler(OnReportWorkerProgress), + new object[]{this, + new ReportWorkerProgressEventArgs(worker.ID, worker.Progress)}); + } + } + } + + // Pause 2 seconds before the next pass. + // You could make this variable configurable. + Thread.Sleep(TimeSpan.FromSeconds(2)); + } + } + + + public void StopAllTasks() + { + // Stop the work allocator. + allocateWork.Abort(); + // Make sure it's finished. + allocateWork.Join(); + + // Stop the tasks. + foreach (ThreadWrapperBase worker in workers) + { + worker.StopTask(); + } + } + } + + + public class ReportWorkerProgressEventArgs : EventArgs + { + private int progress; + public int Progress + { + get { return progress; } + set { progress = value; } + } + private Guid taskID; + public Guid TaskID + { + get { return taskID; } + set { taskID = value; } + } + + public ReportWorkerProgressEventArgs(Guid taskID, int progress) + { + Progress = progress; + TaskID = taskID; + } + } + + + public class WorkerCompletedEventArgs : EventArgs + { + private string primeList; + public string PrimeList + { + get { return primeList; } + set { primeList = value; } + } + + private Guid id; + public Guid ID + { + get { return id; } + set { id = value; } + } + public WorkerCompletedEventArgs(EratosthenesTask task) + { + PrimeList = task.GetResultOfLastTask(); + id = task.ID; + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/ThreadWrapperBase.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/ThreadWrapperBase.cs new file mode 100644 index 0000000..c6e9687 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/ThreadWrapperBase.cs @@ -0,0 +1,140 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +#endregion + +namespace MultithreadingWorker +{ + public enum StatusState + { + Unstarted, InProgress, Completed + } + + public abstract class ThreadWrapperBase + { + // This is the thread where the task is carried out. + private Thread thread; + + // Track the status of the task. + private StatusState status = StatusState.Unstarted; + public StatusState Status + { + get { return status; } + } + + // Use a unique ID to track the task later, if needed. + private Guid id = Guid.NewGuid(); + public Guid ID + { + get { return id; } + } + + // Start the new operation. + public void Start() + { + if (status == StatusState.InProgress) + { + throw new InvalidOperationException("Already in progress."); + } + else + { + // Initialize the new task. + status = StatusState.InProgress; + + // Create the thread and run it in the background, + // so it will terminate automatically if the application ends. + thread = new Thread(StartTaskAsync); + thread.IsBackground = true; + + // Start the thread. + thread.Start(); + } + } + + private void StartTaskAsync() + { + DoTask(); + status = StatusState.Completed; + OnCompleted(); + } + + // Override this class to supply the task logic. + protected abstract void DoTask(); + + // Override this class to supply the callback logic. + protected abstract void OnCompleted(); + + // Flag that indicates a stop is requested. + private bool requestCancel = false; + protected bool RequestCancel + { + get { return requestCancel; } + } + + // How long the thread will wait (in total) + // before aborting a thread that hasn't responded to + // the cancellation message. + // TimeSpan.Zero means polite stops are not enabled. + private TimeSpan cancelWaitTime = TimeSpan.Zero; + protected TimeSpan CancelWaitTime + { + get { return cancelWaitTime; } + set { cancelWaitTime = value; } + } + + // How often the thread checks to see if a cancellation + // message has been heeded. + private int cancelCheckInterval = 5; + protected int CancelCheckInterval + { + get { return cancelCheckInterval; } + set { cancelCheckInterval = value; } + } + + public void StopTask() + { + // Perform no operation if task isn't running. + if (status != StatusState.InProgress) return; + + // Try the polite approach. + if (cancelWaitTime != TimeSpan.Zero) + { + DateTime startTime = DateTime.Now; + while (DateTime.Now.Subtract(startTime).TotalSeconds > 0) + { + // Still waiting for the time limit to pass. + // Allow other threads to do some work. + Thread.Sleep(TimeSpan.FromSeconds(cancelCheckInterval)); + } + } + + // Use the forced approach. + thread.Abort(); + } + + // Add Pause and Resume methods here. + + private bool supportsProgress = false; + protected bool SupportsProgress + { + get { return supportsProgress; } + set { supportsProgress = value; } + } + + protected int progress; + public int Progress + { + get + { + if (!supportsProgress) + throw new InvalidOperationException("This worker does not report progess."); + else + return progress; + } + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Worker.cs b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Worker.cs new file mode 100644 index 0000000..440de99 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/Worker.cs @@ -0,0 +1,101 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; + +#endregion + +namespace MultithreadingWorker +{ + public class Worker + { + public static int[] FindPrimes(int fromNumber, int toNumber) + { + return FindPrimes(fromNumber, toNumber, null); + } + + public static int[] FindPrimes(int fromNumber, int toNumber, System.ComponentModel.BackgroundWorker backgroundWorker) + { + int[] list = new int[toNumber - fromNumber]; + + // Create an array containing all integers between the two specified numbers. + for (int i = 0; i < list.Length; i++) + { + list[i] = fromNumber; + fromNumber += 1; + } + + + //find out the module for each item in list, divided by each d, where + //d is < or == to sqrt(to) + //if the remainder is 0, the nubmer is a composite, and thus + //we mark its position with 0 in the marks array, + //otherwise the number is a prime, and thus mark it with 1 + int maxDiv = (int)Math.Floor(Math.Sqrt(toNumber)); + + int[] mark = new int[list.Length]; + + + for (int i = 0; i < list.Length; i++) + { + for (int j = 2; j <= maxDiv; j++) + { + + if ((list[i] != j) && (list[i] % j == 0)) + { + mark[i] = 1; + } + + } + + + int iteration = list.Length / 100; + if ((i % iteration == 0) && (backgroundWorker != null)) + { + if (backgroundWorker.WorkerReportsProgress) + { + //float progress = ((float)(i + 1)) / list.Length * 100; + backgroundWorker.ReportProgress(i / iteration); + //(int)Math.Round(progress)); + } + if (backgroundWorker.CancellationPending) + { + // Return without doing any more work. + return null; + } + } + + } + + //create new array that contains only the primes, and return that array + int primes = 0; + for (int i = 0; i < mark.Length; i++) + { + if (mark[i] == 0) primes += 1; + + } + + int[] ret = new int[primes]; + int curs = 0; + for (int i = 0; i < mark.Length; i++) + { + if (mark[i] == 0) + { + ret[curs] = list[i]; + curs += 1; + } + } + + if (backgroundWorker != null) + { + backgroundWorker.ReportProgress(100); + } + + return ret; + + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/bin/Debug/MultithreadingWorker.dll b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/bin/Debug/MultithreadingWorker.dll new file mode 100644 index 0000000..1ec91da Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/bin/Debug/MultithreadingWorker.dll differ diff --git a/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/bin/Release/MultithreadingWorker.dll b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/bin/Release/MultithreadingWorker.dll new file mode 100644 index 0000000..96b246d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter20/Multithreading/MultithreadingWorker/bin/Release/MultithreadingWorker.dll differ diff --git a/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapseButton.cs b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapseButton.cs new file mode 100644 index 0000000..0d1f48f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapseButton.cs @@ -0,0 +1,150 @@ +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Drawing.Imaging; +using System.Drawing.Drawing2D; +using System.Drawing.Design; +using System.Collections; +using System.ComponentModel; + +// Necessary for low level visual style API calls +using System.Windows.Forms.VisualStyles; + +// Necessary for GDI text API calls + +namespace Microsoft.Samples +{ + /// + /// Summary description for CollapseButton. + /// + public class CollapseButton : StateButtonBase + { + // Property fields + private bool collapsed; + + public CollapseButton() + { + this.SetStyle(ControlStyles.ResizeRedraw + | ControlStyles.OptimizedDoubleBuffer + | ControlStyles.SupportsTransparentBackColor, true); + + this.DoubleBuffered = true; + } + + // Properties + public bool Collapsed + { + get + { + return collapsed; + } + set + { + if (value != collapsed) + { + collapsed = value; + Invalidate(); + } + } + } + + + protected override void OnTextChanged(EventArgs e) + { + base.OnTextChanged(e); + Invalidate(); + } + + + // Methods + protected override void OnPaint(PaintEventArgs e) + { + VisualStyleRenderer renderer; + + // Paint parent background + InvokePaintBackground(this, new PaintEventArgs(e.Graphics, ClientRectangle)); + + // Paint background + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupHead.Normal); + renderer.DrawBackground(e.Graphics, new Rectangle(0, 0, e.ClipRectangle.Width, 25)); + + // Draw Text + Rectangle fontRect = new Rectangle(17, 6, this.Width - 17 - 24, this.Height); + + if ((State & StateButtonState.Pressed) != 0) + { + TextRenderer.DrawText(e.Graphics, this.Text, this.Font, fontRect, SystemColors.InactiveCaption, TextFormatFlags.Top | TextFormatFlags.Left); + } + else if ((State & StateButtonState.MouseHover) != 0) + { + TextRenderer.DrawText(e.Graphics, this.Text, this.Font, fontRect, SystemColors.InactiveCaption, TextFormatFlags.Top | TextFormatFlags.Left); + } + else if (!Enabled) + { + TextRenderer.DrawText(e.Graphics, this.Text, this.Font, fontRect, SystemColors.GrayText, TextFormatFlags.Top | TextFormatFlags.Left); + } + else + { + TextRenderer.DrawText(e.Graphics, this.Text, this.Font, fontRect, SystemColors.MenuHighlight, TextFormatFlags.Top | TextFormatFlags.Left); + } + + // Draw button + if (!collapsed) + { + // If pressed + if ((State & StateButtonState.Pressed) != 0) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupCollapse.Pressed); + } + + // If hot + else if ((State & StateButtonState.MouseHover) != 0) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupCollapse.Hot); + } + + // If disabled + else if (!Enabled) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupCollapse.Normal); + } + + // If normal + else + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupCollapse.Normal); + } + } + else + { + // If pressed + if ((State & StateButtonState.Pressed) != 0) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupExpand.Pressed); + } + + // If hot + else if ((State & StateButtonState.MouseHover) != 0) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupExpand.Hot); + } + + // If disabled + else if (!Enabled) + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupExpand.Normal); + } + + // If normal + else + { + renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupExpand.Normal); + } + } + + renderer.DrawBackground(e.Graphics, new Rectangle(this.Width - 22, 3, 20, 20)); + + base.OnPaint(e); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanel.cs b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanel.cs new file mode 100644 index 0000000..547ed27 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanel.cs @@ -0,0 +1,177 @@ +using System; +using System.Windows.Forms; +using System.Drawing; +using System.Drawing.Imaging; +using System.Drawing.Drawing2D; +using System.Drawing.Design; +using System.Collections; +using System.ComponentModel; + +// Needed for advanced visual styles scenarios +using System.Windows.Forms.VisualStyles; + +namespace Microsoft.Samples +{ + /// + /// Summary description for CollapsiblePanel. + /// + + // This disables the autodock smart tag + [Docking(DockingBehavior.Never)] + + // Set the designer + [Designer(typeof(CollapsiblePanelDesigner))] + public class CollapsiblePanel : Panel + { + // Controls + private CollapseButton button; + private Timer timer; + + // Fields + private bool collapsing; + private int oldHeight; + private int accelerator; + private bool collapsed; + + public CollapsiblePanel() + { + this.SetStyle(ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor, true); + + this.DoubleBuffered = true; + + // Setup button + button = new CollapseButton(); + button.Size = new Size(this.Width, 25); + button.Location = new Point(0, 0); + button.Font = new Font("Tahoma", 8.0f, FontStyle.Bold); + button.Dock = DockStyle.Top; + button.Click += new EventHandler(button_Click); + this.Controls.Add(button); + + // Setup timer + timer = new Timer(); + timer.Interval = 25; + timer.Tick += new EventHandler(timer_Tick); + } + + // Properties + public bool Collapsed + { + get + { + return collapsed; + } + set + { + if (collapsed != value) + { + collapsed = value; + if (collapsed) + { + PerformCollapse(); + } + else + { + PerformExpand(); + } + } + } + } + + [Browsable(true)] + public override string Text + { + get + { + return button.Text; + } + set + { + button.Text = value; + } + } + + // Methods + private void PerformCollapse() + { + collapsing = true; + SuspendLayout(); + timer.Enabled = true; + } + + private void PerformExpand() + { + collapsing = false; + SuspendLayout(); + timer.Enabled = true; + + } + + protected override void OnPaint(PaintEventArgs e) + { + // Paint parent background + InvokePaintBackground(this, new PaintEventArgs(e.Graphics, ClientRectangle)); + + // Fill the rest of the background + VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupBackground.Normal); + renderer.DrawBackground(e.Graphics, e.ClipRectangle); + + if (!timer.Enabled) + { + base.OnPaint(e); + } + } + + + protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) + { + base.SetBoundsCore(x, y, width, height, specified); + // My new code + if (!timer.Enabled && !collapsed) + { + oldHeight = Height; + } + } + + private void timer_Tick(object sender, EventArgs e) + { + if (collapsing) + { + this.Size = new Size(this.Width, this.Height - 2 - accelerator); + if (this.Height <= 25) + { + this.Size = new Size(this.Width, 25); + timer.Enabled = false; + button.Collapsed = true; + accelerator = 0; + ResumeLayout(); + } + } + else + { + this.Size = new Size(this.Width, this.Height + 2 + accelerator); + if (this.Height >= oldHeight) + { + this.Size = new Size(this.Width, oldHeight); + timer.Enabled = false; + button.Collapsed = false; + accelerator = 0; + ResumeLayout(); + } + } + accelerator++; + } + + private void button_Click(object sender, EventArgs e) + { + if (!collapsing) + { + Collapsed = true; + } + else + { + Collapsed = false; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanelActionList.cs b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanelActionList.cs new file mode 100644 index 0000000..3acf252 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanelActionList.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace Microsoft.Samples +{ + /// + /// Summary description for MyControlActionList. + /// + public class CollapsiblePanelActionList //: System.ComponentModel.Design.DesignerActionList + { + CollapsiblePanel control; + ISelectionService selectionService; + + //public CollapsiblePanelActionList(CollapsiblePanel control, ISelectionService selectionService) + //{ + // this.control = control; + // this.selectionService = selectionService; + //} + + // Proeprties + public string Text + { + get + { + return control.Text; + } + set + { + // Setting through property descriptor to enable undo support + PropertyDescriptor prop = TypeDescriptor.GetProperties(control)["Text"]; + prop.SetValue(control, value); + } + } + + // Methods + public void CollapsePanel() + { + // Setting through property descriptor to enable undo support + PropertyDescriptor prop = TypeDescriptor.GetProperties(control)["Collapsed"]; + prop.SetValue(control, true); + } + + public void ExpandPanel() + { + // Setting through property descriptor to enable undo support + PropertyDescriptor prop = TypeDescriptor.GetProperties(control)["Collapsed"]; + prop.SetValue(control, false); + } + + //public override DesignerActionItem[] GetSortedActionItems() + //{ + // DesignerActionItem[] items = new DesignerActionItem[4]; + + // items[0] = new DesignerActionHeaderItem("Behavior", "Behavior"); + // items[1] = new DesignerActionPropertyItem("Text", "Text", "Behavior", "Sets the text of the control"); + // items[2] = new DesignerActionHeaderItem("Appearance", "Appearance"); + + // if (control.Collapsed) + // { + // items[3] = new DesignerActionMethodItem(this, "ExpandPanel", "Expand Panel", "Appearance", "Expands the panel", true); + // } + // else + // { + // items[3] = new DesignerActionMethodItem(this, "CollapsePanel", "Collapse Panel", "Appearance", "Collapses the panel", true); + // } + + // return items; + //} + + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanelControl.csproj b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanelControl.csproj new file mode 100644 index 0000000..f48ca44 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanelControl.csproj @@ -0,0 +1,67 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {A442592C-F336-4824-B4C7-11B34B724693} + Library + Properties + CollapsiblePanelControl + CollapsiblePanelControl + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Component + + + Component + + + + + Component + + + + + + + StateButtonBase.cs + Designer + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanelDesigner.cs b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanelDesigner.cs new file mode 100644 index 0000000..8e942d3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/CollapsiblePanelDesigner.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Drawing.Design; +using System.Data; +using System.Windows.Forms; +using System.Windows.Forms.Design; + +// New namespace for snaplines +using System.Windows.Forms.Design.Behavior; + +namespace Microsoft.Samples +{ + /// + /// Summary description for MyControlDesigner. + /// + public class CollapsiblePanelDesigner : ParentControlDesigner + { + DesignerActionListCollection actions; + public override DesignerActionListCollection ActionLists + { + get + { + if (actions == null) + { + //actions = new DesignerActionListCollection(); + //actions.Add(new CollapsiblePanelActionList((CollapsiblePanel)Control, (ISelectionService)GetService(typeof(ISelectionService)))); + } + return actions; + } + } + + public override IList SnapLines + { + get + { + IList snapLines = base.SnapLines; + + snapLines.Add(new SnapLine(SnapLineType.Baseline, 6 + Control.Font.Height)); + return snapLines; + } + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0a5847d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("CollapsiblePanelControl")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("CollapsiblePanelControl")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("05355f49-3a29-4a60-b28d-d59f79ad2984")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/StateButtonBase.cs b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/StateButtonBase.cs new file mode 100644 index 0000000..f4c9926 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/StateButtonBase.cs @@ -0,0 +1,142 @@ +using System; +using System.Windows.Forms; +using System.ComponentModel; +using System.Drawing; + +namespace Microsoft.Samples +{ + // This class is the base for all button controls in this project. + // It contains fields so that inheriting buttons can track + // button state (normal, hover, pressed, and disabled) + public abstract class StateButtonBase : Control, IButtonControl + { + #region Fields + DialogResult dialogResult = DialogResult.None; + StateButtonState state; + #endregion + + #region Constructor + public StateButtonBase() + { + SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false); + } + #endregion + + #region Properties + protected override Size DefaultSize + { + get + { + return new Size(75, 23); + } + } + + [ + Category("Behavior"), + DefaultValue(typeof(DialogResult), "DialogResult.None"), + Description("Specifies the dialog result that this button will return when a form is closed by clicking it") + ] + public DialogResult DialogResult + { + get + { + return dialogResult; + } + set + { + dialogResult = value; + } + } + + protected StateButtonState State + { + get + { + return state; + } + } + #endregion + + #region Methods & Event Handlers + void SetState(StateButtonState setState, bool set) + { + StateButtonState newState = this.state; + if (set) + { + newState |= setState; + } + else + { + newState &= ~setState; + } + + if (this.state != newState) + { + this.state = newState; + Invalidate(); + } + } + + void IButtonControl.NotifyDefault(bool isDefault) + { + SetState(StateButtonState.Default, isDefault); + } + + public void PerformClick() + { + OnClick(EventArgs.Empty); + } + + protected override void OnMouseDown(MouseEventArgs e) + { + SetState(StateButtonState.Pressed, true); + base.OnMouseDown(e); + } + protected override void OnMouseUp(MouseEventArgs e) + { + bool click = false; + if ((State & StateButtonState.Pressed) != 0) + { + click = true; + } + SetState(StateButtonState.Pressed, false); + base.OnMouseUp(e); + + if (click) + { + Update(); + PerformClick(); + } + } + protected override void OnMouseMove(MouseEventArgs e) + { + if (Capture) + { + SetState(StateButtonState.Pressed, ClientRectangle.Contains(e.X, e.Y)); + } + base.OnMouseMove(e); + } + protected override void OnMouseEnter(EventArgs e) + { + SetState(StateButtonState.MouseHover, true); + base.OnMouseEnter(e); + } + protected override void OnMouseLeave(EventArgs e) + { + SetState(StateButtonState.MouseHover, false); + base.OnMouseLeave(e); + } + #endregion + } + + // This cenum is used for the states which a button can have + [Flags] + public enum StateButtonState + { + None = 0x00, + Pressed = 0x01, + MouseHover = 0x02, + Default = 0x04, + Disabled = 0x08, + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/StateButtonBase.resx b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/StateButtonBase.resx new file mode 100644 index 0000000..7e32396 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/StateButtonBase.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/bin/Debug/CollapsiblePanelControl.dll b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/bin/Debug/CollapsiblePanelControl.dll new file mode 100644 index 0000000..692896d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/CollapsiblePanelControl/bin/Debug/CollapsiblePanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CellSpanning.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CellSpanning.Designer.cs new file mode 100644 index 0000000..d7008a5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CellSpanning.Designer.cs @@ -0,0 +1,204 @@ +namespace DynamicLayout +{ + partial class CellSpanning + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel1.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Outset; + this.tableLayoutPanel1.ColumnCount = 4; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 32.08092F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 17.34104F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.Controls.Add(this.button1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.button2, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.button5, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.button6, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.button7, 2, 1); + this.tableLayoutPanel1.Controls.Add(this.button8, 3, 1); + this.tableLayoutPanel1.Controls.Add(this.button9, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.button10, 3, 4); + this.tableLayoutPanel1.Controls.Add(this.button3, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.button4, 0, 1); + this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 31.25F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 18.75F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 51F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(348, 249); + this.tableLayoutPanel1.TabIndex = 0; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(5, 5); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + // + // button2 + // + this.tableLayoutPanel1.SetColumnSpan(this.button2, 3); + this.button2.Dock = System.Windows.Forms.DockStyle.Fill; + this.button2.Location = new System.Drawing.Point(116, 5); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(227, 40); + this.button2.TabIndex = 1; + this.button2.Text = "ColumnSpan = 3"; + this.button2.UseVisualStyleBackColor = true; + // + // button5 + // + this.button5.Location = new System.Drawing.Point(116, 53); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(52, 23); + this.button5.TabIndex = 4; + this.button5.Text = "button5"; + this.button5.UseVisualStyleBackColor = true; + // + // button6 + // + this.button6.Location = new System.Drawing.Point(116, 101); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(52, 23); + this.button6.TabIndex = 5; + this.button6.Text = "button6"; + this.button6.UseVisualStyleBackColor = true; + // + // button7 + // + this.button7.Location = new System.Drawing.Point(5, 161); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(75, 23); + this.button7.TabIndex = 6; + this.button7.Text = "button7"; + this.button7.UseVisualStyleBackColor = true; + // + // button8 + // + this.button8.Location = new System.Drawing.Point(116, 161); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(52, 23); + this.button8.TabIndex = 7; + this.button8.Text = "button8"; + this.button8.UseVisualStyleBackColor = true; + // + // button9 + // + this.button9.Location = new System.Drawing.Point(176, 161); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(75, 23); + this.button9.TabIndex = 8; + this.button9.Text = "button9"; + this.button9.UseVisualStyleBackColor = true; + // + // button10 + // + this.button10.Dock = System.Windows.Forms.DockStyle.Fill; + this.button10.Location = new System.Drawing.Point(262, 197); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(81, 47); + this.button10.TabIndex = 9; + this.button10.Text = "Row = 4\nColumn = 3"; + this.button10.UseVisualStyleBackColor = true; + // + // button3 + // + this.tableLayoutPanel1.SetColumnSpan(this.button3, 2); + this.button3.Dock = System.Windows.Forms.DockStyle.Fill; + this.button3.Location = new System.Drawing.Point(176, 53); + this.button3.Name = "button3"; + this.tableLayoutPanel1.SetRowSpan(this.button3, 2); + this.button3.Size = new System.Drawing.Size(167, 100); + this.button3.TabIndex = 2; + this.button3.Text = "ColumnSpan = 2\nRowSpan = 2"; + this.button3.UseVisualStyleBackColor = true; + // + // button4 + // + this.button4.Dock = System.Windows.Forms.DockStyle.Fill; + this.button4.Location = new System.Drawing.Point(5, 53); + this.button4.Name = "button4"; + this.tableLayoutPanel1.SetRowSpan(this.button4, 2); + this.button4.Size = new System.Drawing.Size(103, 100); + this.button4.TabIndex = 3; + this.button4.Text = "RowSpan = 2"; + this.button4.UseVisualStyleBackColor = true; + // + // CellSpanning + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(372, 273); + this.Controls.Add(this.tableLayoutPanel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "CellSpanning"; + this.Text = "CellSpanning"; + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CellSpanning.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CellSpanning.cs new file mode 100644 index 0000000..b996b70 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CellSpanning.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicLayout +{ + public partial class CellSpanning : Form + { + public CellSpanning() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CellSpanning.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CellSpanning.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CellSpanning.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CustomLayoutEngine.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CustomLayoutEngine.Designer.cs new file mode 100644 index 0000000..da15a36 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CustomLayoutEngine.Designer.cs @@ -0,0 +1,84 @@ +namespace DynamicLayout +{ + partial class CustomLayoutEngine + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(0, 0); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(23, 51); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 1; + this.button2.Text = "button2"; + this.button2.UseVisualStyleBackColor = true; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(31, 59); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 2; + this.button3.Text = "button3"; + this.button3.UseVisualStyleBackColor = true; + // + // CustomLayoutEngine + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(423, 342); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Name = "CustomLayoutEngine"; + this.Text = "CustomLayoutEngine"; + this.Load += new System.EventHandler(this.CustomLayoutEngine_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CustomLayoutEngine.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CustomLayoutEngine.cs new file mode 100644 index 0000000..92003af --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CustomLayoutEngine.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.Layout; + +namespace DynamicLayout +{ + public partial class CustomLayoutEngine : Form + { + public CustomLayoutEngine() + { + InitializeComponent(); + } + + private void CustomLayoutEngine_Load(object sender, EventArgs e) + { + + } + + private SingleLineFlowLayoutEngine layoutEngine = null; + public override LayoutEngine LayoutEngine + { + get + { + if (layoutEngine == null) + { + layoutEngine = new SingleLineFlowLayoutEngine(20); + } + return layoutEngine; + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CustomLayoutEngine.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CustomLayoutEngine.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/CustomLayoutEngine.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/DynamicLayout.csproj b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/DynamicLayout.csproj new file mode 100644 index 0000000..eac9c66 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/DynamicLayout.csproj @@ -0,0 +1,187 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {3DD93D9C-4F25-49F1-9B6E-401CD5E093A5} + WinExe + Properties + DynamicLayout + DynamicLayout + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + ModularPortal.cs + + + Form + + + ProportionalResizing.cs + + + Form + + + CellSpanning.cs + + + Form + + + CustomLayoutEngine.cs + + + Form + + + FlowLayoutTest.cs + + + Form + + + FormsFromFile.cs + + + Form + + + HandMadeLayoutManager.cs + + + Form + + + LocalizableDialog.cs + + + Form + + + Menu.cs + + + + + Designer + ModularPortal.cs + + + ProportionalResizing.cs + Designer + + + CellSpanning.cs + Designer + + + Designer + CustomLayoutEngine.cs + + + Designer + FlowLayoutTest.cs + + + Designer + FormsFromFile.cs + + + Designer + HandMadeLayoutManager.cs + + + Designer + LocalizableDialog.cs + + + Menu.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + Designer + TableLayoutTest.cs + + + Designer + TextBoxColumn.cs + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + Form + + + TableLayoutTest.cs + + + Form + + + TextBoxColumn.cs + + + + + {A442592C-F336-4824-B4C7-11B34B724693} + CollapsiblePanelControl + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/DynamicLayout.sln b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/DynamicLayout.sln new file mode 100644 index 0000000..4bb6476 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/DynamicLayout.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamicLayout", "DynamicLayout.csproj", "{3DD93D9C-4F25-49F1-9B6E-401CD5E093A5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CollapsiblePanelControl", "..\CollapsiblePanelControl\CollapsiblePanelControl.csproj", "{A442592C-F336-4824-B4C7-11B34B724693}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3DD93D9C-4F25-49F1-9B6E-401CD5E093A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DD93D9C-4F25-49F1-9B6E-401CD5E093A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DD93D9C-4F25-49F1-9B6E-401CD5E093A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DD93D9C-4F25-49F1-9B6E-401CD5E093A5}.Release|Any CPU.Build.0 = Release|Any CPU + {A442592C-F336-4824-B4C7-11B34B724693}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A442592C-F336-4824-B4C7-11B34B724693}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A442592C-F336-4824-B4C7-11B34B724693}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A442592C-F336-4824-B4C7-11B34B724693}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/DynamicLayout.suo b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/DynamicLayout.suo new file mode 100644 index 0000000..cae7e57 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/DynamicLayout.suo differ diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FlowLayoutTest.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FlowLayoutTest.Designer.cs new file mode 100644 index 0000000..0c66a0b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FlowLayoutTest.Designer.cs @@ -0,0 +1,244 @@ +namespace DynamicLayout +{ + partial class FlowLayoutTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.chkWrap = new System.Windows.Forms.CheckBox(); + this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.lstFlowDirection = new System.Windows.Forms.ComboBox(); + this.chkAutoScroll = new System.Windows.Forms.CheckBox(); + this.flowLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // chkWrap + // + this.chkWrap.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.chkWrap.AutoSize = true; + this.chkWrap.Location = new System.Drawing.Point(12, 193); + this.chkWrap.Name = "chkWrap"; + this.chkWrap.Size = new System.Drawing.Size(155, 17); + this.chkWrap.TabIndex = 3; + this.chkWrap.Text = "Wrap the FlowLayoutPanel"; + this.chkWrap.CheckedChanged += new System.EventHandler(this.chkWrap_CheckedChanged); + // + // flowLayoutPanel1 + // + this.flowLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.flowLayoutPanel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.flowLayoutPanel1.Controls.Add(this.button1); + this.flowLayoutPanel1.Controls.Add(this.button2); + this.flowLayoutPanel1.Controls.Add(this.button3); + this.flowLayoutPanel1.Controls.Add(this.button4); + this.flowLayoutPanel1.Controls.Add(this.button5); + this.flowLayoutPanel1.Controls.Add(this.button6); + this.flowLayoutPanel1.Controls.Add(this.button7); + this.flowLayoutPanel1.Controls.Add(this.button8); + this.flowLayoutPanel1.Controls.Add(this.button9); + this.flowLayoutPanel1.Controls.Add(this.button10); + this.flowLayoutPanel1.Location = new System.Drawing.Point(12, 12); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + this.flowLayoutPanel1.Size = new System.Drawing.Size(317, 142); + this.flowLayoutPanel1.TabIndex = 2; + this.flowLayoutPanel1.WrapContents = false; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(3, 3); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 43); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(84, 3); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 43); + this.button2.TabIndex = 1; + this.button2.Text = "button2"; + this.button2.UseVisualStyleBackColor = true; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(165, 3); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 43); + this.button3.TabIndex = 2; + this.button3.Text = "button3"; + this.button3.UseVisualStyleBackColor = true; + // + // button4 + // + this.button4.Location = new System.Drawing.Point(246, 3); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(75, 43); + this.button4.TabIndex = 3; + this.button4.Text = "button4"; + this.button4.UseVisualStyleBackColor = true; + // + // button5 + // + this.button5.Location = new System.Drawing.Point(327, 3); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(75, 43); + this.button5.TabIndex = 4; + this.button5.Text = "button5"; + this.button5.UseVisualStyleBackColor = true; + // + // button6 + // + this.button6.Location = new System.Drawing.Point(408, 3); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(75, 43); + this.button6.TabIndex = 5; + this.button6.Text = "button6"; + this.button6.UseVisualStyleBackColor = true; + // + // button7 + // + this.button7.Location = new System.Drawing.Point(489, 3); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(75, 43); + this.button7.TabIndex = 6; + this.button7.Text = "button7"; + this.button7.UseVisualStyleBackColor = true; + // + // button8 + // + this.button8.Location = new System.Drawing.Point(570, 3); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(75, 43); + this.button8.TabIndex = 7; + this.button8.Text = "button8"; + this.button8.UseVisualStyleBackColor = true; + // + // button9 + // + this.button9.Location = new System.Drawing.Point(651, 3); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(75, 43); + this.button9.TabIndex = 8; + this.button9.Text = "button9"; + this.button9.UseVisualStyleBackColor = true; + // + // button10 + // + this.button10.Location = new System.Drawing.Point(732, 3); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(75, 43); + this.button10.TabIndex = 9; + this.button10.Text = "button10"; + this.button10.UseVisualStyleBackColor = true; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(9, 220); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(78, 13); + this.label1.TabIndex = 4; + this.label1.Text = "Flow Direction:"; + // + // lstFlowDirection + // + this.lstFlowDirection.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.lstFlowDirection.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.lstFlowDirection.FormattingEnabled = true; + this.lstFlowDirection.Location = new System.Drawing.Point(92, 216); + this.lstFlowDirection.Name = "lstFlowDirection"; + this.lstFlowDirection.Size = new System.Drawing.Size(121, 21); + this.lstFlowDirection.TabIndex = 5; + this.lstFlowDirection.SelectedIndexChanged += new System.EventHandler(this.lstFlowDirection_SelectedIndexChanged); + // + // chkAutoScroll + // + this.chkAutoScroll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.chkAutoScroll.AutoSize = true; + this.chkAutoScroll.Location = new System.Drawing.Point(12, 170); + this.chkAutoScroll.Name = "chkAutoScroll"; + this.chkAutoScroll.Size = new System.Drawing.Size(177, 17); + this.chkAutoScroll.TabIndex = 6; + this.chkAutoScroll.Text = "AutoScroll the FlowLayoutPanel"; + this.chkAutoScroll.CheckedChanged += new System.EventHandler(this.chkAutoScroll_CheckedChanged); + // + // FlowLayoutTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(341, 257); + this.Controls.Add(this.chkAutoScroll); + this.Controls.Add(this.lstFlowDirection); + this.Controls.Add(this.label1); + this.Controls.Add(this.chkWrap); + this.Controls.Add(this.flowLayoutPanel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "FlowLayoutTest"; + this.Text = "FlowLayoutTest"; + this.Load += new System.EventHandler(this.FlowLayoutTest_Load); + this.flowLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.CheckBox chkWrap; + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox lstFlowDirection; + + private System.Windows.Forms.CheckBox chkAutoScroll; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FlowLayoutTest.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FlowLayoutTest.cs new file mode 100644 index 0000000..a675b93 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FlowLayoutTest.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicLayout +{ + public partial class FlowLayoutTest : Form + { + public FlowLayoutTest() + { + InitializeComponent(); + } + + private void FlowLayoutTest_Load(object sender, EventArgs e) + { + lstFlowDirection.Items.AddRange(Enum.GetNames(typeof(FlowDirection))); + lstFlowDirection.Text = flowLayoutPanel1.FlowDirection.ToString(); + } + + private void lstFlowDirection_SelectedIndexChanged(object sender, EventArgs e) + { + if (lstFlowDirection.SelectedIndex != -1) + { + flowLayoutPanel1.FlowDirection = + (FlowDirection)Enum.Parse(typeof(FlowDirection), lstFlowDirection.Text); + } + } + + private void chkWrap_CheckedChanged(object sender, EventArgs e) + { + flowLayoutPanel1.WrapContents = chkWrap.Checked; + } + + private void chkAutoScroll_CheckedChanged(object sender, EventArgs e) + { + flowLayoutPanel1.AutoScroll = chkAutoScroll.Checked; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FlowLayoutTest.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FlowLayoutTest.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FlowLayoutTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FormsFromFile.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FormsFromFile.Designer.cs new file mode 100644 index 0000000..054bb83 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FormsFromFile.Designer.cs @@ -0,0 +1,150 @@ +namespace DynamicLayout +{ + partial class FormsFromFile + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); + this.pnlScroll = new System.Windows.Forms.Panel(); + this.pnlForm = new System.Windows.Forms.TableLayoutPanel(); + this.cmdBrowse = new System.Windows.Forms.Button(); + this.txtFileName = new System.Windows.Forms.TextBox(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.panel1.SuspendLayout(); + this.SuspendLayout(); + // + // openFileDialog + // + this.openFileDialog.Filter = "Form Files|*.frm"; + // + // pnlScroll + // + this.pnlScroll.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlScroll.AutoScroll = true; + this.pnlScroll.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.pnlScroll.Location = new System.Drawing.Point(0, 0); + this.pnlScroll.Name = "pnlScroll"; + this.pnlScroll.Size = new System.Drawing.Size(200, 100); + this.pnlScroll.TabIndex = 0; + // + // pnlForm + // + this.pnlForm.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlForm.AutoSize = true; + this.pnlForm.ColumnCount = 1; + this.pnlForm.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.pnlForm.Location = new System.Drawing.Point(0, 0); + this.pnlForm.Name = "pnlForm"; + this.pnlForm.RowCount = 1; + this.pnlForm.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.pnlForm.Size = new System.Drawing.Size(200, 100); + this.pnlForm.TabIndex = 0; + // + // cmdBrowse + // + this.cmdBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cmdBrowse.Location = new System.Drawing.Point(445, 13); + this.cmdBrowse.Name = "cmdBrowse"; + this.cmdBrowse.Size = new System.Drawing.Size(98, 23); + this.cmdBrowse.TabIndex = 5; + this.cmdBrowse.Text = "Browse..."; + this.cmdBrowse.Click += new System.EventHandler(this.cmdBrowse_Click); + // + // txtFileName + // + this.txtFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtFileName.Location = new System.Drawing.Point(15, 13); + this.txtFileName.Multiline = true; + this.txtFileName.Name = "txtFileName"; + this.txtFileName.ReadOnly = true; + this.txtFileName.Size = new System.Drawing.Size(423, 23); + this.txtFileName.TabIndex = 4; + this.txtFileName.WordWrap = false; + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.AutoScroll = true; + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.Controls.Add(this.tableLayoutPanel1); + this.panel1.Location = new System.Drawing.Point(15, 42); + this.panel1.Name = "panel1"; + this.panel1.Padding = new System.Windows.Forms.Padding(5); + this.panel1.Size = new System.Drawing.Size(528, 304); + this.panel1.TabIndex = 6; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel1.AutoSize = true; + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Location = new System.Drawing.Point(5, 5); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 1; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.Size = new System.Drawing.Size(511, 204); + this.tableLayoutPanel1.TabIndex = 0; + // + // FormsFromFile + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(555, 369); + this.Controls.Add(this.panel1); + this.Controls.Add(this.cmdBrowse); + this.Controls.Add(this.txtFileName); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "FormsFromFile"; + this.Text = "FormsFromFile"; + this.Load += new System.EventHandler(this.FormsFromFile_Load); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.OpenFileDialog openFileDialog; + private System.Windows.Forms.Panel pnlScroll; + private System.Windows.Forms.TableLayoutPanel pnlForm; + private System.Windows.Forms.Button cmdBrowse; + private System.Windows.Forms.TextBox txtFileName; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FormsFromFile.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FormsFromFile.cs new file mode 100644 index 0000000..6b73821 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FormsFromFile.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicLayout +{ + public partial class FormsFromFile : Form + { + public FormsFromFile() + { + InitializeComponent(); + } + + private void FormsFromFile_Load(object sender, EventArgs e) + { + openFileDialog.InitialDirectory = Application.StartupPath; + } + + private void cmdBrowse_Click(object sender, EventArgs e) + { + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + txtFileName.Text = openFileDialog.FileName; + SurveyDeserializer surveyReader = new SurveyDeserializer(openFileDialog.FileName, tableLayoutPanel1); + tableLayoutPanel1.SuspendLayout(); + surveyReader.LoadForm(); + tableLayoutPanel1.ResumeLayout(); + } + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FormsFromFile.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FormsFromFile.resx new file mode 100644 index 0000000..f901ebb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/FormsFromFile.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/HandMadeLayoutManager.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/HandMadeLayoutManager.Designer.cs new file mode 100644 index 0000000..8737d7c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/HandMadeLayoutManager.Designer.cs @@ -0,0 +1,88 @@ +namespace DynamicLayout +{ + partial class HandMadeLayoutManager + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.tabControl1.SuspendLayout(); + this.SuspendLayout(); + // + // tabControl1 + // + this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Location = new System.Drawing.Point(12, 12); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size(332, 302); + this.tabControl1.TabIndex = 2; + // + // tabPage1 + // + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Size = new System.Drawing.Size(324, 276); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "TabPage1"; + // + // tabPage2 + // + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Size = new System.Drawing.Size(324, 276); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "TabPage2"; + this.tabPage2.Visible = false; + // + // HandMadeLayoutManager + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(356, 326); + this.Controls.Add(this.tabControl1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "HandMadeLayoutManager"; + this.Text = "HandMadeLayoutManager"; + this.Load += new System.EventHandler(this.HandMadeLayoutManager_Load); + this.tabControl1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + internal System.Windows.Forms.TabControl tabControl1; + internal System.Windows.Forms.TabPage tabPage1; + internal System.Windows.Forms.TabPage tabPage2; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/HandMadeLayoutManager.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/HandMadeLayoutManager.cs new file mode 100644 index 0000000..bb321c3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/HandMadeLayoutManager.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicLayout +{ + public partial class HandMadeLayoutManager : Form + { + public HandMadeLayoutManager() + { + InitializeComponent(); + } + + private void HandMadeLayoutManager_Load(object sender, EventArgs e) + { + // Create and attach the layout manager. + SingleLineFlowLayoutManager layoutManager = + new SingleLineFlowLayoutManager(tabPage1, 20); + + tabPage1.SuspendLayout(); + // Add 10 sample checkboxes. + CheckBox chkbox; + + for (int i = 1; i < 11; i++) + { + chkbox = new CheckBox(); + chkbox.Name = "checkBox" + i.ToString(); + chkbox.Text = "Setting " + i.ToString(); + tabPage1.Controls.Add(chkbox); + } + tabPage1.ResumeLayout(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/HandMadeLayoutManager.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/HandMadeLayoutManager.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/HandMadeLayoutManager.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/LocalizableDialog.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/LocalizableDialog.Designer.cs new file mode 100644 index 0000000..bdff45b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/LocalizableDialog.Designer.cs @@ -0,0 +1,168 @@ +namespace DynamicLayout +{ + partial class LocalizableDialog + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.optLong = new System.Windows.Forms.RadioButton(); + this.optShort = new System.Windows.Forms.RadioButton(); + this.tableLayoutPanel1.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.AutoSize = true; + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Controls.Add(this.button3, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.button2, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.button1, 0, 0); + this.tableLayoutPanel1.Location = new System.Drawing.Point(230, 12); + this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(10); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(100, 90); + this.tableLayoutPanel1.TabIndex = 0; + // + // button1 + // + this.button1.AutoSize = true; + this.button1.Dock = System.Windows.Forms.DockStyle.Fill; + this.button1.Location = new System.Drawing.Point(3, 3); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(94, 24); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.AutoSize = true; + this.button2.Dock = System.Windows.Forms.DockStyle.Fill; + this.button2.Location = new System.Drawing.Point(3, 33); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(94, 24); + this.button2.TabIndex = 1; + this.button2.Text = "button2"; + this.button2.UseVisualStyleBackColor = true; + // + // button3 + // + this.button3.AutoSize = true; + this.button3.Dock = System.Windows.Forms.DockStyle.Fill; + this.button3.Location = new System.Drawing.Point(3, 63); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(94, 24); + this.button3.TabIndex = 2; + this.button3.Text = "button3"; + this.button3.UseVisualStyleBackColor = true; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(12, 12); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(202, 242); + this.textBox1.TabIndex = 1; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.optShort); + this.groupBox1.Controls.Add(this.optLong); + this.groupBox1.Location = new System.Drawing.Point(230, 115); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(100, 100); + this.groupBox1.TabIndex = 2; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Choose Text"; + // + // optLong + // + this.optLong.AutoSize = true; + this.optLong.Location = new System.Drawing.Point(15, 29); + this.optLong.Name = "optLong"; + this.optLong.Size = new System.Drawing.Size(49, 17); + this.optLong.TabIndex = 3; + this.optLong.Text = "Long"; + this.optLong.UseVisualStyleBackColor = true; + this.optLong.CheckedChanged += new System.EventHandler(this.optLong_CheckedChanged); + // + // optShort + // + this.optShort.AutoSize = true; + this.optShort.Checked = true; + this.optShort.Location = new System.Drawing.Point(15, 52); + this.optShort.Name = "optShort"; + this.optShort.Size = new System.Drawing.Size(50, 17); + this.optShort.TabIndex = 4; + this.optShort.TabStop = true; + this.optShort.Text = "Short"; + this.optShort.UseVisualStyleBackColor = true; + this.optShort.CheckedChanged += new System.EventHandler(this.optShort_CheckedChanged); + // + // LocalizableDialog + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.ClientSize = new System.Drawing.Size(346, 266); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.tableLayoutPanel1); + this.Name = "LocalizableDialog"; + this.Text = "LocalizableDialog"; + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.RadioButton optShort; + private System.Windows.Forms.RadioButton optLong; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/LocalizableDialog.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/LocalizableDialog.cs new file mode 100644 index 0000000..625f99d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/LocalizableDialog.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicLayout +{ + public partial class LocalizableDialog : Form + { + public LocalizableDialog() + { + InitializeComponent(); + } + + private void optShort_CheckedChanged(object sender, EventArgs e) + { + button2.Text = "button2"; + } + + private void optLong_CheckedChanged(object sender, EventArgs e) + { + button2.Text = "This is the much longer text string."; + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/LocalizableDialog.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/LocalizableDialog.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/LocalizableDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Menu.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Menu.cs new file mode 100644 index 0000000..16fb3ea --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Menu.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace DynamicLayout +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("DynamicLayout." + ctrl.Text); + frm.ShowDialog(); + } + + private void Menu_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Menu.designer.cs new file mode 100644 index 0000000..fd2fd75 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Menu.designer.cs @@ -0,0 +1,171 @@ +namespace DynamicLayout +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 7); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(144, 23); + this.button1.TabIndex = 0; + this.button1.Text = "HandMadeLayoutManager"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button11 + // + this.button11.Location = new System.Drawing.Point(12, 33); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(144, 23); + this.button11.TabIndex = 10; + this.button11.Text = "FlowLayoutTest"; + this.button11.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 59); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(144, 23); + this.button2.TabIndex = 11; + this.button2.Text = "TableLayoutTest"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(13, 85); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(144, 23); + this.button3.TabIndex = 12; + this.button3.Text = "CellSpanning"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(13, 111); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(144, 23); + this.button4.TabIndex = 13; + this.button4.Text = "LocalizableDialog"; + this.button4.Click += new System.EventHandler(this.cmd_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(12, 138); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(144, 23); + this.button5.TabIndex = 14; + this.button5.Text = "ProportionalResizing"; + this.button5.Click += new System.EventHandler(this.cmd_Click); + // + // button6 + // + this.button6.Location = new System.Drawing.Point(12, 167); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(144, 23); + this.button6.TabIndex = 15; + this.button6.Text = "TextBoxColumn"; + this.button6.Click += new System.EventHandler(this.cmd_Click); + // + // button7 + // + this.button7.Location = new System.Drawing.Point(12, 196); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(144, 23); + this.button7.TabIndex = 16; + this.button7.Text = "FormsFromFile"; + this.button7.Click += new System.EventHandler(this.cmd_Click); + // + // button8 + // + this.button8.Location = new System.Drawing.Point(12, 225); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(144, 23); + this.button8.TabIndex = 17; + this.button8.Text = "CustomLayoutEngine"; + this.button8.Click += new System.EventHandler(this.cmd_Click); + // + // button9 + // + this.button9.Location = new System.Drawing.Point(12, 254); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(144, 23); + this.button9.TabIndex = 18; + this.button9.Text = "ModularPortal"; + this.button9.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(170, 297); + this.Controls.Add(this.button9); + this.Controls.Add(this.button8); + this.Controls.Add(this.button7); + this.Controls.Add(this.button6); + this.Controls.Add(this.button5); + this.Controls.Add(this.button4); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button11); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.Load += new System.EventHandler(this.Menu_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button9; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Menu.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ModularPortal.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ModularPortal.Designer.cs new file mode 100644 index 0000000..335b101 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ModularPortal.Designer.cs @@ -0,0 +1,385 @@ +namespace DynamicLayout +{ + partial class ModularPortal + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); + this.collapsiblePanel1 = new Microsoft.Samples.CollapsiblePanel(); + this.collapsiblePanel3 = new Microsoft.Samples.CollapsiblePanel(); + this.collapsiblePanel4 = new Microsoft.Samples.CollapsiblePanel(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.lstModules = new System.Windows.Forms.CheckedListBox(); + this.webBrowser1 = new System.Windows.Forms.WebBrowser(); + this.collapsiblePanel2 = new Microsoft.Samples.CollapsiblePanel(); + this.webBrowser2 = new System.Windows.Forms.WebBrowser(); + this.panel1 = new System.Windows.Forms.Panel(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.checkBox5 = new System.Windows.Forms.CheckBox(); + this.checkBox6 = new System.Windows.Forms.CheckBox(); + this.checkBox7 = new System.Windows.Forms.CheckBox(); + this.checkBox8 = new System.Windows.Forms.CheckBox(); + this.checkBox9 = new System.Windows.Forms.CheckBox(); + this.checkBox10 = new System.Windows.Forms.CheckBox(); + this.checkBox11 = new System.Windows.Forms.CheckBox(); + this.checkBox12 = new System.Windows.Forms.CheckBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.flowLayoutPanel1.SuspendLayout(); + this.collapsiblePanel1.SuspendLayout(); + this.collapsiblePanel3.SuspendLayout(); + this.collapsiblePanel4.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.collapsiblePanel2.SuspendLayout(); + this.panel1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // flowLayoutPanel1 + // + this.flowLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.flowLayoutPanel1.AutoScroll = true; + this.flowLayoutPanel1.Controls.Add(this.collapsiblePanel4); + this.flowLayoutPanel1.Controls.Add(this.collapsiblePanel1); + this.flowLayoutPanel1.Controls.Add(this.collapsiblePanel3); + this.flowLayoutPanel1.Controls.Add(this.collapsiblePanel2); + this.flowLayoutPanel1.Location = new System.Drawing.Point(7, 91); + this.flowLayoutPanel1.Name = "flowLayoutPanel1"; + this.flowLayoutPanel1.Size = new System.Drawing.Size(667, 463); + this.flowLayoutPanel1.TabIndex = 0; + // + // collapsiblePanel1 + // + this.collapsiblePanel1.Collapsed = false; + this.collapsiblePanel1.Controls.Add(this.panel1); + this.collapsiblePanel1.Location = new System.Drawing.Point(321, 3); + this.collapsiblePanel1.Name = "collapsiblePanel1"; + this.collapsiblePanel1.Size = new System.Drawing.Size(311, 239); + this.collapsiblePanel1.TabIndex = 0; + this.collapsiblePanel1.Text = "PreferencePanel"; + // + // collapsiblePanel3 + // + this.collapsiblePanel3.Collapsed = false; + this.collapsiblePanel3.Controls.Add(this.panel2); + this.collapsiblePanel3.Location = new System.Drawing.Point(3, 251); + this.collapsiblePanel3.Name = "collapsiblePanel3"; + this.collapsiblePanel3.Size = new System.Drawing.Size(200, 242); + this.collapsiblePanel3.TabIndex = 3; + this.collapsiblePanel3.Text = "InfoPanel"; + // + // collapsiblePanel4 + // + this.collapsiblePanel4.Collapsed = false; + this.collapsiblePanel4.Controls.Add(this.webBrowser1); + this.collapsiblePanel4.Location = new System.Drawing.Point(3, 3); + this.collapsiblePanel4.Name = "collapsiblePanel4"; + this.collapsiblePanel4.Size = new System.Drawing.Size(312, 242); + this.collapsiblePanel4.TabIndex = 4; + this.collapsiblePanel4.Text = "WebPanel"; + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.Controls.Add(this.lstModules); + this.groupBox1.Location = new System.Drawing.Point(7, 5); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(404, 80); + this.groupBox1.TabIndex = 1; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Loaded Modules"; + // + // lstModules + // + this.lstModules.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstModules.FormattingEnabled = true; + this.lstModules.Location = new System.Drawing.Point(12, 19); + this.lstModules.MultiColumn = true; + this.lstModules.Name = "lstModules"; + this.lstModules.Size = new System.Drawing.Size(378, 52); + this.lstModules.TabIndex = 0; + this.lstModules.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.lstModules_ItemCheck); + // + // webBrowser1 + // + this.webBrowser1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.webBrowser1.Location = new System.Drawing.Point(3, 27); + this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20); + this.webBrowser1.Name = "webBrowser1"; + this.webBrowser1.Size = new System.Drawing.Size(305, 212); + this.webBrowser1.TabIndex = 1; + this.webBrowser1.Url = new System.Uri("http://www.google.ca", System.UriKind.Absolute); + // + // collapsiblePanel2 + // + this.collapsiblePanel2.Collapsed = false; + this.collapsiblePanel2.Controls.Add(this.webBrowser2); + this.collapsiblePanel2.Location = new System.Drawing.Point(209, 251); + this.collapsiblePanel2.Name = "collapsiblePanel2"; + this.collapsiblePanel2.Size = new System.Drawing.Size(423, 242); + this.collapsiblePanel2.TabIndex = 5; + this.collapsiblePanel2.Text = "HelpPanel"; + // + // webBrowser2 + // + this.webBrowser2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.webBrowser2.Location = new System.Drawing.Point(3, 27); + this.webBrowser2.MinimumSize = new System.Drawing.Size(20, 20); + this.webBrowser2.Name = "webBrowser2"; + this.webBrowser2.Size = new System.Drawing.Size(416, 212); + this.webBrowser2.TabIndex = 1; + this.webBrowser2.Url = new System.Uri("http://msdn.microsoft.com", System.UriKind.Absolute); + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.BackColor = System.Drawing.Color.White; + this.panel1.Controls.Add(this.checkBox7); + this.panel1.Controls.Add(this.checkBox8); + this.panel1.Controls.Add(this.checkBox9); + this.panel1.Controls.Add(this.checkBox10); + this.panel1.Controls.Add(this.checkBox11); + this.panel1.Controls.Add(this.checkBox12); + this.panel1.Controls.Add(this.checkBox6); + this.panel1.Controls.Add(this.checkBox5); + this.panel1.Controls.Add(this.checkBox4); + this.panel1.Controls.Add(this.checkBox3); + this.panel1.Controls.Add(this.checkBox2); + this.panel1.Controls.Add(this.checkBox1); + this.panel1.Location = new System.Drawing.Point(8, 29); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(293, 206); + this.panel1.TabIndex = 1; + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(19, 17); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(77, 17); + this.checkBox1.TabIndex = 0; + this.checkBox1.Text = "checkBox1"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // checkBox2 + // + this.checkBox2.AutoSize = true; + this.checkBox2.Location = new System.Drawing.Point(19, 40); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.Size = new System.Drawing.Size(77, 17); + this.checkBox2.TabIndex = 1; + this.checkBox2.Text = "checkBox2"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // checkBox3 + // + this.checkBox3.AutoSize = true; + this.checkBox3.Location = new System.Drawing.Point(19, 63); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.Size = new System.Drawing.Size(77, 17); + this.checkBox3.TabIndex = 2; + this.checkBox3.Text = "checkBox3"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // checkBox4 + // + this.checkBox4.AutoSize = true; + this.checkBox4.Location = new System.Drawing.Point(19, 86); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.Size = new System.Drawing.Size(77, 17); + this.checkBox4.TabIndex = 3; + this.checkBox4.Text = "checkBox4"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // checkBox5 + // + this.checkBox5.AutoSize = true; + this.checkBox5.Location = new System.Drawing.Point(19, 109); + this.checkBox5.Name = "checkBox5"; + this.checkBox5.Size = new System.Drawing.Size(77, 17); + this.checkBox5.TabIndex = 4; + this.checkBox5.Text = "checkBox5"; + this.checkBox5.UseVisualStyleBackColor = true; + // + // checkBox6 + // + this.checkBox6.AutoSize = true; + this.checkBox6.Location = new System.Drawing.Point(19, 132); + this.checkBox6.Name = "checkBox6"; + this.checkBox6.Size = new System.Drawing.Size(77, 17); + this.checkBox6.TabIndex = 5; + this.checkBox6.Text = "checkBox6"; + this.checkBox6.UseVisualStyleBackColor = true; + // + // checkBox7 + // + this.checkBox7.AutoSize = true; + this.checkBox7.Location = new System.Drawing.Point(124, 132); + this.checkBox7.Name = "checkBox7"; + this.checkBox7.Size = new System.Drawing.Size(77, 17); + this.checkBox7.TabIndex = 11; + this.checkBox7.Text = "checkBox7"; + this.checkBox7.UseVisualStyleBackColor = true; + // + // checkBox8 + // + this.checkBox8.AutoSize = true; + this.checkBox8.Location = new System.Drawing.Point(124, 109); + this.checkBox8.Name = "checkBox8"; + this.checkBox8.Size = new System.Drawing.Size(77, 17); + this.checkBox8.TabIndex = 10; + this.checkBox8.Text = "checkBox8"; + this.checkBox8.UseVisualStyleBackColor = true; + // + // checkBox9 + // + this.checkBox9.AutoSize = true; + this.checkBox9.Location = new System.Drawing.Point(124, 86); + this.checkBox9.Name = "checkBox9"; + this.checkBox9.Size = new System.Drawing.Size(77, 17); + this.checkBox9.TabIndex = 9; + this.checkBox9.Text = "checkBox9"; + this.checkBox9.UseVisualStyleBackColor = true; + // + // checkBox10 + // + this.checkBox10.AutoSize = true; + this.checkBox10.Location = new System.Drawing.Point(124, 63); + this.checkBox10.Name = "checkBox10"; + this.checkBox10.Size = new System.Drawing.Size(83, 17); + this.checkBox10.TabIndex = 8; + this.checkBox10.Text = "checkBox10"; + this.checkBox10.UseVisualStyleBackColor = true; + // + // checkBox11 + // + this.checkBox11.AutoSize = true; + this.checkBox11.Location = new System.Drawing.Point(124, 40); + this.checkBox11.Name = "checkBox11"; + this.checkBox11.Size = new System.Drawing.Size(83, 17); + this.checkBox11.TabIndex = 7; + this.checkBox11.Text = "checkBox11"; + this.checkBox11.UseVisualStyleBackColor = true; + // + // checkBox12 + // + this.checkBox12.AutoSize = true; + this.checkBox12.Location = new System.Drawing.Point(124, 17); + this.checkBox12.Name = "checkBox12"; + this.checkBox12.Size = new System.Drawing.Size(83, 17); + this.checkBox12.TabIndex = 6; + this.checkBox12.Text = "checkBox12"; + this.checkBox12.UseVisualStyleBackColor = true; + // + // panel2 + // + this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel2.BackColor = System.Drawing.Color.White; + this.panel2.Controls.Add(this.label1); + this.panel2.Location = new System.Drawing.Point(5, 31); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(188, 201); + this.panel2.TabIndex = 2; + // + // label1 + // + this.label1.Location = new System.Drawing.Point(17, 20); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(132, 133); + this.label1.TabIndex = 0; + this.label1.Text = "Lorum ipsum dolorum. Lorum ipsum dolorum. Lorum ipsum dolorum. Lorum ipsum doloru" + + "m."; + // + // ModularPortal + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.AliceBlue; + this.ClientSize = new System.Drawing.Size(674, 554); + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.flowLayoutPanel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "ModularPortal"; + this.Text = "ModularPortal"; + this.Load += new System.EventHandler(this.ModularPortal_Load); + this.flowLayoutPanel1.ResumeLayout(false); + this.collapsiblePanel1.ResumeLayout(false); + this.collapsiblePanel3.ResumeLayout(false); + this.collapsiblePanel4.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.collapsiblePanel2.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; + private Microsoft.Samples.CollapsiblePanel collapsiblePanel1; + private Microsoft.Samples.CollapsiblePanel collapsiblePanel3; + private Microsoft.Samples.CollapsiblePanel collapsiblePanel4; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.CheckedListBox lstModules; + private System.Windows.Forms.WebBrowser webBrowser1; + private Microsoft.Samples.CollapsiblePanel collapsiblePanel2; + private System.Windows.Forms.WebBrowser webBrowser2; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.CheckBox checkBox7; + private System.Windows.Forms.CheckBox checkBox8; + private System.Windows.Forms.CheckBox checkBox9; + private System.Windows.Forms.CheckBox checkBox10; + private System.Windows.Forms.CheckBox checkBox11; + private System.Windows.Forms.CheckBox checkBox12; + private System.Windows.Forms.CheckBox checkBox6; + private System.Windows.Forms.CheckBox checkBox5; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ModularPortal.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ModularPortal.cs new file mode 100644 index 0000000..b6e46d3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ModularPortal.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicLayout +{ + public partial class ModularPortal : Form + { + public ModularPortal() + { + InitializeComponent(); + } + + private void ModularPortal_Load(object sender, EventArgs e) + { + + foreach (Control ctrl in flowLayoutPanel1.Controls) + { + if (ctrl is Panel) + lstModules.Items.Add(ctrl.Text, true); + + } + } + + private void lstModules_ItemCheck(object sender, ItemCheckEventArgs e) + { + foreach (Control ctrl in flowLayoutPanel1.Controls) + { + if (ctrl.Text == lstModules.Text) + { + if (e.NewValue == CheckState.Checked) + { + ctrl.Visible = true; + } + else + { + ctrl.Visible = false; + } + + return; + } + } + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ModularPortal.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ModularPortal.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ModularPortal.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Program.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Program.cs new file mode 100644 index 0000000..8e473d4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DynamicLayout +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f5fa3d6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DynamicLayout")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DynamicLayout")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b1da47a2-b1a6-425e-bd95-967271912933")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Resources.Designer.cs new file mode 100644 index 0000000..471d305 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.7 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DynamicLayout.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DynamicLayout.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Settings.Designer.cs new file mode 100644 index 0000000..9f6b90f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.7 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DynamicLayout.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ProportionalResizing.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ProportionalResizing.cs new file mode 100644 index 0000000..de5255e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ProportionalResizing.cs @@ -0,0 +1,22 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +#endregion + +namespace DynamicLayout +{ + partial class ProportionalResizing : Form + { + public ProportionalResizing() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ProportionalResizing.designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ProportionalResizing.designer.cs new file mode 100644 index 0000000..3046638 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ProportionalResizing.designer.cs @@ -0,0 +1,109 @@ +namespace DynamicLayout +{ + partial class ProportionalResizing + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Node1"); + System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("Node2"); + System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Node0", new System.Windows.Forms.TreeNode[] { + treeNode4, + treeNode5}); + System.Windows.Forms.ListViewItem listViewItem3 = new System.Windows.Forms.ListViewItem("Item1"); + System.Windows.Forms.ListViewItem listViewItem4 = new System.Windows.Forms.ListViewItem("Item2"); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.treeView1 = new System.Windows.Forms.TreeView(); + this.listView1 = new System.Windows.Forms.ListView(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Controls.Add(this.treeView1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.listView1, 1, 0); + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 1; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(257, 136); + this.tableLayoutPanel1.TabIndex = 0; + // + // treeView1 + // + this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeView1.Location = new System.Drawing.Point(3, 3); + this.treeView1.Name = "treeView1"; + treeNode4.Name = "Node1"; + treeNode4.Text = "Node1"; + treeNode5.Name = "Node2"; + treeNode5.Text = "Node2"; + treeNode6.Name = "Node0"; + treeNode6.Text = "Node0"; + this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { + treeNode6}); + this.treeView1.Scrollable = false; + this.treeView1.Size = new System.Drawing.Size(122, 130); + this.treeView1.TabIndex = 1; + // + // listView1 + // + this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + listViewItem3, + listViewItem4}); + this.listView1.Location = new System.Drawing.Point(131, 3); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(123, 130); + this.listView1.TabIndex = 3; + // + // BiPaneProportionalResize + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(263, 151); + this.Controls.Add(this.tableLayoutPanel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "BiPaneProportionalResize"; + this.Text = "Bi-Pane Proportional Resize"; + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.TreeView treeView1; + private System.Windows.Forms.ListView listView1; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ProportionalResizing.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ProportionalResizing.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/ProportionalResizing.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/SingleLineFlowLayoutEngine.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/SingleLineFlowLayoutEngine.cs new file mode 100644 index 0000000..40284ec --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/SingleLineFlowLayoutEngine.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.Layout; +using System.Drawing; + +namespace DynamicLayout +{ + public class SingleLineFlowLayoutEngine : LayoutEngine + { + private int margin; + public int Margin + { + get { return margin; } + set + { + margin = value; + if (parent != null) + base.Layout(parent, new LayoutEventArgs(parent, "Margin")); + } + } + public SingleLineFlowLayoutEngine(int margin) + { + Margin = margin; + } + + + private Control parent; + + // You could choose to take other properties into account + // (like parent's padding, and the margins or anchor settings + // of each child control). + public override bool Layout(object container, LayoutEventArgs layoutEventArgs) + { + parent = container as Control; + + int y = 0; + foreach (Control ctrl in parent.Controls) + { + y += Margin; + + // For maximum efficiency, set the + // size and location in one step through + // the Bounds property. + ctrl.Bounds = new Rectangle(Margin, y, + parent.Width - Margin*2, Margin); + } + + // Return true if the layout should be performed again + // by the parent. + return parent.AutoSize; + } + } + + +} diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/SingleLineFlowLayoutManager.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/SingleLineFlowLayoutManager.cs new file mode 100644 index 0000000..04658dc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/SingleLineFlowLayoutManager.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Drawing; +using System.Diagnostics; +using System.ComponentModel; + +namespace DynamicLayout +{ + public class SingleLineFlowLayoutManager + { + private Control container; + + // Instead of using a simple integer, you could use a full Padding structure. + private int margin; + public int Margin + { + get { return margin; } + set { margin = value; + container.PerformLayout(); + } + } + + public SingleLineFlowLayoutManager(Control container, int margin) + { + this.container = container; + this.margin = margin; + + // Attach the event handler. + container.Layout += new LayoutEventHandler(UpdateLayout); + + // Refresh the layout. + container.PerformLayout(container, "LayoutManager"); + } + + private void UpdateLayout(object sender, + System.Windows.Forms.LayoutEventArgs e) + { + string debugMessage = "Called: " + + "\n Affected Control: " + e.AffectedControl.Name + + "\n Affected Property: " + e.AffectedProperty; + Debug.WriteLine(debugMessage); + + if (e.AffectedProperty == "Visible") return; + int y = 0; + foreach (Control ctrl in container.Controls) + { + y += Margin; + + // For maximum efficiency, set the + // size and location in one step through + // the Bounds property. + ctrl.Bounds = new Rectangle(Margin, y, + container.Width - Margin*2, Margin); + } + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/SurveyDeserializer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/SurveyDeserializer.cs new file mode 100644 index 0000000..459817d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/SurveyDeserializer.cs @@ -0,0 +1,270 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; +using System.Windows.Forms; + +namespace DynamicLayout +{ + public class SurveyDeserializer + { + private string fileName; + private Panel targetContainer; + public SurveyDeserializer(string fileName, Panel targetContainer) + { + this.fileName = fileName; + this.targetContainer = targetContainer; + } + + public void LoadForm() + { + // Dispose the child controls. + foreach (Control ctrl in targetContainer.Controls) + { + ctrl.Dispose(); + } + + try + { + // Load the form into memory. + XmlDocument doc = new XmlDocument(); + doc.Load(fileName); + + // Iterate over panel nodes. + foreach (XmlNode nodePanel in doc.DocumentElement.ChildNodes) + { + // Convert the element name into the appropriate enum value. + PanelTypes type = + (PanelTypes)Enum.Parse(typeof(PanelTypes), nodePanel.LocalName); + + // Check for caption node. + string caption = CheckForAttribute(nodePanel, "caption"); + + // Create the container for this survey element. + // It's placed into the next available cell. + Control container = CreateContainer(type, caption); + container.SuspendLayout(); + + // Iterate over the nested nodes. + foreach (XmlNode nodeItem in nodePanel.ChildNodes) + { + // Get the node information. + string id = CheckForAttribute(nodeItem, "id"); + caption = CheckForAttribute(nodeItem, "caption"); + if (caption == "") caption = id; + + // Create the content inside the survey element. + CreateContent(type, nodeItem.LocalName, + caption, id, container); + } + container.ResumeLayout(); + } + } + catch (Exception err) + { + MessageBox.Show("Failure parsing file.\n" + err.Message); + } + } + + private Control CreateContainer(PanelTypes type, string caption) + { + // Represents the top-level container + // (a TableLayoutPanel or FlowLayoutPanel, + // depending on the survey element). + TableLayoutPanel pnlTable = null; + FlowLayoutPanel pnlFlow = null; + + // Represents the control object that contains + // the rest of the survey content. + // Often, this is the same as the top-level + // container, but not so with the CheckBoxList. + // For this survey element, a FlowLayoutPanel + // hosts the caption and CheckBoxList, but + // the CheckBoxList is container for survey elements, + // not the FlowLayoutPanel. + Control container = null; + + // Represents a caption that can be inserted at + // the top of the panel. + Label lblCaption; + + switch (type) + { + case PanelTypes.TextBoxPanel: + pnlTable = new TableLayoutPanel(); + pnlTable.CellBorderStyle = TableLayoutPanelCellBorderStyle.Outset; + pnlTable.ColumnCount = 2; + + // When created programmatically, a TableLayoutPanel + // has no ColumnStyle objects. + // In this case, they're added to ensure the + // label column sizes to fits its content and + // the text box column fills all the remaining space + //pnlTable.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, 0)); + //pnlTable.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + + // Make sure the full width of the form is used + // for the text box. + pnlTable.Anchor = AnchorStyles.Left | AnchorStyles.Right; + + container = pnlTable; + break; + + case PanelTypes.GroupSelectionPanel: + pnlFlow = new FlowLayoutPanel(); + + // Each radio button should take + // a full line. + pnlFlow.FlowDirection = FlowDirection.TopDown; + + // Add a caption. + lblCaption = new Label(); + lblCaption.Text = caption; + lblCaption.AutoSize = true; + pnlFlow.Controls.Add(lblCaption); + + container = pnlFlow; + break; + + case PanelTypes.CheckBoxListPanel: + pnlTable = new TableLayoutPanel(); + + // Size the table to fill the content. + //pnlTable.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, 0)); + //pnlTable.RowStyles.Add(new RowStyle(SizeType.AutoSize, 0)); + pnlTable.ColumnCount = 1; + + // Add a caption. + lblCaption = new Label(); + lblCaption.Text = caption; + lblCaption.AutoSize = true; + pnlTable.Controls.Add(lblCaption); + + // Add the checkbox list. + CheckedListBox checks = new CheckedListBox(); + checks.AutoSize = true; + pnlTable.Controls.Add(checks); + + container = checks; + break; + + case PanelTypes.LargeTextBoxPanel: + pnlTable = new TableLayoutPanel(); + + // Size the table to fill the available area. + //pnlTable.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize, 100)); + //pnlTable.RowStyles.Add(new RowStyle(SizeType.AutoSize, 100)); + pnlTable.ColumnCount = 1; + + //pnlTable.Width = pnlForm.Width; + pnlTable.Anchor = AnchorStyles.Left | AnchorStyles.Right; + + // Add a caption. + lblCaption = new Label(); + lblCaption.Text = caption; + lblCaption.AutoSize = true; + pnlTable.Controls.Add(lblCaption); + + container = pnlTable; + break; + } + + // Add the top-level container (the + // FlowLayoutPanel or TableLayoutPanel) + // to the table. + Panel pnl = null; + if (pnlTable != null) + { + pnl = pnlTable; + } + else + { + pnl = pnlFlow; + } + pnl.AutoSize = true; + pnl.Margin = new Padding(7); + targetContainer.Controls.Add(pnl); + + // Return the container control, so more content can + // be inserted inside it. + return container; + } + + private void CreateContent(PanelTypes type, + string elementName, string caption, string id, + Control container) + { + Control ctrl = null; + switch (type) + { + case PanelTypes.TextBoxPanel: + if (elementName != "TextItem") throw new XmlException("Element " + elementName + " not expected"); + ctrl = new Label(); + ctrl.Text = caption; + container.Controls.Add(ctrl); + + ctrl = new TextBox(); + ctrl.Name = id; + ctrl.Dock = DockStyle.Fill; + container.Controls.Add(ctrl); + break; + case PanelTypes.GroupSelectionPanel: + if (elementName != "SelectionItem") throw new XmlException("Element " + elementName + " not expected"); + ctrl = new RadioButton(); + + ctrl.Name = id; + ctrl.Text = caption; + ctrl.Margin = new Padding(3, 0, 3, 0); + container.Controls.Add(ctrl); + break; + case PanelTypes.CheckBoxListPanel: + if (elementName != "SelectionItem") throw new XmlException("Element " + elementName + " not expected"); + ((CheckedListBox)container).Items.Add( + new CheckBoxListItem(caption, id)); + break; + case PanelTypes.LargeTextBoxPanel: + if (elementName != "TextItem") throw new XmlException("Element " + elementName + " not expected"); + ctrl = new TextBox(); + ctrl.Dock = DockStyle.Fill; + ((TextBox)ctrl).WordWrap = true; + ((TextBox)ctrl).AcceptsReturn = true; + ((TextBox)ctrl).Multiline = true; + ctrl.Height *= 3; + container.Controls.Add(ctrl); + break; + } + } + + private string CheckForAttribute(XmlNode node, string name) + { + foreach (XmlAttribute attr in node.Attributes) + { + if (attr.Name == name) return attr.Value; + } + return ""; + } + + public class CheckBoxListItem + { + public string Caption; + public string ID; + + public CheckBoxListItem(string caption, string id) + { + Caption = caption; + ID = id; + } + + public override string ToString() + { + return Caption; + } + } + + enum PanelTypes + { + TextBoxPanel, GroupSelectionPanel, + CheckBoxListPanel, LargeTextBoxPanel + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TableLayoutTest.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TableLayoutTest.Designer.cs new file mode 100644 index 0000000..df6decc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TableLayoutTest.Designer.cs @@ -0,0 +1,181 @@ +namespace DynamicLayout +{ + partial class TableLayoutTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button8 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // button8 + // + this.button8.Dock = System.Windows.Forms.DockStyle.Left; + this.button8.Location = new System.Drawing.Point(158, 191); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(75, 55); + this.button8.TabIndex = 7; + this.button8.Text = "Left Dock"; + this.button8.UseVisualStyleBackColor = true; + // + // button7 + // + this.button7.Dock = System.Windows.Forms.DockStyle.Bottom; + this.button7.Location = new System.Drawing.Point(5, 223); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(145, 23); + this.button7.TabIndex = 6; + this.button7.Text = "Bottom Dock"; + this.button7.UseVisualStyleBackColor = true; + // + // button6 + // + this.button6.Dock = System.Windows.Forms.DockStyle.Fill; + this.button6.Location = new System.Drawing.Point(158, 129); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(145, 54); + this.button6.TabIndex = 5; + this.button6.Text = "Fill Dock"; + this.button6.UseVisualStyleBackColor = true; + // + // button5 + // + this.button5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.button5.Location = new System.Drawing.Point(5, 144); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(145, 23); + this.button5.TabIndex = 4; + this.button5.Text = "Left-Right"; + this.button5.UseVisualStyleBackColor = true; + // + // button4 + // + this.button4.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.button4.Location = new System.Drawing.Point(158, 67); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(145, 54); + this.button4.TabIndex = 3; + this.button4.Text = "All Sides"; + this.button4.UseVisualStyleBackColor = true; + // + // button3 + // + this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button3.Location = new System.Drawing.Point(75, 98); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 2; + this.button3.Text = "Bottom-Right"; + this.button3.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.Anchor = System.Windows.Forms.AnchorStyles.None; + this.button2.Location = new System.Drawing.Point(193, 20); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 1; + this.button2.Text = "No Anchor"; + this.button2.UseVisualStyleBackColor = true; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(5, 5); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "Top-Left"; + this.button1.UseVisualStyleBackColor = true; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel1.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Outset; + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Controls.Add(this.button1, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.button2, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.button3, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.button4, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.button5, 0, 2); + this.tableLayoutPanel1.Controls.Add(this.button6, 1, 2); + this.tableLayoutPanel1.Controls.Add(this.button7, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.button8, 1, 3); + this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(308, 251); + this.tableLayoutPanel1.TabIndex = 0; + // + // TableLayoutTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(342, 275); + this.Controls.Add(this.tableLayoutPanel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "TableLayoutTest"; + this.Text = "TableLayoutTest"; + this.Load += new System.EventHandler(this.TableLayoutTest_Load); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TableLayoutTest.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TableLayoutTest.cs new file mode 100644 index 0000000..df3cc7d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TableLayoutTest.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicLayout +{ + public partial class TableLayoutTest : Form + { + public TableLayoutTest() + { + InitializeComponent(); + } + + private void TableLayoutTest_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TableLayoutTest.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TableLayoutTest.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TableLayoutTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TextBoxColumn.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TextBoxColumn.Designer.cs new file mode 100644 index 0000000..64501e5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TextBoxColumn.Designer.cs @@ -0,0 +1,70 @@ +namespace DynamicLayout +{ + partial class TextBoxColumn + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.SuspendLayout(); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanel1.AutoScroll = true; + this.tableLayoutPanel1.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Outset; + this.tableLayoutPanel1.ColumnCount = 3; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 1; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.Size = new System.Drawing.Size(541, 308); + this.tableLayoutPanel1.TabIndex = 0; + // + // TextBoxColumn + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(565, 332); + this.Controls.Add(this.tableLayoutPanel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "TextBoxColumn"; + this.Text = "TextBoxColumn"; + this.Load += new System.EventHandler(this.TextBoxColumn_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TextBoxColumn.cs b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TextBoxColumn.cs new file mode 100644 index 0000000..59996c9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TextBoxColumn.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicLayout +{ + public partial class TextBoxColumn : Form + { + public TextBoxColumn() + { + InitializeComponent(); + + // Reduce the number of times the layout logic is executed. + tableLayoutPanel1.SuspendLayout(); + + // Add the controls. + for (int i = 1; i < 15; i++) + { + // Create an auto-sizing label for the left column. + Label lbl = new Label(); + lbl.Text = "This is Setting " + i.ToString(); + + lbl.Margin = new Padding(3, 7, 3, 3); + lbl.AutoSize = true; + + // Create a text box that's docked to fill up the entire second column. + TextBox txt = new TextBox(); + txt.Dock = DockStyle.Fill; + + Button cmd = new Button(); + cmd.Text = "Browse..."; + cmd.Width = 60; + + // Add the controls + tableLayoutPanel1.Controls.Add(lbl); + tableLayoutPanel1.Controls.Add(txt); + tableLayoutPanel1.Controls.Add(cmd); + } + + tableLayoutPanel1.ResumeLayout(); + + } + + private void TextBoxColumn_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TextBoxColumn.resx b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TextBoxColumn.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/TextBoxColumn.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/bin/Debug/CollapsiblePanelControl.dll b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/bin/Debug/CollapsiblePanelControl.dll new file mode 100644 index 0000000..692896d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/bin/Debug/CollapsiblePanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/bin/Debug/DynamicLayout.exe b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/bin/Debug/DynamicLayout.exe new file mode 100644 index 0000000..b3f3f36 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/bin/Debug/DynamicLayout.exe differ diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicLayout/bin/Debug/SampleForm.frm b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/bin/Debug/SampleForm.frm new file mode 100644 index 0000000..200b15d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicLayout/bin/Debug/SampleForm.frm @@ -0,0 +1,27 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/ButtonMaker.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/ButtonMaker.Designer.cs new file mode 100644 index 0000000..a6e7501 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/ButtonMaker.Designer.cs @@ -0,0 +1,143 @@ +namespace DynamicUI +{ + partial class ButtonMaker + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtLeft = new System.Windows.Forms.TextBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.cmdCreate = new System.Windows.Forms.Button(); + this.txtTop = new System.Windows.Forms.TextBox(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.lblStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.GroupBox1.SuspendLayout(); + this.statusStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.txtLeft); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.cmdCreate); + this.GroupBox1.Controls.Add(this.txtTop); + this.GroupBox1.Location = new System.Drawing.Point(12, 12); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(168, 128); + this.GroupBox1.TabIndex = 10; + this.GroupBox1.TabStop = false; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 52); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(52, 16); + this.Label1.TabIndex = 0; + this.Label1.Text = "Left:"; + // + // txtLeft + // + this.txtLeft.Location = new System.Drawing.Point(76, 52); + this.txtLeft.Name = "txtLeft"; + this.txtLeft.Size = new System.Drawing.Size(68, 20); + this.txtLeft.TabIndex = 4; + this.txtLeft.Text = "200"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(16, 24); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(52, 16); + this.Label2.TabIndex = 1; + this.Label2.Text = "Top:"; + // + // cmdCreate + // + this.cmdCreate.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdCreate.Location = new System.Drawing.Point(36, 84); + this.cmdCreate.Name = "cmdCreate"; + this.cmdCreate.Size = new System.Drawing.Size(112, 28); + this.cmdCreate.TabIndex = 2; + this.cmdCreate.Text = "Create Button"; + this.cmdCreate.Click += new System.EventHandler(this.cmdCreate_Click); + // + // txtTop + // + this.txtTop.Location = new System.Drawing.Point(76, 24); + this.txtTop.Name = "txtTop"; + this.txtTop.Size = new System.Drawing.Size(68, 20); + this.txtTop.TabIndex = 3; + this.txtTop.Text = "50"; + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.lblStatus}); + this.statusStrip1.Location = new System.Drawing.Point(0, 216); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(391, 22); + this.statusStrip1.TabIndex = 11; + this.statusStrip1.Text = "statusStrip1"; + // + // lblStatus + // + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Size = new System.Drawing.Size(376, 17); + this.lblStatus.Spring = true; + // + // ButtonMaker + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(391, 238); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.GroupBox1); + this.Name = "ButtonMaker"; + this.Text = "ButtonMaker"; + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.TextBox txtLeft; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.Button cmdCreate; + internal System.Windows.Forms.TextBox txtTop; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ToolStripStatusLabel lblStatus; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/ButtonMaker.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/ButtonMaker.cs new file mode 100644 index 0000000..4c899b3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/ButtonMaker.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicUI +{ + public partial class ButtonMaker : Form + { + public ButtonMaker() + { + InitializeComponent(); + } + + private int buttonCount = 0; + private void cmdCreate_Click(object sender, EventArgs e) + { + buttonCount++; + + // Create the button. + Button newButton = new Button(); + newButton.Text = "Button " + buttonCount.ToString(); + newButton.Location = new Point(Int32.Parse(txtLeft.Text), Int32.Parse(txtTop.Text)); + + // Attach the event handler. + newButton.Click += new EventHandler(ButtonHandler); + + this.Controls.Add(newButton); + } + + private void ButtonHandler(object sender, System.EventArgs e) + { + lblStatus.Text = " You clicked ... "; + lblStatus.Text += ((Button)sender).Text; + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/ButtonMaker.resx b/Pro Windows Forms 2.0/Chapter21/DynamicUI/ButtonMaker.resx new file mode 100644 index 0000000..b9c202b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/ButtonMaker.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DBPermissions.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DBPermissions.cs new file mode 100644 index 0000000..ed1cb64 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DBPermissions.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Data.SqlClient; +using System.Data; + +namespace DynamicUI +{ + public class DBPermissions + { + public enum State + { + Normal = 0, + Disabled = 1, + Hidden = 2 + } + + public enum Level + { + Admin, + User + } + + private SqlConnection con= new SqlConnection( + Properties.Settings.Default.DBConnectionString); + + + public DataTable GetPermissions(Level userLevel) + { + // Permissions isn't actually actually a table in our data source. + // Instead, it's a view that combines the important information + // from all three tables using a Join query. + string selectPermissions = "SELECT * FROM Permissions WHERE LevelName=@LevelName"; + SqlCommand cmd = new SqlCommand(selectPermissions, con); + + SqlParameter param = new SqlParameter("@LevelName", + Enum.GetName(typeof(Level), userLevel)); + cmd.Parameters.Add(param); + + SqlDataAdapter adapter = new SqlDataAdapter(cmd); + DataSet ds = new DataSet(); + adapter.Fill(ds, "Permissions"); + + return ds.Tables["Permissions"]; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicDBMenu.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicDBMenu.Designer.cs new file mode 100644 index 0000000..5fad62b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicDBMenu.Designer.cs @@ -0,0 +1,226 @@ +namespace DynamicUI +{ + partial class DynamicDBMenu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdAdmin = new System.Windows.Forms.Button(); + this.cmdUser = new System.Windows.Forms.Button(); + this.mnuMain = new System.Windows.Forms.MenuStrip(); + this.File = new System.Windows.Forms.ToolStripMenuItem(); + this.New = new System.Windows.Forms.ToolStripMenuItem(); + this.Open = new System.Windows.Forms.ToolStripMenuItem(); + this.Close = new System.Windows.Forms.ToolStripMenuItem(); + this.Save = new System.Windows.Forms.ToolStripMenuItem(); + this.Exit = new System.Windows.Forms.ToolStripMenuItem(); + this.Tools = new System.Windows.Forms.ToolStripMenuItem(); + this.ManageHardware = new System.Windows.Forms.ToolStripMenuItem(); + this.SetUpUserAccounts = new System.Windows.Forms.ToolStripMenuItem(); + this.ChangeDisplay = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.Help = new System.Windows.Forms.ToolStripMenuItem(); + this.Contents = new System.Windows.Forms.ToolStripMenuItem(); + this.About = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.mnuMain.SuspendLayout(); + this.SuspendLayout(); + // + // cmdAdmin + // + this.cmdAdmin.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdAdmin.Location = new System.Drawing.Point(159, 158); + this.cmdAdmin.Name = "cmdAdmin"; + this.cmdAdmin.Size = new System.Drawing.Size(80, 24); + this.cmdAdmin.TabIndex = 5; + this.cmdAdmin.Text = "Admin Level"; + this.cmdAdmin.Click += new System.EventHandler(this.cmdAdmin_Click); + // + // cmdUser + // + this.cmdUser.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdUser.Location = new System.Drawing.Point(71, 158); + this.cmdUser.Name = "cmdUser"; + this.cmdUser.Size = new System.Drawing.Size(80, 24); + this.cmdUser.TabIndex = 4; + this.cmdUser.Text = "User Level"; + this.cmdUser.Click += new System.EventHandler(this.cmdUser_Click); + // + // mnuMain + // + this.mnuMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.File, + this.Tools, + this.Help}); + this.mnuMain.Location = new System.Drawing.Point(0, 0); + this.mnuMain.Name = "mnuMain"; + this.mnuMain.Size = new System.Drawing.Size(306, 24); + this.mnuMain.TabIndex = 6; + this.mnuMain.Text = "menuStrip1"; + // + // File + // + this.File.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.New, + this.Open, + this.Close, + this.Save, + this.toolStripSeparator1, + this.Exit}); + this.File.Name = "File"; + this.File.Size = new System.Drawing.Size(35, 20); + this.File.Text = "File"; + // + // New + // + this.New.Name = "New"; + this.New.Size = new System.Drawing.Size(152, 22); + this.New.Text = "New"; + // + // Open + // + this.Open.Name = "Open"; + this.Open.Size = new System.Drawing.Size(152, 22); + this.Open.Text = "Open"; + // + // Close + // + this.Close.Name = "Close"; + this.Close.Size = new System.Drawing.Size(152, 22); + this.Close.Text = "Close"; + // + // Save + // + this.Save.Name = "Save"; + this.Save.Size = new System.Drawing.Size(152, 22); + this.Save.Text = "Save"; + // + // Exit + // + this.Exit.Name = "Exit"; + this.Exit.Size = new System.Drawing.Size(152, 22); + this.Exit.Text = "Exit"; + // + // Tools + // + this.Tools.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ManageHardware, + this.SetUpUserAccounts, + this.ChangeDisplay}); + this.Tools.Name = "Tools"; + this.Tools.Size = new System.Drawing.Size(44, 20); + this.Tools.Text = "Tools"; + // + // ManageHardware + // + this.ManageHardware.Name = "ManageHardware"; + this.ManageHardware.Size = new System.Drawing.Size(189, 22); + this.ManageHardware.Text = "Manage Hardware"; + // + // SetUpUserAccounts + // + this.SetUpUserAccounts.Name = "SetUpUserAccounts"; + this.SetUpUserAccounts.Size = new System.Drawing.Size(189, 22); + this.SetUpUserAccounts.Text = "Set Up User Accounts"; + // + // ChangeDisplay + // + this.ChangeDisplay.Name = "ChangeDisplay"; + this.ChangeDisplay.Size = new System.Drawing.Size(189, 22); + this.ChangeDisplay.Text = "Change Display"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6); + // + // Help + // + this.Help.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.Contents, + this.toolStripSeparator2, + this.About}); + this.Help.Name = "Help"; + this.Help.Size = new System.Drawing.Size(40, 20); + this.Help.Text = "Help"; + // + // Contents + // + this.Contents.Name = "Contents"; + this.Contents.Size = new System.Drawing.Size(152, 22); + this.Contents.Text = "Contents"; + // + // About + // + this.About.Name = "About"; + this.About.Size = new System.Drawing.Size(152, 22); + this.About.Text = "About"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6); + // + // DynamicDBMenu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(306, 205); + this.Controls.Add(this.cmdAdmin); + this.Controls.Add(this.cmdUser); + this.Controls.Add(this.mnuMain); + this.MainMenuStrip = this.mnuMain; + this.Name = "DynamicDBMenu"; + this.Text = "DynamicDBMenu"; + this.mnuMain.ResumeLayout(false); + this.mnuMain.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + internal System.Windows.Forms.Button cmdAdmin; + internal System.Windows.Forms.Button cmdUser; + private System.Windows.Forms.MenuStrip mnuMain; + private System.Windows.Forms.ToolStripMenuItem File; + private System.Windows.Forms.ToolStripMenuItem New; + private System.Windows.Forms.ToolStripMenuItem Open; + private System.Windows.Forms.ToolStripMenuItem Close; + private System.Windows.Forms.ToolStripMenuItem Save; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem Exit; + private System.Windows.Forms.ToolStripMenuItem Tools; + private System.Windows.Forms.ToolStripMenuItem ManageHardware; + private System.Windows.Forms.ToolStripMenuItem SetUpUserAccounts; + private System.Windows.Forms.ToolStripMenuItem ChangeDisplay; + private System.Windows.Forms.ToolStripMenuItem Help; + private System.Windows.Forms.ToolStripMenuItem Contents; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem About; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicDBMenu.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicDBMenu.cs new file mode 100644 index 0000000..68fbb19 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicDBMenu.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicUI +{ + public partial class DynamicDBMenu : Form + { + public DynamicDBMenu() + { + InitializeComponent(); + permissions = new DBPermissions(); + } + + DBPermissions permissions; + private void cmdUser_Click(object sender, EventArgs e) + { + DataTable dtPermissions; + + // Get permissions for an Admin-level user. + dtPermissions = permissions.GetPermissions(DBPermissions.Level.User); + + // Update the menu with these permissions. + MenuLockDown.SearchMenu(MainMenuStrip.Items, dtPermissions); + + } + + private void cmdAdmin_Click(object sender, EventArgs e) + { + DataTable dtPermissions; + + // Get permissions for an Admin-level user. + dtPermissions = permissions.GetPermissions(DBPermissions.Level.Admin); + + // Update the menu with these permissions. + MenuLockDown.SearchMenu(MainMenuStrip.Items, dtPermissions); + + } + + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicDBMenu.resx b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicDBMenu.resx new file mode 100644 index 0000000..e1d14fc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicDBMenu.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 114, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicMenu.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicMenu.Designer.cs new file mode 100644 index 0000000..9d3dabf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicMenu.Designer.cs @@ -0,0 +1,344 @@ +namespace DynamicUI +{ + partial class DynamicMenu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer(); + this.panel2 = new System.Windows.Forms.Panel(); + this.mnuControl = new System.Windows.Forms.ContextMenuStrip(this.components); + this.controlToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.startToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.stopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.label6 = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.mnuParameters = new System.Windows.Forms.ContextMenuStrip(this.components); + this.parametersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.mnuMain = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuTopLevel = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripContainer1.ContentPanel.SuspendLayout(); + this.toolStripContainer1.TopToolStripPanel.SuspendLayout(); + this.toolStripContainer1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.mnuControl.SuspendLayout(); + this.panel1.SuspendLayout(); + this.mnuParameters.SuspendLayout(); + this.mnuMain.SuspendLayout(); + this.SuspendLayout(); + // + // toolStripContainer1 + // + // + // toolStripContainer1.ContentPanel + // + this.toolStripContainer1.ContentPanel.BackColor = System.Drawing.Color.White; + this.toolStripContainer1.ContentPanel.Controls.Add(this.panel2); + this.toolStripContainer1.ContentPanel.Controls.Add(this.panel1); + this.toolStripContainer1.ContentPanel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.toolStripContainer1.ContentPanel.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional; + this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(292, 242); + this.toolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.toolStripContainer1.Location = new System.Drawing.Point(0, 0); + this.toolStripContainer1.Name = "toolStripContainer1"; + this.toolStripContainer1.Size = new System.Drawing.Size(292, 266); + this.toolStripContainer1.TabIndex = 0; + this.toolStripContainer1.Text = "toolStripContainer1"; + // + // toolStripContainer1.TopToolStripPanel + // + this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.mnuMain); + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.AliceBlue; + this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel2.ContextMenuStrip = this.mnuControl; + this.panel2.Controls.Add(this.checkBox1); + this.panel2.Controls.Add(this.button2); + this.panel2.Controls.Add(this.button1); + this.panel2.Controls.Add(this.label6); + this.panel2.Location = new System.Drawing.Point(18, 122); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(252, 100); + this.panel2.TabIndex = 6; + this.panel2.Enter += new System.EventHandler(this.panel_Enter); + this.panel2.Leave += new System.EventHandler(this.panel_Leave); + // + // mnuControl + // + this.mnuControl.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.controlToolStripMenuItem}); + this.mnuControl.Name = "mnuControl"; + this.mnuControl.Size = new System.Drawing.Size(121, 26); + // + // controlToolStripMenuItem + // + this.controlToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.startToolStripMenuItem, + this.stopToolStripMenuItem}); + this.controlToolStripMenuItem.Name = "controlToolStripMenuItem"; + this.controlToolStripMenuItem.Size = new System.Drawing.Size(120, 22); + this.controlToolStripMenuItem.Text = "Control"; + // + // startToolStripMenuItem + // + this.startToolStripMenuItem.Name = "startToolStripMenuItem"; + this.startToolStripMenuItem.Size = new System.Drawing.Size(109, 22); + this.startToolStripMenuItem.Text = "Start"; + // + // stopToolStripMenuItem + // + this.stopToolStripMenuItem.Name = "stopToolStripMenuItem"; + this.stopToolStripMenuItem.Size = new System.Drawing.Size(109, 22); + this.stopToolStripMenuItem.Text = "Stop"; + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Checked = true; + this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked; + this.checkBox1.Location = new System.Drawing.Point(109, 30); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(114, 17); + this.checkBox1.TabIndex = 5; + this.checkBox1.Text = "Run until complete"; + // + // button2 + // + this.button2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button2.Location = new System.Drawing.Point(107, 57); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(60, 23); + this.button2.TabIndex = 4; + this.button2.Text = "Stop"; + // + // button1 + // + this.button1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.button1.Location = new System.Drawing.Point(173, 57); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(63, 23); + this.button1.TabIndex = 3; + this.button1.Text = "Start"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.ForeColor = System.Drawing.SystemColors.MenuHighlight; + this.label6.Location = new System.Drawing.Point(13, 13); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(66, 13); + this.label6.TabIndex = 2; + this.label6.Text = "Test Control"; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.AliceBlue; + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel1.ContextMenuStrip = this.mnuParameters; + this.panel1.Controls.Add(this.label3); + this.panel1.Controls.Add(this.label2); + this.panel1.Controls.Add(this.label1); + this.panel1.Controls.Add(this.textBox2); + this.panel1.Controls.Add(this.textBox1); + this.panel1.Location = new System.Drawing.Point(18, 16); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(252, 100); + this.panel1.TabIndex = 0; + this.panel1.Enter += new System.EventHandler(this.panel_Enter); + this.panel1.Leave += new System.EventHandler(this.panel_Leave); + // + // mnuParameters + // + this.mnuParameters.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.parametersToolStripMenuItem}); + this.mnuParameters.Name = "mnuParameters"; + this.mnuParameters.Size = new System.Drawing.Size(141, 26); + // + // parametersToolStripMenuItem + // + this.parametersToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.aToolStripMenuItem, + this.bToolStripMenuItem}); + this.parametersToolStripMenuItem.Name = "parametersToolStripMenuItem"; + this.parametersToolStripMenuItem.Size = new System.Drawing.Size(140, 22); + this.parametersToolStripMenuItem.Text = "Parameters"; + // + // aToolStripMenuItem + // + this.aToolStripMenuItem.Name = "aToolStripMenuItem"; + this.aToolStripMenuItem.Size = new System.Drawing.Size(92, 22); + this.aToolStripMenuItem.Text = "A"; + // + // bToolStripMenuItem + // + this.bToolStripMenuItem.Name = "bToolStripMenuItem"; + this.bToolStripMenuItem.Size = new System.Drawing.Size(92, 22); + this.bToolStripMenuItem.Text = "B"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(52, 64); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(50, 13); + this.label3.TabIndex = 4; + this.label3.Text = "Param B:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(52, 39); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(51, 13); + this.label2.TabIndex = 3; + this.label2.Text = "Param A:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.ForeColor = System.Drawing.SystemColors.MenuHighlight; + this.label1.Location = new System.Drawing.Point(13, 13); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(86, 13); + this.label1.TabIndex = 2; + this.label1.Text = "Test Parameters"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(107, 59); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(129, 21); + this.textBox2.TabIndex = 1; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(107, 33); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(129, 21); + this.textBox1.TabIndex = 0; + // + // mnuMain + // + this.mnuMain.Dock = System.Windows.Forms.DockStyle.None; + this.mnuMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.mnuTopLevel}); + this.mnuMain.Location = new System.Drawing.Point(0, 0); + this.mnuMain.Name = "mnuMain"; + this.mnuMain.Size = new System.Drawing.Size(292, 24); + this.mnuMain.TabIndex = 0; + this.mnuMain.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20); + this.fileToolStripMenuItem.Text = "File"; + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(103, 22); + this.exitToolStripMenuItem.Text = "Exit"; + // + // mnuTopLevel + // + this.mnuTopLevel.Name = "mnuTopLevel"; + this.mnuTopLevel.Size = new System.Drawing.Size(58, 20); + this.mnuTopLevel.Text = "Context"; + // + // DynamicMenu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.toolStripContainer1); + this.MainMenuStrip = this.mnuMain; + this.Name = "DynamicMenu"; + this.Text = "DynamicMenu"; + this.Load += new System.EventHandler(this.DynamicMenu_Load); + this.toolStripContainer1.ContentPanel.ResumeLayout(false); + this.toolStripContainer1.TopToolStripPanel.ResumeLayout(false); + this.toolStripContainer1.TopToolStripPanel.PerformLayout(); + this.toolStripContainer1.ResumeLayout(false); + this.toolStripContainer1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.mnuControl.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.mnuParameters.ResumeLayout(false); + this.mnuMain.ResumeLayout(false); + this.mnuMain.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ToolStripContainer toolStripContainer1; + private System.Windows.Forms.MenuStrip mnuMain; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.ContextMenuStrip mnuParameters; + private System.Windows.Forms.ToolStripMenuItem parametersToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem aToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem bToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip mnuControl; + private System.Windows.Forms.ToolStripMenuItem controlToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem startToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem stopToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem mnuTopLevel; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicMenu.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicMenu.cs new file mode 100644 index 0000000..b5d209c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicMenu.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DynamicUI +{ + public partial class DynamicMenu : Form + { + public DynamicMenu() + { + InitializeComponent(); + } + + private void panel_Enter(object sender, EventArgs e) + { + Panel panel = (Panel)sender; + mnuTopLevel.DropDown = panel.ContextMenuStrip; + ToolStripMenuItem item = (ToolStripMenuItem)panel.ContextMenuStrip.Items[0]; + mnuTopLevel.DropDown = item.DropDown; + mnuTopLevel.Text = item.Text; + } + + private void panel_Leave(object sender, EventArgs e) + { + + + } + + + private void DynamicMenu_Load(object sender, EventArgs e) + { + + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicMenu.resx b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicMenu.resx new file mode 100644 index 0000000..4f2adf0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicMenu.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 256, 17 + + + 126, 17 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.csproj b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.csproj new file mode 100644 index 0000000..38d0cdf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.csproj @@ -0,0 +1,104 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {AFAEAF2D-B3FD-4EB0-9819-045151F0EF6C} + WinExe + Properties + DynamicUI + DynamicUI + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + ButtonMaker.cs + + + + Form + + + DynamicDBMenu.cs + + + Form + + + DynamicMenu.cs + + + Form + + + Menu.cs + + + + + + Designer + ButtonMaker.cs + + + Designer + DynamicDBMenu.cs + + + DynamicMenu.cs + Designer + + + Menu.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.csproj.user b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.sln b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.sln new file mode 100644 index 0000000..0cb1f57 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamicUI", "DynamicUI.csproj", "{AFAEAF2D-B3FD-4EB0-9819-045151F0EF6C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AFAEAF2D-B3FD-4EB0-9819-045151F0EF6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AFAEAF2D-B3FD-4EB0-9819-045151F0EF6C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFAEAF2D-B3FD-4EB0-9819-045151F0EF6C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFAEAF2D-B3FD-4EB0-9819-045151F0EF6C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.suo b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.suo new file mode 100644 index 0000000..b11bf17 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/DynamicUI/DynamicUI.suo differ diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/Menu.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Menu.cs new file mode 100644 index 0000000..f10b1cd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Menu.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace DynamicUI +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("DynamicUI." + ctrl.Text); + frm.ShowDialog(); + } + + private void Menu_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Menu.designer.cs new file mode 100644 index 0000000..3e4ae22 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Menu.designer.cs @@ -0,0 +1,87 @@ +namespace DynamicUI +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 7); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(124, 23); + this.button1.TabIndex = 0; + this.button1.Text = "DynamicMenu"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button11 + // + this.button11.Location = new System.Drawing.Point(12, 33); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(124, 23); + this.button11.TabIndex = 10; + this.button11.Text = "DynamicDBMenu"; + this.button11.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 59); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(124, 23); + this.button2.TabIndex = 11; + this.button2.Text = "ButtonMaker"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 205); + this.Controls.Add(this.button2); + this.Controls.Add(this.button11); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.Load += new System.EventHandler(this.Menu_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.Button button2; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/Menu.resx b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/MenuLockDown.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/MenuLockDown.cs new file mode 100644 index 0000000..d09bdb2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/MenuLockDown.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Data; + +namespace DynamicUI +{ + public class MenuLockDown + { + public static void SearchMenu(ToolStripItemCollection items, DataTable dtPermissions) + { + DataRow[] rowMatch; + + foreach (ToolStripItem item in items) + { + // Skip separators and other controls + ToolStripMenuItem mnuItem = item as ToolStripMenuItem; + if (mnuItem != null) + { + // See if this menu item has a corresponding row. + rowMatch = dtPermissions.Select("ControlName = '" + mnuItem.Name + "'"); + + // If it does, configure the menu item state accordingly. + if (rowMatch.GetLength(0) > 0) + { + DBPermissions.State state; + state = (DBPermissions.State)int.Parse(rowMatch[0]["State"].ToString()); + + switch (state) + { + case DBPermissions.State.Hidden: + mnuItem.Visible = false; + break; + case DBPermissions.State.Disabled: + mnuItem.Enabled = false; + break; + } + } + else + { + mnuItem.Visible = true; + mnuItem.Enabled = true; + } + + // Search recursively through any submenus. + if (mnuItem.DropDownItems.Count > 0) + { + SearchMenu(mnuItem.DropDownItems, dtPermissions); + } + } + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..82850c2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DynamicUI")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DynamicUI")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f7e1e3fe-7707-4117-b9b3-39d2e9ad9c8c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Resources.Designer.cs new file mode 100644 index 0000000..f49579e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DynamicUI.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DynamicUI.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DynamicUI.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace DynamicUI.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DynamicUI.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Settings.Designer.cs new file mode 100644 index 0000000..47c2271 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Settings.Designer.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DynamicUI.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Data Source=localhost\\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=Dynamic" + + "Menu;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=DynamicMenu;" + + "\"\r\n")] + public string DBConnectionString { + get { + return ((string)(this["DBConnectionString"])); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Settings.settings new file mode 100644 index 0000000..1ee48cc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/Properties/Settings.settings @@ -0,0 +1,10 @@ + + + + + + Data Source=localhost\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=DynamicMenu;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=DynamicMenu;" + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/app.config b/Pro Windows Forms 2.0/Chapter21/DynamicUI/app.config new file mode 100644 index 0000000..5bcc6c9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/app.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + Data Source=localhost;Integrated Security=SSPI;Initial Catalog=DynamicMenu + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Debug/DynamicUI.exe b/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Debug/DynamicUI.exe new file mode 100644 index 0000000..7e4afb2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Debug/DynamicUI.exe differ diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Debug/DynamicUI.exe.config b/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Debug/DynamicUI.exe.config new file mode 100644 index 0000000..505b5e2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Debug/DynamicUI.exe.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + Data Source=localhost\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=DynamicMenu + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Debug/DynamicUI.vshost.exe.config b/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Debug/DynamicUI.vshost.exe.config new file mode 100644 index 0000000..505b5e2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Debug/DynamicUI.vshost.exe.config @@ -0,0 +1,15 @@ + + + + +
+ + + + + + Data Source=localhost\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=DynamicMenu + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Release/DynamicUI.exe b/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Release/DynamicUI.exe new file mode 100644 index 0000000..3fa0031 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Release/DynamicUI.exe differ diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Release/DynamicUI.exe.config b/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Release/DynamicUI.exe.config new file mode 100644 index 0000000..80fd4ec --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/bin/Release/DynamicUI.exe.config @@ -0,0 +1,16 @@ + + + + +
+ + + + + + Data Source=localhost\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=DynamicMenu;Data Source=localhost;Integrated Security=SSPI;Initial Catalog=DynamicMenu;" + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/DynamicUI/program.cs b/Pro Windows Forms 2.0/Chapter21/DynamicUI/program.cs new file mode 100644 index 0000000..eab058f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/DynamicUI/program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DynamicUI +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Browser.Designer.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Browser.Designer.cs new file mode 100644 index 0000000..b619fcf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Browser.Designer.cs @@ -0,0 +1,106 @@ +namespace System.Windows.Forms.Samples +{ + partial class Browser + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.customToolStrip1 = new System.Windows.Forms.Samples.CustomToolStrip(); + this.toolStripButton4 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); + this.webBrowser1 = new System.Windows.Forms.WebBrowser(); + this.customToolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // customToolStrip1 + // + this.customToolStrip1.BackgroundImage = System.Windows.Forms.Samples.Properties.Resources.blueheader; + this.customToolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.customToolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton4, + this.toolStripButton2}); + this.customToolStrip1.Location = new System.Drawing.Point(0, 0); + this.customToolStrip1.Name = "customToolStrip1"; + this.customToolStrip1.Size = new System.Drawing.Size(550, 48); + this.customToolStrip1.TabIndex = 0; + this.customToolStrip1.Text = "customToolStrip1"; + // + // toolStripButton4 + // + this.toolStripButton4.ForeColor = System.Drawing.Color.White; + this.toolStripButton4.Image = System.Windows.Forms.Samples.Properties.Resources.back; + this.toolStripButton4.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton4.Name = "toolStripButton4"; + this.toolStripButton4.Padding = new System.Windows.Forms.Padding(4); + this.toolStripButton4.Text = "Back"; + this.toolStripButton4.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton4.Click += new System.EventHandler(this.toolStripButton4_Click); + // + // toolStripButton2 + // + this.toolStripButton2.ForeColor = System.Drawing.Color.White; + this.toolStripButton2.Image = System.Windows.Forms.Samples.Properties.Resources.forward; + this.toolStripButton2.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton2.Name = "toolStripButton2"; + this.toolStripButton2.Padding = new System.Windows.Forms.Padding(4); + this.toolStripButton2.Text = "Forward"; + this.toolStripButton2.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.toolStripButton2.Click += new System.EventHandler(this.toolStripButton2_Click); + // + // webBrowser1 + // + this.webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill; + this.webBrowser1.Location = new System.Drawing.Point(0, 48); + this.webBrowser1.Name = "webBrowser1"; + this.webBrowser1.Size = new System.Drawing.Size(550, 334); + this.webBrowser1.Navigated += new System.Windows.Forms.WebBrowserNavigatedEventHandler(this.webBrowser1_Navigated); + // + // Browser + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(550, 382); + this.Controls.Add(this.webBrowser1); + this.Controls.Add(this.customToolStrip1); + this.Name = "Browser"; + this.Text = "Browser"; + this.Load += new System.EventHandler(this.Browser_Load); + this.customToolStrip1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Samples.CustomToolStrip customToolStrip1; + private System.Windows.Forms.ToolStripButton toolStripButton4; + private System.Windows.Forms.ToolStripButton toolStripButton2; + private System.Windows.Forms.WebBrowser webBrowser1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Browser.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Browser.cs new file mode 100644 index 0000000..67b6917 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Browser.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace System.Windows.Forms.Samples +{ + public partial class Browser : Form + { + public Browser() + { + InitializeComponent(); + } + + private void Browser_Load(object sender, EventArgs e) + { + + } + + public string URL + { + get { return this.webBrowser1.Url.ToString(); } + set { this.webBrowser1.Url = new Uri(value); } + } + + private void toolStripButton4_Click(object sender, EventArgs e) + { + this.webBrowser1.GoBack(); + } + + private void toolStripButton2_Click(object sender, EventArgs e) + { + this.webBrowser1.GoForward(); + } + + private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) + { + this.Text = this.webBrowser1.Url.ToString(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Browser.resx b/Pro Windows Forms 2.0/Chapter21/RSSReader/Browser.resx new file mode 100644 index 0000000..15c2cd9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Browser.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/CustomMenuStrip.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/CustomMenuStrip.cs new file mode 100644 index 0000000..f370370 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/CustomMenuStrip.cs @@ -0,0 +1,58 @@ +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace System.Windows.Forms.Samples +{ + public class CustomMenuStrip : MenuStrip + { + public CustomMenuStrip() + { + // Set renderer + this.Renderer = new CustomMenuRenderer(); + } + + #region Custom Menu Renderer + internal class CustomMenuRenderer : ToolStripProfessionalRenderer + { + protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) + { + Graphics g = e.Graphics; + + using (Brush b = new SolidBrush(Color.FromArgb(91, 91, 91))) + { + g.FillRectangle(b, e.Graphics.ClipBounds); + } + } + + protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) + { + if (e.Item.Selected) + { + using (Brush b = new SolidBrush(Color.FromArgb(80, 80, 80))) + { + e.Graphics.FillRectangle(b, e.Graphics.ClipBounds); + } + } + else + { + base.OnRenderMenuItemBackground(e); + } + } + + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) + { + e.TextColor = Color.White; + + base.OnRenderItemText(e); + } + } + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/CustomToolStrip.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/CustomToolStrip.cs new file mode 100644 index 0000000..494cd39 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/CustomToolStrip.cs @@ -0,0 +1,61 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; + +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Windows.Forms; +using System.Reflection; + +#endregion + +namespace System.Windows.Forms.Samples +{ + public class CustomToolStrip : ToolStrip + { + private CustomToolStripRenderer _renderer; + + public CustomToolStrip() + { + // Set defaults + this.GripStyle = ToolStripGripStyle.Hidden; + + // Set renderer + this._renderer = new CustomToolStripRenderer(); + + // Look for headerText + this.Renderer = this._renderer; + } + } + + #region Custom ToolStrip Renderer + public class CustomToolStripRenderer : ToolStripProfessionalRenderer + { + public CustomToolStripRenderer() + { + this.RoundedEdges = false; + } + + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) + { + if (e.Item.Selected) + { + e.TextColor = Color.FromArgb(255, 223, 127); + } + + base.OnRenderItemText(e); + } + + protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e) + { + if (!(e.Item.Selected)) + { + base.OnRenderButtonBackground(e); + } + } + } + #endregion +} diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/GradientHeaderStrip.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/GradientHeaderStrip.cs new file mode 100644 index 0000000..6347fae --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/GradientHeaderStrip.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +using System.Text; + +namespace System.Windows.Forms.Samples +{ + public class GradientHeaderStrip : ToolStrip + { + private GradientToolStripRenderer _renderer; + + public GradientHeaderStrip() + { + // Set defaults + this.GripStyle = ToolStripGripStyle.Hidden; + + // Set renderer + this._renderer = new GradientToolStripRenderer(); + + // Look for headerText + this.Renderer = this._renderer; + } + } + + #region Custom ToolStrip Renderer + internal class GradientToolStripRenderer : ToolStripProfessionalRenderer + { + Color _startColor = Color.White; + Color _endColor = Color.FromArgb(168, 186, 212); + int _lines = 6; + bool _drawEndLine = true; + + public GradientToolStripRenderer() + { + this.RoundedEdges = false; + } + + public Color EndColor + { + get { return _endColor; } + set { _endColor = value; } + } + + public Color StartColor + { + get { return _startColor; } + set { _startColor = value; } + } + + public int Lines + { + get { return _lines; } + set { _lines = value; } + } + + public bool DrawEndLine + { + get { return _drawEndLine; } + set { _drawEndLine = value; } + } + + protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) + { + Color start = _startColor; + Color end = _endColor; + + ToolStrip toolStrip = e.ToolStrip; + Graphics g = e.Graphics; + + int boundsHeight = e.AffectedBounds.Height; + int height = (boundsHeight + _lines - 1) / _lines; + int width = e.AffectedBounds.Width; + int stripeHeight = height - 1; + Rectangle stripeRect; + + using (Brush b = new LinearGradientBrush(new Rectangle(0, 0, width, stripeHeight), start, end, LinearGradientMode.Horizontal)) + { + for (int idx = 0; idx < _lines; idx++) + { + stripeRect = new Rectangle(0, height * idx + 1, width, stripeHeight); + g.FillRectangle(b, stripeRect); + } + } + + if (this.DrawEndLine) + { + using (Brush solidBrush = new SolidBrush(Color.FromArgb(177, 177, 177))) + { + g.FillRectangle(solidBrush, new Rectangle(0, boundsHeight - 1, width, 1)); + } + } + } + } + #endregion +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/RSSView.Designer.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/RSSView.Designer.cs new file mode 100644 index 0000000..b22f007 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/RSSView.Designer.cs @@ -0,0 +1,316 @@ +namespace System.Windows.Forms.Samples +{ + partial class RSSView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RSSView)); + this.contentPanel = new System.Windows.Forms.Panel(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.Title = new System.Windows.Forms.DataGridViewLinkColumn(); + this.RssItemBindingSource = new System.Windows.Forms.BindingSource(this.components); + this.footerStrip = new System.Windows.Forms.ToolStrip(); + this.updateButton = new System.Windows.Forms.ToolStripButton(); + this.nextButton = new System.Windows.Forms.ToolStripButton(); + this.prevButton = new System.Windows.Forms.ToolStripButton(); + this.addButton = new System.Windows.Forms.ToolStripButton(); + this.imagePanel = new System.Windows.Forms.Panel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.feedBackgroundWorker = new System.ComponentModel.BackgroundWorker(); + this.headerStrip = new System.Windows.Forms.Samples.GradientHeaderStrip(); + this.closeItem = new System.Windows.Forms.Samples.ToolStripHoverItem(); + this.compressItem = new System.Windows.Forms.Samples.ToolStripHoverItem(); + this.headerTextLabel = new System.Windows.Forms.ToolStripLabel(); + this.contentPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.RssItemBindingSource)).BeginInit(); + this.footerStrip.SuspendLayout(); + this.imagePanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.headerStrip.SuspendLayout(); + this.SuspendLayout(); + // + // contentPanel + // + this.contentPanel.Controls.Add(this.dataGridView1); + this.contentPanel.Controls.Add(this.footerStrip); + this.contentPanel.Controls.Add(this.imagePanel); + this.contentPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.contentPanel.Location = new System.Drawing.Point(0, 25); + this.contentPanel.Name = "contentPanel"; + this.contentPanel.Padding = new System.Windows.Forms.Padding(3); + this.contentPanel.Size = new System.Drawing.Size(390, 175); + this.contentPanel.TabIndex = 1; + // + // dataGridView1 + // + this.dataGridView1.AllowUserToAddRows = false; + this.dataGridView1.AllowUserToDeleteRows = false; + this.dataGridView1.AllowUserToOrderColumns = true; + this.dataGridView1.AllowUserToResizeColumns = false; + this.dataGridView1.AllowUserToResizeRows = false; + this.dataGridView1.AutoGenerateColumns = false; + this.dataGridView1.BackgroundColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(254)))), ((int)(((byte)(249))))); + this.dataGridView1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dataGridView1.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dataGridView1.ColumnHeadersVisible = false; + this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.Title}); + this.dataGridView1.DataSource = this.RssItemBindingSource; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(254)))), ((int)(((byte)(249))))); + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridView1.DefaultCellStyle = dataGridViewCellStyle1; + this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.dataGridView1.Location = new System.Drawing.Point(3, 62); + this.dataGridView1.MultiSelect = false; + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.ReadOnly = true; + this.dataGridView1.RowHeadersVisible = false; + this.dataGridView1.RowTemplate.Height = 18; + this.dataGridView1.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.dataGridView1.Size = new System.Drawing.Size(384, 85); + this.dataGridView1.TabIndex = 7; + this.dataGridView1.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellContentClick); + // + // Title + // + this.Title.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.Title.DataPropertyName = "Title"; + this.Title.HeaderText = "Title"; + this.Title.Name = "Title"; + this.Title.ReadOnly = true; + this.Title.Resizable = System.Windows.Forms.DataGridViewTriState.True; + this.Title.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + // + // RssItemBindingSource + // + this.RssItemBindingSource.DataSource = typeof(System.Windows.Forms.Samples.RSS.RssItem); + // + // footerStrip + // + this.footerStrip.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(254)))), ((int)(((byte)(249))))); + this.footerStrip.Dock = System.Windows.Forms.DockStyle.Bottom; + this.footerStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.footerStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.updateButton, + this.nextButton, + this.prevButton, + this.addButton}); + this.footerStrip.Location = new System.Drawing.Point(3, 147); + this.footerStrip.Name = "footerStrip"; + this.footerStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.footerStrip.ShowItemToolTips = false; + this.footerStrip.Size = new System.Drawing.Size(384, 25); + this.footerStrip.TabIndex = 4; + this.footerStrip.Text = "toolStrip1"; + // + // updateButton + // + this.updateButton.Image = global::System.Windows.Forms.Samples.Properties.Resources.update; + this.updateButton.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.updateButton.Name = "updateButton"; + this.updateButton.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0); + this.updateButton.Size = new System.Drawing.Size(71, 22); + this.updateButton.Text = "Refresh"; + this.updateButton.Click += new System.EventHandler(this.updateButton_Click); + // + // nextButton + // + this.nextButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.nextButton.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Underline); + this.nextButton.Margin = new System.Windows.Forms.Padding(0, 1, 6, 2); + this.nextButton.Name = "nextButton"; + this.nextButton.Size = new System.Drawing.Size(33, 22); + this.nextButton.Text = "next"; + this.nextButton.Click += new System.EventHandler(this.nextButton_Click); + // + // prevButton + // + this.prevButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.prevButton.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Underline); + this.prevButton.Name = "prevButton"; + this.prevButton.Size = new System.Drawing.Size(33, 22); + this.prevButton.Text = "prev"; + this.prevButton.Click += new System.EventHandler(this.prevButton_Click); + // + // addButton + // + this.addButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.addButton.Enabled = false; + this.addButton.Image = ((System.Drawing.Image)(resources.GetObject("addButton.Image"))); + this.addButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.addButton.Name = "addButton"; + this.addButton.Size = new System.Drawing.Size(35, 22); + this.addButton.Text = "Save"; + this.addButton.ToolTipText = "Add to Favorites"; + this.addButton.Click += new System.EventHandler(this.addButton_Click); + // + // imagePanel + // + this.imagePanel.AutoSize = true; + this.imagePanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.imagePanel.Controls.Add(this.pictureBox1); + this.imagePanel.Dock = System.Windows.Forms.DockStyle.Top; + this.imagePanel.Location = new System.Drawing.Point(3, 3); + this.imagePanel.Name = "imagePanel"; + this.imagePanel.Padding = new System.Windows.Forms.Padding(0, 0, 0, 3); + this.imagePanel.Size = new System.Drawing.Size(384, 59); + this.imagePanel.TabIndex = 8; + // + // pictureBox1 + // + this.pictureBox1.Location = new System.Drawing.Point(3, 3); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(100, 50); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(32, 19); + // + // feedBackgroundWorker + // + this.feedBackgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.feedBackgroundWorker_DoWork); + this.feedBackgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.feedBackgroundWorker_RunWorkerCompleted); + // + // headerStrip + // + this.headerStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.headerStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.closeItem, + this.compressItem, + this.headerTextLabel}); + this.headerStrip.Location = new System.Drawing.Point(0, 0); + this.headerStrip.Name = "headerStrip"; + this.headerStrip.Size = new System.Drawing.Size(390, 25); + this.headerStrip.TabIndex = 0; + this.headerStrip.Text = "gradientHeaderStrip1"; + // + // closeItem + // + this.closeItem.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.closeItem.Checked = false; + this.closeItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.closeItem.Image = global::System.Windows.Forms.Samples.Properties.Resources.close; + this.closeItem.ImageCheck = null; + this.closeItem.ImageCheckHover = null; + this.closeItem.ImageHover = global::System.Windows.Forms.Samples.Properties.Resources.close2; + this.closeItem.ImageNormal = global::System.Windows.Forms.Samples.Properties.Resources.close; + this.closeItem.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.closeItem.Name = "closeItem"; + this.closeItem.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; + this.closeItem.Size = new System.Drawing.Size(16, 22); + this.closeItem.Text = "toolStripHoverItem1"; + this.closeItem.Click += new System.EventHandler(this.closeItem_Click); + // + // compressItem + // + this.compressItem.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.compressItem.Checked = false; + this.compressItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.compressItem.Image = global::System.Windows.Forms.Samples.Properties.Resources.compress; + this.compressItem.ImageCheck = global::System.Windows.Forms.Samples.Properties.Resources.expand; + this.compressItem.ImageCheckHover = global::System.Windows.Forms.Samples.Properties.Resources.expand2; + this.compressItem.ImageHover = global::System.Windows.Forms.Samples.Properties.Resources.compress2; + this.compressItem.ImageNormal = global::System.Windows.Forms.Samples.Properties.Resources.compress; + this.compressItem.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.compressItem.Name = "compressItem"; + this.compressItem.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; + this.compressItem.Size = new System.Drawing.Size(16, 22); + this.compressItem.Text = "toolStripHoverItem2"; + this.compressItem.CheckedChanged += new System.EventHandler(this.compressItem_CheckedChanged); + // + // headerTextLabel + // + this.headerTextLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(49)))), ((int)(((byte)(97)))), ((int)(((byte)(156))))); + this.headerTextLabel.Name = "headerTextLabel"; + this.headerTextLabel.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; + this.headerTextLabel.Padding = new System.Windows.Forms.Padding(5, 0, 0, 0); + this.headerTextLabel.Size = new System.Drawing.Size(42, 22); + this.headerTextLabel.Text = "[Text]"; + // + // RSSView + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.Controls.Add(this.contentPanel); + this.Controls.Add(this.headerStrip); + this.MinimumSize = new System.Drawing.Size(390, 30); + this.Name = "RSSView"; + this.Size = new System.Drawing.Size(390, 200); + this.Load += new System.EventHandler(this.RSSView_Load); + this.contentPanel.ResumeLayout(false); + this.contentPanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.RssItemBindingSource)).EndInit(); + this.footerStrip.ResumeLayout(false); + this.footerStrip.PerformLayout(); + this.imagePanel.ResumeLayout(false); + this.imagePanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.headerStrip.ResumeLayout(false); + this.headerStrip.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private Panel contentPanel; + private ToolStrip footerStrip; + private ToolStripButton nextButton; + private ToolStripButton prevButton; + private ToolStripButton updateButton; + private DataGridView dataGridView1; + private Panel imagePanel; + private PictureBox pictureBox1; + private BindingSource RssItemBindingSource; + private GradientHeaderStrip headerStrip; + private ToolStripHoverItem closeItem; + private ToolStripHoverItem compressItem; + private ToolStripLabel headerTextLabel; + private ToolStripMenuItem toolStripMenuItem1; + private ToolStripButton addButton; + private System.ComponentModel.BackgroundWorker feedBackgroundWorker; + private DataGridViewLinkColumn Title; + + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/RSSView.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/RSSView.cs new file mode 100644 index 0000000..c8d9e88 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/RSSView.cs @@ -0,0 +1,487 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.Samples.RSS; + +namespace System.Windows.Forms.Samples +{ + public partial class RSSView : UserControl + { + private string _url = string.Empty; + private int _initialHeight; + private bool _showUpdate = true; + private bool _bound = false; + private RssFeed _feed; + private BindingList _items = null; + private bool _loaded=false; + private bool _showImage = true; + + private int _rowHeight = -1; + private int _height = -1; + private int _rowCount = -1; // Max visible rows + private int _displayedRows = -1; // # of displayed rows + private int _pageCount = 0; + private int _currentPage = 0; + private bool _maximized = true; + + public RSSView() + { + InitializeComponent(); + + // Save initialize Size + this._initialHeight = this.Size.Height; + } + + #region Public API + public string HeaderText + { + get { return this.headerTextLabel.Text; } + set { this.headerTextLabel.Text = value; } + } + + [DefaultValue(true)] + public bool ShowRefresh + { + get { return _showUpdate; } + set + { + // Set value + _showUpdate = value; + + if (null != _feed) + { + BindToUI(); + } + } + } + + [Browsable(false)] + public RssFeed RssFeed + { + get { return _feed; } + } + + public bool ShowImage + { + get { return _showImage; } + set { _showImage = value; } + } + + private void SetState(bool max) + { + if (!max) + { + // Checked - minimize + this.Size = new Size(this.Size.Width, this.MinimumSize.Height); + this.contentPanel.Visible = false; + this.compressItem.Checked = true; + } + else + { + // Unchecked - restore + this.contentPanel.Visible = true; + this.compressItem.Checked = false; + this.Size = new Size(this.Size.Width, this._initialHeight); + + // Adjust view + AdjustView(false); + } + + // Notify clients + OnStateChanged(EventArgs.Empty); + } + + public bool Maximized + { + get { return this.contentPanel.Visible; } + set + { + if (this._maximized != value) + { + // Update state + this._maximized = value; + + // Change + SetState(value); + } + } + } + + // State changed event + public event EventHandler StateChanged; + + protected virtual void OnStateChanged(EventArgs e) + { + if (null != StateChanged) + { + StateChanged(this, e); + } + } + + // LinkClicked event + public event LinkClickedEventHandler LinkClicked; + + protected virtual void OnLinkClicked(LinkClickedEventArgs e) + { + // Fire event + if (null != LinkClicked) + { + LinkClicked(this, e); + } + } + + // Completed Event + public event EventHandler LoadStart; + public event EventHandler LoadComplete; + + protected virtual void OnLoadStart(EventArgs e) + { + // Set header text + this.headerTextLabel.Text = "Loading..."; + + // Set Cursor + this.Cursor = Cursors.WaitCursor; + + // Fire event + if (null != LoadStart) + { + LoadStart(this, e); + } + } + + protected virtual void OnLoadComplete(EventArgs e) + { + // Do complete work + BindToUI(); + + // Enable "Save" button if the link is not in the list + this.addButton.Enabled = (RssLink.FindLink(this.URL) < 0); + + // Reset Cursor + this.Cursor = Cursors.Default; + + // Fire event + if (null != LoadComplete) + { + LoadComplete(this, e); + } + } + + [DefaultValue(null)] + public string URL + { + get { return _url; } + set + { + // Set value + _url = value; + + // Refresh the UI + if (!(String.IsNullOrEmpty(_url)) && _loaded) + { + Reload(); + } + } + } + + public void Reload() + { + // Fire Start + if (InDesignMode) + { + // Just display header + this.headerTextLabel.Text = _url.Remove(30) + "..."; + } + else + { + OnLoadStart(EventArgs.Empty); + + // Load Feed in BackgroundWorker + feedBackgroundWorker.RunWorkerAsync(_url); + } + } + #endregion + + #region Private API + private void BindToUI() + { + // Bind + _bound = true; + + if ((null != _feed.Image) && (this.ShowImage)) + { + // Set image + this.pictureBox1.Image = _feed.Image; + } + + // Set label + this.headerTextLabel.Text = _feed.Title; + + // Set view + this.imagePanel.Visible = ((null != _feed.Image) && (this.ShowImage)); + + // Set Update + this.updateButton.Visible = _showUpdate; + + // Adjust view + AdjustView(true); + } + + private void RefreshData() + { + // Complete refresh - re-fill the list with the current feed data. + if (_bound) + { + int start = _currentPage * _displayedRows; + int end = Math.Min(start + _displayedRows, _feed.Items.Count); + + // Suspend binding (for perf reasons) + _items.RaiseListChangedEvents = false; + + // Fill List + _items.Clear(); + + for (int idx = start; idx < end; idx++) + { + _items.Add(_feed.Items[idx]); + } + + // Show items + _items.RaiseListChangedEvents = true; + _items.ResetBindings(); + + // Don't show more + bool show = (_pageCount != 0); + + this.nextButton.Visible = show; + this.prevButton.Visible = show; + + if (show) + { + this.nextButton.Enabled = (_currentPage < _pageCount); + this.prevButton.Enabled = (_currentPage != 0); + } + } + } + + private void AdjustRows(bool refresh) + { + if (_bound) + { + int rows = (_height - 2) / _rowHeight; + bool visible = false; + + // Check to see if the max rows changed + if (refresh || (rows != _rowCount)) + { + // Update + _rowCount = Math.Max(rows, 1); + + // Check to see if we can display more/less rows + int displayedRows = Math.Min(_rowCount, _feed.Items.Count); + + if (refresh || (_displayedRows != displayedRows)) + { + if (displayedRows >= _feed.Items.Count) + { + // We can display all rows + visible = _showUpdate; + + // Reset page + _pageCount = 0; + } + else + { + // Need to page + visible = true; + + // Calculate Page Count + _pageCount = ((_feed.Items.Count - 1) / _rowCount); + } + + // Set values + _currentPage = 0; + _displayedRows = displayedRows; + + // Display rows + RefreshData(); + } + } + } + } + + private void AdjustView(bool refresh) + { + if (_bound) + { + // If the height changed, then we need to refresh and adjust the # of rows + if (refresh || ((null != _feed.Items) && (this.dataGridView1.Height != _height))) + { + _height = this.dataGridView1.Height; + AdjustRows(refresh); + } + } + } + + private void dataGridView1_SizeChanged(object sender, EventArgs e) + { + AdjustView(false); + } + + private void nextButton_Click(object sender, EventArgs e) + { + // More clicked + _currentPage++; + + // Display data + RefreshData(); + } + + private void prevButton_Click(object sender, EventArgs e) + { + // Prev clicked + _currentPage--; + + // Refresh + RefreshData(); + } + + private void updateButton_Click(object sender, EventArgs e) + { + Reload(); + } + + private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) + { + if (!(string.IsNullOrEmpty(this.dataGridView1.Columns[e.ColumnIndex].DataPropertyName))) + { + RssItem item = _items[e.RowIndex]; + } + } + + private bool ControlInDesignMode(Control ctrl) + { + return ((ctrl != null) && (null != this.Site) && (this.Site.DesignMode == true)); + } + + private bool InDesignMode + { + get { return (ControlInDesignMode(this) || (ControlInDesignMode(this.Parent))); } + } + #endregion + + #region Event Handlers + private void compressItem_CheckedChanged(object sender, EventArgs e) + { + this.Maximized = !this.compressItem.Checked; + } + + private void RSSView_Load(object sender, EventArgs e) + { + // Set Font + this.headerTextLabel.Font = new Font(SystemFonts.IconTitleFont, FontStyle.Bold); + + // Set defaults + _rowHeight = this.dataGridView1.RowTemplate.Height; + + // Create list + _items = new BindingList(); + + // Bind grid + this.RssItemBindingSource.DataSource = _items; + + // Set Loaded flag + _loaded = true; + + // Check for load required + if (!String.IsNullOrEmpty(this.URL)) + { + Reload(); + } + } + + private void addButton_Click(object sender, EventArgs e) + { + RssLink.Add(_feed.Title, this.URL); + this.addButton.Enabled = false; + } + + private void closeItem_Click(object sender, EventArgs e) + { + this.Parent.Controls.Remove(this); + } + + private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + if ((e.RowIndex >= 0) && (e.RowIndex < _items.Count)) + { + OnLinkClicked(new LinkClickedEventArgs(_items[e.RowIndex].Link)); + } + } + + private void feedBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) + { + // This method will run on a thread other than the UI thread. + // Be sure not to manipulate any Windows Forms controls created + // on the UI thread from this method. + + RssFeed feed = new RssFeed(); + + // Load + feed.Load(e.Argument as string); + + // Return result + e.Result = feed; + } + + private void feedBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + // Got the feed + _feed = (e.Result as RssFeed); + + // Notify others + OnLoadComplete(EventArgs.Empty); + } + #endregion + } + + #region Link Clicked Event + public class LinkClickedEventArgs : EventArgs + { + private string _url = null; + + /// + /// Initializes a new instance of the class, + /// with no new object defined. + /// + public LinkClickedEventArgs() : base() + { + } + + /// + /// Initializes a new instance of the class, + /// with the specified object defined as the default new object. + /// + public LinkClickedEventArgs(string url) : base() + { + _url = url; + } + + /// + /// Gets or sets the new object that will be added to the list. + /// + public string URL + { + get { return _url; } + set { _url = value; } + } + } + + public delegate void LinkClickedEventHandler(object sender, LinkClickedEventArgs e); + + #endregion +} diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/RSSView.resx b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/RSSView.resx new file mode 100644 index 0000000..c805ffe --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/RSSView.resx @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 230, 17 + + + 126, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL + U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI + VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ + QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 + /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 + cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j + 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR + dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb + NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE + s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC + + + + 393, 17 + + + 17, 17 + + + 59 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/ToolStripHoverItem.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/ToolStripHoverItem.cs new file mode 100644 index 0000000..2492ef4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Components/ToolStripHoverItem.cs @@ -0,0 +1,169 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; + +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Windows.Forms; +using System.Reflection; +using System.Windows.Forms.Design; + +#endregion + +namespace System.Windows.Forms.Samples +{ + [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip)] + public class ToolStripHoverItem : ToolStripLabel + { + private Image _hoverImage = null; + private Image _image = null; + private Image _checkImage = null; + private Image _checkHoverImage = null; + private Image _onEnter = null; + private Image _onLeave = null; + private bool _checked = false; + private bool _hover = false; + + public ToolStripHoverItem() + { + this.DisplayStyle = ToolStripItemDisplayStyle.Image; + } + + #region Public Properties + public Image ImageHover + { + get { return _hoverImage; } + set + { + _hoverImage = value; + + // Set default OnEnter image + if (null == _onEnter) + { + _onEnter = _hoverImage; + } + } + } + + public Image ImageNormal + { + get { return _image; } + set + { + _image = value; + + // Set as default + if (null == base.Image) + { + base.Image = _image; + } + + // Set default OnLeave image + if (null == _onLeave) + { + _onLeave = _image; + } + } + } + + public Image ImageCheck + { + get { return _checkImage; } + set { _checkImage = value; } + } + + public Image ImageCheckHover + { + get { return _checkHoverImage; } + set { _checkHoverImage = value; } + } + + public bool Checked + { + get { return _checked; } + set { SetState(value); } + } + + public event EventHandler CheckedChanged; + + protected virtual void OnCheckedChanged(EventArgs e) + { + if (null != CheckedChanged) + { + CheckedChanged(this, e); + } + } + #endregion + + #region Overrides + protected override void OnMouseEnter(EventArgs e) + { + // Save image + if (null != _onEnter) + { + // Swap + base.Image = _onEnter; + _hover = true; + } + + // Call base + base.OnMouseEnter(e); + } + + protected override void OnMouseLeave(EventArgs e) + { + // Swap image + if (null != _onLeave) + { + base.Image = _onLeave; + _hover = false; + } + + // Call base + base.OnMouseLeave(e); + } + + private void SetState(bool state) + { + // Then do our work + if (_checked != state) + { + _checked = state; + + // Set clicked images + if ((null != _checkImage) && (null != _checkHoverImage)) + { + if (_checked) + { + _onEnter = _checkHoverImage; + _onLeave = _checkImage; + } + else + { + _onEnter = _hoverImage; + _onLeave = _image; + } + + // Set image based on click and hover state + base.Image = (_hover ? _onEnter : _onLeave); + + // Fire on CheckedChanged + OnCheckedChanged(EventArgs.Empty); + } + } + } + + protected override void OnClick(EventArgs e) + { + // Call the base (click event first) + base.OnClick(e); + + // Set the state + SetState(!_checked); + } + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Data/links.dat b/Pro Windows Forms 2.0/Chapter21/RSSReader/Data/links.dat new file mode 100644 index 0000000..8eab032 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Data/links.dat differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Feeds.txt b/Pro Windows Forms 2.0/Chapter21/RSSReader/Feeds.txt new file mode 100644 index 0000000..ff5968a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Feeds.txt @@ -0,0 +1,70 @@ +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=1 (Recent) +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=6 (Recent Posts) +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=4 (Popular Controls) +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=5 (Recent posts) +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=7 (New Threads) +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=8 (Top Articles) +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=9 (Top Whidbey Articles) +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=10 (Recent Whidbey Posts) +http://www.only4gurus.com/v2/rss/cat.asp?Cat=VB.NET (VB.NET) +http://www.amazon.com/exec/obidos/subst/xs/syndicate.html/002-8556173-1415223 +http://xml-na.amznxslt.com/onca/xml3?mode=books&bcm=Books%3A%20Nonfiction%20&t=webservices-20&dev-t=amznRss&type=lite&page=1&ct=text/xml&sort=+salesrank&f=http://xml.amazon.com/xsl/xml-rss091.xsl&BrowseNodeSearch=53 +http://rss.pcworld.com/rss/pg_feed.rss?pgid=33 +http://www.microsite.reuters.com/rss/sportsNews +http://www.microsite.reuters.com/rss/technologyNews +http://www.microsite.reuters.com/rss/oddlyEnoughNews +http://www.washingtonpost.com/wp-srv/opinion/rssheadlines.xml +http://msdn.microsoft.com/msdntv/rss.xml +http://msdn.microsoft.com/vcsharp/rss.xml +http://dwlt.net/tapestry/dilbert.rdf +http://seattlepi.nwsource.com/rss/huskies.rss +http://feeds.zdnet.co.uk/rss/0,39026141,10000003c,00.htm +http://z.about.com/6/g/seattle/b/index.xml\ +http://xml-na.amznxslt.com/onca/xml3?mode=electronics&bcm=Electronics%3A%20Computer%20%26%20Video%20Games%3A%20Xbox&t=webservices-20&dev-t=amznRss&type=lite&page=1&ct=text/xml&sort=+salesrank&f=http://xml.amazon.com/xsl/xml-rss091.xsl&BrowseNodeSearch=537504 +http://xml-na.amznxslt.com/onca/xml3?mode=books&bcm=Books%3A%20Nonfiction%20&t=webservices-20&dev-t=amznRss&type=lite&page=1&ct=text/xml&sort=+salesrank&f=http://xml.amazon.com/xsl/xml-rss091.xsl&BrowseNodeSearch=53 +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=6 +http://rss.allrecipes.com/2/7.xml +http://www.microsite.reuters.com/rss/oddlyEnoughNews +http://www.only4gurus.com/v2/rss/cat.asp?Cat=VB.NET +http://seattlepi.nwsource.com/rss/local.rss +http://feeds.zdnet.co.uk/rss/0,39026141,10000003c,00.htm +http://z.about.com/6/g/seattle/b/index.xml +http://seattlepi.nwsource.com/rss/huskies.rss +http://slashdot.org/slashdot.rdf +http://xml-na.amznxslt.com/onca/xml3?mode=books&bcm=Books%3A%20Nonfiction%20&t=webservices-20&dev-t=amznRss&type=lite&page=1&ct=text/xml&sort=+salesrank&f=http://xml.amazon.com/xsl/xml-rss091.xsl&BrowseNodeSearch=53 +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=6 +http://rss.allrecipes.com/2/7.xml +http://www.microsite.reuters.com/rss/oddlyEnoughNews +http://www.only4gurus.com/v2/rss/cat.asp?Cat=VB.NET +http://blogs.msdn.com/MainFeed.aspx +http://www.simplegeek.com/blogxbrowsing.asmx/GetRss +http://msdn.microsoft.com/smartclient/rss.xml +http://msdn.microsoft.com/rss.xml + + +http://xml-na.amznxslt.com/onca/xml3?mode=books&bcm=Books%3A%20Nonfiction%20&t=webservices-20&dev-t=amznRss&type=lite&page=1&ct=text/xml&sort=+salesrank&f=http://xml.amazon.com/xsl/xml-rss091.xsl&BrowseNodeSearch=53 +http://xml-na.amznxslt.com/onca/xml3?mode=electronics&bcm=Electronics%3A%20Computer%20%26%20Video%20Games%3A%20Xbox&t=webservices-20&dev-t=amznRss&type=lite&page=1&ct=text/xml&sort=+salesrank&f=http://xml.amazon.com/xsl/xml-rss091.xsl&BrowseNodeSearch=537504 +http://blogs.msdn.com/MainFeed.aspx +http://www.simplegeek.com/blogxbrowsing.asmx/GetRss +http://msdn.microsoft.com/smartclient/rss.xml +http://msdn.microsoft.com/rss.xml +http://z.about.com/6/g/seattle/b/index.xml +http://seattlepi.nwsource.com/rss/local.rss +http://www.windowsforms.net/rss/rssFeed.aspx?PageID=6 +http://www.microsite.reuters.com/rss/oddlyEnoughNews +http://www.only4gurus.com/v2/rss/cat.asp?Cat=VB.NET +http://rss.pcworld.com/rss/pg_feed.rss?pgid=33 +http://www.microsite.reuters.com/rss/sportsNews +http://rss.allrecipes.com/2/7.xml +http://www.tapestrycomics.com/dilbert.xml + + +http://xml-na.amznxslt.com/onca/xml3?mode=books&bcm=Books%3A%20Nonfiction%20&t=webservices-20&dev-t=amznRss&type=lite&page=1&ct=text/xml&sort=+salesrank&f=http://xml.amazon.com/xsl/xml-rss091.xsl&BrowseNodeSearch=53 +http://www.tapestrycomics.com/dilbert.xml +http://music.msn.com/services/rss.aspx?chartname=topsongs +http://rss.msnbc.msn.com/id/3032112/device/rss/rss.xml +http://blogs.msdn.com/pdc/rss.aspx +http://syndication.soccerway.com/rss/feed.php +http://www.wugnet.com/windowsmarketplace/rss/rssfeeds/wmswgraphicpub.xml +http://today.reuters.com/rss/oddlyEnoughNews/ + diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/back.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/back.png new file mode 100644 index 0000000..0b13c96 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/back.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/bluefooter.bmp b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/bluefooter.bmp new file mode 100644 index 0000000..646e8b1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/bluefooter.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/blueheader.bmp b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/blueheader.bmp new file mode 100644 index 0000000..8d1bbc1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/blueheader.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/browse.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/browse.png new file mode 100644 index 0000000..962c3f1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/browse.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/close.PNG b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/close.PNG new file mode 100644 index 0000000..21cf0e4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/close.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/close2.PNG b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/close2.PNG new file mode 100644 index 0000000..a1239e4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/close2.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/compress.PNG b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/compress.PNG new file mode 100644 index 0000000..4e77961 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/compress.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/compress2.PNG b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/compress2.PNG new file mode 100644 index 0000000..155c4d8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/compress2.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/email.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/email.png new file mode 100644 index 0000000..255a08d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/email.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/expand.PNG b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/expand.PNG new file mode 100644 index 0000000..eeed716 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/expand.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/expand2.PNG b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/expand2.PNG new file mode 100644 index 0000000..676d925 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/expand2.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/forward.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/forward.png new file mode 100644 index 0000000..92bd94d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/forward.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/graphs.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/graphs.png new file mode 100644 index 0000000..effd602 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/graphs.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/help.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/help.png new file mode 100644 index 0000000..5834b54 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/help.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/home.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/home.png new file mode 100644 index 0000000..46711b4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/home.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/more.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/more.png new file mode 100644 index 0000000..4007df8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/more.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/online.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/online.png new file mode 100644 index 0000000..0b819e8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/online.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/orders.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/orders.png new file mode 100644 index 0000000..c47f317 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/orders.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/reports.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/reports.png new file mode 100644 index 0000000..7ae37dc Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/reports.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/sound.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/sound.png new file mode 100644 index 0000000..73402fb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/sound.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/trends.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/trends.png new file mode 100644 index 0000000..89d1002 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/trends.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/update.PNG b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/update.PNG new file mode 100644 index 0000000..ec8b133 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/update.PNG differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/updates.png b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/updates.png new file mode 100644 index 0000000..3159fd5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/Images/updates.png differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/LinksEditor.Designer.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/LinksEditor.Designer.cs new file mode 100644 index 0000000..71b1e95 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/LinksEditor.Designer.cs @@ -0,0 +1,163 @@ +namespace System.Windows.Forms.Samples +{ + partial class LinksEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.upButton = new System.Windows.Forms.Button(); + this.downButton = new System.Windows.Forms.Button(); + this.RssLinkBindingSource = new System.Windows.Forms.BindingSource(this.components); + this.Title = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ShowImage = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.URL = new System.Windows.Forms.DataGridViewTextBoxColumn(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.RssLinkBindingSource)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView1 + // + this.dataGridView1.AllowUserToAddRows = false; + this.dataGridView1.AllowUserToResizeRows = false; + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.AutoGenerateColumns = false; + this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.Title, + this.ShowImage, + this.URL}); + this.dataGridView1.DataSource = this.RssLinkBindingSource; + this.dataGridView1.Location = new System.Drawing.Point(0, 0); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.RowHeadersVisible = false; + this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dataGridView1.Size = new System.Drawing.Size(460, 249); + this.dataGridView1.TabIndex = 0; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.Location = new System.Drawing.Point(296, 259); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "OK"; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button2.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.button2.Location = new System.Drawing.Point(377, 259); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 2; + this.button2.Text = "Cancel"; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // upButton + // + this.upButton.Location = new System.Drawing.Point(12, 259); + this.upButton.Name = "upButton"; + this.upButton.Size = new System.Drawing.Size(75, 23); + this.upButton.TabIndex = 3; + this.upButton.Text = "Move Up"; + this.upButton.UseVisualStyleBackColor = true; + this.upButton.Click += new System.EventHandler(this.upButton_Click); + // + // downButton + // + this.downButton.Location = new System.Drawing.Point(93, 259); + this.downButton.Name = "downButton"; + this.downButton.Size = new System.Drawing.Size(75, 23); + this.downButton.TabIndex = 4; + this.downButton.Text = "Move Down"; + this.downButton.UseVisualStyleBackColor = true; + this.downButton.Click += new System.EventHandler(this.downButton_Click); + // + // RssLinkBindingSource + // + this.RssLinkBindingSource.DataSource = typeof(System.Windows.Forms.Samples.RSS.RssLink); + this.RssLinkBindingSource.PositionChanged += new System.EventHandler(this.RssLinkBindingSource_PositionChanged); + // + // Title + // + this.Title.DataPropertyName = "Title"; + this.Title.HeaderText = "Title"; + this.Title.Name = "Title"; + this.Title.Width = 160; + // + // ShowImage + // + this.ShowImage.DataPropertyName = "ShowImage"; + this.ShowImage.HeaderText = "Show Image"; + this.ShowImage.Name = "ShowImage"; + this.ShowImage.Width = 80; + // + // URL + // + this.URL.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.URL.DataPropertyName = "URL"; + this.URL.HeaderText = "URL"; + this.URL.Name = "URL"; + // + // LinksEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(459, 290); + this.Controls.Add(this.downButton); + this.Controls.Add(this.upButton); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Controls.Add(this.dataGridView1); + this.Name = "LinksEditor"; + this.Text = "Links Editor"; + this.Load += new System.EventHandler(this.LinksEditor_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.RssLinkBindingSource)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView1; + private System.Windows.Forms.BindingSource RssLinkBindingSource; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private Button upButton; + private Button downButton; + private DataGridViewTextBoxColumn Title; + private DataGridViewCheckBoxColumn ShowImage; + private DataGridViewTextBoxColumn URL; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/LinksEditor.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/LinksEditor.cs new file mode 100644 index 0000000..f4ed61c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/LinksEditor.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using System.Windows.Forms.Samples.RSS; + +namespace System.Windows.Forms.Samples +{ + public partial class LinksEditor : Form + { + public LinksEditor() + { + InitializeComponent(); + } + + private void button1_Click(object sender, EventArgs e) + { + // Save + RssLink.Save(); + this.Close(); + } + + private void LinksEditor_Load(object sender, EventArgs e) + { + // Load and bind + this.RssLinkBindingSource.DataSource = RssLink.Links; + } + + private void button2_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void RssLinkBindingSource_PositionChanged(object sender, EventArgs e) + { + if ((this.RssLinkBindingSource.Count == 0) || (RssLinkBindingSource.Position == 0)) + { + this.upButton.Enabled = false; + } + else + { + this.upButton.Enabled = true; + } + + if ((this.RssLinkBindingSource.Count == 0) || (this.RssLinkBindingSource.Position == (this.RssLinkBindingSource.Count - 1))) + { + this.downButton.Enabled = false; + } + else + { + this.downButton.Enabled = true; + } + } + + private void upButton_Click(object sender, EventArgs e) + { + RssLink link = this.RssLinkBindingSource.Current as RssLink; + int pos = this.RssLinkBindingSource.Position; + + // Move item up + if (null != link) + { + this.RssLinkBindingSource.RemoveCurrent(); + this.RssLinkBindingSource.Insert(pos - 1, link); + + // Set new position + this.RssLinkBindingSource.Position = pos - 1; + } + } + + private void downButton_Click(object sender, EventArgs e) + { + RssLink link = this.RssLinkBindingSource.Current as RssLink; + int pos = this.RssLinkBindingSource.Position; + + // Move item up + if (null != link) + { + this.RssLinkBindingSource.RemoveCurrent(); + this.RssLinkBindingSource.Insert(pos+1, link); + + // Set new position + this.RssLinkBindingSource.Position = pos + 1; + + // Verify position (DGV bug) + if (RssLinkBindingSource.Position != pos + 1) + { + RssLinkBindingSource.MoveLast(); + } + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/LinksEditor.resx b/Pro Windows Forms 2.0/Chapter21/RSSReader/LinksEditor.resx new file mode 100644 index 0000000..4f0096e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/LinksEditor.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/MainForm.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/MainForm.cs new file mode 100644 index 0000000..c1d4964 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/MainForm.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +using System.Windows.Forms.Samples.RSS; + +namespace System.Windows.Forms.Samples +{ + public partial class MainForm : Form + { + private int _width = -1; + + public MainForm() + { + InitializeComponent(); + } + + private void MainForm_Load(object sender, EventArgs e) + { + // Bind + this.comboBox1.DataSource = RssLink.Links; + + // Load Links + int firstThree = 3; + + foreach (RssLink link in RssLink.Links) + { + // Add link + AddView(link.URL, (firstThree > 0), link.ShowImage); + + // Set to false + firstThree--; + } + } + + private void reportsButton_Click(object sender, EventArgs e) + { + (new LinksEditor()).ShowDialog(); + } + + private void AddView(string url, bool maximized, bool showImage) + { + // Create view + RSSView view = new RSSView(); + + // Minimize other views + //if (maximized) + //{ + // MinimizeViews(null); + //} + + // Initialize view + view.ShowImage = showImage; + view.Maximized = maximized; + + // Add to panel + this.rssFlowPanel.Controls.Add(view); + + // Set URL + view.URL = url; + } + + private void button1_Click(object sender, EventArgs e) + { + // Add item + int pos = RssLink.FindLink(this.comboBox1.SelectedValue as string); + + if (pos != -1) + { + RssLink link = RssLink.Links[pos]; + AddView(link.URL, true, link.ShowImage); + } + else + { + AddView(this.comboBox1.SelectedValue as string, true, true); + } + } + + private void button2_Click(object sender, EventArgs e) + { + // Add item + AddView(this.textBox1.Text, true, true); + } + + private void ResetViews() + { + foreach (Control ctrl in this.rssFlowPanel.Controls) + { + if (ctrl is RSSView) + { + SetViewSize(ctrl as RSSView); + } + } + } + + private void SetViewSize(RSSView view) + { + // Get width of view + int padding = view.Margin.Right + view.Margin.Left; + int viewWidth = view.MinimumSize.Width + padding; + int halfWidth = _width / 2; + + // Set width + if (halfWidth > viewWidth) + { + view.Width = halfWidth - padding; + } + else + { + view.Width = (_width - padding); + } + } + + //private void MinimizeViews(RSSView maximized) + //{ + // RSSView view; + + // foreach (Control ctrl in this.rssFlowPanel.Controls) + // { + // view = (ctrl as RSSView); + + // if ((null != view) && (view != maximized) && (view.Maximized)) + // { + // view.Maximized = false; + // } + // } + //} + + private void FlowLayoutPanel_ControlAdded(object sender, ControlEventArgs e) + { + if (e.Control is RSSView) + { + RSSView view = e.Control as RSSView; + + // Set Size + SetViewSize(view); + + // Handle link click + view.LinkClicked += new System.Windows.Forms.Samples.LinkClickedEventHandler(RSSView_LinkClicked); + + // Handle Expand/Compress + //view.StateChanged += delegate(object sview, EventArgs args) + //{ + // // Check + // RSSView vw = (sview as RSSView); + + // if ((null != vw) && (vw.Maximized)) + // { + // MinimizeViews(vw); + // } + //}; + } + } + + void RSSView_LinkClicked(object sender, System.Windows.Forms.Samples.LinkClickedEventArgs e) + { + Browser browser = new Browser(); + + browser.URL = e.URL; + browser.Show(); + } + + private void rssFlowPanel_Resize(object sender, EventArgs e) + { + // Get the new size + int width = this.rssFlowPanel.ClientSize.Width - this.rssFlowPanel.Padding.Left - this.rssFlowPanel.Padding.Right; + + if ((this.ClientSize.Width > 0) && (width != _width)) + { + // Set Width + _width = width; + + // Reset sizes + ResetViews(); + } + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/MainForm.designer.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/MainForm.designer.cs new file mode 100644 index 0000000..851e911 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/MainForm.designer.cs @@ -0,0 +1,500 @@ +namespace System.Windows.Forms.Samples +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.customMenuStrip1 = new System.Windows.Forms.Samples.CustomMenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.favoritesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.reportsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.topPanel = new System.Windows.Forms.Panel(); + this.button2 = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.RssLinkBindingSource = new System.Windows.Forms.BindingSource(this.components); + this.panel1 = new System.Windows.Forms.Panel(); + this.label2 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.rssFlowPanel = new System.Windows.Forms.FlowLayoutPanel(); + this.customToolStrip1 = new System.Windows.Forms.Samples.CustomToolStrip(); + this.backButton = new System.Windows.Forms.ToolStripButton(); + this.forwardButton = new System.Windows.Forms.ToolStripButton(); + this.homeButton = new System.Windows.Forms.ToolStripButton(); + this.reportsButton = new System.Windows.Forms.ToolStripButton(); + this.browseButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton4 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton10 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton11 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton12 = new System.Windows.Forms.ToolStripButton(); + this.customToolStrip2 = new System.Windows.Forms.Samples.CustomToolStrip(); + this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton13 = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.customMenuStrip1.SuspendLayout(); + this.topPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.RssLinkBindingSource)).BeginInit(); + this.panel3.SuspendLayout(); + this.customToolStrip1.SuspendLayout(); + this.customToolStrip2.SuspendLayout(); + this.SuspendLayout(); + // + // customMenuStrip1 + // + this.customMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.favoritesToolStripMenuItem, + this.toolsToolStripMenuItem, + this.reportsToolStripMenuItem, + this.optionsToolStripMenuItem, + this.helpToolStripMenuItem}); + this.customMenuStrip1.Location = new System.Drawing.Point(0, 0); + this.customMenuStrip1.Name = "customMenuStrip1"; + this.customMenuStrip1.Size = new System.Drawing.Size(831, 24); + this.customMenuStrip1.TabIndex = 0; + this.customMenuStrip1.Text = "customMenuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20); + this.fileToolStripMenuItem.Text = "File"; + // + // favoritesToolStripMenuItem + // + this.favoritesToolStripMenuItem.Name = "favoritesToolStripMenuItem"; + this.favoritesToolStripMenuItem.Size = new System.Drawing.Size(64, 20); + this.favoritesToolStripMenuItem.Text = "Favorites"; + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.toolsToolStripMenuItem.Text = "Tools"; + // + // reportsToolStripMenuItem + // + this.reportsToolStripMenuItem.Name = "reportsToolStripMenuItem"; + this.reportsToolStripMenuItem.Size = new System.Drawing.Size(57, 20); + this.reportsToolStripMenuItem.Text = "Reports"; + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(56, 20); + this.optionsToolStripMenuItem.Text = "Options"; + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(40, 20); + this.helpToolStripMenuItem.Text = "Help"; + // + // topPanel + // + this.topPanel.Controls.Add(this.button2); + this.topPanel.Controls.Add(this.textBox1); + this.topPanel.Controls.Add(this.label1); + this.topPanel.Controls.Add(this.button1); + this.topPanel.Controls.Add(this.comboBox1); + this.topPanel.Controls.Add(this.panel1); + this.topPanel.Controls.Add(this.label2); + this.topPanel.Controls.Add(this.panel2); + this.topPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.topPanel.Location = new System.Drawing.Point(0, 72); + this.topPanel.Name = "topPanel"; + this.topPanel.Size = new System.Drawing.Size(831, 52); + this.topPanel.TabIndex = 10; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(766, 15); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(32, 23); + this.button2.TabIndex = 15; + this.button2.Text = "Go"; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(478, 17); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(282, 20); + this.textBox1.TabIndex = 14; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(49)))), ((int)(((byte)(97)))), ((int)(((byte)(156))))); + this.label1.Location = new System.Drawing.Point(397, 21); + this.label1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 3); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(75, 13); + this.label1.TabIndex = 13; + this.label1.Text = "&Enter a URL:"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(327, 16); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(32, 23); + this.button1.TabIndex = 11; + this.button1.Text = "Go"; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // comboBox1 + // + this.comboBox1.DataSource = this.RssLinkBindingSource; + this.comboBox1.DisplayMember = "Title"; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(111, 17); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(210, 21); + this.comboBox1.TabIndex = 10; + this.comboBox1.ValueMember = "URL"; + // + // RssLinkBindingSource + // + this.RssLinkBindingSource.DataSource = typeof(System.Windows.Forms.Samples.RSS.RssLink); + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(198)))), ((int)(((byte)(195)))), ((int)(((byte)(198))))); + this.panel1.Location = new System.Drawing.Point(14, 12); + this.panel1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 3); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(790, 1); + this.panel1.TabIndex = 9; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(49)))), ((int)(((byte)(97)))), ((int)(((byte)(156))))); + this.label2.Location = new System.Drawing.Point(14, 21); + this.label2.Margin = new System.Windows.Forms.Padding(3, 2, 3, 3); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(91, 13); + this.label2.TabIndex = 3; + this.label2.Text = "&Choose a Feed:"; + // + // panel2 + // + this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(198)))), ((int)(((byte)(195)))), ((int)(((byte)(198))))); + this.panel2.Location = new System.Drawing.Point(14, 43); + this.panel2.Margin = new System.Windows.Forms.Padding(3, 2, 3, 3); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(790, 1); + this.panel2.TabIndex = 2; + // + // panel3 + // + this.panel3.AutoScroll = true; + this.panel3.Controls.Add(this.rssFlowPanel); + this.panel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel3.Location = new System.Drawing.Point(0, 124); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(831, 335); + this.panel3.TabIndex = 11; + // + // rssFlowPanel + // + this.rssFlowPanel.AutoScroll = true; + this.rssFlowPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.rssFlowPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; + this.rssFlowPanel.Location = new System.Drawing.Point(0, 0); + this.rssFlowPanel.Name = "rssFlowPanel"; + this.rssFlowPanel.Size = new System.Drawing.Size(831, 335); + this.rssFlowPanel.TabIndex = 0; + this.rssFlowPanel.ControlAdded += new System.Windows.Forms.ControlEventHandler(this.FlowLayoutPanel_ControlAdded); + this.rssFlowPanel.Resize += new System.EventHandler(this.rssFlowPanel_Resize); + // + // customToolStrip1 + // + this.customToolStrip1.BackgroundImage = global::System.Windows.Forms.Samples.Properties.Resources.blueheader; + this.customToolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.customToolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.backButton, + this.forwardButton, + this.homeButton, + this.reportsButton, + this.browseButton, + this.toolStripButton4, + this.toolStripButton10, + this.toolStripButton11, + this.toolStripButton12}); + this.customToolStrip1.Location = new System.Drawing.Point(0, 24); + this.customToolStrip1.Name = "customToolStrip1"; + this.customToolStrip1.Size = new System.Drawing.Size(831, 48); + this.customToolStrip1.TabIndex = 1; + this.customToolStrip1.Text = "customToolStrip1"; + // + // backButton + // + this.backButton.ForeColor = System.Drawing.Color.White; + this.backButton.Image = global::System.Windows.Forms.Samples.Properties.Resources.back; + this.backButton.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.backButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.backButton.Name = "backButton"; + this.backButton.Padding = new System.Windows.Forms.Padding(4); + this.backButton.Size = new System.Drawing.Size(41, 45); + this.backButton.Text = "Back"; + this.backButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + // + // forwardButton + // + this.forwardButton.ForeColor = System.Drawing.Color.White; + this.forwardButton.Image = global::System.Windows.Forms.Samples.Properties.Resources.forward; + this.forwardButton.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.forwardButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.forwardButton.Name = "forwardButton"; + this.forwardButton.Padding = new System.Windows.Forms.Padding(4); + this.forwardButton.Size = new System.Drawing.Size(59, 45); + this.forwardButton.Text = "Forward"; + this.forwardButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + // + // homeButton + // + this.homeButton.ForeColor = System.Drawing.Color.White; + this.homeButton.Image = global::System.Windows.Forms.Samples.Properties.Resources.home; + this.homeButton.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.homeButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.homeButton.Name = "homeButton"; + this.homeButton.Padding = new System.Windows.Forms.Padding(4); + this.homeButton.Size = new System.Drawing.Size(46, 45); + this.homeButton.Text = "Home"; + this.homeButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + // + // reportsButton + // + this.reportsButton.ForeColor = System.Drawing.Color.White; + this.reportsButton.Image = global::System.Windows.Forms.Samples.Properties.Resources.reports; + this.reportsButton.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.reportsButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.reportsButton.Name = "reportsButton"; + this.reportsButton.Padding = new System.Windows.Forms.Padding(4); + this.reportsButton.Size = new System.Drawing.Size(83, 45); + this.reportsButton.Text = "Manage Links"; + this.reportsButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + this.reportsButton.Click += new System.EventHandler(this.reportsButton_Click); + // + // browseButton + // + this.browseButton.ForeColor = System.Drawing.Color.White; + this.browseButton.Image = global::System.Windows.Forms.Samples.Properties.Resources.browse; + this.browseButton.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.browseButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.browseButton.Name = "browseButton"; + this.browseButton.Padding = new System.Windows.Forms.Padding(4); + this.browseButton.Size = new System.Drawing.Size(54, 45); + this.browseButton.Text = "Browse"; + this.browseButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + // + // toolStripButton4 + // + this.toolStripButton4.ForeColor = System.Drawing.Color.White; + this.toolStripButton4.Image = global::System.Windows.Forms.Samples.Properties.Resources.email; + this.toolStripButton4.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButton4.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton4.Name = "toolStripButton4"; + this.toolStripButton4.Padding = new System.Windows.Forms.Padding(4); + this.toolStripButton4.Size = new System.Drawing.Size(43, 45); + this.toolStripButton4.Text = "Email"; + this.toolStripButton4.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + // + // toolStripButton10 + // + this.toolStripButton10.ForeColor = System.Drawing.Color.White; + this.toolStripButton10.Image = global::System.Windows.Forms.Samples.Properties.Resources.more; + this.toolStripButton10.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButton10.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton10.Name = "toolStripButton10"; + this.toolStripButton10.Padding = new System.Windows.Forms.Padding(4); + this.toolStripButton10.Size = new System.Drawing.Size(43, 45); + this.toolStripButton10.Text = "More"; + this.toolStripButton10.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + // + // toolStripButton11 + // + this.toolStripButton11.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.toolStripButton11.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton11.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButton11.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton11.Name = "toolStripButton11"; + this.toolStripButton11.Padding = new System.Windows.Forms.Padding(4); + this.toolStripButton11.Size = new System.Drawing.Size(23, 45); + this.toolStripButton11.Text = "Help"; + this.toolStripButton11.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + // + // toolStripButton12 + // + this.toolStripButton12.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.toolStripButton12.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton12.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButton12.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton12.Name = "toolStripButton12"; + this.toolStripButton12.Padding = new System.Windows.Forms.Padding(4); + this.toolStripButton12.Size = new System.Drawing.Size(23, 45); + this.toolStripButton12.Text = "Sound"; + this.toolStripButton12.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText; + // + // customToolStrip2 + // + this.customToolStrip2.BackgroundImage = global::System.Windows.Forms.Samples.Properties.Resources.bluefooter; + this.customToolStrip2.Dock = System.Windows.Forms.DockStyle.Bottom; + this.customToolStrip2.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.customToolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripLabel1, + this.toolStripSeparator1, + this.toolStripButton13, + this.toolStripSeparator2}); + this.customToolStrip2.Location = new System.Drawing.Point(0, 459); + this.customToolStrip2.Name = "customToolStrip2"; + this.customToolStrip2.Size = new System.Drawing.Size(831, 25); + this.customToolStrip2.TabIndex = 2; + this.customToolStrip2.Text = "customToolStrip2"; + // + // toolStripLabel1 + // + this.toolStripLabel1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.toolStripLabel1.ForeColor = System.Drawing.Color.White; + this.toolStripLabel1.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripLabel1.Name = "toolStripLabel1"; + this.toolStripLabel1.Padding = new System.Windows.Forms.Padding(0, 2, 6, 2); + this.toolStripLabel1.Size = new System.Drawing.Size(49, 22); + this.toolStripLabel1.Text = " Online "; + this.toolStripLabel1.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // toolStripButton13 + // + this.toolStripButton13.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.toolStripButton13.ForeColor = System.Drawing.Color.White; + this.toolStripButton13.Image = global::System.Windows.Forms.Samples.Properties.Resources.updates; + this.toolStripButton13.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None; + this.toolStripButton13.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton13.Name = "toolStripButton13"; + this.toolStripButton13.Padding = new System.Windows.Forms.Padding(0, 2, 0, 2); + this.toolStripButton13.Size = new System.Drawing.Size(106, 22); + this.toolStripButton13.Text = " Internet Updates"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(254)))), ((int)(((byte)(249))))); + this.ClientSize = new System.Drawing.Size(831, 484); + this.Controls.Add(this.panel3); + this.Controls.Add(this.topPanel); + this.Controls.Add(this.customToolStrip1); + this.Controls.Add(this.customToolStrip2); + this.Controls.Add(this.customMenuStrip1); + this.MainMenuStrip = this.customMenuStrip1; + this.MinimumSize = new System.Drawing.Size(400, 300); + this.Name = "MainForm"; + this.Text = "RSS Reader"; + this.WindowState = System.Windows.Forms.FormWindowState.Maximized; + this.Load += new System.EventHandler(this.MainForm_Load); + this.customMenuStrip1.ResumeLayout(false); + this.customMenuStrip1.PerformLayout(); + this.topPanel.ResumeLayout(false); + this.topPanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.RssLinkBindingSource)).EndInit(); + this.panel3.ResumeLayout(false); + this.customToolStrip1.ResumeLayout(false); + this.customToolStrip1.PerformLayout(); + this.customToolStrip2.ResumeLayout(false); + this.customToolStrip2.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Samples.CustomMenuStrip customMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem favoritesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem reportsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; + private System.Windows.Forms.Panel topPanel; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.BindingSource RssLinkBindingSource; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Samples.CustomToolStrip customToolStrip1; + private System.Windows.Forms.ToolStripButton backButton; + private System.Windows.Forms.ToolStripButton forwardButton; + private System.Windows.Forms.ToolStripButton homeButton; + private System.Windows.Forms.ToolStripButton reportsButton; + private System.Windows.Forms.ToolStripButton browseButton; + private System.Windows.Forms.ToolStripButton toolStripButton4; + private System.Windows.Forms.ToolStripButton toolStripButton10; + private System.Windows.Forms.ToolStripButton toolStripButton11; + private System.Windows.Forms.ToolStripButton toolStripButton12; + private System.Windows.Forms.Samples.CustomToolStrip customToolStrip2; + private System.Windows.Forms.ToolStripLabel toolStripLabel1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton toolStripButton13; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private FlowLayoutPanel rssFlowPanel; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/MainForm.resx b/Pro Windows Forms 2.0/Chapter21/RSSReader/MainForm.resx new file mode 100644 index 0000000..4d46e01 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/MainForm.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 437, 17 + + + 161, 17 + + + 299, 17 + + + 39 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Program.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Program.cs new file mode 100644 index 0000000..fc3ca9b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace System.Windows.Forms.Samples +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..fd4176f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("RSS Reader")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("RSS Reader")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3fe469db-485d-4e06-9718-02ac9462bae8")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/DataSources/System.Windows.Forms.Samples.RSS.RssItem.datasource b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/DataSources/System.Windows.Forms.Samples.RSS.RssItem.datasource new file mode 100644 index 0000000..7ecba49 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/DataSources/System.Windows.Forms.Samples.RSS.RssItem.datasource @@ -0,0 +1,10 @@ + + + + System.Windows.Forms.Samples.RSS.RssItem, RSS Reader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/DataSources/System.Windows.Forms.Samples.RSS.RssLink.datasource b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/DataSources/System.Windows.Forms.Samples.RSS.RssLink.datasource new file mode 100644 index 0000000..37f91d8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/DataSources/System.Windows.Forms.Samples.RSS.RssLink.datasource @@ -0,0 +1,10 @@ + + + + System.Windows.Forms.Samples.RSS.RssLink, RSS Reader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Resources.Designer.cs new file mode 100644 index 0000000..6dc7e9a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Resources.Designer.cs @@ -0,0 +1,224 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.31 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace System.Windows.Forms.Samples.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Windows.Forms.Samples.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap back { + get { + object obj = ResourceManager.GetObject("back", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap bluefooter { + get { + object obj = ResourceManager.GetObject("bluefooter", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap blueheader { + get { + object obj = ResourceManager.GetObject("blueheader", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap browse { + get { + object obj = ResourceManager.GetObject("browse", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap close { + get { + object obj = ResourceManager.GetObject("close", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap close2 { + get { + object obj = ResourceManager.GetObject("close2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap compress { + get { + object obj = ResourceManager.GetObject("compress", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap compress2 { + get { + object obj = ResourceManager.GetObject("compress2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap email { + get { + object obj = ResourceManager.GetObject("email", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap expand { + get { + object obj = ResourceManager.GetObject("expand", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap expand2 { + get { + object obj = ResourceManager.GetObject("expand2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap forward { + get { + object obj = ResourceManager.GetObject("forward", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap graphs { + get { + object obj = ResourceManager.GetObject("graphs", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap help { + get { + object obj = ResourceManager.GetObject("help", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap home { + get { + object obj = ResourceManager.GetObject("home", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap more { + get { + object obj = ResourceManager.GetObject("more", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap online { + get { + object obj = ResourceManager.GetObject("online", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap orders { + get { + object obj = ResourceManager.GetObject("orders", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap reports { + get { + object obj = ResourceManager.GetObject("reports", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap sound { + get { + object obj = ResourceManager.GetObject("sound", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap trends { + get { + object obj = ResourceManager.GetObject("trends", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap update { + get { + object obj = ResourceManager.GetObject("update", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap updates { + get { + object obj = ResourceManager.GetObject("updates", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Resources.resx new file mode 100644 index 0000000..88a00d7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Resources.resx @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Images\orders.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\help.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\trends.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\compress.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\compress2.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\home.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\sound.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\back.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\browse.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\updates.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\expand.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\more.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\expand2.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\email.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\online.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\blueheader.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\close.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\close2.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\graphs.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\reports.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\forward.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\bluefooter.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\update.PNG;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Settings.Designer.cs new file mode 100644 index 0000000..23f6650 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.31 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace System.Windows.Forms.Samples.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/RSS Reader.csproj b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSS Reader.csproj new file mode 100644 index 0000000..008d501 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSS Reader.csproj @@ -0,0 +1,145 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {D5433A0E-B523-44DB-A139-9B9B38F71D8E} + WinExe + Properties + System.Windows.Forms.Samples + RSS Reader + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + Form + + + Browser.cs + + + Component + + + Component + + + Component + + + UserControl + + + RSSView.cs + + + Component + + + Form + + + LinksEditor.cs + + + Form + + + MainForm.cs + + + + + Browser.cs + + + RSSView.cs + + + LinksEditor.cs + + + MainForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/RSS Reader.sln b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSS Reader.sln new file mode 100644 index 0000000..9bdf520 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSS Reader.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RSS Reader", "RSS Reader.csproj", "{D5433A0E-B523-44DB-A139-9B9B38F71D8E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D5433A0E-B523-44DB-A139-9B9B38F71D8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5433A0E-B523-44DB-A139-9B9B38F71D8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5433A0E-B523-44DB-A139-9B9B38F71D8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5433A0E-B523-44DB-A139-9B9B38F71D8E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/RSS Reader.suo b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSS Reader.suo new file mode 100644 index 0000000..1025c86 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSS Reader.suo differ diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/RSSUtilities/RssFeed.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSSUtilities/RssFeed.cs new file mode 100644 index 0000000..3f9a526 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSSUtilities/RssFeed.cs @@ -0,0 +1,185 @@ +#region Using directives + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.IO; +using System.Net; +using System.Text; + +using System.Data; +using System.Xml; +using System.Diagnostics; + +#endregion + +namespace System.Windows.Forms.Samples.RSS +{ + public class RssFeed : RssItem + { + private List _items; + private string _url=null; + private Image _image=null; + private RssItem _imageItem=null; + + // Constants + const string CHANNEL_ELEMENT = "channel"; + const string IMAGE_ELEMENT = "image"; + const string ITEM_ELEMENT = "item"; + + public RssFeed() + { + } + + #region Public Properties + public void Load(string url) + { + // Load URL + _url = url; + + // Reset + _imageItem = null; + _items = null; + + // Load + GetFeedData(_url); + } + + public string URL + { + get { return _url; } + } + + public Image Image + { + get + { + if ((null == _image) && (null != _imageItem)) + { + _image = GetImage(_imageItem["url"]); + } + + return _image; + } + } + + public List Items + { + get + { + if (null == _items) + { + _items = new List(); + } + + return _items; + } + } + #endregion + + #region Private Implementation + private Image GetImage(string url) + { + Image image = null; + + if (!String.IsNullOrEmpty(url)) + { + try + { + WebRequest req = WebRequest.Create(url); + WebResponse resp = req.GetResponse(); + + image = Image.FromStream(resp.GetResponseStream()); + } + catch (Exception ex) + { + Debug.WriteLine("Unable to get image from: " + url + " (" + ex.Message + ")"); + } + } + + return image; + } + + private void GetFeedData(string url) + { + XmlTextReader reader = new XmlTextReader(url); + string localName; + bool channelFound=false; + + while (reader.Read()) + { + XmlNodeType nt = reader.NodeType; + + if (reader.NodeType == XmlNodeType.Element) + { + // Set name + localName = reader.LocalName.ToLower(); + + if (!channelFound) + { + if (localName == CHANNEL_ELEMENT) + { + // Found main body of the feed + channelFound = true; + } + } + else if (localName == ITEM_ELEMENT) + { + // Read an item + this.Items.Add(ReadItem(reader, ITEM_ELEMENT)); + } + else if (localName == IMAGE_ELEMENT) + { + // Read image + _imageItem = ReadItem(reader, IMAGE_ELEMENT); + } + else + { + // Move to the Text content + if (XmlNodeType.Element == reader.MoveToContent()) + { + // Read the Text content + string content = reader.ReadString(); + + // Make sure there are no nested elements + if (XmlNodeType.EndElement == reader.NodeType) + { + // If not, then add + this.SetAttribute(reader.LocalName, content); + } + else + { + // Strange - a nested element - we should ignore + } + } + } + } + } + } + + private RssItem ReadItem(XmlTextReader reader, string name) + { + bool endFound = false; + RssItem item = new RssItem(); + + while (!endFound && reader.Read()) + { + if ((reader.NodeType == XmlNodeType.EndElement) && (reader.LocalName.ToLower() == name)) + { + endFound = true; + } + else if (reader.NodeType == XmlNodeType.Element) + { + // Get Local name + item.SetAttribute(reader.LocalName, reader.ReadString()); + } + } + + // Return item + return item; + } + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/RSSUtilities/RssItem.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSSUtilities/RssItem.cs new file mode 100644 index 0000000..bcbd594 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSSUtilities/RssItem.cs @@ -0,0 +1,70 @@ +#region Using directives + +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Text; + +#endregion + +namespace System.Windows.Forms.Samples.RSS +{ + public class RssItem + { + private Dictionary _attributes; + + public RssItem() + { + _attributes = new Dictionary(); + } + + #region Public Properties + public string Title + { + get { return GetValue("title"); } + } + + public string Link + { + get { return GetValue("link"); } + } + + public string Description + { + get { return GetValue("description"); } + } + + [Browsable(false)] + public string this[string key] + { + get { return GetValue(key); } + } + + [Browsable(false)] + public Dictionary Attributes + { + get { return _attributes; } + } + #endregion + + #region Public Methods + public void SetAttribute(string name, string val) + { + string localName = name.ToLower(); + + // Look for dups (ignore dups for now) + if (!Attributes.ContainsKey(localName)) + { + Attributes.Add(localName, val.Trim()); + } + } + #endregion + + #region Private Implementation + protected string GetValue(string name) + { + return (_attributes.ContainsKey(name) ? _attributes[name] : null); + } + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/RSSUtilities/RssLink.cs b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSSUtilities/RssLink.cs new file mode 100644 index 0000000..915f574 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter21/RSSReader/RSSUtilities/RssLink.cs @@ -0,0 +1,339 @@ +#region Using directives + +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Text; + +#endregion + +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; + +namespace System.Windows.Forms.Samples.RSS +{ + [Serializable()] + public class RssLink + { + private string _title; + private string _url; + private bool _showImage = true; + const string DATA_FILE = @"..\..\Data\links.dat"; + + public RssLink() + { + } + + public RssLink(string title, string url) + { + this.Title = title; + this.URL = url; + } + + #region Public API + public string Title + { + get { return _title; } + set { _title = value; } + } + + public string URL + { + get { return _url; } + set { _url = value.Trim(); } + } + + public bool ShowImage + { + get { return _showImage; } + set { _showImage = value; } + } + #endregion + + #region Static API + private static SortableBindingList _links; + + public static SortableBindingList Links + { + get + { + if (null == _links) + { + _links = Load(); + } + + return _links; + } + } + + public static int FindLink(string url) + { + int found=-1; + string trim = url.Trim(); + + for (int idx = 0; idx < Links.Count; idx++) + { + if (Links[idx].URL == trim) + { + found = idx; + break; + } + } + + return found; + } + + public static void Add(string title, string url) + { + int idx = FindLink(url); + + if (idx < 0) + { + // New item + Links.Add(new RssLink(title, url)); + } + else + { + // Update existing + Links[idx].URL = url; + Links[idx].Title = title; + } + + // Re-save + Save(); + } + + private static SortableBindingList Load() + { + // Use default data file + return Load(DATA_FILE); + } + + private static SortableBindingList Load(string file) + { + FileStream fs = null; + BinaryFormatter bf = new BinaryFormatter(); + SortableBindingList list = null; + + try + { + fs = new FileStream(file, FileMode.Open); + list = bf.Deserialize(fs) as SortableBindingList; + + if (null == list) + { + list = new SortableBindingList(); + } + } + catch (Exception) + { + list = new SortableBindingList(); + } + finally + { + if (null != fs) + { + fs.Close(); + } + } + + return list; + } + + public static void Save() + { + // Use default data file + Save(DATA_FILE, Links); + } + + private static void Save(SortableBindingList links) + { + // Use default data file + Save(DATA_FILE, links); + } + + private static void Save(string file, SortableBindingList links) + { + BinaryFormatter bf = new BinaryFormatter(); + + // Create File to Searilze to + FileStream fs = new FileStream(file, FileMode.Create); + + try + { + bf.Serialize(fs, links); + } + finally + { + fs.Close(); + } + } + #endregion + } + + #region SortableBindingList + [Serializable()] + public class SortableBindingList : BindingList + { + private bool _isSorted; + private ListSortDirection _dir = ListSortDirection.Ascending; + + [NonSerialized()] + private PropertyDescriptor _sort = null; + + public void Sort() + { + ApplySortCore(_sort, _dir); + } + + public void Sort(string property) + { + // Get the + _sort = FindPropertyDescriptor(property); + + // Sort + ApplySortCore(_sort, _dir); + } + + public void Sort(string property, ListSortDirection direction) + { + // Get the sort property + _sort = FindPropertyDescriptor(property); + _dir = direction; + + // Sort + ApplySortCore(_sort, _dir); + } + + private PropertyDescriptor FindPropertyDescriptor(string property) + { + PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(typeof(T)); + PropertyDescriptor prop=null; + + if (null != pdc) + { + prop = pdc.Find(property, true); + } + + return prop; + } + + protected override bool SupportsSortingCore + { + get { return true; } + } + + protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction) + { + List items = this.Items as List; + + if ((null != items) && (null != property)) + { + PropertyComparer pc = new PropertyComparer(property, direction); + items.Sort(pc); + + // Set sorted + _isSorted = true; + } + else + { + // Set sorted + _isSorted = false; + } + } + + protected override bool IsSortedCore + { + get { return _isSorted; } + } + + protected override void RemoveSortCore() + { + _isSorted = false; + } + } + #endregion + + #region PropertyComparar + public class PropertyComparer : System.Collections.Generic.IComparer + { + + // The following code contains code implemented by Rockford Lhotka: + // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnadvnet/html/vbnet01272004.asp + + private PropertyDescriptor _property; + private ListSortDirection _direction; + + public PropertyComparer(PropertyDescriptor property, ListSortDirection direction) + { + _property = property; + _direction = direction; + } + + public int Compare(T xWord, T yWord) + { + // Get property values + object xValue = GetPropertyValue(xWord, _property.Name); + object yValue = GetPropertyValue(yWord, _property.Name); + + // Determine sort order + if (_direction == ListSortDirection.Ascending) + { + return CompareAscending(xValue, yValue); + } + else + { + return CompareDescending(xValue, yValue); + } + } + + public bool Equals(T xWord, T yWord) + { + return xWord.Equals(yWord); + } + + public int GetHashCode(T obj) + { + return obj.GetHashCode(); + } + + // Compare two property values of any type + private int CompareAscending(object xValue, object yValue) + { + int result; + + // If values implement IComparer + if (xValue is IComparable) + { + result = ((IComparable)xValue).CompareTo(yValue); + } + // If values don't implement IComparer but are equivalent + else if (xValue.Equals(yValue)) + { + result = 0; + } + // Values don't implement IComparer and are not equivalent, so compare as string values + else result = xValue.ToString().CompareTo(yValue.ToString()); + + // Return result + return result; + } + + private int CompareDescending(object xValue, object yValue) + { + // Return result adjusted for ascending or descending sort order ie + // multiplied by 1 for ascending or -1 for descending + return CompareAscending(xValue, yValue) * -1; + } + + private object GetPropertyValue(T value, string property) + { + // Get property + System.Reflection.PropertyInfo propertyInfo = value.GetType().GetProperty(property); + + // Return value + return propertyInfo.GetValue(value, null); + } + } + #endregion +} diff --git a/Pro Windows Forms 2.0/Chapter21/RSSReader/bin/Debug/RSS Reader.exe b/Pro Windows Forms 2.0/Chapter21/RSSReader/bin/Debug/RSS Reader.exe new file mode 100644 index 0000000..c897e40 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter21/RSSReader/bin/Debug/RSS Reader.exe differ diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentController.cs b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentController.cs new file mode 100644 index 0000000..a738c9f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentController.cs @@ -0,0 +1,103 @@ +using System; +using AxAgentObjects; +using System.Collections; +using System.Collections.Generic; + +namespace AgentTryout +{ + public class AgentController : IDisposable + { + // Agent variable. + private AgentObjects.IAgentCtlCharacterEx agentChar; + + // Name of the initialized character. + private string characterName; + + // Balloon constants + private const short BalloonOn = 1; + private const short SizeToText = 2; + private const short AutoHide = 4; + private const short AutoPace = 8; + + public AgentController(AxAgentObjects.AxAgent agentHost, + string character) + { + agentHost.Characters.Load(character, null); + agentChar = agentHost.Characters[character]; + + characterName = character; + + // You could put your own options in this menu, if desired. + agentChar.AutoPopupMenu = false; + + // Set balloon style. + agentChar.Balloon.Style = agentChar.Balloon.Style | BalloonOn; + agentChar.Balloon.Style = agentChar.Balloon.Style | SizeToText; + agentChar.Balloon.Style = agentChar.Balloon.Style | AutoHide; + } + + public void Dispose() + { + if (agentChar.Visible) + { + agentChar.StopAll(null); + agentChar.Hide(null); + } + } + + public void Show() + { + agentChar.Show(null); + } + + public void Hide() + { + agentChar.Hide(null); + } + + public void StopAll() + { + agentChar.StopAll(null); + } + + public void Speak(string text) + { + agentChar.StopAll(null); + agentChar.Speak(text, ""); + } + + public void Think(string text) + { + agentChar.StopAll(null); + agentChar.Think(text); + } + + public void Animate(string animation) + { + agentChar.StopAll(null); + agentChar.Play(animation); + } + + public void MoveTo(short x, short y) + { + agentChar.MoveTo(x, y, null); + } + + public void GestureAt(short x, short y) + { + agentChar.GestureAt(x, y); + } + + public List GetAnimations() + { + List list = new List(); + foreach (string animation in agentChar.AnimationNames) + { + list.Add(animation); + } + return list; + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTest.Designer.cs b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTest.Designer.cs new file mode 100644 index 0000000..b130709 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTest.Designer.cs @@ -0,0 +1,251 @@ +namespace AgentTryout +{ + partial class AgentTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AgentTest)); + this.axAgent1 = new AxAgentObjects.AxAgent(); + this.cmdClose = new System.Windows.Forms.Button(); + this.GroupBox3 = new System.Windows.Forms.GroupBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.Label1 = new System.Windows.Forms.Label(); + this.txtY = new System.Windows.Forms.TextBox(); + this.txtX = new System.Windows.Forms.TextBox(); + this.cmdMove = new System.Windows.Forms.Button(); + this.GroupBox2 = new System.Windows.Forms.GroupBox(); + this.cmdSpeak = new System.Windows.Forms.Button(); + this.txtSpeak = new System.Windows.Forms.TextBox(); + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.cmdStop = new System.Windows.Forms.Button(); + this.cmdPlay = new System.Windows.Forms.Button(); + this.lstAnimations = new System.Windows.Forms.ListBox(); + ((System.ComponentModel.ISupportInitialize)(this.axAgent1)).BeginInit(); + this.GroupBox3.SuspendLayout(); + this.GroupBox2.SuspendLayout(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // axAgent1 + // + this.axAgent1.Enabled = true; + this.axAgent1.Location = new System.Drawing.Point(59, 322); + this.axAgent1.Name = "axAgent1"; + this.axAgent1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axAgent1.OcxState"))); + this.axAgent1.Size = new System.Drawing.Size(32, 32); + this.axAgent1.TabIndex = 18; + // + // cmdClose + // + this.cmdClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.cmdClose.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdClose.Location = new System.Drawing.Point(294, 329); + this.cmdClose.Name = "cmdClose"; + this.cmdClose.Size = new System.Drawing.Size(96, 24); + this.cmdClose.TabIndex = 17; + this.cmdClose.Text = "Close"; + this.cmdClose.Click += new System.EventHandler(this.cmdClose_Click); + // + // GroupBox3 + // + this.GroupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox3.Controls.Add(this.Label2); + this.GroupBox3.Controls.Add(this.Label1); + this.GroupBox3.Controls.Add(this.txtY); + this.GroupBox3.Controls.Add(this.txtX); + this.GroupBox3.Controls.Add(this.cmdMove); + this.GroupBox3.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox3.Location = new System.Drawing.Point(7, 249); + this.GroupBox3.Name = "GroupBox3"; + this.GroupBox3.Size = new System.Drawing.Size(384, 64); + this.GroupBox3.TabIndex = 16; + this.GroupBox3.TabStop = false; + this.GroupBox3.Text = "Move"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(84, 28); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(20, 16); + this.Label2.TabIndex = 11; + this.Label2.Text = "Y:"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(16, 28); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(20, 16); + this.Label1.TabIndex = 10; + this.Label1.Text = "X:"; + // + // txtY + // + this.txtY.Location = new System.Drawing.Point(104, 24); + this.txtY.Name = "txtY"; + this.txtY.Size = new System.Drawing.Size(36, 21); + this.txtY.TabIndex = 9; + // + // txtX + // + this.txtX.Location = new System.Drawing.Point(36, 24); + this.txtX.Name = "txtX"; + this.txtX.Size = new System.Drawing.Size(36, 21); + this.txtX.TabIndex = 8; + // + // cmdMove + // + this.cmdMove.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdMove.Location = new System.Drawing.Point(248, 24); + this.cmdMove.Name = "cmdMove"; + this.cmdMove.Size = new System.Drawing.Size(72, 20); + this.cmdMove.TabIndex = 7; + this.cmdMove.Text = "Move"; + this.cmdMove.Click += new System.EventHandler(this.cmdMove_Click); + // + // GroupBox2 + // + this.GroupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox2.Controls.Add(this.cmdSpeak); + this.GroupBox2.Controls.Add(this.txtSpeak); + this.GroupBox2.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox2.Location = new System.Drawing.Point(7, 161); + this.GroupBox2.Name = "GroupBox2"; + this.GroupBox2.Size = new System.Drawing.Size(384, 80); + this.GroupBox2.TabIndex = 15; + this.GroupBox2.TabStop = false; + this.GroupBox2.Text = "Speak"; + // + // cmdSpeak + // + this.cmdSpeak.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdSpeak.Location = new System.Drawing.Point(248, 20); + this.cmdSpeak.Name = "cmdSpeak"; + this.cmdSpeak.Size = new System.Drawing.Size(72, 20); + this.cmdSpeak.TabIndex = 6; + this.cmdSpeak.Text = "Speak"; + this.cmdSpeak.Click += new System.EventHandler(this.cmdSpeak_Click); + // + // txtSpeak + // + this.txtSpeak.AcceptsReturn = true; + this.txtSpeak.Location = new System.Drawing.Point(8, 20); + this.txtSpeak.Multiline = true; + this.txtSpeak.Name = "txtSpeak"; + this.txtSpeak.Size = new System.Drawing.Size(232, 48); + this.txtSpeak.TabIndex = 4; + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.cmdStop); + this.GroupBox1.Controls.Add(this.cmdPlay); + this.GroupBox1.Controls.Add(this.lstAnimations); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(7, 9); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(384, 144); + this.GroupBox1.TabIndex = 14; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "Animate"; + // + // cmdStop + // + this.cmdStop.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdStop.Location = new System.Drawing.Point(248, 48); + this.cmdStop.Name = "cmdStop"; + this.cmdStop.Size = new System.Drawing.Size(72, 20); + this.cmdStop.TabIndex = 6; + this.cmdStop.Text = "Stop"; + this.cmdStop.Click += new System.EventHandler(this.cmdStop_Click); + // + // cmdPlay + // + this.cmdPlay.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.cmdPlay.Location = new System.Drawing.Point(248, 24); + this.cmdPlay.Name = "cmdPlay"; + this.cmdPlay.Size = new System.Drawing.Size(72, 20); + this.cmdPlay.TabIndex = 5; + this.cmdPlay.Text = "Play"; + this.cmdPlay.Click += new System.EventHandler(this.cmdPlay_Click); + // + // lstAnimations + // + this.lstAnimations.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.lstAnimations.IntegralHeight = false; + this.lstAnimations.Location = new System.Drawing.Point(8, 22); + this.lstAnimations.Name = "lstAnimations"; + this.lstAnimations.Size = new System.Drawing.Size(232, 109); + this.lstAnimations.TabIndex = 4; + // + // AgentTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(401, 364); + this.Controls.Add(this.axAgent1); + this.Controls.Add(this.cmdClose); + this.Controls.Add(this.GroupBox3); + this.Controls.Add(this.GroupBox2); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "AgentTest"; + this.Text = "AgentTest"; + this.Load += new System.EventHandler(this.AgentTest_Load); + ((System.ComponentModel.ISupportInitialize)(this.axAgent1)).EndInit(); + this.GroupBox3.ResumeLayout(false); + this.GroupBox3.PerformLayout(); + this.GroupBox2.ResumeLayout(false); + this.GroupBox2.PerformLayout(); + this.GroupBox1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private AxAgentObjects.AxAgent axAgent1; + internal System.Windows.Forms.Button cmdClose; + internal System.Windows.Forms.GroupBox GroupBox3; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.TextBox txtY; + internal System.Windows.Forms.TextBox txtX; + internal System.Windows.Forms.Button cmdMove; + internal System.Windows.Forms.GroupBox GroupBox2; + internal System.Windows.Forms.Button cmdSpeak; + internal System.Windows.Forms.TextBox txtSpeak; + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.Button cmdStop; + internal System.Windows.Forms.Button cmdPlay; + internal System.Windows.Forms.ListBox lstAnimations; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTest.cs b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTest.cs new file mode 100644 index 0000000..7cda52f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTest.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace AgentTryout +{ + public partial class AgentTest : Form + { + public AgentTest() + { + InitializeComponent(); + } + + private AgentController controller; + + private void Form1_Load(object sender, System.EventArgs e) + { + controller = new AgentController(axAgent1, "Genie"); + + lstAnimations.DataSource = controller.GetAnimations(); + + controller.Show(); + } + + private void cmdPlay_Click(object sender, System.EventArgs e) + { + controller.Animate(lstAnimations.Text); + } + + private void cmdStop_Click(object sender, System.EventArgs e) + { + controller.StopAll(); + } + + private void cmdSpeak_Click(object sender, System.EventArgs e) + { + controller.Speak(txtSpeak.Text); + } + + private void cmdMove_Click(object sender, System.EventArgs e) + { + controller.MoveTo(short.Parse(txtX.Text), short.Parse(txtY.Text)); + } + + private void cmdClose_Click(object sender, System.EventArgs e) + { + this.Close(); + } + + private void AgentTest_Load(object sender, EventArgs e) + { + controller = new AgentController(axAgent1, "Genie"); + + lstAnimations.DataSource = controller.GetAnimations(); + + controller.Show(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTest.resx b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTest.resx new file mode 100644 index 0000000..3680f1c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTest.resx @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACFTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5BeEhvc3QrU3RhdGUBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAIQAAAAIB + AAAAAQAAAAAAAAAAAAAAAAwAAAACAgAATwMAAE8DAAAL + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.csproj b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.csproj new file mode 100644 index 0000000..6d998e5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.csproj @@ -0,0 +1,125 @@ + + + Local + 8.0.50727 + 2.0 + {BBAA4151-BB2B-4F7F-8A0E-037E6B734A8B} + Debug + AnyCPU + App.ico + + + AgentTryout + + + JScript + Grid + IE50 + false + WinExe + AgentTryout + AgentTryout.Program + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + {F5BE8BC2-7DE6-11D0-91FE-00C04FD701A5} + 2 + 0 + 0 + tlbimp + + + {F5BE8BC2-7DE6-11D0-91FE-00C04FD701A5} + 2 + 0 + 0 + aximp + + + + + Code + + + Form + + + AgentTest.cs + + + Code + + + + + Designer + AgentTest.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.csproj.user b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.csproj.user new file mode 100644 index 0000000..6b7d1b3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.sln b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.sln new file mode 100644 index 0000000..8f0910e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AgentTryout", "AgentTryout.csproj", "{BBAA4151-BB2B-4F7F-8A0E-037E6B734A8B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BBAA4151-BB2B-4F7F-8A0E-037E6B734A8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BBAA4151-BB2B-4F7F-8A0E-037E6B734A8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BBAA4151-BB2B-4F7F-8A0E-037E6B734A8B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BBAA4151-BB2B-4F7F-8A0E-037E6B734A8B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.suo b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.suo new file mode 100644 index 0000000..2b13bc7 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AgentTryout.suo differ diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/App.ico b/Pro Windows Forms 2.0/Chapter22/AgentTryout/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/AgentTryout/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/AgentTryout/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/Program.cs b/Pro Windows Forms 2.0/Chapter22/AgentTryout/Program.cs new file mode 100644 index 0000000..b480b48 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/AgentTryout/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace AgentTryout +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new AgentTest()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/bin/Debug/AgentTryout.exe b/Pro Windows Forms 2.0/Chapter22/AgentTryout/bin/Debug/AgentTryout.exe new file mode 100644 index 0000000..114d8fe Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/AgentTryout/bin/Debug/AgentTryout.exe differ diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/bin/Debug/AxInterop.AgentObjects.dll b/Pro Windows Forms 2.0/Chapter22/AgentTryout/bin/Debug/AxInterop.AgentObjects.dll new file mode 100644 index 0000000..783a1f4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/AgentTryout/bin/Debug/AxInterop.AgentObjects.dll differ diff --git a/Pro Windows Forms 2.0/Chapter22/AgentTryout/bin/Debug/Interop.AgentObjects.dll b/Pro Windows Forms 2.0/Chapter22/AgentTryout/bin/Debug/Interop.AgentObjects.dll new file mode 100644 index 0000000..d2915e2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/AgentTryout/bin/Debug/Interop.AgentObjects.dll differ diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.csproj b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.csproj new file mode 100644 index 0000000..0324e03 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.csproj @@ -0,0 +1,74 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {1E7F12D9-2865-495A-BF67-C0E3D4779025} + WinExe + Properties + ContextSensitiveHelp + ContextSensitiveHelp + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + PreserveNewest + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.csproj.user b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.sln b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.sln new file mode 100644 index 0000000..6411c8c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContextSensitiveHelp", "ContextSensitiveHelp.csproj", "{1E7F12D9-2865-495A-BF67-C0E3D4779025}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1E7F12D9-2865-495A-BF67-C0E3D4779025}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1E7F12D9-2865-495A-BF67-C0E3D4779025}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E7F12D9-2865-495A-BF67-C0E3D4779025}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1E7F12D9-2865-495A-BF67-C0E3D4779025}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.suo b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.suo new file mode 100644 index 0000000..15d84b3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/ContextSensitiveHelp.suo differ diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Form1.Designer.cs new file mode 100644 index 0000000..4daee1d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Form1.Designer.cs @@ -0,0 +1,108 @@ +namespace ContextSensitiveHelp1 +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.helpProvider1 = new System.Windows.Forms.HelpProvider(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(22, 19); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(31, 13); + this.label1.TabIndex = 0; + this.label1.Text = "label1"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(22, 53); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(31, 13); + this.label2.TabIndex = 1; + this.label2.Text = "label2"; + // + // textBox1 + // + this.helpProvider1.SetHelpKeyword(this.textBox1, "BadHelp.htm"); + this.helpProvider1.SetHelpNavigator(this.textBox1, System.Windows.Forms.HelpNavigator.Topic); + this.textBox1.Location = new System.Drawing.Point(82, 16); + this.textBox1.Name = "textBox1"; + this.helpProvider1.SetShowHelp(this.textBox1, true); + this.textBox1.Size = new System.Drawing.Size(214, 20); + this.textBox1.TabIndex = 2; + this.textBox1.Text = "Press F1 here for BadHelp.htm"; + this.textBox1.HelpRequested += new System.Windows.Forms.HelpEventHandler(this.textBox1_HelpRequested); + // + // textBox2 + // + this.helpProvider1.SetHelpKeyword(this.textBox2, "ValueOfHelp.htm"); + this.helpProvider1.SetHelpNavigator(this.textBox2, System.Windows.Forms.HelpNavigator.Topic); + this.textBox2.Location = new System.Drawing.Point(82, 46); + this.textBox2.Name = "textBox2"; + this.helpProvider1.SetShowHelp(this.textBox2, true); + this.textBox2.Size = new System.Drawing.Size(214, 20); + this.textBox2.TabIndex = 3; + this.textBox2.Text = "Press F1 here for ValueOfHelp.htm"; + // + // helpProvider1 + // + this.helpProvider1.HelpNamespace = "HelpTest.chm"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(373, 301); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Name = "Form1"; + this.Text = "Form1"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.HelpProvider helpProvider1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Form1.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Form1.cs new file mode 100644 index 0000000..ae53861 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Form1.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ContextSensitiveHelp1 +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void textBox1_HelpRequested(object sender, HelpEventArgs hlpevent) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Form1.resx b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Form1.resx new file mode 100644 index 0000000..74fe625 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/BadHelp.htm b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/BadHelp.htm new file mode 100644 index 0000000..d403f2e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/BadHelp.htm @@ -0,0 +1,16 @@ + + + +Bad Help + + + + +

Bad Help

+

Have you ever had this experience? You find an unusual option buried deep in an application, and it piques your curiosity. You hit F1, curious to find out what this option accomplishes. But your optimism dwindles when you read the description provided by the context-sensitive Help system: "To enable option X, click once on the option X check box. To disable option X, click the option X check box again to remove the check mark. Click OK to save your changes."

+

Clearly something is missing here. You want to know what option X does; the Help wants to explain, in oddly explicit detail, how to use a check box. The situation is ridiculous, as the function of option X is not at all obvious, but the way to use a check box is an instinctive part of every computer user’s understanding. If you don’t know how to use a check box, you probably wouldn’t have guessed to press the F1 key for help.

+

This is an example of classic bad help.

+ + + + diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/HelpTest.chm b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/HelpTest.chm new file mode 100644 index 0000000..e566b4b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/HelpTest.chm differ diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/HelpTest.hhp b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/HelpTest.hhp new file mode 100644 index 0000000..3c51af7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/HelpTest.hhp @@ -0,0 +1,21 @@ +[OPTIONS] +Compatibility=1.1 or later +Compiled file=HelpTest.chm +Contents file=Table of Contents.hhc +Default topic=Welcome.htm +Display compile progress=No +Language=0x409 English (United States) + + +[FILES] +Welcome.htm +BadHelp.htm +Introduction.htm +ValueOfHelp.htm +stylesheet.css + +[ALIAS] +1001=ValueOfHelp.htm + +[INFOTYPES] + diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/Introduction.htm b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/Introduction.htm new file mode 100644 index 0000000..606b441 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/Introduction.htm @@ -0,0 +1,13 @@ + + + +Introduction + + + + +

Introduction

+

Welcome to the first page of this HTML Help file.

+ + + diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/Table of Contents.hhc b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/Table of Contents.hhc new file mode 100644 index 0000000..872a7f2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/Table of Contents.hhc @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
  • + + + +
  • + + + +
      +
    • + + + +
    • + + + +
    +
+ diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/ValueOfHelp.htm b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/ValueOfHelp.htm new file mode 100644 index 0000000..2fdb4eb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/ValueOfHelp.htm @@ -0,0 +1,14 @@ + + + +The Value of Help + + + + +

The Value of Help

+

In recent years there has been a shift away from printed documentation. The occasional weighty manual (like the book you’re holding now) is still required for learning advanced tools, but the average piece of office productivity or business software no longer assumes the user is willing to perform any additional reading. Instead, these programs are heavily dependent on natural, instinctive interfaces, and use online Help to patch the gaps and answer the occasional user question.

+ + + + diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/Welcome.htm b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/Welcome.htm new file mode 100644 index 0000000..d0395ae --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/Welcome.htm @@ -0,0 +1,15 @@ + + + +Welcome + + + + +

Welcome

+

Welcome to the first page of this HTML Help file.

+

Click on other topics to browse them, or go straight +to the introduction page.

+ + + diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/stylesheet.css b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/stylesheet.css new file mode 100644 index 0000000..522c8e7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpProject/stylesheet.css @@ -0,0 +1,16 @@ +body { + font-family: Verdana; + font-size: x-small; +} + +h1 { + font-size: medium; + padding: 10px; + margin-top: 1px; + background-color: lightblue; +} + +p { + margin-bottom: 8px; + margin-top: 8px; +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpTest.chm b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpTest.chm new file mode 100644 index 0000000..e566b4b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/HelpTest.chm differ diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Program.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Program.cs new file mode 100644 index 0000000..d447371 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ContextSensitiveHelp1 +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1f9a635 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ContextSensitiveHelp1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ContextSensitiveHelp1")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("dddc4b3d-dece-4e81-8174-95c94fd32aa3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Resources.Designer.cs new file mode 100644 index 0000000..3829273 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ContextSensitiveHelp.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ContextSensitiveHelp.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Settings.Designer.cs new file mode 100644 index 0000000..f84ca2e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ContextSensitiveHelp.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/bin/Debug/ContextSensitiveHelp.exe b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/bin/Debug/ContextSensitiveHelp.exe new file mode 100644 index 0000000..3145ee2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/bin/Debug/ContextSensitiveHelp.exe differ diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/bin/Debug/HelpTest.chm b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/bin/Debug/HelpTest.chm new file mode 100644 index 0000000..e566b4b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp/bin/Debug/HelpTest.chm differ diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/App.ico b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/ControlBased.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/ControlBased.cs new file mode 100644 index 0000000..5174ea6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/ControlBased.cs @@ -0,0 +1,112 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace HelpTest +{ + /// + /// Summary description for ControlBased. + /// + public class ControlBased : System.Windows.Forms.Form + { + internal System.Windows.Forms.TextBox TextBox1; + internal System.Windows.Forms.ListBox ListBox1; + internal System.Windows.Forms.Label label1; + internal System.Windows.Forms.HelpProvider HelpProvider1; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public ControlBased() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.TextBox1 = new System.Windows.Forms.TextBox(); + this.ListBox1 = new System.Windows.Forms.ListBox(); + this.label1 = new System.Windows.Forms.Label(); + this.HelpProvider1 = new System.Windows.Forms.HelpProvider(); + this.SuspendLayout(); + // + // TextBox1 + // + this.TextBox1.Location = new System.Drawing.Point(30, 135); + this.TextBox1.Name = "TextBox1"; + this.TextBox1.Size = new System.Drawing.Size(208, 20); + this.TextBox1.TabIndex = 11; + this.TextBox1.Text = "TextBox1"; + // + // ListBox1 + // + this.ListBox1.Location = new System.Drawing.Point(26, 19); + this.ListBox1.Name = "ListBox1"; + this.ListBox1.Size = new System.Drawing.Size(112, 95); + this.ListBox1.TabIndex = 10; + // + // label1 + // + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.label1.Location = new System.Drawing.Point(30, 179); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(236, 68); + this.label1.TabIndex = 9; + this.label1.Text = "Select a control and press F1 here for a control-based help topic."; + // + // ControlBased + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.TextBox1, + this.ListBox1, + this.label1}); + this.Name = "ControlBased"; + this.Text = "ControlBased"; + this.Load += new System.EventHandler(this.ControlBased_Load); + this.ResumeLayout(false); + + } + #endregion + + private void ControlBased_Load(object sender, System.EventArgs e) + { + HelpProvider1.HelpNamespace = "sample.chm"; + HelpProvider1.SetHelpKeyword(TextBox1, "1007.html"); + HelpProvider1.SetHelpNavigator(TextBox1, HelpNavigator.Topic); + HelpProvider1.SetHelpKeyword(ListBox1, "1006.html"); + HelpProvider1.SetHelpNavigator(ListBox1, HelpNavigator.Topic); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/ControlBased.resx b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/ControlBased.resx new file mode 100644 index 0000000..c63e2e5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/ControlBased.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Assembly + + + Assembly + + + Assembly + + + 304, 30 + + + Assembly + + + ControlBased + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/Form1.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/Form1.cs new file mode 100644 index 0000000..7e3488f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/Form1.cs @@ -0,0 +1,91 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +namespace HelpTest +{ + /// + /// Summary description for Form1. + /// + public class Form1 : System.Windows.Forms.Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + // + // Form1 + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(528, 434); + this.IsMdiContainer = true; + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.Run(new Form1()); + } + + private void Form1_Load(object sender, System.EventArgs e) + { + FormBased frm1 = new FormBased(); + FrameBased frm2 = new FrameBased(); + ControlBased frm3 = new ControlBased(); + + frm1.MdiParent = this; + frm2.MdiParent = this; + frm3.MdiParent = this; + + frm1.Show(); + frm2.Show(); + frm3.Show(); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/Form1.resx b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/Form1.resx new file mode 100644 index 0000000..add6c98 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/Form1.resx @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Form1 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FormBased.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FormBased.cs new file mode 100644 index 0000000..347955e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FormBased.cs @@ -0,0 +1,90 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace HelpTest +{ + /// + /// Summary description for FormBased. + /// + public class FormBased : System.Windows.Forms.Form + { + internal System.Windows.Forms.HelpProvider HelpProvider1; + internal System.Windows.Forms.Label label1; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public FormBased() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.HelpProvider1 = new System.Windows.Forms.HelpProvider(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label1 + // + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.label1.Location = new System.Drawing.Point(28, 99); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(236, 68); + this.label1.TabIndex = 6; + this.label1.Text = "Press F1 here for a form-based help topic."; + // + // FormBased + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.label1}); + this.Name = "FormBased"; + this.Text = "FormBased"; + this.Load += new System.EventHandler(this.FormBased_Load); + this.ResumeLayout(false); + + } + #endregion + + private void FormBased_Load(object sender, System.EventArgs e) + { + HelpProvider1.HelpNamespace = "sample.chm"; + HelpProvider1.SetHelpKeyword(this, "1001.html"); + HelpProvider1.SetHelpNavigator(this, HelpNavigator.Topic); + + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FormBased.resx b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FormBased.resx new file mode 100644 index 0000000..fcf12e9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FormBased.resx @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 304, 30 + + + Assembly + + + Assembly + + + FormBased + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FrameBased.cs b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FrameBased.cs new file mode 100644 index 0000000..a46d724 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FrameBased.cs @@ -0,0 +1,165 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace HelpTest +{ + /// + /// Summary description for FrameBased. + /// + public class FrameBased : System.Windows.Forms.Form + { + internal System.Windows.Forms.HelpProvider HelpProvider1; + internal System.Windows.Forms.Label label1; + internal System.Windows.Forms.GroupBox GroupBox2; + internal System.Windows.Forms.CheckBox CheckBox1; + internal System.Windows.Forms.TextBox TextBox3; + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.TextBox TextBox2; + internal System.Windows.Forms.TextBox TextBox1; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public FrameBased() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.HelpProvider1 = new System.Windows.Forms.HelpProvider(); + this.label1 = new System.Windows.Forms.Label(); + this.GroupBox2 = new System.Windows.Forms.GroupBox(); + this.CheckBox1 = new System.Windows.Forms.CheckBox(); + this.TextBox3 = new System.Windows.Forms.TextBox(); + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.TextBox2 = new System.Windows.Forms.TextBox(); + this.TextBox1 = new System.Windows.Forms.TextBox(); + this.GroupBox2.SuspendLayout(); + this.GroupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // label1 + // + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.label1.Location = new System.Drawing.Point(34, 237); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(236, 40); + this.label1.TabIndex = 9; + this.label1.Text = "Press F1 in either frame for a frame-based help topic."; + // + // GroupBox2 + // + this.GroupBox2.Controls.AddRange(new System.Windows.Forms.Control[] { + this.CheckBox1, + this.TextBox3}); + this.GroupBox2.Location = new System.Drawing.Point(14, 117); + this.GroupBox2.Name = "GroupBox2"; + this.GroupBox2.Size = new System.Drawing.Size(264, 96); + this.GroupBox2.TabIndex = 8; + this.GroupBox2.TabStop = false; + this.GroupBox2.Text = "GroupBox2"; + // + // CheckBox1 + // + this.CheckBox1.Location = new System.Drawing.Point(20, 64); + this.CheckBox1.Name = "CheckBox1"; + this.CheckBox1.Size = new System.Drawing.Size(124, 16); + this.CheckBox1.TabIndex = 3; + this.CheckBox1.Text = "CheckBox1"; + // + // TextBox3 + // + this.TextBox3.Location = new System.Drawing.Point(20, 28); + this.TextBox3.Name = "TextBox3"; + this.TextBox3.Size = new System.Drawing.Size(96, 20); + this.TextBox3.TabIndex = 2; + this.TextBox3.Text = "TextBox3"; + // + // GroupBox1 + // + this.GroupBox1.Controls.AddRange(new System.Windows.Forms.Control[] { + this.TextBox2, + this.TextBox1}); + this.GroupBox1.Location = new System.Drawing.Point(14, 9); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(264, 96); + this.GroupBox1.TabIndex = 7; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "GroupBox1"; + // + // TextBox2 + // + this.TextBox2.Location = new System.Drawing.Point(20, 56); + this.TextBox2.Name = "TextBox2"; + this.TextBox2.Size = new System.Drawing.Size(96, 20); + this.TextBox2.TabIndex = 1; + this.TextBox2.Text = "TextBox2"; + // + // TextBox1 + // + this.TextBox1.Location = new System.Drawing.Point(20, 28); + this.TextBox1.Name = "TextBox1"; + this.TextBox1.Size = new System.Drawing.Size(96, 20); + this.TextBox1.TabIndex = 0; + this.TextBox1.Text = "TextBox1"; + // + // FrameBased + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); + this.ClientSize = new System.Drawing.Size(292, 286); + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.label1, + this.GroupBox2, + this.GroupBox1}); + this.Name = "FrameBased"; + this.Text = "FrameBased"; + this.Load += new System.EventHandler(this.FrameBased_Load); + this.GroupBox2.ResumeLayout(false); + this.GroupBox1.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + private void FrameBased_Load(object sender, System.EventArgs e) + { + HelpProvider1.HelpNamespace = "sample.chm"; + HelpProvider1.SetHelpKeyword(GroupBox1, "1003.html"); + HelpProvider1.SetHelpNavigator(GroupBox1, HelpNavigator.Topic); + HelpProvider1.SetHelpKeyword(GroupBox2, "1004.html"); + HelpProvider1.SetHelpNavigator(GroupBox2, HelpNavigator.Topic); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FrameBased.resx b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FrameBased.resx new file mode 100644 index 0000000..d17a8f7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/FrameBased.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 304, 30 + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + Assembly + + + FrameBased + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.csproj b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.csproj new file mode 100644 index 0000000..6b6bc1c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.csproj @@ -0,0 +1,120 @@ + + + Local + 8.0.40607 + 2.0 + {E1BA06D3-FF7F-4813-9F52-AB3C758857A3} + Debug + AnyCPU + App.ico + + + HelpTest + + + JScript + Grid + IE50 + false + WinExe + HelpTest + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + + Form + + + Form + + + Form + + + Form + + + ControlBased.cs + + + Form1.cs + + + FormBased.cs + + + FrameBased.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.csproj.user b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.csproj.user new file mode 100644 index 0000000..6b7d1b3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.sln b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.sln new file mode 100644 index 0000000..e407f16 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelpTest", "HelpTest.csproj", "{E1BA06D3-FF7F-4813-9F52-AB3C758857A3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E1BA06D3-FF7F-4813-9F52-AB3C758857A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E1BA06D3-FF7F-4813-9F52-AB3C758857A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1BA06D3-FF7F-4813-9F52-AB3C758857A3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E1BA06D3-FF7F-4813-9F52-AB3C758857A3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.suo b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.suo new file mode 100644 index 0000000..cc88096 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/HelpTest.suo differ diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/bin/Debug/HelpTest.exe b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/bin/Debug/HelpTest.exe new file mode 100644 index 0000000..d62c46e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/bin/Debug/HelpTest.exe differ diff --git a/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/bin/Debug/sample.chm b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/bin/Debug/sample.chm new file mode 100644 index 0000000..020ca80 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/ContextSensitiveHelp2/bin/Debug/sample.chm differ diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Form1.Designer.cs new file mode 100644 index 0000000..db6d50a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Form1.Designer.cs @@ -0,0 +1,86 @@ +namespace PopUpHelp +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.hlp = new System.Windows.Forms.HelpProvider(); + this.cmdDelete = new System.Windows.Forms.Button(); + this.cmdAdd = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(56, 179); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(208, 68); + this.label1.TabIndex = 7; + this.label1.Text = "Tab to a button and press F1."; + // + // cmdDelete + // + this.cmdDelete.Location = new System.Drawing.Point(28, 71); + this.cmdDelete.Name = "cmdDelete"; + this.cmdDelete.Size = new System.Drawing.Size(92, 20); + this.cmdDelete.TabIndex = 6; + this.cmdDelete.Text = "Delete"; + // + // cmdAdd + // + this.cmdAdd.Location = new System.Drawing.Point(28, 19); + this.cmdAdd.Name = "cmdAdd"; + this.cmdAdd.Size = new System.Drawing.Size(92, 20); + this.cmdAdd.TabIndex = 5; + this.cmdAdd.Text = "Add"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.label1); + this.Controls.Add(this.cmdDelete); + this.Controls.Add(this.cmdAdd); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Pop-Up Help"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + internal System.Windows.Forms.HelpProvider hlp; + internal System.Windows.Forms.Button cmdDelete; + internal System.Windows.Forms.Button cmdAdd; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Form1.cs b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Form1.cs new file mode 100644 index 0000000..b7a3bbd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Form1.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace PopUpHelp +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + hlp.SetHelpString(cmdAdd, "Choose another item from the catalog."); + hlp.SetHelpString(cmdDelete, "Delete the selected item from your order."); + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Form1.resx b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Form1.resx new file mode 100644 index 0000000..859424d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Form1.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/PopUpHelp.csproj b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/PopUpHelp.csproj new file mode 100644 index 0000000..e2518c7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/PopUpHelp.csproj @@ -0,0 +1,78 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {E2B44132-6147-4660-A072-81743C92DA98} + WinExe + Properties + PopUpHelp + PopUpHelp + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Designer + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/PopUpHelp.sln b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/PopUpHelp.sln new file mode 100644 index 0000000..8c2fc92 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/PopUpHelp.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PopUpHelp", "PopUpHelp.csproj", "{E2B44132-6147-4660-A072-81743C92DA98}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E2B44132-6147-4660-A072-81743C92DA98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2B44132-6147-4660-A072-81743C92DA98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2B44132-6147-4660-A072-81743C92DA98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2B44132-6147-4660-A072-81743C92DA98}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/PopUpHelp.suo b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/PopUpHelp.suo new file mode 100644 index 0000000..2085755 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/PopUpHelp.suo differ diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Program.cs b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Program.cs new file mode 100644 index 0000000..2e970ad --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace PopUpHelp +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2cbf86c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PopUpHelp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PopUpHelp")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("cac3b83c-f3c6-45d0-9e44-678d571473fb")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Resources.Designer.cs new file mode 100644 index 0000000..55c730a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace PopUpHelp.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PopUpHelp.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Settings.Designer.cs new file mode 100644 index 0000000..95d2c05 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace PopUpHelp.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter22/PopUpHelp/bin/Debug/PopUpHelp.exe b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/bin/Debug/PopUpHelp.exe new file mode 100644 index 0000000..6ee9d5e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/PopUpHelp/bin/Debug/PopUpHelp.exe differ diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Form1.Designer.cs b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Form1.Designer.cs new file mode 100644 index 0000000..bc3abd2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Form1.Designer.cs @@ -0,0 +1,392 @@ +namespace SlideOutHelp +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.toolStrip2 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.panel2 = new System.Windows.Forms.Panel(); + this.webBrowser1 = new System.Windows.Forms.WebBrowser(); + this.cmdShowHide = new System.Windows.Forms.Button(); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.printToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.copyToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.pasteToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.helpToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.button2 = new System.Windows.Forms.Button(); + this.toolStripContainer1.ContentPanel.SuspendLayout(); + this.toolStripContainer1.TopToolStripPanel.SuspendLayout(); + this.toolStripContainer1.SuspendLayout(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.toolStrip2.SuspendLayout(); + this.panel2.SuspendLayout(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // toolStripContainer1 + // + // + // toolStripContainer1.ContentPanel + // + this.toolStripContainer1.ContentPanel.Controls.Add(this.splitContainer1); + this.toolStripContainer1.ContentPanel.Size = new System.Drawing.Size(439, 309); + this.toolStripContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.toolStripContainer1.Location = new System.Drawing.Point(0, 0); + this.toolStripContainer1.Name = "toolStripContainer1"; + this.toolStripContainer1.Size = new System.Drawing.Size(439, 334); + this.toolStripContainer1.TabIndex = 0; + this.toolStripContainer1.Text = "toolStripContainer1"; + // + // toolStripContainer1.TopToolStripPanel + // + this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip1); + // + // splitContainer1 + // + this.splitContainer1.BackColor = System.Drawing.Color.Transparent; + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.BackColor = System.Drawing.Color.AliceBlue; + this.splitContainer1.Panel1.Controls.Add(this.button2); + this.splitContainer1.Panel1.Controls.Add(this.textBox3); + this.splitContainer1.Panel1.Controls.Add(this.label3); + this.splitContainer1.Panel1.Controls.Add(this.textBox2); + this.splitContainer1.Panel1.Controls.Add(this.label2); + this.splitContainer1.Panel1.Controls.Add(this.textBox1); + this.splitContainer1.Panel1.Controls.Add(this.label1); + this.splitContainer1.Panel1.Controls.Add(this.toolStrip2); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.BackColor = System.Drawing.Color.White; + this.splitContainer1.Panel2.Controls.Add(this.panel2); + this.splitContainer1.Panel2.Controls.Add(this.cmdShowHide); + this.splitContainer1.Size = new System.Drawing.Size(439, 309); + this.splitContainer1.SplitterDistance = 228; + this.splitContainer1.TabIndex = 1; + this.splitContainer1.Text = "splitContainer1"; + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(87, 106); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(100, 21); + this.textBox3.TabIndex = 5; + this.textBox3.Tag = "Welcome.htm"; + this.textBox3.Text = "Welcome.htm"; + this.textBox3.Enter += new System.EventHandler(this.textBox1_Enter); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(25, 109); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(60, 13); + this.label3.TabIndex = 4; + this.label3.Text = "Help Topic:"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(87, 78); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(100, 21); + this.textBox2.TabIndex = 3; + this.textBox2.Tag = "ValueOfHelp.htm"; + this.textBox2.Text = "ValueOfHelp.htm"; + this.textBox2.Enter += new System.EventHandler(this.textBox1_Enter); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(25, 81); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(60, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Help Topic:"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(87, 48); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(100, 21); + this.textBox1.TabIndex = 1; + this.textBox1.Tag = "BadHelp.htm"; + this.textBox1.Text = "BadHelp.htm"; + this.textBox1.Enter += new System.EventHandler(this.textBox1_Enter); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(25, 51); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(60, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Help Topic:"; + // + // toolStrip2 + // + this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton1}); + this.toolStrip2.Location = new System.Drawing.Point(0, 0); + this.toolStrip2.Name = "toolStrip2"; + this.toolStrip2.Size = new System.Drawing.Size(228, 25); + this.toolStrip2.TabIndex = 7; + this.toolStrip2.Text = "toolStrip2"; + // + // toolStripButton1 + // + this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(61, 22); + this.toolStripButton1.Text = "Show Help"; + this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click); + // + // panel2 + // + this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panel2.Controls.Add(this.webBrowser1); + this.panel2.Location = new System.Drawing.Point(5, 4); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(199, 276); + this.panel2.TabIndex = 0; + // + // webBrowser1 + // + this.webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill; + this.webBrowser1.Location = new System.Drawing.Point(0, 0); + this.webBrowser1.Name = "webBrowser1"; + this.webBrowser1.Size = new System.Drawing.Size(197, 274); + this.webBrowser1.TabIndex = 0; + // + // cmdShowHide + // + this.cmdShowHide.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cmdShowHide.BackColor = System.Drawing.Color.White; + this.cmdShowHide.Location = new System.Drawing.Point(5, 282); + this.cmdShowHide.Name = "cmdShowHide"; + this.cmdShowHide.Size = new System.Drawing.Size(199, 23); + this.cmdShowHide.TabIndex = 1; + this.cmdShowHide.Text = "Hide >"; + this.cmdShowHide.UseVisualStyleBackColor = true; + this.cmdShowHide.Click += new System.EventHandler(this.cmdShowHide_Click); + // + // toolStrip1 + // + this.toolStrip1.Dock = System.Windows.Forms.DockStyle.None; + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.printToolStripButton, + this.toolStripSeparator, + this.cutToolStripButton, + this.copyToolStripButton, + this.pasteToolStripButton, + this.toolStripSeparator1, + this.helpToolStripButton}); + this.toolStrip1.Location = new System.Drawing.Point(3, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(208, 25); + this.toolStrip1.TabIndex = 0; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Size = new System.Drawing.Size(23, 22); + this.newToolStripButton.Text = "&New"; + // + // openToolStripButton + // + this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Size = new System.Drawing.Size(23, 22); + this.openToolStripButton.Text = "&Open"; + // + // saveToolStripButton + // + this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveToolStripButton.Text = "&Save"; + // + // printToolStripButton + // + this.printToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image"))); + this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripButton.Name = "printToolStripButton"; + this.printToolStripButton.Size = new System.Drawing.Size(23, 22); + this.printToolStripButton.Text = "&Print"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + this.toolStripSeparator.Size = new System.Drawing.Size(6, 25); + // + // cutToolStripButton + // + this.cutToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.cutToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripButton.Image"))); + this.cutToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripButton.Name = "cutToolStripButton"; + this.cutToolStripButton.Size = new System.Drawing.Size(23, 22); + this.cutToolStripButton.Text = "C&ut"; + // + // copyToolStripButton + // + this.copyToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.copyToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripButton.Image"))); + this.copyToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripButton.Name = "copyToolStripButton"; + this.copyToolStripButton.Size = new System.Drawing.Size(23, 22); + this.copyToolStripButton.Text = "&Copy"; + // + // pasteToolStripButton + // + this.pasteToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.pasteToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripButton.Image"))); + this.pasteToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripButton.Name = "pasteToolStripButton"; + this.pasteToolStripButton.Size = new System.Drawing.Size(23, 22); + this.pasteToolStripButton.Text = "&Paste"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // helpToolStripButton + // + this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image"))); + this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.helpToolStripButton.Name = "helpToolStripButton"; + this.helpToolStripButton.Size = new System.Drawing.Size(23, 22); + this.helpToolStripButton.Text = "He&lp"; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(87, 148); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 8; + this.button2.Text = "button2"; + this.button2.UseVisualStyleBackColor = true; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(439, 334); + this.Controls.Add(this.toolStripContainer1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "Main"; + this.toolStripContainer1.ContentPanel.ResumeLayout(false); + this.toolStripContainer1.TopToolStripPanel.ResumeLayout(false); + this.toolStripContainer1.TopToolStripPanel.PerformLayout(); + this.toolStripContainer1.ResumeLayout(false); + this.toolStripContainer1.PerformLayout(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + this.splitContainer1.ResumeLayout(false); + this.toolStrip2.ResumeLayout(false); + this.toolStrip2.PerformLayout(); + this.panel2.ResumeLayout(false); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ToolStripContainer toolStripContainer1; + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.Button cmdShowHide; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripButton printToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripButton cutToolStripButton; + private System.Windows.Forms.ToolStripButton copyToolStripButton; + private System.Windows.Forms.ToolStripButton pasteToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton helpToolStripButton; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ToolStrip toolStrip2; + private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.WebBrowser webBrowser1; + private System.Windows.Forms.Button button2; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Form1.cs b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Form1.cs new file mode 100644 index 0000000..a17f180 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Form1.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace SlideOutHelp +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void cmdShowHide_Click(object sender, EventArgs e) + { + splitContainer1.Panel2Collapsed = true; + } + + private void toolStripButton1_Click(object sender, EventArgs e) + { + splitContainer1.Panel2Collapsed = false; + } + + private void textBox1_Enter(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + webBrowser1.Navigate(Application.StartupPath + @"\..\..\Help\" + ctrl.Tag); + } + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Form1.resx b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Form1.resx new file mode 100644 index 0000000..751020b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Form1.resx @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 116, 17 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi1JREFUOE+1k/9P + UlEYxv2nWK2tVlttGmpltrCcEQ1XUjSMaUHJNLIpNcnCragplBvUoC/okJhZLG92ySUpU8RNICdIhAio + EF+e7r1UZMDW1jrb+8t7z/N83vucc8rK/sdyeYIwvpopWYbRaZTk0uIx0o0/V/JbGt7lVTwxT6CKKylt + oLd8xGYihS/hKGz2WaaeWUnoTATsMz7UCztx9Ex7cYN3jkUQU4tb4DR5LZaAcyEAg4VE5YlLMFmJQoNQ + JA61gUA6k4XPH9pCN9s+gZz2oq5Jjlq+DDfUz3Fba86bOGY9jHiUdDF0mvqT7A/F4fKEcE9nZf5d1jOI + B4ZxVJ2U5gyc8z70akegMX3AXb0ND1+8R6/GgvZbeog61OA2K3CA2lxR34JjZ69B2T8EsVyN/Q0XcwY3 + B14iGk8UpE43UukMNqhA6QyC4Q0srcQg7dagsbWHmuDHScj7jDC9nsJTqx0a4xjuaIfRqXoMSXc/hG0q + 8C4owGnqwEGeFOXHxThH9eoEV7G7VpiboE2pK0qnm9H1JLz+NUzOBfHWEcAQsQSuqAuVDa1gVZzKGUgU + jwoMqAzxNZbC3Od1jDvDYPdth+7NCpP8Yf4V7KoR5A1arg8gmQIoGMLxLJYjWSwEMphwb2J4MoZB2yqU + LBZUIxHGYB9HlBfTE4jl9+GmBPTHv6lfo//+GGoaZajmXQabumXl1HHt5TRjz5Hz2HlIgB3Vp7GNzWeo + RcX/+pq/AwHYL0leVl8fAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAYdJREFUOE+t001L + QlEQBuB+TdCmRVEJRRIWtRAUlKsQhFmkpZQtIiWyAlMwP5KkXS0shLqGFkgoFqWQmaRR2qIvU7FMwWhd + 8JZXkFx0uVGzOcNh5jkDw6mr+++4SN7B6fbju/uQecYm6a25+/Hdl2IJptWNmmJyL4DwWZwZUJbtayT8 + RxGqIV8oQaaaRfrxkTmw4z2G+WuKbC6PYDgOkUSJp6ccc+AgdI4luwPbHh/UCxb0S0aZN5fHTmefMTVv + wfDEHIiBMegMpt8BZUShNoGQTIKQGxA8TTIHMoUPGF1vEOvTWHTcgqeJQahNwLqVQiRRpIdS+XcM2l4h + 1t2DI3WAP7oGoSYE3kwSPQofljcqm/kxjK4SCH0OXSMetItsUC26wZuOVptYhI0eEOuz1YI2gZnKBdpr + 6iR9V2jkKOkBQpeiCryhFFr4eioft16iU7qNho4h1Dc00QOqlRuwpSSa+UawuZXdByIZsPoUaOmWwrUf + owcOozlwZeto7ZXDuXvCfHV/+dGfqqrf44qgu28AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAeJJREFUOE+lk9FP + klEYxv1TSsecde0f0FpZrTbbal7URVvZuuJCr7pq2WzLNWy0iSHNwtIB9qG0ltLSYRJpBomUgZPMGSyU + 8SmJIOiv7zssCdrAzXd77s77e5/nnPdUVR20HBPfUCWNB4QsI176HB8IL/9iX2y1ubTMwx6utz0nuLhc + GWIfCxT153Z26ep/g9Md4FJLZ2WIZdQnAM4QSJ/BH5Z5aH6NNCljm0hgdSV4MppAPxQXCq5kil31OTx7 + DjLbOeSNNJFYUgBKq31glfpmN76F9QLEZHOJc73ubXQjMreln7Q+DdP/du0/QIsxhmNK5mjTMJ/m43mI + Qcmr5t5MZVlNpFiKrPM1vIbpVVQAOqSckF+ZekUX5UjTS+ouDFLb+CwPUPNupbN7k7WmEDcMX3hgXSpy + IP/OsrCyhXtuA6M0g+bc4wJATqaZ/x7DF4zg8f9g/OMibb355701kERriHL5fojzd2aFjNI0mjPdBUD9 + 6auUqlU/KwBZJV4skWUuvMmYV8b+Ls6jQQ81DfryO3KtfUoA/p3810G37T3VJ3TlARdvukhldjANeemx + z2B8MS0mq80GyySHj98rD2jQOpXbtgrVNprRnO2h5lQX1Sc7leYODh27W3nN9/WZDnroDx0A5wwhdtmt + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlBJREFUOE+1k1lI + lGEUhn/owm6KFuqqq4LoJooIqouMwixMM4zEjKyJGJUSlcnSITU1RSe3SdPGyGVQc6tEUSkSIXFo13CM + FonUyGmy5p9xz+Lp/z8ZbGjzpgMv5+a8z1n4Pkn6H9HZnEH7zVQayxKYF7+hMg+3ynKO4LBVMWa7xmBf + Nme1vuSl67hi0GNMj/sVqBon5XqmnXVMOqoxF+sYH6kgJyWKF13xnD/tT7xmM7bOY4y0riY6bL8nRAWo + 5mlnDUUZR+m2ZCO/L2C4T89bywmaSgIJD/WmKnEVT/MkIg/v8wTUVeTMAuQbGBLDSNaFoI8K5lxkEDpt + IDEafyJCfciPXiMAIX7enoDqUgNTci1TdhPjQ5nYn0dhrVgu1Fu+jO7iRTwyegmzKp9tGz0BZlMGE/Yy + JgbSGH95irFnB5GbF5Nb3kqmqZELl2uJN5iJSS0hPMFIWGyWJ6C0MJXRQSNjfVpGH/vjur+Jj7dXCLM7 + pme+4XBOMjDsIDgihYDj+jlISW4S8qs0XA99cXWsx9m2ksFySXRWo/RWp5Cppp3efpsw3+2ysidIMwsp + zErgc88ZnO3rkFuWYq/3ov+6JMb+OvOdLy6l8wcHvW9sWHre4Rcag69i3rX3AN7bdyDlX4zD/iBCMS/h + U8NChioXYC2SiFZ2Vsd2T3BVmaDA3EZTh1VkVVs3rEW6lBwrHoj7yu6sVQ72c+d7ltfCXH+nm5rWJ3MA + dY3cpJPKCwtEE7SbgJ1bBFm9trqzu9vvspjgT3FIubZa8C/N67P9regHTvjvLQ3rR38AAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhhJREFUOE+1U09r + E0EU70fIR9iPUBQ8eMrR46IN5JhCDz2oBA8SBHEpCMFgG5GiwdJdq2Ijqe6ldo3Wrmhri0gXazW2YbMt + UdNmm45ulf7R/HwzU1hLIzn54LFvhvn9eW9nOjr+R0wvBLhTXEf6bgV9w0sYLJQx/uoz2mq9c7eRn2pA + L67Bq+/i29YeWLBL9Q6u5ktI6w6Kr1dbE3HwA3sT/o8mbAfQRgE1LZPXtsPgbjZxaXAG4y/Kh0m48sbP + JgwbiKYAwwLYNkR4DEje5HsMFSI5l3l2kGD6/RYezzeEMgfzwzzMWSCRlV9OFk0xqhl06wNy+Tchyb2n + dXxhv4TVaFLazppAJ9VKL0MySxYoVI0hkXaw5AbovjAWEmTur4qBqZoEdfbKVCgTBObqdolBUW0ocRs1 + P8Cx2PWQ4PJtl6a9J+xLIB1OMHIilU2b1gSMqCZ9TdTq33FEHQgJcg8rWPF3qHcJVOKeyOyoJIioDqUk + UFM2SuUqus4YIcHEzFdYji8GxIGROAc41JJHc6E1B58wRRqWhzFrEVduTR78E5mRBSz7v0l1H0AgXgsH + +2DNcPBp3cep0/rhezA5V0Vfbg5ug+4CqaiaI/rmyWu+t1zdQIysDxdmW9/GiZcVnO+fgvHkI+YXV7BG + 067VA9Ezt91Fyvq/wH8/lKHCW/RcfITj8Rs4evIaYmdHkBl63v4xtX1tLQ78AZ3a8qxOv4hDAAAAAElF + TkSuQmCC + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/BadHelp.htm b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/BadHelp.htm new file mode 100644 index 0000000..d403f2e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/BadHelp.htm @@ -0,0 +1,16 @@ + + + +Bad Help + + + + +

Bad Help

+

Have you ever had this experience? You find an unusual option buried deep in an application, and it piques your curiosity. You hit F1, curious to find out what this option accomplishes. But your optimism dwindles when you read the description provided by the context-sensitive Help system: "To enable option X, click once on the option X check box. To disable option X, click the option X check box again to remove the check mark. Click OK to save your changes."

+

Clearly something is missing here. You want to know what option X does; the Help wants to explain, in oddly explicit detail, how to use a check box. The situation is ridiculous, as the function of option X is not at all obvious, but the way to use a check box is an instinctive part of every computer user’s understanding. If you don’t know how to use a check box, you probably wouldn’t have guessed to press the F1 key for help.

+

This is an example of classic bad help.

+ + + + diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/Introduction.htm b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/Introduction.htm new file mode 100644 index 0000000..606b441 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/Introduction.htm @@ -0,0 +1,13 @@ + + + +Introduction + + + + +

Introduction

+

Welcome to the first page of this HTML Help file.

+ + + diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/ValueOfHelp.htm b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/ValueOfHelp.htm new file mode 100644 index 0000000..2fdb4eb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/ValueOfHelp.htm @@ -0,0 +1,14 @@ + + + +The Value of Help + + + + +

The Value of Help

+

In recent years there has been a shift away from printed documentation. The occasional weighty manual (like the book you’re holding now) is still required for learning advanced tools, but the average piece of office productivity or business software no longer assumes the user is willing to perform any additional reading. Instead, these programs are heavily dependent on natural, instinctive interfaces, and use online Help to patch the gaps and answer the occasional user question.

+ + + + diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/Welcome.htm b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/Welcome.htm new file mode 100644 index 0000000..d0395ae --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/Welcome.htm @@ -0,0 +1,15 @@ + + + +Welcome + + + + +

Welcome

+

Welcome to the first page of this HTML Help file.

+

Click on other topics to browse them, or go straight +to the introduction page.

+ + + diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/stylesheet.css b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/stylesheet.css new file mode 100644 index 0000000..522c8e7 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Help/stylesheet.css @@ -0,0 +1,16 @@ +body { + font-family: Verdana; + font-size: x-small; +} + +h1 { + font-size: medium; + padding: 10px; + margin-top: 1px; + background-color: lightblue; +} + +p { + margin-bottom: 8px; + margin-top: 8px; +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Program.cs b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Program.cs new file mode 100644 index 0000000..9237446 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace SlideOutHelp +{ + static class Global + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Form1()); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..43839fb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SlideOutHelp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("SlideOutHelp")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2cf6fa00-674b-4c6f-b94e-8ae7b338736a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Resources.Designer.cs new file mode 100644 index 0000000..38ce934 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SlideOutHelp.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SlideOutHelp.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SlideOutHelp.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace SlideOutHelp.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SlideOutHelp.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Settings.Designer.cs new file mode 100644 index 0000000..8609a91 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "SlideOutHelp.Properties.Settings.get_Default():SlideOutHelp.Properties.Settings")] + +namespace SlideOutHelp.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.csproj b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.csproj new file mode 100644 index 0000000..7497fcd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.csproj @@ -0,0 +1,70 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {163E2263-2BF2-4F28-8D2A-B34034F49F6A} + WinExe + Properties + SlideOutHelp + SlideOutHelp + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.csproj.user b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.sln b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.sln new file mode 100644 index 0000000..9974195 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SlideOutHelp", "SlideOutHelp.csproj", "{163E2263-2BF2-4F28-8D2A-B34034F49F6A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {163E2263-2BF2-4F28-8D2A-B34034F49F6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {163E2263-2BF2-4F28-8D2A-B34034F49F6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {163E2263-2BF2-4F28-8D2A-B34034F49F6A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {163E2263-2BF2-4F28-8D2A-B34034F49F6A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.suo b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.suo new file mode 100644 index 0000000..5ae79e4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/SlideOutHelp.suo differ diff --git a/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/bin/Debug/SlideOutHelp.exe b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/bin/Debug/SlideOutHelp.exe new file mode 100644 index 0000000..324846b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter22/SlideOutHelp/bin/Debug/SlideOutHelp.exe differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtonBase.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtonBase.cs new file mode 100644 index 0000000..2984e89 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtonBase.cs @@ -0,0 +1,317 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.ComponentModel.Design; + +namespace AnimatedButtons +{ + public abstract class AnimatedButtonBase : Control, IButtonControl + { + public AnimatedButtonBase() + { + SetStyle(ControlStyles.SupportsTransparentBackColor, true); + } + + //protected override CreateParams CreateParams + //{ + // get + // { + // CreateParams cp = base.CreateParams; + // cp.ExStyle |= 0x20; + // return cp; + // } + //} + + //protected override void OnPaintBackground(PaintEventArgs e) + //{ + //if (BackColor == Color.Transparent) + //{ + // // Do nothing. + //} + //else + //{ + // base.OnPaintBackground(e); + //} + //} + + #region IButtonControl Members + + private DialogResult dialogResult; + public DialogResult DialogResult + { + get { return dialogResult; } + set { dialogResult = value; } + } + + public void NotifyDefault(bool value) + { + // Fires when the button is made into a default. + // You could set properties to adjust the rendering, + // but that's not necessary. + OnNotifyDefault(value); + } + + public virtual void OnNotifyDefault(bool value) + { + // This method can be overriden in derived classes. + } + + public void PerformClick() + { + OnClick(EventArgs.Empty); + } + + #endregion + + public enum States + { + Normal, + MouseOver, + Pushed, + Disabled + } + private States state = States.Normal; + // This property procedure ensures the control is + // invalidated only when the state changes. + private States State + { + get { return state; } + set + { + if (state != value) + { + state = value; + Invalidate(); + } + } + } + + // You must override this property to invalidate the display and + // provide automatic refresh when the property is changed. + public override string Text + { + get + { + return base.Text; + } + set + { + if (value != base.Text) + { + base.Text = value; + FlushCache(); + Invalidate(); + } + } + } + + protected override void OnEnabledChanged(EventArgs e) + { + if (!Enabled) + State = States.Disabled; + else if (Enabled && State == States.Disabled) + State = States.Normal; + base.OnEnabledChanged(e); + } + + protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e) + { + + base.OnMouseMove(e); + + // Do nothing if the button is disabled. + if (State == States.Disabled) return; + + if (HitTest(e.X, e.Y)) + { + if (State != States.Pushed) State = States.MouseOver; + } + else + { + State = States.Normal; + } + } + + // If you want to make only a portion of the button + // clicakble, this is the method to override. + protected virtual bool HitTest(int X, int Y) + { + return true; + } + + protected override void OnMouseLeave(System.EventArgs e) + { + if (State != States.Disabled) State = States.Normal; + } + + protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) + { + // Do nothing if the button is disabled. + if (State == States.Disabled) return; + + if (HitTest(e.X, e.Y)) + { + if ((e.Button & MouseButtons.Left) == MouseButtons.Left) + { + Focus(); + State = States.Pushed; + } + } + } + + protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e) + { + // Do nothing if the button is disabled. + if (State == States.Disabled) return; + + if ((e.Button & MouseButtons.Left) == MouseButtons.Left) + { + if (HitTest(e.X, e.Y)) + { + State = States.MouseOver; + } + else + { + State = States.Normal; + } + } + } + + protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) + { + if (!cacheImages) + { + // Version without caching. + switch (State) + { + case States.Normal: + PaintNormal(e.Graphics); + break; + case States.MouseOver: + PaintMouseOver(e.Graphics); + break; + case States.Pushed: + PaintPushed(e.Graphics); + break; + case States.Disabled: + PaintDisabled(e.Graphics); + break; + } + if (this.Focused && State != States.Disabled) PaintFocusRectangle(e.Graphics); + } + else + { + switch (State) + { + case States.Normal: + CreateAndPaintCachedImage(normalImage, + new ClientPaintMethod(PaintNormal), e.Graphics); + break; + case States.MouseOver: + CreateAndPaintCachedImage(mouseOverImage, + new ClientPaintMethod(PaintMouseOver), e.Graphics); + break; + case States.Pushed: + CreateAndPaintCachedImage(pushedImage, + new ClientPaintMethod(PaintPushed), e.Graphics); + break; + case States.Disabled: + CreateAndPaintCachedImage(disabledImage, + new ClientPaintMethod(PaintDisabled), e.Graphics); + break; + } + if (this.Focused) PaintFocusRectangle(e.Graphics); + } + } + + private delegate void ClientPaintMethod(Graphics g); + private void CreateAndPaintCachedImage( + Image image, ClientPaintMethod paintMethod, Graphics g) + { + if (image == null) + { + image = new Bitmap(Width, Height); + Graphics bufferedGraphics = Graphics.FromImage(image); + paintMethod(bufferedGraphics); + bufferedGraphics.Dispose(); + } + g.DrawImageUnscaled(image, new Point(0, 0)); + } + + protected abstract void PaintNormal(Graphics g); + + protected abstract void PaintMouseOver(Graphics g); + + protected abstract void PaintPushed(Graphics g); + + protected abstract void PaintDisabled(Graphics g); + + private bool paintFocusCue = true; + public bool PaintFocusCue + { + get { return paintFocusCue; } + set + { + if (value != paintFocusCue) + { + paintFocusCue = value; + Invalidate(); + } + } + } + protected virtual void PaintFocusRectangle(Graphics g) + { + ControlPaint.DrawFocusRectangle(g, this.ClientRectangle); + } + + protected override void OnGotFocus(EventArgs e) + { + if (paintFocusCue) Invalidate(); + } + + protected override void OnLostFocus(EventArgs e) + { + if (paintFocusCue) Invalidate(); + } + + protected override void OnClick(System.EventArgs e) + { + // Only propagate the click to the client + // if it's a valid, hit-tested region. + if (State == States.Pushed) + { + base.OnClick(e); + } + } + + // Only has an effect if set before other properties. + // You could use ISupportInitialize, but in this case + // it's not needed because CacheImages setting is serialized + // first (alphabetically). + private bool cacheImages = true; + public bool CacheImages + { + get { return cacheImages; } + set { cacheImages = value; } + } + + private Image normalImage; + private Image mouseOverImage; + private Image pushedImage; + private Image disabledImage; + + protected void FlushCache() + { + normalImage = null; + mouseOverImage = null; + pushedImage = null; + disabledImage = null; + } + // Add code to remove cached images when size, or other + // properties change. + } + +} diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.csproj b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.csproj new file mode 100644 index 0000000..8bc0160 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.csproj @@ -0,0 +1,152 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {D7E656CA-2A88-4B1F-AFEB-6C94AAAE3F29} + WinExe + Properties + AnimatedButtons + AnimatedButtons + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + Component + + + Form + + + GlowButtonTest.cs + + + Form + + + Menu.cs + + + Component + + + Form + + + PopImageButtonTest.cs + + + + + GlowButtonTest.cs + Designer + + + Menu.cs + Designer + + + PopImageButton.cs + + + Designer + PopImageButtonTest.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + RolloverButtonTest.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Component + + + Form + + + RolloverButtonTest.cs + + + Component + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.csproj.user b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.sln b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.sln new file mode 100644 index 0000000..fe00f2f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AnimatedButtons", "AnimatedButtons.csproj", "{D7E656CA-2A88-4B1F-AFEB-6C94AAAE3F29}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D7E656CA-2A88-4B1F-AFEB-6C94AAAE3F29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D7E656CA-2A88-4B1F-AFEB-6C94AAAE3F29}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D7E656CA-2A88-4B1F-AFEB-6C94AAAE3F29}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D7E656CA-2A88-4B1F-AFEB-6C94AAAE3F29}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.suo b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.suo new file mode 100644 index 0000000..8381aab Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/AnimatedButtons.suo differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/GlowButtonTest.Designer.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/GlowButtonTest.Designer.cs new file mode 100644 index 0000000..4633a85 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/GlowButtonTest.Designer.cs @@ -0,0 +1,98 @@ +namespace AnimatedButtons +{ + partial class GlowButtonTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.simpleGlowButton1 = new AnimatedButtons.SimpleGlowButton(); + this.simpleGlowButton2 = new AnimatedButtons.SimpleGlowButton(); + this.simpleGlowButton3 = new AnimatedButtons.SimpleGlowButton(); + this.SuspendLayout(); + // + // simpleGlowButton1 + // + this.simpleGlowButton1.CacheImages = true; + this.simpleGlowButton1.DialogResult = System.Windows.Forms.DialogResult.None; + this.simpleGlowButton1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.simpleGlowButton1.Location = new System.Drawing.Point(30, 28); + this.simpleGlowButton1.Name = "simpleGlowButton1"; + this.simpleGlowButton1.PaintFocusCue = true; + this.simpleGlowButton1.Size = new System.Drawing.Size(132, 23); + this.simpleGlowButton1.TabIndex = 1; + this.simpleGlowButton1.Text = "simpleGlowButton1"; + this.simpleGlowButton1.Click += new System.EventHandler(this.simpleGlowButton1_Click); + // + // simpleGlowButton2 + // + this.simpleGlowButton2.CacheImages = true; + this.simpleGlowButton2.DialogResult = System.Windows.Forms.DialogResult.None; + this.simpleGlowButton2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.simpleGlowButton2.Location = new System.Drawing.Point(30, 68); + this.simpleGlowButton2.Name = "simpleGlowButton2"; + this.simpleGlowButton2.PaintFocusCue = true; + this.simpleGlowButton2.Size = new System.Drawing.Size(132, 23); + this.simpleGlowButton2.TabIndex = 2; + this.simpleGlowButton2.Text = "simpleGlowButton2"; + // + // simpleGlowButton3 + // + this.simpleGlowButton3.CacheImages = true; + this.simpleGlowButton3.DialogResult = System.Windows.Forms.DialogResult.None; + this.simpleGlowButton3.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.simpleGlowButton3.Location = new System.Drawing.Point(30, 108); + this.simpleGlowButton3.Name = "simpleGlowButton3"; + this.simpleGlowButton3.PaintFocusCue = true; + this.simpleGlowButton3.Size = new System.Drawing.Size(132, 23); + this.simpleGlowButton3.TabIndex = 3; + this.simpleGlowButton3.Text = "simpleGlowButton3"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.simpleGlowButton3); + this.Controls.Add(this.simpleGlowButton2); + this.Controls.Add(this.simpleGlowButton1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Form1"; + this.Text = "ButtonTest"; + this.ResumeLayout(false); + + } + + #endregion + + private SimpleGlowButton simpleGlowButton1; + private SimpleGlowButton simpleGlowButton2; + private SimpleGlowButton simpleGlowButton3; + + + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/GlowButtonTest.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/GlowButtonTest.cs new file mode 100644 index 0000000..78a9734 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/GlowButtonTest.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace AnimatedButtons +{ + public partial class GlowButtonTest : Form + { + public GlowButtonTest() + { + InitializeComponent(); + } + + private void simpleGlowButton1_Click(object sender, EventArgs e) + { + + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/GlowButtonTest.resx b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/GlowButtonTest.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/GlowButtonTest.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Menu.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Menu.cs new file mode 100644 index 0000000..44c5297 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace AnimatedButtons +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("AnimatedButtons." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Menu.designer.cs new file mode 100644 index 0000000..8f32436 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Menu.designer.cs @@ -0,0 +1,86 @@ +namespace AnimatedButtons +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(167, 23); + this.button1.TabIndex = 0; + this.button1.Text = "GlowButtonTest"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(167, 23); + this.button2.TabIndex = 1; + this.button2.Text = "PopImageButtonTest"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 70); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(167, 23); + this.button3.TabIndex = 2; + this.button3.Text = "RolloverButtonTest"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(197, 215); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Menu.resx b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButton.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButton.cs new file mode 100644 index 0000000..04b7879 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButton.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.ComponentModel.Design; + +namespace AnimatedButtons +{ + public class PopImageButton : AnimatedButtonBase + { + private Image image; + private Rectangle bounds; + + public Image Image + { + get + { + return image; + } + set + { + image = value; + if (image != null) + { + bounds = new Rectangle(0, 0, image.Width + 5, image.Height + 5); + } + Invalidate(); + } + } + + protected override bool HitTest(int X, int Y) + { + // Check if the mouse pointer is over the button. + // If the mouse moves off the button surface, it will be deactivated, + // even if the button is being held in a pressed position. + // The code repaints the button only if needed. + if (image == null) + return false; + else + return bounds.Contains(X, Y); + } + + + protected override void PaintNormal(Graphics g) + { + if (image != null) g.DrawImage(image, 2, 2); + PaintText(g); + } + + protected override void PaintMouseOver(Graphics g) + { + if (image != null) + { + ControlPaint.DrawBorder3D(g, bounds, + Border3DStyle.Raised, Border3DSide.All); + g.DrawImage(image, 2, 2); + } + PaintText(g); + } + + protected override void PaintPushed(Graphics g) + { + if (image != null) + { + ControlPaint.DrawBorder3D(g, bounds, + Border3DStyle.Sunken, Border3DSide.All); + g.DrawImage(image, 3, 3); + } + PaintText(g); + } + + protected override void PaintDisabled(Graphics g) + { + if (image != null) + { + ControlPaint.DrawImageDisabled(g, image, 2, 2, + BackColor); + } + PaintText(g); + } + + + private void PaintText(Graphics g) + { + int y = 0; + if (image == null) + y = Height; + else + y = bounds.Height; + + SolidBrush brush = new SolidBrush(ForeColor); + g.DrawString(Text, Font, + brush, bounds.Width + 3, (y - Font.Height) / 2); + brush.Dispose(); + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButton.resx b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButton.resx new file mode 100644 index 0000000..7e32396 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButton.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButtonTest.Designer.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButtonTest.Designer.cs new file mode 100644 index 0000000..f172679 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButtonTest.Designer.cs @@ -0,0 +1,93 @@ +namespace AnimatedButtons +{ + partial class PopImageButtonTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.popImageButton3 = new AnimatedButtons.PopImageButton(); + this.popImageButton2 = new AnimatedButtons.PopImageButton(); + this.popImageButton1 = new AnimatedButtons.PopImageButton(); + this.SuspendLayout(); + // + // popImageButton3 + // + this.popImageButton3.CacheImages = true; + this.popImageButton3.DialogResult = System.Windows.Forms.DialogResult.None; + this.popImageButton3.Image = global::AnimatedButtons.Properties.Resources.Folder; + this.popImageButton3.Location = new System.Drawing.Point(67, 121); + this.popImageButton3.Name = "popImageButton3"; + this.popImageButton3.PaintFocusCue = true; + this.popImageButton3.Size = new System.Drawing.Size(116, 35); + this.popImageButton3.TabIndex = 2; + this.popImageButton3.Text = "popImageButton3"; + // + // popImageButton2 + // + this.popImageButton2.CacheImages = true; + this.popImageButton2.DialogResult = System.Windows.Forms.DialogResult.None; + this.popImageButton2.Enabled = false; + this.popImageButton2.Image = global::AnimatedButtons.Properties.Resources.Key; + this.popImageButton2.Location = new System.Drawing.Point(67, 76); + this.popImageButton2.Name = "popImageButton2"; + this.popImageButton2.PaintFocusCue = true; + this.popImageButton2.Size = new System.Drawing.Size(116, 23); + this.popImageButton2.TabIndex = 1; + this.popImageButton2.Text = "popImageButton2"; + // + // popImageButton1 + // + this.popImageButton1.CacheImages = true; + this.popImageButton1.DialogResult = System.Windows.Forms.DialogResult.None; + this.popImageButton1.Image = global::AnimatedButtons.Properties.Resources.Key; + this.popImageButton1.Location = new System.Drawing.Point(67, 32); + this.popImageButton1.Name = "popImageButton1"; + this.popImageButton1.PaintFocusCue = true; + this.popImageButton1.Size = new System.Drawing.Size(116, 23); + this.popImageButton1.TabIndex = 0; + this.popImageButton1.Text = "popImageButton1"; + // + // PopImageButtonTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.popImageButton3); + this.Controls.Add(this.popImageButton2); + this.Controls.Add(this.popImageButton1); + this.Name = "PopImageButtonTest"; + this.Text = "PopImageButtonTest"; + this.ResumeLayout(false); + + } + + #endregion + + private PopImageButton popImageButton1; + private PopImageButton popImageButton2; + private PopImageButton popImageButton3; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButtonTest.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButtonTest.cs new file mode 100644 index 0000000..270e89f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButtonTest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace AnimatedButtons +{ + public partial class PopImageButtonTest : Form + { + public PopImageButtonTest() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButtonTest.resx b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButtonTest.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/PopImageButtonTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Program.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Program.cs new file mode 100644 index 0000000..d9899af --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace AnimatedButtons +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..cb2500c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AnimatedButtons")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AnimatedButtons")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5ec59196-fd77-4ad8-a8ac-c565916ad681")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Resources.Designer.cs new file mode 100644 index 0000000..452c2ea --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Resources.Designer.cs @@ -0,0 +1,147 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace AnimatedButtons.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AnimatedButtons.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap background2 { + get { + object obj = ResourceManager.GetObject("background2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap buttonC_1 { + get { + object obj = ResourceManager.GetObject("buttonC_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap buttonC_2 { + get { + object obj = ResourceManager.GetObject("buttonC_2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap buttonC_3 { + get { + object obj = ResourceManager.GetObject("buttonC_3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap buttonDS_1 { + get { + object obj = ResourceManager.GetObject("buttonDS_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap buttonDS_2 { + get { + object obj = ResourceManager.GetObject("buttonDS_2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap buttonDS_3 { + get { + object obj = ResourceManager.GetObject("buttonDS_3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap buttonDSE_1 { + get { + object obj = ResourceManager.GetObject("buttonDSE_1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap buttonDSE_2 { + get { + object obj = ResourceManager.GetObject("buttonDSE_2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap buttonDSE_3 { + get { + object obj = ResourceManager.GetObject("buttonDSE_3", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Folder { + get { + object obj = ResourceManager.GetObject("Folder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + internal static System.Drawing.Bitmap Key { + get { + object obj = ResourceManager.GetObject("Key", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Resources.resx new file mode 100644 index 0000000..700d904 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Resources.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\background2.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonC_1.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonC_2.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonC_3.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonDS_1.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonDS_2.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonDS_3.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonDSE_1.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonDSE_2.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\buttonDSE_3.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + + + Qk0SCQAAAAAAADYAAAAoAAAAGwAAABsAAAABABgAAAAAAAAAAADEDgAAxA4AAAAAAAAAAAAA2Ons2Ons + 0+TnvczOqLW3rru+u8nMw9LVy9ve0+Tn2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons + 2Ons2Ons2Ons2Ons2Ons0SgH2Ons2Onss9TcbKO1X3B0XWRlbXV3f4iKlaCiqba4uMbJwdDTydnb0eLl + 1+jr2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons0SgH2Ons2OnsfsDWLq7ZIKjZC4ex + GXmZLGl8RV1kWWBhaXFyeYKEj5qco7CytMLEv87Qx9fa0ODj1ufq2Ons2Ons2Ons2Ons2Ons2Ons2Ons + 2Ons0SgH2Ons2OnsZLnTXMPmf9n/bdL/U8XyOLbmJKzcD5G9FH+hJ22EPmBrVVxdYGhpc3x9iZOVoKyu + ssDCvMvOxdTXzd3g0+Tn2Ons2Ons2Ons2Ons0SgH2Ons2OnsZLnTU77ig9z/ctf/ctf/ctf/ctf/ctf/ + Xcv1SMDsLLHfD6HSD4OpIXCKOGJvUllaXmZnbnd4hI6Qmqaoqre5usjLyNja1ubp2Ons0SgH2Ons2Ons + Y7jSMa7ZleP/dtv/dtv/dtv/dtv/dtv/dtv/dtv/dtv/dtv/aNP5UsfvNbfiGKbWC4exHXSSMmZ3Rl9m + WmFibnZ4l6Olydnb2Ons0SgH2Ons2OnsYbXQMq/Znuf/e+D/e+D/e+D/e+D/e+D/e+D/e+D/e+D/e+D/ + e+D/e+D/e+D/e+D/e+D/Xc7yP73mIKvZCI26InGLcXp7vczO2Ons0SgH2Ons2OnsMKbNM6/Zour/fuP/ + fuP/fuP/fuP/fuP/fuP/fuP/fuP/fuP/fuP/fuP/fuP/fuP/fuP/fuP/fuP/fuP/c9j/C4exYGhptcTG + 2Ons0SgH2Ons2OnsMKbNJ6rWp+3/g+n/g+n/g+n/g+n/g+n/g+n/g+n/g+n/g+n/g+n/g+n/g+n/g+n/ + g+n/g+n/g+n/g+n/ddr/G6bZWWBhrbq91ubp0SgH2Ons2OnsVbfaCp3PvPD/huz/huz/huz/huz/huz/ + huz/huz/huz/huz/huz/huz/huz/huz/huz/huz/huz/huz/d9z/G6bZT19joq+x0eHk0SgH2Ons2Ons + V7bZKKrZwfL/i/H/i/H/i/H/i/H/i/H/i/H/i/H/i/H/i/H/i/H/i/H/i/H/i/H/i/H/i/H/i/H/i/H/ + ed7/Rb/mPGd1l6OlzNzf0SgH2Ons2OnsS7TYKqvZxfT/j/X/j/X/j/X/j/X/j/X/j/X/j/X/j/X/j/X/ + j/X/j/X/j/X/j/X/j/X/j/X/j/X/j/X/fOH/SL/mNGh4ipWXyNja0SgH2Ons2OnsLKzZLKzZu/D8lPr/ + lPr/lPr/lPr/lPr/lPr/lPr/lPr/lPr/lPr/lPr/lPr/lPr/lPr/lPr/lPr/lPr/fuP/eNnyJHOMfoeJ + w9LV0SgH2Ons2OnsRLXfOLHcp9/ymP7/mP7/mP7/mP7/mP7/mP7/mP7/mP7/mP7/mP7/mP7/mP7/mP7/ + mP7/mP7/mP7/mP7/gOX/fdnyGnubc3x9v87Q0SgH2Ons1+jrXsHmXsHmq+Dynv//nv//nv//nv//nv// + nv//nv//nv//nv//nv//nv//nv//nv//nv//nv//nv//nv//gub/svL/EISraHBxusjL0SgH2Ons1OXn + YcHmYcHmreDyrP//rP//rP//rP//rP//rP//rP//rP//rP//rP//rP//rP//rP//rP//rP//rP//rP// + ieb/uPL/FpS9XmVmtcPF0SgH2OnsttjgZcPmaMfpdsnm4fr/0fz/y/3/xf7/vP//uv//uv//uv//uv// + uv//uv//uv//uv//uv//uv//uv//uv//kOb/vfL/N7PZWF5fqri60SgH2OnsnM7daMTmj+f8NLnfJ6rW + PLHZeMnmldXss+Ly6/r/4Pz/x///xf//xf//xf//xf//xf//xf//xf//xf//xf//leb/w/L/SLncSGFo + oKyu0SgH2OnsnM7doNvyofT/j/X/j/X/f+r5bd/yScjmOLzfHavWa8Ti7fz/1f//0///0///0///0/// + 0///0///0///0///neb/yvL/dszmO2ZzlaCi0SgH2Onsnc/ept3yqPr/lvz/lvz/lvz/lvz/lvz/lvz/ + lvz/MLncfMvm8/3/7P7/6/7/5v//4///4f//4f//4f//4f//o+b/z/L/idLpMGyBipSW0SgH2Onsn9Lh + qt7yrP3/mf//mf//mf//mf//mf//mf//mf//j/n8Or/fJKzWQLLZX7/ffszmrN7vvOXy+P7/+P7/9P// + wOz/3vX/u+XyLHyWjZia0SgH2Onsvd/odsnmzPv/mf//mf//mf//mf//mf//mf//nv//0vv/1/v/w/z/ + vfz/ker1fuXyTszmOr/fJ7PZGqbSQLLZcMXigMzmj9LpNpq6sb/C0SgH2Ons2OnsXrrY4/T8pP//mf// + mf//mf//mf//mf//1/z/l9bsXa7IXrnXesrmiNDpteLyxOj13Pz/1/z/xv3/tv7/VcXiOYmkU6fBoMrV + 0eLl0SgH2Ons2Onsvd/oXr7f7P3/4f3/yv7/yv7/sf//yf7/yer1TJSss8HD0+Tn2Onsvd/on9LhdcHZ + ZbrUUbXWYrvaXb7fTrjcmcLNzt7h1+jr2Ons0SgH2Ons2Ons2Onsa8DbYrzaTLfZccbigczmn9nsv+by + T7HRrMTJ0eHk2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons0SgH2Ons2Ons + 2Ons2Ons2Ons2Ons2Onsvd/on9Lhnc/exd7k1ubp2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons + 2Ons2Ons2Ons2Ons2Ons0SgH2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons + 2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons2Ons0SgH + + + + + Qk02AwAAAAAAADYAAAAoAAAAEAAAABAAAAABABgAAAAAAAAAAADEDgAAxA4AAAAAAAAAAAAA//////// + /////////////////////////////////////////////////////////v7+hbbYEG6uF3OxG3WxG3Ww + GXezGHizFHu2Dn26C326CHu4A3q6AW+vgK/O////////EoHL1Oj2////////hb/lSaLaOZ/YJZ3XHaHa + FqLaDqHZBpvZAo7QAW2u////////GorV////bLPkkcjr////////3/H6TbXkJa3iHbDjFLDjC6ziBZvZ + A3e4////////I47X////o9DuSaLejsbruN3z////xef3LLHkIrPkGbTlD7DjCaDaBny6////////LZTZ + dbjm////tNnxTaXfR6Xf////zur4ZcXqU8LqHLHkFa3iEKHaDH67////////NpjaTKPeg7/p////sNfx + SqXfi8nr+Pz+////////yuz4RLrnGaDZE4C7////////QJ3cVKfgV6nghsHp////qtTwQqPeXLTlQq7i + Vrnm////4/P7OqjdGX+5////////RqDeW6rhXarhWKjhlMjr////X6/iN5/dLZ7dJZ3dL6Pe////jMnp + Hn64////////UKXfZK/jYq3iWqnhe7nn////T6TfN5rbR6XgY7PkJZbaodLvv9/yIn23////////VKfg + bbTlabLkX6vhgb3o////W6rhO5rbns7u+Pz+PJ7cstnyt9rwJH23////////X6zie7zncbblZK7jZ6/j + 5PH6wd/zRp7dP5vcUqbfaLLk/f7/drfjJHy2////////bLTljcXqgb/ocLblaLHjkcbr+fz+3e35lsns + rtXw////sdfxNpbVH3m1////////eLrnnc3ujMXqervncbbla7Lkh8Hpw+D06/X71On3k8jsRqDeMJLT + Gnaz/////v7+stfxd7nmaLHkXKrhVafgUKXfS6LeTKPeR6HeQJ3cPJvcMpbZJIrPirra////+fn5/v7+ + /////////////////////////////////////////////////v7+//// + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Settings.Designer.cs new file mode 100644 index 0000000..22c0de2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "AnimatedButtons.Properties.Settings.get_Default():AnimatedButtons.Properties.Settings")] + +namespace AnimatedButtons.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/background2.bmp b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/background2.bmp new file mode 100644 index 0000000..7ede05c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/background2.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonC_1.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonC_1.jpg new file mode 100644 index 0000000..609c836 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonC_1.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonC_2.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonC_2.jpg new file mode 100644 index 0000000..54721b8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonC_2.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonC_3.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonC_3.jpg new file mode 100644 index 0000000..ed5f483 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonC_3.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDSE_1.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDSE_1.jpg new file mode 100644 index 0000000..a39f151 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDSE_1.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDSE_2.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDSE_2.jpg new file mode 100644 index 0000000..92516fb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDSE_2.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDSE_3.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDSE_3.jpg new file mode 100644 index 0000000..6b80783 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDSE_3.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDS_1.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDS_1.jpg new file mode 100644 index 0000000..d2359f2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDS_1.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDS_2.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDS_2.jpg new file mode 100644 index 0000000..efcd76d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDS_2.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDS_3.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDS_3.jpg new file mode 100644 index 0000000..1b7450f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Resources/buttonDS_3.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButton.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButton.cs new file mode 100644 index 0000000..d47fb8f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButton.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.Drawing.Design; +using System.Windows.Forms; +using System.ComponentModel; + +namespace AnimatedButtons +{ + public class RolloverButton : AnimatedButtonBase + { + private Image normalImage; + private Image mouseOverImage; + private Image pushedImage; + private Image disabledImage; + + + public Image NormalImage + { + get + { + return normalImage; + } + set + { + normalImage = value; + if (normalImage != null && DesignMode) + { + Size = new Size(normalImage.Size.Width + 10, normalImage.Size.Height + 2); + BackColor = Color.Transparent; + } + Invalidate(); + } + } + + public Image MouseOverImage + { + get + { + return mouseOverImage; + } + set + { + mouseOverImage = value; + Invalidate(); + } + } + + public Image PushedImage + { + get + { + return pushedImage; + } + set + { + pushedImage = value; + Invalidate(); + } + } + + public Image DisabledImage + { + get + { + return disabledImage; + } + set + { + disabledImage = value; + Invalidate(); + } + } + protected override void PaintNormal(Graphics g) + { + if (normalImage != null) + g.DrawImageUnscaled(normalImage, new Point(0,0)); + } + + protected override void PaintMouseOver(Graphics g) + { + if (mouseOverImage != null) + { + g.DrawImageUnscaled(mouseOverImage, new Point(0, 0)); + } + else if (normalImage != null) + { + // If there is no mouse-over image, fall back on the + // normal image (if it exists). + g.DrawImageUnscaled(normalImage, new Point(0, 0)); + } + } + + protected override void PaintPushed(Graphics g) + { + // Try pushed, mouse over, and normal images, in + // that order of preference. + if (pushedImage != null) + { + g.DrawImageUnscaled(pushedImage, new Point(0, 0)); + } + else if (mouseOverImage != null) + { + g.DrawImageUnscaled(mouseOverImage, new Point(0, 0)); + } + else if (normalImage != null) + { + g.DrawImageUnscaled(normalImage, new Point(0, 0)); + } + } + + protected override void PaintDisabled(Graphics g) + { + if (disabledImage != null) + { + g.DrawImageUnscaled(disabledImage, new Point(0, 0)); + } + else + { + if (normalImage != null) + { + // Fake a disabled image. + // Serveral techniques are possible, but this is the easiest. + ControlPaint.DrawImageDisabled(g, normalImage, 0, 0, BackColor); + } + } + } + + protected override bool HitTest(int X, int Y) + { + if (normalImage == null) return false; + + return ((X < normalImage.Width + 10) && (Y < normalImage.Height + 2)); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButtonTest.Designer.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButtonTest.Designer.cs new file mode 100644 index 0000000..2574467 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButtonTest.Designer.cs @@ -0,0 +1,115 @@ +namespace AnimatedButtons +{ + partial class RolloverButtonTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.rolloverButton3 = new AnimatedButtons.RolloverButton(); + this.rolloverButton2 = new AnimatedButtons.RolloverButton(); + this.rolloverButton1 = new AnimatedButtons.RolloverButton(); + this.SuspendLayout(); + // + // rolloverButton3 + // + this.rolloverButton3.BackColor = System.Drawing.Color.Transparent; + this.rolloverButton3.CacheImages = true; + this.rolloverButton3.DialogResult = System.Windows.Forms.DialogResult.None; + this.rolloverButton3.DisabledImage = null; + this.rolloverButton3.Location = new System.Drawing.Point(197, 209); + this.rolloverButton3.MouseOverImage = global::AnimatedButtons.Properties.Resources.buttonDSE_2; + this.rolloverButton3.Name = "rolloverButton3"; + this.rolloverButton3.NormalImage = global::AnimatedButtons.Properties.Resources.buttonDSE_1; + this.rolloverButton3.PaintFocusCue = true; + this.rolloverButton3.PushedImage = null; + this.rolloverButton3.Size = new System.Drawing.Size(196, 39); + this.rolloverButton3.TabIndex = 2; + this.rolloverButton3.Text = "rolloverButton3"; + // + // rolloverButton2 + // + this.rolloverButton2.BackColor = System.Drawing.Color.Transparent; + this.rolloverButton2.CacheImages = true; + this.rolloverButton2.DialogResult = System.Windows.Forms.DialogResult.None; + this.rolloverButton2.DisabledImage = null; + this.rolloverButton2.Location = new System.Drawing.Point(135, 132); + this.rolloverButton2.MouseOverImage = global::AnimatedButtons.Properties.Resources.buttonDS_2; + this.rolloverButton2.Name = "rolloverButton2"; + this.rolloverButton2.NormalImage = global::AnimatedButtons.Properties.Resources.buttonDS_1; + this.rolloverButton2.PaintFocusCue = true; + this.rolloverButton2.PushedImage = global::AnimatedButtons.Properties.Resources.buttonDS_3; + this.rolloverButton2.Size = new System.Drawing.Size(196, 39); + this.rolloverButton2.TabIndex = 1; + this.rolloverButton2.Text = "rolloverButton2"; + // + // rolloverButton1 + // + this.rolloverButton1.BackColor = System.Drawing.Color.Transparent; + this.rolloverButton1.CacheImages = false; + this.rolloverButton1.DialogResult = System.Windows.Forms.DialogResult.None; + this.rolloverButton1.DisabledImage = null; + this.rolloverButton1.Location = new System.Drawing.Point(261, 284); + this.rolloverButton1.MouseOverImage = global::AnimatedButtons.Properties.Resources.buttonC_2; + this.rolloverButton1.Name = "rolloverButton1"; + this.rolloverButton1.NormalImage = global::AnimatedButtons.Properties.Resources.buttonC_1; + this.rolloverButton1.PaintFocusCue = true; + this.rolloverButton1.PushedImage = global::AnimatedButtons.Properties.Resources.buttonC_3; + this.rolloverButton1.Size = new System.Drawing.Size(197, 40); + this.rolloverButton1.TabIndex = 0; + this.rolloverButton1.Text = "rolloverButton1"; + this.rolloverButton1.Click += new System.EventHandler(this.rolloverButton1_Click); + // + // RolloverButtonTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.BackgroundImage = global::AnimatedButtons.Properties.Resources.background2; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.ClientSize = new System.Drawing.Size(596, 480); + this.Controls.Add(this.rolloverButton3); + this.Controls.Add(this.rolloverButton2); + this.Controls.Add(this.rolloverButton1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "RolloverButtonTest"; + this.Text = "RolloverTest"; + this.TransparencyKey = System.Drawing.Color.Yellow; + this.ResumeLayout(false); + + } + + #endregion + + private RolloverButton rolloverButton2; + private RolloverButton rolloverButton1; + private RolloverButton rolloverButton3; + + + + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButtonTest.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButtonTest.cs new file mode 100644 index 0000000..9397b6e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButtonTest.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace AnimatedButtons +{ + public partial class RolloverButtonTest : Form + { + public RolloverButtonTest() + { + InitializeComponent(); + } + + protected override void WndProc(ref Message m) + { + // Allow the base class to handle all messages first. + base.WndProc(ref m); + + // Look for the WM_NCHITTEST message. + int WM_NCHITTEST = 0x84; + if (m.Msg == WM_NCHITTEST) + { + // Treat this click as a click on the caption. + int HTCLIENT = 1; + int HTCAPTION = 2; + if (m.Result.ToInt32() == HTCLIENT) + m.Result = (IntPtr)HTCAPTION; + } + } + + private void rolloverButton1_Click(object sender, EventArgs e) + { + Close(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButtonTest.resx b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButtonTest.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/RolloverButtonTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/SimpleGlowButton.cs b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/SimpleGlowButton.cs new file mode 100644 index 0000000..14b63f0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/SimpleGlowButton.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.Drawing.Drawing2D; + +namespace AnimatedButtons +{ + public class SimpleGlowButton : AnimatedButtonBase + { + // Drawing objects. + private Pen penOutline; + private StringFormat textFormat; + + public SimpleGlowButton() + { + // In a more sophisticated details, these hard-coded + // details would be mapped to properties. + penOutline = new Pen(Color.Black, 2); + penOutline.Alignment = PenAlignment.Inset; + + textFormat = new StringFormat(); + textFormat.Alignment = StringAlignment.Center; + textFormat.LineAlignment = StringAlignment.Center; + } + protected override void PaintNormal(Graphics g) + { + g.FillRectangle(Brushes.LightGray, ClientRectangle); + g.DrawRectangle(penOutline, ClientRectangle); + g.DrawString(Text, Font, Brushes.Black, ClientRectangle, textFormat); + } + + protected override void PaintMouseOver(Graphics g) + { + g.FillRectangle(Brushes.LimeGreen, ClientRectangle); + g.DrawRectangle(penOutline, ClientRectangle); + g.DrawString(Text, Font, Brushes.White, ClientRectangle, textFormat); + } + + protected override void PaintPushed(Graphics g) + { + g.FillRectangle(Brushes.Lime, ClientRectangle); + g.DrawRectangle(penOutline, ClientRectangle); + g.DrawString(Text, Font, Brushes.White, ClientRectangle, textFormat); + } + + protected override void PaintDisabled(Graphics g) + { + g.FillRectangle(Brushes.LightSlateGray, ClientRectangle); + g.DrawRectangle(penOutline, ClientRectangle); + g.DrawString(Text, Font, Brushes.White, ClientRectangle, textFormat); + } + + //protected override void Dispose(bool disposing) + //{ + // if (disposing) + // { + // if (penOutline != null) penOutline.Dispose(); + // } + // base.Dispose(); + //} + } +} diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/background.bmp b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/background.bmp new file mode 100644 index 0000000..952f6a1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/background.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/background2.bmp b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/background2.bmp new file mode 100644 index 0000000..7ede05c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/background2.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonC_1.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonC_1.jpg new file mode 100644 index 0000000..609c836 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonC_1.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonC_2.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonC_2.jpg new file mode 100644 index 0000000..54721b8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonC_2.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonC_3.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonC_3.jpg new file mode 100644 index 0000000..ed5f483 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonC_3.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDSE_1.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDSE_1.jpg new file mode 100644 index 0000000..a39f151 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDSE_1.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDSE_2.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDSE_2.jpg new file mode 100644 index 0000000..92516fb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDSE_2.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDSE_3.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDSE_3.jpg new file mode 100644 index 0000000..6b80783 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDSE_3.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDS_3.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDS_3.jpg new file mode 100644 index 0000000..1b7450f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonDS_3.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonD_1.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonD_1.jpg new file mode 100644 index 0000000..d2359f2 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonD_1.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonD_2.jpg b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonD_2.jpg new file mode 100644 index 0000000..efcd76d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/buttonD_2.jpg differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/index.htm b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/index.htm new file mode 100644 index 0000000..14f298a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/Source/index.htm @@ -0,0 +1,43 @@ + + + + +New Page 1 + + + + + +

+Do Something

+

+Do Something Else

+

+Close

+ + + + diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/bin/Debug/AnimatedButtons.exe b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/bin/Debug/AnimatedButtons.exe new file mode 100644 index 0000000..0fc0346 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/bin/Debug/AnimatedButtons.exe differ diff --git a/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/bin/Release/AnimatedButtons.exe b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/bin/Release/AnimatedButtons.exe new file mode 100644 index 0000000..2197537 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/AnimatedButtons/bin/Release/AnimatedButtons.exe differ diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/CompoundShapedForm.Designer.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/CompoundShapedForm.Designer.cs new file mode 100644 index 0000000..53693d0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/CompoundShapedForm.Designer.cs @@ -0,0 +1,91 @@ +namespace ShapedForms +{ + partial class CompoundShapedForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(38, 42); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "Close Form"; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // label1 + // + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(227, 235); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(123, 37); + this.label1.TabIndex = 1; + this.label1.Text = "Some more sample content."; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.Location = new System.Drawing.Point(211, 114); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(109, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Some sample content."; + // + // CompoundShapedForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(383, 324); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "CompoundShapedForm"; + this.Text = "CompoundShapedForm"; + this.Load += new System.EventHandler(this.CompoundShapedForm_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.CompoundShapedForm_Paint); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/CompoundShapedForm.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/CompoundShapedForm.cs new file mode 100644 index 0000000..e47d171 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/CompoundShapedForm.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace ShapedForms +{ + public partial class CompoundShapedForm : Form + { + public CompoundShapedForm() + { + InitializeComponent(); + } + + private GraphicsPath path = new GraphicsPath(); + + private void CompoundShapedForm_Load(object sender, EventArgs e) + { + + path.AddEllipse(0, 0, this.Width / 2, this.Height / 2); + path.AddRectangle(new Rectangle(this.Width / 2, this.Height / 4, + this.Width / 2, this.Height / 4)); + path.AddEllipse(this.Width / 2, this.Height / 2, this.Width / 2, + this.Height / 2); + this.Region = new Region(path); + + } + + private void CompoundShapedForm_Paint(object sender, PaintEventArgs e) + { + e.Graphics.SmoothingMode = SmoothingMode.HighQuality; + e.Graphics.FillPath(Brushes.LightBlue, path); + Pen pen = new Pen(Color.SlateBlue, 8); + e.Graphics.DrawPath(pen, path); + pen.Dispose(); + } + + private void button1_Click(object sender, EventArgs e) + { + Close(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/CompoundShapedForm.resx b/Pro Windows Forms 2.0/Chapter23/ShapedForms/CompoundShapedForm.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/CompoundShapedForm.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/FormWithHoles.Designer.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/FormWithHoles.Designer.cs new file mode 100644 index 0000000..adef153 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/FormWithHoles.Designer.cs @@ -0,0 +1,108 @@ +namespace ShapedForms +{ + partial class FormWithHoles + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox3 = new System.Windows.Forms.PictureBox(); + this.pictureBox4 = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(255))))); + this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pictureBox1.Location = new System.Drawing.Point(25, 25); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(100, 50); + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // pictureBox2 + // + this.pictureBox2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(255))))); + this.pictureBox2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pictureBox2.Location = new System.Drawing.Point(154, 25); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(100, 50); + this.pictureBox2.TabIndex = 1; + this.pictureBox2.TabStop = false; + // + // pictureBox3 + // + this.pictureBox3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(255))))); + this.pictureBox3.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pictureBox3.Location = new System.Drawing.Point(25, 99); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.Size = new System.Drawing.Size(100, 50); + this.pictureBox3.TabIndex = 2; + this.pictureBox3.TabStop = false; + // + // pictureBox4 + // + this.pictureBox4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(255))))); + this.pictureBox4.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.pictureBox4.Location = new System.Drawing.Point(154, 99); + this.pictureBox4.Name = "pictureBox4"; + this.pictureBox4.Size = new System.Drawing.Size(100, 50); + this.pictureBox4.TabIndex = 3; + this.pictureBox4.TabStop = false; + // + // FormWithHoles + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.pictureBox4); + this.Controls.Add(this.pictureBox3); + this.Controls.Add(this.pictureBox2); + this.Controls.Add(this.pictureBox1); + this.Name = "FormWithHoles"; + this.Text = "FormWithHoles"; + this.TransparencyKey = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(255))))); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.PictureBox pictureBox3; + private System.Windows.Forms.PictureBox pictureBox4; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/FormWithHoles.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/FormWithHoles.cs new file mode 100644 index 0000000..7210e3e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/FormWithHoles.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ShapedForms +{ + public partial class FormWithHoles : Form + { + public FormWithHoles() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/FormWithHoles.resx b/Pro Windows Forms 2.0/Chapter23/ShapedForms/FormWithHoles.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/FormWithHoles.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/Menu.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Menu.cs new file mode 100644 index 0000000..f1ddb97 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Menu.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace ShapedForms +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("ShapedForms." + ctrl.Text); + frm.ShowDialog(); + } + + private void Menu_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Menu.designer.cs new file mode 100644 index 0000000..e64f3dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Menu.designer.cs @@ -0,0 +1,99 @@ +namespace ShapedForms +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 7); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(124, 23); + this.button1.TabIndex = 0; + this.button1.Text = "SimpleShapedForm"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // button11 + // + this.button11.Location = new System.Drawing.Point(12, 33); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(124, 23); + this.button11.TabIndex = 10; + this.button11.Text = "CompoundShapedForm"; + this.button11.Click += new System.EventHandler(this.cmd_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 59); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(124, 23); + this.button2.TabIndex = 11; + this.button2.Text = "TransparencyKey"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 85); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(124, 23); + this.button3.TabIndex = 12; + this.button3.Text = "FormWithHoles"; + this.button3.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(158, 205); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button11); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.Load += new System.EventHandler(this.Menu_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/Menu.resx b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Menu.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Menu.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/Program.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Program.cs new file mode 100644 index 0000000..3148e4f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ShapedForms +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5bf6e25 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ShapedForms")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ShapedForms")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("00bf2d5e-f8c9-4f2f-a86a-3bb3b9598f91")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d72d94f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ShapedForms.Properties.Resources.get_ResourceManager():System.Resources.ResourceM" + + "anager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ShapedForms.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="ShapedForms.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Vo" + + "id")] + +namespace ShapedForms.Properties { + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ShapedForms.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap background { + get { + return ((System.Drawing.Bitmap)(ResourceManager.GetObject("background", resourceCulture))); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Resources.resx new file mode 100644 index 0000000..81ee2c0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Resources.resx @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\background.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Settings.Designer.cs new file mode 100644 index 0000000..34f918d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "ShapedForms.Properties.Settings.get_Default():ShapedForms.Properties.Settings")] + +namespace ShapedForms.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/Resources/background.bmp b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Resources/background.bmp new file mode 100644 index 0000000..952f6a1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/ShapedForms/Resources/background.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.csproj b/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.csproj new file mode 100644 index 0000000..ad7fafd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.csproj @@ -0,0 +1,110 @@ + + + Debug + AnyCPU + 8.0.50215 + 2.0 + {EF71563A-2761-4029-8617-A329F29838E9} + WinExe + Properties + ShapedForms + ShapedForms + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + CompoundShapedForm.cs + + + Form + + + FormWithHoles.cs + + + Form + + + Menu.cs + + + + + CompoundShapedForm.cs + + + FormWithHoles.cs + + + Menu.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + SimpleShapedForm.cs + + + TransparencyKey.cs + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Form + + + SimpleShapedForm.cs + + + Form + + + TransparencyKey.cs + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.csproj.user b/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.sln b/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.sln new file mode 100644 index 0000000..68ea4d1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShapedForms", "ShapedForms.csproj", "{EF71563A-2761-4029-8617-A329F29838E9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EF71563A-2761-4029-8617-A329F29838E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EF71563A-2761-4029-8617-A329F29838E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF71563A-2761-4029-8617-A329F29838E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EF71563A-2761-4029-8617-A329F29838E9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.suo b/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.suo new file mode 100644 index 0000000..e50b72a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/ShapedForms/ShapedForms.suo differ diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/SimpleShapedForm.Designer.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/SimpleShapedForm.Designer.cs new file mode 100644 index 0000000..b731ad6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/SimpleShapedForm.Designer.cs @@ -0,0 +1,60 @@ +namespace ShapedForms +{ + partial class SimpleShapedForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(24, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // SimpleShapedForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.button1); + this.Name = "SimpleShapedForm"; + this.Text = "SimpleShapedForm"; + this.Load += new System.EventHandler(this.SimpleShapedForm_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/SimpleShapedForm.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/SimpleShapedForm.cs new file mode 100644 index 0000000..5c80041 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/SimpleShapedForm.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace ShapedForms +{ + public partial class SimpleShapedForm : Form + { + public SimpleShapedForm() + { + InitializeComponent(); + } + + private void SimpleShapedForm_Load(object sender, EventArgs e) + { + GraphicsPath path = new GraphicsPath(); + path.AddEllipse(0, 0, this.Width, this.Height); + this.Region = new Region(path); + + } + + private void button1_Click(object sender, EventArgs e) + { + Close(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/SimpleShapedForm.resx b/Pro Windows Forms 2.0/Chapter23/ShapedForms/SimpleShapedForm.resx new file mode 100644 index 0000000..02bbfa2 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/SimpleShapedForm.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/TransparencyKey.Designer.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/TransparencyKey.Designer.cs new file mode 100644 index 0000000..e9a3018 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/TransparencyKey.Designer.cs @@ -0,0 +1,79 @@ +namespace ShapedForms +{ + partial class TransparencyKey + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TransparencyKey)); + this.label1 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font("Tahoma", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(102, 45); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(204, 61); + this.label1.TabIndex = 0; + this.label1.Text = "This form has a graphical background."; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(135, 171); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "Close"; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // TransparencyKey + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage"))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.ClientSize = new System.Drawing.Size(409, 390); + this.Controls.Add(this.button1); + this.Controls.Add(this.label1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "TransparencyKey"; + this.Text = "TransparencyKey"; + this.TransparencyKey = System.Drawing.Color.FromArgb(((int)(((byte)(125)))), ((int)(((byte)(89)))), ((int)(((byte)(26))))); + this.Load += new System.EventHandler(this.TransparencyKey_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button button1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/TransparencyKey.cs b/Pro Windows Forms 2.0/Chapter23/ShapedForms/TransparencyKey.cs new file mode 100644 index 0000000..63b29b8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/TransparencyKey.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ShapedForms +{ + public partial class TransparencyKey : Form + { + public TransparencyKey() + { + InitializeComponent(); + } + + private void TransparencyKey_Load(object sender, EventArgs e) + { + + } + + private void button1_Click(object sender, EventArgs e) + { + Close(); + } + + protected override void WndProc(ref Message m) + { + // Allow the base class to handle all messages first. + base.WndProc(ref m); + + // Look for the WM_NCHITTEST message. + int WM_NCHITTEST = 0x84; + if (m.Msg == WM_NCHITTEST) + { + // Treat this click as a click on the caption. + int HTCLIENT = 1; + int HTCAPTION = 2; + if (m.Result.ToInt32() == HTCLIENT) + m.Result = (IntPtr)HTCAPTION; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/TransparencyKey.resx b/Pro Windows Forms 2.0/Chapter23/ShapedForms/TransparencyKey.resx new file mode 100644 index 0000000..4d1abb3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter23/ShapedForms/TransparencyKey.resx @@ -0,0 +1,10864 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + Qk3u1AkAAAAAADYAAAAoAAAAnQEAAIYBAAABACAAAAAAAAAAAAARFwAAERcAAAAAAAAAAAAAGll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZfv8aWX3/Glp+/xtZff8aWX3/Gll+/xpZff8aWX7/Gll9/xxb + f/8cW3//HFp+/x1bgP8cW3//HFp+/xtafv8gXYD/HFt//xlGYP8YR2D/GEhi/xdFX/8YR2H/GEdh/xdF + YP8YR2H/FkRf/xtRcf8aWX3/HVqA/xxafv8cWn//G1t9/x1afv8bWn7/HVp//xtZff8aWX3/Gll9/xpZ + fv8aWX7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p9/xtafv8aWX3/HFt//xxafv8cW37/FUNe/xdC + X/8WQ17/Dy0+/xAuQP8QL0H/ECs5/woZIv8KGiL/Choi/wMGCP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/woYIf8KGCL/Chgh/wweKf8RLkH/EC5A/xY/WP8XRGH/F0ln/xxafv8bWX7/G1l+/xpZ + ff8aWX3/Gll9/xpafv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p+/xtaff8bWn3/Hlt//xhQb/8YRmD/FkFZ/xEv + Qf8SMEH/DR8p/woZIv8FDBD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8IFiD/Chwp/w8tQP8TN0//FEJe/xpTdv8bWX3/Gll9/xpZ + ff8bWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1l+/xpZff8aWn7/HVt//xtaff8ZS2j/GUZh/xIw + Qf8SMUH/Chkh/wgTGf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wQLD/8IFiH/ES1B/xM9V/8YTW//Gll+/xpZfv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWn7/Gll9/xpYff8bWX7/HFt//xZF + X/8UOlD/EzJC/wsZIf8GDRH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8ECw//CBon/w4vR/8VSGb/G1h9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWXz/FEZk/xA2Tv8MKj3/BxUf/wULEP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8CBQf/Chwo/xAyR/8ZTm//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/G1p+/xpZff8dW37/F0Zg/xI0SP8NIzH/BxEY/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8GERj/DCg3/xdJ + aP8bWX7/G1p9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1p9/xpZfv8bWn7/GEZg/xM1Sf8PIzH/CRMZ/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wQMEP8OKTn/GlBv/xxafv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p+/xpZfv8bWn7/HFh4/xVAV/8TMkL/Cxsj/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CRcg/xQ4UP8ZVHb/G1l9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p9/xZK + Zv8SOU7/DSQx/wUNEf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DBgn/Dx0l/xAeJf8RHiX/Gi45/yM+TP8kP0z/JUBO/ydB + T/87Y3f/O2N3/zphdv86YXb/OWF3/zlhd/84YXj/Nl52/zNbc/8wV3P/LlVz/yxVc/8rVXP/LVV0/y5V + dP8sU3D/KU9r/yVKZ/8fQFv/FCxC/xIqQv8RKEH/DyQ5/wkWIv8LGCP/CRMb/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMF + CP8QLUD/Gk5v/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/G1t9/xxafv8ZS2j/EzVJ/wseKf8DBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DRYc/xEdJf8VJC7/IDhL/x42Sf8oTWv/I0ln/yZTd/8tY4r/MGmN/zVu + kf88c5X/P3aX/0J5l/9Depf/RnyZ/0l/mv9Mgpz/ToOd/0+En/9PhJ//ToOf/02Cnv9MgZ7/TIGf/0uA + n/9HfZz/Q3mZ/z91l/88cZj/N2+X/zVvl/80bpb/N26W/zpvlv83bJL/NGiN/zFji/8vX4r/K1uJ/yhX + h/8lVIX/JVWG/yhcif8tZI3/MmuR/zhxlf81aIX/L1tz/ylMX/8jPEz/Gyw5/xEdJv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DCIw/xhNbv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpafv8aWX3/G1Bw/xY8Uf8MHyj/AwYI/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Bw4S/xAdJf8cM0H/IDtK/y1SZv8yW3D/RXuX/0V8l/9EeZb/QnaW/z9z + lf8+cJT/OWqR/zJii/8rXYf/Kl6G/ypiif8uZ4z/Nm+S/zx0lv9AeJj/Q3qY/0V8mf9GfJj/SX+a/0yC + nP9OhJ7/T4Se/0+En/9Og57/TYKe/0yCnv9LgJ//SX6d/0Z7m/9BeJf/P3SX/zxwmP84b5j/MmyV/zFs + lP80bpX/OHGW/zpwlv84bpP/N2qR/zVmj/8zYo//MF6N/ylYiP8mVYX/J1eG/ytgiv8waI7/Nm+S/zp0 + lf8+eJf/RXmY/0t5mv9Ld5r/RHKY/zxtlP8yYoj/I0xq/xczR/8SJzX/CRQb/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wogL/8XS2v/Glh9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll+/xtVd/8TOk//DiUy/wYN + Ef8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8LGSL/ESU0/xYxRv8hSWf/JlJv/zVrjv88cpL/P3WV/0F3 + lv9DeZb/QXeV/0N4lv9Fepf/R3yZ/0Z6mf9Ddpf/QHKV/zttkv81Zo7/LV2H/yhchf8lXIT/JV6F/y5n + jf81bZL/O3OW/0B4mf9De5v/Rn2b/0h/m/9Jf5r/S4Gb/02Dnf9Og57/T4Sf/0+En/9Ng57/S4Gf/0qA + nv9IfZz/RXua/0F3mf8+cpn/O2+Z/zZul/8zbpX/Mm6U/zZyl/86dJj/PXaZ/z11mP88cpb/O2+V/zlr + lP80YpD/LVuK/yhWhf8nV4X/KluH/y9kjP81bJH/OnKU/z92lf9Hd5f/S3eY/0p0mP9DcJb/O2yT/zRo + kf8wZpD/MGmS/zRtlv82b5b/N3CV/ypUb/8cOEv/ESIu/wMGCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8KIjT/GE90/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll+/xpZ + ff8aWX3/F0ln/xAvQf8HEhj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wgVHv8NIjD/FC9C/yFJZv8nV3j/K2OH/ydf + hP8rYoj/LGKJ/yxjiP8vZov/Nm2O/zxykv9Adpb/Q3mY/0N5mP9CeJb/QneW/0R5l/9Hepn/RnmZ/0R2 + mP8+cJT/OGqQ/zJji/8sXoj/JFqD/yBYgf8lXob/LGWL/zRskf84cZX/PnaY/0J5mv9Hfp3/SYCd/0qA + nf9LgZ3/S4Cc/0yBnf9Ngp7/TYOf/06EoP9MgZ//SX+d/0Z8m/9EeZn/QHWY/zxymP85cZf/NW+W/zVx + lv85dZr/PHic/z97nf9CfJ7/Qnqc/0F4mv9Adpn/PW+W/zdokv8vXov/KFaF/ydVhP8oWIX/MWKM/zhr + kv88cZT/QXOT/0RzlP9Hc5b/RHGW/z9tlP84aZL/MWaQ/zJokv81bZf/OHGZ/zlymv85cpf/OnKW/zty + l/88c5r/OW6X/ypVd/8bOE//Cxch/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BBAf/DSxF/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpTdf8RNk7/CiAu/wIFB/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAcJ/w8aJP8ZMUb/HT5b/x5I + bf8eUHj/H1N6/yJYfv8mXYL/KmKG/ytjh/8pY4X/K2WI/y1mif8tZor/MmmN/zVtj/84cJH/PXOT/0F3 + l/9DeZj/Q3mY/0N3l/9Dd5f/RHiY/0R3mP9Ddpj/QXOW/z1ukf82Zo3/L2GK/ylehv8hWoL/IluD/yZf + h/8sZYv/MGmP/zZvk/87c5b/QHeZ/0R6m/9Ifp3/SoCf/0qAnf9KgJz/SX6a/0p/nP9LgZ3/TIKf/0yC + n/9Jf5z/Rnub/0J3mP8/dJf/O3KW/zdxlf82cZX/OXaZ/z97nv9CfaD/Rn+h/0eAof9Gf6D/RHuc/0J4 + mv9AdJj/PG2U/zNjjP8qWIb/JFCA/yhVhP8wX4r/OGmR/z5wk/9BcpP/Q3KT/0FwlP8+bpP/OmuS/zRm + kP8yZpH/NGqV/zhwm/86cpz/PHSc/zx0mf89dJf/PXSX/z5zmP88cZn/OG2W/zNnj/8sX4j/JVR8/xs7 + Vf8OHyz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/BhIe/xVHZf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8cWn7/F0pn/xAuQf8HERj/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAcJ/xEe + Jv8iPEz/L1Jp/ztmhv9AcJf/OmmS/zFfiv8pV4P/IVB7/x5Nd/8hUXr/JVh+/yhfg/8qY4f/LWeJ/y5o + if8xa4z/NG6P/zZvkP84cZL/PHSU/z11lf9Ad5b/QnmX/0R6mP9EeZn/Q3iY/0R3mf9Dd5j/QnWX/0Fz + lv89b5P/OGqP/zJkiv8uYYn/KF6G/yRdhf8oYon/LGWM/y1njP8vaI7/MmuR/zhwlP88c5b/QXeY/0R6 + m/9Ifp3/SX+e/0h+nP9Ifpv/SH2a/0h+nP9Jf53/SH6c/0h+nP9DeZr/P3WY/z1zl/86c5X/OHSV/zp2 + l/8+ep3/Q36g/0iAov9LgaP/S4Gi/0mAof9Gfp//Q3qb/0F1mf89cJT/NWWN/yxahf8nU4D/J1KB/y1a + h/81ZYz/PG6Q/0B0k/8/cpP/PXCS/zptkv80aJD/M2aR/zNok/82bJf/OG+a/zx0nP89dZz/PnWa/z51 + mP8+dJb/PXOW/zxylv86b5X/NGeP/y5hif8qXYf/Kl6K/y9jjv8wYYj/IkRc/xIjLv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w0q + Pv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxa + f/8YRmD/Dyo5/wYMEP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wwWHP8ZLTn/Kkxf/zZjfP9Eepn/RHqZ/0R5mf9Dd5v/Q3Oa/0BvmP85aJH/MF6K/yZV + gf8fTXn/IE14/yRSe/8rWoH/LGGG/y9ni/8xa47/NG6P/zdykf87dZT/PniW/0B5l/9BeZf/QnqX/0N6 + mP9Eepj/RnuZ/0Z7mf9Gepr/RHeZ/0F0mP9Acpb/Pm+U/zprkP81Zoz/MGOJ/ythiP8qYor/LGSL/y9o + jv8ya5H/NG2R/zNskP8zbJH/Nm2S/zpxlf89c5b/QHaY/0J4mf9Fe5v/R32c/0d9nP9GfJz/Rnub/0Z7 + mv9Eepr/QnmZ/z92mP87cpb/OnSW/zl2lf86eJb/Pnya/0J/nv9GgaH/SoOi/02Dov9NgqL/S3+g/0h+ + n/9GfJ3/Q3ib/z5xlv83Z47/LFmC/yVRfP8kUH3/KleC/zFhiP84aoz/O2+Q/ztyk/85cJL/NWuP/zJo + j/8yaJH/NGuW/zZtl/84b5n/OnKZ/zx0mv89dZn/P3WY/z50lv8+c5X/PXKU/zpuk/81aY//LWGK/yhd + iP8pXon/LmGM/zNnkP84a5L/Om+U/zRkgf8fOUn/CA4S/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcVH/8YU3X/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8bWn7/Gll9/xVAWP8NIzH/AgYI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NGyT/HDlJ/ylQZv84bo7/P3aX/0B3l/9Ad5j/Qnia/0N5 + mv9DeJv/Q3eb/0J1m/9Bc5v/PW2Y/zhnk/8vXYr/JVN//yBPe/8fTnr/JlN9/yxag/8xYor/M2mP/zRt + kf82cZP/OnWU/z14lf9CfJj/RH2Z/0R9mv9FfZr/RHyZ/0R7mP9Ge5n/SHyb/0Z6mv9Ed5j/QHKX/z5w + lf87bJP/OGmQ/zFjiv8qX4X/J16F/y1ki/8xaZD/NG2S/zdwlP86c5b/O3OV/zlxlP83b5P/OXCV/zxy + lv89c5b/PXOW/z91lv9Bd5n/RHqb/0V7nP9Fe5v/Q3mZ/0F3mP8/dpj/O3OX/zlzlv84dJX/OXiW/z58 + mv9DgZ3/R4Og/0qDof9NhKH/TYSh/02Cof9NgqL/S4Gh/0h/n/9Fe5z/QnSZ/ztqkv8wXYb/I095/yBM + d/8mVH3/LV6D/zJmiP83bI7/Nm6Q/zRukP8xa47/MmuQ/zRsk/83b5f/OHGY/zhwl/84cZb/OHCV/zpx + lv88c5b/PHKV/zxxk/88cZP/OnCS/zZqkP8uY4v/J12H/yZbhv8sX4j/M2WN/zlqkv87bpP/PHCT/z9x + k/9AcpL/KUhc/wwVG/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wIFCP8WSGb/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8dW3//FT9Y/wweKv8DBgj/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EBwl/x43Sf8tVnT/MmeL/zJq + jP81bpH/OHCU/zpxlv87cZb/PHGW/z1yl/8/dJj/QHWa/0F2mv9BdJr/QHKa/z9wmf87a5b/NWSR/y1b + if8lU4H/IE98/yBPe/8jUn3/KViC/zBhiv8yZ47/NGyS/zZxlP84c5L/PHaT/0F5lf9Gfpr/R36a/0d+ + m/9FfJn/RXuY/0Z7mf9Hepr/RXmZ/0J1l/8/cJT/PG2T/zprk/80Zo7/LGCH/yVbgf8nXoT/LmaL/zVs + kf85cZX/PXaX/z94mP8/d5j/P3eW/z10lv88c5b/PXSX/zxzl/87cpb/OnCU/zxzlv8+dZj/Qnia/0N5 + m/9BeJr/PXSY/zx0mf86c5j/OHOW/zh1l/87epj/QYCd/0aDn/9KhaH/Toah/06Fof9PhKH/ToSh/06F + ov9NhaP/SoKh/0d9nv9EeJv/P3CW/zVjjP8qVoD/I1B6/yJRe/8nWYH/LWGH/zFoi/8ya43/MGuN/zFt + j/8zb5H/N3GU/zpzl/88dZn/O3SZ/zhxlv82b5P/NW2R/zVtkv83b5P/OG+S/zhvkv84bpL/N2yR/zBl + jf8qXoj/J1qE/ypchP8xYYn/N2eO/zxskv89bpP/P2+S/0Bvk/9BcZP/QXKV/y5Sbf8OGyT/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TN0//Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p+/xxa + fv8XQVn/DyUx/wMGCP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xEd + Jf8iOkz/M1hy/0Nzlv88bpH/N2qO/zJmi/8sYof/LGOI/zBojv80bJP/NWyT/zZslP84bZT/OW6U/zpv + lf87cJb/PXKX/z1wl/88b5f/OmyW/zholP8wYI3/KliG/yNRgP8fTnz/IFB8/yJSff8kVYD/KFyF/y5i + i/8waJD/M22S/zVwkv85c5H/P3eU/0N6l/9GfZn/Rn2a/0V8mf9Fepn/RnqZ/0V4mP9CdZf/QHGV/z1t + k/86apD/NmeP/zFji/8oXoT/Jl2C/ytih/8xaY3/OHCT/z11l/9AeJr/Qnua/0N7mf9Cepr/QnmZ/0J5 + mf9Ad5n/P3aa/z10mf87cpb/OG+U/zlwlP87cpb/P3aY/zxzl/84cJb/NnCX/zdyl/83dJj/OniZ/z59 + nP9Dgp7/SYSg/06Hof9Ph6L/UIii/0+Hof9QiKP/UImk/06Ho/9LhKH/R4Ce/0V7m/9Cc5f/PGqS/zRf + iv8tWIT/JlSA/yNVf/8nXYX/LGOJ/y5pi/8wbI7/Mm6Q/zZzk/86dZb/PniZ/0B5m/8/d5r/PHOX/zZv + lP8xa5D/MGqP/zBqj/8zbJH/NW2R/zdskf82aZH/MWSP/yxeiv8pWob/KVqD/y5fhf81ZIv/OWiP/z1s + kv89bJL/PGuS/z1rkv86a5H/N2mO/zRmjP8iRF//BQwR/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8PLD//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8bWn7/HVx//xU/WP8QJjL/AwcI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8KExr/HTZJ/zBVcf9Ccpj/QnKY/0Jyl/9Acpb/PW+T/zhrj/8yZoz/LWGK/ypf + hv8qX4b/LWKL/y5ljv8vZY//MGWQ/zJnkf80aZH/NWqQ/zVqkP82a5D/OGyR/zdqkv81aJH/MmOO/yxc + if8mVYP/IE5+/x5NfP8hUn7/JFaA/yVZgv8lWoL/JV2F/ypjif8uaY3/M22Q/zlwk/8+c5T/QneW/0V7 + mP9GfJn/RXua/0R5mf9Dd5n/Q3aY/0Bxlv89bpT/OmqS/zhnjv8zZY3/LWKI/yhfhP8rYob/MGeL/zZu + kP89dZb/Qnqa/0V9nP9FfZv/Rn6b/0d/nP9Hfpv/R36c/0Z9nf9Dep3/QHab/z51mv86cpj/N2+U/zZu + kv81bZP/NGyT/zJrk/8ybZP/M3CV/zZ0mf88ep3/Qn+f/0eDof9NhqL/Toei/1CIov9RiaL/UYqk/1GM + pf9RjKb/Toij/0yFoP9Kgp7/SX6d/0d4mv9Db5b/PGaR/zRei/8rV4X/JleD/yRahP8oYYj/LWiM/zFu + j/82c5L/OXWV/z14mP9Ce5z/RHye/0R6nP9Ad5n/OXGW/zNskv8uaI//LmmQ/y9pkP8zapH/NWqS/zVo + kP8xZI7/LV6L/yhYhv8oVoT/K1mE/zJgif82ZYz/OWaO/zhljv82ZI3/NmOM/zNii/8xYor/L2CI/yxe + h/8pW4X/FC1C/wIFCP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8LIC//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWX7/G01p/w8qOf8FDRH/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AgYI/xAlM/8cPVb/LF2C/zJljv83aZL/PG2V/0Bw + l/9BcZj/P3CW/zxulP86bZH/NWmO/zBkjP8sYIn/KFuG/ydbhf8pXoj/KmCL/ypfjP8tYo3/L2OO/zFl + jf8yZoz/MWaL/zJni/8yZov/M2aO/zJkjv8uYIr/KFmG/yJSgP8dTHv/IVB9/yVXgf8oXYX/KV+H/ydf + hv8lX4X/I16C/yhkhv8waIz/OGyS/z5wlf9AdJb/Q3eX/0V5mf9FeJj/Q3eZ/0N2mf9Bc5j/Pm+W/zpr + k/84Z4//M2WN/zBli/8rY4j/LmaK/zFojP81bI7/O3KT/0B4mP9Gfp3/SYGf/0mBnv9Kgp7/S4Ke/0yD + nv9Mgp//S4Gf/0qAoP9HfZ//QXid/z10mv85cZf/NG2S/zBpj/8vZ47/LWmQ/y5skf8wbpT/NXOY/zx6 + nv9FgKL/SoSj/02Go/9Ph6L/UIih/1CKov9RjKT/Uo+m/1GNpv9OiqP/TIeg/02Dnv9NgJ3/THuc/0dy + mP9BapX/N2GP/y5Zif8nV4b/JVmG/yhgiv8uaI//NXCU/zp2lv88eJb/QHqY/0V9nP9Ifp7/Sn+g/0R6 + nP89c5f/Nm6T/zJrkv8vapL/L2mR/zNqkf81apH/NWiQ/zJkjf8uXor/KFaE/yRQgf8mUoL/K1iF/zJe + if8zX4r/M16K/zFdif8uXIb/LFyF/ytdhv8rXYX/Kl6F/ytdhv8qXIf/JVB3/woXIv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8LIC//Glh9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpa + fv8XTm3/EzZK/wUNEP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8JExr/FzNH/yVU + c/8uZo3/LWSM/y1ji/8uYor/MWOM/zRmkP84aZL/OmuU/ztslf85bJX/N2qS/zRqkP8yaI7/LmSM/ypg + iP8nW4X/JlmD/yldh/8qX4n/K2CM/ythjf8uY43/MGWM/zBli/8wZYj/L2aI/zBmif8xZYv/MWSM/y1f + if8oWIT/IlF//yFRfv8lV4H/K1+F/y1jif8uZ4z/LmiM/ytliP8nYoT/JF2A/ytfhv8zZI3/OWmR/zxu + lP8+cpb/QXWX/0J1l/9CdJj/QXOY/z9wl/89bZb/OGmS/zNljv8vZIr/KmKI/y9njP81bJD/OHCS/ztz + lP8/d5b/Q3ua/0h/nf9Lgp//TISg/02En/9NhKD/T4Wh/1CHov9PhaL/TYOi/0uBov9GfJ//QXec/ztz + mf83cJb/MmyR/y1ojf8raY//K2uQ/y9uk/81c5j/PHic/0R+of9MhKT/T4ak/1CHov9Ph6L/T4mh/0+M + o/9QjaT/UIyj/0+Lov9PiKD/UISe/1CCnf9OfJz/S3ab/0Rvl/87ZpL/MV6M/ydXhv8kWIb/KV+L/zJq + k/86dZn/PHia/0B7mf9CfJn/R36c/0uAnv9Lf5//SHye/0J2mv87cZj/N26W/zRslf80a5T/NWqT/zVp + kf80aJD/MWSM/y1eiP8pVoP/I09//yBKfv8kToH/KVOD/yxWhf8uV4b/LViG/ytXg/8oWYL/KVuD/ype + hf8sYYf/L2KJ/y9hiv8vYoz/L2SN/xo4T/8CBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8QMEf/G1l9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xxbfv8SOU//DB4p/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/w8gLP8eQVn/LWKF/zFqkP8xapD/MWmQ/zFpkP8xZ4//MGWM/y1hiv8vYIr/MGGL/zNk + jv81ZpD/NWeR/zNmkP8zaJD/MWiO/y5njf8uZoz/LWOK/ypfhv8rYIf/LWGK/y9kjP8wZY7/MGaP/zBn + j/8zaY//M2mM/zJpi/8yaYr/MmmK/zNpjP8zZ43/L2KL/ylZhv8lVoH/JVaB/ypehP8vZor/MWqO/zNu + kf80cJL/NHCQ/y9ri/8sYob/KVuC/ytag/8uX4j/MmWO/zZpkv85bZT/PHCV/z5wlf8/cJb/PW6V/zpq + lP82ZpH/MGSM/ypiiP8rZIn/MmuP/zhwlP89dZf/QHiY/0R8mv9Gfpv/SYCd/02En/9OhZ//TYWf/06F + n/9Rh6L/UYei/1GHo/9QhaT/ToOi/0l/n/9Fep7/Pneb/zp1mf82cpb/M3CV/y5tkf8tbZD/L26S/zZy + lv88d5r/RHyf/0mAof9NhKL/Toaj/02Hov9NiKL/TYqi/06Kov9OiqH/T4mg/1GIoP9ShZ7/UoGe/1B9 + nf9NeJ3/RnOZ/zxqlP8xYY7/J1qI/ydaiP8rYYz/NGyV/zp0mP9Aepv/Qnya/0V+m/9If5z/Sn+d/0l9 + nv9Iep3/RHec/0B0mv87cJj/OG2X/zdslf83apP/NGiQ/zNmjv8xY4v/LV2G/yhVgf8iTXv/Hkd5/x5H + ev8iS33/JU5//yhSgv8rVIT/KlaD/ypahP8qXYT/LGKF/zBmif8zZ4z/M2eN/zNnjv8zZ5D/MmeQ/ydT + dP8IEhn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8SNk//G1h+/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Glp+/xdLaP8OKTj/AwYI/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8EBwn/Gi05/yxQaP83bZH/MWeM/y1liv8vaIz/MmqP/zNs + kf81bJH/NWuR/zVqkf8zZ4//MGKM/yxeiP8rXYj/LF2I/y5gi/8uYYv/LmOM/y5ljf8taI3/L2qO/zBp + jf8wZ4z/MGaM/zFnjf80ao7/NmuQ/zdtk/83bJT/OG6U/zlwlP85cZL/N3CO/zhvjv83bY//OG6Q/zZs + kf8yZo//LWGK/ylchP8pXYP/LGKG/zBqjP80cZL/OXWW/zt2l/88eJb/PHOU/zZqjv8wYIj/KFmB/yRW + f/8pXIb/LWCN/y9kkP8yZ5D/NmqR/zlqkf86apH/NmaQ/zJljv8rYor/KGOI/y5pjf81b5H/PHSX/0F5 + mf9EfJr/Rn6b/0mAm/9Lgp7/ToSg/0+Fn/9QhqD/UIag/0+Fn/9RhqH/Uoej/1CFo/9OgqL/S3+f/0V8 + nv8/epz/O3ib/zx5nP85eJr/NnaY/zNzlP8ycZL/N3KV/z11mP9CeZv/Rnyd/0l/n/9Kg6D/SoWh/0qH + ov9LiKH/S4ig/0yGn/9Ph5//Uoae/1OFn/9Tgp//UX6f/0x6nv9GdZv/PW2W/zBijf8oXIn/J1yK/y1j + j/80a5T/OnKX/0B4mv9EfJz/R32c/0l/nP9IfZz/SXyd/0d5nf9Ed5z/QXSa/z1wmv86bJj/OGmV/zVo + kf8zZo//MWWM/y9hiP8tXYT/KFV//yBLeP8bRXX/GkN0/xtEdv8fSXr/I098/yZUf/8rWYP/LF2G/y1h + hv8wZ4n/M2uL/zVsjf80a47/NGqP/zRpkf80aZL/MmeR/yxehf8NHiv/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8VQV//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX7/GVR3/xM7UP8GEhj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wgPEv8fNkP/MFVq/0Z7 + m/9EeZn/QXWX/zlukv8yZov/LWSJ/y9niv8za4//Nm2R/zluk/86b5T/OGyT/zdpkv8zZI7/LV6J/ydZ + hf8nWYT/J1qF/yhdh/8pYIn/K2WL/y1ojf8ybZD/NG6R/zVukf82bZH/OG+S/zpwk/87cpT/PXSW/z90 + l/8/dZf/QXiZ/0B6mf9Bepf/P3eV/z92lv88c5X/OnCU/zdsk/8xZY3/LGCG/ythhf8tZoj/MWyN/zZz + kv89eZn/Qn6c/0N8m/9Cd5j/P3GV/zZojv8sXob/JlmC/yFVgf8mW4f/KF6L/ylhi/8sYor/MmSL/zNj + i/8xZIz/LGKL/ydhiP8rZov/MGuP/zdylP8/eZn/RX2c/0iAnf9IgJz/SYCb/0uCnP9OhJ//UYeh/1KI + ov9Rh6H/UYah/1GGof9Sh6P/Uoaj/0+Dof9KgaD/Q3+f/z59nv8/fZ7/QH6f/z9/n/89fZ7/PHub/zp3 + mP86dJX/PnWX/0B2mP9DeZr/RHyb/0V/nf9EgZ7/SIWh/0qHov9Lh6D/TYag/06Enf9ShZ//VIWg/1OD + of9RgKH/THyg/0R3nP86bZb/MWWQ/ylei/8oX4z/LGOP/zJpkv86cpb/P3aY/0N5mv9IfZz/SH2c/0h7 + nP9Hepz/R3mc/0R2nP9Acpv/PG2a/zhpl/82ZpP/MWSP/zBjjP8uYYr/LmCG/yxdhP8oV4D/I056/xtF + dP8XQXD/Fj9w/xtGdP8gTnn/JlV+/ytcg/8uYYf/MWaJ/zNqi/81bY3/NW6N/zVtjf80a4//NWuR/zZr + k/81apP/MmeR/yxijP8PIzP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEF + B/8ZUXX/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWX7/Fklm/wwjMP8CBgj/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/CA8S/x01Qv83Y3v/RHqY/0R6mf9Fe5v/RXuc/0N4mv9AdJf/OW2S/zFmjP8vZYv/MGeM/zRr + j/83bpH/Om+U/zxwlf89b5f/OWuU/zRlj/8tXon/J1mF/yNWgv8iV4L/JVqF/yhgiP8sZ4v/MW2Q/zZx + k/84c5X/OnSV/zt0lf89dZX/P3eX/0F5mf9CeZr/Q3ma/0V7m/9HfZ3/R4Cd/0eAnf9HgJ3/RHyb/0F4 + mf8+dJf/OW6U/zNojv8tYof/LWWH/y9piv80cI//OXaV/0B8mv9Ff57/SoCg/0h8nf9CdZj/O26T/zRm + jv8rYIr/J1yI/yNbhv8kXoj/Jl+J/ylgiP8rXob/LGCH/yphh/8mYIf/KGOK/yxnjf8xbJD/OHOV/0B6 + mv9Gf57/SYKe/0qCnf9Lgpz/S4Kc/06Env9QhqD/U4mj/1SJo/9UiKL/U4ej/1SHpP9ThqT/T4Oi/0iC + ov9EgqL/QoGh/0WBof9FgqL/RYOi/0SDof9DgaH/Q3+e/0J6m/8/dpf/P3WW/z92l/8+eJj/PnqZ/0J+ + nf9Fgp//SIWh/02Ho/9OhqL/UIWg/1KFn/9ShaD/UoOh/06BoP9JfZ//QXaa/zhulv8yaJL/LWSQ/ypi + jv8tZI//MmmS/zlwlv8+dZj/Qnma/0R6m/9Fepv/Rnmc/0Z4m/9Edpv/QnSb/z1vm/85apn/NWeV/zFi + kP8vYYz/LWCK/yxeh/8tYIb/LF6F/ytbgv8nVX//IU16/xlEcv8XQnH/GUVz/x5Md/8mWH7/LGCE/zFn + if80a4v/NGuM/zZtjv82bY7/NW2N/zRsjv82bJD/N22T/zhtlv80aJP/LWON/yheiP8PIzL/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wUPGP8bV37/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZff8dW3//ETdP/wkY + If8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8EBwn/GzRD/zNifP9BeZn/Q3qZ/0J6mv9BeJr/QXiZ/0F4 + m/9CeJr/Qnea/z5zmP84bJP/MmeP/y5jjP8vZI3/NGmQ/zhtkv87b5P/PG+U/zxulv87bJX/M2WP/ytd + iP8mWYT/IFSA/yJXgv8lXIX/KWKJ/y5pjv81cJP/OnWX/zt2l/88d5f/P3iY/0F6mP9DfJn/RX2b/0d+ + nP9Hfp3/SoCe/0uCoP9Lg6H/S4Og/0qCn/9JgJ7/RHua/0B1mP87cJX/NWmQ/zBojf8vaov/MG2M/zdz + kv8+eZj/Q32c/0eAn/9KgKD/Sn6f/0R3m/89cpf/N22V/zNqk/8uZ4//KmWM/yhjiv8pYor/LGKK/yxh + h/8oX4X/JGCD/yVhhv8pZYr/LGiO/zJukv85dJX/QHua/0V/nP9Jgp7/S4Of/0yDnf9NhJ7/T4We/1GH + of9TiaP/VImk/1aJpP9ViKT/VYik/1OGpf9Mg6L/R4Gh/0WDo/9HhKX/SYWl/0uFo/9LhqP/S4ai/0uF + o/9LhKP/SYGg/0Z9nf9BeJn/PHWW/zt2lf88eJf/P3ub/0OAn/9Ig6L/TYWj/1GGpf9PhKD/T4Se/0+E + nv9NgZ7/SX6d/0R5m/88dJj/OG+W/zNslP8waJL/LWWP/y1ljv8xaJH/N26W/z10mv9Ad5r/QHeZ/0B2 + mv9Bdpv/Qnab/0F0mf88b5j/OGyY/zVpmP8yZpT/MGKQ/y1fi/8rXoj/LF+H/y5ih/8vY4j/L2GH/y1d + hf8oVoH/I1B9/x5LeP8bSHX/IE95/yZXf/8uYob/NmqM/zhvjv85b4//OG2P/zdsj/82bI7/NWuP/zdu + kf85b5X/OW6W/zVplP8wZZD/KmCK/yheiP8YNk3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/w4qP/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aT2//Dic4/wMFCP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMHCf8VKzj/KFBo/z52 + mf8/d5n/Qnia/0N5m/9CeZv/QXib/z93m/8+dpr/PnWa/z50mv89cpj/PHGX/zhslP8yZpD/LmON/y1i + jf8xZpD/NmuS/zhrkf85a5D/OmuS/zdpkf8yZY//LGCK/yRZhP8iWIL/I1mC/yZdhf8sZYv/MmyR/zlz + l/87dZj/O3aY/z14mP9Ae5n/Q32a/0Z/mv9HgJv/SoGc/0yDn/9NhKH/ToSi/06Fov9Mg6H/S4Kg/0qA + n/9GfJz/QneZ/zxwl/83bZP/M2yR/zBtjv81cpH/OneW/0F9nP9Gf53/SYCf/0uAoP9Jfp//RXqd/z92 + m/85cZn/N3CX/zZxl/8zcJT/Mm6R/zJrkP8yaY7/MGiM/ypmh/8mZIT/JmKF/ypliv8uao//M3CS/zl2 + lv9Ae5r/RX+c/0qDn/9MhJ//TYSe/06Env9QhqD/Uoih/1OJo/9ViqX/VYml/1aJpf9ViKX/T4Wj/0mC + of9EgKD/RoOj/0qGpf9NiKb/UImm/1GJpf9RiKP/UYii/1CHo/9OhaP/TIKh/0V+nv8+eZn/OnaW/zx4 + mP8+epr/Qnye/0iAov9MgqT/TIKh/0uCnv9Lgpz/SoCc/0d+m/9De5n/PXaW/zt0lv84cZb/N3CW/zNr + k/8waI7/LmWM/zJpkP83bpb/PXSa/zx0mf87c5j/OnKY/zpxmP87cZj/O3CX/zZslf80apT/NGqV/zJo + k/8wY5D/LWCL/y1gif8uYon/MWWK/zNnjP80Z4v/M2WL/zBgif8rW4X/J1aC/yNTfv8jU33/J1qA/y5i + hv82aoz/PXCS/z1wk/87b5L/OW2Q/zZrkP82bJD/N22T/ztwl/85bpb/NWmT/zFlkP8rX4v/KF2I/ypf + if8RJTX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xVAXv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8VQl//DCEw/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xYpN/8mTGX/N3CV/zhzl/86c5f/PHOX/z50mP9Adpr/QXib/0B3m/89dpr/PHWZ/zt0 + mv87c5n/O3GZ/zlvlv84bZT/NGiS/zFlkP8sYYz/LWKN/y9kj/8wZ4//MmeO/zNnjf80Z43/NGaN/zFk + jf8tYYr/KF2H/yddhf8oX4X/KmGH/y5mi/81bpP/OXKW/zpzl/87dpf/PniZ/0F7mf9EfZn/R4Cb/0qD + nP9Lg53/TYWe/0+Hof9Qh6L/UIei/06Fov9Mg6H/SoCf/0d9nf9EeZz/PXOZ/zdwlP8zcJH/M3GR/zh1 + lv8/e5r/RH6d/0mAn/9MgaH/Sn+h/0h9oP9Dep3/Pnec/z13nP86dpr/Onab/zx4m/89eJv/PXaZ/zpz + lf84c5T/M3GQ/y5ri/8sZ4r/K2WJ/zBqj/8zb5P/OXWW/z57mf9FgJz/SoSf/06Gof9Ph6L/UIeh/1GI + ov9SiKP/VIqk/1WKpf9ViaX/VYik/1CGo/9KgqL/RYCg/0aBof9HhKL/S4ak/1CJpv9Ti6b/VYym/1WL + pP9ViqT/VImj/1SIpP9QhqT/SoOi/0R/n/9AfJv/PXmZ/z14mf9BeZz/Rnyg/0h+oP9HfZ3/R36a/0Z+ + mv9EfZr/Q3uY/z54lv86dJX/OnSW/zt1mP87dJj/OHGW/zRskf8xaY3/MmmO/zVskf83bpT/OG+V/zdv + lf83b5b/N2+X/zhvlv84b5T/Nm2T/zNsk/80bJT/NGuT/zJnkP8vY4v/MGSK/zJmjP81aY7/OGyQ/zlt + kP84a5D/NmiP/zNjjf8tXon/KVmF/ydYgv8oW4P/LmKH/zVpi/87bZD/P3CT/z5wlP87bZT/N2uR/zZq + kf83a5P/N2uT/zdrlP81aJT/L2KO/ypdiv8mWob/J1uG/ytgiv8PHyz/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/BAoQ/xpTdf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZ + ff8QNU3/BxUf/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DBYc/yZIXv82aIv/N22S/zVtk/80bZT/NW2V/zdu + lP85b5T/Om+W/zxyl/89dZn/O3SZ/zlzmf85cpn/OHGX/zdwlv83bZX/NWyU/zNokf8vY47/K2CM/ypf + i/8pXor/K2GL/ytji/8rY4n/LWWJ/y9liv8xZoz/MmaO/zBkjP8vZIv/MGaM/zBni/8vZ4r/MmqO/zJr + j/82b5P/N3KU/zp1lv8+d5f/QXuZ/0V+mv9IgZv/SoOc/0yFnf9Nhp7/T4eg/1KJov9SiqP/UIii/06E + of9Ng6D/TIGf/0d8nv8+dpn/NnKT/zNykv83dJT/O3eY/0F7m/9Gf57/S4Kh/02Cof9LgaL/R36g/0F7 + nv8+eZz/PXmd/z16nf8+e53/QX2e/0V/oP9Gf5//Qnyb/z98mf89eJf/OnOV/zVtkP8yao//MWmP/zRs + kv84c5X/PHiY/0N+m/9Ig5//TYei/1CJpP9TiqX/Uomk/1OKpP9UiqX/VIml/1WIpP9Sh6T/TYWi/0eC + oP9GgKD/SIOg/0qFov9Oh6T/Uoqk/1WNp/9Xjqb/WI2l/1iMpf9Zi6X/WIqm/1WJpf9Qh6X/S4Sj/0aB + oP9Cfp3/P3iZ/z93mf9BeJv/Qnib/0N5mf9BeZj/QHmY/0B7mP8/epj/PHiW/z14l/8+eZn/QHuc/0F6 + m/8+d5n/OXGV/zZtkf8zao3/M2qO/zJpjv80a5H/NGyT/zVtlf82bpX/OnKV/ztzlf85cZT/OHGV/zdw + lf84cJX/Nm2S/zRpjv8zZ4v/NGiN/zdrj/87b5P/PHCT/zxwk/86bZP/N2qR/zJkjv8tX4r/KVuG/yZZ + g/8sX4b/NGWJ/zlpjf87a5H/PW2U/zpslP82aZL/NGeR/zRmkP8yZI//MmSQ/zFjj/8sXoz/J1mH/yNW + g/8hVYH/I1mD/yVYf/8FDBH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DiY3/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpUdv8RMkj/BAsQ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8IDhL/GzNC/zlq + h/8/eJn/PHWX/zlwlP80a5H/MWqR/zJqkv8zapL/MmmR/zRpkf81a5L/Nm2T/zZvlP81cJX/NXCW/zZw + l/81bpX/NW2U/zNrkv8xZ5D/LmON/yldiP8mW4b/JVuG/yRbhf8oX4j/KWKJ/ypkiP8pZIb/LWeJ/zJq + jf81bJH/N22S/zhukf85cJD/OG+Q/zdukP80bJD/NG2Q/zRtkf82b5L/OXOV/z13lv9Bepj/RX2b/0iA + nP9Kgpz/TISc/06Hnv9QiKD/UYmh/1KKov9SiaL/T4ah/06Fof9PhKH/SX+e/z93mP83c5P/N3OU/zl1 + lf89eZn/Q32c/0iAn/9LgaH/TYGj/0mAov9Efp//P3yd/z18nf8+fJ7/QH6e/0J/n/9GgKD/SIGh/0iB + of9GgZ7/RX+d/0R9nP9CeJv/PXOX/zluk/82a5L/NGuS/zVulP86dJb/QHuZ/0WAnP9LhaD/UYql/1KJ + pf9Tiqb/VIql/1SJpf9UiaX/U4el/0+Fo/9KhKL/SIKh/0iCoP9Jg6D/Toai/1KJpP9UjKX/V42m/1mO + pv9ajqb/Woym/1qMpv9ai6b/WYqn/1eJpv9Rh6X/TISj/0d/n/9Depv/QHaZ/z50mP89dJj/PHWX/zx0 + lf89d5f/PnmZ/z56mP8+epn/QHyb/0N+nf9Gf5//SYGi/0Z+n/9BeZn/PHOU/zhvkf8zao//M2qP/zNq + kP80a5P/N26V/ztylf8+dZT/P3eV/z52lv88dZb/OnSY/zt0mf87cpb/OG6T/zdsj/82a47/OG2Q/zxw + k/8+cpT/PnKU/zxwlP85bZT/NmmS/zJlj/8rXon/KVyF/ytdg/8xYob/NWWK/zZmjP83Z47/NWeP/zJl + j/8vY47/LmGM/yxfi/8tX4z/LF6M/ylaif8iU4P/Hk5+/xxOfP8eUn7/IVaA/x5KbP8CBgj/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GEhm/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xlPcP8NKDj/AwUI/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8WKzn/KlBp/z50mf8+dpn/PneZ/z14mf87d5j/NnKV/zNtkv8vaJD/L2aP/zBm + kP8wZI//L2ON/zBmjv8yapD/Mm2S/zFtkv8ybZP/M22U/zRsk/8zapL/MWiQ/zBlj/8sYYv/KF2I/yJY + g/8gV4H/I1qD/ydfh/8qY4r/LWeL/y9pjP8xbYz/N3KS/ztzlf8+dZf/P3eW/z52lf8+dZP/PHOT/zly + k/82b5H/NW6R/zVukf83cJP/PHWV/0F5mf9FfZv/R3+b/0mBnP9NhJ3/T4ee/1GJn/9SiqD/U4mg/1OI + oP9RhqH/ToOg/02Bn/9IfZz/QneX/zxzlP85cpT/O3WW/0B7mf9Gfpz/SYCe/0uAov9Jf6H/Rn6h/z99 + nf8/fZ3/P36e/0B+nv9DgJ//RoKg/0mDof9NhKL/TISi/0yEof9MhKL/S4Gh/0d8n/9Dd5v/PnGW/zht + k/81apL/NW2U/zZxlv88d5n/QXyb/0eBnv9MhaD/T4ik/1GIpf9SiKX/Uoek/1OHpP9OhaP/S4Si/0mD + ov9KhKH/S4Sh/06Gov9SiaP/VYyk/1iNpf9aj6b/Wo6m/1uNpf9bjab/W4yn/1yMqP9bi6j/WYqo/1aI + pv9RhaX/TH+h/0V7nf9Adpr/PHOY/zlxl/83b5T/N3GU/zp1l/8+epv/QHyc/0J+nf9FgJ7/R4Kg/0qD + ov9NhaT/TYSj/0iAn/9CeZn/PHOV/zduk/81bJL/NWyT/zZtlP85cJX/P3aV/0F5lv9De5f/QnqX/0B4 + mP8/eJr/Pnea/z12mf87cpb/OXCT/zhukf84bpH/O3CT/zxylP89c5T/PXGU/ztwlP85bZT/NWmS/zFk + jv8sX4j/LF6E/y5ehP8vX4X/MWGI/zBiiv8uYov/LGGK/ytgiv8pX4j/KV6J/ytei/8rXYz/KlqK/yVV + hv8cS33/GEh5/xpMev8dUX3/IVaB/xQySv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8IFSD/HFl+/xpZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xlPb/8MIi//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wUMEf8WMkX/MGSI/zhxlv87c5j/PHSY/z11 + mP88dpj/O3eZ/zl2l/80c5T/MG6R/y9qkP8uZo7/LWKO/y9ijv8vZI7/L2aN/zBrj/8xbZH/MW6R/zFs + kf80bpP/NW2T/zRrkf80aZL/MWaP/y1ijP8pXoj/JFuF/yFYgv8jW4P/J1+H/y1mi/8zbZD/NXGS/zl1 + lP89eZb/QnuZ/0V7mv9Fe5n/Q3qX/0F4lf9Ad5X/PXaV/zpzlP83cJL/NW6R/zhvkv87c5X/QXeY/0R7 + mv9Gfpz/SYGd/0yDnv9Ph5//Uomg/1OJoP9TiaD/U4ii/1GGov9OgqH/Sn+e/0Z7m/9AdZb/PHGT/zlv + k/88dJb/Qnqa/0h/nv9Lf6H/Sn6h/0Z+oP9AfJz/Pn2c/z9+nf9BgJ//RIKg/0eCoP9KhKH/Toaj/1CH + o/9Rh6P/UYik/1KHpP9QhKL/TYCh/0h6nf9BdJn/O2+V/zZsk/80bZT/NXCW/zh0mf89eJv/Qnyc/0eA + nv9LgqD/ToWj/0+Fo/9PhKL/TYOh/0uDof9HgaD/SYOg/0qEoP9Oh6L/Uoqk/1aMpf9YjqX/XJCm/1yP + pv9bjqb/W42l/1yNpv9bjaj/XI2p/1uLqf9aiqj/WIen/1SFpv9PgaT/Rnue/z91m/85cZj/NG2U/zNs + kv81b5T/O3aZ/z97nf9Cf57/RYCf/0iCn/9LhaH/Toej/0+Go/9PhqL/ToSi/0l/nv9DeZr/PXOW/zlw + lf84b5X/N2+V/ztzlv8/eJj/RHyZ/0d/mv9FfZj/Q3uX/0F6mv9Bepz/QHmb/zx1mP84cJT/N26S/zdt + kP84b5H/O3KT/zxylP88cpT/O3GU/zpvlf85bJX/NWiR/zFkjP8tYIb/K12D/ytchP8sXob/LF+I/ypf + iP8qYYn/KGGI/ydgh/8qYYn/LGKM/y1ijv8tX47/KVqK/yJSg/8aSnv/GEh5/x5Ofv8hVIH/I1aC/wkV + IP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TN1D/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpPcP8LIjD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w8h + Lv8eRGH/KF+I/ytiif8wZ47/NW2T/zhyl/86c5j/OnSY/zp2mP85d5n/N3WX/zRylf8xbpL/L2uQ/y9o + j/8vZpD/L2WP/y9nj/8wa4//Mm6Q/zNwkf80cJL/NnCT/zdwlP84cZT/OG+U/zdtlP82apP/MmeQ/y1i + jP8pXoj/Jl2G/yVdhf8pY4n/L2qO/zVwkv86dpf/P3qZ/0J8mv9GfZz/Sn+e/0p/nf9Ifpr/RXyY/0N7 + mP9Ce5j/PneV/zlylP83b5L/OHCT/ztylf8/dZj/Qnia/0V8nP9Ifp3/TIKf/0+GoP9Rh6D/U4eg/1OH + of9UiKP/U4al/0+Cov9Kf5//Q3ib/z1ylf85bpH/OG2S/zxylf9Bd5r/R3ye/0p+of9JfaH/Qnuc/z56 + mv89fJv/P3+d/0SCoP9HhaH/TIej/0+Io/9TiqX/Voym/1WLpf9WiqT/Voml/1SFov9QgaH/TH2f/0Z3 + m/8+cZf/OG6U/zVtk/81cJb/N3OY/zl2nP89eZz/Qnyd/0d/n/9LgqH/TIKh/0uCof9JgqD/R4Cf/0iC + oP9KgqD/TIWh/1CIov9VjKX/WI6m/1uQp/9ckKf/XZCm/1yOpf9cjab/XI2n/12NqP9bjKn/W4up/1qJ + qP9Yh6f/VYSm/0+ApP9EeZ7/PXSa/zZvlv8xa5L/MmyT/zZxl/88d5z/QHye/0N+n/9HgqD/SoSg/06F + of9PhqH/T4ah/06EoP9OhKL/TIKh/0h+oP9BeJv/PHSY/zlwl/84cZb/OnSX/z95mv9Ffp3/R3+b/0d+ + mP9EfJX/RHyW/0R8m/9Ce57/P3ea/ztzl/82bpL/NG2P/zZvkP85cZL/PHOU/zxzlP88cpT/O3GV/ztu + lv84a5L/M2WN/y5giP8pW4X/KVuE/ypdh/8rYIr/LGKL/ypjiv8oZIn/K2aL/y5njf8vZ47/MGeQ/zBk + kf8tYI//J1iJ/yFRgv8eTYD/IE6B/yRUhP8kV4T/IlB7/wIFCP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wUKEP8cU3j/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xlQ + b/8OJDL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AwcJ/x04Tf8xYIb/M2iT/y1ijf8oXoj/KV6H/y1ji/8xapD/NW+U/zZy + lv83dJb/N3WX/zd1l/83dZj/NHKW/zJvlP8wbZH/MmyS/zRrk/80a5P/MmyQ/zNvkP81cpH/N3ST/zl0 + lf87dZb/PHaY/z51mP8+dJj/PnKY/ztwl/84bJT/NGmR/y1jjP8pYYn/KGGI/yxmjP8xbJD/N3KU/zt3 + l/9Ce5r/Rnyb/0l9m/9LgJ3/TYKe/02Cnf9LgZv/SICb/0V9m/9Bepj/PHWV/zpylP85cJP/O3GU/z1y + l/8/dZj/Qnib/0Z8nv9Jf57/TYOg/1CEoP9RhaD/UYSh/1GEov9RhaT/ToKj/0l+oP9Bdpn/OW6T/zVq + kP81apH/OW+V/z50mf9DeJ3/Rnqe/0R7nf8/epv/PXua/z99nP9CgZ//SIWi/0yJo/9QiaT/VImk/1eL + pv9ajab/WYyl/1mLpf9XiaT/Voaj/1ODov9Pf6D/SXmd/0FzmP86b5X/N2+V/zVwlf83c5n/N3Wa/zl3 + m/88eJz/Q3yf/0h/oP9KgaH/R4Cg/0eAn/9HgaD/SYKg/0uEov9OhqL/U4qj/1eMpf9aj6f/XJCn/1yQ + p/9bj6b/XI6m/1yNp/9djaj/XIyp/1yMqf9bi6r/WIio/1aFpv9Sg6X/Sn6i/0J4nv87c5v/Nm+X/zNs + lf80bpb/OXSa/z14nP9Be57/RH+e/0mCoP9NhaD/T4Wf/06Fn/9NhJ7/T4Sg/0+Fov9Og6P/SoCh/0V7 + nv9Ad5v/O3OZ/zhxl/85c5j/P3mc/0R8nv9Gfp3/Rn2Z/0d+l/9If5f/SH+a/0V9nP9CeZz/PnWZ/zlx + lf81bpH/M2yP/zdwkv86cpP/PHSU/z10lf88cpb/PHCX/ztslf81Zo//LV6J/yhahv8nWYb/KVyI/yxg + jP8uZY3/LmiO/y5qjv8wbI//Mm6R/zRukv80bJP/M2mS/zBkkP8rXoz/JliI/yNUhf8kVYb/J1mI/yld + iv8oW4j/FjJL/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w8rP/8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1l9/xREXv8LHSr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DRoj/yJDXP83bZf/OW6a/zlt + mf81aZT/LmKN/yldh/8mWoP/KF+H/y1mjP8xa5H/M2+U/zRylf80dJf/NXSX/zV0l/80cZb/M2+V/zNv + lf81b5b/OXGW/zpylv86dJT/OXWT/zt3lf88eZf/PnmY/0F6mv9Cepr/Q3ia/0N4m/9Cdpr/P3OZ/z1y + mP83bZT/MmmR/y1ljf8sZIz/LmeO/zJskv83cZb/PneY/0R8mv9JfZv/SX2a/0t/m/9MgZz/T4Se/1CG + nv9Ng57/SH+b/0R8mf9AeZj/PHWW/zpxlf84bpP/Om+U/ztwl/8/c5n/Q3eb/0Z7nv9Kfp//TYGg/06C + n/9OgZ//ToGg/02Cov9LgKL/RHme/ztyl/80bJL/MGeP/y9mjv8yapH/OHCW/z51mP9Ad5n/P3mZ/z56 + mv8+fJz/QYCf/0aEof9MiKT/UYym/1OMpv9WjKb/WY2m/1uOpv9bjaT/Wouj/1iJov9Yh6L/VoWk/1GA + of9Le5//QnSZ/zxxl/85cZX/OHOX/zdzl/82dJj/N3Sa/zp1nP8+eJ7/Q3ug/0R9n/9Ef6D/RYCf/0iC + of9Kg6L/ToWi/1GHo/9ViqT/V4yl/1qPpv9bj6f/W4+m/1uOpf9bjab/XI2o/12Oqf9cjKn/W4uq/1mJ + qf9Vhaf/UoOl/0yApP9HfKH/QHif/z11nf84cpr/NXCY/zZymf85dZv/PXeb/0F6m/9Gf53/TISg/1CH + of9QhZ//TYOc/02Dnf9PhKD/UYaj/0+Fpf9LgaP/SH2g/0R6nv9Adpz/O3OZ/zt0mv8+eJz/Qnud/0Z9 + nf9HfZz/SH6a/0qAmf9KgZr/SYCb/0V8m/9Ad5n/OnKW/zZukv82bpL/Nm+S/zlzlP88dpb/PXSW/z1z + l/89b5j/OmuV/zRlkf8sXov/KFqH/yZYh/8nW4n/LGKN/zBokf8xbJH/NG+S/zRxkv82cpT/N3KU/zhx + lf82bJP/M2aR/y9hjf8qW4r/JVmI/yZbif8pYIz/LWON/y1kjP8tYor/Cxgi/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AgUH/xpRdf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p9/xdObf8NIzH/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/DSAv/x9GY/8uY4r/MmaQ/zZqlf84a5b/OGuW/zVok/8vYYz/KFuG/yVZg/8jWYL/KGCI/yxn + jv8vbZL/M3GV/zRzl/80dJf/M3KV/zNxlf81cJb/N3KY/zlymP89dJj/Qnia/0F4mP8/eZf/QHqY/0F8 + mf9CfJn/RHya/0Z8mv9HfJv/R3uc/0R4m/9Dd5r/P3SZ/ztxl/81bJP/MWiQ/y5njv8vaI//Mm2S/zly + lf9AeJf/SH2a/0t+m/9Lf5v/S3+a/0yBnP9PhJ3/UYee/1CFnf9LgJv/Rn2a/0F6mv8+eJn/O3OX/zhv + lP81a5L/NWuS/zlulf89cZn/Q3ed/0Z6nf9JfZ3/Sn6d/0x/nf9MgJ//Sn+f/0V8nv8+dZr/Nm6U/zFq + kf8tZo//K2SN/y1ljf8zbJL/OXKV/zt2lf8+eZf/P3yZ/0GAnP9EgqD/SYej/0+Mpv9Tjqj/Vo6o/1mO + qP9bj6f/XI+l/12OpP9bi6L/WYmh/1iIo/9Xh6X/UoKi/0p7nv9BdJn/PHKW/zpzl/86dJj/OnWZ/zl0 + mf81cZf/N3KZ/zp0m/88d53/PXqe/0B9nv9FgKD/SIOh/0yEov9Oh6P/Uomk/1aLpf9Zjqb/Wo6n/1uO + p/9ajab/Woyl/1qLpv9bjKf/W4yp/1uMq/9Zian/Voao/1KDpv9MgKT/R36j/0R8ov9Ce6H/QHmg/zt2 + nv84dJv/NnOZ/zh0mv88dJn/QXma/0h+nP9PhaD/UYeh/1GGoP9QhJ3/ToOe/06DoP9QhaL/ToSl/02D + pf9KfqH/R3yf/0J4nf89dJr/O3OZ/z11m/9BeZ7/RHue/0d8nf9IfZv/Sn+a/0qAmv9KgZv/Rn2a/0F4 + mf88c5f/OHCU/zdvk/83cJP/OXOV/zt1lv88dZf/O3KY/zpumf84apb/MmOS/yxejf8mWIn/I1aH/yZb + if8qYY3/L2iR/zNtk/80cZP/N3OT/zh0lP85dZb/OXKW/zhulf82aZL/M2SO/y1fjP8nXor/J2GM/ypk + jf8tZo7/L2eN/zJpj/8pVXX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DCM2/xpY + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Glp+/xhObv8MIS//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CBAf/Chwz/xc7af8eS3v/JFWA/ypdiP8tYIz/MWSQ/zZo + lP81Z5P/MmOQ/y1eiv8nWoX/I1eB/yJYgv8kXYb/J2OK/y1rkf8xcJX/NHSY/zR0mP8zc5b/NHGV/zVx + lv84c5f/O3SY/z92mP9Cd5j/RHmZ/0N6mf9Ce5j/Q3uY/0V9mf9Fe5j/RnyZ/0h8mf9IfJr/Rnqa/0V5 + mv9Bdpn/PnOY/zhulf80a5H/MGmP/zBqkP80bZL/O3KU/0R4l/9KfZn/TYCb/02Am/9OgZz/ToKc/1CF + nv9QhJ3/ToKd/0x/m/9IfZv/Q3qb/0B5m/87dZn/N2+V/zJpkf8vZo7/MWeP/zZrk/88cJn/QXaa/0V5 + mv9IfJr/SX2c/0qAn/9Hfp7/QHib/zlzl/81b5b/MGqS/ytmkP8sZ5D/LmiQ/zJskf83cpT/PHeW/0B8 + l/9CgJj/RYSc/0iIoP9Ni6X/Uo6o/1aPqf9ZkKr/W5Co/12RqP9ekab/XY6k/1uLov9aiqP/Woql/1eH + pf9QgaL/SHqc/0B0mP87cZX/OnKW/z93mv9Aep3/Pnea/zhyl/8zbJP/NnGY/zh2m/85eZ7/Pnyg/0WA + of9Jg6L/TYaj/1CIo/9TiqX/Voym/1mOp/9ajqf/WYym/1mMpv9Yiqb/WIqm/1iJpv9Yiqj/WImo/1aH + p/9ShKb/ToGk/0d+ov9DfaH/Q32i/0R9o/9EfqP/QX6i/zx6nv84dpv/NnOZ/zlzmP9AeJn/SICc/0+E + nv9RhqD/U4eg/1GFn/9QhJ//T4Sg/06Dov9Og6T/TYKj/0yAoP9Ie53/Qneb/z1zmP86cZf/PHKZ/z91 + nP9Cd53/RHqe/0d7nP9IfJv/SH2a/0h+mv9GfZr/Q3qa/0B3mv88c5j/OG+U/zhvlP84cZT/OnOV/zly + lv84cJb/OG2X/zdplv8zZJP/LF6N/yZZif8hVof/JFqJ/ydejP8tZo//MW2R/zRxk/82c5T/OXWV/zl1 + lv86cpb/OG6V/zZpkv80ZY//LmKM/ydhi/8lY4v/KmaN/y1pjf8wao3/M2yP/zVvkf8UKTf/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/F0ts/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1l9/xtVdv8QLkD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HDBH/GTFL/yJI + eP8cQ3r/GD52/xpDef8dTHz/JFSC/ydZhv8qW4n/Ll+M/zBhjv8uX43/KVuI/yVYhP8iVoL/JFuG/yVf + iP8oZIz/K2mQ/zBvlf8zc5j/NXWZ/zZ0mP82c5f/NnKW/zlzl/88dJf/P3aX/0F3l/9DeZj/Q3mY/0N5 + mP9DeZf/RHqX/0V6lv9FeZX/SHyY/0h8mf9Ie5n/Rnqa/0N3mf9AdJj/OnGW/zRskv8xaY//MGmP/zVs + kP89cpL/RHiV/0p9mf9NgJv/ToGc/06Bnf9Pg57/T4Oe/06Dnv9MgJ3/Sn6c/0h7m/9FeJv/QXea/zx0 + mf83b5b/MGiR/y1kjf8tY43/LmOO/zZqk/89cpb/QXaY/0R5mf9He5v/R32d/0J6m/88dpj/N3OX/zVw + lv8ybpb/L2uU/y5qk/8wbJP/NXCV/zt1l/9Ae5r/Q4Cc/0aEnP9IiJ3/TYyi/1GOpv9Wkan/WpOt/1uS + qv9dkqn/X5Oo/1+Sp/9ekKX/XI2j/1qKpP9YiKX/VYal/0+Aov9Hep3/QHSY/zpvkv89dJb/QXib/0R9 + n/9De57/PXaa/zlxl/84c5r/OXed/zt5nv9AfaD/RYGj/0qFo/9Nh6P/UImk/1OKpf9Vi6b/WI2m/1iN + p/9XjKf/V4qm/1aIpv9ViKX/VYem/1WHpv9ThKX/UIKk/06BpP9JgKP/RX2h/0N+ov9Ff6P/R4Ck/0eC + pP9Gg6T/Q4Cj/z56n/84dJv/OHWZ/zt4mf9Efpr/TIKd/1CFn/9Rhp//UYWf/0+En/9Og6D/TYOi/06C + o/9OgaD/TX+e/0l7m/9Ddpj/P3KY/ztvl/86bpj/PHCZ/z9znP9CdZz/RHec/0Z5mv9Gepn/RXqZ/0V6 + mv9Depz/QXid/z51nP86cZj/N26V/zVtkv81bpD/NW6R/zZulP82a5T/NGmT/zJlk/8tYJD/KFuL/yRY + iP8hV4f/JF2K/ypjjf8wa5D/NHCT/zZzlP83dJX/OXSW/zlzl/85b5X/N2mS/zJmj/8rZIz/I2OJ/yRk + i/8pZY3/LGiO/zBrjP8ybY3/NG6P/zBhgP8DBgn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8LHy7/G1h9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxV + d/8OLj//AwYI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8IDhL/J0Rd/zpmkv8xWov/Jk6E/x5FfP8ZQHj/F0J2/xlHef8eTn3/I1OC/yVV + hP8oWIf/KlqI/ypaiP8nWIb/IVWB/yNZhP8nXon/KmSN/yxokf8vbJT/MW+W/zRymP83dZr/N3Wa/zd0 + mP84c5f/OnSX/zx0l/8+dZf/QHaX/0J4l/9CeJf/QXeV/0N4lv9EeZf/RnqW/0d6lv9JfJf/SXyZ/0h8 + mf9HfJr/RXqb/0F2mP86cZX/NWyS/y9njf8xaY3/NmuO/z1wj/9Fd5X/SnyZ/01/nP9Mf5z/TICd/02B + nv9MgJ3/TICd/0p/nf9Ie5z/Rnmb/0R2mv9CdJn/PXGX/zZtlP8xaZH/LmaP/y1jjv8uY47/MmaP/zht + kv87cJT/PnOW/0J3mP9Adpj/PXWX/zl0lv83cpX/NnOX/zZzmf82c5v/NnKa/zVymP84dJj/PXmb/0N/ + nf9IhaD/Soeg/02Mof9RkKP/V5Gm/1ySq/9ck6z/XJKq/12Sp/9flKf/YJSn/2CSpv9cjqX/WIqk/1SG + pP9QgaL/TH+h/0d6nf9AdJj/P3WX/0F3mf9Fe53/Rn2f/0Z+oP9DfJ7/PXea/zt2m/87eJ7/PXme/0F8 + oP9GgKL/SoSk/06Hpf9QiKT/Uoml/1SKpf9Wi6f/Voun/1WKp/9Uiaf/Uoem/1GGpf9QhKT/T4Kj/02A + ov9LfaH/SH6h/0Z/ov9EfqL/Rn+j/0iCpP9Kg6X/S4em/0qGpf9Hg6T/Q36i/z56nv85eJv/OXma/z15 + mv9Ffpz/TYKd/0+En/9PhJ//ToOf/0yCoP9NgqL/T4Kh/1CBn/9Of53/Snub/0V3mf8/cZb/PG+X/zls + lv85bJf/O22Z/z9wmf9Bc5n/QnSY/0N2l/9Dd5j/Q3eZ/0N4nP9BeJ3/PXSd/zdumP81bJT/M2uO/zFq + if8xaov/M2uP/zRrkv8zaJL/MWSR/y5hj/8qXo3/JlqK/yNaiP8iXIj/JmGK/y1oj/8ybpP/NnOW/zh1 + l/85dZj/OXOY/zhxmP82bJX/MmiR/ytljP8mYor/JmKL/ylkjv8tZY7/MGiN/zJri/80bY3/NW6P/xs2 + SP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8cVHf/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xxaf/8TOlH/AwYI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8MFRv/J0dc/z5wlP88a5P/N2SR/zBc + jP8mT4T/HUV9/xlEef8YRnj/GUp5/x5Off8jU4H/JFSD/yZVhf8mVYX/JVSE/yJTgv8jVoP/JFqF/yhg + i/8taJH/MW6X/zJwmP8zcZj/NXOZ/zh0mf85dZn/OXSZ/zlzmP86c5j/PHSX/z10l/8+dZb/P3aV/0B2 + lf9Bd5X/QniW/0R6mP9Ge5f/R3uX/0l8mP9JfJf/SHyY/0d7mP9EeZn/QXeZ/zxylv80a5D/MGiN/zJo + jP83a43/PnCR/0R2lv9KfJr/S32c/0p9nP9Kfpz/SX2c/0h8nP9IfJv/RXma/0N4mv9Ddpv/QnWa/0Bz + mP89cJX/OGyT/zRqkf8yaZH/MGaS/zBlkf8yZpH/M2aP/zNnjv82apD/OW6S/zpwkv84cJP/OHKU/zdx + lf82cpf/OXeb/zx5n/88eZ7/PHmd/z16nP9BfZ3/RoKg/0qHof9Ni6L/UI2j/1WQpf9bkqj/X5Kq/12S + q/9ckqr/XJKn/16Tpv9gk6b/X5Kn/1yOp/9XiqX/UYOj/0x+of9He5//RHic/0N4nP9Eep3/R32f/0h+ + oP9KgKD/SYCg/0R9nv8+eJr/Onaa/zp1mv89d5z/P3me/0R9oP9LgqP/UIal/1SJpv9TiKT/U4ik/1OI + pf9Sh6b/Uoem/1CGpf9PhKX/TYKk/0uAov9KfaH/SHyf/0d9oP9Ff6D/RICh/0eCo/9JgqP/S4Sk/06H + pf9PiKb/Tomm/0yFpP9HgqP/Q3+g/z59nf86eZv/Onea/z54mv9Gfp3/S4Kf/02Dn/9Og6D/TYKh/02D + of9Qg6H/UYKg/1CAn/9Ofp7/R3ic/0J0mf88bpb/NmmT/zVnk/83aZT/O2yX/z1vl/8+cJb/QHKW/0Bz + lv9AdJf/QXWY/0B0mv87cJj/NW2W/zFpkv8waIz/L2iI/y9oiP8xaYz/MmiP/zNnkf8yZZD/MGOP/yxg + jf8oXYr/JFuH/yNch/8lX4n/KmWN/zBskv81cZb/OHSY/zh1mv84c5r/OHGZ/zhvmP81a5P/LWWN/yhg + iv8nX4n/KV+L/y1hjv8wY47/MmiO/zNqjP8zbI3/M2WH/wMGCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xIuQf8cWn3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8WRV//BhIZ/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8RHSX/MFVu/z1wkf87bpH/OGqQ/zVmjv8yYY3/LFiJ/yRPg/8bSHv/F0Z4/xlKev8eT37/I1SC/yVV + g/8mV4T/JlaF/yVVg/8iUoH/IFKA/yBUgf8jWob/KmON/zBqk/80cZn/NXKZ/zZymf83dJn/OnWa/zt1 + mv87dJn/O3OY/ztymP87cpj/PHOW/zxzlf88c5P/PXST/0B2lP9Cd5b/RHmX/0V5l/9Gepj/RnqY/0Z6 + l/9FeZb/RHmW/0J3lv8/dZb/OnCT/zRrj/8xZ43/NGiN/zhrj/8+cZP/RHaY/0Z5m/9Hepv/R3ub/0Z7 + mv9Gepr/RXma/0J2mf9AdJf/QHSX/0F0mP9BdZr/QHSY/z1xlf88b5T/O3CT/zluk/82bJT/NGmV/zNn + lP8vY47/LmGK/y5hif8xZYz/NGiO/zZtkf83b5P/N3KW/zp1mf88eZz/P3yf/0B9of9BfaD/Qn2f/0WA + oP9JhKH/TIij/1CLpP9UjaT/WZCl/16SqP9dkqr/XZGr/12Rqv9ckaf/XZKm/16Tp/9dkaf/Wo6o/1SJ + p/9OgqT/SH2g/0N4nf9Cdpz/RHmd/0l/of9MgqP/TYOj/02Dov9Lg6H/R4Cf/0F8nP87dZj/OHKW/zly + mP88dJr/Qnmd/0l/of9QhaX/U4al/1OGo/9RhKL/UIWj/06EpP9Mg6T/S4Kj/0mAov9IfqH/Rnuf/0R6 + nv9Ee53/RH6f/0SAof9Hg6L/S4ak/02Hpf9QiKX/Uomk/1KJpf9SiaT/UYil/02GpP9HhKH/Q3+f/z55 + nP87dZn/PXia/0F8nf9HgJ//TIKh/02Cov9OgqL/T4Oj/1CDov9PgqD/Tn+f/0x9nv9KfJ//RHab/ztt + lf8yZI7/LmCM/zBijv80ZpH/OmuU/zttlP87bpP/PG+T/zxwk/88cJT/O2+U/zdtk/8zaZH/L2iP/y5n + jf8tZov/L2aL/zFoi/8xaI//M2eR/zNnkf8zZpH/MGOP/yxhi/8nXYj/I1uF/yZfiP8qZIz/L2mS/zVv + l/84cpn/OHOa/zd0m/85cZr/OnCY/zdrlP8wZI3/KV2I/ydahv8nWYb/K1uJ/y9ejf8yY4//NGaO/zRo + jf81aY7/GjNH/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwYI/xpVdf8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8ZUHH/CyIx/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8QGyT/MVRv/z5vkv87bZD/OGuO/zVnjf8wY4r/L2CJ/yxc + iP8nVoX/IE+A/xlJef8WR3b/G0x7/yJUgv8nWIb/KVuH/yhahv8oWYX/JleD/yJTgf8eUH7/HVF+/yFY + hP8qZI3/MmyU/zVwl/82cZj/OHOZ/zt0mv89dZr/PXWa/zx0mf88dJj/O3KY/zpxl/85cJb/OW+T/zhv + kf86cZL/PHOS/0B1lP9BdZX/QnaW/0N3l/9Dd5f/Q3aX/0N2l/9BdZX/QHWT/z50lP85b5L/NWuP/zFm + jf8zZo3/N2qQ/z1wlf9BdJj/Q3ea/0N4m/9DeJr/Q3ma/0J3mf9Bdpf/PnOV/z1xlf89cpX/P3OW/0B1 + mP9Bdpn/QXaY/0B1l/9Bdpf/P3SX/z1yl/85bpj/M2aU/y5gjv8qXIn/KVqG/ytchv8wYov/NWmP/zhu + k/87c5f/PXeb/z97nv9CfqD/RIGh/0SAoP9FgJ//R4Gg/0qEof9PiaT/U4uk/1eOpP9dkab/XpOn/12S + qf9dkqr/XJCq/1yQqP9ckaf/XZGo/1uQqf9Yjan/Uoan/0uAo/9Fe5//QHac/0J3nf9GfJ//SoCh/1CG + pP9Rh6T/UIaj/0+Gov9LhKH/RoCf/0B6nP85c5b/NG2T/zdvlf8+dJr/Rnug/02ApP9QgqT/UIGh/1CC + of9Qg6L/TIKi/0h/oP9EfJ7/RHue/0N5nv9DeZ7/Q3md/0V+nv9FgZ//R4Oi/0yHpf9PiKb/U4mm/1SK + pv9Ui6T/VYui/1WKo/9TiqT/UYqk/02Ho/9HgaD/QXqc/z13mv88d5r/QXuc/0Z+n/9KgKL/TIGj/02C + pP9OgqP/ToKj/02AoP9KfJ3/R3qc/0V5nP9BdJn/OGqT/y5hjP8pW4f/JVeF/ylcif8wYo3/NWiR/zhr + kf84apD/OWyQ/zltkP84bI//NGqP/zFpj/8uaI7/LWeO/y5mjv8uZY3/L2aO/zJnkP80aZL/NWmT/zZp + lP81Z5H/MWWP/y1ii/8nXYj/JFyG/yhgi/8uZ5D/MmyW/zZwmf83cZv/N3Ga/zlwmf87bpj/N2mS/zBi + jP8pW4b/JVaD/yRUgv8nVYT/LFqJ/zFejP8xYYz/MGGK/zBiiv8tW4L/AwUI/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/EzVJ/xtZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bW3//ES9B/wMGCP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8PGiT/LE9t/zto + kP86aZD/OWiP/zVljP8yZIv/L2GI/ytdhf8qXIb/J1mF/yRVg/8fUn//Gk16/xhLeP8bTXv/IlSC/ylc + if8sX4v/LV+L/ytciP8pWob/JFWC/x9Rfv8cUH3/IViD/yhii/8xapL/NnCW/zhyl/86dJj/PXWa/z92 + m/89dJn/PXSZ/zxzmP88c5j/OnGW/zlwlf83bZP/N22S/zhukf86b5H/O3CR/z1yk/8/c5T/P3OU/z9z + lf9Bc5b/QXOW/0Fzlf9Ac5T/PnSU/zlukv8zaI//MGSN/y9jjP8zZ4//OWyU/zxxl/8+dJn/QHWa/0F3 + mf9Ad5r/QXeZ/z90l/89cpX/PXKV/z1ylf8/dZf/RHia/0R6m/9Eepr/RHqb/0R6mv9DeJn/Qnia/zxx + l/80aJL/LmCN/ydVhv8lVIL/JlaC/y5eiP80ZY7/OG2S/zxyl/9AeJv/Q32e/0WAof9GgqH/SIOg/0eC + n/9IgZ//S4Og/0+Hov9Ui6T/Wo6k/1yQpf9dkqf/XpOp/16SqP9dkan/XJCo/12Qqf9dkKn/W4+q/1eM + q/9Qhqj/SX+k/0J4nv9BeJ3/Qnqd/0d+n/9Mg6L/T4ai/1KJpP9UiqX/Uomk/0+Ho/9LhKL/RX+f/z53 + mv84cZX/MmuR/zhvlv9AdZz/R3mg/0t9ov9NfqH/ToCi/0+Co/9Jf6D/Qnqc/z52mv89dZr/PXSb/z52 + nP9EfZ7/SIOg/0mFof9Mh6T/T4mn/1SMqP9Xjaj/WIym/1mNpf9ZjaP/WIyj/1eMpP9VjKT/UYik/0yD + ov9FfZ7/QHmb/z13mf8+d5n/Q3qd/0h8oP9JfaT/S4Ck/0uAo/9Kf6H/SH6f/0V6m/9CdZj/PnOW/zlt + kv8xZo7/Kl6J/yRYhP8fUoD/H1OA/yZZhf8tYIv/MWSM/zVojf82aY3/NmmN/zVqjf8zao7/L2mO/y9q + kP8wapH/MGmQ/y5lj/8vZJD/MGWR/zVplP84bJb/OGyW/zhrlP82aZH/MWSO/ytgiv8nXYj/JV2J/ylh + jv8uZ5P/M2uX/zZvmv83b5r/OG6Y/zhrlv80ZZH/Ll+K/yhYhP8jUoD/IlF+/yVTgv8oVoT/KVmF/ytb + hv8rW4X/KVqE/ylYhP8UK0L/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FDBD/HFp//xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/GENa/wUNEP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8GCxH/KEpp/zdjjf83Y43/NWKM/zRgiv8wYIn/L2CI/y1fh/8qXIX/KVuF/yhZ + hP8nWYX/JlmF/yNXgv8eU33/HVF8/x9Sfv8jVoP/KFuI/y5hjf8wYo7/L2GM/yxdiP8nWIP/IlN//yFT + gP8jWIP/KWCJ/zBokP81bpT/OnKW/z10mP8+dpr/P3Wa/z50mv8+dJr/PXSa/zxymP86cJb/OG6U/zZs + kv82bJL/N2yQ/zdskP84bZD/Om+R/zpukf86bpL/O26S/zxvk/8/cJX/QHGV/z9wk/88b5L/NmqR/y9j + j/8qX4v/Kl+K/yxgi/8xZ5D/NmyT/zlwlv89dJj/P3aZ/0B3mv9BeJr/QHeY/z91l/8/dZb/P3aX/0R6 + m/9HfZ3/R3+d/0h/nf9Hfpz/R32d/0Z9nf9CeZr/PXOV/zZrkP8xYoz/KViG/yBMff8hTnz/J1WB/y9e + if84aZL/PHCW/0B3mv9EfZ7/R4Gh/0mDov9KhKH/SYKe/0mCnv9Lgp7/T4ah/1SKo/9ZjaT/XI+l/12Q + p/9ekaf/X5Oo/16Sp/9ekaf/XpGo/12Pqv9ajKv/VYiq/02DqP9FfaP/QXmf/0B5nf9DfJ3/SYKg/02G + ov9QiaP/U4mk/1WLpf9Vi6X/UYml/06GpP9IgqL/Qnyf/zt1mv83b5b/NGyU/zZslv89cZr/Q3ad/0l7 + ov9MfqX/Sn6i/0N5nP88c5f/OnOY/zlymP85cpj/QHmb/0eBn/9Lh6H/TYmk/1CLpv9UjKj/WI6q/1qP + qf9bj6j/XZCl/1yPpf9bjqX/W46l/1iNpv9Uiqb/T4Wl/0mAoP9DfJ3/P3ea/z11mP8/dJn/Q3ie/0Z6 + of9He6H/Rnyg/0V7nv9Depv/QXeZ/z1zlv85bpL/M2mO/y9kiv8oXYb/HlOA/x1Rf/8dUX//H1SB/yRY + hf8rX4n/MGSL/zVpjf82a47/NWyP/zFsj/8ybpH/M26U/zRulP8za5T/MWiS/zBlkf8yZpP/NWiV/zhr + lv86bpf/Om2V/zdqkv8yZY//LmGL/yhciP8mW4j/JVyL/ylgj/8uZZP/MmqW/zRtmP82bZf/NmqV/zNk + kf8sXIn/JlWC/yFPff8jU4D/JVaD/yZXg/8mWIP/JliD/yVYgv8hVH7/IlN//yBNd/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8YP1n/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HFZ4/wwfKf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8EChD/FzNQ/ypVhP8vWof/MVyJ/zFb + if8vW4f/LFqF/ypahP8qXYT/Kl2F/ytehv8tXoj/LF6H/yxeif8rYYr/KV6I/yVbhP8hVoD/I1eC/yVZ + hP8qXYn/LmGN/zJlkP8yZZD/LmKN/ylch/8lVoL/IlOA/yNWgv8pXoj/MmeP/zZtk/85cJX/PXOY/z91 + mf8+dJr/PnSb/z50m/8+dZv/O3KY/zlvlf82a5L/NGqQ/zRpj/80aY7/NGmO/zVqjv83a4//N2uP/zhq + kP84apD/OWuR/zpskv87bJL/PGyS/zhqkv8yZZD/K16M/yVaiP8jWIX/J12I/ytijf8waJH/NW6U/zpz + lv8+d5j/QXmb/0N6nP9Depr/Q3qa/0N6mv9FfJz/SICe/0mBn/9Kgp7/SoKe/0mBnv9JgJ//R36d/0J6 + mv89dJb/Om+S/zdrkP8uX4n/JFF+/xtHdf8cSHX/JlN//zBgif85bJL/PnOX/0R7nP9IgZ//S4Wi/0uE + oP9Kgp7/SICc/0mBnf9NhKD/Uoii/1aLpf9ajab/XpCm/1+Sp/9gkqb/X5Kl/2CRpf9ej6b/XY2p/1mJ + qv9ThKn/Sn6m/0N6of8+eJz/Pnia/0R+nf9LhaL/UIul/1KLpf9Vi6b/V4ym/1WMp/9Ui6b/UYml/0yF + o/9GgKL/Pnie/zlzmv81bpb/MmmT/zJokv86bpn/QnWf/0d6o/9Cdp3/O3CX/zdwlf86dJr/O3Wa/z54 + m/9Ff5z/SYSf/02Jov9Qi6X/U46o/1aPqf9akKr/XJGq/12RqP9ekab/XpCl/16Qpv9cj6f/W46p/1iM + qv9RiKb/S4Ok/0Z+oP9BeZz/PnWZ/z1zmf8/c5z/QHSd/0B2nv9Ad53/P3eb/z12mP88dZb/OnKU/zdu + kf8yaI3/L2WM/yleiP8jWIT/HVOA/x1Tgf8fVIL/IleE/ydch/8vZIz/NGmP/zZskP80b5L/NHCT/zVx + lf84c5j/OHGY/zZtlv81apX/MmeT/zJlk/80ZpX/N2mW/zlrlv85bJX/NmmQ/zJljf8tYIr/JlmG/yNX + hf8iV4f/JFqK/ylhj/8tZ5L/MWuU/zVsl/83a5j/MmSR/ytcif8jVIL/I1SB/yVWg/8nWoX/KFyH/ydc + hv8lW4T/JVuD/yNYgf8hVID/IVN//wweL/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wkX + IP8cWn3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xU8 + Uv8DBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8DBQj/Fi9I/yNOfv8gSnz/JE1//ydQgv8pU4P/LFaF/ytWhP8pVoL/KVmC/yldg/8qX4X/L2OI/zFl + i/8xZIz/MWWO/zFmj/8wZo//LGKL/yhdh/8lWoT/J1uG/yxgi/8wZI7/NGiS/zRokv8xZZD/LWCM/yhb + h/8kVIL/JFSC/yhZh/8uYYz/NGiR/zhtk/88cZb/PXKY/z5zmv8+dJv/P3Sc/z1zmv87cJj/N22U/zRp + kP8yZ47/MWWM/zBli/8xZov/M2aM/zNmjP80Z43/NmmO/zZpkP82aI//NWaP/zVmjv81ZY//NGSP/y9g + jv8oW4n/IVaD/x5Wg/8jXIf/KGCL/y5nj/80bZP/OXOW/z54mf9DfJz/RX2d/0Z9nf9Hfp3/R3+d/0uC + oP9LhKD/TIWg/02Gn/9Lg5//SoOg/0mBoP9Gfp3/Qnub/0B3mf8/dZj/PHCV/zVnjP8pV4D/Hkl2/xdC + b/8ZRHL/JlR+/zJjiv87bpL/QniZ/0iAnv9LhKD/TIah/0uDnv9HgJz/RoCc/0iBnf9OhaH/VIil/1iL + pv9cj6j/YJKm/2GSpf9hkaP/YI+j/16NpP9ci6f/WIan/1B/qP9Heab/QHaf/zx0mv88eZj/RIKd/0yJ + ov9RjKX/VIum/1aLp/9Xjaf/Vo2n/1WNp/9Ti6f/T4im/0mEpP9DfqH/O3Wc/zRul/8vZ5L/L2aS/zJo + lP87b5v/O26a/zhsl/8zaZL/Nm6W/zp1m/9Ae53/SIGe/0yFn/9OiKH/TYqi/1CMpf9Ujaj/V4+q/1qQ + qv9ckqn/XZGo/16Qp/9ej6b/X5Cn/12QqP9bj6r/V4yp/1OJqf9Nhab/R3+i/0N6nv8/dZv/PHCa/zxw + mv87bpr/Om+Y/zlymP85c5f/N3KU/zlzlP86cpT/N2+R/zZtkv8zaY//LmSN/ytgi/8mW4j/IFaE/yBW + hP8kWYf/KV6L/zBlkP81apL/NW6S/zVxlf83c5f/OXOZ/zp0mv86c5r/OXCZ/zVqlf8yZpP/MWSS/zFk + kv80ZpT/NmiV/zNlkf8zZY7/MWOL/y1fiP8oWof/IlSE/x5ThP8gVob/I1yK/ylkkP8uZpL/MmiV/zVq + l/8xZZL/KlyK/yVYhf8kWIT/JluG/ylgif8sY4z/K2SM/yliiv8oYIj/J1+H/yddhv8lWYT/H0pz/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xpObv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xtRcP8IGCL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DBgj/GDFE/ylWfP8nVH//IEt5/x1Gd/8dRnj/IEl7/yRN + f/8nUYH/KFKB/ypXg/8sW4X/Kl+E/y5kh/8yaIv/NGmN/zRpjv80aI//M2iR/zNpkv8xZ5D/LGKM/ylf + iP8oXYf/K1+K/zBkjv80aJL/NmqU/zNokv8wY47/LF+L/yhahv8mV4X/JFSF/yhYiP8sXov/NGeR/zpu + lf88cJb/PXGY/z5ymv8+cZr/O2+Y/zltlv81aZH/MWWN/y5iiv8tYYj/LWCH/y5hiP8uYon/MGOJ/zJl + i/8zZo3/NGeO/zRnjv8zZI3/MGCL/zBfjf8uXoz/K1uJ/yVWg/8iVYD/IViD/yNch/8oY4v/MGqQ/zRw + kv86dZb/P3qZ/0R/nP9HgJ7/SYGe/0mBnv9Lgp//TIOg/02EoP9Nhp//TIWf/0qDn/9IgaD/SIGg/0V/ + nv9DfJz/Q3yd/0R7nv9BdZn/OWuQ/y1bg/8fTHX/FkBs/xZBbf8cSXT/KVqB/zZqjv9Adpf/SH6d/0uE + oP9NhqL/TISg/0mCn/9Ffpz/Rn+d/0mBoP9PhaT/V4un/1yOqP9fkKj/YZCk/2KQo/9hjqP/Xouk/1uH + pf9Vgab/Tnum/0R1of86cJz/N3CX/z16mv9FhJ//Toqj/1OLqP9Viqj/Vouo/1eMp/9Xjqf/Vo6n/1SM + p/9Qiqf/TIen/0aBpP8+ep//NG+Y/y1nkv8sZZH/MGaT/zFmk/8xZpT/L2SR/zJolP80bJb/OnSb/0aA + n/9PhqD/VIqi/1OKo/9Ri6P/Uoyl/1SMp/9Xj6n/WJCp/1uRqP9cj6j/XI6m/12Op/9dj6j/XZGp/1uP + qv9XjKn/U4mo/02Fp/9IgKT/Q3ug/z9znP85bZj/OGyY/zVrlv80bJX/NG2U/zNuk/82cZP/OXSV/zp0 + lP88c5b/OnGV/zhuk/82bJP/M2iS/y5jj/8oXYr/JVuI/yZciv8sYY//MmeR/zRqk/80bpL/NXCU/zdy + lv85dZn/OnOa/zpymv84bpj/M2iU/y9kkP8uYY7/LV+N/y5gjv8uYI7/LmCL/y1fiv8tX4n/Ll+J/ypb + iP8mV4j/H1OD/xxSgv8fWIb/I1yJ/yhgjv8uY5H/MGOS/y9hkP8rXov/JlqG/yZahv8pYIn/LmeP/y9q + kf8va5D/LWqP/y5oj/8uZo//LWSN/ypgi/8oWoj/ChUh/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/DSU2/xtZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8PLkH/AwYI/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dx8s/ypX + ef8uYIf/LFyD/ydUfv8gSnf/G0R0/xdAcf8aRHT/H0p5/yJOfP8nVH//K1qE/y1fhv8vY4j/MmmK/zVu + jf81bI7/NWuO/zRqj/81apH/NGmS/zNokf8vZY//K2GK/ylfiP8rX4n/LmOM/zNnkf82a5T/NGmS/zFm + kP8tYo3/KV2J/yVYhv8jU4T/I1GE/yhXiP8uXo3/NWeS/zptk/86bpT/Om6W/zptlv85bJX/NmmT/zFk + jv8tYIn/Kl2G/ylchP8oW4L/KVyD/ytehv8sX4f/LmGI/zBjiv8xZIv/MWOL/zFhi/8vXYr/LVmK/ylW + hf8lVIH/IVF9/yRVgP8lWoP/KF+H/yxmjf8xbpH/N3OU/zx4lv9CfZn/RX+b/0mCnf9Lgp7/S4Kf/0yD + n/9Mg5//TIOf/0yDnv9LhJ//SIGg/0eAn/9GgJ//RX+e/0Z/n/9Hf6D/R36h/0d6n/9Ab5b/NGGJ/yJO + d/8UP2r/FD9q/xlIcf8lVn3/M2eL/z91lv9FfZz/S4Sh/02Hov9NhaL/SoKi/0Z/oP9EfZ//Rn+g/0yD + pP9Uiaf/W42o/16Opv9gjqP/YI6i/2KOo/9fiqX/WoWm/1N+p/9Jd6L/P3Gd/zRrl/82c5r/PXyd/0aF + oP9PiqX/Vour/1eKq/9Xi6j/WI2n/1iPp/9YkKf/VY6n/1KMp/9Oiab/SYSl/0J+of86dZ3/MWyV/ypk + j/8rY5D/K2GP/ytgj/8uZJL/M2mW/zZumf9AeZz/TISg/1WLo/9XjKX/V4ul/1WLpf9Ui6X/VYyn/1aO + p/9YkKj/WY+o/1qNqP9bjKf/XI+o/1yQqf9bj6n/WI2p/1WKqP9Qh6f/TISm/0h/pP9Ee6H/P3Od/zpu + mP81apX/MmmU/zFqkv8xbJH/M26S/zdzlP87dpb/PniY/0F4mv9Adpr/PXOZ/zxymP85b5j/NGiU/y5i + j/8qXov/Kl6N/y1ikP8xZ5L/M2qR/zNskf8ybZH/NG6T/zZvlf83cZf/N2+X/zRrlP8wZpD/K2CM/yld + iv8oW4j/KVuI/ylciP8oW4f/KV2G/ypeh/8rX4j/LV+L/ypci/8lWIf/HlSD/xlQf/8dU4L/IlaF/yhb + iv8sXo3/LF2M/yhaif8lWYX/JVuF/yxkjP8wa5H/M3CU/zNwlP8yb5P/MW2T/zJslP8waJL/LGOP/ype + jP8dPl7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BBQb/Gld8/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8XSWj/BREY/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/ChIb/yRJav8uYYr/LF+I/y1fhv8sXIP/KVZ//yNPe/8bRXT/FkBw/xU/ + bv8aRnP/IE13/ydXf/8sX4T/MGSH/zJoiv80bIv/NW2M/zVujf81bY3/NGuP/zVrkf82a5T/NWqU/zFm + kP8sYoz/KF2H/ylfiP8sYov/MWaP/zRokv81aZP/M2eR/y9kjv8rX4v/JVmG/yFTgv8fT4D/I1KE/ylZ + i/8tYI3/MmWO/zZpj/82aI//NGeP/zRnkP8zZY//L2GL/yxeiP8oWoT/JViA/yVYgP8mWYL/J1qC/ylc + hP8rXob/LF+G/ytehf8tXYb/L1uI/y9XiP8rU4T/JE9//x9Mef8hUHv/JFR+/ydagv8sYYj/MGiN/zRv + kf85dpT/PnqW/0J+mP9HgJv/SoGd/0uBnv9MgZ//TIGf/0uBnv9LgZ3/SoKe/0qCoP9HgJ//RX+e/0R/ + nf9FgJ7/R4Gg/0mCof9Jf6D/SHug/0d3nf88aZL/LVmC/x1Icv8POmb/F0Vv/yJUe/8wZon/O3OT/0N7 + m/9IgqD/TIOi/02Do/9KgaP/RX2h/0J7of9DfKL/SYGk/1CGpv9Vi6b/Woyk/1yLof9di6L/Xouk/16J + p/9ZhKj/T3yl/0Rznv84bJj/Nm+Z/zh2m/89f5//R4Wi/1GJpv9Yi6v/WIuq/1iLqf9Yjaf/WpCo/1qS + qP9XkKf/VI6m/1CLpf9LhqX/RoKj/0B8oP86dJz/MWqV/yphjf8nXov/KV+N/y9kk/81bJr/OnOa/0R9 + nf9Ph6L/V4yn/1mMqf9ZjKj/WYyn/1iMp/9YjKf/WI6p/1iPqf9Yjaj/WYqo/1qMqP9ajqj/W5Cp/1mO + qf9Wi6n/U4ip/06Fpv9LgqT/R36i/0R6oP9Adp3/OnCY/zVslf8ybJT/MmyT/zJuk/82cpX/OnaW/z96 + mv9DfJz/Rn2e/0Z7nf9EeZ3/Qned/z5ymv86bJf/M2aS/y1gjv8rXoz/LGCN/zBlj/8xaI//MWmP/y9o + jv8vaY7/MWuR/zNsk/8ya5L/MGiQ/y1jjf8qX4r/JVqG/yNYhP8lWIT/JVmF/ydchv8oX4b/KmCH/y1j + i/8vY4z/LWCN/ydbif8iVob/HlKD/xpMfv8dTn7/IlOD/ydXh/8oWYj/JVeF/yJXg/8nXof/LGaM/zJu + kv81cZX/NXGU/zNwlP80cJX/NG6W/zJrlf8vZpL/LmGP/y1djP8FCxD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8RNkv/Gll8/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/ETRI/wMFCP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwYJ/yBAXP8wYY//LV+L/y1f + if8sYIj/LWCH/y1ehf8sXIP/KFaA/yJPe/8cSHX/GUVz/xhFcv8fTnj/KFl//y5ihP80aYr/NmyM/zdt + jv83bY7/N22O/zVtjf80bI7/NmyR/zhtlf84bJb/M2iS/y1ijP8pX4n/J12H/ythiv8vZY7/M2eR/zVp + k/80aJL/MWaQ/y5ijf8oW4f/IVOB/x5Ofv8fTYD/JFOF/yhZh/8qXYf/LGCI/y9hiP8uYIj/LV+J/y1f + if8tX4j/KlyG/ydZg/8mWID/JViA/yZZgv8nWoP/KFuE/yhbg/8oW4L/KFqC/ylXgv8rVIP/K1CC/yVM + ff8fSHf/Hkl3/x9MeP8iUn3/KFqC/y5ih/8zaIz/OHCR/zx2k/8/epX/Q32X/0d/mv9Jf5z/TH+f/0x/ + oP9Mf5//TH+f/0l/n/9JgJ//R4Cf/0V/nf9DfZv/Q3+d/0WBn/9HgqD/SoKh/0uBov9LfaH/SHif/0Ny + mf85Zo//KleB/x1Ldv8VRXD/HlF6/ythh/82bZH/P3iY/0Z8m/9Lf5//TYCg/0Z6oP9Bd5//PXSf/z52 + oP9EfKL/S4Kk/1GHo/9ViaL/WIih/1qIoP9ah6T/WoWn/1SBp/9JeKD/O22Y/zVrlf82cJj/Onmc/0B/ + nv9IhaD/Uomj/1WKpv9Wiqb/WIyn/1mOp/9bkaj/W5Oo/1qTp/9WkKf/U46m/02Jpf9JhaT/RX+j/0B5 + of83b5n/L2aS/yhei/8pXoz/L2SS/zVtl/88dpn/RX+d/06Go/9Viqj/Wo2r/1qNqf9ajaj/XI2o/16O + qv9bj6r/WY6p/1qNq/9ajKr/Wo2p/1qPqf9Yjaj/V4up/1WKqf9Sh6j/ToSm/0qBo/9HfqH/Qnme/z51 + m/84cJj/N3CX/zVwlv81cZb/OHOX/zt3mP9AfJv/RX6d/0iAoP9LgaH/SoCg/0l9n/9Gep7/RHed/z9x + mv85apb/MmOQ/ypciv8qXor/LGGK/y5kjP8uZoz/L2aN/y5ojf8tZ43/L2iP/y9oj/8uZo7/K2ON/yhf + if8lW4b/IliD/yJXgf8kWYP/J12G/ytiiv8uZo3/MWqP/zJoj/8wZo7/K2GL/ydZiv8kVYf/IlCD/x9M + fv8fTH7/IlGB/yJTgf8iVIH/JFmD/yhgh/8tZ43/NG+T/zdylf83cpX/NW+T/zVvlP81b5b/NWyW/zFm + lP8wYpL/MF6Q/xgxTP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcVHv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/HFZ5/wkYIP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xgvQv8xYo3/MmaT/y9ijv8tX4r/LF+H/y1hiP8vY4n/MWSJ/zBiiP8vXof/KlmE/yVT + gP8gTnv/Hkx5/yFSe/8nWoD/MGSG/zZsjP86cJD/O3CS/zlukP84bo//NWuP/zVsj/84bpL/OW6W/zhs + lv81aZT/MGSP/ypfiv8oXoj/KmCK/y9ljv8zaJH/NWmT/zZplP8zZ5L/MGSP/yteiv8kVoT/H01//x1L + fv8fToD/I1SC/yVYgv8nW4P/KF2C/ylcgv8oWYL/KFmD/ylbhP8pW4T/KFqD/ylagv8pW4P/Kl2E/yxf + h/8qXYb/KVyF/yZZgv8pWIH/KlOA/ylNfv8kR3n/HUN0/xpCcP8aRHL/HEd1/yJQev8pWYH/L2KG/zVp + jP87b5H/PnWU/z93lP9DepX/RnyY/0h7mv9LfJ3/Tn2h/09+ov9LfaD/SX6g/0d/of9EfZ3/QHua/z97 + mf9Df53/RoKf/0mEof9Lg6H/TIKh/02Bov9MfaH/R3ad/z9ulv83ZY7/KVqD/yFTfv8eU37/JVyH/zFq + kf86cZX/Q3eX/0p7mP9GeJv/P3Kb/zhtmf82bZn/N2+a/zx1nf9EfJ//SoCf/0+Dn/9Sg57/U4Kg/1WD + o/9Ugaf/Snmh/z5wmf8zZ5L/MmqS/zNwlv85eJr/QH2d/0iEoP9PiKH/U4qi/1WKpP9YjKb/WY6m/1yR + p/9dk6f/XJSn/1mTp/9Vj6f/UIum/0yIpf9Ig6T/Qnyh/ztym/8zaZP/LWOP/yxhjv8tY5D/NG2U/zt2 + mP9DfZ3/TYSl/1OIqP9Xi6r/WIyq/1uMqP9djan/Xo6p/12OqP9ajaf/Wo2q/1uOrP9bj6z/WY2q/1eK + qP9Viaj/U4en/1GGpv9Ng6P/R36g/0R7nv9CeZz/O3SY/zlzl/85dJn/O3ea/zx4m/9AfJz/Q3+e/0aA + n/9KgqH/TYSj/06Eo/9Og6L/TYGh/0l9n/9Fep//Q3We/z9wmv82Z5P/Ll+M/yhbhv8nXIb/KF6H/yph + if8sZYv/LWaM/y5njf8vaI7/L2iP/y9oj/8uZo7/KWGL/ydeiP8kWoT/I1mD/yRbhP8oYIj/LmaN/zNs + kv81bpP/NW6R/zVtj/8xZ47/LWCM/ytZi/8oU4b/JU+C/yFNf/8eS3v/H059/yBTfv8jWID/KV+F/zBp + jf82cZT/OXSX/zlylf83b5T/N26U/zhul/81apb/MmWV/zBfk/8rWY7/IUl1/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xhMbP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xZBWP8DBQf/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woUHP8rWHj/M2qU/zNqlP8xZ5L/MGWP/y5h + iv8uYYn/MGOK/zNmjP81aI3/NmmO/zVnjv8yYYv/LlyH/ylYhP8kVYD/JVZ//ylcg/8vY4j/N2yO/zxw + kf89cZP/PXCT/zhtkv82bJH/NmuR/zltlP85bpb/OG2W/zVplP8vY47/Kl6K/yhciP8qX4r/L2SO/zNo + kf80aZL/NWiT/zZplP8zZ5H/LmCN/yhXh/8hToD/Hkp9/x5Ofv8iU4D/JVeB/ydbgf8nXID/Jlt//yRY + fv8lVoD/JleB/ydYgf8qW4P/LF2F/yxehf8vYYj/MWOK/zBji/8uYYj/LVyF/y5ZhP8wVIH/Jkl5/x5B + cf8XO2v/Fz1s/xc/bv8bRXL/Ik95/ylZf/8vYob/NWqM/zpvkf88cZL/PXOT/0F2lP9Ed5b/RnaY/0l4 + nP9MeqD/THyi/0l6of9FeqD/Q3qd/z95mf87dpb/P3ya/0N/nf9Ggp//SYSi/0yEov9Ng6H/T4Ki/02A + ov9Kep//Q3OZ/zprkv8xZIz/KV6H/yZdhv8nYYv/LGaR/zVrlP8/cZT/Q3SV/0Bxlv85bZf/MmiU/y1k + kf8tZpH/NW6W/zx1mP9CeZn/Rnya/0t9m/9LfJ7/TXyj/0l4oP8/cZr/M2eS/y9okf8taY//L26R/zd0 + l/8/e5v/R4Gf/06Hov9SiaP/VIqj/1aLpP9Zj6b/XJGm/12Tpv9clKf/WpOn/1eQp/9Sjab/TYmm/0mE + pf9DfaH/PXSc/zVrlf8vZJD/LWKO/y1lj/8xbJL/OHSX/0F7nv9JgaP/T4an/1OJqP9Xiaf/WYqo/1yL + qP9cjKf/Wo2l/1iMo/9ajaj/XI+s/1uPq/9Yi6r/VYin/1OGpf9ShaX/TYOj/0l/oP9Depz/QHeZ/zx2 + l/86dJb/OnWW/zx4mf8/fJ3/RICh/0iEov9JhKH/S4Sh/0+Fov9QhaP/UYWj/1GFo/9OgqH/S4Cg/0h+ + oP9Fep//P3Ob/zdolP8uX4z/J1qG/yRYg/8kWYP/Jl6F/ypiif8uZ43/MWqQ/zFrkf8zbJP/M22U/zJr + k/8vaJD/K2OM/ydfiP8mXYb/Jl6G/ylhif8vaI//NW2U/zZvlf84cZP/Nm6R/zVqkP8yZY7/L16N/yxY + iv8oUoX/Ikx+/x5Le/8dTXr/HlF7/yJYf/8pYYb/M2uP/zhxlf86c5b/OnKW/zpvlf86bpX/OGyW/zRm + lf8wX5P/K1mP/yVTh/8gToL/CRgn/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EjJH/xlZ + fv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x1c + f/8OKTn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMG + Cf8cOEv/OHCU/zVtkv81bZT/Nm2V/zRsk/8yaI//MWaL/zBli/8zZ4z/N2uP/zltkf86bpL/OW2S/zhr + kf8zZY7/Ll+K/ylbh/8nWYT/KVuE/y9iiP82aIz/O22Q/z5vlP89b5X/O26U/zdrkv81apH/NmmS/zVo + k/82apT/M2aS/y1gjP8oWoj/JFmE/yZbhf8qX4n/LWOM/zBnj/8yZ5H/M2aR/zNlkf8xYZD/K1eK/yNP + gv8fTH7/H059/yNTgP8nWYL/KVyD/ydbgP8lWnz/JFh8/yRXff8mV3//KFmC/ypbhP8sXob/MGKI/zJk + iv80Zoz/NGeN/zRmjP80YYr/NFyI/y5Sfv8kR3T/GDxp/xY8af8VPGr/Fj5s/xxFcv8iTnn/KFZ+/y9g + hv82aI3/OW2Q/zpvkf88cJL/PnOT/0F1lf9EdJf/SHSc/0p2n/9Id6D/RHef/z90nP89dJn/OXOV/zx3 + l/8/fJr/RIGf/0eDoP9KhaL/TYWj/0+Fo/9Pg6P/TX+h/0l7nv9Ddpv/Om6V/zFnjv8tZYz/KmSM/ytl + jv8tZpH/MGaT/zZpkv83a5L/N2uT/zVok/8tY5D/KGGO/ypjjv8waZD/N3CT/zxzlf8+dJb/QnWX/0V2 + nP9CdJz/PXCa/zRplP8waJL/LWmR/ypqkP8wbZL/NXKU/zx4l/9Ff53/TYej/1KKpf9Ui6X/Voyl/1mO + pf9dkqb/XZOn/1yUp/9akqj/Vo+m/1GMpf9NiKX/SYSk/0R+of89dpz/N22W/zBmkP8rY43/KmWM/y1q + kP81cJb/Pnic/0d+ov9Mg6X/UIan/1SHpv9Xh6b/WIqm/1iKpP9XjKH/WIyk/1qNp/9bjqn/WYyp/1aJ + qP9UhaX/UYSj/06Bov9JfZ//Q3md/0B2mf88dZf/OnWV/zt3l/89eZn/QH2b/0SAn/9KhaP/TYel/06H + pP9PhqP/UYai/1GGof9Th6L/Uoai/1CFov9NgqH/SoCg/0Z8n/9Adpz/N2uW/y5hjf8nWob/IleB/yRZ + gv8lXIT/KWKI/y5ojf8zbZL/NW+V/zdxlv84cpj/OHKZ/zZvlv8xapH/LWWN/yhgiP8oYIj/KmOK/y9o + j/80bZP/Nm+U/zdwlP84b5P/NmyT/zNnkf8yYpD/L1yN/yhThf8hS33/HEl4/xtMd/8cUXn/IVh+/ypi + h/8xao7/OXGV/zxzmP88cZb/PG+V/ztrk/81Z5L/LmCQ/ypajv8kU4f/Hk2C/xxKfv8TM1X/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ECw//HFl//xpZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aUXH/BxIZ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NGyX/MWKB/ztzlf88dJT/OnOU/zlylv84cZb/OHGW/zdu + lP80ao//NGmN/zVqjf84bY//PXGU/z1xlP87b5P/O2+U/zdrk/8yZo//LmGL/ylbhv8nWYL/LV+F/zRl + if85aI3/OmqQ/zprk/85a5L/NWiR/zNmj/8xZI7/MGOO/zBijv8uYI3/KlyK/yRWhf8gU4H/H1N//yJX + gv8nXIb/K2GK/y1kjP8uYo3/L2GO/y9djv8sV4v/JE+C/x5Lff8fTXz/IlJ+/ydZgv8oW4P/J1uB/yVa + fv8jV3r/JVZ8/yZXfv8pWoL/K1yF/y1ehv8wYYj/M2WK/zRmiv80Zov/NWWM/zlkjf80XIX/KlB5/x5D + bP8dQmr/GkBr/xdAbP8aRHD/Hkl0/yNPeP8mVHz/LVyD/zJjiv83aY//Om2R/ztvkf89cpP/P3OU/0Fz + lv9Ec5r/RXSc/0R0nv9AdJ3/O3GY/zhvlf85c5X/PXiZ/0F+nP9EgZ7/SIOg/0yFo/9OhqT/UIak/06D + o/9MgKL/R3ud/0F2mv85cJX/M2yT/y9qkf8sapD/LWiQ/zBnkv8yZ5P/LmSQ/y1kj/8wZo//L2WQ/y1k + kP8sZZD/LWeQ/zBqkf80bZD/OHGS/ztxlP88cJb/PG6W/zlslv8zaJT/MGeU/y9plP8sa5P/MG6V/zRx + lv83c5f/O3SV/0F7mf9JgZ//T4il/1SLpv9WjKb/WY6l/1uQpv9bkaj/W5Kp/1iQqP9Vjaf/UIql/06H + pf9Jg6T/Q32h/z11m/82bZb/MWmS/yxnjv8nZIv/KmeN/zBrkf86dJn/RHyf/0qBo/9OhKT/UoSl/1SH + pf9ViaX/VYuj/1eMpP9YjKf/Woyo/1iLp/9UiKf/U4am/1CCo/9NgKD/SXye/0N2nf8/dJr/PHSZ/zpz + l/87d5j/Pnub/0KAnf9FgZ//SYWi/06Ipf9Riab/Uoil/1KHpP9Th6L/VIeh/1OGoP9Th6D/UYWg/06D + oP9MgZ//R32f/0F4nf85b5j/MGWQ/yhch/8kWYL/I1qB/yZdhP8rY4n/MGmO/zVuk/84cpf/OnSZ/zp1 + mf88dZr/PHWb/zlymf8za5L/LWWM/ylhif8pYon/LmeO/zNsk/81bpX/Nm6U/zdulf83bJT/NWmT/zNl + kv8uXo7/KFWG/yBNfv8aSXf/GUt3/xxRef8jW4H/KGKG/zBqjv83b5T/PHGX/z1wl/88bZT/NmeR/y5f + jf8nWYv/I1SG/x5Ogf8aSn3/HEt+/xxLff8CBAf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8aSmf/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWn7/Ez9W/wMG + CP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DBgn/Hj1S/zhw + lf88dJT/QXiV/0B4lv8+d5f/PXaX/zx2mf88dpn/O3OX/zhwk/83bJD/N2yP/zlukf87cZL/PXKT/z5z + lP88cJT/OW6U/zdrk/8yZZD/LV+K/ypchf8rXYP/MGGG/zRjif80ZYz/M2WO/zJljv8wZI7/LmKM/yxg + i/8rX4r/LF6L/ytci/8oWYn/IVCC/x1Nfv8bTXz/HFF9/x9Vf/8lW4T/J12H/ydch/8oWIf/KVaI/ydS + hf8iTID/HUl7/x1Kev8fT3z/I1WA/ydagv8nW4L/JFl//yRXff8kVnz/J1iA/ypag/8rXIT/Ll+G/zBg + hv8xYob/MWKG/zFhh/8xXoj/MlyG/y5Vfv8jSnD/HkVr/x9GbP8fR2//IUpz/yJMdf8jTnf/IEx1/yJQ + ef8oV3//L16H/zNki/83aI//OWyQ/ztukv88cJP/PHGU/z9ylv9Ac5j/P3Sa/zxxmP84b5X/Nm6T/zt0 + mP8/e5v/Q3+e/0aBn/9Ig6D/S4Si/06FpP9PhaX/T4Sk/0qAov9Fe57/PXWZ/zhxlv81cJX/MW+V/zNv + lv80bJX/NGmU/zFnkv8tZY//KmKN/y1mj/8waJH/MGmT/zNulv82cZf/N3KW/zlzlf86c5X/PHOW/zpw + lf82a5T/L2WQ/y1kkf8vaJb/MGyY/zJvmf82cpr/OXSb/zl0mf86c5X/PXaV/0N7mv9JgJ//UIak/1WJ + pv9Wi6X/WI2m/1mOqP9Zj6r/V46p/1OLp/9PiKb/TYam/0mCpf9BeqD/O3Sb/zZvlv8ybZT/L2yT/yxq + kP8raI3/L2qQ/zZvlP8/d5v/R3+h/0yCo/9Qg6T/Uoal/1SJpf9ViqT/Voql/1iLqP9Wiqj/U4in/1CF + pf9NgKT/Snyh/0h6nv9Ddp3/PnGb/zpvmf85cZj/O3Wa/z97nf9DgaH/RoOi/0mGo/9Oiab/UImn/1OJ + p/9Viab/Voml/1aIo/9Wh6L/Voig/1WHn/9Thp//UYSf/02Bnf9HfJ3/QXic/zpxmP8yZ5L/K2CL/yZb + hf8lWoP/KF+F/y1liv8zbJD/N3CU/zp0mP88dpn/PHeb/z13m/89d5r/PHWa/zpymP80bJL/LmaM/ytj + i/8tZo7/MWqT/zNrk/81bJX/NWuU/zVqk/81aJP/M2SR/y1ejP8nVof/IE5//xpKef8ZTHf/HlV8/yRe + g/8qZYn/L2mO/zRtk/84b5X/Om6V/zlrlP8zZZH/KVyM/yRWhv8fUYL/G0x+/x5Ogf8fT4L/Hk6A/w0i + N/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xAoOP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1p+/xAuQf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DRsk/zNmiv83bpT/O3KW/z93lv9De5f/RX2Y/0N8mP9AeZn/P3ma/z95 + m/89dpn/O3OX/zlvkv84bZD/OW6R/zpwkv88cpP/PXKT/z1ylP86b5T/OG2V/zZpk/8yZZD/L2CI/y1e + hf8tXoP/LV6F/y9gif8vYYr/LGCK/ytgiv8qX4n/KF6I/ypgif8rX4v/Kl2L/ylaiv8kVIb/HEt9/xlJ + ev8bS3v/HlF+/yFXgf8kWIT/JFWD/yNSgv8iToD/IE1+/x1Kev8aR3j/GUZ2/x1Mev8iU4D/J1qE/ydZ + hP8lV4H/I1V+/yJUff8lVn7/KViC/ylYgv8qWoL/LFyC/yxcgf8rW4H/KliB/ypVgf8oUnz/I0x0/x9G + bP8iSm//JExy/yhRdv8tV3z/LVh+/yZSeP8gTHT/HUly/yNQef8qWIL/Ll2H/zFiiv81Zo3/OGqP/zls + kv86bpL/OnCT/ztylP87cJT/OG2T/zRrkf83cZT/O3aX/0B7m/9EgJ//SIKg/0mBoP9KgqH/TIKj/02D + pP9Mg6X/SYCi/0J6nf87dZn/OHSY/zZ2mv83dZr/OnSa/zxzmv85b5j/M2mU/y5lj/8tZo//L2mR/zRu + lf83cpj/OnWb/z55nP9BfJ3/QXuc/0F6m/9BeJv/PXOY/zZsk/8uZY//LWWQ/y5plf8ybpv/N3Od/zt3 + n/89d57/OnSa/zlyl/86cpX/PXWW/0R7m/9NgqH/Uoaj/1KHpP9Sh6X/VIqn/1aMqf9Wjqv/UYmo/0yF + pv9Kg6X/RX6i/z53nv85cpr/N3KZ/zZxl/81cZb/M2+V/zNvk/8ybZL/Nm+T/zxzlv9CeZv/SX+g/02C + o/9PhKT/UYek/1OIpf9Th6X/U4em/1CFpP9Og6T/SoCj/0d6ov9Ed6D/QHWd/z1ym/84bpn/NmyX/zdw + mP88eJz/Qn+h/0eEpP9Kh6X/Toqn/1CJp/9Siaf/VYqo/1eLqP9Yiqf/WYql/1iJov9YiaH/V4ig/1SG + nv9RhZ3/TYGd/0h9nP9DeZz/PnOa/zZrlP8uY47/KFyI/ydbhv8qYIf/L2eM/zVtkf86cpT/PHWX/z13 + mP8+d5n/Pnia/z53mf89dZj/PHSX/zpxlv80a5H/L2eP/y9okf8uZ5D/MGiQ/zFokf8xaJH/MWiR/zJm + kP8wYo7/LF2K/yZXhf8eTX7/Gkp6/xlMev8eVn7/JF+E/ylmiv8tao//Mm6T/zZvlf83bJX/NWiU/zFk + kf8pXIv/IlSE/x5QgP8gUoP/IlSF/yNUhv8iUoX/G0Jq/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/BgwP/x5bfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xhUdf8KHSn/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAcJ/yJAVf85cJX/OG+V/zhw + lv87dJf/QHmZ/0R9mv9Hf5r/RX2X/0N7l/9Ce5r/QXqc/0B5nP88dZj/OXGU/zdukf82bZD/OG+S/zpy + k/88c5T/PHKU/zxxlP87cJX/OGyU/zVokf8xY4v/Ll+G/ypcg/8qXIX/K16G/ytfiP8rYYn/KmGJ/yhh + iP8pYon/K2OL/yxjjP8uYo7/LV+P/ylbjP8hUoT/G0t9/xpKfP8fUID/IlWD/yJVgv8iU4H/IlCA/yBN + fv8dSnr/HUp6/xpHd/8YRnb/Gkh4/yBQf/8lVoP/KFmG/ydYhf8jVH//IFF8/yFRfP8jUXz/JFJ9/yRS + ff8kU3v/JFN6/yNRev8hTnn/IU15/x9KdP8bRm3/Ikxy/ydQdf8qVHj/Ml2A/zZihP8zYYT/Klh7/yJQ + df8eTHP/Hkx2/yJQe/8mVYD/KluE/y1eh/8xY4z/NWeP/zZpkP82a4//OGyQ/zZrj/80aY//NWyS/zdw + lf86dpf/P3mb/0N+nf9IgZ//SICe/0l/n/9KgKH/S4Gj/0mAo/9FfqD/QHmb/zt3mf84d5r/OXmd/z56 + nv9Dep//RHif/z50nP84bpf/M2qT/zBpkf8xa5P/NXCX/zx3m/9BfJ//RH+g/0iBof9Lg6P/S4Gi/0d+ + n/9Dep3/PHOY/zVtlP8xa5T/L2uU/zRvl/87dZ3/P3mg/z96of88dp3/OHCX/zdvlP86cZX/Qnia/0uA + oP9OgqP/ToOj/02Do/9OhKT/UYel/1CIpv9KhKX/RH+i/0J8ov8/eaD/PHWd/zt1nP87dZz/OnWb/zt2 + m/87dpr/OXSY/zpzl/85cZX/OXCT/z51l/9CeJv/SH2f/0yCov9MgaL/TIGi/02Cov9KgaH/SH+g/0d+ + of9FeqH/Q3ig/0F3nv89dpz/OnOZ/zdwmf81bZf/NnCY/zp2nP9CgKH/R4Wk/0yIpv9Oiaf/UImn/1KJ + p/9Viqj/WYup/1yNqv9ai6f/Woql/1mJo/9XiKD/VYef/1GGnv9Mg5z/SoCd/0d8nf9Dd5z/PHCY/zNm + kf8sXov/KVyI/ypfiP8vZYv/NW2Q/ztylP89dZb/P3eX/z94l/8/eJj/PneY/z51l/88c5b/OnCV/zZs + k/8yaZH/L2aQ/yxkjf8rY4z/LGSM/y5kjP8uZI3/LmKL/y1giv8rXYj/JliE/yJSgP8cTHv/G058/x5U + gP8jXYb/KGWL/yxpj/8vbZL/NG6V/zRqlf8zZJP/Ll6P/yZYhv8gUoD/HU9//yFThP8mWIn/J1iK/yZW + iP8jU4X/BAoQ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GUtm/xtZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8XTm3/BxIZ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/w4YHv9Ab4z/Qnic/z10mf85cJf/N3CW/zp0mP9AeZv/RX6d/0eAnP9Gfpj/Rn2W/0V9 + mP9Ffpz/Qnuc/z53mv86cpb/N2+S/zVukP81bpD/OXGT/zx0lP88c5T/PXSV/zxxlv87bpb/OWqT/zRl + jf8tXof/KVqE/yhbhf8qXYf/LWKK/yxji/8rZYz/K2aL/y5ojf8vaY7/MGmP/zFokP8yZpH/LV+O/yZY + if8iUoT/H0+B/yJRg/8lVob/JliG/yVWhP8kU4L/IlKA/yJRf/8hUH7/Hk18/x1Le/8dS3v/Hk19/yNS + g/8nV4b/J1aF/yVUgv8gT3z/HUx4/x1Kdv8eS3b/Hkp2/xxJc/8cR3L/GkVx/xtGc/8bRnL/GURv/yFM + dP8pVHv/Llp//zRgg/86Z4j/PmuL/zdmh/8vXoD/KVd6/yRTef8gTnb/H014/x5NeP8jU3//J1iD/ypb + iP8uX4n/MGKL/zFljP8zZo3/MmaN/zRoj/82bJL/OHCU/zt0l/8+eJn/Qnyc/0V9nf9GfZz/R32d/0l+ + oP9IfqH/Rn2g/0J7nv89eJr/OXaZ/zZ2mf8+e53/RX6h/0p/ov9JfqP/RHqf/z51m/83b5b/NG2U/zNs + lP82cJf/PHaa/0N9nf9Jg6H/TIak/1GHpf9Sh6b/T4Sl/0t/of9Ee53/P3ea/zl0mP82cJX/OHGW/zt0 + mf8/eKD/QXuk/0B6ov88dZ3/OG+X/zlvl/9AdZv/RXue/0p/ov9LgKL/SX6g/0l/oP9KgaH/R4Ch/0J8 + oP89eZ7/O3ie/zt2nv88d57/Pnie/z95n/9CfKD/Q32f/0J8nv9Aep3/Pnea/z10mP88cpX/O3CU/z1y + lv8/dJn/Qnic/0R6nf9Eepz/Q3qc/0J6m/9Bepz/Qnme/0J4n/9BeJ//QXqe/z96nv88eJv/OHSZ/zhx + mf83cZn/Oneb/z58nv9FgqL/S4el/02Hpf9Qh6X/Uoim/1WJp/9Yi6n/Woup/1uLqf9Ziab/WIik/1iI + ov9XiaL/VIig/1CGn/9Ng57/S4Cf/0Z6nv9AdJr/OWuU/zBijf8qXIj/Kl2I/y5jiv80a47/OnGS/z10 + lP8/d5X/QHiW/0B3lv8/dpb/P3WW/zxzlv85bpT/NWqT/zBmkP8sYoz/KWCK/ylgif8qYor/K2KJ/y5j + iv8uYor/K1+I/yteh/8pW4X/JVeC/yJUgf8fUoD/IFWC/yRciP8mYoz/KmiP/y5sk/8xapT/MmWU/zFg + kv8oWIn/IFGB/xtNfP8cTn3/HlCB/yNUhf8nWIn/J1eJ/yNThf8RLUj/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8SKjj/HFp9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/GEpo/wIGCP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8jOkf/ToOk/0qAov9Fe5//QHec/ztz + mv84cZj/OnSZ/0B5nP9EfZ7/R36d/0d+mv9HfZf/SH+Y/0h/mf9Gfpv/Qnqb/z11mP84cJT/NG2Q/zRt + kP84cZL/OnOT/z11lf89dJb/PXKW/zxvmP86a5b/M2SP/y1eiv8oWYb/JlmG/yldif8tYoz/MGiQ/zBq + kf8va4//Mm6R/zRvkv81bpL/NW6T/zRpkv8xZI//K12L/yVXh/8kVYb/JVeH/ylbiv8pXYr/KV6I/ylb + h/8qW4f/KluH/yhZhf8lVYL/IVCA/yBOf/8fTX//IE6B/yJRg/8jUoL/IVGA/yBNe/8cSXb/GUdy/xpH + cv8ZRXD/F0Nu/xQ/av8VP2r/GEFt/xhDb/8dSnP/J1R8/zFehP82Y4j/O2iL/0Fvj/8+b47/PG2M/zZn + hv8xYoT/K1uA/ydWfP8gUXn/H096/x9PfP8iU4H/JFSC/ydYg/8qW4X/LF2H/y5fif8wY4v/NGeQ/zdr + k/86cJX/PHSX/z53mP9AeJr/Q3qb/0V7nP9Ge53/RXqd/0R7nv9Cep7/Pnic/zl2mv82dJf/OniZ/0N/ + nf9Mg6L/ToSk/02Dpf9KgaT/Q3me/zxzmf83b5b/NG6U/zZwlv87dZn/QXuc/0mDoP9RiaT/U4qm/1aL + p/9Viqf/U4al/02Cof9Hf57/Qnub/z52mP89c5b/PXSZ/z52nv9BeaP/Qnul/z93of87cpz/OXCZ/ztx + mf8/dZv/Qnid/0R6nf9DeZv/Qnma/0J6nP9Aep3/PXed/zt3nf86d53/O3id/0B7of9DfaL/RX+j/0iD + pf9Jg6X/R4Ci/0V9oP9Cep3/PnaZ/zxylv85bpT/OGyU/zhtk/85b5T/OnGV/zpylv87c5f/OnOX/z52 + nP8/d57/QXef/0N7oP9EfaD/RH6h/0J9oP8+eZ7/PHac/zt1m/86dpv/PXqc/0J/nv9HhKL/TIaj/0+H + pP9SiKb/VYmo/1eJqP9Xiaj/WYmo/1mJp/9XiKX/Voik/1eJpP9Wi6P/Uoih/1CFof9OgqH/S3+g/0V4 + nf87bpb/MmWP/ypdiP8qXYb/LWGI/zJnjP84bpD/PHKS/z51lP8+dZP/PnWT/z90k/8+dJP/O3CU/zdr + k/8zZpH/LmKO/yleif8mXIb/KV+I/ypgiP8sYon/LmWK/zBmiv8vZIn/LWOI/yxhh/8rXob/KFyF/yZa + hf8lWof/JFuJ/yZfjP8oY47/LGWS/y9kk/8wX5T/K1qN/yJShP8aSnv/GEl5/xhJef8ZS3v/Hk9//yJS + g/8lVYb/JFSF/xxHcf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wUMD/8cWn3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xhCW/8DBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8FCAn/O2N4/1GGpP9PhKX/S4Gj/0d9of9Eep//P3ac/zt0mv87dJr/PXec/0J6nv9FfJ3/R32c/0l+ + mv9Jf5n/SoCa/0iAm/9FfJv/QHiZ/ztylv82bpL/Nm6R/zdwkv86c5X/PHWW/z11lv88cpj/O26Y/zhp + lf8yY5H/K12L/ydZiP8lWIf/J1yJ/yxjjf8waZH/M22T/zRxk/82c5T/N3OV/zlzlv85cZX/NmyT/zNn + kP8vYY3/KluJ/yZbif8nXor/KmKN/y1kjf8tY43/LmOM/zBkjf8yZo//L2KN/ytciv8nV4b/IE5//x1L + ff8cSn3/HUt9/x5Mff8fTHz/HUp4/xxIdf8aR3H/GUVv/xlFcP8YRG7/FkBr/xY/av8aRW//HUlz/yVT + fP8uXoX/NWSK/zlpi/8+bo//P3GQ/z5wj/89cY//PnKR/zlrjf8zZYj/LV+D/ydagP8kVX7/IlOA/yFS + f/8hUX7/I1N//yVVgP8mV4P/KVmF/y5fjP8zZZH/NmuT/zpvlf88dJf/PXeY/z94mf9BeJr/RHmc/0V6 + nf9DeJ3/QHec/z12m/86dZr/NnOY/zZ0l/89epj/RoGc/0yFof9OhqT/UYen/06Epf9IfqH/QXic/zlx + lv82b5T/Nm+V/zp0l/8/eZv/R4Cf/0+Hov9VjKX/WI6m/1iMp/9Xiqb/VYik/0+Fof9Ifp7/Q3ma/z9z + l/89cZf/PnOb/0B2oP9CeaP/P3ei/zpynf82bZj/NWyW/zZtlf85b5b/OnGW/ztylP88c5X/PHWY/zl0 + mP88d53/PHmf/zt4nv9CfaL/RH6k/0eApf9Kg6f/TIWn/0yFp/9LgqT/SX+h/0V8n/9Bd5v/PXCX/zhr + lP81aJL/MmeP/zBmjf8zao//NW2R/zVvlP84cpj/PXed/0F5oP9Ee6D/Rn6h/0iAov9JgqX/SIKl/0V/ + ov9Ce6D/P3ed/z12nP89eJv/QXyd/0eCoP9MhaL/UIil/1KJpv9Viaf/VYin/1WIqP9Xiaj/V4io/1eI + pv9XiKX/V4ml/1aKpP9UiaT/Uoej/0+Dov9NgaL/SHyg/z9zmf80Z5D/LmCJ/ylchP8sX4X/MWaK/zds + kP87cJL/PXKS/z1ykf89c5H/PHKQ/zxwkf85bJL/NWeQ/y9ijv8qXYr/JlqG/yddiP8pX4f/K2GJ/y9l + jP8yaI3/NGuO/zRqjP8zaYv/MmiL/zFmiv8uY4r/K2CJ/yheif8mXIr/JFuL/yZdjf8qX4//Ll2S/yxb + kf8nV4v/H0+C/xhIev8URXX/E0R1/xZHeP8YSXn/G0t8/x5Of/8gT4D/IVGA/wYPF/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xtLaP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8XPVT/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dxgd/0Rzi/9PhKH/T4Sj/06Epf9Ng6X/Sn+h/0Z7 + n/9BeJ3/PHOZ/ztymf8+dJv/QXie/0R6nv9GfJ3/SHyc/0l+m/9Jf5v/SX+b/0Z8mv9BeJn/PXSX/zlw + lf83bpP/OHCT/zpzlf87dZb/O3SX/zpwmP86bZn/NmiW/zBikf8qXI3/JVeI/yRYiP8nW4r/K2KO/y9o + kf8zb5L/NXKT/zd0lf84dZb/OnWX/zlxlf83bZT/NWiR/zJjjf8sYIv/J2CK/ydjjP8rZY3/LWeN/zBo + jv8za5D/NGuQ/zVqkf80aZH/MGSP/ylaif8hUIH/Gkd7/xhFef8ZRnj/Gkd4/xxJeP8dSnf/Hkp1/x5K + c/8bSHL/G0hz/xpIc/8cR3L/Hkhz/yBMdv8jUHr/KViB/zBhiP81Z4v/OWuM/zxtjv88cI7/PHGP/z1x + kP89cpL/PnOT/zhsjf8zZoj/LmGG/yxehv8oWoT/JFWB/yFRff8fT3v/IFB9/yFRfv8mVoP/K1yJ/zFi + j/81aJL/N22U/zpylv89d5b/PXeW/z93mP9CeJv/Qnec/0B2nP87dJv/OXOa/zZxmf81cpf/OXaX/z56 + lv9GgJr/S4Sf/0+HpP9QiKX/T4al/0uCo/9Gfp//Pnea/zdwlf83b5X/OXGW/z53mf9FfZ3/TISg/1OK + o/9YjqX/Wo6l/1mNpf9XiqT/VIek/02Dov9HfJ3/QXSY/ztulf87b5j/PnOc/z91n/89c5//N26a/zFo + k/8tZY//LmWO/zBnj/8yaY//NW2R/zdwk/82cJP/OHSY/zt3nf8+e6D/Q36i/0iBpf9Kgqb/SIKl/0mD + pv9Nhaf/ToSm/02Dpf9Kf6L/R3yf/0J1nP88b5j/N2iU/zFkj/8uYo3/LGOM/zBnj/8ya5L/NXCV/zp1 + m/9AeZ//RX2i/0qAo/9KgaP/TIOk/02Epv9MhKf/S4Ol/0d+o/9Dep//QHad/z51nP9BeZ3/Rn+f/0yF + o/9Riqb/VIun/1OJpv9UiKb/VImn/1aJqf9Wiaj/Voin/1eIpv9Yiaf/V4qm/1aJpv9ShqT/UISj/02B + ov9JfJ//Q3ab/zptk/8xY4r/LF6F/ytehP8xZIr/NWqO/zlukv88b5P/O2+Q/zpvjv85bo7/OWyP/zdo + j/8yYo3/K1yK/yZYhv8nWof/KFyI/yleif8vZIz/NGqP/zdtkP85b5H/OnGR/zpwkP85b4//NmuO/zNn + jf8vZIz/KmCK/yZcif8jWIn/JViK/ylYjP8qV43/J1WL/yNTiP8eToL/GUl7/xREdv8TQ3T/FUV2/xZG + d/8XR3j/GEh5/xtLfP8dTH3/ESxH/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ES9A/xtZ + fv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/FDxS/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yQ7 + Rv9QhZ//T4Sf/0+Eof9Og6P/TYOk/02Bov9Lfp//SHuc/0F2mf89cpj/OW+X/ztxmf8/c5v/QXad/0V4 + nf9GeZv/SHua/0h8mv9HfJr/RXub/0J5m/9Ad5z/PHOZ/zhvlv84b5T/OXCT/zhyk/84cZT/N2+V/zds + lv82aJb/MWOS/ytejv8lWIn/IVWH/yNZif8oYIz/LWeO/zJukf81cZT/NnOU/zh1lf85dJb/OnKW/zlu + lf81aZH/MWWO/ytii/8kYor/JmSL/ypmjP8taI3/MGqN/zRtj/83b5L/N26S/zVrk/8xZZD/KlyK/yFR + gv8aSXv/FkN2/xRBc/8ZRnb/HUp3/yBNef8jT3r/IU95/x9Nd/8dTXf/Hk54/yFPef8kUXv/JVJ8/yZV + f/8qWoT/LV6G/zFjiP82aYz/OWyM/zpujP86cI7/OnCP/ztxkP87cZD/Om+P/zZrjP8zZor/MWOK/y9h + if8rXIb/JFR//yBQe/8bS3f/Hk57/yJSgP8nV4X/LF2K/zBkj/81apP/OG+T/zpzlP87dZT/OnWT/zx0 + lv89dJn/O3Ka/zlxmf81cJj/Mm6Y/zZymP87d5f/QHyX/0WAmv9Kg57/Toai/0+Ho/9Ph6P/TYWj/0qC + ov9EfJ7/Pnea/zlyl/85cZb/PHSY/0J6nP9JgZ//UIai/1aLpP9ZjqX/Wo6k/1eLpP9UiKX/T4ak/0l/ + of9Cdpv/PHCW/zhrlP84bJb/OW6Z/zZsmf80apf/LWSO/yZeh/8nXoj/KmGJ/y1li/8zbJD/N3CU/zhz + l/85dZr/PXme/0J9oP9Kg6L/Toam/02Gpf9MhaX/SoSl/0uEpP9NhKX/TYOk/0uAov9HeqD/QXKb/zts + mP80ZZP/LWCN/yhdif8rYoz/LmaP/zJrk/83cpn/PXie/0R9ov9MgqX/ToOl/06DpP9PhKX/UIam/0+G + p/9Ohab/SoCj/0Z8of9CeJ//QHed/0B3nP9FfJ//TISj/1GJpv9Ti6b/Uoml/1KJpf9Uiqj/VYuq/1aK + qf9ViKf/Voin/1eIp/9Zian/Voen/1OFpP9Qg6P/ToKh/0p+oP9Fd5z/PnCV/zZojf8vYIf/LmCG/y9i + iP8zZoz/NmuQ/zhskP84a5D/N2qN/zZojP83Z47/M2KL/y1ciP8mVoT/JFaD/yVYhv8oW4n/LGGM/zJn + j/82bJP/O3KV/z50lf8/dpX/P3WU/z5yk/87b5H/NmqQ/zFljv8sYYv/J1yH/yRYh/8jVYb/JVSH/yJR + hv8fT4T/Hk2C/xtLf/8ZSXz/GUl6/xhIef8XR3j/GEh4/xhIeP8ZSXn/GEh5/xtKe/8YQmz/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HEhj/H1x//xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HFuA/w0oN/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8zU2P/UYWf/1CFn/9OhJ//TYOg/02Dov9Og6L/T4Gg/01+ + nf9Jepv/Q3WY/z5xlv87b5b/OW2X/ztvmf8/cZr/QXSb/0N2mv9Ed5n/RXmY/0R5mf9EeJn/Qnic/0F3 + nf89dJz/OXCX/zZtk/81bJD/M2yM/zRtj/80bZL/NGuU/zNok/8xZJL/LGCP/ydbi/8jWIj/H1eG/yRd + iP8qZYz/L2uQ/zRxk/83dJT/OHWW/zl0l/85cpf/OG6W/zVqk/8wZpD/KWSM/yRjiv8lZIr/KWaN/y1o + jf8wao3/M22N/zVuj/82b5H/N26T/zJnkf8rXov/I1OE/x1Lff8YRXj/F0R1/xlGdv8gTXr/JlN+/yhW + gf8mV4D/IVV+/x9Tff8gUnz/I1N9/yZVfv8pWIH/KlqD/ylbhP8pXIT/LWCH/zBkif81aYr/N2uL/zds + i/83bYz/OG+O/zhujf84bo3/N2yN/zZqi/81Z4z/NGSN/zJiiv8rW4X/JFN+/x9Oev8dTXn/H098/yJS + gP8mV4X/K12J/zFkjv81a5H/N26S/zZwkf82cJD/N3GS/zhwlf84cJf/NW6X/zFslv8zb5f/N3SY/zx5 + mf9Cfpv/RoGd/0mDnv9NhaD/T4ei/0+Hov9OhqL/TISh/0iAoP9DfJ3/P3ab/ztzmP87cpf/QHib/0Z9 + nf9OhKH/U4mk/1eMpf9YjKX/WIuj/1SIo/9QhKP/S3+h/0V6nf8+cpf/N2uT/zJmkf8vY5L/MGaT/y9l + kf8rYov/KF+I/yVchv8nXof/L2eO/zZvlP86dJj/PHid/z97oP9CfaD/SoKf/06Fof9QhqP/UIik/1CI + pP9Ph6T/Toak/02Eo/9NgqP/S3+i/0Z4oP8/b5z/N2eW/y5hj/8oXIn/KV6K/yxijf8vZpD/MWuS/zdx + mf8/eZ//R36i/02Cpf9QhKb/UIWl/1CFpf9Sh6X/Uoem/0+Fpf9MgqP/SX+h/0V7n/9CeJ3/Qned/0R7 + n/9JgaP/Toal/1CJpP9QiaP/Uoql/1OMqP9VjKn/Voqp/1WIp/9Vh6b/Voeo/1aHqP9Vhqf/U4Ok/0+B + ov9Nf6H/TH+h/0d5nf9AcZb/OGmO/zBhh/8sXYX/LV+G/zBiiv8xZIz/MmWN/zJljf8zY4z/M2GM/zNg + i/8sWob/JVSA/yFRfv8gUYD/IlWE/yhbiP8vYo7/M2iS/zlulP89c5b/Q3qZ/0V7mv9DeZj/QnaX/z1x + lP84bJH/M2eO/y5ii/8qXor/JFqI/yFVhv8dUIH/Gkx+/xlKfv8ZSH3/GUh8/xpJff8eTYD/H05//x9P + fv8dTXz/G0t7/xxNev8cTHv/G0p6/xpKef8DCQ//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8dUXD/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxb + f/8OJDH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DBwn/OGV+/0uC + nf9PhJ7/T4Sf/02DoP9MgqH/TYKh/1CDof9RgZ//T3+e/0t8nP9Gd5n/P3GX/ztulv84a5X/OGqV/ztt + mP8+cJn/P3KY/0F0l/9CdZf/QnWX/0J2mf9Cd5v/QXed/zxymv82bZf/M2qT/zFqjP8waYn/MWqK/zJq + jv8zapH/M2eR/zFkkf8tYY//KV6N/yVaif8iWof/IluH/yVgif8taY7/Mm6T/zdzlv84dZj/OXSZ/zhy + mf84cZj/NmuV/zFokP8rZIz/JmKK/yZhi/8pY4z/LmWO/zFnjv8ya4z/M2yN/zVujv82bZL/NWmS/y9h + jf8nV4f/IE6A/xxIe/8cSHn/H0t6/yZTf/8sWoT/LFyG/yhchf8kW4T/I1mC/yNXgP8lV4D/J1mB/ypb + g/8qXIT/KVuD/yhchP8pXoX/LGCG/zBkiP8zZ4n/NWmJ/zVriv81a4r/NmyM/zZsjP82a4z/N2qN/zhp + jv84aI//NWWM/zBgiP8rWoT/JlWA/yFRfP8eTnv/HU57/yFSgP8mWIT/LF+J/zBkjf8zaZD/M2uP/zRs + kP81bZL/NW2T/zVslf8yapX/MWuV/zJtlv82cpj/Pnqb/0WAn/9JhKH/SYSf/0yFoP9OhqH/UIij/1CI + o/9OhqL/S4Og/0d/n/9Dep3/P3ab/z51mv8+dZr/RHqc/0qAof9RhqT/VYqm/1eKpv9WiqT/U4aj/0+B + ov9JfJ//RHic/z1xl/82apL/LWGO/ypfjf8pXoz/KWGM/ylhi/8oYIn/KGCJ/y1ljf81bJT/O3SZ/z53 + nP9BfKH/RX+j/0mBoP9NhJ7/UYae/1GHn/9SiKH/U4mj/1OKpP9Sh6P/UIWj/06Cov9KfaH/RXWf/z1s + mv8xYZH/KFuJ/ydbiP8rX4v/LWGN/y1kjv8vaI//NW6V/z52m/9IfaH/TYGk/0+EpP9QhaX/Uoak/1OI + pP9TiKP/Uoek/0+Eo/9LgaD/SH2f/0V6nf9CeJ3/RHuf/0Z/of9LhKT/TYej/06Io/9QiaT/U4qm/1SL + qP9Wi6j/VYin/1SHpv9Uhqf/VIWn/1SFpv9RgqP/ToCh/0x+n/9KfZ7/R3qc/0Jzl/85aY//MGCH/ypa + gv8oWYL/KluG/ytdh/8rXof/LFyH/y1bh/8uWIj/LFaF/yZSgP8eTHr/Gkl4/xlLev8eUYH/J1qJ/y5i + j/8zaZP/OW+V/z91l/9EeZr/SH2d/0l9nv9Ed5n/QHKW/zpskv80Zo//L2KM/yxgjf8oX47/IliH/xtQ + gP8VSXn/EkV2/xRFeP8WRnr/HEyA/yBPgv8lVIX/KFaF/ydWg/8kVID/IVN+/yBRfv8eT33/HEx6/w0h + Nv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xc3Sv8bW37/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/DiYy/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CxYd/zRnhv8/eZv/RX6d/0uCn/9Ng6D/ToOh/02Cof9PhKP/UYOi/1CC + oP9PgJ//TH6e/0h6nP9BdJr/OWuU/zVnkf8yZJD/NWeT/zpslv89bpf/PnCW/z5xlf8+cZT/P3OW/z9z + mP8+cpj/OW6W/zNqk/8waJD/LmeN/y5nif8wZ4n/MWiM/zJpj/8yZ5D/MmWQ/zBjj/8sYI3/KFyK/yVb + h/8jW4b/Jl+K/ytmjv8xbJP/NnGW/zh0mf85dZr/OHOa/zlwmf85b5f/NWqS/y1jjP8pYIn/J12H/yle + iv8tX4z/MWOO/zNmjv8zao3/NWuO/zZrkP81aZH/MWOP/ypZiP8jUIH/Hkt9/yBLfP8iTn3/KlaC/y1d + h/8tYYn/KGCJ/yZfh/8mXIX/JluD/ydbgv8pXIP/K12E/ypcg/8oW4P/J1uC/ydbgv8pXoX/LWKI/zFl + if8zZ4n/M2mH/zRqif81a4v/N22N/zhtjv84bI7/OmyQ/zhqjv81Zoz/MmOI/zBhiP8uXYb/KFiB/yBQ + fP8eT3v/HE16/yJUgP8mWYX/Kl6J/y1ii/8wZo7/MmiQ/zRpk/8zaZP/MmmV/zBplP8va5T/MG6V/zZz + mf8/fJ//RoGi/0mCof9Kg6H/TIWg/0+Hov9SiaT/Uomk/0+Hov9NhaH/SoKg/0V9n/9CeZ3/P3ab/z51 + m/9CeJ3/SH2g/06Do/9ShaX/VYim/1OGpP9PgqL/TH6f/0Z5nf9AdJn/OW2V/zFlkP8rXoz/KV2M/ypf + jP8oX4r/J2CK/yhii/8sZo3/M22S/zpzmP8+d5v/QXqc/0R9of9IgKH/S4Kf/0+Env9Qhp3/UYed/1KH + nv9TiaD/VImi/1OIo/9RhKL/ToCh/0p8oP9Edp7/OWmW/y5ejP8nWIf/K12L/y5gjf8uYY3/K2OL/y1l + jP8yapH/O3GX/0V5nv9Lf6L/T4Oj/1CFo/9ShqL/VIij/1SIov9Th6L/UIWi/0+Dov9Lf5//Rnud/0J5 + nP9CeZ3/RX2g/0iBov9KhaT/S4aj/06Ho/9RiKT/U4ml/1SJpv9TiKb/Uoal/1KEpf9ShKX/U4Sm/1GC + o/9PgKH/S32e/0p9nv9Hepz/QnOX/zlpkP8wX4j/KFeC/yNSfv8iUn//I1SC/yVWgv8kVIH/JVGB/ydS + gv8mUID/IEp6/xxJd/8WRXT/E0V1/xpNfv8jV4b/K2CM/zJnkf83bZT/P3WY/0V6nP9IfJ3/SXye/0h6 + nf9Bcpf/OmuT/zNlj/8tYI3/KV6N/yddjf8lXIr/H1WD/xZLev8SRXb/D0Fy/xdIe/8fToH/I1KE/yZV + hf8sW4j/LlyI/y1chv8pWYL/JleA/yNUf/8fUHz/Fjpb/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/DiAq/x1bfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xAs + O/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xAfJ/85cJH/PHaZ/z54 + mv9CfJ3/SICg/0yBof9NgqL/ToSj/0+EpP9RhKP/ToGg/0x+nv9KfJ7/SHqd/0F0mf85bJT/L2KN/yxe + iv8tX4z/MmOP/zhqlP86bJT/Om2T/ztukv87b5L/PG+T/zltk/81a5H/MmqQ/y9oj/8tZ4z/LWWM/y5m + jP8xZ43/M2iP/zRpkf80aJL/NGaR/zFkj/8tYYz/J12I/yVch/8nXon/KmON/zFqlP81b5f/N3Ka/zhz + m/84c5v/OnGZ/ztwmP82apP/L2KM/ylchv8mWYT/J1iE/ypZiP8vXoz/M2OO/zRkjv8zZo3/M2eN/zFj + jf8vXov/KViH/yJOf/8eSHn/Hkh5/yNOfP8oVYH/LFyG/ythiv8rY4v/KWGJ/ylfhv8oXYT/KFyD/ypd + g/8sXoT/LF6E/ypdhP8mWoD/JlqA/ydbgf8rYIX/MGSJ/zNnif80aIr/NWuK/zZtjf84bo7/OG2P/zpv + kf87b5D/OWyO/zZoi/82Z4v/M2WK/zJjif8uXof/KVmE/yFSfv8fUHz/HU97/yBTf/8kV4P/KVyI/y1g + jf8wZJD/MGWR/y9kkv8vZJP/LmiT/y1skv8wcJT/OHab/0F9of9GgaL/SIGh/0uDoP9MhaD/UIei/1KJ + pP9SiaT/UYik/0+Gov9Mg6L/SX+h/0V7n/9Adp3/P3Wc/z91nP9Fep//SX2h/02Ao/9QgqT/ToGj/0l8 + n/9Edpv/PXGY/zlulf8yaZD/K2GL/yxhjf8uYo//LWSQ/yxjj/8pYo3/KGOM/y9pj/82cJP/O3aY/z13 + mf9Bepv/RXye/0l/oP9MgZ//ToOf/0+Env9RhZ3/U4ad/1OGnf9Thp//UYSg/1CCof9NfqH/SXmf/0Bx + mv83ZpL/K1uK/ypaif8sXYz/MGKQ/y1ijf8rYYr/KmGI/y9ljP84bZP/Qnab/0t+of9PgqP/UYWi/1OH + ov9Th6H/VYih/1SHof9ShaH/ToKf/0t/nv9Gepv/Qnia/0B3mv9BeZv/RX6g/0eCof9KhKL/ToWj/1KG + pP9ThqT/VIel/1OGpf9RhaT/UYSk/1GDpP9RhKT/UoSl/1CCo/9NgKD/Sn6e/0d7nP9CdJf/OWmQ/y9e + iP8nVYH/Ik99/x5NfP8dTXz/IFF+/yBRff8iUH3/JFB//yVQfv8jT3z/Hkt5/xhHdf8URXX/F0p7/x1R + gv8mW4j/LWOO/zNpkf87cZb/QnaZ/0V5m/9Fd5v/QnSY/z9wlv84aZH/MGGO/ylcjP8lWYv/JlqK/yZb + iv8jWYb/HFKA/xVJef8VSHj/GUx8/yBSgv8jU4T/JlWF/ytZh/8xX4r/MmCJ/y9ehf8rW4H/JVZ+/x9R + ev8cTXf/AgUH/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/H1x//xtafv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8YPlP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8cMj3/R4Cg/0F6nP88dpn/PXeZ/0B6nP9FfZ//SoCj/0yBo/9NgqP/ToKk/02B + ov9Kf5//SHyc/0V4m/9BdZn/PXCW/zNoj/8sYIr/JlmF/yNWg/8oW4f/LmGM/zVnkf83aZH/N2qP/zls + j/84a43/NmuO/zNqj/8vaY7/LmmP/y5ojv8uZ47/LmWO/zBljv8yZ5H/NGmT/zdrlP83apT/NmiS/zNm + j/8tYoz/KF6J/yVdiP8oYIv/LmaR/zNsl/82b5r/N3Gb/zdxmv86b5j/OWyW/zVmkf8uX4r/KViF/yVV + gf8kU4D/J1WD/ytZh/8wXYv/L16K/y9eif8uX4n/Ll6K/ytZh/8mU4L/H0p8/xpDdf8ZQnT/HUh3/yZS + f/8qW4b/K1+J/yxiiv8tY4v/KmCH/ylehP8pXIL/Kl2D/yxehP8tX4T/LF6E/ypcgv8mWoD/J1yB/ypf + g/8uY4f/M2eK/zVpi/83a43/N26P/zdtkP83bI//OW2Q/zpukP85bY7/N2uM/zdqjP82aoz/NWeM/zJk + i/8uX4n/KVqF/yNUgP8eT3z/HE16/x5Qff8jVoP/KVyJ/yxfjv8sYJD/K16Q/ytikP8qZo//K2uO/zJy + lP86eJn/Qn6e/0V/oP9IgaD/S4Og/02Fof9Qh6L/UYij/1OJpf9RiKT/UIek/02Eo/9KgKP/R36j/0N5 + oP8/dJ3/PXKb/z5znP9Cd53/R3qg/0h7of9HeZ//QnWc/zttlf81aZH/MWaP/yxmi/8tZ4v/MGmP/zRs + kv81bJX/NGuW/y9pk/8taZD/LGmN/zRwkv85dJT/PHeX/0B5mv9Fep3/SH2f/0t/oP9MgaD/T4Kf/1GD + n/9Sg57/UoOd/1CBnf9QgJ//T36g/016of9GdJ3/PmuW/zNhj/8qWoj/J1iG/ypcif8uYo3/LmSO/yph + if8oXoX/LGGI/zRpj/8/dJn/SHye/06Bof9RhaL/U4ag/1OGn/9Uh5//VIaf/1KEn/9PgZ7/Sn2d/0V5 + mv9BdZj/P3SX/z92mf9De53/Rn+f/0qBov9RhKT/VISk/1OEpP9Rg6P/UoWk/1KFpP9Pg6P/T4Ki/1CD + o/9Qg6P/UIOj/06Cof9Lf5//R3uc/0N2mP85a5D/L16I/yZUgv8gTX7/HUt8/x9Pfv8gU3//IlV//yZW + gf8qV4P/LVmF/yxYhP8oVYD/H015/xhIdf8WSnn/Gk9+/yFWg/8nXYj/LWOL/zRpj/86bpP/PnKW/z5w + lP87bZL/N2iP/zJijf8rWYr/JFOH/yNVh/8lV4j/JVqI/yRahv8hWIP/HlWB/x9Ugf8hVYP/JFiF/ydZ + h/8pWof/L12K/zNgi/81Yon/MmGF/y5egv8pWn7/IVN4/xtOdf8LHi3/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8cSGH/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/FTxR/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/IDQ+/1GIpf9Mg6L/RX2e/0B5 + m/88d5j/PnaZ/0J5nf9He6D/Sn6j/0p+ov9Kf6L/SH6g/0d9nv9EeZr/P3WX/ztwlP81apD/L2SM/yhc + hv8hVYH/H1KA/x9Tgf8kWIX/K1+J/zFkjP80Z4z/NmmN/zZpjf80ao3/MmuP/zBrj/8wbJH/MWuS/zFp + kf8vZpD/L2SQ/zFmkf81apX/OGyX/zltlv85bZT/N2qS/zFkjv8rX4r/KFyJ/yZcif8qYY7/LmWT/zJq + l/82bpr/N26Z/zhul/83aZT/MmSP/yxdif8nVoP/IlB+/yNSgP8lVIL/KFeE/ylYhP8pWoX/KVmE/ydY + gv8lVYL/JlOC/yFOfv8dSHr/GEF0/xM7bP8ZQnL/Ik17/ylXg/8tXoj/LWGK/y1hiv8rYIf/KV2D/ypc + gv8rXYL/Ll6D/y9ghf8uYIX/LF6D/ytdg/8oXYH/KV6C/y1ihf8wZYj/NWiK/zhrjf83bI7/NmuO/zVp + jv83a4//OGyP/zlujv85b47/OG6N/zhsjf83ao7/NmiO/zNkjf8tXon/J1iD/x9Qff8aS3j/G0x6/x5Q + fv8kVoX/KFmK/ylbjf8pXY7/J2CM/yZli/8ta4//NXOU/zx5mP9Cfpz/RYCe/0iAn/9LgqD/ToSi/1CG + ov9SiKT/UYej/1GHpP9QhqP/ToSk/0yCpf9IfqP/Qnif/z10nf85b5n/N26Y/ztwmf8/c5z/QHSe/z9y + nP85bJf/M2eS/y5ijP8uY4z/LmaM/zFtjv84dZL/O3eW/z12mf89dZz/OnSZ/zVxlf8ycJH/MG2O/zRw + kP86dJT/P3WY/0F2m/9EeJ7/Rnqg/0h8oP9LfqD/ToCg/0+An/9QgZ//Tn6e/099oP9OfKL/S3eg/0Rw + m/86ZpP/L12L/ydWhP8jVID/JlqF/ytgif8sY4v/KV+H/yddhP8oXYT/MWaM/zpvlP9EeJv/TH+f/0+C + n/9Qg57/UYSd/1KFnf9ShJ7/UYKd/06Anf9KfJz/RXeZ/z9ylv88cZT/PXKW/0B3mf9FfJ7/S4Ch/1CA + ov9QgKL/UICh/06Aof9QgqP/UIOj/06Bof9MgKD/TICg/0yAoP9Mf5//TICf/0l9nf9FeZv/QHOX/zlq + kf8vX4n/JlWC/yBNfv8iUIH/I1WD/yZbhP8qX4f/MGKJ/zNjjP85Z4//OmiR/zRii/8mVH7/HU14/xhK + dv8ZTXr/HFF//yJYgv8oXIX/LWKJ/zJljP81aI3/NWeN/zJkiv8uXYj/KViG/yNQhP8gToP/IVCC/yNT + g/8mW4f/J16I/ydfiP8oYIn/KWKL/ytijP8sYYz/LmKN/zFkj/81ZI//OGSO/zhkjP83ZIf/MWGC/yxd + fv8mWHz/IFJ6/xExSv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xErOv8bWn7/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xVEX/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yg+SP9Yjaf/VImn/06FpP9JgKH/Q3yd/z54mv89dJj/PXSZ/0J2nv9EeKD/RXmg/0R6 + n/9Cep3/QXia/z93mP88c5X/N26Q/zJojf8tYor/JVqF/yBVgf8eU4D/HVJ//x9Ugf8lWoT/Kl+J/zFl + jP81ao3/NWqN/zRsj/8ybpH/NG+U/zVvlf81bpX/NGyV/zNolP8xZZL/MmaT/zZplv84a5b/Om2X/zlt + lf82apH/MmWN/yxfiv8oW4j/JVqI/yVbif8oXo7/LGSS/zFqlf81bZf/N2yX/zZqlf8xY4//KlqI/yRU + gf8iUoD/JFSC/yZXhP8mWIT/JlqE/yRYgf8lWIH/IlV+/yFTfv8gUX7/H059/x1Jev8aQ3b/GD9y/xlB + cv8gSnn/JVF+/ypZhf8vYIn/LF+H/ytdhf8pXIL/KluB/yxdgv8vX4P/MWGG/zJhhv8vYIX/LV+E/ytf + g/8rYIT/LGKE/y9khv8yZ4j/NmmL/zVqjP80aov/NWqN/zZrjv83bI7/OW6P/zluj/85b47/N2yO/zdr + j/83apD/NWiQ/zBhi/8nWIT/H099/xtLef8aS3n/HE58/x5QgP8hU4X/JFaI/yVaif8lXon/KWWL/zBs + kP83c5T/PXmZ/0J+nP9HgJ3/SYCd/0uBnv9OhKH/UYaj/1GGo/9QhqP/T4Wi/0+Fo/9Og6P/TIKl/0Z8 + of8/dp3/OXGZ/zJrlf8waZP/M2uW/zdvmv85bpr/NmuW/zFlkv8wZJH/MWWP/zBljf80a5D/O3WU/0B8 + l/9CgJj/RICb/0R+nf9CfZ3/QHya/zp3lv81dJL/M3GQ/zhxk/89c5b/P3Ka/z5xm/8/cpz/QXWe/0R3 + nv9Iep7/Snuf/0x9n/9Me5//THuh/0x5ov9KdaD/Qm2a/zhjkv8rV4X/JFF//yJRfv8lWIL/KF6H/ydd + h/8lXIb/JVuD/yddhP8uY4n/NmuQ/0Bzlv9GeZv/S36b/0x/m/9NgJv/UIGc/1CBnP9QgZ7/Tn6e/0l5 + nP9DdJn/Pm+V/zpslP86bpT/PXGX/0J2mv9Ie57/S32e/0t8n/9Kep7/Snue/0t9oP9LfZ//SHyd/0d7 + nP9He5v/R3qa/0d6mv9FeZr/Q3eZ/0B0l/86bJL/MmSM/yxciP8kU4H/IlKA/yRWg/8pX4n/L2aN/zRr + kP85bpP/P3KV/0R0mf9GdZr/PmyT/zJgiP8lVH7/HU56/xxOe/8fU3//IFWA/yZbhP8qX4b/LmKJ/y9h + iP8tX4f/KlqE/yhVgv8jToD/IEt//x5Lfv8dSn3/IlKC/yhbh/8rY4v/L2qP/zJskf80bpP/N3CV/zhw + lv85bpb/Om6W/zpsk/87aZD/PGiO/zllif80YoT/MF+A/ytcgP8mWIH/IE52/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CBMY/x9bf/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8VSGX/AwYI/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP81UF7/XY+o/1qOqf9Wi6n/UIen/0qD + pP9FfqD/QHmd/z10mf89cpn/PnGa/z9znP8+c5z/PXWb/z11mf87dJb/O3SV/zpyk/82bpD/M2qP/y9l + jP8pXoj/JVqG/x9Ugv8eU4H/H1SC/yNYhP8qX4n/MWWO/zVpkP81bpH/NHCT/zRxlP83c5f/OnOa/zlx + mf83bZj/NGqV/zNmlP8yZZP/NGaU/zZolv85a5f/N2mT/zRnj/8xZIz/LF+J/yZZhv8iVob/IVaH/yRa + iv8nYI7/LGaS/zFplP82bZj/NmuX/zBkkP8pWoj/I1WC/yNVgv8lWIT/KFyH/yhfiP8nX4f/Jl6F/yVc + hP8jWoL/I1aB/yJUgf8gUX//IE1//x1Hef8aQnT/G0Jy/x5Gdv8hTHr/JVJ//yhXgv8rXIX/K1yE/ypb + gf8rW4D/LF2C/zFghf8yYob/M2KH/zFih/8uYYX/LGGE/ytghP8sYoT/LmSF/zFlhv8yZ4f/MmeI/zNp + if80aYv/NWqM/zdsjv85bY//OW6P/zhsj/83a47/NmqP/zZqkf80Z5D/MGOM/yhZhf8iUn//HE17/xlL + eP8aTXr/G058/x1QgP8fUYH/IVaD/yRdhv8sZI3/M2uR/zhylP8+eJj/Qnyb/0d9m/9Ifpz/S3+d/06C + oP9Pg6H/T4Sh/06Dof9NgqH/ToOi/02CpP9JfqH/Qnid/ztymP80bpX/LWmS/ypmkP8uaZP/MGqW/zBo + lf8tY5H/LWKQ/zJmk/81aZT/Om+V/z91mP9EfZv/R4Kc/0mFnP9Khpz/S4Se/0mDnv9GgZ7/Qn+d/z17 + mf87d5X/PXSU/z1xlf87b5f/OWyX/zdql/83a5f/PG+Z/0Bym/9DdJv/RXac/0d3nv9Idp//R3Sf/0dx + nf9Da5r/Nl+P/ytVhf8hTn3/IE58/yJUf/8kWYT/IlmG/yJZhf8jWoT/Jl2F/ytgiP80aI7/PHCU/0J1 + mP9GeZn/SXuZ/0t9mv9MfZr/TX2c/09+nv9NfJ7/SHed/0FxmP87a5P/NmeQ/zZokP84a5P/Pm+Y/0F0 + mf9Edpv/RXeb/0R1mv9Edpr/RXib/0J2mf9BdJf/QHSW/z9zlP9AdJT/QHOV/z9ylf89cJT/OWuS/zRl + jv8tXYj/JlWC/yNTgf8kVoL/KF6H/y9njf84cZT/PneZ/0J5mf9JfJz/UICh/0x8nv9GdZn/O2qQ/y1d + hv8jVH//IVSA/yVZhP8oXoj/KmCI/y5iiv8xZo3/MmSN/yxchf8oVoL/I09+/x9JfP8eSHv/HUl7/yBN + fv8lVYT/Kl6J/zBnj/80bpP/OnWY/z13mv9AeZz/QXqe/0N6n/9Adpv/PXGV/zxtkf86aY3/OWaI/zRi + g/8wX4P/LV6D/ytbhv8mVYD/Bg8X/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HFd5/xta + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/GFN1/woUGv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/IzU+/16QqP9dkan/W4+q/1eMqv9Sian/TISm/0Z+ov9Cep7/PXKb/ztvmv87bZr/OW2Y/zhu + mP84cJf/NnGV/zdylf85c5T/OXKT/zlwk/82bZL/M2mQ/zBmj/8sYo3/J12J/yJYhv8iWIb/JVqI/yxh + jf8xZ5H/NGuS/zRukv81cZX/OHSY/zl0mf86dJr/O3Ob/zhumf80aZX/MWWS/zBjkf8xY5L/M2ST/zNl + kf8yZI7/MGKL/y9hiv8sXoj/KFmG/yJVhf8fU4T/H1aG/yNciv8oYo7/LWWR/zJolf80aJX/MWSS/ypc + iv8lWIX/JVmF/yddh/8sY4z/LWeO/yxnjf8rZIv/KmOK/yphiv8pX4n/J1uH/yVXhf8jU4L/IU19/xxD + dP8aQHH/G0Jy/x1Hdf8gTHj/I1F8/yVVfv8nWID/KluA/ypbgP8uXYL/MWCF/zJihv8yYob/MGGF/y9i + hv8sYYT/K2GE/ythhP8sYYP/LmOE/y9khf8wZob/MWaH/zJnif80aIz/NmqO/zdrj/84bI//N2uP/zVp + kP81aZD/NGiP/zJlj/8tX4r/KVuF/yVXgf8fU33/HVB7/xtOef8bTnv/G017/xxNfP8dUH3/JVmD/yxj + iv80ao//OnGU/z52l/9BeZj/RHqZ/0d6mv9KfJz/TX6e/01/n/9Mf57/Sn6e/0p+nv9LfqD/SX2g/0Z6 + nv8/dJn/OHKX/zBvlf8qapL/K2mT/yxpk/8rZZL/J2GO/yhgjv8tZJL/NWuX/z1ym/9DeJ3/SH+f/0uD + oP9Oh6D/UImg/1GKof9RiaL/T4ah/0yFov9Ig6H/RYGe/0R8mv9DeJj/QHSX/zltlf82apT/MGOR/y9j + kP8yZZH/N2qV/zttl/89b5f/P2+X/0Fwmv9Cb5v/QWya/ztllP81XY3/KVKD/yJMfv8fTXv/IFJ+/yJZ + hP8jW4b/IlqG/yNbhf8oXob/LWKJ/zJmjf85bJL/P3KV/0N2l/9GeJj/R3mZ/0h4mf9IeZn/SHib/0l4 + nf9GdJz/QG+X/zhokf8wYIr/LmCK/zBijf81aJL/OmyX/zxvl/89cJf/PW+V/z1vlP86bZP/OGyR/zhs + kf84bJD/OW2P/zpuj/87bpL/O22S/zdpkP80ZI7/Ll6K/yhXhP8iUX//I1SB/yZbhf8tZYz/Nm+T/z94 + mv9Gf53/S4Kd/0+Env9ShKH/UYKi/0x8nv8/b5T/MmOK/yhZgv8lWIP/Kl6I/y5kjf8yaY//NWuS/zpu + lv88b5j/NGSP/ypWg/8jTX3/Hkh6/xxIef8fSnz/I1GB/yhYhv8tX4z/MmmR/zdwlv87dZn/QXqe/0J7 + nv9DfJ//RHyf/0N6nf89cpb/OW2Q/zhpi/81ZYf/NGKE/zFgg/8uXoP/K1uD/ydUf/8PIjX/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8XPFL/G1p9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8NHyn/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yI1Pv9dj6f/XY+o/1yQqv9ajqr/VYup/1GI + qP9MhKb/R3+k/0J6oP8+cpz/OWuY/zZqlv80apX/M2uU/zJsk/80b5L/NnGT/zl0lf88dJb/PHOW/zxy + l/85b5b/N22V/zVqlP8uZI//KV+L/yZbif8oXYz/LmOQ/zJokv80bJL/M26S/zRwk/83cZb/OXOZ/zlz + mf84cZj/N22X/zJmkv8uYo//LGCN/yxejP8tXo3/LV+L/yxeif8rXof/LF+I/yxeiP8rXIj/J1mH/yFU + hf8dVIL/H1aF/yNZiP8oXoz/K2GP/y5ikP8tYI7/Kl2L/yVZhf8kWYX/K2OM/zBqkf8xbZL/MG2S/zBt + kf8vapD/L2iQ/y5lj/8rYIz/KFuJ/ydYhv8kUoD/IEp4/xpCcf8YQG//G0Rz/x5Kdv8fTXj/IFF5/yNU + e/8lV3z/KluA/y1dgv8vXoP/L2CD/y9ghP8tYIT/LGCE/yxhhP8sYYT/KmCD/ythg/8tYoP/L2SF/y5j + hf8uY4X/MGSH/zJmi/80aI3/NGmP/zRpjv80aZD/NWmQ/zRnkf8yZI//LWGK/ypdh/8oW4X/J1uD/yZb + gv8kWID/IVV+/x9Qev8dTHn/G0p4/x5Oe/8jU37/Kl2F/zFljP83bJD/PXKV/0Bzlf9CdZf/RHeY/0d4 + m/9JeZ7/Snue/0h7nv9Gepv/Rnib/0Z5nf9Ed5z/Qnab/z51mv83c5j/MHGW/y9wl/8wb5f/LmuV/ydj + jv8iXYr/JmCM/zBplP85cZv/QXmf/0l/ov9NhKP/T4ej/1KKo/9UjKT/Vo2l/1WLpf9Uiab/Uoam/06F + pP9Lg5//SoGd/0l+nf9FeZz/PHCY/zRokv8uYY7/K1+N/y1hjv8vZI//NGiS/zVokv83aZL/OGmT/zpn + lf85ZZP/NF+P/y1XiP8nT4L/IUx9/x5NfP8gVoD/JV2G/ydgif8oYIr/KWGK/yxjiv8xZo3/M2iP/zhs + kv89cJX/QXOX/0N1mP9EdZj/QnOX/0Fxlv9AcJb/P2+W/z9tl/88apb/NGSQ/yxdiv8mV4b/JlmH/yte + i/8xZJD/NWmT/zdrk/82apL/M2aN/y5hiP8tYIf/MGSL/zJmjf80aIz/NmqP/zhrkP84apL/NWaQ/zBf + jP8qWYj/JFOD/yJSgP8kVoL/KV6I/zNqkf8/d5r/R4Ce/0qDn/9Php//UYee/1OGoP9ThKD/TX6e/0R1 + l/82Z43/LF6F/ydbg/8oXob/L2eN/zVukv88dZn/Qnid/0F0nf86aZP/MFyJ/yRPfv8eSXn/HEh5/yFP + f/8mVIT/KlmI/yxeiv8wZY7/N22T/zpxlf88dJj/PXWZ/z53mv88dZj/OnKW/zhukv82ao3/NGaI/zNk + hv80ZIb/MmKE/zBegv8tWoL/KVV//xc3WP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w0i + MP8bWX7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/EC5A/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8iND7/W42n/1yPqP9bkKn/Wo6p/1eLqv9Tian/T4an/0uCpf9HfqP/Q3mg/z5znf85bZj/M2mU/zJp + kv8ya5L/Mm2R/zNvkv84c5X/PXeX/0B5mv9Cepv/Qneb/z90mv89c5r/Om6Y/zVolf8vYo//Kl6L/ypf + jf8uYpD/MWeQ/zJpkf8ybJH/MmyR/zNtkv81b5X/NnCW/zVtlf8zaZP/LmOO/ypeiv8nW4j/J1qH/yda + h/8nWob/KFuG/ylchv8pXob/LGCJ/y5gi/8qXYr/JFiH/x9UhP8bUYD/HVGC/yFVhf8nWon/KlyL/ylb + iv8mWYb/IVaC/yZeh/8tZo3/Mm2T/zVxlv8zcJT/M3CU/zNulf8zbZX/MGmT/y1ikP8sXo3/KluJ/yhW + g/8iT3v/HEdz/xlDcP8bRnP/H0x3/yBPev8fUHn/HlF4/yFTef8lVnv/Klp//ytbgP8rXIH/K12B/ype + gv8qX4P/K2CE/ythhv8sYoX/LWKE/y5jhP8uY4X/LmOF/y1hhP8vY4f/MGSJ/zJmjP8xZo3/MWeO/zJn + jv8zZ5D/MmaQ/y9hjP8rXoj/KF2F/ylehf8pX4X/K2GG/yxjiP8pXYT/JVV//yJOe/8eSnf/HUt3/yFP + ev8nVn//LV6F/zRnjP85a4//PW+S/z9xlP9Bcpf/Q3SZ/0R2m/9Fd57/RHec/0N1mv9CdJn/QnSZ/0Bz + mf8/c5j/PHWY/zl3mf82dZn/N3ab/zZ0mv8xb5b/KGWP/yRhi/8oZI//MGyW/zt1nP9EfaH/S4Sk/0+H + pf9RiaP/U4uk/1SLpP9Yjqf/WY2p/1eMqv9Wiqn/UYel/06Gof9Ng57/TYKg/0p+oP9AdJr/NGiT/y9j + j/8sYY3/LGGN/y9kj/8xZ5D/MmeQ/zFkj/8yZI//MmGO/zJfjv8uWYr/KFKE/yJNf/8fS3z/IFN9/yNc + g/8pY4n/LmiN/zBpj/8yao7/NGuP/zVrj/83bJH/O2+U/z1wlf8+cZb/QHKY/z9xl/89b5X/O2yT/zlp + kv83ZpH/NmSQ/zRikP8wX47/KFmJ/yJVhv8hVYT/JFiH/ypfi/8vZI7/MmeQ/zFmjv8tYYn/KFuD/ydZ + gv8sYIj/L2OL/zJmjf8zZ43/NWmP/zVokf8zZJH/LV6O/ydXif8jUoT/IlGB/yRWgv8uY4v/OnCV/0V8 + nv9Lg6D/Toeg/1GJn/9TiZ7/VIef/1OEn/9NfZ3/RHWY/zlrkP8tYIj/J1uD/yddhf8sZIn/Nm+T/z54 + m/9Cep3/QXOc/ztqlv8vXYn/I1F//xxKef8fTHz/JFKB/yhWhf8nVoX/J1iF/yteiP8uYov/MWaM/zJo + jf8yaY7/M2qP/zBpjf8vZ4z/MGeL/zBliP8vY4X/MWOE/zNkhf8zY4X/MV+E/y5agv8mUnz/HUdz/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BQsQ/x1aff8aWX7/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xNDXv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HCw0/1mMqf9ajKj/WY6o/1qOqf9YjKn/VYqp/1KH + qP9OhKb/SoGk/0d+ov9DeaD/P3Wd/zlvmP80bZX/M2uU/zJtk/81cJT/OHOW/zx3mP9Be5v/RX2e/0h+ + n/9HfJ7/RXqd/0J3nf8/cpv/O2yY/zVmk/8uYI7/K12L/y1gjP8wZI7/MWeP/zBpj/8waY//L2mO/zBq + kP8xa5L/MWqR/y5mj/8sYoz/KF2J/yNYhP8jV4P/I1iD/yRZg/8oXIb/KV+H/ytjif8uZYz/L2WN/y1i + jf8oXIr/IlaH/yBRg/8cTX//Hk6A/yJRg/8mVYb/JleG/yNVgv8jWIP/J2CI/y1njv8yb5L/NXKV/zVy + lf80cJT/NW+V/zVvlv8za5b/MGWS/y9gkP8uXY3/KViG/yJQfP8cSXX/G0dz/x1KdP8hT3n/JFN9/yNV + fv8fU3r/G050/x5Qdv8hUnn/JVZ8/yZYfv8nWYD/KFyB/ypehP8rYIf/LGGH/y1ihv8uY4X/L2SG/y9k + hv8wZIf/MGSH/y9jh/8vY4n/L2WL/zBljP8vZo3/LmWN/y9ljf8vZI7/LGCL/ypfif8rX4f/K2GG/y1k + h/8vaIn/MmiK/zNkif8wXYb/KVSA/yNOef8dSHP/Hkp1/yJPeP8pV3//L1+G/zRkiv85aY7/PG2S/z1v + lP8/cZf/P3GZ/z5ymf8+cpj/PG+V/z1yl/89cpj/PHCW/z90mP89dpj/O3iZ/zx7nf88ep3/Onec/zRy + mP8vbZT/LGmS/y1rk/8yb5f/OXab/0J+of9KhaT/T4ml/1KLpP9Ti6T/VYuk/1eMpv9ajan/W46t/1eL + qv9Tiqb/UIii/06Gn/9NhKD/Sn+f/0N3m/85bZX/MmeR/y9kj/8wZpH/MmmR/zNrkv8zaZL/MmaQ/y9j + jv8vYI3/LlyL/ytYiP8lUIL/IE1+/x9Qff8iWYD/KGOG/y9pjP81bpH/OHGT/zpylf87c5T/O3KU/zxw + kv88cJL/PG+U/z1vlf89b5b/PG6V/zlrk/82Z5D/M2ON/zBgjP8vXoz/LVyL/ypaiv8kVof/IleG/yJX + hv8kWIf/JlyI/yxijP8vZY7/LmSM/ythiP8oXYT/Kl6G/y1hif8xZY3/M2iO/zRoj/8xZYz/MmWP/zBh + j/8qW43/JVSI/yFPgv8fTn3/JlaD/zJljv8/dJn/SH6e/02Fof9RiaH/Uomf/1OJnv9Th57/UoOe/019 + nP9EdZf/OWmP/y5hiP8nXIP/JVyD/ytjif80bZH/PHaY/z10mf87bpj/NmWS/ypahv8eT3v/HUx6/yBP + ff8lVIL/JVSC/yRUgv8jVID/IlN+/yZYgf8pXIT/KVyD/yhdhP8pX4b/Jl6E/yZdhP8oXYP/KV2C/y1g + gv8uYYL/MGGD/zBhg/8uXYL/K1h//yJPeP8bR3H/BxQh/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/GUpo/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8YU3X/AwcI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xAa + H/9UhKD/Wo6r/1qOqv9Zjqn/V4uo/1aKqP9ViKj/UYan/02Dpf9JgKL/Rn2f/0N5nf89dJn/OXGY/zdx + l/83cpj/OHSY/zp2mf8/e5v/Qn2c/0eAn/9LgqL/TIKh/0uAof9Kfp//Rnqf/0N3nv9Acpz/O2uY/zJj + kP8sXYv/K12K/ytfif8tYov/LWWM/y1mjP8tZ4z/LWeN/y9oj/8uZ4//LmaP/ytjjf8nXon/JFqF/yJX + gv8gVoD/JFuE/yhfh/8tY4v/MWmP/zJrj/8za5D/MmmN/y1ii/8pW4r/JlaH/yNQhP8gTYD/IU1//yFP + f/8hUYD/IlSA/yRagv8pYYf/MGmO/zZxlP83c5b/N3GV/zZvlP82bpT/N26X/zVqlv8yZZX/MGGS/y1b + jf8oVob/I1GA/x5LeP8cSXX/HUp1/yRTfP8oWIH/KFuD/yNXfv8eUnn/Gk10/xtNdP8dT3f/IVN7/yRW + fv8nWoL/Kl6G/yxhiP8uY4n/LmOG/zBkh/8wZYj/MmeJ/zFlif8xZYn/MGWJ/zBlif8vZIr/L2WM/y5l + jP8sZYz/LGSM/ytii/8rYor/K2CJ/y1iif8vZYr/MWmL/zRujf82bI3/N2iM/zdji/8yXYb/KVR+/yJM + dv8cRnD/Hkhx/yRPeP8qV3//MV+G/zVljP84aY//OWuT/zltlf85bZX/OG2U/zZrkf83bZL/OHGW/zly + lv88dJj/P3aZ/0F5mf8/eZn/QHqc/0B8nv8+ep7/OXWb/zRxmP8xb5f/MG+X/zNxmP84d5r/QH6e/0iE + o/9PiaX/U4ym/1WNpv9WjKb/V4qm/1mLqP9ajKr/WY2r/1aLqP9UiqT/UYii/02Dnf9JfZz/Q3aa/zxw + lv80apP/M2mS/zRslP84cZb/OHGW/zdulP81a5P/M2iR/zFkj/8vX43/K1qJ/yZVhP8iUn//IVd9/yZf + g/8taIr/NnCR/zp0lP88dZX/P3mY/0N7m/9DeZn/QXaW/z5yk/88b5L/PW+U/z1vlv86bJb/N2mT/zJk + jv8vYIz/LV2K/ytbif8pWIj/JVeH/yRXh/8kWIf/JluJ/yddiv8qYIv/LWSN/y9mjv8vZo3/LmWL/y9l + i/8wZYz/M2eP/zdrkv85bpP/N2yS/zVpjv8wZIv/LWCK/yhYif8jUIT/HUl7/x9Le/8nVoT/NWaQ/0Bz + mf9Jf57/T4ei/1GIof9SiJ//U4id/1GFnv9PgZ3/S3uc/0Rzl/85apH/LmGJ/ydbg/8jWoL/KWCH/zJq + kP81a5L/NWmS/zRkkf8sXYn/I1SA/xxNef8eT3v/IVF+/yNTgP8jU4H/IlSA/yNVgP8iVH7/IVN8/yNV + ff8kWID/JVmB/yJWf/8lWYL/JlqD/yVYgf8nW4H/LGCB/y1hgP8rXn//K1x//ytbgP8mVXz/IU94/xlH + cv8LJT3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TNEj/Gll+/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/wgYIf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FCAr/U4Od/1qNqv9cj6z/W5Cs/1iLqf9Wiaj/VIem/1KG + pv9Qhqb/S4Ki/0Z8nv9Depz/P3eZ/zp0l/85c5b/Onaa/z15nP9AfJ3/Qn6f/0V/n/9IgaD/TIOj/06E + o/9QhaP/UISj/0yAof9JfaD/Rnuf/0N2nv89b5n/NWaT/yxdi/8oWof/J1uG/yZchf8pYYj/LGWL/y1m + jP8vaI7/MGmP/zBpkP8waZH/LWaP/ypijP8nXoj/JFuE/yNag/8kW4T/KGGI/y9ojv81bZP/N3CV/zZv + kv81bJD/M2iO/y9hjf8sWov/KVSI/yZQhP8hTH7/Hkt7/x5NfP8gU33/I1mB/ypih/8ya4//N3GU/zpz + l/85cZb/OG+V/zlvlv85bpf/NWiV/zFilP8tXZD/KFaK/yNRg/8gTn7/HUt5/xtIdf8hT3n/J1Z//y1d + hf8rXYT/KFuC/yNWfv8fUnr/Gkx2/xlLdf8dTnj/IlR+/yhahP8sX4n/LmKJ/y9jif8wZIj/MWaJ/zNo + i/8zaYz/NGmM/zNoi/8xZor/MWaK/zBmjP8vZoz/L2aM/yxki/8qZIr/KmSK/ytkiv8sZIv/L2aL/zJp + jf81bo//OHCP/zlujv87a47/OWmN/zdkiv8zX4b/KlR8/yNMdP8eR3D/Hkhx/yVQef8sWIH/Ml+J/zRj + jf80Z5D/M2eR/zNokP8xaI7/MGiN/zJskf80b5P/OHOW/zx2mf8/eJv/P3iZ/0B5mP9Aepv/Qnye/0F7 + n/8+eZ7/N3Oa/zRymf8ycJj/M3KX/zh2mv9AfZ7/R4Sh/06IpP9TjKf/VY2n/1iMqP9Yiqj/WImo/1mL + qv9Zi6r/WYyq/1iMqP9ViaT/UYSg/0x/m/9Ed5j/PHCV/zdtlP82bZP/OXGW/zt0mP88dZn/PXWZ/zpx + l/85bZX/N2uU/zRnkf8vYYz/KluH/yRYgv8lXYH/KmSF/zNtjf85c5L/PXeW/z54l/9Ce5n/Rn6b/0qA + nv9IfJr/Q3aV/0BzlP8/cpb/P3GX/zxumP83aZT/MmWQ/y9hjP8rXIn/J1eG/yVVhf8lVob/JVeG/yZa + iP8oXYr/K2GM/y1kjv8wZ4//MmmQ/zNskP80bJD/NW2R/zZskf84bpP/O3CV/z1yl/8+cpf/OGyR/zJm + i/8sYIf/J1iD/yJNf/8dRnj/IEt7/ylXhP80ZY//QHOY/0l+n/9OhKD/T4eg/1CHn/9QhZ//T4Oe/01+ + nf9HeJr/QXGW/zpqkv8wY4v/KFyG/yRag/8jWoT/KV+H/y1fif8tXYn/KVyF/yNWgP8cT3n/HlJ7/yFU + fv8iVH//JFaB/yRXgv8lWIL/JVmC/yZagv8mWYL/JViA/yZagf8oXIT/KFyE/ylch/8sXoj/LF6G/y1i + hP8vZIP/LWKA/ytff/8pW33/KFl9/yVWfP8hUHn/HEt1/xQ6Xf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/w0fKf8cW37/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8QNEj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/0hy + hP9ZjKT/Woyn/1yPq/9ajav/WIqp/1WHp/9ShaT/UISj/0yBov9Fe57/QXib/z52mP87dJb/OXWW/zt3 + mP8+epv/QX6f/0eCov9JhKL/S4Si/06Fov9PhKL/UYWj/1OHo/9RhaP/T4Oi/0yBoP9IfqD/RXqg/z9z + m/82aJP/LF+L/yZZhf8jWIL/JFqD/ydehv8qYon/L2iO/zJrkf80bZP/NG6U/zRulf8zbZT/MGmR/yxk + jP8oX4j/Jl6G/yZehv8qYor/MGiP/zZvlP84cZT/OHGU/zdvkv80a5H/MmaP/zBfjf8tWIv/JlGE/yBL + ff8cSHj/HEx4/x1Rev8hWH//K2OI/zRskP85cZX/PHOX/zxxlv86b5b/Om6W/zZplP8yZJP/LF2Q/ydW + iv8hT4P/HUt//xxLfP8aSHj/HEp3/yFQe/8pWIH/Ll6G/y5ghv8sXoX/J1qD/yRXgP8hUn3/HU95/xtM + d/8hUX3/JleC/yxdh/8uYYn/MGOI/zFkif8zZ4v/NWmN/zVrjv81a47/NWuN/zNpjP8yaI3/MWeM/zBn + jf8tZYv/LGSK/ypjif8qZIn/LGaL/y1ojP8wao7/NW2Q/zpykf89c5L/PnOS/z5wkf88bY//OmqO/zdk + if80XoX/LVZ9/yVNd/8gSXT/H0h0/yZRfP8qWIP/Ll2I/y9hi/8tY43/LGSM/ytki/8taI3/LmqO/zFt + kf84cpb/PXaa/z95m/8/eJr/P3ma/0J8m/9DfZ7/Q3yf/z94nf86dJr/NXGY/zNwl/8zcJf/NnSX/z16 + nP9FgqD/TIek/1KLpv9VjKn/V4yp/1mLqf9ai6r/Wouq/1qLqv9bjKr/WYyp/1iLp/9ThaL/TH+d/0V4 + mP8+cpX/Om6U/zhvlf86c5X/PHWW/z93mP8/dpn/PnWZ/zxxl/87b5f/OGuU/zNmj/8rX4j/J1yE/yhf + g/8vZ4n/Nm+P/zpzk/89d5b/QHqY/0R9mv9JgZ3/SoCd/0t/nf9JfJr/Q3eY/0J1mP9Bc5n/PW+Y/zhq + lf8zZpL/LmGN/ylah/8kVIP/IVCB/yNTg/8mWIb/KFuI/ytgiv8tY4z/L2aO/zFoj/80a5D/OHCT/zt0 + lf87c5X/OnGU/ztylP8+dJb/P3SY/z5zlv86b5L/M2mL/y1ghv8pV4P/JE1//yBJe/8hTXz/KFaD/zJk + jP89cZb/RXuc/0mBnf9Lg57/TYSf/02Cnv9Mf53/SXuc/0V2mv8/cJb/OWqT/zFkjv8qXor/JVuG/yNZ + hf8jVYL/JVSB/yVVgP8iVH3/HlF6/x9UfP8iV3//JFmB/yhdhP8pXoX/Kl+H/ythif8sYon/LWKJ/y5j + if8uY4n/L2OJ/zBki/8wZIz/MmSO/zNlj/8zaIv/MmiI/zJnhv8vZIP/LWGC/yxfgf8qXYH/J1l//yRV + ff8gUHr/Hk14/wIFB/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BQ0R/xxbfv8aWn7/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/F05t/wIGCP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8xTlv/WIyj/1mMpf9bjKf/WYuo/1eKqP9Vh6f/U4Wk/1CC + of9NgaD/Rnqf/0F2nP89dZn/OnSW/zt1l/89eJn/P3yb/0J/nv9HgqH/TIak/06Hpf9Ph6T/UYej/1KG + ov9ShqD/U4eh/1OGof9RhaL/ToOg/0qAoP9GfZ//P3ac/zZslf8tYY3/JlqF/yNWgv8jWYL/Jl6F/ytj + if8waY7/NG6T/zZwlf83cpf/OHOY/zhzmf83cJf/M2yT/y1ljf8oYIj/KGCI/ytji/8vaI//M2yT/zZv + lP83b5T/N2+V/zZsk/81aJH/MmOQ/y5bjP8mUoT/H0t7/xtJd/8bTHf/G1F5/yJbgP8rY4j/M2yQ/zpy + lf88cpb/PXGX/zxtlf83aJL/MmOQ/yxdjv8mVor/H0+D/xpKfv8bSn3/Gkl6/xpJef8cSnn/IVB7/yhY + gP8uXoX/MWKI/y5hhv8rXoP/KVqE/ydYg/8kVID/IVB9/yBOfP8kVID/KVmD/y1fhv8uYYf/L2OI/zJm + i/81aY3/NmyP/zZsj/81a47/NGqO/zNpjv8yaY7/MGeM/y1ki/8qY4j/KWOH/ypkiP8sZ4r/L2qO/zNu + kv84cZP/PHSU/0F4lv9CeJb/QXaV/z9zk/89bpD/O2mN/zhkiv82YIj/MVmD/yhRfP8iS3f/Hkh1/yBN + ev8lVID/J1mD/ylchv8nXob/KGKJ/ypmi/8saY3/NG6S/zpylv89dZn/P3ea/z95mv9Aepv/Q3yd/0R+ + nv9FfZ//QXme/zx0m/82cJj/Mm2U/zJulP80cZX/OneZ/0N/n/9KhqP/T4mm/1KKp/9Wi6n/WY2p/1uM + qv9cjKr/W4up/1uKqf9aiaj/V4il/1OEo/9Mfp7/RHaZ/z5xlv86bpX/OG6V/zlylf87dJT/PneV/z92 + lv8+dZf/PHKW/ztvlf84bZT/MmaP/ytgif8oXoX/K2GH/zFoi/83b5D/O3SU/z13lf9Bepf/RX2a/0mB + nf9KgZ3/S3+d/0h7m/9FeZn/QnWZ/0F0mf8+cJj/OmyV/zRmkf8tX4z/JVeE/x9Off8hUID/JFOC/ydY + hf8qXon/LWKK/y9ljP8yaI7/NGuQ/zhukv88c5X/P3eX/z52lv88c5T/PXKU/z90lv9AdZf/P3SV/ztw + kf81aYv/MGGH/ytXhP8kT3//IEp7/yBLe/8mVoH/L2KJ/zdukP89dpb/Qnua/0V+mv9Gfpr/R36b/0Z7 + m/9Dd5n/QXOY/z5wmP85bJX/MmaR/ytgi/8nXIn/J1qH/yZVg/8iUH7/H096/x5Pef8fU3r/Ill+/yVd + gv8qYob/LmaJ/zBni/8vZ4z/MWqP/zJrjv8zbI7/NmyQ/zdtkP84bpH/NmyQ/zdrkv84a5T/OGyQ/zdt + jf83b4v/NGqI/zJnhv8xZof/MmaI/zBjh/8sXoX/KVqC/yZWgP8kVH7/Cxon/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/HlRy/xtZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8GEhn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/IDM9/1aK + pP9Yi6X/Woym/1mLp/9Wiqf/U4in/1CDpf9PgaL/TH6f/0Z5nv9AdJz/PHGa/ztzmf87dZn/PHmZ/0B+ + nf9Egp//R4Sh/0uGpP9Ph6X/Uoim/1KIpf9UiKT/VIei/1SHof9Uh5//VIeg/1KGoP9PhKD/TIGe/0Z8 + nv9Adpv/OXCX/y9lj/8nXYf/JFmE/yNZgv8nXoX/LGWL/zNskP82cJT/OXOY/zt2mv87dpr/PHaa/zx1 + m/85cZf/NGyS/y9mjf8oX4f/KmOK/y5nj/8zbJP/NG2U/zZtlP82bZX/NmuV/zVok/8zZJH/Ll2M/yZV + hf8fTX3/Gkp3/xlNd/8dVXv/I12C/ylkiP8wa4//N3CU/zxyl/88b5b/OGuU/zNmkP8qXYv/JliI/yFS + hP8ZSn3/G0t+/xxMf/8cS33/HEt7/x1Me/8gUHz/KFiB/zBghv8yZIf/MGOF/y5hg/8sX4P/K1yF/ylX + hP8nU4L/JVKA/yRTf/8nWIH/KVuD/ytdhf8tYIb/MGOJ/zJni/81a47/N26Q/zZtj/81bI//NWyQ/zJp + j/8vZ4z/LGOK/ylhhv8oYob/KWSH/y9pjP80bpH/N3GU/zpzlP8+dZX/QXiV/0R8mf9De5j/QXeV/z9y + kv8+bZD/PGqP/zpnjv82YYr/MFmF/ydQff8fSHb/GkVy/xpIdP8fT3v/IlV//yRbg/8mYIb/KGSI/zFr + jv85cZP/PXSX/z92mP9AeJr/Qnqb/0N8nf9EfZ7/RX2e/0V8nv9Ee6D/QXie/zpym/8zbZX/L2mQ/zJt + k/86dpn/QH6f/0eEo/9Lh6X/T4mm/1SKp/9YjKf/W4yo/1uLqP9aiqf/Womn/1iGpv9VhKT/UYGi/0t8 + n/9DdZn/O26U/zZqkv83bZX/OG+W/zpylf89c5T/PnSU/z1zlf87cJT/OGyT/zNokP8uY4z/KV6I/yle + h/8sYon/MWmN/zdwk/87dZb/PniX/0B5l/9De5j/Rn2a/0l+nP9HfJv/RHiY/0F1l/9BdZj/P3OY/z1v + l/84apP/NGSR/y5ei/8lVIP/IVB+/yJSf/8mV4P/KlyH/y1hif8wZoz/MmmN/zVrjv83bpD/PHKU/0F3 + l/9CeJj/QHaW/z90lP8+c5P/P3SU/0F1lf9BdZX/PXKS/zdqjP8yYYj/K1eD/yNOfP8eSHj/H0t6/yVU + gP8rX4b/MWiM/zVvkP86dZT/PHaV/z13lv89dpX/PnWW/z5zlf88cJX/OWyV/zdrlP8zZ5L/LWOO/ytf + jP8tXoz/K1mI/yNRf/8eTnr/HU54/yFVfP8lXID/K2OG/zFpi/8zbIz/M2yN/zNsjf80bo//N3GS/zhy + kv85c5L/PHST/zxzk/85cZH/OXCS/ztwk/86cZH/OnKP/zlwjf82bYr/NWqJ/zZriv82a4z/NmqN/zNm + i/8uYIf/KluE/ydYgf8WMUn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8aP1T/Glp+/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/EC9C/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/woQFP9Of5v/VIml/1aKpv9Yiqj/VYin/1KGpv9Og6X/Sn2j/0h7 + oP9FeJ7/QHSc/ztumv85bpn/OXGZ/zt2m/9Bfp//RYOh/0iGo/9Lh6T/Toim/1GJp/9Uiaf/Voqn/1aJ + pf9XiKT/V4ii/1eIof9Vh5//U4ae/1CEnv9LgZ7/Rnyd/0F3nP87cZj/MmiR/ypgi/8mW4b/JluF/ypg + h/8vZ4z/NW2R/zhxlf87dZj/PXeZ/z13mv89d5v/PXaa/zx0mf86cZf/NGyR/y9njf8rZIv/LmeP/zJq + kv8yapL/M2uT/zRqk/8zaJL/NGeT/zFjkP8tXYz/JlWF/x5Nfv8ZSXn/GU54/x5Xfv8lYIX/KWWJ/y5q + j/80b5P/OG+W/zltlf83aZP/MGOP/yhbiv8jVYT/HlCA/x1PgP8fT4L/IVGE/yBQgv8eT3//Hk59/yJS + ff8oWYL/L2GG/zNmiP80Zof/MWWE/zBjg/8uYYT/LF2E/ypWg/8nVID/JVR//yZWgP8mV4D/J1mB/ylc + g/8tYYb/MGaJ/zNpjP81bI7/OG+R/zhvkv82bZH/NGqP/y9ni/8rZIj/KWKG/ydhhP8rZYj/MWuO/zhy + lf87c5b/PXWV/z91lP9CeZf/RHuX/0R9mf9DeZb/QHWU/z9xk/8+b5T/PGuS/zdlj/8yXYn/KlSC/yFK + eP8ZQ3H/FkRw/xZHcf8cT3j/IVd//yVdhP8sZYn/NW2O/zxyk/8/dZf/QXeY/0J5mv9Ee5z/RXyd/0V+ + nv9GfZ3/RHud/0R7nv9EeqL/PXSe/zRtlv8vaZH/Mm2T/zh0mP8+fJ3/Q4Gh/0iFo/9Mh6P/Uomk/1eK + pP9ai6T/Woul/1iJpf9XhqT/VYSk/1OCo/9Pf6H/SHqe/z9ymP82apL/M2iR/zNpkv80a5b/OG+W/zpx + lP88cZT/PXCT/zptk/82aZH/L2ON/yldh/8nXIb/KF2F/yxhif8yaY//OHCV/zx1mP8+eJj/P3mY/0J6 + mP9Fe5n/RXuZ/0N5mP9AdZX/P3SV/z5ylv89cZf/O22V/zdnkv8zYpD/MVyO/ylUhv8jUH//JFSA/ypc + hv8uYon/MmeM/zRrjv82bpD/OHCQ/ztykv8+dZX/QniY/0N5mP9DeJf/QneW/0F2lP9BdZP/QnaV/0N2 + lv9AcpP/OmuO/zRiif8rWIL/IU55/xxIdf8eS3j/I1J9/ydZgv8sYYb/L2mK/zJsjv80bo//NW+Q/zZv + kP82bpH/N22Q/zZqkf80aJD/MWWP/y9jjv8vY4//LV+N/y5ejf8qWYj/JFSB/x9Pe/8gUXv/I1h+/yhe + g/8wZ4n/NG2N/zdwkP83cI//NnCP/zhykP86dJL/O3WT/z12lP89dpP/PXaS/zpzj/86cpH/O3KS/zx0 + kf89dZL/O3KP/zlwjf84boz/OG6M/zhujv85bZD/N2qO/zJki/8tX4f/KVuE/x1EYv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMoNf8fXoD/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpRcf8DBgn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/QGuF/1CF + o/9RhqX/Uoam/1CEpP9OhKT/TYGj/0l9ov9GeKH/Qnae/z91nP87cpr/OG6Y/zVrl/83cJn/PHid/0KA + ov9Ihqb/S4im/06Jpv9Qiab/Uomn/1aLqf9Yi6j/Woun/1mKpf9YiaP/WIii/1aHoP9Uhp//UIWd/0yB + nf9Ifp3/RHmc/z90mv83bJX/L2OO/yhbh/8pXYf/K2GJ/zBnjf82b5H/OnOV/z51l/8+d5n/P3iZ/z54 + mf8+d5j/PXSX/ztzlv85b5T/NGqR/zBokP8vZ4//L2iQ/y9nj/8wZ4//MGaP/y9ljv8wY47/LmCM/ytc + iv8mVoT/Hk59/xlKef8aTHr/HlZ//yRghv8pZov/LWuQ/zFtk/82bpX/NmuV/zRmk/8vYo//J1mI/yFT + gv8fUYH/IlOF/yVWiP8kVYf/JFSG/yJSg/8fUX//IVN//ydagv8uYYf/M2aJ/zVnif8zZob/MmaD/zBl + g/8wY4P/LV2C/yhXgf8kVn//JFR//yRUf/8iVX3/J1qB/ypehP8uZIf/MWiL/zRrjf83bZD/OnCU/zlv + k/81bJD/MGeM/ypjh/8nYYT/KGKF/yxmif8ybI//OHKV/zx0l/8/dpf/QXiX/0N7lv9GfZf/RnyZ/0V6 + mP9Bd5b/PnSW/zxwlv87bZT/OGeR/zFfi/8pVYP/IUt5/xxHdP8YRnH/F0hy/xlMdP8fVXv/JVyC/y5l + iP83bY//PHKS/z50lf9Bd5f/RHqa/0Z8nP9HfJz/RXyc/0V7m/9Ee5v/Qnmb/0B3nP88c5z/NG2X/zFr + k/8ybZT/N3OY/zx6nP9AfqD/RoOi/0uFoP9Qhp//VIig/1aIof9XiKL/V4ej/1aEov9UgqL/UoGi/019 + of9Fd5z/O3CW/zRokP8uZI3/LWSO/zBnkf81bJT/OG2U/zltkv85bJL/OWyT/zVpkv8vY47/KV2I/yRY + gv8mW4T/KmCI/zFoj/83b5T/PHWY/z54mv8/eJn/QXmZ/0N6mP9BeJf/QHaW/z5zlf89cpX/PXGV/ztu + lP85apP/N2aR/zRgj/8xWY3/KVKG/yBMff8iUX7/KluF/zJmjP81ao3/OG6P/zlykv89dZT/PneV/0B4 + lv9Ad5X/QXiW/0N4l/9EeZj/RHmW/0R3lf9GeJb/Q3WV/z9wkv87ao7/NmWK/y1bg/8iUHr/G0l0/xtK + df8gUXr/JliA/ylcg/8tY4f/L2eK/zBpjP8vaYz/MWqN/zBpjP8xaIv/MGaL/y5iiv8rXon/KlyI/ylb + if8sXYz/KFiH/yNTgf8gUH3/IVF8/yFSfP8lWH//LGGF/zNpi/84b5D/OnOS/zt0kv88dJL/PHWT/z12 + lP8/d5X/QHiV/z95lP89eJL/PHaR/zt0kf88dJL/PXWS/z52k/8+dZL/PHOQ/ztyj/86cI7/OW+O/zlu + kP84bJD/NGeN/y9iif8rXob/KFyE/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CxUb/yFe + gf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWn7/Chkj/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/yM9T/9Ifp//SX6g/0p/oP9KgKD/R3+f/0V9nv9FfKD/RHmg/0J2 + oP9AeJ7/PXeb/zl0mf83cJj/NW6X/zVwmP86eJz/Qn+h/0iEpf9MiKf/T4mn/1CIpv9Tiaf/VYmo/1mL + qv9bjKn/Woqn/1qKpf9YiKL/V4ih/1SHn/9Shp7/ToSc/0qAnf9HfJ7/Q3ec/z1wmP8zZpH/LWCL/ylc + h/8qXoj/MGaM/zZtkP87dJT/PnaW/0B3l/8/eJf/P3eX/z52l/8+dZf/PHOW/zlvlP81a5L/MGiQ/y1l + jv8rY4z/K2OL/yxkjP8sY4v/LWOL/y1iiv8sX4j/KlyH/yZYg/8fUX7/HU59/xxQfv8eU4D/JF6H/yhl + jP8raZD/MG2T/zNrlP8zZ5T/MWKS/ypbi/8jVYP/HlB+/x5QgP8iVIT/KVqL/yhZiv8mV4n/IlOE/x5Q + f/8gU37/J1qD/y9iiP80Z4v/NGeI/zRnhf8zZoP/M2eC/zFng/8tYoP/KF2C/yZZgP8kVn//JFR//yRX + f/8lWID/J1yC/yxhh/8vZYr/NGqO/zdtkf84bpL/OG6T/zZtkv8xaY3/K2SI/ydhhP8pY4b/LmiL/zNt + kP83cJT/O3OW/z52mP9BeJj/RHuY/0Z8mf9IfZr/R3uZ/0J4l/8+dZf/O3GX/zhrlP80ZZD/L16K/ydU + gf8jUH3/H014/xtKdP8dT3f/H1J5/yBUe/8jWX//LGOH/zVrjf87cJH/PXOT/0F2l/9EeZn/R3ub/0d8 + nP9Ge5v/RHqa/0N5mf9Ad5n/P3WZ/zpxmf81bpf/MWqT/zFrkv80b5X/OXaa/0B9nv9FgJ//SoOe/06E + nf9QhJ3/U4af/1WGoP9WhqP/VISi/1KBov9Qf6P/SXqf/0Bzmv84bZT/MGaP/ytiiv8qYor/L2eO/zRr + kf82bJL/NmuQ/zhrkP84bJH/NmqS/zFmkP8sYIr/J1uF/yVagv8oYIb/MGeO/zZulP87dJj/PHWY/z53 + mP9AeJj/QHiY/0B2l/8+dJb/PXKU/ztwk/86b5P/OGyR/zdokP80Yo7/NF2N/yxVh/8kTYD/Gkd4/x5L + e/8nWIP/MWSK/zZqjP84bo7/PHOR/z52lP9BeZb/QHeU/z92k/9AdZT/QneW/0R5mP9Gepj/RnqX/0V4 + l/9Cc5T/Pm2R/zlojf80ZIr/MWCH/yRUfP8cS3T/Gkpz/yFRe/8mWYD/Kl2D/y9jiP8xZor/MGeL/zBn + jP8vZ4r/L2eK/y5kif8sYof/Kl6F/ydahP8kVoL/IlSB/yJSgv8gUID/HEx7/xlJeP8bS3j/IFF6/yZZ + gP8tYob/NGqM/zpxj/88dJL/P3aU/0F4lv9BeJb/QnmX/0N6mP9Depf/QXqW/z96k/8+dpP/PnWU/z10 + lP8/dpX/P3eU/0B3k/89dJH/PHOQ/ztyj/86cI//Om+Q/zltkf82aY7/MGSK/ytghv8pXoX/Chgh/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/I1t8/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xtEXf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8LFRz/PXKX/0B1 + mf9Bd5r/QXia/0B3mv8+d5n/QHic/0F4nv9Ad5//Qnqg/0J7n/8/ep3/PXid/zp0m/84cpn/OHOa/zp3 + m/8+e53/RIGh/0qFpP9Nh6X/UIel/1OIp/9Wiaj/WIqp/1mKqf9aiqj/WYmn/1iIpf9XiaL/VYqi/1SJ + of9Rh6D/ToOf/0uAn/9HfJ7/QXOa/zhqlP8wYo3/KlyH/ypeh/8uYor/NWqO/zpwkf89dJT/P3aW/z92 + lf8/dZX/P3WW/z50lv88cZX/OG2U/zRok/8uZI7/KmGL/ylgif8pYIn/KmGJ/yxjif8tY4r/LWKJ/yxh + h/8rX4f/KFuE/yZZhP8kVoP/IVWB/yJXhf8kXIn/J2KN/ypnkP8taZL/MGiU/zFklP8sXI7/JFWF/xxN + ff8bTHv/G0x8/x5PgP8kVIX/KFiK/yhYiv8hU4P/HlF//x5Sfv8lWIL/LWGH/zNmiv81aIn/M2eG/zJm + hP8yZoL/MWWD/y1khP8sYYP/K16D/ypag/8nWYL/KFqD/ylbhP8oXIP/KV6E/yxih/8wZov/NGqP/zVs + kf81bJH/NGuQ/zFqjv8rZYn/KmSI/ytliP8uaIz/M2yQ/zZvlP85cZf/PHSX/z93mf9DeZr/Rnub/0d7 + m/9Gepn/QXaX/z5zlv86bpX/NWmS/zFjjf8rWob/J1eD/yVUgP8hU33/JFR9/yZWfv8nWX//Ild9/yJY + f/8mXYT/L2aK/zdskP87cZP/QHWX/0R4mf9GeZr/SHub/0Z6m/9EeJr/QniY/0F3mf8/dZn/O3GY/zVu + lv8wapP/LWeP/y9pkP80cJX/PHib/0V/n/9JgZ7/SoGc/0yCnP9Qg5z/VIWg/1SFof9SgqL/UICi/0p6 + oP9CdJv/O2+X/zRqkv8sY4z/KGCH/yxkif8xaY3/NWyQ/zlvkv85bpH/OW2P/zpujv83a5D/NGiP/y9k + jf8qX4f/J12F/yhghv8tZYv/NG2T/zhylf85cpb/OnOV/z10l/8/dpj/P3WY/z5ylv87cJP/OW6S/zZq + kP81aI7/M2OM/zFdiv8vWYj/KFOE/x9Ke/8bSXj/HUx7/yRUgf8sXof/MmaL/zdsjf87c5D/PnaT/z92 + lP8/dZP/PnOS/0B0lP9CdZX/RHaW/0R3lv9EeJf/RHaW/0Jylf87ao//NWWK/zFhh/8qWoD/IVJ4/xhK + cP8dT3f/JFZ+/yldg/8uYof/MWSK/zRni/80aI3/M2iM/zFojP8xaIr/L2aI/y1ihv8qXoT/J1qD/yJW + gP8dT3z/HE18/xpJef8WRnb/E0Jy/xREcv8cTXf/JVh//y5ihv81a43/OnGQ/z52k/8/d5X/QniW/0N6 + l/9Fe5j/RHuZ/0R7mf9Depf/QXmW/0B2lf8/dZb/P3aV/z92lf9BeJX/QHaS/z92kf8+dZD/PHOP/zxy + kP88cZL/PHCS/zdrkP8yZoz/LGGI/yhehf8UMEP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8fSWD/Glp9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8dWHn/AwYI/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/y1Xd/82a5L/Nm2S/zduk/84cJX/N3CU/zlzmP89dpz/P3ee/0J6 + oP9EfaD/Rn+h/0Z/o/9DfaH/QHqf/z13nf87dZv/Onab/z16nP9Bfp7/SIOh/0yFo/9Qh6X/U4im/1aJ + qP9WiKf/V4mo/1iJqP9YiKf/V4el/1aIpP9WiqP/Vouj/1OIov9RhqL/ToOh/0p/of9Ed53/O26W/zFk + jP8rXof/Kl2G/y1hh/8zZ4z/OW6R/z1yk/89dJP/PnSS/z50kv8+c5P/PXKU/ztuk/82apL/MWSP/yxg + jP8oXYj/J12H/yhfiP8qYYj/LWSK/zBni/8wZov/MWaK/y9kif8tYoj/LGCH/ypdh/8nXIf/JVuI/yVc + iv8lXoz/KGCO/yxjkf8vYpP/LV6R/yhYi/8fT4H/GUp7/xZHeP8WR3f/GEh5/x1Nfv8iUoP/JFSF/yNU + hP8fUYD/IFJ//yRXgv8rX4f/MWWJ/zJniP8yZ4b/MmaD/zBlhP8vZIT/LmSF/y9jhf8wYob/MWCH/y9f + h/8sXof/K16G/ypehf8qX4X/KV6E/yxhh/8vZIr/MWeN/zFpjv8waI3/LmeM/y5ojP8uaIz/LmiM/zBp + jv8xapD/NW2U/zZulP85cJb/PXOX/0J3mv9EeJv/Q3eZ/0F2lv8/dJb/PXCV/zlslP8zZ5D/LWCK/yha + hv8nWYT/JlmE/ylchf8sXob/LmCG/ypcg/8kWYD/IViA/yZdhf8rYon/MmiO/zhtkv88cZX/QXWY/0V3 + mv9GeJv/Rnmb/0R4mv9Dd5r/Qnea/z93m/87cpj/NW2W/zBpk/8rZY//K2SN/y9pkP85c5j/QHqc/0Z9 + nP9HfZv/Sn+b/02Cnf9Qg5//UIKg/05/oP9Jep3/QHOZ/zltlf80aZL/L2WO/ylgif8rYon/L2aL/zNq + jf84b5H/PXOU/z5ylP8+c5L/PHCP/zltjv81aY//MGSN/y1iiv8rYYj/K2OJ/zBpjv8ybJH/NW+T/zVv + kv83cJP/OXGU/ztylv88cpf/PHCV/zltkv81aY//M2aN/zJjiv8wXof/L1uG/y1Zhv8pVoT/IU99/xxK + eP8cTXr/IVJ+/ylahP8xYon/N2mN/zpvj/89dJH/PnST/z5zk/8/c5P/QHOW/0Fzlf9Cc5X/QXOU/0Bz + k/9AcpX/PW6S/zZliv8uXoX/K1uC/yNUev8bTXP/Gk1z/yBTef8mWX//LGCF/zFlif81aIz/N2qN/zhr + jv83ao3/NmuN/zRqi/8yaIr/MGaI/y1jhv8qX4X/JVuD/yJWgf8dT33/GUl4/xRDc/8RQHD/EEBt/xhJ + dP8jVX3/LmGG/zdrjv87cZH/PnWT/z93lP9BeJX/RHqW/0R6l/9Fepj/RXqY/0R5mP9CeJb/QXeW/0F3 + lf9AdpT/QHeU/0B2k/9Bd5P/QHeS/z91kP8/dJH/P3SS/z90lP89cpT/OW6S/zNojv8sYon/KF+G/x5H + ZP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xYvPf8bWn7/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/HFt//xAqOv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8cNUr/M2aQ/zBl + jv8wZo3/MmmQ/zNrkf81bpT/OnSa/z54nv9CeqH/RXyg/0iAov9JgqP/SoKl/0qEp/9Hf6P/Q3ug/z93 + nv89dZz/Pnic/0J9nv9HgqH/TYaj/1GIpv9Uiqf/VIim/1WIp/9ViKf/Voip/1aIqf9Wh6f/V4im/1eK + pv9XiqX/VImk/1KHo/9PhKL/TICi/0h8n/8/cpj/NWiP/y1gh/8pXIP/LGCG/zFliv83bI//O3CS/zxy + kv88cpD/O3GP/ztxkP87b5H/OGqR/zNkj/8uYIz/KVyI/ydbh/8nXYj/KV+I/y1ji/8wZ43/NGuO/zZt + jv82bI7/NmuN/zRpjP8yZov/L2OL/ythiv8oXon/JVyJ/yRbi/8mW4z/KlyP/yxbkP8pWY7/JVWJ/x9P + gv8XR3r/E0R1/xRFdv8WRnf/GEh5/xtLfP8dTX7/H0+A/yBQgP8fUH//I1WB/yhchv8vY4r/MmaK/zFn + h/8vZYX/LmWG/y1khv8vZIf/MGSH/zNkiP82ZYz/NmSM/zNii/8uYIj/K2CH/ypfhf8pXoT/KF2D/yle + hP8qYYf/LGOJ/y1li/8tZoz/LmeN/zFrj/8zbJD/M2yS/zRtlP8ya5L/M2yT/zdulP87cZf/PnOZ/0B0 + mv8/c5j/PHCU/zptk/86apT/NWaR/y9ijP8pXYf/KFyG/yddhv8pXob/L2OL/zRnjv80Z43/L2OJ/ydd + hP8kW4P/J16H/ytii/8tZI3/MWiP/zZskf87cJX/QXSZ/0N2mv9Ed5v/Q3ea/0J3mv9Bd5r/P3WZ/zpx + l/81bZX/LmaS/ypjj/8qYo3/L2eR/zVulf88dZj/QHiY/0R5mf9HfJr/S36c/0t+nf9Je5z/Rneb/0By + mP82aZP/MGWQ/y5kj/8rYYv/K2KL/y9mjv8yaY7/N22P/zxxkv8/dJX/QXaW/0B0lP89cZL/Om6Q/zVp + jf8vY4v/Kl+I/y5li/8xao//NG6T/zRukv8zbZH/NG2Q/zVtkf82bZL/OG2T/zlulP85bJT/N2qR/zRn + j/8yY4v/MGCH/y9ehf8vXYb/MF6J/y5diP8pWIT/IFJ9/xhJdP8bTHf/I1R+/y9fh/84Z4//PG2R/z1w + kv8+cpT/PnKU/z9xlv8+cJX/QHCW/0BwlP87bJH/OWuP/zdpj/8yZIr/KlqC/yRVff8kVHz/HlB3/xpO + dP8cUXb/IVZ7/yldg/8vZIj/NGmM/zhsj/86bpH/PG+R/zxwkP86bY//OGyN/zhrjP81aoz/MWiL/y5m + iv8tY4n/Kl+H/yVZhP8dT33/F0Z2/xNCcv8UQnH/GEd0/yFSfP8tX4b/NmmN/zxwkv8/dJP/QHaU/0F4 + k/9CeZT/RXqW/0Z7l/9EeJj/Q3eY/0J3l/9Cd5f/QniV/0F3lP9AdZL/QHaS/0F3kv9CeJL/QXeS/0F1 + kf9BdZP/QXWW/z9zlf86bpP/NGiO/ythiP8mXYT/KWCI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/EB4l/yFegf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8ZUG7/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CxQc/zVnkv8vY47/K2GL/y1kjf8vZ4//MWuS/zdxl/88d57/QXui/0d/ + o/9LgaP/TIOk/0yEpf9Nhab/TYWm/0uDpv9HfqL/Qnqf/0B2nf8+dJz/Qnmd/0iBoP9OhqP/VIun/1OJ + pv9TiaX/U4in/1WJqf9Wiar/Vomp/1aIp/9XiKb/V4mn/1eJp/9ViKX/UoWk/0+Eov9NgKH/SXyf/0N2 + mv86bZL/MWOJ/ytehP8sX4X/MWWK/zZqjv85bZH/Om+S/zpukP85bY3/OW2N/zhqjv81ZI7/L1+L/yla + h/8nWIb/JlmG/yhcif8rYIv/MWaN/zZskf84b5L/O3KS/zxzkv87cZH/OW6Q/zhsj/80aI7/LmOM/ypg + iv8kW4j/IliI/yRXiv8nVov/J1SL/yRTif8iUob/HU2A/xhIe/8URXf/FEV2/xdHd/8WRnf/F0d4/xhI + ef8cS3v/HUx8/x5NfP8fUH7/JleD/y1hif8yZ43/L2aJ/y1mh/8rZIf/LWWI/zBliP8xZYn/NGaL/zZn + jf84Z4//NGWO/zFji/8sYYn/Kl+G/yhehf8oXYT/JlyD/yVcg/8nXoT/KWCI/y1ljP8xaZD/M2yS/zZu + k/83cJb/Nm6W/zRslP8yapL/NGqT/zhtlv87b5j/Om6V/zhslP83apL/NWWP/zNijv8vYIz/KVyH/yhc + hv8nXYb/KGCH/yxki/8yaI7/N2yS/ztvk/84bZH/MGaM/ytiiv8nXoj/KWCK/ylhi/8qYYv/LGKL/zJn + jv84bZP/PXKY/0B0mf9BdZn/P3SX/z50mP88cpb/OW+U/zNqkv8tZo//KGGN/ypfjf8uYo7/M2iT/zdu + lf88c5f/QXaY/0R5mf9EeJj/Q3aY/0F0mP88b5X/NWmS/y5ijv8sYIz/KF6K/ylfi/8vZY//M2mQ/zZt + kf86b5H/PXKU/0B1lv9BdJf/QHSW/z1xk/84a5H/MmaN/ytfh/8rYIn/L2aO/zRuk/83cpb/N3GU/zZw + k/81bZH/NGyQ/zVskf82a5H/NmqR/zVpkP80ZpD/M2WO/zNki/8yYof/MWCF/zFhh/8zYon/M2WN/zFk + jP8oW4T/Hk96/xZHcf8eTnj/K1mD/zZjjP89apP/Pm2U/z5vlf8+cJX/PW+V/ztsk/87apL/OWmQ/zNl + jP8uYoj/LGCH/ydagv8gUXr/IlN8/yFTfP8eUXn/HVJ4/x1Uef8jWn7/KmGF/zJpjP84b5D/O3KS/z1z + k/9AdZP/QHWS/z9zkv89cZH/O26P/zpukP83bpD/NGuP/zJpjf8yaI3/LWGK/ydZhf8fT37/GEd2/xdG + df8aSXb/IVF9/yxchf81Z43/PG6S/z9ylP9AdZT/QXeT/0N6lf9GfJb/RnuX/0N4mf9Cdpr/QXaY/0F2 + lv9Bd5X/QXiT/0B2kv9Bd5H/Q3mT/0R5k/9EeJT/Q3WT/0J1k/9BdJT/P3OV/ztvk/80aI7/K2GJ/yhe + hv8qYIj/CRMa/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/I2GE/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/wsaIv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8qT3D/MWOQ/ype + iv8qX4r/LWON/y9nj/8zbJT/OHOa/z15n/9GfqP/TIKl/0+Epv9PhKX/T4Wm/1CGpv9Qhqb/TYSl/0qB + o/9GfaD/Q3md/0B2nP9Adpz/Rn2g/02Fpf9Riqb/Uoql/1CIo/9SiaX/VIup/1aMq/9Wiqn/Vomo/1aI + p/9Xh6j/V4eo/1aGp/9ThaT/T4Ki/06Bov9JfJ//RHea/z1vlP81Z4z/L2GG/y1ghv8wYoj/M2eN/zZp + j/83apD/N2mP/zZnjf82Zoz/NWSM/zBfif8pWYX/JVWC/yNUg/8lWIb/KVyJ/y1hjP8zaJH/OW6T/z10 + lv8/dpf/QHeW/0B2lf8/dJT/Om+S/zZqkP8yZY7/K2CL/yZbiP8jWIf/IFOE/yFRhf8gT4T/HU2D/xxL + gf8aSn7/GEh7/xpKfP8aSnv/GUl6/xlJef8YSHn/GUl5/xpJef8cS3v/G0p6/x1Me/8jU4D/K12H/y5j + iv8sZor/KGSG/ypkh/8uZYj/MWeK/zNoi/82aY3/OGqP/zhqkf82aJH/M2WO/y5ji/8sYon/KmCH/yle + hv8mW4T/JFmD/yJYgf8mXYb/KmGL/zFokP82bJP/OG+V/zlvlv83b5b/NWyU/zJpkf8zaJL/NGiS/zVp + kv81aZH/M2eQ/zJjjv8vYI3/LF6K/yhahv8nW4b/J1yG/yleh/8sY4r/MGmO/zVtkf86cJP/PnOV/z90 + lv84b5P/MWmQ/ytjjf8nX4r/JF2J/yNch/8jWoX/JlyG/y9ljf82bJP/Om+V/ztwlf87cJT/O3CV/zlu + k/83bJL/MmiP/y5kjP8qX4r/KlyK/ytbiv8uYI7/MmaR/zhtlP8+dJf/P3SX/z1xlf86bpH/OWyS/zVp + kP8vY4z/LWGN/ypfjP8oXov/LGKN/zBmkP81a5L/OG6S/ztwk/8+cpX/QHSX/z9ymP8+cZb/O22U/zZp + kP8vYoz/K1+K/yxgi/8xZ5H/Nm6V/zhylv86dZf/OHKU/zZvkv82b5L/OG6S/zdtkv82a5H/NWiP/zRn + jv8zZ43/NWeL/zNlif8yY4b/MmOI/zVmi/82aY//NWmP/yxgiP8iVX7/HU54/x9OeP8nVH7/MV2H/zhk + jv88apP/O2uT/zprk/83aJD/MmKM/zFhiv8vYYn/KlyE/ylcg/8oXIT/I1d//yVYgP8nWoL/JVmC/yRZ + gv8jWYD/Ilp//yVdgf8sZIf/NGuN/zxzk/8/d5X/QHiV/0J5lf9Eepb/Q3mV/0F2lP9Bc5X/QHGW/z1w + lP85cJL/N26R/zRqj/8zZ4//L2GM/yhZhv8hUX//G0p4/xxMeP8iUn3/LFyG/zVmjv87bZP/P3KV/0F1 + lf9Dd5X/RXuW/0h9mP9Fe5n/Qnia/0F2m/8/dJj/QHWV/0F2lP9AdpL/QHeR/0F4kv9EepT/R3yW/0Z6 + lf9GeJX/QnST/z9xkv88b5L/OW2S/zRojv8vY4v/LGCK/ytgif8VLT7/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8fUGz/G1t+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8YR2D/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Fyg6/zRkk/8rXYz/KF2J/ypfiv8tY47/L2aP/zFqkv83cZn/QHmf/0h+ + pP9Ogqb/UIWm/1CFpf9RhqX/Uoel/1KGpf9QhaX/TIKj/0l/of9Ge57/Qnic/0J5nf9De5//SIGj/02G + pf9OiKT/T4mi/1GKpf9UjKj/VY2q/1eMqf9Wiaf/VYem/1WHp/9Vhqf/VIWm/1KDpP9PgaH/TH+g/0t+ + oP9GeJv/QHKW/zZojf8uX4b/LF2E/y1ehf8uYIn/MWSM/zFki/8xYov/Ml+L/zJdi/8wXIf/KleC/yFP + ff8fTn3/H1CA/yJUhP8pXIr/L2OP/zVqkv86cJX/P3WX/0R7mv9Fe5r/RXqa/0F1lv89cZT/OGuR/zJl + j/8tYY3/Kl+L/yRaiP8gVIT/G01//xhJff8YSHz/F0d7/xZFev8bSn7/H06B/yFQgP8iUYD/IFB9/x5O + fP8eT33/HU18/xtLev8bS3r/HUx7/yNSgP8oWYX/KmCI/ydjh/8nZIb/K2WH/y9mif8yaIr/NWuM/zhs + jv85bZH/OW2S/zhskv80aI//MWaN/y9kjP8vZYz/LGKJ/yhehv8lWoT/JFmE/yRbhP8oX4n/L2SM/zZq + kP87b5T/OW6V/zhtlP80apP/MGaP/y9kjf8vY43/L2SM/y9jjf8uYIz/LV6L/ytcif8pW4f/JlqF/ydb + hf8pXYf/LGKJ/zBojf81b5D/OXKS/z5zlf9Bdpf/P3SX/zxylv83bpT/MGiQ/ylhi/8jW4f/HlaD/yBY + g/8jWoX/Jl6H/y5ljf80a5L/NmyS/zZskf82bJH/N2yS/zdskv80apD/L2SN/ypdiv8nWYf/J1eH/yhX + iv8rXIz/MGKO/zZqkv86b5T/N2uQ/zVpj/8yZ4//MGWN/zBlj/8vZJD/LGGO/y1jkP8wZZD/M2iS/zVp + kf83a5L/OW6T/z1wlv8+cZj/PnGY/zxul/84apT/MmWQ/yxgi/8qX4r/LWKN/zJnkv83bZT/OnKW/zt0 + lv86c5X/OnKV/zpylP87cZT/O3CV/zpuk/82apD/NmmO/zZrjP81aoz/NWiK/zJkh/8zZIj/NmeM/zpt + kv82aZD/L2KK/yVZgv8iVH3/I1J8/yZUfv8sWIL/MV6I/zRijP82ZY//M2SN/y5gif8pWoT/KVmD/yda + g/8mW4L/Kl+F/y1hiP8sYIf/LWGJ/zBkjP8uY4v/LGKJ/ylgiP8nYIX/KGKF/y1nif80bo//O3ST/z95 + lv9Be5X/Q3yX/0V+mP9Gf5j/RXuZ/0R3mv9EdZv/QXSW/z1yk/86cJL/N22R/zRpkP8zZY7/MGGL/yhZ + hP8iUX3/H056/yJRfv8qW4X/NGWN/zxtlP8/cpf/QXSX/0N3l/9He5n/RnqZ/0N4mv9Adpv/PnOY/z50 + lv8+dJT/P3SS/z91kv9Ad5L/QnqU/0R8lf9GfJb/SHuX/0d5lv9EdZX/PnCT/zttkf82aY//MmaN/zBk + jf8uYoz/L2SN/yFEWv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x9DWf8bWn7/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/G1l+/wcNEf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wQHCf81YY7/LV2O/yhZ + iP8qXIr/LGCM/y1jjf8tZI3/L2iQ/zRtlP8/dZv/SX2i/02BpP9PhKT/UYak/1KHo/9Sh6T/U4ij/1KG + o/9Pg6P/TICh/0h8nv9EeZz/Q3mc/0N7n/9Gf6L/SoOl/0yGpf9NiKP/UImk/1OLpf9Viqf/VYqn/1WJ + p/9Thqb/VIWm/1SFpv9ThKX/UYKj/05/oP9Lfp//Sn2e/0h6nP9Bcpb/N2iO/y9fhv8nV4D/J1aB/yhY + g/8pWob/KlyG/ypahv8rWIb/LFaG/ylSgv8iTnz/HUp5/xhHd/8XSHj/IFKC/ydbif8uY4//NGqT/ztw + lf9Adpj/RXub/0l+nv9IfZ7/RXia/z9xlf85apL/M2WP/y1gjf8qYI3/KF+N/yJYh/8bT3//FEd5/xFC + df8SQnb/GEh7/x9Ngf8jUYT/J1aF/ylYhf8qWYX/JlaC/yRUgP8iU37/IFB8/x1Nev8eTXv/IVB//yZY + hP8mYIf/JWOG/yhkhv8tZoj/MGmJ/zVqi/83bIz/OW+O/zpwkf85b5L/N22R/zVrkP8zao//NGuR/zNq + kP8xZ43/K2GJ/ydchv8lWoX/JVqG/yldhv8vYYj/NmeL/zhqkP86a5T/N2qT/zFnj/8uY4z/K2CI/ypf + h/8qX4f/Kl6I/ypciP8qXIj/Kl2I/yldiP8qXoj/Kl6I/yxhiv8vZov/M22O/zdykf87dZP/P3eV/0J3 + l/9Cdpj/P3SY/zlvlf8yaZH/K2ON/yRciP8gWIX/H1iF/yNch/8oX4n/LGSM/zBoj/8yapD/NGqQ/zVr + kP84bZP/OW6U/zhtk/80Z5L/LF+M/yRWhf8iU4P/IVGD/yNShf8nV4j/LF6L/zBjjf8yZo3/MWaN/zBm + jf8xZ5D/NWyV/zRqlf8zaJT/M2iT/zVplP8zZ5H/NGeP/zVokP82aZH/Om2V/zxvl/89cJn/Om2X/zZp + lP8wY5D/K16L/yldif8rYIv/MWeP/zdtk/87cpX/PHOU/ztzlP88dJX/PnaX/z50lv8+c5X/PHGV/zpv + kv84bo//OG6N/zhtjf84a4z/NGeI/zRmiP82Z4z/OGqP/zhrkf8zZoz/K16G/yRXgP8jU33/IlF7/yVU + fv8pVoD/KlmD/ytchv8pXIX/I1iB/yVYgf8mWYH/JluC/ytgh/8wZov/NGqO/zZskP83bZL/N22S/zVr + kf8zaZD/L2aN/ypjif8qZIj/LmmL/zVwj/86dpT/PXmV/0B7lf9Cfpb/RYGY/0Z/mv9GfJz/R3qe/0V5 + m/9Ddpf/QHSU/z1zkv86cJH/N22Q/zVoj/8xY4z/K1yG/yVVgP8hUXz/I1N//ylahf8yZIz/Om2T/z9y + l/9AdJf/QXWW/0J2l/9Cd5v/QHac/z1zmP88cpX/O3GS/z1zk/8+dJP/P3WS/0B3k/9CepT/RHuV/0Z8 + l/9Ge5b/R3mX/0R2lv9AcZT/OmyS/zVnj/8xZIz/LmKL/y5jjP8yaY7/LFl2/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/GDA+/x5cgP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8ZP1P/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/JEBW/zZmk/8qWon/KVqJ/y1ejf8vYY//LGKM/ytiiv8tZYz/M2qR/zxx + mP9FeZ7/TICi/0+Eo/9RhqP/Uoai/1SIov9UiKL/U4ei/1CEov9NgqH/Sn6e/0Z7nf9BeJv/Qnqc/0R9 + n/9IgaL/SoSl/0uGpP9OiKP/Uoik/1SIpP9ViKX/U4al/1KFpf9ShKX/UoSl/1KEpf9Rg6P/ToCh/0x+ + n/9KfZ7/SHqc/0Bylf83Z43/Ll6H/ydVgf8hT37/IU9+/yJSgP8jU4H/IVJ//yRRf/8mUYD/JE5+/yFL + ev8bSHf/FkRz/xVGdv8aTX7/JFiH/ytgjP8xZ5D/N22U/z90mP9EeZv/R3yd/0d7nf9Ed5v/P3CW/zhp + kv8xY4//K16O/yldjv8nXYz/J12L/yBVg/8WS3r/EENz/xFCc/8aSnz/IE+C/yNShP8mVYX/LVyI/zBe + if8vXof/K1uD/ydYgP8jVH7/H1B7/x5Nev8gUX7/JFiD/yVghf8nY4b/KmSG/y5miP8xaIj/NmuK/zdt + i/86cI7/OnGP/zlwj/82bY//Nm2Q/zZtkf83b5P/Nm2Q/zNpjf8wZYn/K1+H/yZahv8oWoX/K1uD/zBf + g/8zYYj/NWSM/zZlkP8zZo7/L2OM/ythif8pXof/KFyE/yhcg/8oXYT/Kl6H/yxfif8tYYr/LmKL/zBk + jP8wZY3/MGaM/zJpjP80bo7/OXSR/zx4k/8+eJT/P3eW/0B2mf9AdZr/OW+W/zNpkf8sY47/J1+L/yRc + if8kXYn/KGGM/y1lj/8waZH/MWmR/zBoj/8xaY//NWyS/zlwlf88cZf/O2+X/zhrlf8yZJD/J1mI/x1O + fv8aSnz/GEh7/x5OgP8kVIX/K1yI/y9jjP8xZ47/MmiQ/zVtlP84cZn/OnKa/zlwmP84bZb/NmqT/zNm + j/8yZY3/MWSM/zNljv82aJH/OmyV/zttl/85a5f/NWeU/y5hjv8oW4j/JFeF/ytgiv8xaJD/N26T/zpx + kv88c5P/PHST/z10k/8+dZT/PnWV/zxyk/88cpP/O3GS/zpxj/88cZD/PHGR/ztvkP84a43/NmeK/zVm + iv82aI3/NmmO/zRnjv8tYIj/J1mC/yFSe/8dTHb/Hk13/yBQev8hUnz/IVN8/x9Uff8iWH//JVuA/yle + gv8sYob/MmmM/zhvkv85cZL/PHOV/z10lv86cpX/OXCU/zduk/8za5H/LmiN/ytliv8uaYz/M2+Q/zp2 + k/8+e5X/QX2W/0N/mP9FgZn/Rn+a/0d8nf9HfJz/Rnuc/0V5mf9DeJb/QHaT/z5zkf86b5D/N2qP/zJl + jP8sXob/JVeA/yFTff8iVH7/KFuD/zFkjP84bJL/Om+T/ztwk/88cJT/O3CW/zxxmP87cZj/Om+U/zhu + kf86cJL/PXOT/0B2k/9AdpP/QXmU/0J6lf9EfJb/RHuW/0V6lv9EeJX/Q3WW/0Bxlf87bJP/NWaO/y5g + iv8rXoj/LmOL/zFojv82bpH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8PHSX/IV+C/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/IF6C/wYNEf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wkOE/89bZj/NGOP/ytc + if8pWoj/Ll+O/y9ij/8tYoz/K2KK/ylgh/8vZIz/OG2T/0J3nP9Lf6D/T4Oi/1GFov9ThqH/U4eg/1WI + oP9ThqD/UYSg/06Bnv9JfZ3/RXmb/0J3mf9Ad5n/QXmb/0V+n/9HgaH/S4Oj/1CGpP9ThqT/VIak/1OG + pf9ThqX/UYSk/1CDpP9Qg6P/UYSk/1GEpP9PgqL/ToGh/0x/n/9Iepz/QXOX/zhpj/8tXIb/JlSB/yFO + f/8eSn3/Hk19/yBQfv8gUn7/I1F9/yZSf/8nU4D/JVF+/x9Mef8ZSHb/FUV1/xhKe/8dUoH/JVuH/y1j + jf8zaJD/OW6U/0B1mP9Cd5n/QnWY/z9yl/88bZT/NGSP/y1djP8nWIv/JlqK/yZbiv8mW4n/JFqG/xxS + f/8WS3n/GEx7/xtOff8hUoL/JFOE/ydWhv8sWof/MmCK/zNhiP8vXoT/K1uB/yVXff8fUXn/HU55/x5S + fP8jWoP/J1+G/yphhv8sY4b/LWOF/zFlhv81aIj/OGyL/zlvjf85b47/Nm2N/zVsjv82bZD/OG+S/zhu + kv83bZH/NWqN/zJniv8vY4f/LF+G/ytbhP8tWoH/L1uB/zBchf8wXYn/MF+L/y5fiv8tX4n/LF+I/ype + h/8pXYT/KV6E/ypghf8tY4n/MWWM/zNnj/81aZH/N2uT/zVrkP81a47/NGyN/zVuj/84cpL/PHWU/zt0 + lP87dJb/O3KX/ztxmP84bpX/MmeQ/yxijP8oYIv/KWGN/ylijf8uZ5H/M22V/zZwl/81bpX/M22S/zFr + kP80bZL/OXGX/zxxl/89cJf/Om2W/zNmkf8pXIr/IFGA/xZGd/8URHX/GEh4/x5Ofv8qW4f/MWSM/zRq + j/82bpL/OnOX/zx1mv88dZn/PXWZ/z1zmP85bpP/NWmQ/zFki/8vYor/MGOL/zNmjv81Z5H/OGmU/zdo + lf8yY5H/K12L/yNWhP8lWYb/LGGL/zNpkP82bZH/OXCR/ztykf88cpH/PHKR/z1zkv89c5L/O3OR/zpz + kf86dJH/PXOR/z90k/9AdJT/PnGR/zpsjv84ao3/NmiL/zVoi/80Z4v/MWSK/y1gh/8nWoL/IVJ8/xxM + dv8XSHL/GUp1/xtNeP8cT3n/H1N7/yVbgP8sYoT/L2aH/zNqi/84cJH/O3OT/zt0kv89dZT/PneV/zx1 + lf87c5X/OnKW/zdvlP80bZL/MWuQ/zJsj/82cpL/O3iV/z57l/9Cf5j/RICZ/0aAmv9Hf5v/R32b/0d8 + m/9HfJr/Rnua/0Z7mP9DeZX/QHWS/ztxkP84bI//MmWL/ytehv8kV3//IFN8/yFUff8nWoP/MWSL/zRp + jv81bI//N22Q/zVqkP81apL/NGmT/zRpkP80aY7/NmyP/ztxkv8+dJT/QHaU/0F3lf9CeZX/Q3qW/0R7 + lv9Fe5f/Q3iW/0J2lv9Ac5X/P3CV/zlqkf8xY4v/K12H/ypeh/8rYon/L2iM/zZvkv8PHSX/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8lYoX/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtafv8RMEH/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/MlV0/zpolP8xX4z/KFiF/yVWg/8qXIn/LmKN/y5ljf8pYIj/KF2F/yle + hv80aY//P3OY/0h8nv9Qg6L/UYSh/1KFn/9Thp7/U4ae/1KFn/9Rg57/ToCd/0l8m/9FeJj/QHSX/z50 + l/8/dpn/Q3ud/0d/oP9MgaH/UYSj/1SDo/9Sg6L/UYOj/1GEpP9RhKP/ToKi/06Cov9PgqL/ToKh/0+D + ov9OgqH/S3+f/0Z6nP9BdJj/N2mQ/y5diP8lU4H/IE1//yBNf/8gUYD/IVWA/yVZgv8pWoT/LVuG/zBd + iP8wXYf/KliC/x9Oef8YR3X/F0l4/xtPff8fVYP/JVuH/yxiiv8yZ43/N2uQ/ztukv88bpL/OGmP/zNj + jP8vXIr/J1WI/yRThv8jVYb/JViH/yZbh/8lW4b/IViC/yJZg/8iWYP/JVqE/yZahv8pW4j/LFyK/zFf + jP80YYv/NWKK/zNihv8uXoH/KFl9/yJUef8dUHj/HVF6/yJWf/8nXIT/K2GG/y1ihv8uYYX/MGKD/zRn + h/82a4r/OG6M/zdujf82bY3/NW2N/zZtkP83bZH/N22R/zZskP82ao7/NWmL/zNmh/8xYYn/MV2J/y9Z + g/8sVYH/LFWD/ytWhf8qWYb/K1uH/yxdiP8tX4n/LmKI/y9jiP8wZYf/MWaJ/zNpjP83bJD/Om+T/z1x + lv88cZb/Om+T/zlvkP81bI//NWyQ/zlwk/85cZP/OHGU/zhwlf82bpb/NWyV/zNpk/8tYo3/KmCK/ylf + iv8pYoz/LmaQ/zJrlP83cZj/OnWb/zt2m/84c5f/NXCU/zVukv83b5P/OnGV/ztvlf85a5T/M2WR/ytd + iv8hUYD/GEd4/xRDc/8VRHP/HU58/yhahf80Z43/OG2Q/zlwkv88dJb/PHWW/zx1lv8+dZf/P3WX/z5z + lf86bpL/NWmO/zFki/8wYov/MmSN/zFkjv8yZI//MWKP/y5fjP8mWIb/I1aD/ydahv8tYov/MmiO/zVs + j/85b5D/OnGQ/ztxkP88cZH/PnOS/z90k/89dJL/PXaT/z14lP8/dpX/Q3eW/0J1lf8/cZL/PW2P/zlr + jv83aY3/NWmM/zJmiv8vZIn/LGCH/ydbgv8gU3v/HE53/xhJdP8WSXT/Gk14/x1Re/8jV4D/LmOH/zNp + iv80a4v/OHCQ/zt0k/88dpP/PXeT/z54k/9AepT/P3mV/z53lv89dZf/O3OX/zhxlf83cJT/OHKV/zt2 + mP89eZn/QHyZ/0J+mv9FgJr/R4Ca/0h/m/9GfZn/Rn2Z/0Z9mf9IfZn/R3yY/0Z7l/9Cd5T/PXKR/zls + j/8zZoz/K12F/yNWfv8fUnr/IFR8/yZagv8sYYf/MGWL/zFojP8wZov/LmWK/y1jjf8uZIz/LmOK/zBm + i/82bI7/PXOT/0B2lf9CeJb/QniW/0J4lf9CeZb/RXqY/0d7mf9Gepn/QnWW/z9ylf87bZL/NWaO/y5f + iP8oW4X/JluE/yhhh/8vaI3/NW6S/xoyQf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yVU + b/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/GFN1/wMGCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xIdJ/9BbZn/N2OR/y1a + iP8jUoD/IFJ+/ydahP8sYYr/KmGJ/yhehv8lW4P/KV6F/zFljP86b5T/RHia/0p+nv9Pgp//T4Kd/1CC + nP9Rg53/UYKd/1CBnv9Of57/Snyc/0N2mf8+cZX/O3CU/z1ylv9Bd5r/Rnye/0x/of9PgaH/T3+h/05/ + oP9Nf6D/ToCh/06Aof9Mf5//Sn+e/0t/n/9Lfp7/S36e/0p9nf9He5z/RHia/z1wlf82aI//LV2H/yVU + gf8hUID/I1OD/yZZhf8qX4j/LmOK/zRnjv85aZD/PmyT/0Bulf81Y4v/KFeA/x5NeP8YSXf/G017/x5S + f/8hV4L/JlyF/y1hiP8xZYv/M2aL/zJkif8vX4b/K1mF/yZShP8jT4P/IE2B/x9Ogf8jVoT/J12I/yhg + iP8qY4r/LGWL/yxmjf8vZ4//MWaP/zFlj/80Z5D/NmaR/zlmjv85ZYz/NmOI/zJggv8tXX7/J1h+/yJU + ff8dT3n/IVN8/yZXgP8qXIP/LV+E/y9ghP8xYoX/M2aG/zZqiv82bYz/Nm2N/zZuj/83b5D/Nm2Q/zdt + kf82a5D/N2yR/zdrkP84ao7/NWaN/zNijf8zXY7/K1WF/ydQgP8mT4D/JlCB/yZThP8pWIf/LlyL/zBh + i/8yZov/NWqM/zdtjf85bpD/Om+R/zxxk/9AdZb/QneY/0F2l/8/dJX/O3CS/zdtkf80apD/NGuR/zVs + kv82bZP/Nm2V/zVrlf8yaZX/L2WR/ythjP8pX4j/J16H/yxjjP8wapH/NG6V/zhzmP87dpr/PXic/z56 + nf87d5n/OXOV/zpxlP85cJP/Om6U/zhrk/80ZpH/LF6K/yNUgf8aSnj/FERy/xZGc/8fTnr/KluF/zJl + i/83a47/OnCQ/zxzlP89dZX/PHWT/z92lP9Adpb/QHaW/z9zmP86bpP/NWiP/zJljP8uYYr/LmGK/y1g + i/8pXIj/JVeF/yJUgf8kV4T/KFyH/y1hi/8xZ43/NWuO/zhujv86cJD/O3GQ/z1ykv8+c5L/QnWV/0N3 + lf9CeJX/QXmW/0J5l/9DeJf/Q3SW/0Bwkv8+bpD/Om2P/zhrjv80aYz/MWeL/y9miv8uY4j/Kl6F/yVX + gP8dT3j/Gkx2/xlMdv8bUHr/IFV//yddg/8wZor/NmyO/zduj/85cpL/O3ST/z54lf8/eZX/QXuU/0J9 + lf9CfZb/QXqX/0B5mP8/d5n/PHWY/ztzlv89dZj/Pnia/z95m/9Be5v/Q32a/0Z+mv9JgJv/SH+a/0Z9 + mf9FfJj/R32Y/0d8mP9IfJn/RnqX/0R2lf9AcpT/O2yS/zRkjP8rW4X/IlR9/x9Sef8gVXv/JFqA/yhe + hP8sYoj/LWWJ/ytjh/8oYIX/K2KJ/yxjif8sYoj/MGaK/zZsj/88cpL/QXeX/0N5mP9DeJf/QneW/0J3 + lv9FeJj/SHua/0Z5mf9Edpf/P3GU/zlqkP8zZIv/K12H/yNZgv8iWoL/Jl+G/y1mjP80bZL/JEde/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HDxO/xtafv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8RLkL/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Ol2A/0Frmf82YI7/KVSD/yFOfP8hUn3/JViC/yddhv8lXIb/JFqE/yRa + gv8oXYT/LmOK/zdrkf8/c5f/Rnma/0l8m/9Mfpv/TX+b/05/m/9Pf5z/UICe/05+n/9IeJv/QnOY/zxt + lP85bJL/Om2T/z1xlv9CdZv/R3qd/0p8nv9Jep3/SHmd/0l7nf9Je5//R3qd/0Z6m/9Fepn/RHiY/0V4 + mP9FeJn/Q3aZ/0F0l/89cJX/N2mQ/zBhif8pWoX/JFSB/yJTgf8mWob/LWOM/zNqkP85b5P/PnOW/0V2 + mv9Kepz/R3aa/0Bulf81ZIv/JlaA/x5PfP8dT33/IVWB/yNYgv8nXIX/K2CH/y9iiv8vYon/LV6F/ylY + gv8lUYD/IUx//x9Kfv8dSX3/Hkx+/yNVg/8oXYj/LmaN/zJtkv81b5T/N3GW/zt0mf89dJr/PHGZ/zxv + l/87bZX/O2qQ/zpnjP83ZYj/M2KD/y9fgv8rXYL/JlmD/yNUfv8hUXv/JFN9/ydUfv8rWYH/MF+F/zNj + h/80Zoj/NWiK/zVrjP82bo7/N2+R/zdukv81bJH/NWqP/zVqj/84a5L/Om2T/zhqkv81ZpD/NGOQ/y5a + iv8mU4L/IUx8/x9Lev8gTH3/I1CB/yhWh/8uXYv/M2WO/zZrj/86b5H/PXKT/0B1lf9BdZX/QneW/0R6 + mP9Fe5n/RHqX/0F3lv89cZX/OW2T/zVqkf8zaJH/MmiQ/zNpk/80a5T/NWuW/zNplf8vZZH/KmGM/yde + hv8oYIf/LmeL/zRukf85cpT/O3SW/zx2mP8+eZv/QHuc/0F7nf9AeJn/PnSW/ztxlP83a5L/NWmS/zNn + kP8uYIz/JVeE/xxNev8XR3P/GUh1/yFQe/8qWoP/MmOJ/zdpjf86b5D/PXOU/z92lv8/d5b/QHeU/0J5 + lP9Bd5j/QXWZ/z5zl/85bZL/NGeO/y9iiv8pXIX/J1qF/yRXg/8gUn//H1J//yJWgv8nW4b/LWKK/zJo + jf82bI7/OG6P/zpwkP86cJD/PHKR/0B0lP9Dd5X/R3iW/0h6l/9Gepj/RXmZ/0V2l/9Dc5b/QXGU/z9w + kv88bZD/OGuO/zRqjf8yaYz/MmmN/zFojP8vZIr/KV2E/yRXf/8eUHr/HFB6/x1Re/8iV3//KV6F/y5l + iv8xaY3/NG2P/zdwkf86c5P/PXeV/0F5lv9Ce5b/Q32V/0N8lv9DfZj/Q3yZ/0J5mv8+dpj/PHSX/z11 + mP8+d5n/PniZ/0B6mv9CfJv/R36a/0d+mf9FfJn/RXyX/0V8mP9FfJj/RnyY/0Z6mP9FeJj/RHWX/0Bx + lv86apL/M2KL/ylYg/8iUnz/H1B5/x9Uev8jWX7/Jl6C/ypihv8rZIb/KmOG/ytjh/8sZYn/LmaK/zFp + jP81bI7/N26Q/z10lP9BeJf/RHmY/0N4l/9Cd5b/Q3eX/0V4mf9Fd5j/RHeY/0J0l/89bZH/NmeN/y9h + iv8oXYb/I1uD/yJcg/8nYIf/LGWL/zFqj/8tWnf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8UKTX/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/G1R2/wMGCP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xoqOv9Fb5v/PmeW/zNd + jP8oUYL/IU19/yBOfP8iVYD/IliF/yFYhv8iWYX/JFqE/ydchP8sYIj/NGiO/ztvlP9BdZf/RXiY/0h7 + mf9Je5n/Snua/0x8nP9NfZ7/S3qf/0d2nP9AcJj/OWqS/zRlj/80ZY7/N2qT/zxulv8/cpr/QnSa/0J0 + mf9CdJj/QnSa/0J0mP9Acpj/PXKV/z1yk/8+cpL/P3KS/z9ylP89cJT/OmuS/zZnj/8xYYv/KluF/yRU + gP8jU4D/JlmE/ythiv8za5H/PHSX/0F5mf9GfJv/TYGf/1GCof9OfZ//SHea/ztqkP8sXYb/I1R//yRX + gv8oXIj/LGGL/y5ji/8xZo3/NWiQ/zVnkP8tXof/J1WB/yFMfP8fSXz/HUh7/x1Ke/8iUID/JliF/ytg + iv8xaZD/N3GV/z14m/8+eZz/QXue/0N8oP9EfKH/QXec/z1wlf86bJD/OGmM/zZlh/80YoT/MF+C/yxd + hP8qWoT/JlSA/yRPfP8hTHf/Ik55/ydUff8tW4L/MmKH/zJliP8yZor/M2mM/zZtkP83b5L/NW2R/zNp + j/8xZo3/MmaO/zZpkf84a5P/NWiQ/zNkkP8wYIz/KlmG/yNRgP8eS3n/HEl3/xxKd/8hT3//KFaF/y1e + i/8yZo7/OG6R/z1zlP9Cdpb/Q3iX/0R6l/9Eepf/RnuY/0d8mf9HfJn/Q3iZ/0Bzl/87b5b/OGyV/zVp + kv8zaJH/MmaR/zVqlP82bJb/NmuW/zJokv8sY4v/KGCH/ypiiP8vaI3/N3CQ/z12k/8+d5b/P3mX/0B6 + mf9CfJv/RXub/0R5mv9CdZj/O2+U/zhrkv80aJH/MmWQ/y9hjf8oWYb/HlB8/xtMeP8bS3b/IVF6/ydX + gP8vYIf/NmeN/ztvkv8+c5X/P3WX/z92l/9Ad5b/QXiW/0J4mP9AdZj/PnOW/ztwlP84bJH/MmWM/yte + h/8lWIP/IlSA/x9Rfv8eUX7/IFN//ydbhv8uY4v/M2iN/zVsjv84b5D/OnCQ/ztxkf89c5L/QnaU/0V5 + lv9Hepf/SXyZ/0p8mv9IeZn/RneX/0R0l/9DdJf/QHKV/zxvkv83bI7/NGuO/zRsj/80bZD/NG2Q/zNp + jv8vZIr/Kl2F/yVYgP8gU33/H1N8/yJWf/8nXYP/K2OJ/y9ojf8ybI//NW6Q/zlxkf8+dpX/QniX/0N6 + lv9FeZf/RXuX/0V8mP9FfZr/Q3qZ/0B1l/89cpX/OnCT/zpxlP88dZf/P3iY/0F7mP9EfJn/RHyZ/0N7 + mP9Depn/RHuY/0R7mP9Ee5n/RXmZ/0V3mf9DdZn/QHCX/zpokv8wXon/KFaB/yBQev8cTHX/IFJ5/yRZ + f/8oX4P/KmSH/y1nif8uaIn/MWuM/zRtj/81bpD/N3CR/zpyk/89dJT/QHeW/0J5mP9Eepj/RHmY/0N4 + mP9EeJj/RHeZ/0N1mP9Bc5b/PW+T/zhqj/8yY4n/LmGI/yhehv8jXYX/J2GI/ytki/8tZoz/MGmP/zNr + kP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwWHP8iX4L/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8RL0H/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/OF6F/z5olv84YZH/MVmK/ydQgv8hTH3/Hkt6/yBUgP8jWoX/I1yH/yNb + h/8mXYb/KV+H/y5ji/8xZY3/OWyS/z9ylf9CdZf/RHeX/0Z3mf9Gd5n/RnaZ/0d2mv9FdJv/QnGa/z1s + l/81ZZD/Ll+K/yxdiv8uYIz/M2WR/zdqlP86bJX/O26V/zptk/85a5H/NmiP/zRmjv82aZD/NmuP/zdr + jf85bZD/O26S/zlskv82Z5D/MGGM/ytbif8mVYL/I1KA/yRVgf8pXof/MWmP/ztzl/9DfJ3/SICe/0yD + nv9QhKD/UoSh/1OEo/9MfJ3/P2+U/zFiif8nWYL/JlqE/ypfif8wZo//Nm2S/zlwlv8+cpn/PW6Y/zVk + kP8qVoT/Ik19/x1Ief8cR3n/IU1+/yZUhP8qW4j/LWKL/zNqkf83cJX/PXaZ/0F7nv9CfJ7/Q3uf/0J6 + nv9BeZz/O3GU/zhsj/81aIn/NGWH/zNjhf8xYIP/L12C/y1agv8oVH//IUt4/xxEcv8cRXL/JE56/ypX + gP8vXoX/L2CG/y5ih/8vZIn/MWiM/zRrkP8zaY//MWaN/y9iiv8tYIn/L2OL/zFljP8wZIv/L2KL/yxd + iP8oWIT/JVSA/yFPfP8cTHb/HU13/yBQe/8nVoP/LF6I/zJnjP85bpD/P3OV/0J2l/9EeJf/RHqV/0d8 + l/9JfZn/SX6Z/0h9mf9Gepr/QnaZ/0B0mf88cJb/N2uS/zRokP8zZ5H/NWmT/zhslv84bpb/NWuT/y9n + jv8sZYr/LGWJ/zFqjv85cpP/P3iU/0F6lP9BepX/QnuW/0V7mf9He5r/RniZ/0F0l/86bpP/NmqR/zVo + kf8zZZD/MGGN/ypbh/8kVYD/H1F7/x5Pef8gT3n/JVR8/y1chP81ZYz/O2yS/z1xlf88cpb/PXOX/z51 + mP8/dZf/P3aX/z51lv89c5T/PHCU/zpukv82aY//LmGK/yhahv8iVIH/HlB9/xxOfP8iVoH/Kl6I/zBl + jf8zao7/NW2O/zhwkP86cpH/PHKR/0B1kv9CeJX/RnuX/0l9mv9LfZv/S3yb/0p6mv9JeJj/RHeZ/0N2 + mf9AdJf/Om6R/zZsj/82bY//N3CS/zhxk/83cJL/N22R/zVpj/8vY4r/K16G/ydagv8kV4D/IVd//yRb + g/8pYYf/LGaM/zBqjf8ybY//OHKT/z92lv9DeZj/RXmY/0V5mP9IeZj/SHya/0d8mv9EeZj/QHWW/zxw + lP85bZH/N2yQ/zpxk/89dpb/QHqX/0F6l/9Bepf/QnqY/0J6mf9Depn/RHuY/0R6mf9EeJr/Q3eb/0N0 + mv9Ab5j/OGeR/y9dif8mVID/Hkx4/x9NeP8kU3z/KluC/yxghf8vZ4v/MGuN/zNuj/82cZH/OnSU/z12 + lf8/eJb/QHmX/0J5l/9DeZj/RHqY/0V7mf9Ge5n/RXma/0N3mf9BdJf/QHKX/z5vlf86bJH/NWaL/y9j + if8tYYn/KmKJ/ytki/8uZ47/MWqQ/zNskf8ya5D/M2uQ/w0bJP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yFfg/8aWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Hlx//wUMEf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xQmNv84ZZL/NWKQ/zFb + i/8qVIb/JE1//x5Ke/8fUH7/IlmC/ydfiP8pYov/KmOL/ytjiv8uZYz/MmiN/zVqkP84bJP/PXCV/0By + l/9Cc5j/QXKX/0Bxlv9AcJb/PW2V/zxrlP88apb/OGeT/zJhjv8rW4n/JFaF/yZYh/8qXIr/L2OP/zNn + kf81aZL/NWeP/zBiiv8pW4T/LF6G/y9jiv8xZYz/M2iN/zZqj/83a5H/N2mT/zNkkP8vX43/KViI/yVT + hP8iUoH/JleE/y5ii/84b5T/Q3ud/0mBn/9NhZ//T4ee/1KHnv9Uh6D/U4Sg/0x9nf9Cc5f/NWeN/yte + hv8lWYL/KF6G/zBnjv83b5P/P3mb/0F5nf9AdJz/OWiU/y5biP8jT33/HEl4/x9LfP8kUYH/KliH/ylZ + hv8rXon/MWaO/zRqkf84bpP/O3GW/zx0l/87c5f/OXGV/zdvkv83bZD/NGmM/zJliP8yZIX/NWWH/zJh + hf8xX4P/LlqC/yhTfP8dR3P/Fz5s/xg/bf8eR3T/J1F9/ypXgf8qXIP/Kl2E/ylehP8sYof/LmSK/y9k + i/8uYon/LWCH/ytdhf8qXYb/Kl+G/ypghv8rYIf/Kl6G/yhZhP8oV4P/JlaB/yNUff8iU3v/IlV8/yVY + f/8qX4T/MWaK/zhsj/8+cZP/QXWV/0J2lf9EeJb/RnqY/0l9mv9KfZr/SHyZ/0Z6mf9Gepv/Q3ia/z5z + l/84bZL/NGiO/zNnjv81aZH/OGyV/zlvlv83bpT/M2uP/y9ojP8vaIv/NG2Q/zt0lf9AeZj/QXqV/0N6 + kv9DeZT/RHiW/0d4l/9Fd5j/QHKW/zxuk/82apH/M2eP/zJkj/8wYY3/L1+L/ypahf8kVX//IFB6/x5N + d/8iUHn/KliB/zNhiv85aZH/O2yV/zpvlf87cJb/PHKW/ztylv87cpX/OnGT/zxylP8+cpX/PHCU/zhr + kv8yZY7/LF6J/yRWg/8eUH7/HlF+/yVZhf8tYor/MWeN/zNrjv82b4//OHKR/zt0kv8+dZP/QXiT/0N6 + lf9Ge5f/SX2a/0t9m/9LfJv/Snqa/0d4mf9FeJn/Qnea/z1ylf83b5L/NG6P/zdwkf85c5L/OnOU/zpy + k/86cZP/OW6S/zZqkP8xZIv/LF+I/yhbhf8kWoP/I1yE/ydgh/8qZIr/LmiN/zJsj/84cJL/PnWV/0N4 + mP9FeZn/RnmY/0h5mf9Kepr/SXqb/0V4mf9Bc5b/PW+U/zlrkP82ao7/N26Q/zt0k/88dZb/PnaX/z92 + l/8/dpj/QHeZ/0J5mf9DeZr/Q3ib/0R3m/9Ddpv/QXOa/z5ul/84Z5L/Ll2J/yVTgP8fTnr/IE55/yZU + fv8sW4P/MmOK/zNpjv80bZH/NnGS/zp1lP8+eJX/QnuY/0N8mf9FfZr/RHyZ/0V7mf9Fe5j/RnuZ/0d8 + mv9He5r/RHaY/0Bylv89b5X/O2yS/zdoj/8xY4r/K2CG/ypgh/8tZYv/MmqQ/zRtkf84cZT/OXKV/zly + lP83b5P/GzdJ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Hk9r/xtafv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8SOVD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/K1d8/zBfjP8vXYv/K1eI/yVQgv8gS33/Hk17/yFWf/8lX4T/K2aL/zFq + j/8ya5H/NGyQ/zZtkP83bZD/OW6R/ztukv88bpX/PnCX/z9wl/8+b5f/O22U/zhqkv82ZpH/NGOP/zJh + jv8xYI7/LFyM/yZYh/8jVob/IlWF/yVZh/8pXov/LmSO/zJnkP8wZY3/LF+H/ydagv8nWYL/LF+I/zBk + jP8xZo3/MmeN/zRoj/80ZpH/MWOR/yxcjf8mVYj/IlCE/yJRgP8nWYX/MWaO/z90mf9GfZ7/TISg/1CJ + oP9RiZ//U4if/1WIn/9Sg57/TH2c/0N0lv82aY//LF+H/yZchP8mXYT/LWWL/zdwlP8/eZv/QXmc/z9x + mv84Z5P/K1qH/yBOfP8dS3r/IU9+/ydVhP8nVoT/JVWC/yZYg/8pW4b/LF+I/zBki/8vZIr/MGaL/y9n + jP8sZYr/LGSJ/y1jiP8uY4b/L2OE/zBjhP8zZIX/M2OF/zFfhP8tWoH/JFB6/xpFcf8UPWv/FDxq/xlB + b/8fSXb/JVJ9/ydYgf8nW4H/J1yC/yddgv8pX4T/K1+G/ytfhv8pW4L/KVyE/yldhP8mXYL/KWCG/yxh + iP8rYIf/K1+H/yteh/8rXYb/K1yG/ylbg/8nWoD/Jlp//ypfg/8wZYj/N2uO/zxvkf8+cZL/QHOU/0V4 + l/9Hepn/SXua/0p8mv9Ie5j/R3qZ/0d7mv9Fepr/QHWW/zpvkv80aI3/MWWL/zNnjf83bJH/Om+V/zlw + lP81bpD/MmqM/zJrjf81bpD/O3SW/z12mf8/d5f/P3eV/0B1kv9Bc5P/Q3OV/0J0lv9BdJf/PXCW/zls + lP8zaJD/L2OM/y9hjP8wYYv/MGCL/ytahf8kUn3/H014/x9Ld/8oVH//MV2I/zZjjv85aJL/OGuU/zhu + lP85cJX/OXGU/zhwk/84b5L/OnCT/z5zlv8/cpf/Om2V/zVnkf8tX4z/JliG/yFTgf8jV4T/KV6J/y9k + jf8xaI3/NGyO/zhxkf86dZL/PXeU/0B5lv9Depb/RHuW/0Z8mP9JfZr/Snya/0p7mv9Iepr/RXmZ/0J4 + mP9Adpf/PHOU/zdwkv81cZH/NnOS/zl0k/88dZT/PHSS/zxykv88cpT/OW6S/zVpkP8wY4z/K1+I/yZd + hv8jXIT/Jl+H/yhiif8sZov/MWqO/zZtkf88cpX/QXWX/0R2mP9Fdpj/R3eZ/0d4mf9IeJr/RneZ/0By + lf88bpL/N2uP/zNojP8ya4z/Nm6R/zlxlf87cpf/O3GW/zxyl/8+dJf/P3WZ/0B2mv9BdZr/QXWb/0Fz + m/8/cJr/O2uW/zVkkf8tXIr/JFKA/yBPfP8gT3v/JFN+/ypZg/8wYYr/NGiQ/zRskv83cZP/OXSS/z13 + k/9Be5f/RX6a/0Z+m/9Hfpr/RXyY/0V7mP9Ge5n/R3ua/0Z5mf9CdJf/P3CU/zxtk/86a5L/NWeO/y1g + h/8nXYP/KF+F/y9njP81bZH/OHGV/zx1l/8+d5j/PneY/z52lv8lSF7/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8fR2D/G1p9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/wYNEf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xInNv8wZY7/L2GN/y1c + i/8pV4f/JFCC/x9Nff8gVH3/JVyA/ytlhv8ybI//N3CT/zpzlf88dZb/PXSW/z5zlP88cZL/PHCS/z1v + lP89b5b/PG6X/zttlv84apP/M2WP/zBgjP8vX4z/LVyL/ytaif8oWIn/JFiI/yJXhv8kWIj/JluJ/yhe + iv8tY43/L2aO/y5kjP8qYIj/K2CH/yxgiP8tYYn/M2aO/zVpkP8zaI7/MGWL/zFkjf8tYI3/KFmL/yNR + hv8gTH//Ik5+/ylZhf82aJD/Qnaa/0mAn/9Ph6L/UYqg/1KKoP9UiZ7/Uoae/1CBnv9MfJz/QXKW/zZo + jv8sX4b/JluC/yZdhP8rZIr/Nm+T/zlylv87cZj/OWuV/zFhjf8lVIH/HUx5/x1Nev8hUH7/JVSC/yRT + gf8iU4D/IlR//yJTf/8lVn//J1mB/ydagv8mW4L/J1yE/yZcg/8kWoH/JluC/ypegv8sYIL/LV+A/y5f + gf8uX4H/Ll2C/yhWfv8gTXb/GERw/xQ/bP8UPmz/FkBu/xxIdf8hT3v/JVZ//yZagf8nXYL/KF2D/ydd + gv8pXYT/KV2E/ypdg/8pXoP/KWCF/ypihv8tZYn/L2eL/zFnjf8xZ4z/MWaN/zJmjv8xZIz/L2KK/ytf + hf8pXYP/Kl+D/zBliP82a43/Om6Q/zxvkP9Ac5T/RHWX/0h4mv9Le5z/S32b/0l8mf9He5f/RnqY/0R5 + mP9BdZb/O3CS/zVpjf8yZor/MmaL/zRqjv85bpP/OXCU/zZukf80bI//MmuN/zRtj/81bpH/N3CV/zpz + mP86cpX/O3CT/z1wkv8/cZT/QHKW/0BzmP8/c5r/Om6W/zNokf8uY43/L2OM/zFjjf8zY47/MF2J/ypX + g/8jT3v/Ikx5/yROe/8rVIL/M12K/zZjj/81Z5H/NWqS/zZulP84b5P/OG+T/zdukv84b5T/OnCV/ztv + lv87bZb/NWeS/y5gjf8nWIf/JVeF/yZbh/8rYYv/L2aO/zFqj/81b5D/OXSS/z13lf9Aepf/QnuY/0R8 + mP9Ee5f/RnyZ/0h8mf9Je5n/SHuZ/0Z5mf9DeJj/QHeX/z51lf87dJX/OnSV/zp1lP86d5T/O3iU/z54 + lP8/d5T/P3WT/z5zk/88b5T/OGuS/zJmj/8rYYr/JV2G/yVehv8lX4b/J2GI/ypkiv8vZ43/NGqP/zpv + k/8/c5b/QnSY/0R0mP9DdJf/RXaY/0V2mP9Cc5X/PW6R/zhqjv8zZov/LGOH/y1kiP8xaY7/NWyT/zZt + lP82bJT/OGyU/zpvlP87cJX/PXGX/z5ymP89cZj/PG+X/ztsl/84aJT/MWCN/ylYhv8kUoH/H058/x9P + e/8iUn7/JFV//ypdhv8uY4z/MGiQ/zRtkv82cZH/OnSS/z94lP9De5f/R32a/0Z8mv9GfJn/RXuY/0Z6 + mf9FeZn/QnWY/0Bxlf89bZL/OmuR/zdokP8wZIv/Kl+F/yZdg/8sY4f/MWmN/zhwk/89dZj/P3iZ/0J6 + mf9Ce5n/QnuZ/zFbcv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xYzRf8cW3//Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8YPlP/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/L1+B/zRpk/8zZpH/MGGN/ytbif8mVYT/I1R//yNaf/8oYoP/MGqL/zhy + kv87dZX/PXeW/0B5mf9DfJr/RXqZ/0J2l/8+cZL/PG+S/z1wlv89b5f/OWuW/zZpk/8xY4//Ll+M/ypb + iv8pWoj/JleG/yVWh/8kWIj/JFmI/ydciv8pX4v/LGKM/y5ljv8waI//MGiN/zBnjf8xZ43/MmeN/zVp + kP85bZP/O2+V/zhtkv8zaI7/L2OJ/ytfiP8nV4b/IU6B/xxFef8hTH3/K1mG/zdpkv9Bdpr/SoGg/0+G + ov9RiaH/Uoig/1KHnv9PhJ7/ToCd/0h4m/9BcJb/N2eP/y5giP8lWoP/IlmB/yhgh/8vZYz/M2mP/zNm + j/8vYYz/KFmF/x5Pe/8eUHv/HlB7/yJSf/8jVID/I1SA/yNUgf8iVoD/I1V//yJUff8kVn7/JViA/yVZ + gf8kWIH/JlqE/ydbhP8mWoH/KV2B/y1igf8tYID/Klx+/ypafv8qWX7/JVR7/x5Ndv8aR3L/FkNu/xVB + bv8ZRnL/HUt3/yJSff8nWoL/KV6E/ylghP8qYYb/K2GG/yphhv8rYIb/LWKH/y1lh/8tZon/MGiM/zJr + jv81bpH/OHCU/zlwlP84bpP/OW6U/zptlf82aZD/MGSL/yxghv8qX4T/LWSH/zRqjP86b5H/PXGT/0Fy + lf9FdJj/SHea/0t7nP9NfZ3/Snya/0h7mP9Gepf/RHmW/0F1lf88cZL/N2uP/zJnjP8xZoz/M2mP/zdt + kv85b5T/N26S/zRrj/8xao3/MGiM/zBojf8waY//MmqR/zRrk/81a5H/OG2R/zxvk/8/cZb/QXSb/z9z + m/86cJf/M2qR/zBnjv8xZo7/NGeP/zVlj/8zYYz/L1uH/yhTgP8kTXv/I0t6/yZNff8rVIL/MF2J/zBi + jP8xZ4//NWuS/zdvk/84bpP/OG6T/zdulP83bpb/OW6X/zZqlf8zZpL/LWCP/yhaif8mWof/J1yJ/ytj + jP8vaI7/Mm2Q/zZxkv86dZT/PXiW/0F7mf9DfZr/RHyZ/0R7mP9Gepj/R3uY/0l7mf9Ge5r/RHqZ/0F4 + l/8+dZX/PXSU/z12lv89eJf/PnmY/z56l/8/epb/QnuX/0N7l/9CeJb/QHWV/z1wlf84a5P/MmiQ/yxi + i/8pYYr/J2CI/yZgiP8oYYj/KmOJ/y1li/8xZ43/NmqQ/ztulP9AcZj/QXKY/0JymP9Ccpf/QHKW/z1w + k/84a4//M2aL/y1hif8pX4X/KmCH/y1ji/8vZY//MGeQ/zFnkf8zaJH/NmqQ/zZqkP83a5D/OGyS/zhs + k/83apP/NmiS/zJjj/8sXIr/JVWD/yBPfv8cSnr/IVJ+/yRWgP8lWIH/I1mC/ydehv8rZIv/L2mN/zVu + kf86cJL/PnWU/0N4l/9Fe5j/RnyZ/0V6mv9EeZn/RHiZ/0N1mP9AcZf/PW6U/ztrkf84aI//M2aM/y5j + iP8oX4T/K2KH/zBni/82bpD/PXWW/0F5mv9DfJv/Rn6c/0Z+m/9Hfpv/R36b/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Cxoj/xxafv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/H12B/wYNEf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xcsOf87cZf/Om+W/zhs + lf81aJL/MGKN/ylbhv8lWoL/JV2B/y1miP80bo//OnSU/z13lv9Aepf/Q32a/0iAnP9Jf53/R3yb/0R3 + l/9BdJX/QHOW/z9ymP87bZf/NmmU/zJlkP8uYI3/KVqJ/yVWhf8jU4P/I1WF/yZZiP8oXIn/KV+L/yxi + jP8uZY7/MGeP/zNrkf81bZH/N2+S/zduk/83bZL/OW+T/z1ylv8+c5j/PXOW/zdtkP8xZor/K1+F/ydW + gv8gS33/Hkh6/yFMfP8rWYX/NmiP/0B1mP9Jf5//TYSg/0+GoP9Qhp//T4Se/06Bnv9KfJ3/RXWa/z9u + lv84aJH/MGKL/yhchv8jWYP/IliC/yhchv8rXIb/KluF/yZYgv8fUXz/H1J8/yBTff8hVX7/JFeB/yVY + gv8mWYP/JlyE/ydchP8pXYT/KV2E/ylcg/8pXoT/Kl2G/ypeiP8rXon/LmCK/y1hh/8vZIT/L2WD/y1i + gf8rXn//KVt+/yhZfv8lVXz/IVB5/x1Ldv8ZSHP/G0h0/x1Ld/8hUXv/JViA/ypehv8tY4n/L2aL/y5n + iv8vaIv/MGiM/zBoiv8xaYv/MmuM/zNrjf81bZD/OXKU/zt0lv89dpj/P3eZ/z52mf8+dJj/PnGZ/ztv + lv81aZH/L2OK/ytghv8qYIX/MWiL/zdvkP87cpT/QHSX/0V0mf9Jd5r/THqc/0t7m/9Ke5r/SHqY/0V4 + l/9FeJf/RHeX/z9ylf85bJH/M2eO/zFmjf8yZo7/NWmS/zlulf83bZP/M2qP/y9mjP8qYof/KmKI/yxi + i/8tY4z/L2WO/zJpkP81a5D/OW+S/z9zl/9BdZv/PnOa/zdulf8za5H/MWmP/zNpj/81aZD/OGmQ/zhn + kP8yXor/LFWE/yZNfv8iSHr/Ikl6/yZQf/8oWIX/LGCJ/zBljf80aZD/NmyR/zhtk/84bZL/OG2U/zhs + lv83a5f/M2eU/y9ikP8rXo3/J1qJ/yVaiP8pX4v/LWaO/zBrkP8yb5D/NXKS/zl1lP88eJb/QHqY/0J8 + mv9EfZn/RXuX/0V5l/9HeZf/RnqY/0V7mv9Ee5r/QHiX/z51lf88dZX/PnmY/z97mf9Ae5n/Q3yZ/0N8 + mP9FfJj/Rn6a/0d8m/9Cdpn/PXGX/zdrk/8yaI//LmWN/yxljf8qZIv/KmOK/yliif8rY4r/LGKK/y9j + i/8zZo7/OGuS/zxulf8/cJj/QHCY/z9vlv89b5T/Om6S/zVpj/8wZYz/K1+K/yhchv8nXIX/Kl+I/ytg + i/8sYYz/LWKO/zBkjv8xZY3/MmaN/zJni/8zZ4v/M2eN/zNmjv8yZI7/L2CL/ylZhv8iUYD/HEt6/x9P + ff8kVoH/KF2F/ydehv8mXoX/JF6E/yRfgv8pZIj/MGmN/zptlP8+cJX/QXWW/0R4l/9Gepn/RHma/0N3 + mf9Cdpn/QXOY/z5vlv86apP/OGiQ/zNljf8xZYv/LmSJ/y5liv8waIz/NGyO/zpyk/9AeJj/RX2c/0iA + nv9JgZ3/SYGd/0uCnv9Lgp7/Dhgd/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FDBD/HVx//xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZff8XQlr/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/OGiG/z91mf87cZf/Om+W/zltlf8zZpD/K1+I/yZdg/8qYYX/MWmL/zhx + kf87dZT/PniW/0F6mP9Ffpr/SICb/0qAnf9Lfpz/R3uZ/0R3l/9Ddpj/QXSa/z1wmP84apX/M2WR/y1f + i/8nWIb/IVCA/yJRgf8jVIP/JliG/yldif8rYYv/LmSM/zBoj/8yaZD/Nm2R/zpxlP88dJf/O3OV/ztx + lP88cpX/P3SX/z91l/8+dJb/OW+R/zNni/8uX4b/KVWC/yRNf/8fSXr/IU18/yhYg/8yZYz/PXSV/0N6 + m/9If53/SoKe/0uDnf9LgZ3/SX6c/0V4m/9CdJn/PW+W/zhqk/8wY47/Kl6J/yVbhv8jV4P/IVJ//yNS + f/8jUn7/H1J7/x9Tev8hVn3/I1h//yddg/8qYYb/K2GH/yxiif8tZYv/LWaM/y9mi/8xZ4v/MWaM/zJn + i/8yZ4z/MmeO/zRnkP80Z4//NGmL/zRriP8xaIX/LmSD/y1ig/8tYYT/K16C/yhZgP8lVX7/IlJ7/yBP + ev8hT3v/I1J9/yZXgP8pXIP/LmOI/zFqjf8ybI7/M22O/zRtj/81bY//NW2P/zZvj/82bo//N26Q/zhw + kv87dZT/P3mZ/0B6mv9Aepr/QXma/0F4mv8/dJr/PXGY/zlulv80aZH/LWKK/yphh/8rYof/MWiM/zhw + kv8+c5X/Q3WY/0d3mf9IeJv/SXmb/0h5mv9GeZf/RHeX/0N2l/9CdZj/QXOY/zptlf8zZpD/L2ON/y9h + jf8yZZH/NWiT/zZqlP8zaZL/LGKL/ydehv8mXYT/KF2H/ytfiv8uYoz/MWaN/zVrj/85bpH/PXOV/z1y + lv87cJb/NW2T/zNrkP8ya4//M2uP/zVrkP84a5L/OGeQ/zVijv8vWIf/J0+A/yFIev8eRnn/Ik59/yZW + g/8rXoj/MGSL/zNojv81apD/NmuQ/zhtkv84bZT/OGyW/zRolP8wZJH/LGCP/yhdjP8nW4r/J12K/y1l + j/8vapD/L2yQ/zBuj/80cpH/N3ST/zp2lf8+eJj/QXua/0N7mv9Ee5j/RXmW/0V5l/9Ge5n/RXya/0F5 + mP8/eJf/PXaV/z54l/8/epn/Qnya/0R9mv9FfZn/RXyZ/0Z8mP9IfZr/SHyd/0Z5nf88cJb/NmuR/zFo + j/8waJD/L2iO/y5mjf8tZo3/LWWM/yxjiv8tY4v/LmKK/zFkjf81Z4//OGqT/zpslf87bZb/O22V/zdr + kv81ao//MmiO/y1jjP8rX4j/KFuF/yVYgv8pXYf/Kl+J/ytgjP8sYY3/L2ON/zBljP8wZIr/MGWJ/zBl + iP8wZon/MWWL/zFjjP8uX4r/J1iE/yBQfv8fT3z/JVaB/ypehf8tY4n/LWaL/yxnjP8oZIf/JmGD/yRe + gP8sYYf/NGWO/zpqk/89bpX/P3OW/0F1mP9CdZj/QnSY/0Fzmf9AcZj/PWyW/zlokv8zZI7/L2OK/y1k + if8vaIz/M2yQ/zdvkv87c5T/PnaW/0N7mf9IgJ3/S4Of/0yEoP9MhJ//ToSf/06FoP8YKjL/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8cW3//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/wwaIv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w8dJf8/dpf/P3SX/zxx + lf85bpT/N2uT/y9kjf8rYIn/KF+G/yxjh/8yaY3/N3CS/zx1lf8/eJb/QXqY/0V9mf9IgJv/Sn+d/0l9 + m/9Gepr/RHeY/0F1mf8/c5n/PnCZ/zlqlf8zY5D/K12J/yJTf/8gUH7/IVB//yVVg/8oWob/LF+J/y5j + iv8wZ43/M2qO/zVtkf86cZP/P3WX/0F4mP8+dZX/PHKT/z1yk/9AdJb/QXaW/z90lf86cJD/NGmL/y9f + h/8pVYH/JE1+/x9Jev8hTXz/JlaB/y9jif81bY//PHWV/0F7mP9DfJn/Q3yZ/0R7mv9CeJn/QXaZ/z5x + l/88bpf/N2qU/zJmkf8qYIz/KF2K/yhbh/8mVYP/IE58/x5Mef8eT3n/IFR7/yRbf/8pYIT/LmaI/zFp + i/8waYv/MWmN/zJskf80bpH/NW6Q/zdvkP86cJH/OW6Q/zhtkP84bZL/OG2S/zlukP84cI3/Nm2L/zRr + if8xZ4b/M2iI/zRpiv8xZIj/LmCG/ypcg/8nV4D/JVV//yVWgP8oWYL/K12F/y5jh/8xaYv/NW6P/zVw + kf81cZH/N3GR/zpxkv86cZL/OnGR/zpxkf86cZH/OnKR/zx1lP8/eZf/QnyZ/0F7mf9Bepn/QXiY/0B3 + mf8/dZn/PHGY/zdslf8xZ4//LGOK/yphh/8sYoj/MmeM/zxwk/9CdJb/RnaY/0d3mf9Hd5r/R3eZ/0R1 + mP9CdJf/QnOY/0Byl/88bpb/OGqU/zBij/8rXYv/KlyK/ytdjf8vYpD/MWWS/y9kkP8rYYz/JluG/yRZ + g/8mWoX/Kl2I/y5ii/8zZ43/OG2Q/zxxk/88cZH/O3GS/zlukf82bJH/M2uP/zJrjv80bI//N22R/zhr + kf84Z5D/NmKO/zFaiv8pUYL/IUl7/xxIeP8fTXv/JFWA/ytdhv8vYon/MmaM/zVpjv82a5D/N2yS/zlt + lP82apT/M2eT/y5ikP8rX43/Kl6N/ylfjP8sZI//MGmR/zFtkf8wbo//MXCQ/zJwkP80cpL/OHaV/z14 + mP9Bepn/Q3qZ/0V5mP9EeJb/RHmX/0N7mf9Cepj/QXmY/z93lv8+eJf/P3qY/0B7mf9DfJn/Rn2a/0Z9 + mf9HfZj/R3yY/0d8mf9Iepz/Q3WZ/zltkv8xZ43/MGiN/zFpj/8xapD/MWmQ/zFpkP8yaI//MWeO/y9j + jP8uYYv/L2GK/zBijP8zZY//NWeQ/zVokf80Z5D/M2iQ/zFojv8uZoz/LmWM/yxiif8qXob/K1+H/yxh + if8uY4z/LmSO/y9lj/8wZ4//MmiO/zJpi/8yaIn/MWiJ/zJoiv8zaIz/MmeN/y9hi/8oWYX/I1OA/yRW + gf8qXoT/L2aK/zFpjv8zbZD/M3CR/zNujv8uaYn/K2GF/yhagf8sXIX/MGKL/zRmj/84a5P/Om6V/z1x + lf8/cJb/P3CW/z5tlv86aZT/N2aR/zBkjP8rYon/K2SJ/zJrj/84cJT/PXWX/0B4mP9De5r/Rn6b/0mB + nf9MhJ//ToWf/06Fn/9OhZ//UIah/yhDUf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xpJ + Zf8bWn3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8eU3L/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Lldv/z90lP89cpT/O26T/zZqkf8wZY3/LGGK/yhdh/8pXof/LGOJ/zJq + jv84cZT/PHWX/z94l/9AeZf/Q3uY/0Z9mv9IfZr/RXqY/0J3lv9AdZb/QHSY/z5ymP87bpb/N2mT/zNj + j/8uW4v/JlOD/x9OfP8lVYD/KVqE/yxfiP8vZIr/MmiN/zNrjv82bY//OXCR/z51lf9CeZn/QniY/0F3 + l/8+dJT/P3ST/0B0lP9CdZX/QnWV/z1wkf83aI3/MWCH/ylUgP8iTXr/Hkp4/yBMe/8lVoD/Kl6F/y9m + iv80bo//N3KR/zl0k/86dJP/O3SU/ztylP87cJT/OW2U/zdqk/80aJL/MGWQ/y1ijv8sYI3/L1+N/yhY + hv8jUoD/HUx4/x5Pef8jVn3/J12C/y5miP8ya4z/NW6O/zNtjf8zbY3/Nm+Q/zhykv86c5L/O3ST/zx0 + k/88c5L/OnGQ/zlwkf87cZP/O3KQ/zpyj/85cI7/N22L/zZriv83bIv/OG2O/zhsj/80Z4v/L2GI/ypb + hP8oWYP/KFmD/ypchP8vY4n/MmiL/zVujv82cZD/OXSS/zl1k/89dZX/QHaW/0B2lv8/dJX/PnSV/z10 + lP8+dpT/PneU/0F6lv9DfZj/Q32Y/0J7l/9Bepj/QXmY/0B3mv8+dJn/O3CX/zVqk/8wZI7/K2GK/ylf + h/8xZoz/OGyQ/z9xlP9DdJb/RHSW/0R1l/9DdJb/QXKW/z9xlv8+b5b/PG2W/zhplP8yY5D/K1yK/yNU + hf8iVIX/JliJ/yhajP8qXY7/KV2O/ydci/8jWIX/IVWB/yNWgv8oXIb/LmKL/zRoj/85bpL/O3CT/ztw + kv85b4//OGyP/zVqj/8zao7/NGyP/zVsj/82bJD/N2qQ/zhnj/81YY3/MFqJ/ylRgv8fSXr/GUd1/xxL + eP8iVH7/KV2E/y9jif8yZ4v/NGmN/zdrkP85bZL/OW2V/zdslv8yZ5P/LWKP/ylfjf8oXoz/LGSQ/y9p + kv8xbJP/MW6R/zJwkv8zcpP/NXOV/zZzlf85dZb/PHeY/0B4mf9DeZn/Q3iY/0J3lv9BeJf/QHiX/z93 + lv8/d5b/P3iW/z55l/8/e5n/QXqY/0R7mP9GfJj/SH2Y/0h9mP9IfZn/R3ua/0Z6mf9BdJb/N2yQ/zBm + i/8uZYr/LmeM/zJqj/80bJH/NGuR/zVrkf80aZD/M2aP/y9ijP8sXoj/LF2I/y5fiv8uYYv/L2KM/y5i + jP8uZY3/LmiN/y5ojf8waI3/MGeM/zBmi/8xZ4z/M2mN/zRqkP82bJH/NmyT/zdulP84cJP/OHCQ/zZu + jf83bo3/N22O/zdtkf81a5D/MmaO/yxeiv8pWoT/KVyD/y1ih/8waoz/NXGS/zl0lf86d5b/O3aV/zpx + k/81aI3/Ll+G/yZXf/8mWID/Kl2I/y5ijv8wZZH/M2mR/zhrkv86a5L/OmmR/zhnkf8yZI7/LWOK/ylj + iP8vaI3/NW6R/zt1l/9BeZn/Q3ua/0Z9m/9JgJz/TIKe/06Fn/9PhZ//UIag/0+Fn/9QhqD/OF1w/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GkFX/xpZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/G1p+/xInM/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w4bJf87cZX/O3CT/zxv + k/85bJL/NGiQ/y5ii/8nW4b/JluE/yddhf8sYor/MmuQ/zhxlf88dpj/P3iZ/0F5mP9BeZf/RHuZ/0N6 + l/9Bd5b/P3SU/z5zlv89cZb/PG+W/zpslP82Z5H/NWGQ/zJbj/8oUob/IlB//yZWgv8uYIj/MWWK/zRo + jP82bY7/OHGQ/zpykv89dJT/QXiX/0J4l/9DeZj/QniX/0N4l/9BdpT/QnaU/0R3lf9CdZT/P3GR/zlp + jf8yYYf/KVaA/x1Ldv8cSXX/Hkx4/yJTff8nWYL/K2GG/y9oiv8wa4z/Mm2O/zNtj/8zbY7/NGyO/zRq + jv8zaI//MWWO/y5ijP8tYYz/LWCN/y1fjP8rW4r/J1eG/yFRf/8gUXv/IVJ7/yVYfv8rYYT/MmmK/zdw + kP84cpH/OHGQ/zdxkP85cpD/O3WT/z12k/8+d5T/PneS/z12kf87c5D/OnKR/ztzkv88dJH/PHSR/zxz + kP86cY7/OW+N/zlvjf85bo7/OW6P/zhskP8yZIv/LV+H/ypchP8nW4P/K1+G/y9lif8za47/Nm+Q/zlz + kv87dpT/PniW/0J4mf9FeZr/RXma/0R5mf9DeJj/QniX/0F5l/9Cepf/Q3yX/0V+mv9Ff5r/RX2Z/0N8 + lv9De5j/QnqZ/0F4mv8/dJn/Om+W/zNnkf8tYov/LWGK/zFljP83apD/O22T/z5wlP8/cZX/PnGT/zxw + kv88bpL/O2yS/zlqkv82Z5L/MmOR/y1ejP8mV4f/IFGC/xxNf/8fUYL/IlSH/yVYiv8lWIv/I1eH/yFT + gv8eUX7/IFJ+/yVYgv8rX4j/MmaO/zdqkf85bZL/OG2Q/zdsj/81ao7/NGiO/zRoj/80aY//NWuQ/zRp + j/81Z47/NWON/zVfjP8vWYf/J1GB/xpIdv8URHD/GEl0/yFSe/8pXIL/MGSJ/zNojP82a4//OGyR/zlt + k/87b5b/OG2X/zRplf8tY5D/KV+L/yphjf8tZpD/MGuS/zFvkv8ycZP/NXOV/zl2mf85d5n/OXWY/zp1 + l/89dpj/QHeZ/0N3mP9Cd5f/QHaW/z93lv89dZT/PXWU/z12lf89eJb/PnqY/z56mP9Aepj/Q3qX/0V7 + l/9HfJf/R3yZ/0Z8m/9Ge5v/RXmZ/0F1l/85bZH/MWaM/yxkiP8vZ4v/M2uP/zZtkf84bpP/OW6U/zhs + k/82aJH/MWOM/y1eiP8nWYT/J1qF/yhbhf8oXIf/KmGJ/yxli/8saIz/MWyQ/zRtkP81bZD/NW2Q/zdu + kf85cJP/O3KU/z1zlf8+dJf/PnWY/0B4mP9AeZj/P3iV/z52lP8+dZX/PHKU/zlvk/82a5L/MGSM/yxg + h/8qYIT/LWaI/zFsjf83c5T/PnqZ/0F8m/9CfJr/QneZ/z1wlP81Zoz/K1yE/yVYgv8iVoH/JluJ/yhf + i/8qYov/LWOL/zJljP80ZI3/MmSN/yxii/8pYor/LGaL/zBrj/84cpT/P3iZ/0R8nP9Hf53/R3+b/0mA + m/9Mgp3/T4Wf/1GHof9Rh6H/UYeh/1GGof9CbYP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8TLz7/Hl2A/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8eV3j/AwYI/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/JEpl/zduk/84bpL/OW2R/zhsk/80aJL/LmON/yhch/8jV4H/JVqD/yti + if8yaZD/OHGV/zt1mP8+d5j/P3iZ/0F4mf9BeJf/QXeX/z91lf89c5X/PHGV/ztvlP85bZP/OGiS/zVk + kP80Xo//LleK/yVOg/8dSXv/IlF+/yxdhv80aYz/NmyO/zlvj/87c5L/PnaU/0B5lf9AeJX/QHaV/0B2 + lP9Eepj/RXqY/0V5l/9FeJf/RXeW/0N0lf8+bpH/OWmM/zRjiP8rWoL/IVB5/xlIcv8aS3P/IVJ7/yVX + f/8oW4L/LmSJ/y9ni/8vaYz/L2mL/zBpjP8waIr/MGaK/y9kiv8sYIj/KV2H/ydZhf8nWYf/KFiI/yRU + hP8gUH7/H098/x9Pe/8gUXr/JlqA/y5khv81bI3/OHGQ/zt0kv89dZT/PXaU/z52lP8/d5X/QXqX/0F6 + lf9AeZP/PniR/zx2kv88dJL/PXST/z51k/8/dpT/P3aS/z1zkP88co//OnCO/zlvjv85bpD/OGuP/zRn + jP8vYYj/Kl2F/yhdhP8pYIX/LmaK/zNsj/83cZL/OnWV/z13lv9AeZj/RXub/0Z7nP9IfJz/SHyc/0d7 + m/9Ge5r/RnyZ/0Z8mf9Hfpr/SICb/0mCnP9JgZv/SICZ/0V+mP9EfJj/Q3qa/0J3mv8/c5n/OW2U/zNm + j/8xYoz/MmKL/zJki/80Zo3/OWuQ/zpskf84a5D/OGyP/zZqjf82aY7/NGaP/zJjj/8wYY//K1yL/yRV + hf8jVIT/IFKC/x1PgP8gUoT/I1aI/yNWiP8iVYX/IFOB/x5Qfv8eUHz/H1F8/yVYg/8tX4r/MWOM/zFl + jP8zZ4z/M2eM/zNnjf8zZ43/M2aO/zJmj/8wZI3/MGSM/zFji/8wX4n/LluH/y1Zhv8mU4D/HUt4/xZF + cv8URW//HU53/ydYf/8wY4j/NmqO/zhskf86bpL/OW2T/zltlf85bZb/NGiT/y5kkf8rYo7/KmON/y1n + kP8wbJH/MnCS/zVzlf84dZj/Onea/zx4nP87dpr/PHaY/z91mP9Cdpf/QXaY/z92l/8+dZX/O3OT/zpz + k/86c5L/O3eW/zx4l/89eZf/PniY/0B6mP9Cepj/RHqX/0R6mP9Eepn/RXuc/0V6nP9DeJr/QHSX/zlt + kv8xZoz/LmSK/zBnjP81a4//OG6S/zpvk/88cJb/PG6X/zlrk/8zZY//LF2J/ydZhf8jVoL/I1aC/yZb + hv8oYYn/KmaK/zBsj/81cZP/OHKU/zlzlP87c5X/PHSV/z53lv9BeJj/QnmZ/0N4mv9Fepv/Rn2d/0eA + nf9HgJ3/Rn+c/0R8mv9AeJj/PXOX/zhuk/8zaI3/LmOI/yxlh/8uaov/M3CQ/zp2lv9Ae5r/RYCe/0l/ + n/9He53/QXSX/ztskv8yZY3/KmCJ/yVbh/8iW4T/JF6H/yVfiP8qX4j/K1+H/y1giP8qYIj/KGGJ/ylj + iv8sZ43/Mm2R/zl0lf9Aepr/Rn+e/0iAnv9KgZ3/SoGc/0uCnP9OhJ7/UIag/1OJo/9TiKP/U4ei/1OH + o/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w0cJP8dXH//Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xQ2Sf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYNEf81bJH/N22S/zdr + kP84bJD/OG2R/zZrkv8xZY//LGCK/yZbhP8kWoL/KV+H/zBojv82b5T/OnSX/zt1l/89dZf/QHeY/0F4 + mf9Adpf/PnSV/zxxlP86b5P/OW2S/zdpkP81Zo7/M2CN/zBaiv8qVIX/IEp9/xpHeP8dTHv/J1mD/y9j + if81aoz/OW+O/z10kv8/d5T/QXmW/z92lP8+dJP/P3SU/0N3lv9FeZj/RXmX/0Z6l/9Fd5f/QXGT/zxr + j/83Z4v/M2KJ/yxcg/8hUXn/GUpx/xxNdf8jVX3/J1qB/yxfhf8wY4n/MmaL/zFojP8waIz/LmeL/y9m + if8uZYj/LGKH/ylehP8mWoP/IlWB/yBSgP8fUH//HU19/xlJef8YSHb/GEl1/x9Re/8nWoH/L2SH/zVs + jf86cpD/PXaT/z93lf9CeZf/Q3mX/0J5l/9De5n/Q3uY/0F6lf9AeZT/PnaU/z51lf8+dZT/QHeV/0B3 + lf8/dpL/PnWQ/z10kP87cY//O3CQ/zpvkf85bZD/NWiN/zBjiv8qX4b/KV6F/yphh/8uZ4v/NG2Q/zlz + lf87dZb/PnaW/0F5mf9Ee5v/Rn2c/0d+nf9IfZz/SH2c/0d8m/9HfZv/SH6b/0h+m/9JgJz/SoKd/0yE + nv9Kgpv/SYGZ/0Z+mP9FfZj/Q3mZ/0B2mP89cJb/N2eR/zNijP8uXYn/KFmE/yxdhv8wYor/MmWN/zNn + jf8yZ4z/MmeK/zJnjP8zZo3/MWSO/zBhj/8tXoz/KlyK/yhaiP8mWYb/JFiG/yNWhv8iVYb/JFWF/yRV + hP8jVYL/IlSB/yBSfv8eUHz/HU98/yNVgf8mWYT/KFuG/yteh/8sYIj/LmKL/zFljf8xZY//L2KM/yxh + iv8sYIn/K1+I/ytbhv8qWIX/KleE/ydVgv8hUHz/HEt2/xlJc/8bS3T/JFR7/y5fhf81Z4z/PG+U/zpt + kv85a5L/N2qT/zRokf8xZpD/L2WQ/y5lj/8tZ4//LWmP/zBtkP8zcJP/NnKW/zp1mf87dZn/OnSY/zt0 + mP89dJj/P3SX/0F1l/9AdZj/P3WX/zxzlP86cZP/OHGR/zpzlf87dpf/PHiY/z54mf8/eJj/QXmZ/0N7 + mf9Cepn/QniZ/0F4mv9CeJv/Qnib/0J3m/89cpf/OGyT/zFljv8uY4z/MGWN/zRqkP84bZL/O2+T/zxw + lf88bpb/OmyV/zNlj/8rXYj/JViE/yBVgf8hVoL/JVyF/yljif8uaY7/NXCT/zp1l/86dZf/PHeX/z94 + l/9AeZj/QnuZ/0V9mv9Hfpz/R36c/0mAnv9LgaD/SoKg/0qDoP9Lg6D/SH+d/0R6mv8/dpj/Om+V/zVp + kP8waIv/L2mK/zBtjf83c5P/PXmY/0J9nP9IgJ7/SoCf/0p+oP9Ddpv/PXGW/zdsk/8waJL/LGWO/ylk + i/8mYon/KGKJ/ytiiP8sYIf/J1+E/yZghf8mYYf/KWWL/yxpjv8zbpL/OXWW/0B7mf9Ff53/SYKf/0uD + nv9Mg53/TYSe/0+Fnv9Rh6H/U4ij/1WJpP9WiaT/VYik/xUiKf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AwcJ/yFggv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Bg4S/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/HDtP/zdukP86cJL/O2+S/zpvj/87b4//N2yQ/zNoj/8wZI3/Kl+I/yde + hf8pYYf/LWaM/zRuk/83cJT/OHGU/zlylf89dJf/P3WY/0B1mP88cZb/Om+T/zdskf81aI7/M2WM/zJh + iv8wXIj/LliH/ydSgv8gTHz/G0p4/x5NfP8jVIH/LF6H/zNmiv83bI3/O3GQ/z92k/8+dZP/PXST/z1y + k/9AdJX/QnSW/0N2l/9Ed5f/Q3eW/0J0lv8/b5P/OWiO/zNjif8tXoT/Jld9/xxNdP8bTXP/H1F4/yZZ + gP8rX4X/MGOI/zRni/81aIz/NmmN/zRpjf8zaIv/MWiK/zBmif8tY4b/Kl+F/yZcg/8iVoH/HlF+/xxN + fP8YSHj/FUR0/xJBcP8URHD/HE54/ydZgP8vY4f/N22N/zxzkf8/d5P/QHiU/0J5lv9Ee5f/RXuY/0R7 + mf9Eepj/Q3qX/0J5lv9Adpb/QHaV/z91lf9Bd5X/QXeV/0B2kv9AdpH/PnSP/z5zkP89cpH/PXGT/ztv + kv83a5D/MWWL/ythiP8nXoX/KWCH/y5njP81b5L/OnSW/z12lv8/d5f/QnmZ/0R7mv9GfZz/R36c/0d9 + nP9IfZz/R32c/0d9m/9HfZv/SH2c/0h+nP9Jf5z/SYGb/0qCnP9Jgpn/SICY/0d+l/9Ge5j/Q3iY/z9x + lv86aZL/M2CN/ytahv8mVoL/I1SA/yZYg/8rXof/LmGK/y9iiv8wZYr/MmiL/zNpjv81aZD/NWeR/zNl + kP8xZY7/L2OM/y5ii/8sYYv/Kl+L/ydZiP8mV4b/J1eF/yhahv8nWYX/JVeD/yJUgP8eUHz/HE16/xxO + e/8hU4D/I1aC/yRXg/8qXoj/LmKM/y9jjf8tYoz/KWCJ/yhfiP8pX4f/Kl2H/ypbhv8rWYb/KleE/ydU + gP8hT3r/Hkx3/x5Mdv8iUnr/KlmB/zJjif83Z47/OGmR/zdpkf80Zo//MWSN/y5ijf8uZI7/L2aP/y9p + kP8ybJH/M26S/zRvlP83cZj/OXOY/zpzl/84cpb/O3KW/z1zlv8/c5f/QHWY/0B1mf8+dJf/O3GU/zhv + kv84cZP/OXOW/zt2mP89dpn/P3eZ/0F5mv9Cepv/Qnma/0B5mv8+d5v/Pnaa/z92mv8/dpr/PnSY/zxx + l/84bJT/MWaP/y5jjv8tY47/MmiR/zVqkv84bJH/O2yS/zprk/83aZH/MWSO/ytfif8lWYT/IVaC/yJY + gv8mXob/K2WL/zJskf84cpf/O3aY/zx3mP8+eZj/QHqZ/0N9mf9Ffpr/R4Cb/0mBnP9Mg57/TYOg/06E + ov9NhKH/TIOh/0uCoP9Jf57/Rnyb/0F2mf88cZf/NmyT/zJsj/8ybo7/NHGQ/zp3lv9BfJr/Rn+d/0mA + n/9Kf5//SH2e/0V5nf8/dZr/OXGY/zZvl/81cJb/MW6T/zBskP8xaY//MWiN/y9ni/8rZYf/JWOE/yZj + hf8qZor/LmqP/zNwk/85dZb/P3ua/0WAnf9Kg5//TISf/02Env9OhZ//UIag/1KIof9UiaP/VYql/1WK + pf9WiKX/HzI9/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/K2iK/xtZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xtEXP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMGCP8yZYX/O3GS/z91 + lf8/dJT/PnOS/z5yj/85bY//NGmO/y9ki/8rYon/LGOK/y1mi/8wa4//MWuP/zRukv81bpH/Nm6S/zhv + k/87cZX/PHGW/ztwlf84bJL/NGeP/zJjjP8xYYj/MF6H/y5bhv8tW4f/KVeE/yJRfv8dTXn/HU16/yBR + ff8oWYX/MmOK/zhqjv88cJD/PXOS/z5zk/89cpP/PnKU/0Bxlv9Ccpb/QXKV/z9ylP8+cZP/PW6V/zho + jv8wYYf/K1uC/yZYf/8fUXf/Gkxz/xxQdv8hVnz/J1yC/y5ih/8zZ4v/NmqO/zhrjv85bY//OWyP/zdr + jf81a4z/NGmK/zFnif8uZIf/KmGH/ydehf8kWIL/HlB9/xpKef8TQnL/Dz5u/xJCb/8aS3b/JFV+/y9h + iP83a4//PHKS/z51k/9AeJT/QXiV/0N6lv9Eepf/RXmX/0R6mP9DeZj/QniX/0J3lv9BdpX/QXeU/0B1 + k/9AdpP/QXeS/0F3kf9AdZD/P3SQ/0B1kv8/c5P/PXGU/zhtkv8xZ43/K2GI/yddhf8qYYj/L2iO/zZw + lP87c5b/P3aW/0F4l/9Depn/RHub/0Z9m/9Hfpz/SH6c/0d9nP9Ifp3/R32c/0d8nf9HfJz/R3yb/0Z8 + mv9GfZn/R3+Y/0d/mP9IgJf/R3+X/0Z8lv9EeZj/QXSW/zxtk/80Y43/K1mH/yVTgf8gUH3/IVOA/yVY + hP8pXon/LWGL/zBkjP8zaI7/N2yQ/zpuk/87bpT/OWyT/zhtk/81ao//MmiN/zJnjf8vY4z/K1yJ/ypa + iP8tXor/MGGM/y9hi/8sX4r/KFqG/yNUgf8cTXz/G0x7/x1Ofv8fUID/I1aD/ydahv8qXon/K2CK/yxh + iv8rYor/KmKK/ypjiv8sYor/L2GK/y9eif8vXIj/LVqG/ydUgf8hTnr/H0x3/yJQev8nVn//LVyE/zBg + if8zY4v/M2ON/zFhjP8uYIv/LmKN/y5kjf8uZo//MmuR/zNtk/81cJT/NnCX/zZwl/84cZf/OXGW/zpx + lv88cpX/PnOW/0B1mP9BdZn/QHWZ/zxxlf86b5P/OG6T/zdxlf84cpb/OnOX/zx0l/8+dZj/QXea/0F4 + m/9Ad5v/Pnaa/zx1mv88dJr/PHOa/ztymf86b5b/N2yU/zRpkv8wZZD/LWKN/y1ijf8uZI//MWiQ/zJn + j/80Z47/NmeO/zNljf8xZI3/LGCK/yZbhf8mXIT/J16F/ylhhv8tZoz/NG2T/zlyl/86dZf/PHeY/z55 + mP9Be5n/RH6a/0eBm/9Kg5z/S4Od/02Env9Qh6H/UIei/0+Gov9OhKL/TIKh/0l/nv9HfZ7/Q3ic/z1y + mf83cJT/M2+R/zNxkf84dJX/P3qZ/0R+nf9KgaD/S4Gh/0uAoP9HfZ//Q3qd/z53nP87dpv/OnWa/zl2 + mf87eJr/PHaZ/zt0l/84cpT/N3KT/zNvj/8taYr/K2aJ/ytliv8wa4//NHCS/zp1lv8/e5n/RYCd/0qE + oP9Oh6L/T4eh/1CHof9Rh6H/U4mj/1SJpP9ViqX/VYmk/1SIpP8oQ1H/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8kUmn/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8dW3//Chki/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Eyg1/zhukP89c5P/QHWW/0J2lv9BdZX/PXGS/zhsj/8zZ43/LWKJ/yth + if8uZoz/Mm2R/zRvk/81b5L/M22Q/zRtkP81bZH/Nm2S/zZrkf84bJL/N2uS/zVokP80ZY3/MmOK/zBg + h/8vXoX/MF6G/zBgiv8uX4n/KluG/yJTfv8ZSnX/G0x3/yNTff8wX4n/OmiP/z1tkv8+cJP/P3OV/z5y + lf8/cJb/P3CW/z9vlf89bZP/OWuQ/zVojv8yZIv/LV+H/yRWf/8jVX3/IVN7/xtOdf8cT3b/HVJ4/yNY + fv8qYIX/MGeK/zZrjv85bpD/O3CR/z1xkf89cZD/PG+Q/zpujv84bI3/NmuN/zNqjP8waIv/LmWK/yxh + if8nWoX/IFF+/xhHdv8UQ3P/FURy/xpJdv8kVH7/Ll+H/zdpj/89cJP/P3SU/0B2lP9BeJP/Q3qV/0V6 + lv9Gepf/Q3iZ/0J3mv9Cd5j/QneX/0J4lf9Bd5P/QHaS/0F2kP9Cd5H/Q3iS/0J3kv9CdZL/QXWT/0F1 + lf8/c5T/Om6S/zJnjf8qYIf/KV6G/yphiv8waJD/N3CT/z12lf9AeJb/QnmY/0R7mf9GfJv/SH6c/0l/ + nf9Kf5z/Sn+d/0p/nf9Jfp3/SH2d/0Z7nP9Fepr/RHqa/0N5mP9Depf/RHyW/0d/l/9Hf5b/R36X/0d7 + mf9Ed5j/PXCU/zVljf8sXIf/I1OB/x9Qfv8fUYD/I1eF/ypei/8uY4//MmeR/zZrkv87cJX/PnOX/z5z + l/8+cZf/PHCV/zhukP81bI3/M2iM/zBii/8uX4r/LV6I/zBhi/80Z4//N2uT/zRokf8uYYz/J1mG/yFS + gv8dTn//Hk+B/yJThf8mV4f/KFuI/yhchv8oXYf/Kl+I/yxiiv8uZYz/LmaM/zBnjf8yZY3/MmON/zJh + jP8zYIz/LluH/yhUgf8hTnr/IEx5/yNRff8mVYD/KlmE/y1ch/8vX4r/L1+K/zBhjP8wZI7/MWaQ/zFp + kf8ybJL/M26U/zRwlf81cZf/N3GY/zlxl/86cpj/PHKX/z5zl/8/dZf/QHeZ/0F4mv89c5j/Om+V/zdu + kv81bpP/NW6U/zZvlP84b5X/OXCV/ztxlv89c5j/PXSZ/zt0mf85c5n/OHKY/zlymP84cJj/N26W/zZr + lP8zaJD/L2SN/y1hjP8qX4v/KV+K/ytijP8rY4v/K2SK/y5liv8wZIr/MmaN/zFljf8uY4z/LmOL/y9l + i/8wZ4r/L2eK/zBojf80bJH/NnCU/zhzlf87dZb/PniY/0J7mv9Ffpr/SIGb/0uEnP9MhZ3/TYWe/0+H + oP9RiaL/UYmj/1CHov9NhKH/TIKg/0uAoP9GfJ3/PnWY/zZylP8ycZH/NnSU/zt3l/9BfJv/R3+e/0uC + of9MgqL/S4Ci/0Z+oP9Be53/PXic/z15nf88epz/PXuc/0F9nv9Ffp//RX6f/0B7m/8+epj/PHiX/zdy + k/8ybI//MmmO/zFoj/81bpP/OHSV/z55mP9Df5z/SYSg/02Hov9RiaT/Uoql/1KJpP9TiaT/VIql/1SJ + pf9UiKT/Uoek/zRbb/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ylQZf8cWn7/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xlObf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8wYID/OnGS/z1y + lP9AdJf/QXWY/0Bzlv87b5P/NmmQ/y9jjP8rX4n/K2CK/zBokP81b5T/OHOW/zhylf82b5L/NG6R/zRs + kP82bZL/NmyS/zVpkP80aI//NGaP/zNljf80ZYr/MmOH/zFhhv8xYYj/M2SL/zRmjv8xZIz/KFuE/x5Q + ev8YSHP/IVB6/yxahP82Y4z/PGmS/z5tlP8+b5X/PG+V/zttlP85aZH/OGeQ/zZmjv8wYon/LGCH/ypd + hf8kV4D/JFZ//yNWf/8hVH3/IFR8/x9Uev8eVnv/JFyA/yxkh/80bY7/OXGR/z10k/8/dZT/QXeV/0J2 + lP9AdJL/PnGR/z1vkv87b5H/OG6R/zVskP8za47/MmiO/y5ii/8qW4j/IVJ//xtKeP8ZSHb/G0p4/yRU + f/8tXYf/NmiO/zxvk/9Ac5T/QXWU/0J4lf9Ee5b/R32X/0V7mP9DeJr/QXab/0F2mP9Cd5b/QXeU/0B3 + kv9Ad5H/QneS/0R5k/9FepT/RHmT/0R3k/9CdJP/QHKT/z9xk/86bZH/M2eN/yxhif8oXYb/KmCJ/zJp + j/86cpT/QHiX/0J5l/9Ee5j/Rnya/0d+m/9Jf5z/SoCd/0yBnv9MgZ//S4Ce/0uAnv9Kf57/SH2d/0V6 + nP9Dd5r/QXaY/0F2lv9EeZj/RnyY/0Z9mP9Jfpr/SHub/0N2l/89b5L/N2eP/yxch/8kVIH/Hk9//x5Q + gf8jVoX/Kl+M/zFmk/81a5X/OW+X/z5zmv9Cdpr/QnaZ/0J1mf8+cpb/PHCU/zhtjv80aY3/MmSL/zBh + iv8uYYj/MGSK/zRoj/85bpX/O3CY/zNokv8sX4z/JVeH/yFShf8hUoX/JVeJ/ytdjf8sXoz/KV2H/yhe + hv8nXob/K2KJ/y5mjP8waI3/MWiN/zJnjv8yZY//MmOP/zJijv8yX43/LFiH/yVRgP8gTHv/HUl4/yBN + fP8jUoD/KViF/y1div8vYYz/MmWP/zRokf81a5P/NW2U/zRulP8wa5L/MWyU/zNulv82b5b/OXGX/zty + mP89dJn/PnWY/z92mf9BeZr/P3iZ/zx0l/84b5T/NGyS/zJrkv8ya5L/M2qR/zRpkv81apL/NmuS/zZt + k/83cJX/NnGW/zVwlv82cJb/Nm6V/zRtlP8za5L/MmeR/y5jjf8rX4n/KFyH/yVbhv8mXIf/KF+I/yli + if8qZIj/KWSG/y5nif8xaY3/NWuS/zZrkv83bZH/OXCR/zhvkP82bY//NGyP/zVtkP80bJH/NnCT/zlz + lf8+d5f/QnuZ/0V+m/9IgZz/SoOc/0uEnP9Oh57/UIif/1KKof9SiqL/Uomi/1CGof9PhKH/ToOg/0l+ + nP8/eJj/OHOU/zZzk/85dZX/PnmY/0N9nP9Hf5//S4Gh/02Bo/9JgKL/RX6f/z57nP8+e53/Pnyd/z59 + nv9Bfp7/RoCg/0iBof9IgqD/R4Gf/0V/nv9DfJz/QHea/zxylv84bZP/NWuS/zRrkv82b5T/O3aX/0F8 + mv9GgZ3/TIWh/1CJpP9Siqb/U4qm/1SKpf9TiaT/U4il/1KHpP9PhqP/OGN6/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/HztK/x5dgP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Ei5B/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DRok/zhtkv87cZT/PnKW/0BzmP9Ac5j/PXCW/zlsk/80Z5D/LmGL/ytf + iv8tYo3/MmiS/zZulf85c5b/O3aX/zlzlf83b5L/N26S/zlvlP85bpP/NmqR/zVokP80Zo7/NGiM/zVn + i/80Zoj/MmOH/zRkif82Z43/OGuS/zNnjv8sYIf/IVV+/x5Qev8hUHr/KlaA/zFdh/83ZI3/OmiR/zpq + kv84aZH/M2WO/y9fif8uXoj/LF2G/yhcg/8oXYT/KV2F/ydbg/8oW4T/KV2F/yhchf8nXIT/JVyE/yNc + gv8mYIT/LWeJ/zVvj/87dZT/P3mW/0F5lf9Depb/RXyX/0R6lv9Dd5b/QXOX/0FymP89cZX/Om+S/zdu + kf80apD/MmeP/y9ijP8qW4f/I1OA/x1Mef8eTXr/IlJ+/y1diP82Z5D/PG+V/z9ylv9CdZX/Q3iW/0V7 + mP9Fe5r/RHqa/0B2nP9AdZn/P3SX/z90lf8/dZP/QHWS/0B3kf9DepP/RXuU/0Z8lf9Hepb/RXiW/0J0 + lP9AcpP/PG6R/zhrkP8zZ47/LmOL/ytgiv8tYov/M2qP/zx0lf9BeZb/Q3uY/0V8mP9HfZr/SYCb/0uB + nf9MgZ7/TYKe/02Cn/9Ngp7/TIGe/0uAnv9Kf5//R3yd/0N3m/9BdZn/QHSY/0J2mP9EeZn/RXmc/0Z5 + nf9GeJv/QHKU/zpsj/8zZIv/K1uG/yRUgv8gUIH/H1GC/yFVhf8pXYz/MGaT/zVsl/87c5r/P3ab/0J4 + m/9FeZv/Q3aZ/0F0mP8/cpb/PG6T/zhqj/80Zo3/MmSK/zFkif8wZYn/MmmM/zVskf83bpT/OG6W/y5j + j/8mWYn/IlSF/yVWiP8oWov/LF6O/y9ijv8uYoz/K2CI/ylghv8qYYj/LWWL/y9ojf8wZ4z/MGaM/zFl + jv8xZZD/MWKQ/zBfjv8tWor/KFOE/yBLff8cSHn/GkZ3/x9Ofv8mVYT/LFyK/zNlkP82aJL/OGyV/zlw + lv85cJf/NW6W/zBqk/8tZ4//LmiP/zJrkv83cJb/PHOZ/z50mf89dZj/PnaZ/z53mf89eJn/O3aX/zZx + lP8ybZL/L2iP/y9mj/8wZo//MWWP/zBjjv8yZ4//MmuR/zFtkf8ybZP/M26U/zRtlP80bJT/M2qS/zFo + kP8vZY7/K2GL/ydch/8iWIP/IliD/yRbhP8mX4f/KmSK/yxmiv8taYr/MGyM/zZxkf86c5X/PXSW/z93 + lf8/dpT/PXST/zxzk/85cZL/Nm6R/zVukf81bpH/OHGT/zx1lv9Bepn/RX2a/0iAnP9Kgpz/TISd/0+H + nv9SiqD/Uoqg/1KKof9TiaH/T4ag/06DoP9MgaD/SH2b/0J3l/87c5T/OXKU/zt2lv9Be5n/Rn6d/0l/ + n/9Lf6H/Sn+h/0d/of9AfZ3/Pn2d/z59nf9Af57/QoCf/0eCoP9Kg6H/TISi/0yEof9Kg6D/TIOh/0qB + oP9Ge57/Qnaa/z1xlv84bJT/NGqS/zVslP83cZb/PXiZ/0J9m/9Igp7/TYWh/1CHpP9RiKX/Uoil/1KI + pP9RhqP/T4aj/0uEov9Jg6L/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8VJi//G1l9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xxbfv8FDBD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8kR2T/OGuR/zpt + k/89cJb/P3KY/z1wmP87bZb/N2mS/zFjj/8sX4v/K1+K/y1hjP8yaJD/OG6U/zpylv87c5X/OnSV/zpz + lP87c5X/PHOW/zxylv86bpT/N2uQ/zZqjv83bI3/N2uM/zVoif8zZYj/M2WI/zdpjv85a5H/NWmP/y5i + if8nWoL/I1V+/yNTff8mU33/KleB/zBdh/8yX4n/MmKL/y9hiv8pXIb/J1qD/yZYgv8lWoH/KF2E/y1i + iP8vZYv/MGWM/zJmjv8yZ47/MGWN/y5ki/8qYYn/KGCH/ylih/8uaYv/NnGQ/zx3lP8/epb/QXyW/0N9 + lv9Ff5f/R36a/0Z8mv9FeJv/RHaZ/0Fzlv8+cpP/OnCR/zdtkP80aZD/M2aO/y9gi/8pWYT/IlF+/x9O + e/8jU3//LFyH/zVmkP88b5b/P3KX/0F0l/9Dd5f/RHmZ/0R5m/9Bd53/P3Wa/z5zlv88cpX/PnOT/z50 + kv8+dZH/QHeS/0J6lP9EfJX/RnuW/0d6l/9HeJf/RHWV/z5wk/86bJH/NWiP/zJkjf8vY43/LmKM/zBn + jv83b5H/PXaV/0B4l/9Cepf/RHuY/0d9mf9KgJv/TIGd/06Dnv9PhJ//ToOe/02Cnv9Ngp7/TIGf/0yB + n/9Kf57/R3uc/0J2mv9Ac5n/QHOZ/z90mv9BdZ3/QXSd/0Bymf88b5P/N2mN/zBiiP8rW4X/JVWD/yBR + gf8gUoP/IlWG/ydci/8uZJH/NG2V/zpzmf8+d5v/QXmb/0N6mv9CeJj/QHWW/0Jylv9Ab5P/O2uP/zVn + jf8yZYr/MWWJ/zFniP8yaYr/M2qN/zVskf8zaZH/LmOO/yVah/8jVoX/JFaH/yhbif8sYI3/MGWP/zBm + jv8vZov/LWOJ/yxjif8sZIv/LmaL/zBmjP8vZIv/LmOM/y5ijf8vYY//LV+N/ypaiP8lUoP/H0l8/xlD + d/8ZRXf/HUt8/yRUg/8sXov/M2aR/zlslf86bpb/OnGY/zpymP83cJn/MGmT/ytjjf8pYYn/LWWM/zRt + kv85cZb/O3SY/zx0mP89dZj/PHaZ/zt3mf84dpf/NHOU/zFukf8wapD/LmWO/y5jjv8uY43/LmON/y9m + jf8wbI//MW2Q/zFtkv8xbJH/NG6S/zRtkv80apH/M2mR/zBmj/8tYoz/KF6I/yRbhf8hV4H/I1uD/ydg + hv8tZ4z/Mm2Q/zVwkf84dJP/PXmW/0F6mP9Eepr/RHuZ/0N6l/9BeJX/P3eV/z11lf86c5T/N3CS/zVu + kf84cJL/PHSW/0F4mf9Fe5r/R36c/0qBnP9MhJ3/UIig/1KJoP9SiqD/U4mf/1OIof9RhqL/ToKg/0p/ + nv9Ge5v/QHWW/ztwk/86cZT/PXWX/0N7mv9If53/Sn+g/0t+ov9HfZ//QXuc/z59nP8/fp3/QH+e/0OB + oP9HgqD/S4Sh/06Gov9Qh6L/Uoej/1GGo/9RhqP/T4Si/0x/oP9Hep3/QHOZ/zpulf81bJP/NG2V/zVw + l/84dJn/Pnmb/0N9nP9IgJ//TIOh/0+Go/9PhqP/T4Wj/06Eof9Lg6H/SYKg/0mCof8JEBT/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMgJv8lYoT/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/FD5Y/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Bg0S/zRnj/80Z4//NmiQ/zlrlP88bpf/PW+Z/zpsl/81Z5P/L2KP/ypd + iv8nW4f/LWKM/zJokP84bpT/O3KU/ztzlP88dJP/PXWV/z52l/8+dZb/PXOV/zxxlf86cJL/OG+O/zlv + j/86b4//OGyM/zVoif80Zon/NGaK/zhqjv83ao//MWWL/ytehv8lV4D/IlJ8/yFQev8kUnz/J1V//yhX + gf8nWIL/JVmC/yRZgf8kWYD/J1uB/ypfhf8uZIn/NGqO/zdtkf85b5P/OnCU/zhuk/82bJL/NGqR/y9n + jf8rZIr/K2WK/y5qjP81cpD/O3eU/z57lf9BfZb/Q4CX/0WBmP9Gf5r/R32d/0d7nf9GeJr/Q3eW/0F1 + lP8+c5L/OnCQ/zhskP81Z5D/MmOM/ypbhf8kVH//IVF8/yRVgP8qXIb/M2aO/zpulP89cZX/P3OW/z9z + lv9AdZj/QXab/z90m/88cZb/Om+T/ztxkv8+c5P/PnSS/z92kv9Ad5P/QnqV/0R7lv9Fe5b/RXqW/0V4 + lv9DdZb/QHGV/zpskf80Zo7/MGKL/yxfiv8uZIz/MmqO/zdwkf88dJT/QXiX/0J5l/9Ee5f/Rn2Z/0l/ + mv9Mgpz/ToOe/0+En/9PhJ//TYKe/0yBnv9MgZ7/TIGe/0qAn/9HfJz/Q3ma/z90mP87cZn/OXGa/zlx + mv86cJr/O2+Y/zptlP81aI7/MGOJ/y1eh/8pWYb/JVSE/yJRgv8kVIb/J1qJ/ythjf8xapL/OHGV/zx1 + l/9AeZr/QHqZ/0F4l/9Cdpf/RXaY/0JxlP88bJH/NWiO/zFli/8wZoj/MGeI/zJpiv8za4z/NGyP/zJp + j/8tY4z/J1yH/yFVgv8hVIP/J1qH/y5hi/8xZo7/MmmO/zFpjf8vZ43/L2eO/y9njv8wZ43/L2WM/y9j + i/8uYor/LWCK/yxfiv8rXYr/KVmG/yNSf/8dSXn/F0F0/xdCdf8bSHn/JFSD/yxfiv80Z5H/OGyT/zpv + lv87cZj/OnGa/zdvmP8xaZP/K2OM/yhfh/8rY4r/MWiO/zZuk/85cZb/OnOY/zl1l/87d5n/OXeZ/zZ0 + l/8zcpT/MG+R/y9rkP8vaI//L2WP/y9kj/8vZo//MGqP/zFukP8zb5H/NG+S/zVwk/82b5P/N3CU/zdu + lP82bJP/NWqT/zFmj/8sYYv/KF6H/yVchf8mXoX/KWKI/zBqjv81cJL/O3aW/z97mf9Ce5n/Rn2c/0t/ + n/9Jf5z/R32Z/0R7mP9De5j/QHmY/zx1lv85cpP/OHCS/zhwk/88c5X/QHWY/0N5mv9GfJv/SX+d/0yD + n/9PhqD/UYig/1OIoP9Th6H/VIik/1OHpf9OgqL/SX6e/0V6m/89cpX/OW6S/zluk/8+dJf/Qnia/0d8 + nv9Mf6P/SX6h/0J7nf89epr/Pnyc/0GAnv9EgqD/SIWh/0yGov9Qh6P/U4mk/1aKpf9WiqT/VYmk/1WI + pP9ThaL/UIGh/0t8n/9Edpv/PXCX/zhtlP80bpT/NXGW/zZ0mf86eJz/Pnmc/0N9nf9Hf57/TIKh/02E + ov9Lg6H/SoKg/0iBn/9IgqD/SYOg/xMhKP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yVh + hP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8MIzD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8WLD7/MmWN/zFk + jP8xZI3/NWeR/zlrlf86bJf/OWqX/zNlk/8sX43/JlmG/yZahv8sYoz/M2qR/zZtkf86cZP/PHOT/zxz + kv89dJT/PnWV/z10k/88cpP/PHKT/zpzkf87cpD/PHOQ/z1ykf88b5D/OWyN/zZoiv81Z4v/NmiM/zVo + jP8yZYz/LF+H/ydZgf8fUXr/HE13/xxNd/8dT3n/H1B6/x9Se/8gVH3/Ilh+/yddgf8rYYT/MGaJ/zZt + kP85cZL/OnKT/z11lf89dZb/PHKV/zlxlP83b5T/M2yR/y9ojv8uZ4z/MGuO/zVykf87d5X/PnuX/0F+ + l/9DgJj/RoCZ/0d/mv9HfZz/R3yc/0d8nP9Gepn/RHmW/0F3k/89c5D/Om+Q/zdqj/8xZIv/K1yF/yVW + gP8hUnz/I1V//yldhf8yZo3/N2yR/zlukv87b5P/OW6T/zlulf85b5f/OW+U/zdskf84bZD/PHKS/z50 + lP9AdpP/QHeT/0J5lf9DepX/Q3uW/0R7lv9DeJX/Q3WV/0J0lv8/cJX/OmuQ/zNkjP8tX4j/LGCJ/y1j + iv8xao3/N2+R/z11lf9BeJf/Q3qX/0R6l/9HfZj/SoCa/02CnP9Og53/T4Sf/06Dn/9Og5//TIGe/0yB + nv9LgJ//Sn+e/0V8m/9CeJj/PnSY/ztxmf82b5j/NW+X/zVtlf83bpX/OG6W/zdrkv80aI3/MmSL/y9g + iv8rW4n/KVeI/yRShP8lV4b/KV2J/y5mjv80bZL/OXKV/z53l/9AeZj/RHmY/0h4mf9Idpn/QnKX/ztt + kv80aI//MGWM/y1li/8waIv/MmqL/zNsjf80bI//MmqQ/y9mjv8rYIr/JFiF/yFUgf8mWYT/LGCJ/zFm + jP81a4//M2uP/zJqkf8zapL/NGuS/zRqkf8zaI//MWaM/y9jiv8tYYj/LGCI/ypdhv8oWoP/I1N9/x5L + d/8XRHP/FUFz/xlHd/8iUoD/K16I/zJmjf82apD/OW6U/zlwmP86cJv/N26Y/zJok/8sYoz/KV6I/ylf + h/8tZIv/MWuQ/zZwlf83c5b/OHSX/zh1l/84dZj/NnWY/zRylv8xb5P/MWyS/zFskf8yapL/M2uS/zFr + kP8zb4//NXKR/zdzk/84dJX/OnSW/zt0lv89dJf/PXOY/zxxmP86bpb/N2yU/zJnkP8sYov/KWCJ/yhh + iP8sZoz/MWuQ/zdylP88eJf/Qnub/0Z8m/9KfZz/S3+d/02Cnv9LgZz/SoCc/0d/m/9EfZv/P3iY/zt0 + lP85cZP/OXCT/ztxlf89c5f/QHWZ/0N5m/9HfZ7/S4Cg/02DoP9QhKD/UYWg/1GFoP9ShaP/Uoak/06C + ov9JfZ//QXaZ/zpvlP81apD/NmuR/zpvlf8/dJn/RXmd/0d7n/9Ee57/Pnqa/z57mv8/fZz/QoCf/0iF + ov9MiKP/UYmk/1OKpf9XjKb/WY2n/1mMpf9Yi6T/WImk/1aGo/9Tg6H/Tn6g/0l5nP9Ac5j/Om+V/zZv + lP81cJX/N3OZ/zd1mv86dpv/PXmc/0N9nv9If6D/SoKh/0iBoP9HgaD/RoGg/0mCof9LhKH/IjpH/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/KF9//xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HFR2/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/y9dfv8wY4v/MGOL/zBii/8zZY7/NGaR/zZnk/81ZpP/MGKP/yha + iP8kVoT/JluG/y5jjP8zaY7/Nm2Q/zlwkP87cZD/PHKR/ztykf89c5P/PXOT/ztxkf87dJP/PHWS/z51 + k/9BdpT/QXOU/z5xkv87bY//OGqN/zZojP81aIz/M2aL/zBkiv8sX4f/JlmB/x9Rev8bTHb/F0lz/xhL + df8aTXf/HFB6/yBUff8pXoP/LmWH/zJpiP82bY3/OXGR/zt0k/87dZH/PXeU/z54lf89dpT/PXWV/ztz + lv84cJX/Nm6T/zNskf80bpH/OXSU/zx5lv8/fJj/Qn6Y/0SAmf9GgJr/R36b/0d9m/9GfZv/Rn2a/0d9 + mv9HfZj/RHqV/0B1kv87cY//OGyO/zJli/8rXYX/I1V+/yBSfP8hVX3/KFyE/y9jiv80aY7/NWuP/zVq + j/8yaI7/MmeR/zJokP8xZ43/MWeL/zhuj/88cpL/P3WU/0F3lf9CeJX/QXiU/0N6lf9FfJf/RXyY/0R5 + l/9BdJX/P3GU/z1uk/83aI//MGCJ/ypdhf8pXob/KmKJ/zBpjv83cJL/PXaW/0F4mP9Ee5r/RXuZ/0d9 + mf9KgJv/TYKc/0+Env9QhZ//T4Sf/06Dnv9Mgp7/TIKe/0uAn/9Ifp3/RXua/0B3l/8+c5j/O3CZ/zZu + mP8xbJT/Mm2T/zVvlP84cpb/OnKW/zlvk/84a5L/NmiQ/zRjkP8vXYz/KVeI/yVUhP8oWIb/LGGK/zFp + jv83cJP/O3SV/0B4l/9IeJn/THia/0p1mv9Ccpf/Om2T/zNoj/8uZI3/L2eP/zFrkP80bpH/NW6Q/zVt + kv81bJL/M2mR/y9kjv8qXor/KFuG/ydahP8rX4f/MGWL/zRrj/81bpL/NW6U/zZvlv85cJb/OnCV/zlt + k/82a4//M2iM/zBliv8tYof/LGCG/ytcg/8nV37/Hk13/xlHc/8WQ3L/GUd2/x9QfP8oWoP/LmOI/zRo + jf83bJP/OG2X/zlumf85bpn/NWmU/y1hjP8oXIb/JluD/ylgh/8uZ43/MmyR/zRwlf80c5b/NXSX/zV0 + l/80c5b/NHKW/zNwlf80bpT/NW+V/zhwlv85cZX/OXSU/zh0k/86d5X/PXmW/z54l/9AeZn/Qnma/0J4 + mv9Dd5r/QXWb/z9zmf87cJf/N22U/zJokP8tZI3/LGSM/y5njv8ybZL/N3KV/z53mP9Fe5r/SX2a/0l9 + mv9Lf5v/TIGc/0+Fn/9OhZ7/TIOd/0iAm/9CfJr/P3iX/zx0lv85cZT/OW+T/zpwlf88cZj/P3SZ/0R4 + nP9HfJ7/Sn+f/02BoP9OgZ7/T4Kf/0+Cof9NgqH/S3+h/0V6nv88cpf/NWyT/zFnj/8wZo7/NGuS/zpw + lv8/dZn/QXia/z94mf8+epn/Pn2c/0GAn/9GhKH/TIik/1GMpv9Ti6X/Voym/1mMpv9bjqb/W4yl/1qL + pP9YiKL/V4aj/1WEpP9RgaL/Snqe/0J1mv88cZb/OXGV/zdylv82c5f/NnOY/zd0mv86dpv/Pnie/0N8 + oP9Ffp//RX+g/0WAoP9IgqH/SoOi/02Fov8oQ1L/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8mUWr/G1p+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZfv8UOVD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8QHSX/Om6U/zZp + kP8wY4v/MGKL/zBijP8wYo3/MGKN/y5fjP8pW4j/JFaE/yRXg/8oXIf/LmOL/zJojv82bI7/OW+P/zpw + kP87cZD/PHGR/z9zk/8/dJP/P3WU/z53lP8+eJX/QXiV/0J3lv9DdJX/QHCS/zxtkP86bI//NmqN/zRo + i/8yZov/L2SJ/yxhh/8nW4P/IFJ8/xtNdv8YSnT/F0t1/xpOeP8eVH3/JlyC/zFmif80aoz/Nm6O/zly + kf88dZT/PXeU/z53k/8/epP/QXyV/0B6lf8/eJb/P3iY/z10l/86cpb/OHGV/zp0l/89d5j/P3qa/0F8 + mv9Dfpr/Rn+a/0iAm/9Hfpr/Rn2Z/0Z9mf9GfZn/R32Z/0h9mf9Fepb/QnaT/z5wkf85bI//MmSK/ypc + g/8iVX3/HVJ5/yFWff8mW4L/LGGI/zBliv8wZ4v/LmWK/ytiif8sY4v/LGOK/ythiP8xZ4z/N26P/z1z + lP9AdpX/QniW/0J4lv9Bd5X/Q3mW/0Z7mP9IfZr/RnqZ/0J1lv8+cJX/OGqR/zNkjP8sXYf/J1uD/yNb + g/8nYYf/L2iO/zdvkv87c5b/P3eZ/0R7m/9Hfpz/SX+b/0qAm/9Mgp3/TYKd/0+Env9PhJ//TYOe/02D + nv9LgZ//Sn+e/0d8m/9Depn/QHWY/z1zmP86cJj/NW6W/zNulf80cJb/OXSY/zx3mv89eJr/P3aY/z5z + l/88b5X/OWqT/zNhj/8sWon/KFaG/ydWhf8rXIj/MWWN/zdtkv87c5T/QXSU/0h1lv9Mdpj/SHOY/0Fw + lv85apP/MWeQ/zBokf8yapT/N2+Y/zdwlv83b5T/N2+U/zhwlf83bZX/NWqT/y9jjf8sX4n/Kl2H/yxf + hv8vZIr/MmiP/zNskv83b5b/OnKZ/z1zmf8+dJj/PnOW/ztwk/83bI//M2qL/zJniv8yZYn/MGGH/yxb + g/8lVH7/HUp2/xhFc/8ZRXX/Hkt6/yRXf/8rX4X/L2SK/zNnkv82apX/N2uX/zlrl/80aJP/LmGM/yha + hf8kWYL/JFqD/yhgiP8taI7/MG2S/zJylv80dJf/NHSX/zNylf8zcZX/NXCW/zdwl/85cZf/PHSY/0F4 + mv9AeJf/QHmX/0B7mf9BfJn/QnuZ/0R8mv9GfJv/R3ub/0Z6nP9EeJv/QXaa/z90mf86cJf/NWyT/zFo + kP8uZo7/L2iP/zJskf84cpX/QHiY/0l9mv9Mfpv/TH+b/0t/mv9Ngpz/T4Sd/1GGnv9OhJ3/SoCb/0V9 + mv9Be5r/PneZ/ztzlv84b5P/NWuR/zZrk/85bpb/PnKZ/0N3nP9He57/SX2d/0x/nf9NgJ7/TICf/0p/ + n/9FfJ7/PnWa/zdvlf8xapL/LWaP/yxkjf8uZ47/NW2S/zpzlv88dpb/PXmW/z98mP9Af5z/RIKg/0mH + o/9QjKb/U42n/1aOp/9Zjqf/W46n/1yOpv9djqX/WYqi/1mJov9Yh6P/V4al/1GBo/9Je57/QXSZ/zxy + l/87cpb/OnOX/zp0mf84c5j/NnKX/zdymP86dZz/PHif/z56nv9Cfp//RoGh/0mCof9MhaP/T4ek/z1n + e/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yFFWv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1l+/wcRGP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/ylKXv9AdZn/O2+V/zVpkP8xZIv/LWCJ/yxeiP8qXYj/J1mF/yJU + gv8iVIL/JFeD/yldh/8uY4v/MmiN/zVsjv84bo//OnCQ/ztxkP89cpL/P3OT/0N2lP9EeJX/RHqW/0N6 + l/9DeJf/Q3aW/0Jzlf9BcZP/Pm+S/zptkP83a47/M2mM/zFni/8xZov/L2SJ/ytfhv8lWID/H1J7/xpN + dv8bTXf/HVF7/yJXgP8qYIb/MGaK/zVsj/82b5D/OXKS/zx2lP8/eZf/QHmV/0J7lf9DfpX/Qn2W/0J8 + l/9Aepj/QHiZ/z51mP88dJj/PXaY/z95m/9Aepv/QXub/0N9mv9Gf5r/R3+a/0d+mf9FfJj/RXyY/0Z9 + mf9HfZj/RnuX/0Z5l/9Edpb/P3GU/zprkP8yY4v/KFmC/yJUfP8fUnr/IFV7/yRagP8oX4T/LGKI/yxk + iP8qYob/KWCF/ypiif8rY4j/LmSK/zJpjf84b5H/PXSU/0F4mP9Eepj/QniW/0J4lv9Cd5b/RXqZ/0V6 + mf9GeZr/Q3WX/z1vk/83aI//MGCK/yldhv8iWoL/IFqB/yVfhv8tZ4z/NW2S/zlylf8/dpj/Q3qa/0Z9 + nP9KgJ3/S4Gd/0uBnP9MgZz/TIGc/02Cnf9OhJ//TIKf/0uBnv9IfZz/Rnua/0J4mP8/dJj/O3GX/zdw + lv81cJb/NXGX/zp2nP8+ep3/QXye/0R+n/9DfJ3/Qnia/0F1mf88b5X/NmeQ/y5dif8oVoX/JlSE/ypa + h/8zZI//OWyT/z1xlP9Bc5P/RXKU/0Zylf9CcJX/PWyU/zZnkf8yZ5H/MmiT/zZumP85cZr/OXKZ/zpy + l/87cpf/PHKY/zxymf84bpb/NWiS/y9ijP8qXYf/LF+H/y1iif8wZo//NGuT/zhwlv87dJn/PneZ/z92 + mP9Adpf/PnSU/ztxkf84b47/OG6O/zdrjf82aIz/M2OK/y1bhv8lUH//HUZ4/xhBdf8bRHf/IE18/yZY + gf8sXon/L2GN/zJlkf83aZX/NmeU/zJjkP8sXor/J1qF/yNXgv8iWYL/JV6G/ylki/8ua5H/MXGW/zR0 + mP80dJj/M3OW/zNxlf81cpb/OHKX/zx0mP8/dpf/Q3iZ/0V6mv9Depn/QnuZ/0N7mP9FfZn/RXuZ/0Z7 + mf9IfJr/SHya/0Z6m/9EeJr/QXaZ/z1zmP83b5X/MmqR/y9pj/8wao//MmyS/ztylP9EeZb/TH6a/06A + nP9NgJv/TYGc/06DnP9PhJ3/T4Se/06Dnf9Mf5v/R3yb/0N6m/8/d5n/O3SX/zZvlP8yapH/MGaO/zJo + kP83bJX/PXGZ/0N3nP9Gepr/SHya/0p/nf9Kf57/R3ye/0F4m/86c5j/NG6V/y5okf8sZo//LGaP/y1o + j/8zbJH/OXKV/zx2lv8/e5f/QoCY/0WEnP9IiKD/Toul/1KOqP9Wj6n/WZCq/1uQqP9dkKj/XpGm/1yO + o/9bi6L/Womi/1uKpf9Xh6X/UYGi/0h5nf9BdJj/O3GV/zlxlf8+d5v/P3mc/z13m/83cpf/NG6V/zZy + mf84dpz/O3me/z99n/9EgaH/SYOj/02Fov9QiKP/Q3GG/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/HjpK/xtafv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8WSWb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8EBwn/PW+O/0B1 + mf8+cpf/OW2T/zRojv8uYYn/J1qE/yZZhP8iVYH/H1J//x9Sf/8hVYH/KFyH/y5ji/8zaY3/NmyO/zhu + jv86cJD/PHKR/z5zkv9BdZX/RHiW/0h5lv9Iepj/R3uY/0Z4mP9EdZb/QnOV/0FxlP8/cJP/PG6Q/zds + jv80ao3/M2qN/zNrjv8yaY3/LmSJ/ypfhf8lWID/IFN8/x5Re/8eUnz/I1iA/ylfhf8uZYr/MmqN/zRt + j/82cJH/OnST/z54lv9CeZf/Q3qW/0R8lv9EfZb/RH6X/0N8mf9CeZn/P3WX/zxzlv88c5f/PXWY/z53 + mf9Bepn/Q32Z/0V9mf9GfZn/RXyX/0V8l/9FfJj/RXyY/0V7mP9GeZj/RXeX/0N0l/8/cJX/OmqR/zBf + iP8oV4H/IVB7/x1Od/8gVHr/I1p//yZegv8rYob/K2SH/ypkhv8tZoj/LmeL/y9ojP8za47/N2+R/zpx + kv8/dpX/QniX/0N5mP9DeZj/Q3iX/0R3mP9Ed5j/RHeY/0N2l/9AcpX/OmyQ/zNkjP8uYIn/J1yG/yBZ + gv8kXoX/KGKJ/yxli/8xaY//N2+T/z1zlv9Bd5n/RXub/0h+nf9KgJ7/SoCd/0p/nP9Kf5r/Sn+c/0uA + nv9LgZ//S4Ce/0h9nP9Eepr/QXeY/z1zl/86cpb/N3KV/zdzlf87eJv/QXyg/0R+of9HgKL/SICi/0Z/ + n/9Ee5z/Qnia/0Bzl/86a5P/MmCL/ylWhP8kUYH/KVeF/zJgjP86a5L/P3GT/0Fzkv9CcpL/P3CT/z1t + k/84aZL/M2WQ/zJmkv81a5f/OXCa/zt0nP88dJv/PHOY/z10l/8+dJf/PXOX/zxwmP84bJX/MWSN/yte + h/8qXIX/LGCK/zBlj/80apL/OG+W/ztzl/89dZf/PnaW/z92lf8/dpT/PXSR/z1zkv89cpH/PXGR/z5v + kv87apH/NGGM/ytVhv8jS3//G0N6/xg9dv8bRXn/Hk59/yVWg/8pWoj/LF2K/y9gjf8xYo//L1+N/ylb + iP8kWIT/IFWB/yRbhf8lX4j/J2WM/yxqkf8xcJb/NHOY/zZ1mf81c5j/NHKW/zVylv85c5f/PHSX/z93 + lv9CeJf/Q3mY/0R6mP9DeZf/Q3mX/0R7l/9Fe5b/RnqW/0h8mf9IfJn/SHuZ/0V6mv9DeJr/P3WY/zlx + lv80bZL/MWqQ/zBpj/81bZD/PXKS/0d5lf9LfZn/TX+b/06BnP9Ogp3/ToKe/0+Env9Og57/TICd/0p+ + nP9Ie5v/RXia/0B3mv88dJj/N3CV/zFpkf8tZI7/LWSN/zBlj/83a5T/PnKX/0J3mP9EeZn/R3yb/0d9 + nf9Cepv/PXaY/zhzl/80b5b/MmyV/y9rk/8uapL/MGyT/zVwlf86dZb/P3ua/0J/m/9GhZv/SYmd/02M + ov9Rj6b/VpCq/1mSrP9bkav/XJKp/1+TqP9fkqb/XpCk/1uNo/9ZiaP/WYil/1aGpf9OgKH/SHqd/0B0 + l/85b5L/PHOW/0F5m/9FfqD/QXud/zx1mv83cJb/N3KZ/zl2nf87eZ7/P32h/0WBo/9JhKP/TYak/1GI + pP9TiqT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8PHSX/H12B/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/w0lNv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xgsOf9Ad5n/P3SX/z1ylf87cJT/N2uR/zJljP8rXof/JFaC/yFT + f/8eUH3/HE98/yFVgf8pXoj/L2WM/zNpjv82bI7/OG+P/zpxkP88cpH/PnSS/0J3lf9Fepf/SHuY/0p7 + mf9Ke5r/SHmZ/0Z3mP9EdZj/Q3SY/0Bylf87bpH/N2yO/zVrjv82bpD/Nm+R/zVukf8zao7/L2SK/ype + hv8mWYL/I1Z//yFUfv8iV4D/Jl2E/ytiif8uZ4z/MmuO/zVvkP85cpP/PneW/0J5l/9EeZf/RXqX/0V7 + lv9GfZj/RX2a/0N6mf8/dJb/PHGU/zhukv84b5T/O3SW/z94mP9CfJj/Q3uZ/0R7mP9Ee5j/RHuY/0R7 + mP9Ee5j/RHqZ/0V4mP9Edpn/Q3OZ/z9vl/84ZpD/L12I/yZUgP8fTnn/Hk13/yJTe/8mWn//KWCE/yxm + iP8uaIn/MGuL/zNujv82cJH/OHGS/zpzlP89dZb/P3eV/0F4lv9Eepf/RHqY/0V6mf9DeJj/RHeY/0J1 + mP9CdJf/P3GV/zxukv82aI3/MWSK/yxiif8lXYX/Jl+H/ypji/8uZ43/L2eN/zFpjv8za5D/OXCU/z50 + l/9Bd5j/RHqb/0d9nP9Ifpz/SH6c/0h9m/9IfZr/SX6c/0h+nP9Ifpz/Rnyb/0F3mf8+dJj/PHSW/zl0 + lf84dJX/PHmZ/z99nf9EgKH/SYGj/0yBo/9LgaP/SICh/0Z9nv9Eepz/QXSY/zxuk/8zY4v/KleD/yZS + gP8nU4H/LlyH/zZmjf89cJH/P3ST/z5yk/87b5L/N2uR/zJnj/8yZ5H/M2qU/zZsmP85cJr/PHSb/z52 + m/8/dpr/P3WX/z50lv89c5b/PHCV/zhslP8yZo7/LF6I/ypdiP8rX4v/MGOP/zRpkv84bpT/OnKV/z1z + lP8+dZT/PnaS/z91kf8/dpP/QHWT/z91k/9Ac5T/QXKV/z9tlP84ZZD/L1mK/yVOg/8dQ3z/GUB4/xdB + dv8ZSHn/H1B//yNTgv8lVYT/KVmH/ytbif8qWon/JleF/yFVgv8jWYT/J1+K/ypkjv8rZ5D/LmyU/zBv + lv80c5n/N3SZ/zd0mf83c5j/N3OX/zlzlv89dZf/P3aX/0B3lv9CeJf/QniW/0F3lf9CeJb/RXqW/0Z6 + lv9He5b/SHyX/0l8mf9JfJn/R3yb/0R6mv9AdZj/OnKW/zRskf8vaI7/MGiN/zdsjv8/cZD/RXeV/0p8 + mf9NgJz/TICc/02Bnf9NgZ7/TICd/0yAnf9Kf53/R3uc/0Z5m/9Edpr/QXSZ/ztxl/82bZT/MGiR/y1m + j/8tYo3/LmOO/zJmj/84bZP/PHGU/0B0lv9Cd5j/QXeY/z51l/86dJb/N3KW/zVzmP81cpn/NXKa/zRx + mP80cZb/OHSX/z15m/9Df53/SIag/0qIoP9NjKH/UZCj/1aRp/9akqr/XJOs/1ySqf9dk6j/X5On/2GT + pv9gkqb/XI6l/1mKpf9VhqT/UYKi/0x/of9GeZ3/PnSX/z1zlv9Adpj/RHue/0Z9n/9FfZ//QXqc/zx2 + mv86dpv/PHie/z15n/9BfKD/RoCi/0uFpf9Ph6X/UYik/1SKpf8PGR7/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/w8dJf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8bWHz/BAoP/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Lldw/z1z + lv89c5X/PHKU/zxxk/86bZL/NmmP/y9hi/8oWoX/IVOA/xxOfP8dUX3/JFiE/yxhi/8wZ43/M2uO/zZt + j/85cZD/PHOS/z10k/9AdpT/Q3mW/0Z8mP9JfZr/Snya/0t8m/9KeZn/R3iZ/0R2mP9Edpr/PnKW/zhu + kP80bI3/N2+Q/zlyk/84cpP/OHCT/zdukv81ao//MWWL/yxfh/8nWoT/JViC/yNYgv8lXIT/KGGI/yxm + i/8vao7/NG2Q/zlyk/8/d5f/Q3iY/0Z5mP9HeZj/SXqZ/0l8mf9IfJr/RHmY/0B0lv88b5P/N2yQ/zZs + kP85cZL/PXaV/z53lv9AeJj/QXmY/0F5mP9CeZn/Q3qZ/0R6mf9EeZr/RHia/0N2m/9Cc5r/Pm2X/zZl + kf8uXIj/JFJ+/x9Nef8fTXj/J1V9/y1chP8uYoj/MGiM/zJtjv81cZD/OXST/zx2lP9Aepj/QXqY/0F6 + mf9De5j/Q3uY/0V7mP9GfJn/RnuZ/0Z5mv9Ddpj/QXOX/z9xlv89bpP/OWqP/zNliv8tYYj/K2GI/ytj + i/8uZ43/MWqP/zVukf81bpL/NW2R/zVtkf82bZL/OnGV/z10l/9Ad5j/QniZ/0R6mv9GfJv/Rn2c/0Z8 + nP9Ge5r/RXqa/0V7mv9BeJn/PXSX/ztzl/85dJX/OneW/z16mP9Bf5z/RIGf/0iCoP9Lg6L/ToKi/0yB + of9Lf6H/SH6f/0V8nf9Cdpr/Pm+V/zVljP8rWIL/JVB8/yRPfP8rWIL/MmKI/zhsjf87cJL/O3KT/zhv + kP8za47/MmqQ/zNrkv81bpf/Nm6Y/zdvmP86cpj/PHSZ/z50mP8/dZf/PXOV/z1ylP87cZP/OW6S/zJn + jv8rYIr/KF2H/ypeif8vYo3/NGiQ/zlsk/87b5P/PXKT/z5zk/8/c5H/QXWS/0J2k/9CdpT/QHOT/z9y + lP8/cJX/PGyU/zdkkf8wW4z/JU6E/x1Gff8ZQ3j/F0V3/xpJef8eTn3/IlKB/yVVg/8mVIX/J1WF/yVV + hP8iU4L/IlWC/yRahv8pYIz/LmiR/zFtlv8ycJf/M3GY/zVzmf84dJr/OXWZ/zh0mf84c5j/OnOX/zx0 + l/89dZf/PnWW/z91lv9AdpX/QXeV/0N5lv9Fepf/RnuX/0d7l/9Ie5j/SX2Y/0h8mP9He5j/RHqZ/0B2 + mf86cZX/M2uP/zBnjP8zaIz/OWyN/z9xkP9EdpX/Snyb/0t9nP9Kfpz/SX2c/0p+nP9JfZz/SHyc/0Z6 + m/9EeJv/RHeb/0J1mv9Ac5j/PW+V/zdrkf80a5H/MWiR/y9lkP8wZZD/MmaQ/zRnj/80aI7/OGyR/zpv + k/87cZP/OXGU/zhylf82cZX/N3OY/zl3m/87eZ7/O3ie/zt4nP88eZv/QX2d/0aCoP9Kh6L/TYui/1CO + ov9VkKT/W5Go/1+Sqv9dkqr/XJKp/1ySp/9fk6X/YJOn/1+Sp/9cj6f/V4ql/1GDo/9LfqH/R3qf/0R4 + nP9AdZr/Q3mc/0Z8n/9IfqD/SX+g/0d/oP9EfJ7/PXib/zt2mv86dZr/PHid/0B6n/9FfqH/S4Kj/0+H + pf9Tiqb/U4ml/xUiKf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yNhhP8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xVIZv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcOEv86cZX/OnCU/zpxk/87cZT/PXKV/ztwlf83a5L/M2WO/ytd + iP8jVYL/HlB+/yFUgf8oXIj/LmOM/zFojv8za4//N3CQ/zlzkv88dJP/P3eV/0J5lf9Ee5f/RnyY/0h9 + mv9KfZv/Snua/0l6mv9GeZn/Q3iZ/0B1l/87cpT/NGyO/zRvj/83cpH/OXSU/ztzk/87cpP/O3GT/zpw + k/83a5H/MWWM/yxgif8oXIb/JVqE/yRbhP8nYIj/KmSK/y5ojf8ybI//OHCT/z50lv9Dd5j/Rnia/0d4 + mf9JeZn/THub/0l6mv9Fd5j/QXOV/z5vlP84bJD/NWqO/zZvkP86cpT/PHSV/z11lv8+dZf/P3aX/0B3 + mf9Bd5r/Q3ib/0N3mv9Cdpv/QnSb/0Bxmv88bJf/NWSR/yxah/8jUX7/Hk15/yFPev8nVX//LVyG/zRk + jv80aZD/NG2R/zdzk/87dpP/PniV/0N8mP9Ffpv/Rn2a/0V9mv9FfJn/RXuY/0d8mv9IfJv/RXmZ/0N1 + l/8/cZb/PW+V/zprkv82Z43/LmGH/yhehP8pYIb/L2aN/zRskv82b5P/OnOV/zx1lv87dJX/OnGT/zlw + lP86cZX/PHKW/zxzlv89dJb/PnSW/0F3mf9Depv/RHqc/0V7nP9CeJn/QHaZ/z51mf87c5f/OHOV/zh1 + lf86eZf/QX+b/0WDnv9JhaD/TIWh/0yFof9NhKH/TYKh/0yCof9LgqH/SH+f/0R6nP9Bcpj/OmmQ/y5b + hP8jT3n/Ik55/yZVfv8tXoT/M2eK/zVrjv82bpD/M22P/zFrjv8zbJH/NW+V/zhxl/85cpj/OXKY/zdw + lv83b5T/OnGV/zpylf87cZT/O3GT/ztxk/85bpL/NWqO/yxiiv8nXIb/KFyG/y1fiP80ZY7/OWuS/z1u + k/8+cJP/P3GS/0Bykv9Bc5P/QnSV/0FzlP8+cJL/O26R/zlqkf82ZpD/M2GO/ytZif8jUIP/HEh8/xhG + eP8ZSnn/Hk99/yNTgv8lVYP/JleE/ydXhf8kU4P/IlKB/yBRgP8gVYL/JFyH/ypjjf8wa5T/NHCY/zVy + mv81cpj/OHSa/zp1m/87dZv/O3SZ/zpzmP87cpj/O3OY/zxzlv88c5X/PHOU/z50k/9BdpX/QneW/0R5 + l/9FeZf/RnqY/0d6mP9Hepf/RnqW/0R4lv9Cd5f/P3WV/zpxk/8za4//MmeN/zVojf86bI7/P3GT/0R3 + mP9Hepv/SHub/0d7m/9Gepv/RXqb/0V6mv9Dd5j/QXWX/0B0mP9BdZn/QnWa/0BzmP89cJX/PHCT/zpv + k/84bpP/NWuU/zNolf8zZ5P/L2OO/y9hi/8wYor/MmaM/zVpjv82bZH/N3CT/zdylv86dZn/O3ic/z58 + n/9AfqH/QH2f/0J+n/9FgKD/SYSi/0yIo/9Qi6T/VI6k/1mQpf9dkqj/XZKq/16Rq/9ckqn/XJGn/12S + pv9ekqb/XZGo/1qOqP9TiKb/ToKj/0h7n/9Dd53/P3Sa/0V6nv9Jf6H/TIKi/02Do/9MgqL/S4Gh/0d/ + n/9Be5z/OnWY/zhzl/86c5j/PXWa/0J6nv9KgKL/UIWl/1OIpf9ThqP/HjI9/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/JGGE/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/DSU2/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GDFB/zhw + lP84b5P/N26S/zlwlP88cZb/PnGX/zlslP80ZpD/LF6L/yVWhP8jVoT/JlmG/ytgi/8uZY3/MmqO/zVu + kP85c5L/PHaU/z54lv9Bepf/Q3uX/0R7l/9GfJj/SHya/0l7mf9Je5r/R3qZ/0R4mP9Bd5j/P3aX/zpy + k/84cZL/NnKR/zd1kv86dZT/PHWU/zx0kv89c5P/PHGU/zpuk/82apH/L2OM/ylfiP8lXIX/JFyF/yZf + iP8pY4r/LGaM/zFpjv83bpL/PHGV/0F1mP9Edpn/RXWY/0d2mP9JeJn/SXia/0V2l/8/cZP/OmyR/zZp + jv8xZ4r/M2qN/zZukf84cJX/OXCV/zpwlf86cJb/PHKX/z90mf9AdZr/QHWa/0Bzmf8/cZn/PW6X/zlo + lf8yYY7/KliG/yNRf/8gTnz/IE57/yNTfv8pWoT/L2GL/zNokf80bZP/NnGT/zl0k/89dpL/QXmV/0R8 + mP9Hfpr/R32a/0V7mf9Fepn/R3ua/0Z5mf9Ed5n/QXOW/z5vk/87bZP/OWqS/zJljP8qX4X/JFt//ylh + hv8xaI3/Nm6S/zpzlv8+d5j/QHmY/0B4mP8/d5j/PXWX/z10l/89c5j/PHOX/ztylv87cpX/O3KW/z51 + mP9BeJv/Qnia/z92mv88c5n/OnKZ/zlzl/83dJf/OHaX/z58mv9EgZ7/SISg/02Hof9Oh6L/Toah/0+F + of9OhaH/TYWj/02Fo/9JgZ//Rn2d/0R3mv89bZP/NGGK/ypXgf8jUHv/JFR9/ydagv8tYYf/MWiM/zFq + jf8wbI7/MW2P/zRwkv84cpb/O3SY/zx1mv87dJn/OHGV/zVukv8ya5D/NGyQ/zZukf83b5L/OG6S/zht + kv81aZD/L2SM/ypdh/8nWoP/K12G/zFjiv84aI//PGyS/z1uk/8/b5P/QHCT/0BwlP9Ab5P/PG2R/zlr + j/81aI3/MmSL/y9giv8sXIj/J1WF/yBOgP8aSXr/F0h3/xtNe/8hU4H/J1iG/ylbh/8oWob/KFmF/yZW + hP8jU4H/HlB+/x5Sf/8iWYX/K2WO/zFslP81cZf/NnKY/zhzmf87dJn/PXWb/z11mv88dJn/O3KY/zty + mP86cZf/OXCW/zlwlP86cZL/OnGS/z5zk/9AdZX/QXaV/0J2lv9Dd5f/RHeX/0R3l/9Ed5b/QnaU/0B1 + lP8+dJT/OXCR/zRqj/8yZ47/NGaN/zhrkP8+cZX/Q3aZ/0N3mv9EeJv/Q3mb/0N4mv9Cd5n/QHWY/z9z + lv8+cpX/PXGV/z9zlv9BdZn/QXaZ/0B0l/8/dJb/QHWW/z50lv87cZb/OG2X/zNmk/8uYI7/Kl2I/ypb + hv8sXof/MGOL/zVqj/84b5P/OnOW/z13m/8/e57/QX6h/0OAov9DgKD/RYCg/0iBoP9LhaL/T4mk/1OM + pP9XjqX/XJCm/12Sp/9dkqn/XZKq/1yQqf9bkKj/XZGn/16RqP9ckKn/WI2p/1KHp/9LgKP/RXqf/z92 + nP9Bd5z/Rnyf/0uBov9PhaT/UIak/1CGo/9OhaL/SoSh/0V/n/8/eZr/OXKW/zVuk/84b5b/P3Wb/0d7 + oP9OgqT/UIKj/0+Bof8oQFD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8eUG7/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxafv8FCg//AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8sWXf/OG+U/zhvk/83bpP/OG+U/zpvlv87bpf/OmyV/zNl + kv8sXo3/J1mI/yVYhv8oXIn/LGKM/y9njv8ya4//NnGR/zp1k/8+eZb/QXuZ/0N7mf9EfJj/RXuX/0Z7 + mP9He5j/SXuZ/0d7mf9FeZj/QnmY/z92lv88dJT/PHSV/zx2lv88d5b/O3eV/z15lf8/eZX/QHiU/z91 + k/8+cpP/PG+U/zdqkv8xZo//K2GL/yZfh/8lXob/JV+H/yhiif8rZIn/LmeM/zNqj/84bpP/PnKW/0Jz + mP9Dc5j/RHSX/0V0mP9EdZj/QHKU/zpsj/81aI3/L2SK/ytihv8sY4j/MWiP/zNqkv80apP/NWqS/zdr + k/85bZT/OW2U/ztvlf88cJX/PG+W/zttlv85apT/NWWR/y5di/8nVoT/IlB//x5Me/8gUHz/IlN9/yNV + f/8oXIX/LGOL/zBokP8zbZH/NnCR/zpzkv9Ad5T/Q3uX/0Z9mf9HfZr/RXua/0V5mf9FeJn/RHeY/0Fz + l/8/cJT/PGyS/zlpkP81Z47/LmOJ/yZdgv8pYIT/LmWJ/zNrjv86cpT/P3eY/0J6mv9DfJr/RHya/0R8 + mf9Ee5n/QnmZ/0B3mv8/dpr/PHOZ/ztyl/85cJX/OXCV/ztylf89c5f/OXCW/zZulv82cJf/NnKY/zZ0 + mf87eZv/QX6d/0WDn/9LhqH/T4eh/1CIov9RiKL/UImi/0+JpP9PiaX/TYej/0qDoP9Hf53/Rnub/0Ny + lv88aJH/M1+K/yxXhf8mVYH/JVeC/yhehv8sZIr/LmmM/zFsjv80cJH/N3OU/zt3mP8/eZr/QXmb/z92 + mv87c5f/NW+T/zFrkP8tZ43/L2qQ/zNskf81bJH/NmuS/zRnkP8wY47/K12I/ylahf8qWoP/MGCH/zVl + i/85aI//PWyS/zxqkf88apH/PGqR/zlpj/82Z43/MmWL/y5hiP8sXof/KVuG/ydZhf8kVoL/H1F//xlL + ef8YS3j/G017/yNVg/8pW4n/LF+L/yxeiv8qXIj/KVqF/yRVgv8fUn7/HFB8/yJZg/8pY4v/MGuS/zZw + l/84c5n/OnOZ/z51mv8/dZv/PnSZ/z1zmP88c5f/PHOX/ztyl/85b5X/N26U/zhukf84bpD/O3CR/z1y + k/8/c5P/P3OU/z9ylP9Ac5X/QXSX/0J0lv9Bc5X/P3OT/z50lP85bpH/M2iP/y9jjf8vY43/NGeQ/zpu + lf8+cpf/P3WZ/0F2mv9Bd5n/QXea/0F2mf8+dJf/PXOV/zxylP88cpT/P3WX/0N4mf9Eepr/RHqa/0R6 + mv9Eepr/Q3mZ/0F3mf87cJb/M2eR/y1fjf8nV4b/JVWD/yhXg/8vX4n/NWaP/zlsk/88c5f/QHib/0J9 + n/9FgaL/R4Gh/0eCof9Igp//SIKf/0uDoP9Qh6L/VYyk/1mOpP9ckKX/XpKn/16Tqf9dkqn/XZGo/12Q + qP9dkKj/XZCp/1qOqv9WjKv/UIap/0h+o/9CeZ7/QHic/0R6nf9Hfp//S4Oh/0+Gov9TiaT/U4ml/1KI + o/9Oh6L/SoOh/0R+nv88dpr/Nm+V/zNqkv86cJf/Qnee/0h7oP9MfqL/TH2g/zFQZf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/yFOaP8aWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/FENe/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CRMa/zVr + kf84bpP/OG+T/zhuk/83bpX/OG2W/zhslv80aJT/MmSQ/yxejf8nWon/JVmH/yheiv8tZI3/MGqQ/zNu + kf82cpL/OneU/z15lv9Be5n/Q32a/0R8mP9Fe5f/RnqX/0d5l/9Hepn/RnuZ/0N6mf9Ad5b/PnaV/zt0 + lP89d5f/PnmY/z97mP8/e5f/QXuX/0N9mP9EfJj/RHmX/0B0l/88b5b/NmqT/zFmj/8tZI3/KmKK/yhi + if8nYYj/KGGI/ypjif8tZIv/MWeN/zVpj/87bpT/QHGW/0JymP9Ccpj/QXKW/z9xlf87bpH/NmmO/zFk + i/8sYIn/KV+G/ylgh/8sYoz/LWOO/y5kkP8wZI//MmaQ/zRokP81aY//NWqP/zZqkP83a5H/NmqR/zRm + kP8wYYz/KlqH/yNSgf8fTX3/H098/yJUf/8lWIH/JVmB/yJYgP8lXoX/KWOJ/y5ojf80bZH/OnCT/z90 + lP9Dd5b/RnuZ/0V7mv9Fepr/RHmZ/0N3mf9CdJf/P3CV/zxsk/86aZD/NmaN/zFli/8qYYf/KmGG/y5l + if8zaoz/OXCS/z93mP9EfJz/Rn6c/0d/nP9IgJz/SICc/0h/nP9If53/R36e/0R7nf9Ad5z/PXSb/zpx + l/82bpT/Nm2U/zNrkf8yapH/MWuT/zFulP8zcZb/N3Wa/z57nf9EgJ//SYSh/02Gof9Ph6L/UYmi/1GK + o/9SjKT/Uo2l/1CKpf9OiKP/SoSg/0qBnf9KfZz/SHiZ/0Julf87ZJD/Ml2L/ypXhv8lV4T/JluG/yli + iv8uaY3/M2+R/zd0lP87dpb/P3mZ/0V9nf9FfZ7/RHuc/z92mP84cJX/MmyS/y9pkP8taZD/L2qQ/zRq + kv81apL/NGeQ/zFjjf8rXIj/KFiF/yZVg/8rWoT/Ml+J/zdkjf84ZY7/N2ON/zZjjf80Yov/MWKJ/y9h + if8tX4f/K12G/ylbhf8oWIT/KFqF/yVYhP8hVoD/HlJ9/xxQfP8fUn7/I1WC/ylciP8vYo7/MGKO/y9h + jP8rXYj/JleD/yFTf/8gVH//I1mC/ypiiv8wapD/Nm+V/zpzmP89dJn/PnWa/z91m/8+dJr/PXOa/z1z + mf88c5n/OnCW/zhulP83bZP/NmyR/zdskP84bZD/OW6Q/zpvkf87b5L/O26S/zxvkv8+cJT/QHGV/0Bx + lf8/cZP/PHCT/zZrkf8vY4//K1+L/ytfi/8tYYz/MmiR/zdtlf86cZf/PnSY/z92mf9Ad5r/QHeZ/z92 + mP8+dJb/PnSW/0B2l/9DeZr/R36d/0d+nf9Hfpz/SH6c/0d9nP9FfJz/Qnma/zxylP81a5D/L2GM/yhX + hf8fTXz/Ik99/ylXg/8xYYv/OGqS/z1xl/9BeJr/RH2e/0eBof9Jg6L/SoSh/0iCn/9Jgp7/SoKe/1CH + of9Vi6L/Wo6k/1yQpf9dkab/XpKo/1+Tp/9fkqf/XpGo/16RqP9dj6r/Wo2r/1aKq/9Ng6j/RX2j/0B4 + nv9BeZz/Q32e/0iBoP9MhaH/UIij/1OKpP9UiqX/VYul/1GIpf9NhaP/SIGh/0F7nv87dJn/Nm+V/zRs + lf84bpf/P3Oa/0R2nf9LfKP/OV96/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HD1Q/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8OIzH/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8bOU//M2mP/zZrkf83bJH/OG2T/zhtlf84bJb/NWmV/zFl + kv8tYI//Kl2M/yVZiP8mW4j/K2KN/y5oj/8wbJD/M2+R/zZykv85dZT/PHeW/z97mf9CfZr/RHya/0V7 + mP9GeZb/R3mX/0Z6mP9Ee5r/QnqZ/z93lv89dZT/PXeW/z56mP9AfJr/QnyZ/0R8mf9FfJj/Rn2Z/0h/ + m/9HfJv/Q3ab/zxwlv83bJP/MmiQ/y5mjv8sZY3/LGWM/ypjiv8rY4r/LGOK/y1jiv8vZIv/NGeO/zhp + kv89bZX/P2+X/0Bwl/8+b5b/Om2T/zdrkf8zZ47/L2OM/yteiP8nW4X/J1uE/yleiP8pXov/KV6M/y1i + jf8vY43/L2SL/zFli/8xZov/MWaK/zFnjP8yZo3/MWSN/y1eif8oWIX/IE9+/x9NfP8iUn7/JlqC/ylf + hv8pYYf/J2CG/yNdgv8jXoH/KGOF/zFnjf86bJT/Pm+W/0F0lv9Ed5j/RnmZ/0R4mf9Ddpn/QnWZ/0Fy + l/89bZX/OmmS/zZmjv8yZIz/LmSJ/yxkif8waIz/NGuO/zhvkP89dZX/QnqZ/0d/nv9JgZ7/SoKe/0uC + nv9NhJ//TYOf/0yDoP9MgqD/SoCg/0Z9n/9BeJz/O3Oa/zdvl/80bJL/MGmP/y1mjv8taY//LmyS/zFw + lf83dZn/Pnue/0aBov9MhaP/Toaj/0+Hov9QiKH/UYuj/1GNpf9Tj6b/UYyl/0+Jov9NhZ//TYOe/05/ + nP9Lepr/R3KY/0BplP82YI7/LFmJ/ydXhv8lWof/KmKM/zFrkf83c5b/OnaW/z15l/9CfJn/Rn6c/0uB + oP9Lf6D/RHib/zxyl/82bpP/MWyT/y9qkv8xaZH/M2qR/zVokf80Z5D/MWOM/y1diP8nVIP/JFCA/yVR + gv8rV4X/MVyJ/zNdiv8yXIr/MFyI/y1bhv8rW4X/Kl2F/ypehf8qXYb/LF6H/yxdh/8rXYj/K1+K/yhd + hv8kWoP/IVeA/yJWgf8lWYT/Kl6J/y5ijf8yZZD/MmSP/y5gjP8qW4f/JFSB/yJTgP8jVoL/Kl+I/zJp + j/82bpT/OnKX/z1zmP8/dJn/PnSa/z50mv8+dJv/PnWb/ztymP85bpX/N2yT/zVqkf80aY//NWqP/zVp + jv82ao//N2uP/zhrkP84a5D/OGuR/zlskf86bJL/PG2S/zxskv84apL/MmWR/ypejf8kWoj/JFqG/yhe + if8sYo3/MmmS/zdvlP87dJf/P3eZ/0F5m/9Depv/Qnma/0F5mf9CeZn/RHub/0iAnv9Jgp//SoKe/0qD + nv9JgZ7/SH+e/0h/nv9CeZr/PnSW/zlvkv82aY//LVyH/yNRfv8aRXT/Hkp4/ydVgP8xYor/O26T/0B0 + mP9Ee53/SIGg/0uFov9LhKD/SYKe/0iAnP9Kgp7/ToWg/1OJov9Xi6T/W42l/12Qpv9fkqf/X5Kn/1+S + pv9gkKX/Xo+m/12NqP9aiqv/U4Sq/0p+pv9CeaD/P3ic/z96m/9DfZ3/SoWh/1CJpP9SiqX/VYum/1aM + pv9WjKb/VIum/1CIpf9LhKP/RX6h/z54nf86c5r/NG2W/zJpk/80aZL/PHCZ/0R2n/8/bI//AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8bOUj/G1l9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Hlt//wMFCP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ypX + ev8yZ43/NWqO/zZqkP84bJL/OW2V/zZqlf8yZpP/LmKQ/yxgj/8oXYz/JlqJ/ypgjf8uZ5D/MWyR/zBt + j/8xbo//M3GS/zZzk/86dpb/PnmY/0F8mv9De5n/RXqY/0V5l/9FeZf/RXuZ/0R7mf9BeZj/PnaV/z53 + lv8+eZj/QHya/0J8mf9EfZr/Rn2a/0Z8mP9HfZn/SH2a/0h7nf9Cdpv/Om6V/zNpkP8zaZD/MWmP/y9o + jv8vaI7/LmeO/y9mjf8uZIz/LmOL/y1iiv8xY4z/NGaQ/zhpk/86a5T/OmuU/zhrk/82apH/M2mP/zBm + jv8tY4v/K1+I/yZahP8nW4T/Kl+H/ypfiv8qYIv/LGKN/y5jjf8wZYv/L2WI/y9liP8wZoj/MWeK/zFm + i/8xZIz/LF6J/ydXhP8hUX7/IVN+/ydbgv8rYYf/LmaL/y9pjf8uaYz/KmaI/yZhgv8kWn//LF+G/zRj + jf84aJH/O22U/z5xlf9AdJf/Q3aY/0JzmP9Acpj/P2+X/zxrlf83ZpH/MWSN/y1jif8qY4j/MWqO/zVu + kf85cZP/PXWW/0B4l/9FfZv/SICd/0yDoP9NhKD/TYSf/06FoP9Qh6L/UIei/0+Fov9PhKL/S4Ch/0Z8 + n/8/dpz/OnOZ/zdvlf8ybJH/LmmP/ytqj/8ra5D/MG6T/zd0mP89eZ3/R4Ci/02FpP9PhqP/T4ei/0+I + of9OiqH/T42k/1CMo/9QjaP/T4qi/1CGn/9QhJ7/T4Cd/057nP9KdZr/Q26W/zllkf8uXIv/JliH/yVa + h/8qYo3/NG+V/zp1mf8+eZn/QXuZ/0R9mv9If5z/S4Gf/0t/n/9Ie53/QXWa/zpwl/82bpb/NWyV/zVr + lP81apL/NWmQ/zRnj/8xYor/LFyF/ydVgf8iTX7/IUt9/yVOgP8pUoP/K1WF/y1Whf8sV4X/KleD/yhZ + gv8pXYP/KmCF/y5jiP8xY4v/MGOL/zBkjf8xZo//LmSN/ythiv8nXYb/JVqE/ydbhv8rX4r/MGSP/zRo + kv8zZ5H/MWSP/yxfi/8oWYX/JFSC/yRVg/8oWof/LmGM/zVpkf84bpT/PHGW/z5ymf8+c5r/PnSb/z90 + nP8+c5v/O3CX/zhtlP81apH/MmeO/zFljP8xZoz/MmaM/zNmjP80Z4z/NWiN/zZpjv82aZD/NmiP/zVn + jv81Z47/NmeP/zVlkf8vYI//KFuJ/yFXhP8fVoP/JF2I/ypijP8uaJD/NG2T/zl0lf8+eJn/Qnuc/0V9 + nf9FfZ3/RX2c/0d/nf9JgZ//S4Sg/0uEoP9NhZ//S4Sf/0qCoP9JgaD/Rn6e/0J6m/8/dpj/PnSX/zxv + k/81Zoz/KFaA/x1Jdv8WQW//GkVz/yhWgP8zZIv/PG+T/0N5mf9JgZ//TIWh/0yFof9Kg57/SICc/0aA + nP9Jgp7/T4Wi/1SIpP9ZjKf/XY+o/2CRpv9hkaX/YZCk/2CPpP9fjaT/XIun/1eGqP9Qf6j/SHml/0B2 + n/88dpr/PHiY/0WBnf9MiKL/UYyl/1SLpv9WjKf/V42n/1aNp/9VjKf/Uoum/0+Hpv9JgqT/Qnyh/zp1 + nP8zbZb/L2eR/y9lkf8zaJT/O2+b/z1wm/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMm + Lv8gX4H/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8VP1j/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8IERn/MGSK/zJnjP81ao7/NmuQ/zhskv85bZT/NWqU/zFm + kf8tYo//Kl6N/yhdjP8qYo7/LmeR/zJslP8xbpH/MW+R/zJwkf8ycJL/NnOU/zl1lv89eJn/QHmZ/0N6 + mP9FeZf/Q3iW/0N5l/9Cepj/QXmX/0B4l/8+d5b/PXiX/z56mf9Be5j/Q3yZ/0V8mf9HfZn/R32Z/0d8 + mP9He5r/RXma/0B0l/81aY//MWeN/zBnjf8xaY7/MmyQ/zJqj/8xaZD/MmmQ/zJnj/8wZI3/LmGK/yxf + iP8vYIv/MmSO/zNmkP8zZo//MWaP/zJnjv8wZ47/LmeN/y1li/8sYon/LGCI/y1hiP8uY4r/MGWN/zFn + j/8xZ5D/MmiQ/zNrj/8zaoz/MmmK/zJpif8zaov/NGqO/zJmjv8uYYv/KFmF/yZXgv8mWoL/K2GG/y9n + i/8ybI//NHCS/zZyk/81cZD/MGmK/yxghf8mVn7/KlqD/y1fiP8yZI7/NWiT/zhslP87b5X/PnCV/z5u + lv88a5X/OWeT/zRlkP8uY4z/KGGH/y1njP8zbZH/OXKV/z52mP9Cepn/RX2a/0d/nP9KgZ7/TYSf/06F + oP9OhZ//T4Wg/1GHov9SiKP/Uoek/1GGo/9NgqH/Sn6f/0N6nP89d5r/OXWY/zdzl/8zcZX/Lm6S/y5u + kf8wbpL/N3OW/z54m/9FfJ//SoGh/02Eof9NhqH/TIei/0uJof9MiqH/Toqh/06Kof9RiaD/Uoif/1KE + nv9SgJ//UHye/0t3nP9Fcpn/O2mT/y9gi/8mWYf/J1uJ/y1kj/81bpX/PHWZ/0B6mv9EfJr/Rn6b/0mA + nf9Kf57/SX2e/0d6nf9Fd5z/P3Oa/ztvmP85bZf/OGuW/zZpkv8zZo//MmaN/zBiiP8sW4P/J1N//x9K + ef8dRnj/Hkd5/yFKfP8lTn//J1KB/ylUgv8qV4P/KluE/ytfg/8uZIf/MWiK/zRojf80aI7/M2iQ/zNo + kf8zaJH/MGaP/ythiv8oXof/KV2H/yxgiv8xZY//NGiS/zVqk/8zZ5L/L2OO/ytdif8oWYb/JVaF/yVV + hf8pWoj/LmCM/zVpkf86bpT/PXGX/z1xmP8/c5v/PnKa/ztvmP84bZX/NGmR/zFljv8vY4r/LWGI/y1h + iP8tYYj/L2KJ/zFki/8yZYv/NGeO/zVnj/81Z4//M2SM/zFhi/8xYI3/L16O/yxbif8lV4T/H1R//yFY + g/8jXYf/KWOL/y9qj/81cJP/OnWV/0B7mv9Efpz/Rn+e/0eAnv9IgZ7/SoKf/0yEoP9NhKD/TYaf/0yF + n/9Kg6D/SYKh/0iBoP9Gf57/Q3yc/0N7nf9DeZz/QHOY/zhpj/8sWoH/H0t1/xVBbf8WQm7/Hkt2/ytc + g/83a4//QXeY/0h/nv9MhKH/TIWh/0yFoP9IgZ7/RH6c/0Z/nv9KgaD/UIak/1iLp/9cj6j/X5Cn/2KQ + o/9ikKL/YI6j/1+LpP9ah6X/VYKm/057pv9EdaL/OnCd/zdxmP8+e5r/RoSf/06LpP9Ti6f/VYun/1aL + p/9Xjaf/V46n/1aNp/9TjKf/UYmn/0yGpv9FgKT/PXie/zNul/8sZpH/LmWR/y9mk/8yZ5T/MmeU/wYM + Ev8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EB8l/x9cgP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1p+/w0jMf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xg0 + S/8vY4n/MmeM/zVqjv84bJD/OW2T/zpulf84bJb/MWaT/yxij/8oXoz/KmCN/y1mkP8wbJP/MW6S/zFv + kf8ycZH/NnSW/zZ0lv83c5X/OnaX/z54mf9BeJn/Q3iY/0N4l/9BeJf/QHiX/z93lf8+dpX/PnaV/z14 + l/88eZf/PnqY/0F6l/9Ee5j/RHuY/0Z8mP9IfZn/R3ya/0Z6mf9EeJj/P3OV/zdrkP8vZYr/LWSJ/zFp + jf8za4//NW2R/zZskv82bJL/NmuR/zNmjv8wYov/LF6I/ypbh/8rXYj/LV+K/yxfiv8tY4z/LWaM/y5p + jP8waY7/MWqO/zFpjf8yaY3/M2mN/zVrj/83bJH/OG6T/zlvk/85cJX/OnKV/zpzkv85cZD/OHCP/zlw + kP84bpH/NmuR/zJmj/8tYIn/KV2F/ypfhP8tZIj/MWuN/zZyk/85dZf/PXiY/z54lv88cZP/NmmN/y5f + hv8kVX3/JFZ//yhch/8sYY3/LmOP/zBnkP82aZD/OGmR/zhnkP80ZY//LmON/yliif8qZIr/MGuP/zdx + k/8+d5j/Q3yb/0Z+nP9Hfpv/SYCb/0yDnv9PhaD/T4ag/0+GoP9PhZ//UIah/1GHov9Sh6P/UIWi/06D + oP9KgJ//Q32d/z16nP88eZz/PHqc/zl5m/82d5j/NHOU/zRylP84cpX/PnWY/0N5m/9HfZ3/SICe/0mD + oP9JhaD/SYeh/0uIof9Lh5//TYef/1CHn/9Shp7/VIWg/1SCoP9RfqD/THqe/0R0mv86a5T/LV+M/yhc + iv8oXYv/LmWQ/zVslP88dJj/QXiZ/0V8m/9Ifpz/SX6c/0l9nf9IfJ3/R3md/0V3nP9Bc5r/PG6Y/zlr + lv83aJT/NGaR/zFkjf8wY4v/L2CG/yxcg/8mU33/H0p3/xpEc/8ZQnL/G0R1/x9Kef8jUHz/J1R//yxa + hP8tXoX/L2OH/zJpiv80bIz/NGyN/zVrjv80apD/NWqR/zRpkv8yaJH/LmSO/ypgiv8pXof/K2CJ/y9k + jf8zaJH/NmuU/zRpkv8xZY//LWCM/ylcif8lV4X/I1SE/yNSg/8oWIj/L2GN/zdpkv86bZP/O2+V/zxw + l/87bpf/OWyW/zZpkv8yZY7/LWGK/yteh/8pXIT/KVyE/ypdhf8rXob/LWCI/y5hiP8wY4r/MWSL/zFk + i/8xYoz/MF2L/y1Ziv8qWIf/JlWB/yJSff8jVYD/JVqD/yhfh/8sZ43/Mm2R/zh0lP88eJb/QXyZ/0V/ + m/9Jgp7/SYKf/0uCn/9Mg6D/TIOf/02Dn/9MhJ7/SoOg/0iBoP9HgZ//RoCe/0Z/nv9Gf57/Rn+f/0d9 + oP9FeJ7/Pm6V/zJgiP8fS3T/FD9q/xQ/av8aSHL/Jld+/zRojP9Adpf/Rn2d/0uDof9Nh6L/TIWj/0qC + ov9Gf6D/RH2f/0d/of9Ng6X/Voqo/1uOqP9ejqX/YI6i/2GOo/9ijqT/X4ql/1qFpv9Tfqb/Snej/z5x + nv82bZn/NnGZ/z18nf9HhqH/T4qm/1aLq/9Xiqr/V4uo/1eNp/9Yjqj/WI+n/1aOp/9Ri6f/TYim/0iD + pv9AfKH/N3Ob/zBrlP8rZJD/LGKQ/ytij/8tYpD/DBkk/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8EBwn/JmOF/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8cW3//BQwQ/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/JVFz/zFliv81aY3/N2uP/zhskP86bpP/Om+W/zht + lv8zaJP/LGKO/ypgjf8qYo3/LWiQ/zBskv8yb5L/M3KT/zd0lv85d5r/Onea/zp1mf87dZj/PnaY/0F3 + mP9Bdpj/QXeX/z52lf8+dZX/PXST/zx0k/88d5b/PXiW/z15l/8/eJf/QXmX/0N5l/9Fe5f/RnuY/0d8 + mv9Ge5v/RXqa/0N4mP8/c5b/N2uQ/zFmi/8tZYn/MGiM/zRsj/83bpH/O2+U/ztwlf85bJT/NmiR/zJj + jf8rXYj/J1mF/yZYhP8mWYX/KF2H/yphif8rZov/L2uO/zNukf81b5L/Nm+R/zdvkv85cJP/O3KU/z50 + lf8/dZf/QHWX/0F2mP9CeZn/Q3ya/0J7mP9BeZf/P3eW/z10lf86b5T/NmuS/zBljP8rYIb/LGOG/y5o + if8zbo//OXWV/z97mv9Dfpz/RHub/0J2mf8+cJX/NWaM/ytehv8jV4D/IVaC/yVch/8nX4r/JmGK/yxi + iv8xY4v/MmOL/y9ii/8qYYr/KGKJ/yxnjf8ybZH/OXSV/0B6mv9Gf53/SICd/0mAnP9KgZz/TIOd/06F + n/9Rh6H/Uoii/1KHov9RhqH/Uoai/1OGo/9RhaL/T4Og/0mBof9Cf5//P36e/0B+n/9Bf5//QICf/z5+ + nv89fJz/PHiZ/z11l/89dZf/QHaX/0J5mf9DfJv/RH6c/0WBnv9IhaH/SYah/0yGof9NhaD/T4Sd/1KF + n/9UhaD/VIKi/1CAof9KfJ//QnWb/zdslP8vZI//KV+M/ylgjf8tZJD/NGuU/zpylv8/d5r/Q3qa/0d9 + nP9He5v/R3uc/0Z5nP9GeJz/Q3Wb/z9xm/86a5n/N2eW/zRkkf8wY47/LmGL/y5giP8uX4X/LFyD/yhW + fv8iTnr/G0Vz/xdAb/8WQG//HEd0/yFOeP8nV3//LV6E/zBjh/8yaIn/NGuM/zVtjf81bo3/NWyO/zVs + jv81apH/N2uU/zVqk/8xZpD/K2GL/yddh/8qX4j/LWOM/zFmj/80aZL/NWmT/zJmkP8vY47/Kl6K/yVY + hv8hUoL/IFCA/yNShf8pWov/L2GO/zNmjv83apD/NmmQ/zVokP81Z5H/M2aQ/y9hi/8sXoj/J1qD/yZZ + gf8mWYH/JlmC/ydag/8pXIX/K16G/ytehv8tYIf/LV+H/y9cif8vWIn/K1SG/yVQgP8hTnv/IVB7/yRW + f/8oXIP/K2GI/zBojP81cJH/OXaU/z56lv9CfZj/R4Cb/0mBnf9Lgp7/TIGf/0yBn/9MgZ//S4Gd/0uC + n/9Jgp//R4Gg/0R/nv9EgJ7/RoGf/0iBoP9IgaH/SX6h/0l7oP9Fdp3/OmiQ/ytWgP8aRW//EDxn/xdG + b/8kVX3/M2eL/z10lf9DfJv/SYGh/02Fov9Ng6L/SoCi/0V9of9De6H/RHyi/0qCpP9Qh6b/V4um/1uM + ov9cjKH/X4yi/2CLpP9eiab/WYSn/1F9pv9Ec5//Om2Z/zRul/83dpv/PX6f/0eGov9Qiaf/V4ur/1iL + q/9Xi6n/WI6n/1mQqf9akan/V5Cn/1ONpv9Piqb/Soal/0WAov8+eZ//N3Ga/zBplP8oX4z/KV6N/yle + jf8SJjf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8saIn/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll+/xhKZ/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYO + Fv8oWoD/MWSK/zhrkP87bZL/OmyS/zltkv85bpX/NmuV/zJnkv8uZJD/LGOP/yxkj/8uaY//MG2Q/zNw + kv82c5X/OXaZ/zt3m/87dpr/O3WZ/z11mP8/dZf/QXaX/0F2mP8/dZf/PXSV/zpxkv86cZH/O3SU/zt3 + l/87eJj/PXiY/z94mP9BeZf/RHqY/0R5mf9Eepn/Q3ma/0R5nP9EeZz/Q3iZ/z1ylv83a5H/MWaM/y9l + i/8xaI3/Nm2Q/zlvkv87cJT/PXCW/z1vl/85apP/MmOO/ytdiP8mWIT/IlaC/yNXg/8lXIX/KWKJ/y5o + jf8zbpH/OHOV/zp0lv87dJX/PHWV/z52lv9AeJf/QnmY/0N6mv9Fe5v/R3yc/0h/nv9IgZ7/SIKe/0mB + nv9FfZv/QXiZ/z1zl/84bZL/MmeN/y1kif8tZoj/MGyM/zVykf88eJf/Qn2b/0eAn/9Jf5//R3qd/0F0 + mP85bJP/MmaN/ythi/8mXYj/IVqE/yRfh/8nYIj/KV+H/ytehv8rX4f/KGCH/yZgh/8pZIv/LWmO/zNu + kv86dZf/Qnyb/0eAnf9JgZ7/S4Ke/0uCnP9Mgpz/T4Wf/1GHof9TiaP/U4ij/1SIo/9Uh6P/VIek/1OG + o/9NhKL/R4Ki/0OCov9DgqL/RYKi/0aDov9Gg6H/RYOh/0SBoP9Ff5//Q3uc/0B3mP9Adpf/PnaW/z54 + mP8+epr/Q3+d/0aCoP9JhKP/TYaj/1CGov9QhaD/UoWf/1KEoP9Qgp//TICf/0h7nv8+c5n/Nm2U/zFo + kv8tZI//K2KO/y5lj/8yapP/OXGX/z52mv9DeZv/RHma/0R5m/9FeJv/RHib/0N1mv9Acpv/O22a/zhq + l/80ZpT/MGGO/y9gjP8tX4n/LF+H/y1ghv8tXoT/K1qC/yhVf/8iTnr/G0V0/xhEcv8YRXH/IE94/yhZ + f/8uYoX/NGmK/zVrjP82bY3/N22O/zZtjv81bY3/NGyO/zZskf84bZT/OW2X/zNnkv8tYo3/J12H/yhd + h/8sYov/MGaP/zRokv81aZP/NGiS/zFlkP8tYYz/J1uH/x9SgP8eTX//IE6B/yRUhv8oWoj/K16I/y5h + iP8vYoj/L2GJ/y5gif8uYIr/LV+J/ypchf8oWoP/JViA/yVYgf8mWYL/KFuE/yhbhP8oW4T/KFuD/yhb + gv8pV4P/LFSE/yxRhP8mTH7/IEl5/x1Idv8gTXn/JFR9/ylbg/8uYof/M2mM/zhxkf88d5P/QHyW/0R+ + mP9Hf5n/SoCc/0x/n/9Mf5//TH+f/0t/nv9KgJ//SIGf/0eBn/9Ff53/Q36c/0N/nf9GgqD/SIOh/0qC + of9LgKL/S32g/0h4nf9DcZj/NmOM/yhVf/8aR3P/E0Nv/yBSfP8tY4n/N2+S/0B4mP9Hfp3/TICf/0x/ + oP9Ge6D/QXef/z51n/8/eKH/RX2j/0yDpf9Sh6T/V4mi/1mJof9biKH/W4ek/1qGp/9Yg6r/SXih/zxu + mf8zapT/N3GY/zp5nP8/f57/SYWh/1GJpP9Wi6f/Voqn/1iMp/9Zjqj/W5Go/1uTqP9Zk6f/VZGn/1GN + pv9NiaT/SIOk/0R/ov8+eJ//Nm6Y/y5kkf8oXov/Kl+O/xcySf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yZWcv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/DSc4/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ECpB/yRUfP8uXoX/N2iO/zxtk/86a5L/OGqR/zZp + kf8yZpD/L2SP/y5lj/8tZpD/LmiQ/zBqkf8ybpL/NHCT/zdzl/85dZn/O3WZ/zpzl/88c5f/PXSX/z90 + lv9AdZf/QHWY/z50l/88cpT/OnCS/zhwkv86c5X/O3eY/z13mf8/eJr/QHma/0J6mf9Depn/Q3qa/0F3 + mv9Ad5r/QXeb/0F3m/9AdZr/O3CW/zZqkf8xZY7/LmON/y9ljf81a5D/OW2S/ztuk/88bpT/PG2V/zpr + lf8yZI7/Kl2I/yRXg/8gVID/IleC/yZdh/8rZIv/MGuQ/zhylf86dZf/O3aX/z53l/9AeZj/QXuZ/0R9 + mv9Ffpv/SH6d/0l/nf9LgZ//TIKh/0yDof9Lg6D/SoKf/0iAnf9Ee5r/P3WY/zpvlP81apD/MGmM/y9q + jP8zb47/OXWU/0B8mv9Ef53/SICf/0t/oP9JfZ//Q3ab/zxxl/83bZX/MmqT/y5nkP8rZo3/KGOJ/ypj + iv8tYon/K2KH/yVfgv8iX4L/JmGG/ypli/8uao7/NHCS/zp2l/9BfJv/RoGd/0qDn/9Lg5//TIOd/02E + nv9PhZ//UYeh/1OJo/9ViaT/Vomk/1WIpP9ViKX/UYak/0mDov9FgqL/RoOk/0mGpv9LhqX/TIel/0yG + o/9MhqP/TIaj/0qDov9JgaH/Rn2d/0B4mf88dpf/OXWV/zx4mP9AfJz/RH+f/0mDov9OhKX/T4Wj/0+F + n/9PhJ7/ToOe/0uAnf9HfJz/QXiZ/ztzl/82bpX/M2uU/zBokf8uZY7/LmWP/zNqk/85cZj/P3ab/z92 + mv8/dZn/P3Wa/0B1mv9AdZn/PnKZ/zpumP83a5j/NGmW/zJlkv8vYo7/LF+J/ypdh/8tYIj/L2OJ/zFk + if8xYoj/Ll2F/ylYgv8lUX//H0x6/x5MeP8hUXv/KFqA/y9kh/82bIz/OnCQ/zpwkP84bo//N2yP/zVr + j/81bI//OG6S/zpvlv84bJb/NGmT/y9jj/8qX4r/KF6I/ypgiv8wZY7/M2iR/zVpk/82aZT/M2eR/y9k + jv8rX4r/I1WD/x5Nfv8dS37/IFCB/yNVgv8lWIL/KFyD/ypeg/8qXIP/KVqD/ylbhf8qW4X/KluE/yla + gv8oWoL/KFqD/ylchP8rXob/Kl2G/ylchf8lWIH/KFeB/ypTgP8rTYD/JEh7/x9Edf8aQnH/G0Rz/x5J + dv8jUXv/KVqC/y9ih/82ao3/O3GS/z11lP9AeJX/Q3yW/0Z7mP9JfJv/S3ye/05+of9OfqH/S32g/0l+ + oP9HfqD/Q32d/0F8mv9Ae5r/Q4Cd/0aDoP9IhKH/S4Oh/0yCof9NgaL/S3yg/0Z1m/8/bJX/NGOM/yhX + gv8gUnz/HlJ9/ydeiP8ya5H/O3OW/0V5lv9Je5n/Rnmb/0B0nP86b5n/N26Z/zhwnP89dp3/RX2f/0yC + oP9Qg5//U4Sf/1SDoP9WhKP/VYKn/0x6ov8/cZr/M2eS/zJqk/80cZb/Onmb/0F+nv9Ig6D/UIii/1OK + ov9Wi6T/WIyl/1qOp/9bkaf/XJSo/1yVp/9Ykqf/VI+m/1CLpf9Lh6X/R4Kj/0F7oP86cZr/MmiT/y1j + j/8rYI7/HT5a/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/KlRs/xxafv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xtafv8GERj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8cQ2j/I1J6/ytagv8yYon/NmaN/zdoj/81Z4//MmSN/y9ijP8tY43/LmSO/y9mj/8wapH/Mm2T/zRv + k/81cJX/N3GX/zlzmP85cZb/OnGW/zxylv8+cpb/QHSY/0B1mP9AdZn/PHKV/zpwk/85cJL/OHGU/zp0 + l/87dZj/PXaZ/0B3mv9CeZz/Q3qb/0J5m/8/d5v/PnWb/z51mv8+dZn/PXSZ/zxxl/87cJb/NmqS/zFl + j/8sYYz/LWOO/zJnkP82a5H/N2uQ/zlqkP84aZH/NWeQ/zJkjv8rX4n/I1iD/yNYgv8jWYL/J1+G/y1m + jP80b5P/OXOX/zt1mP88d5f/PnmY/0B7mf9EfZr/R4Cb/0iBm/9Kgp7/TYSf/06Fof9PhqL/TYSh/0yD + of9LgqD/SH+d/0Z7m/9Bdpr/O2+X/zZuk/8zbpD/MW+P/zd0k/89eZj/Q36d/0iAn/9KgaD/Sn+g/0h8 + n/9DeZ3/PnWb/zlymf83cZj/NXKX/zRwlf8zbpP/M2yR/zNqj/8waoz/KmeI/yVjhP8nY4b/K2aL/y9r + j/80cZP/OneX/0B7mv9GgZ3/S4Wf/02GoP9OhZ//T4Wf/1CHof9SiKL/VImk/1WKpf9WiaX/VYil/1OH + pP9Mg6L/RoGh/0WBof9IhKP/S4am/0+Jp/9Riqf/UYml/1GJo/9Sh6L/UIaj/06Fo/9LgqH/RX6f/z56 + mv87d5f/O3eY/z56m/9DfZ//SYCi/02CpP9LgqD/SoKd/0qBnP9If5v/RX2a/0B5l/87dJb/OnOW/zly + l/83cJb/M2yS/zBnjv8uZYv/M2qQ/zhvlv88c5n/PHOY/zpyl/85cpj/OnGY/zpwl/84b5b/NmyU/zNq + lP8zapX/MmiS/zBkjv8tYYr/LWGJ/zBkiv8zZ4z/NGiN/zZpjf80Zoz/MWGK/y1bhv8oVoP/JFSA/yVV + f/8pXIP/MGSJ/zdsjv88b5H/PXGT/ztvk/84bJL/NmuQ/zZrkf85bpT/Om+X/zhslf81aZP/L2OP/ype + iv8oXIj/Kl+K/y9ljv8zaJH/NWmT/zVpk/81aZT/MmaR/y1gjP8nVob/IEx//x5Lff8gTn7/IlKA/yVY + gv8nW4D/J1yA/yZafv8mWH//JVaA/ydYgf8oWYL/KluE/ytdhf8sXob/LmCI/zBjiv8vYor/LWCH/ytc + hP8tWIL/L1SC/ydJef8eQXL/Fzxs/xc+bf8YQG//G0Vy/yNQev8pWoD/MGKH/zZrjf86b5H/PXKT/z50 + k/9BdpT/RHiW/0Z3mP9KeZz/TXqh/018o/9Ie6H/Rnuf/0N6nf8/eZr/PnmY/z97mv9DgJ7/R4Og/0qE + ov9MhKL/TYOi/06Bo/9Nf6L/SXmf/0Jzmf85apL/MGOL/ydchf8lXIb/J1+L/y1ok/82bZT/PnKV/0R1 + lf9Acpf/OW2X/zJolP8rY5D/MGiU/zZwl/8+d5n/RHqb/0h9mv9LfZz/TH2f/059o/9LeqL/QHGa/zVp + lP8vZ5H/LmmP/zBvkv84dZf/P3uc/0eCn/9Oh6H/Uomj/1SKo/9XjKX/Wo+m/1yRpv9elKb/XJSn/1qT + p/9Wkaf/UY2m/02Jpv9IhKT/Q3yg/ztzmv81apX/L2SQ/yxijv8iTGv/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8kTGL/G1t+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/GE9v/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAoP/yBNef8iT3r/J1V//yxahP8uXoj/MWGL/zJi + i/8vYIr/LmGL/y5jjf8uZI7/MGiQ/zJskv80b5T/NXCW/zZwl/83cJj/OXGW/zpxlv87cZb/PXOX/z50 + l/9Adpn/QXaa/z50mP87cJX/OW6S/zdvlP83cZX/OHKX/zpylv88c5f/PXSY/0B2mv9Bd5z/Pneb/zt1 + mv87dJr/O3OZ/zpymP85cJf/OG6W/zVrk/8yZ5H/LmKO/ythjP8sYo3/L2WQ/zBmjf8xZo3/M2eM/zRm + jP8zZY7/MGSN/yxgif8pX4j/KV+F/ylhhv8qYof/L2iN/zZvlP84cpb/OnWW/zx3l/8+eZj/QnuZ/0V+ + mv9IgZv/SoOc/0yEnf9OhZ//UYii/1GIo/9Ph6L/TYWh/0uCoP9KgZ//R32e/0N4nf87cpj/NnCU/zFw + kP82c5L/O3eW/0F8m/9Ff53/SoGg/0yBof9Kf6H/R32f/0J6nv89eJz/O3eb/zt3m/87eJv/PXmc/z55 + nP8+dpn/O3WW/zl1lf80cZH/L2uM/ytnif8rZYr/MWuP/zZxlP86dpf/QHua/0aBnf9LhJ//T4ii/0+H + of9RiaP/UYij/1OJpP9ViqX/VYml/1WJpf9UiKT/ToSj/0mCof9FgKD/RoOh/0iEov9Nh6T/UYqm/1SM + p/9VjKf/VYuk/1WJpP9ViaT/VIik/0+Go/9Kg6L/RICg/0B8nP89eZr/Pnia/0F5nP9HfKD/R32f/0Z8 + nP9FfZr/RH6a/0N8mv9Aepn/PHaW/zt1lf87dZf/PHaZ/zt1mP84cJX/NGuQ/zJpjv8xaI3/NWyR/zdu + k/83bpT/N26V/zZulv82b5b/OHCV/zhvlP81bZP/NW2U/zVtlP80a5P/MmeP/zBljP8wZIr/M2iM/zdr + j/85bJH/O26S/zlskf82aZD/M2SN/y1eif8oWYX/J1mD/ylchP8vYoj/NmmN/zxtkf8+b5T/PW+U/ztu + lP83a5H/NmmS/zZqkv82aZP/NmmU/zNmkv8tYI3/KFyI/yRZhP8mW4b/K2CK/y5ljf8xZ5D/M2iR/zNn + kv8zZpL/MGCP/ypWif8jToL/H0t+/x9Off8jU4D/JlmC/yldg/8mW3//JVp8/yRYfP8kV33/JleB/yhZ + gv8qW4T/LV6G/zBiiP8yY4r/M2WM/zRnjf80Zoz/M2CJ/zRbh/8wVID/JEdz/xk9av8WO2n/FT1q/xdA + bv8cRXL/Ik94/ylXf/8wYIb/NmiN/zlukP87b5H/PHGS/z5zk/9CdZX/RHSY/0h1nP9Md6H/SHig/0R4 + n/9Adpz/PXWZ/zx2l/88d5f/QH2b/0SBnv9Hg6D/SoWi/02Fo/9OhaT/T4Oj/01/of9JfJ//Q3ab/zlu + lP8wZo3/LGOL/yljjP8rZY7/LWeR/y9mk/83a5P/OWyS/zlrk/81aJP/LWOQ/ylhjv8qY47/MWuR/zdx + lP89dZX/P3aW/0N2mP9Fdpv/RXaf/z9wm/82apX/L2eR/y1okP8sapD/MG2R/zZylf89eZn/RYCe/06I + pP9SiqX/VIul/1eMpf9ZjqX/XJGm/16Tpv9dlKf/WpOo/1aQpv9RjKb/TYil/0iDpP9EfaD/PHWb/zVs + lf8wZZD/K2ON/x9Mav8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xw4SP8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8RM0j/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8RJTn/Ik18/yBMev8hT3z/JFJ//yhWg/8sXIj/Ll6J/y9fiv8xY47/MmaQ/zFokf8ya5L/M22T/zNu + lP80b5b/NnGZ/zdwmP85cZf/O3KY/zxzmP8+dJf/P3WY/0F3mv8/d5n/PHOX/zlvlP82bZL/NW2T/zVu + lf81bZT/N26U/zhulP85bpT/O3GW/ztzmP86c5j/OXOY/zhymP84cZf/N2+V/zVslP80apP/MWaQ/yxh + jP8qX4r/KF6J/yheif8rYYv/K2OK/ytkif8tZIn/MGWL/zJljf8yZo//MWaO/zBmjf8zaYz/MmmM/zBo + jP8yao//M2uQ/zZvlP84cpX/O3WX/z54l/9CfJn/Rn+b/0mBnP9Lg5z/TISd/06Gn/9QiKD/Uomi/1GJ + o/9Qh6H/ToWh/02Eof9MgqH/RXyd/zx2mP8zcZL/NHKS/zh1lf89eZn/Qnyb/0iBn/9MgqL/TIGj/0l/ + ov9FfaD/QHud/z17nf89e5z/Pnyd/z98nf9Dfp//RoCh/0V+nv9CfZz/QHya/z95mf86c5X/NW2R/zJp + j/8xZ4//NW2S/zlzlf8+epn/RH+c/0qEoP9Oh6L/UYql/1KLpf9TiaT/VIql/1SKpf9ViaX/VYik/1CG + o/9LhKL/RoGg/0eBn/9Ig6D/S4ai/0+IpP9Ti6b/Vo2n/1iOpv9Zjqb/WYyl/1mLpf9XiqX/VYim/1CH + pP9Lg6P/RYGh/0F8nf8/d5n/QXea/0F3m/9BeJr/QXeY/0B4l/9Aepj/P3qZ/z55mP88eJf/PXiY/0B7 + m/9CfJ3/Qnqb/z93mf86cpT/Nm2R/zRrjv8yaY7/MmmP/zNqkv80bJT/Nm6V/zlwlf87c5X/O3OV/zly + lP84cZT/OHGW/zlwlv83bZP/NGqO/zRpjf81ao3/OG2Q/z1xk/89cJP/PG+T/ztulP84a5P/MmWO/yxf + if8oWoX/KFqD/y5fh/81ZYr/OGiO/zprkf87bJT/OGqS/zZokf80Z5D/MWSO/zFkj/8xY4//L2GO/ypc + iv8lV4X/IVSB/yBVgP8kWYP/KF6I/ytii/8tZIz/LmON/zBgj/8wXY//K1eK/yRPgv8eS3z/Hk18/yJT + f/8oWYP/J1uC/ydbgf8lWX3/I1h6/yRXfP8mV3//KVqC/ytchf8uX4f/MmOJ/zRliv80Zov/NWeM/zZm + jP86ZY7/N12H/ytQef8gRW7/GkBp/xlAa/8YQWz/GkRv/x9JdP8jTnj/KFV+/y5dhf80ZYv/OGqP/zls + kP87b5H/PnKT/0B0lP9BdJb/RXOb/0d0nf9EdZ7/QHWd/zxxmf85cZb/OXOW/z14mP9BfZz/RIGe/0iE + of9LhaP/Toak/1CGpf9Og6P/TICh/0d7nf9Adpn/OXCV/zJqkf8uaZD/LGiP/y1nkP8vZ5H/MWaS/y1j + kP8uZY//MWeQ/zBlkP8tZJD/K2SP/y1nkP8wa5H/NG6R/zlyk/87cpT/PHGV/z5wmP85bZf/NGqV/y9n + k/8uaZT/LWuU/y5ulP80cZb/NnKV/zt1lv9Ce5n/SYKg/1GJpv9Ui6f/V4ym/1mOpf9ckab/XZKn/1yS + qP9Zkaj/VY2n/1CKpf9Mh6X/SYKj/0N9oP88dZr/NW2V/zFokf8rZo3/J2SL/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/HDhI/x9dgP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p+/wkX + If8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yNHbv8mUYL/IEt7/x1Jef8eS3r/I1KA/ylY + hv8sXYr/MWKO/zRnkf82apT/N26V/zVvlf8zbZT/LmqR/zBrk/8ybZT/NW6V/zlxmP87c5n/PHSZ/z51 + mP8/dpn/P3ia/z54mf87dZb/N3CU/zNrkv8xapH/MmqR/zJokf8yaJD/M2iQ/zVqkv81bZP/NW6T/zVv + lf81b5X/NW+V/zVulf80bJP/MmmR/zBlj/8tYoz/KV2I/yVahf8kWoX/JVyF/yhgiP8pYon/KmSI/yxm + h/8waIv/NGyP/zduk/84b5P/OXCS/zpxkf85cJH/N2+R/zVukP8zbI//M2yQ/zZwk/86dJT/PXeW/0J7 + mf9Gfpv/SYGc/0uDnP9MhJ3/T4ee/1GJoP9SiqH/Uoqi/1KJov9PhaH/ToSg/06EoP9IfZv/PneW/zdz + kv82dJT/OnaW/z96mf9Ffpz/SYCf/0yAov9LgKP/SH+i/0N+n/8/fJ3/Pnyd/z99nv9Bf5//Q4Cf/0eC + of9JgqH/SIKg/0aCnv9GgZ7/RX6d/0J5m/89cpf/OG2U/zVrkv8zaZH/Nm+U/zt1l/9Ae5r/RoCc/0uF + of9QiaT/Uoql/1KKpv9UiqX/VIml/1SIpf9Rh6T/TYWj/0qDov9Jg6D/SYOf/0qEoP9PiaL/U4uk/1aM + pf9Yjqb/WY6m/1qOpv9bjab/W4yn/1qLp/9Ziqf/Voim/1KGpf9MgqL/Rn6e/0J5m/9AdZn/PnWZ/zx1 + mP87dJb/O3SV/zx3l/8/epn/PnqZ/z97mv9CfZz/RX+e/0iBoP9KgqL/Rn6f/0F5mf87cpT/Nm2R/zNq + j/8yaY//MmmR/zVslP83b5X/PXSU/z93lf9Ad5X/PneW/zx1l/88dZn/PHWZ/ztylv84b5P/NmyP/zds + j/85bpH/PHCS/z1ylP8+cpT/PHGU/zlulP82apP/MWSP/yteif8qXIX/K12D/zFih/81ZYr/NWWM/zVm + jv8zZo//MGSN/y9jjf8sYIv/K16K/yxei/8sXIv/J1iI/yFQgf8dTn7/HE59/x1Rff8gVoD/JVuF/yhe + iP8oXIj/KVmJ/yxYi/8oU4b/Ik6A/xxKev8dTHr/IE98/yRWgP8nWoP/J1qC/yRYf/8jV3z/JFZ8/ydY + gP8qWoP/LFyF/y5fhv8wYYf/MWOH/zNkh/8yYof/MmCI/zZfiv8vV3//JUty/x1Daf8fRWz/IUhw/yBJ + cv8iTHX/IU11/yBMdf8jUXr/KViB/zBfiP80ZY3/N2mQ/zptkP88cJL/PXGT/z1ylP8/cpf/QXOZ/0Fz + m/89cZn/OW+W/zZvk/87dZf/P3qb/0N+nf9GgZ//SYOh/0uEov9OhaT/T4Wl/0+EpP9MgaL/RHud/z11 + mf82cJT/NHCW/zJvlf8xbpT/M2uU/zJpk/8xZpH/LWSP/ytjjf8uZZD/L2eR/zBpk/8zbZX/NXCW/zZx + lf85c5T/OXKU/ztylf86cJX/N2uU/zFmkv8sY5H/L2iV/zFsmP8xb5j/NXKa/zh0mv85dJj/OnSV/z53 + lf9Ee5v/SoKg/1KIpf9Viqb/WI2l/1mOpv9aj6n/WY+q/1ePqP9UjKf/T4im/0uEpf9IgaP/QXuf/zp0 + mf81bpb/Mm2U/y5rkf8saY//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8UJS7/H12A/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aVHb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8DBgj/K1mJ/yVRg/8fSXz/GkV4/xtHef8gTn7/JVSE/y1fi/80Z5L/N2uU/zlvlv86cZf/OXKY/zRu + lv8vaZL/KmWM/ytljP8xa5H/N2+V/ztzmf89dJn/PXWZ/z12mf89d5n/PHiY/zl2lv81cpP/MWyS/y9o + j/8vZ4//L2SO/y9jjv8vZI3/MWeO/zFqkP8ybJH/MW2S/zNtkv80bZL/NGyT/zNqkf8xZ4//L2SN/ytf + iv8nXIf/IlmD/yBXgf8kW4T/J2CH/ytliv8uaIz/MGuN/zNvjv85dZT/PXaW/z93l/9Ad5b/P3eU/z51 + lP88dJT/OXKT/zdwkv81bpH/NG2R/zhxk/89dpb/QnqZ/0Z9m/9IgJz/SoGc/0yEnf9Ph5//Uoqg/1KK + oP9TiaD/Uoih/0+Fof9OgqD/S4Ce/0Z8mv9AdpX/OnKT/zlzlP89d5f/Qnya/0d/nf9KgKD/S3+h/0h+ + of9Dfp//QH2e/z9+nf8/fp7/QoCf/0SBn/9IgqH/S4Oh/02Fov9NhaH/TYWh/02Eov9MgaH/R3ye/0N2 + mv89cJf/N2yT/zVrk/80bZP/N3KX/zx3mf9CfJz/R4Ce/0yEof9Ph6T/UYil/1GHpP9Sh6T/UYaj/02F + o/9Jg6L/SYOi/0qEof9LhaH/T4ij/1OKo/9XjaX/WY6m/1qOpv9ajqb/W42m/1uNpv9bjaf/XIyp/1qK + qP9ZiKf/Voam/1GDpP9KfqD/RHmc/z51mv87cpj/OHCW/zVvk/84cpT/PHaY/z96m/9BfJz/Q36d/0aB + n/9Jg6H/TYWj/06Gpf9OhaP/SH+e/0J4mv88c5X/N26S/zZtkv82bZT/N26V/zpylv8/d5b/QnqW/0R9 + l/9Cepf/P3mZ/0B5mv8/eJv/PXaZ/ztzlv84b5L/OG2Q/zlukf87cJL/PHKT/z1zlP89cpT/Om+U/zht + lP82aZT/MWSP/y5giP8tX4T/LV6D/y5fhv8wYYn/L2KL/y1giv8sYYr/KWCJ/yheh/8qX4n/K1+L/ytd + i/8pWor/I1SF/xtKfP8YSXn/G0x7/x5Sfv8hV4H/JFiD/yRVhP8jUYP/Ik+B/yFNgP8dSXv/Gkd4/xlH + d/8dTHr/I1SA/yZZhP8nWoT/JViB/yJVff8jVH3/J1d//ylXgv8pWIL/K1qD/yxcg/8tXoL/LFyC/ytZ + gf8rVoL/KVR+/yVNdf8dRGr/IUhu/yRNcv8nUHb/LFZ8/ytWfP8lUXf/H0tz/x1Jc/8kUXv/K1mE/y9f + iP8yY4v/NmiN/zhrkP85bZL/Om+S/ztxk/88cZT/O3CV/zlulP82bZP/OHCV/zt1mP9BfJz/RYCe/0iC + oP9JgqD/S4Kh/0yDov9OhKT/TYOl/0l/of9Cep3/OnSY/zd0mP82dJn/NnOZ/zpzmv87cZr/OW6X/zJo + kv8uZo//LWaP/y9okf80bpX/N3GY/zl0m/89eJz/QHuc/0F6mv9BeZr/QHea/zxzl/81bJL/LmaQ/ytk + kP8vaZX/M2+b/zdznf86dp7/PHee/zpzmv85cpb/O3OU/z51l/9GfJ3/TYOi/1OHpP9Sh6T/U4il/1WK + p/9WjKn/Vo2q/1GJqP9Mhab/SYKl/0V+ov8+eJ7/OnSb/zhxmP81cZf/NHCV/zNvlP8GDRL/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xAeJf8hX4L/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xI5 + UP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xAjNP8pWIb/I1GB/x1Hev8ZQ3b/GUV3/x1K + fP8lVIT/LV+L/zVpkv86bpb/O3GX/ztzmf86cpr/NW+Y/y9pkv8qY4v/KWGI/y1li/81bJL/OXCW/zx0 + mf87dJj/O3WY/zx2mf86d5n/OHWW/zRylP8wbZH/L2mP/y5ljv8uY47/LmOO/y9ljf8vaI3/MWyP/zJu + kf8ybpH/Mm2R/zRukv81bZP/NGuS/zNpkf8wZY//LWGM/yleiP8kWoT/IlmC/yVchP8oYYf/L2mN/zRv + kf83cpL/O3eW/z96mP9De5n/Rnya/0V8mf9Cepb/QXiV/0B4lv8+d5b/O3SU/zdwkv82b5H/OHCT/zxz + lv9AeJn/RXyb/0d+nP9KgJ3/TYSe/1CHn/9SiaD/U4mf/1OJoP9Th6L/UYSi/02BoP9Kf57/RXqb/z90 + lf86b5L/OnCT/z51lv9Ee5v/Sn+f/0x/of9JfqD/RHye/z58nP8+fpz/P3+d/0KBn/9Fg6H/SYSh/0yF + ov9Qh6P/Uoik/1KJpP9SiKT/Uoak/1CEov9Nf6D/R3mc/0BzmP86bZT/NmyT/zRtlP81cJb/OHWZ/z55 + nP9DfJz/R3+d/0uCoP9NhKL/T4Si/06Eov9Lg6H/SYKh/0iCof9Jg6D/TIWi/0+Io/9TiqT/V42m/1mO + pf9ckKb/XI+m/1yOpf9bjaX/XI2m/1yNqP9cjKn/W4up/1mIp/9Xh6f/VISm/0+Aov9EeZ3/PXSa/zdw + l/8zbJP/M22T/zZylv88eJv/QHyd/0N/n/9GgZ//SYOg/0yFov9Ph6P/T4aj/06Fov9OhKP/SH6e/0J4 + mv88c5b/OXCV/zdvlf84cZb/PHSX/0F5mP9Ffpr/Rn+a/0V+l/9Ce5f/QXqa/0B6m/9AeZz/PXWY/zlw + k/83bpH/N26Q/zlwkv87cZP/PHOU/zxzlP88cZT/Om+V/zhslP81Z5H/MmSK/y1fhv8rXIT/KlyE/yxf + iP8rX4j/KmCI/ylhiP8oYYj/KGCJ/ytji/8sY4z/LmKO/yxfjf8oWYr/IVCD/xpKfP8aSXv/H1CA/yFV + gv8iVYL/IlKB/yJPgf8gTX7/HEl5/x1Kev8aR3f/F0V1/xtJef8hUYD/JVeE/yhah/8mWIP/IlR+/yFS + ff8hUXz/JFJ9/yZTf/8lVH7/JVR8/yZVe/8kUnv/I057/yJNef8gS3X/HUdv/yFKcP8mT3T/K1R4/zFb + f/80YIP/MmCD/ypWe/8hTnX/Hktz/x5Md/8iUXz/J1eB/ytbhP8uX4j/M2SM/zdpkP83apD/OGyQ/zhu + kP82bJD/NWuQ/zVskv83cJT/OnWX/z96m/9Ef57/R4Gf/0iAn/9JgJ//SoCh/0uBo/9LgaP/Rn2f/z95 + m/86d5n/OHea/zh4nP8+ep7/Qnme/0N3nv89c5v/N26X/zFpkv8waZL/MWuT/zZwlv89eJz/QHue/0N/ + n/9IgqH/SoKj/0qBof9Hfp//QXib/ztyl/80a5P/MGmT/y9rlP80b5j/O3ae/z55of8/eqH/PHWd/zhw + mP84b5T/O3KW/0N5m/9LgKH/ToOj/06Do/9NgqP/T4Sk/1GIpv9Riaj/SoSl/0V/o/9DfaL/P3mg/z12 + nv87dZv/OnSb/zp1m/86dpr/OnWY/w4dJv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DBYb/yRh + hf8aWX7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/DiQx/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/HkBd/yhXg/8iUX3/HEd3/xdCdP8XQ3T/Gkl6/yVVg/8uYYv/NGiQ/zhskv87cJb/O3GZ/zpx + m/82bpn/MGiS/ytii/8oX4f/K2KJ/y9njv81bpP/OHKW/zlzmP85dJj/OnaZ/zh1mP83dJf/NHKV/zBv + kf8va5D/MGiQ/zBmkf8wZ5D/MGqP/zBtj/8ycJD/NHCS/zVxk/83cZT/OHGU/zlylv85cJX/OG6V/zZr + k/8yZ5D/LWKM/ylfiP8mXYb/Jl+G/ytli/8ybI//NnGT/zx3l/9Aepj/RHya/0h+nf9KgJ7/SX+c/0h+ + mv9FfJj/RHyY/0J7mP89dpX/OXKS/zhwk/85cZT/PHOW/z91l/9CeJn/Rnyc/0l/nv9Mgp//T4Wg/1KG + oP9Th6D/Uoeh/1SHpP9RhaT/ToGi/0l+n/9Cd5r/O3CV/zdrkf85bpP/PXOX/0J4m/9IfJ//TH6i/0d8 + oP9Aepv/PXyb/z19nP9BgJ//RoSg/0qGov9Nh6P/UYmk/1WKpv9Xi6b/V4ul/1eKpf9Wh6P/VIWi/1CB + oP9MfJ7/RXaa/z1xlv83bpT/NW6U/zVxl/83dJn/OXab/z15nP9CfJ3/SH+f/0uBoP9MgqH/SoGg/0iB + oP9GgJ//SYKh/0uDov9NhqH/UYmj/1aMpf9Zj6b/XJCn/12Qpv9dj6b/XI2l/1yNp/9djaf/XY2o/1uM + qf9ai6n/WYio/1eGp/9UhKb/TH6i/0J5nf87cpn/NW6V/zFrkv8ybJP/OXSZ/z55nP9BfJ7/RH+f/0iC + oP9LhaD/T4ah/0+Gof9PhaD/ToSg/0+Eo/9MgqL/R32f/0B3m/88c5j/N3CW/zdwlv87dZj/QXqb/0V+ + nv9Hf5v/Rn6X/0V8lv9FfJj/RH2b/0J7nP8/eJr/OnOW/zZukf82bpD/Nm+Q/zlxk/87c5T/PHOU/z1z + lf88cZX/O2+V/zhqkv8yZI3/LF2G/yhahP8oW4X/Kl6I/yxiiv8sY4v/KmWL/ypliv8taI3/L2iO/y9o + j/8xaJD/MWWQ/y1fjv8nWIj/IVKE/x9Ogf8iUYP/JVaG/yVXhf8kVYP/I1OB/yJRf/8hUH7/IE99/x1M + ev8cSnn/HEp6/x9Ofv8kVIP/JleG/ydWhf8kVIH/H098/x1Mef8eS3f/H0x3/x9Ldv8dS3T/G0lx/xtG + cf8bRXP/G0Zy/xtGcf8gS3P/KFN6/y5Zfv8zX4L/OWaH/ztpif82ZIX/Ll1//ydVef8jUHj/H012/x9N + eP8fT3n/I1R//yhZg/8rXIj/L2CK/zJkjP8zZ4z/M2eM/zRojv81aY//N22T/zlwlf86dJf/PniZ/0F7 + m/9FfZz/Rn6c/0d9nf9JfqD/SX+i/0Z9oP9Ce53/PXia/zp3mf84d5r/Pnud/0V+of9Jf6L/SH2i/0J5 + n/89dJv/N26W/zNslP8ybJP/NnGX/zx3m/9DfZ//SYOh/0yFo/9Ph6X/Uoen/0+DpP9JfqD/Q3qc/z13 + mv84cpf/NW+V/zhwlv88dJr/P3mh/0F7o/9AeaL/O3Oc/zZulv85cJb/QHWa/0d8n/9Kf6L/S4Ci/0p/ + of9JgKD/S4Kh/0iBov9DfaD/PXme/zx4nv89d5//PHad/z54nv9AeZ//QXuf/0J9oP9Be57/EB4n/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/JGCF/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x1b + f/8FDBD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8qXIb/KFmC/yNSe/8dSnb/F0Ry/xVB + cv8aSXj/I1OA/yxfh/8yZ43/NmuQ/zluk/86cJn/OnCb/zhtmP8yaJP/K2GL/yhdhv8pXof/LWOL/zJs + kv81b5X/NnGW/zZ0lv82dJf/NnWY/zV1mP80cpb/Mm+T/zBtkf8zbZP/NGyT/zVsk/8zbpD/NHKR/zd1 + k/85dZT/OnWW/z12mP8/d5j/P3aZ/z90mv8+c5n/O3CX/zlulf8zaJH/LmOM/ypiiv8pYor/LWeO/zJt + kv84c5X/PniY/0N8mv9HfZv/Sn2c/0t/nf9Og57/TIKd/0yCnP9JgZz/RX2a/0B5mP88dZX/OnGU/zlw + lP87cpX/PXOX/0B1mf9DeJv/Rnyd/0p/n/9Ng6D/UISg/1CEoP9RhKH/UYSj/1CEo/9NgKL/Rnqe/z5z + l/83bJH/NGqQ/zVqkf85b5b/PnWZ/0N4nf9Fep7/Qnuc/z96m/89fJv/QH6d/0WCoP9Kh6P/T4ql/1GK + pf9Vi6X/WY2n/1qOpv9ajaX/WYuk/1eIo/9WhqL/UoKh/05+oP9HeJz/QHOY/ztwlv83b5X/NnGW/zdz + mP83dZr/OXac/z14nf9DfJ//R3+g/0mAoP9HgKD/RoCf/0eBoP9Jg6H/TISi/1CHo/9UiqT/V4yl/1uQ + p/9ckKf/XI+m/1uOpf9cjab/XI2o/12Oqf9cjKn/W4uq/1mJqf9Xh6f/VISm/0+BpP9He6D/QHed/zpz + mv82b5f/Mm2U/zVxl/86dZv/Pnmd/0F8nf9Ff5//S4Og/06FoP9PhZ//ToWf/02Dnv9PhaH/T4Sj/06D + pP9KgKH/RXue/z93m/87c5n/OHGY/zp0mf9AeZ3/RH2e/0d/nf9Gfpn/R36X/0h/mf9JgJr/RX2c/0F6 + m/89dZj/OHCU/zVtkP82bpD/OHGS/ztzlP89dZX/PXSV/z1ylv89b5f/OmuU/zNkj/8rXIn/J1mG/ydZ + hv8oXIn/LWOM/zBpj/8uao//L2yP/zFtkP80b5P/NG+T/zRtk/80aZL/MGOP/ytdjP8mV4j/I1WF/yVX + h/8pW4r/Kl2K/yldiP8oWoX/KVqG/ylZhv8nWIT/I1OB/yFPf/8fTn7/H01//yBPgf8kUoP/JFOD/yJR + f/8gTnv/HEl1/xpHc/8aR3H/GUZw/xdDbv8VP2r/Ezxo/xhBbv8ZRHD/HUhz/yZTe/8vXYL/NmOH/zpo + iv8+bI3/Pm+O/zpriv81ZYb/MF+C/ypaf/8lVXv/H094/x5Oef8fUHv/I1SB/yVWg/8oWYX/K1yG/y1f + iP8vYYr/MWOM/zRnkP84bJP/OnCW/zx0l/8+d5n/QHmZ/0N6m/9Fe5z/Rnyd/0d8n/9Ee5//Qnqe/z54 + m/86dZn/N3WY/zp5mf9Df53/S4Ki/02Dpf9MgqX/SX+j/0F4nf86cpj/Nm+V/zRulP83cZb/O3WZ/0J8 + nf9Jg6D/UImk/1OLp/9Viqf/VYmn/1KFpf9MgaD/Rn2d/0B6mv89dJf/PHKW/z10mf8+dp7/QXqj/0J6 + pf8/d6H/OnKb/zlwmf89c5v/QHWb/0N5nf9Fe5//RHqc/0N6m/9De5z/QHme/z14nf87d53/Onid/zt3 + nv8/eqD/Qnyi/0V/ov9IgqT/SIKk/0Z/of8jPlD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8hX4L/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/F0ln/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/Dx8q/y1gh/8rXIP/JlZ+/yBOeP8YRnL/FkRy/xpId/8hUX3/J1uD/y5jiP8zaY7/NmuU/zdt + l/84bZn/Om6a/zRok/8tYYv/J1uF/yVag/8oX4f/LWeN/zFskv8zcJT/NHKV/zRzlv80dJf/NXSX/zRy + lv8zb5X/NXCW/zdxl/85cZf/PHOX/zt1lf86dpX/PHmW/z56l/9Aepn/Q3yb/0N6mv9Fepv/RXmc/0J2 + mv8/dJn/PXKX/zdslf8yaJD/LmWN/yxljf8uaI//M22T/zhzlv9AeJn/R3yb/0t9mv9Lfpr/TH+b/06C + nP9QhZ7/UIae/0uCnP9If5v/Q3ya/z94mf88dZf/OXGV/zduk/85b5X/PHGX/z9zmf9Dd53/Rnue/0p9 + n/9MgJ//ToGf/06Bn/9OgaD/TIGg/0l+oP9BeJz/OXCW/zNpkP8vZY3/MGaO/zNqkv85cJb/PXWY/z93 + mf8+eZn/PXua/z99nP9DgaD/SIai/0+Lpf9SjKf/VYum/1iNp/9ajab/XI6m/1yNpP9ai6P/WYii/1eG + o/9VhKT/T4Ch/0h5nf9AdJj/PHGW/zlxlv83c5f/NnOX/zdzmf83dJr/OXWb/z14nv9Ce5//Qn2f/0R/ + n/9GgKD/SYKh/0uEov9OhqP/UYik/1aLpf9Zjqb/Wo+m/1yQp/9bjqX/W42m/1uNpv9cjqn/XI2q/1yN + qv9bjKv/V4eo/1WFpv9QgqX/Sn+j/0V8of9AeJ7/PXWd/zhymf81cJj/N3OZ/zp1m/8+eJr/QXub/0iA + n/9OhaH/UIeh/1CGn/9Og5z/ToOe/0+Eof9RhqT/ToSl/0qAov9HfKD/Q3mf/z52nP87dJr/O3Sb/z94 + nP9De57/RXyd/0h+m/9Ifpr/SoCZ/0qAmv9JgJv/RHyb/z92mP86cpX/N2+T/zZukf83cJL/OnOV/zx2 + lv89dJb/PHGY/ztumP84aZX/MmOQ/ytciv8nWYj/JViH/yhdif8tY43/MGmR/zNuk/80cJP/NXKU/zdy + lf84cpX/OHGV/zZrk/8zZpD/L2CN/ylaif8mWoj/J12K/yphjf8tY43/LWOL/y5ii/8vYoz/MmSP/y9h + jP8rW4n/JVWE/yBOf/8eS37/HUt9/x5Mfv8eTX3/H019/x1LeP8cSHT/GkZy/xhEb/8ZRXD/GERu/xM9 + aP8VP2r/GkRv/xxHcv8lUnv/LVyD/zVkif85aIv/PW2O/z9wkP8+cY//PXGP/zxvkP83aoz/MmSG/yxe + gv8mWH//I1R9/yJUf/8gUX//IVJ//yNTgP8lVoL/KFiD/ypbh/8wYYz/NGaQ/zdqlP86b5b/PHOW/z53 + mP9AeJn/Qnib/0R6nP9Gep7/Q3md/z93nP89dpz/OnWa/zd0mP81dZf/PnqZ/0aAnf9NhqL/Toak/1CG + p/9Mg6T/R36h/z93m/84cZb/NW+U/zdwlf86dJj/QHqb/0iBnv9QiKP/Vo6m/1eNpv9YjKf/Vomm/1SH + pP9Ng6D/R36d/0N4mv8/dJf/PXGY/z50nP9AeKD/Qnmk/z93ov86cZz/N2+Z/zZtlv84bpb/OnCY/zxz + l/88c5b/PHSW/zt1l/87dpr/PHee/zt4nv88eZ//QXyh/0R/pP9HgKX/SYOm/0yFp/9Mhaf/TIGj/yQ/ + UP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xtMaf8aWX7/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8UNkv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8dO07/M2eK/zFjiP8tXYX/J1V//x5L + eP8ZRHX/F0N1/x1Lev8jVX//Kl6E/y9ii/8yZpH/NWqV/zdqlv83aZX/NGaS/y1fiv8nWoX/JFiC/yJY + gf8nYIj/LWmO/zBuk/8zcpb/NHSX/zR0l/8zcpX/M3GV/zVwl/84cZj/OnSZ/z51mP9CeJn/QniZ/0F5 + mP9Ae5j/QnyZ/0R9mv9FfJr/R3yb/0h8m/9Gepv/RXmb/0N3mv8/dJj/OnCX/zZslP8waI//L2iP/y9q + kP8zbpP/OnOW/0N5mf9KfZr/TX+b/02Am/9Mf5r/ToKc/1CFnf9Rhp7/ToOd/0p/m/9GfJv/Qnub/z53 + mv85cpb/Nm6T/zNpkP80apL/OW6V/z1ymf9Ddp3/Rnqd/0l8nf9KfZz/S3+e/0uAn/9Jf5//Qnqb/zx0 + mP81bZT/L2mQ/yxljv8tZI7/L2eP/zVuk/86c5b/PHaV/z55l/9Afpr/QoCd/0aEof9LiaX/UY2n/1SN + p/9Xjqn/WY6o/1yPp/9dj6X/XI2k/1uKov9ZiKH/WYik/1aFpP9QgKH/R3mc/0B0mP88cZb/OnKW/zt1 + mP87dpn/N3OY/zVwlv83cZj/OnSb/zp4nf89e57/QH6f/0aBof9Jg6L/TIWi/0+Ho/9TiaX/V4ym/1mO + pv9ajqf/Wo6m/1qMpv9ajKX/WYun/1qMp/9bjKn/Woyr/1iJqf9Uhaf/UYKl/0p/o/9GfaP/Q3yi/0N8 + ov9AeqD/PHie/zd1m/82cpn/OHSZ/zt1mP9Cepv/SoCd/1CFoP9Sh6H/UYaf/1CFnv9PhJ7/UIWg/0+F + o/9OhKX/TIGj/0l+oP9Gep7/QHad/zxzmv87c5r/PXWb/0F5n/9Fe57/Rnyd/0h9m/9Jfpv/Sn+a/0qA + m/9FfJr/QXiZ/z10l/84cJT/N26S/zhwk/87c5b/O3SX/zt0l/87cJj/Om2Y/zZolv8wYpH/KlyL/yVY + iP8kWIj/J1yK/ytjjv8vaZD/M26S/zZylP83dJX/OHSW/zp1l/85cZX/OG2T/zVpkf8xYo7/LF+L/ydf + iv8oYoz/K2WO/y5njv8waI7/MmqP/zRqkP81a5L/M2eR/y9ijv8oWYj/IE+A/xpHev8YRnn/GUZ4/xpI + ef8cSnn/HUl2/x1JdP8dSXP/G0hx/xpIcv8bSHP/G0dx/xxHcv8gS3X/I1B5/yhXgP8xYon/NmeL/zlq + jP89bo//PXCP/zxxj/89cpD/PXOS/z1ykv84a4z/MWWH/y5ghf8rXYX/J1mE/yNUf/8gUH3/H097/yBQ + ff8iUoD/JlaE/yxcif8yY4//NWmT/zhtlf87cpb/PXaW/z54l/8/eJj/Q3ic/0N4nf9Adpz/PHSa/zly + mv83cpn/NHKX/zl2lv8/e5f/RoCb/0uFoP9Ph6P/UIim/0+Fpf9LgqP/RX2f/z12mf82b5T/N2+V/zpy + lv8/eJr/Rn6e/02Fof9TiqT/WI+m/1mPpv9YjKX/Voqk/1KHpP9MgqH/Rnud/0B0mP87bpb/PHGZ/0B1 + nv9AdqD/PXSf/zdumv8xaZT/L2aQ/y5ljv8yaZD/NGuQ/zVtkP83cZP/N3GV/zh0mP86d53/P3ug/0N+ + ov9IgaX/SIKm/0eBpv9Jg6b/TYWn/06Epv9NgqX/Lk9l/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/Gkhj/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p+/wkYIv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/y9bdP87bpD/OWqO/zZljP8vXIf/JlGA/x5Gev8ZQXb/GkN4/x9Le/8lVoH/KVyH/y1g + jf8xY5D/NGaS/zNlkf8wYY7/K12J/yZZhf8iVoD/I1qD/yRehv8oZIv/LmyS/zJwlf80dJj/NHSX/zRz + lv80cpX/NXGW/zlymP89dJj/QHeX/0J4mP9Eepn/Q3qZ/0N7mP9Ee5j/RXyY/0Z8mP9He5j/SHya/0h8 + mv9Hepr/RHib/0F2mv89c5j/N26U/zNrkf8waI//MWuQ/zVukv89dJT/RnqX/0t9mv9Nf5v/TYCb/06B + nP9Pgp3/UISe/0+Dnf9Ngpz/S36b/0d7m/9EeZv/P3ib/zp0mf82bpX/MWiQ/y5kjf8wZo//NmuU/zxx + mf9Cdpv/RXqa/0d7mv9Kfpz/SoCf/0V7nf8/d5r/N3KW/zNulP8vaZL/LGaQ/y1mkP8wapL/NG6S/zp0 + lv89eZj/QH2Y/0OCmf9GhZ7/Soii/0+Mpv9Uj6n/WI+q/1qQqv9ckan/XZGo/16Rpv9djqP/W4ui/1qK + o/9ZiaT/VYWk/05/oP9GeZz/P3OX/zpwlP87c5f/QHib/0F7nv88d5r/NnCV/zJrkv83cpn/OXac/zl5 + nv9AfaD/RoKi/0qEov9NhqP/UIik/1OKpf9WjKb/WI6n/1mNp/9ZjKf/WIum/1iKpv9Xiab/V4mn/1iK + qP9Wh6j/VIWo/1GDpf9MgKP/Rn2i/0J8of9EfaP/RH6j/0R+o/9BfqH/PHqe/zh1m/81cJj/OXWZ/0B6 + mv9JgJz/T4Se/1KGoP9Th6D/UIWf/0+En/9PhKH/ToOj/02Do/9NgaH/TH+f/0d6nf9Bdpr/PHKZ/zpw + mP88cZr/P3Wc/0J3nf9FeJ3/R3uc/0h8m/9IfZr/R32a/0V7mv9CeJr/P3aa/ztymP84b5X/OG+T/zhw + k/85cZT/OHCV/zhvlv83bJb/NmiW/zBjkv8qXY7/JFeJ/yFXh/8kWon/KWCM/y5oj/8ybpL/NXKT/zZz + lP84dZX/OnSW/zpxlv84bZT/NmiS/zJkjv8rYoz/JWKK/yVki/8qZ43/LmmN/zFrjv80bY//N3CS/zZt + k/81apP/MGWQ/ylbif8hUYL/Gkh7/xRBdf8VQnT/GUZ2/xtIdv8gTXn/Ik95/yFOeP8eTXf/HU13/x1N + eP8gT3n/I1B6/yVSfP8lVX7/KlqD/y5fh/8yZIn/N2qM/zltjP86bo3/OnCO/ztxkP87cZH/O3CQ/zpv + j/82a4z/MmaK/zBjiv8uYIr/KluF/yRUf/8fT3v/HUx5/x5NfP8iUoH/J1eG/yxei/8xZJD/NmuT/zlv + lf87dJT/OnWT/zt1lP89dJf/PnSa/zxymv85cZn/NnCY/zRvmP82c5j/O3eW/0B8l/9FgJr/S4Sf/06G + ov9Ph6P/T4ej/06FpP9JgaH/Q3yd/z12mv84cJb/OXGW/z11mf9Ee5z/SoGg/1GHo/9Wi6T/WY6l/1mN + pP9Xi6T/VIml/0+FpP9JfqD/QXWZ/ztvlf84a5P/OW6X/zpwmv84bpr/NWuX/y1lj/8mXoj/J16I/yti + iv8uZYv/NG2Q/zdylf83c5f/OXWa/z15nv9CfaD/SoOj/02Fpf9NhaX/SoSk/0mEpf9LhKX/ToSl/02C + pP84YHr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ZQVr/G1p+/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8IDhL/PnSR/z5ykv9AcZT/PWyT/zVh + jf8rVYb/Ikp//xtBef8YP3f/GkR4/x1MfP8jVYP/J1iG/ytbif8tXYv/L1+N/yxdiv8pWof/I1aC/yNY + g/8lXYb/J2GK/ylmjv8sa5H/MXCW/zRzmP81dZn/NXSY/zVyl/83cpf/OXOX/z11l/8/dpb/QXeX/0N5 + mP9DeZj/Q3qX/0N6l/9Eepf/RXqV/0d6lv9IfJj/SXyZ/0h7mf9Gepv/Q3ia/z90mP86cJX/NGyS/zBp + j/8yao//N22Q/z90kv9GeZX/S32Z/06AnP9NgJz/ToGd/0+Dnv9Ogp7/TYGe/0x/nf9JfZz/R3qb/0R3 + m/9AdZr/O3OY/zRulf8vaJD/LGSN/yxjjP8vY47/N2uT/z1xlv9Cdpf/RHmZ/0Z8nP9Fe5v/QXmZ/zp1 + mP83c5f/NXCX/zFulv8wbJX/MWyU/zJulf82cZb/PXeY/0F9m/9Fgp3/R4ad/0qKn/9NjqP/U4+n/1iS + q/9ck67/XJKq/12TqP9flKj/X5Om/12Po/9bjKP/Woqk/1eIpf9ThKT/TX6g/0Z4m/8+cpb/PHGU/z51 + mP9Dep3/RH2g/0J7nf88dJj/OHKY/zh0m/86eJ7/PHmf/0B+of9GgaP/SoSj/06HpP9QiKP/U4ql/1aM + pv9Xjab/WI2o/1iLp/9Wiaf/VYmm/1OGpf9UhqX/U4Wl/1CCpP9PgaT/TICk/0d/ov9EfaL/RX+j/0aA + o/9HgaT/SIOl/0aDpP9DgKP/PXmf/zl1nP83dZn/PHma/0V+nP9Mgp3/Uoae/1KGn/9QhZ//T4Sf/02D + oP9Og6L/ToOh/06An/9Mfp3/SHqa/0J1mP89cpf/O2+W/zltl/88b5n/QHKa/0J1m/9Ed5v/RXia/0Z5 + mf9GeZn/RHma/0J4nP9Ad53/PXSc/zhvl/82bZP/Nm2R/zRtjv80bZH/NW2T/zVqk/8zZ5P/MWOS/yte + jv8mWov/IliI/x9Whv8lXor/K2aN/zBskf80cZT/NnOV/zh0lv85dJf/OXGX/zhulf81aZL/MGWO/yhj + i/8jY4r/JWSM/ylmjf8taI3/MGqM/zRtjv82b4//OHCS/zZtk/8xZ5D/K12K/yNTg/8cSnz/GEV4/xZD + df8ZRnb/H0x6/yVSff8qV4D/JVV//yFUfv8fUnz/IFF7/yNUff8nVn7/KFiA/ylag/8pW4P/Kl2F/y5h + h/8xZYn/NmqL/zdriv84bIv/N26N/zhvjv84bo7/OG2O/zdsjf80aYv/NGeM/zRljP8xYYv/K1qE/yNS + ff8eTXn/HEx5/x9Pff8iUoH/J1iG/yxei/8xZo//NmuS/zhvkv84cJH/N3GQ/zhxk/85cZb/OG+X/zVu + l/8zbZf/M2+X/zd0mf89epn/Qn2a/0eBnf9Kg57/TIWg/0+Hov9QiKP/Toai/0yEov9JgaD/Qnqd/z51 + mv87cpj/PHOY/0F4mv9HfZ7/ToSg/1SJpP9YjKX/WIyl/1eLo/9UiKT/UISj/0t/oP9EeZz/PXCW/zdr + k/8zZ5H/MWWS/zBnlP8uZZH/K2KL/yZeh/8lXYb/KWCI/y9njf82b5P/OnSY/zx4nf8+e5//Qn2g/0mB + oP9NhaH/UIej/1GJpP9PiKT/Toek/0+GpP9NhKP/TYOk/zhgev8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xMwQ/8cWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xZAWf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xgsN/9AdZP/QHOU/0Jzlv8+bJX/OGWR/y5Ziv8jTIL/HEN7/xlAeP8WQ3b/Gkl6/x9P + fv8jU4L/JVWE/yhYh/8pWIf/KFiG/yRWhP8jVoP/JFqF/ylhi/8sZo//LmuT/y9ulP8xcJb/NXSZ/zh1 + mv84dJj/OHSY/zhyl/86c5f/PXSX/z91l/9Ad5f/QXeW/0J4lv9CeJb/Q3mX/0V6l/9Gepb/SHuX/0l8 + mP9JfJj/SHuZ/0d7m/9FeZv/QHWZ/zpxlf80a5D/L2iO/zJpjf84bI7/P3KR/0Z4lf9LfZr/TH+c/0x/ + nP9MgJ3/S3+c/0t/nf9Kf53/SH2c/0d7nP9FeJv/RHaa/0B0mf88cJb/NWyT/zBpkf8uZo//LWOO/y5j + jv8xZY7/OGyS/ztvk/8+c5X/QHaX/z51l/87dJb/OXOW/zdylv82c5n/NnSa/zd0nP83dJr/N3SZ/zp2 + mv8/e5z/RYGf/0mGoP9LiqD/To2i/1OQpP9Ykaj/XZOt/1yTrP9bk6n/XJOo/1+Up/9gk6b/XpGl/1uN + pf9XiaT/U4Sj/06Aov9KfaD/RHic/0B1mf9AdZj/Q3mb/0Z9n/9Hf6D/Rn6f/0F6nf88d5r/O3ec/zx4 + nv89eZ//QX2h/0aAov9MhaX/UIil/1KJpf9SiaT/VIqk/1WKpv9Vi6f/VIqo/1OIp/9ShqX/UISk/0+C + pP9NgKP/S32g/0l9of9GfqH/RX+i/0V/ov9HgKP/SYKk/0uEpf9Lhqb/SoWl/0iDpP9Ef6L/Pnue/zp5 + m/85eZr/PHma/0Z+m/9Mgp7/T4Sf/0+En/9Og6D/TYOh/02Cof9QgqD/UIGf/09/nf9Ke5v/RHaZ/z5x + l/88bpb/OWyV/zlrlv87bZj/P3GZ/0BymP9CdZj/QnWX/0N2l/9Dd5n/Q3eb/0B2nP87cpv/N22X/zRr + k/8yaoz/MWqK/zFqiv8za4//M2qR/zJnkv8wZJD/LWCP/yldjP8kWon/IlmH/yJbh/8mYor/LmqP/zJv + k/83dJf/OXWY/zl0mP85c5j/OHCY/zVslP8wZ5D/KmWN/yZiiv8mYoz/KmSN/y5lj/8xaI3/MmuM/zRt + jf81bo//N22R/zRokv8tYIz/J1aG/yBNf/8cSHr/G0d4/x5Lev8lU37/LFqE/yxchv8nXIX/IluE/yJY + gf8jV3//JFd//ydZgf8qWoL/K1yE/ylbg/8oXIT/KV2F/y1ih/8xZoj/NGiJ/zVqif81aor/NWuK/zZs + i/82bIz/NmuM/zdqjf83ao3/N2iO/zRkjP8wYIj/KlmC/yRTf/8gT3v/Hk56/x5OfP8hUoD/JliF/y1h + i/8xZo7/M2mP/zNrj/80bZD/NW6S/zZulP81bZX/M2yW/zFrlf8yb5f/OHSZ/z56nP9FgZ//SIKf/0mD + n/9LhZ//T4ah/1GIo/9QiKT/Toah/0qCoP9Hfp//Q3qd/z51mv8+dZr/P3WZ/0V6nf9MgaH/Uoek/1aK + pv9Xi6b/Vomk/1OGo/9QgqH/Sn2f/0R3nP8+cpf/NWmS/y1hjv8qXo3/Kl+N/ypgjP8oYIn/KGCJ/yhh + if8sZIz/NGyT/zpzmP8+d5z/Qnyh/0R+ov9IgaD/TYSf/1GGn/9RiJ//UYih/1OKo/9Ti6T/UYej/0+F + o/9Og6L/RXaX/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EzBD/xtaf/8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8bWn7/Dig4/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/LVBm/z9zk/8/cpT/PW6T/zpp + kv82YpH/LlmM/yROgv8cRHz/GER4/xlIev8bTHv/IFF//yNTgv8lVYT/JlWF/yVVhP8jU4L/IlOB/yJX + hP8lW4f/KmON/y9qk/8yb5f/NHGY/zRymP82c5n/OXWa/zl1mf85dJj/OnOY/ztzl/88c5f/PHOW/z51 + lf8/dZb/QHaU/0J4lv9DeJb/RXqY/0Z6l/9He5j/SXyY/0h7l/9He5j/RXmZ/0N4mf9AdZj/OnCT/zNq + jv8wZ4z/NGiM/zlsjv8/cZL/RXeX/0l8m/9JfJz/SXyc/0l9nP9IfJz/SHyb/0Z6mv9EeJr/Q3ea/0J1 + mf9BdZr/P3OY/zxvlP84bZP/NWqS/zJokv8wZpL/MWaS/zNnkv8xZI3/M2aN/zZqkP85bZL/OW+S/zhw + k/82cZT/NnKW/zd0mP86eJ3/PHqf/z16n/89ep3/Pnqd/0N+n/9Hg6H/S4ii/06Mo/9Sj6T/V5Cl/16S + qP9ekav/XJKr/1ySqP9ckqb/XZOm/1+Tpv9ekaf/W46n/1WIpf9PgqP/Sn2g/0V5nf9Cdpv/Q3mc/0Z8 + nv9Jf6D/SX+g/0qBof9IgKD/Q3yd/z13mv87dpr/OnWa/z13nP9AeZ//RX2g/0uDo/9Sh6b/VIil/1OI + pP9SiKP/Uoil/1GIpf9Qh6X/T4Wl/06DpP9MgaP/Sn6h/0h8oP9Hep7/RX2g/0V/oP9FgaL/SIKj/0qD + pP9MhaT/T4il/0+Ipf9PiKb/TIWk/0iCov9DgKD/Pnyd/zt4mv88d5n/Pnib/0d+nf9Lgp//ToOg/06D + of9Ng6L/T4Si/1CDof9QgZ//T3+f/0x9nv9IeZz/QXOZ/zpslP81Z5L/M2WR/zdolP87bJf/PW+X/z1w + lf8/cpX/QHOV/0B0l/8/c5j/PnKY/zhul/80a5T/MGmQ/y5ni/8uZ4n/MWiK/zJpjf8yaZD/MmeQ/zFl + kP8vYo//K1+M/yddiv8kW4f/JFyH/yZgiv8sZ47/MW2T/zZxl/84dJr/OHWa/zhzmv85cZn/OG6X/zRq + kv8tZI3/KF+J/ydeif8qXor/LWCN/zBkjv8zaI7/M2qM/zRrjf82a5D/NGeR/zFij/8pWYf/IlCB/x9L + fP8fS3v/I099/ypXgv8vXof/LWCJ/ydgif8mX4f/JV2E/yZbgv8nWoL/KVuD/ytdhP8qXIP/KFuD/ydb + gv8nW4L/Kl6F/y5jh/8xZon/NGiJ/zRoiP80aoj/NmyL/zdtjf83bI7/OG2P/zlsj/84aY7/NmeL/zJj + if8vX4b/LVyF/yZWgP8gUHz/Hk56/x1Oe/8iVIH/J1qF/ytfiv8tY4v/MGaP/zJpkP80apP/M2qU/zJp + lf8xaJX/MGuU/zFvlv82c5n/QHyf/0aBof9JhKH/SoOg/0yFoP9PhqH/Uomk/1GJpP9Ph6L/TYSh/0mA + oP9FfJ7/QXic/z92m/8/dpv/Qnid/0l+oP9PhKT/U4am/1WIpv9Uh6T/UIKi/0x+n/9HeZ3/QHSZ/zlt + lP8xZZD/Kl2L/yldjP8pX4z/J16J/ydhi/8oYoz/K2WN/zNtkv85cpb/P3eb/0F6nf9EfqD/SICi/0uB + oP9OhJ7/UIad/1GHnP9SiJ7/U4mg/1SKo/9TiKP/UYSi/02Bof9JfKD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8QKjr/G1p+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8EDBD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP86aon/PG+S/zpskP82aI//M2SN/y9ei/8pVof/IU6C/xpIe/8YR3j/Gkt6/yFS + gf8kVoP/JleE/ydXhf8mVoT/JFSC/yJSgf8gUoD/IFWC/yVciP8rZI7/MWyU/zRxmf82cpn/N3OZ/zl0 + mf87dZr/PHWa/zt0mf87c5j/OnKY/zpxl/87cZX/O3KU/ztyk/89c5P/P3WU/0J4lv9DeJb/RHmX/0Z6 + l/9Gepf/RXmX/0Z5lv9Cd5b/QXaW/z50lf85cJL/M2qO/zNnjf81Z43/Om2Q/z9xlf9Fd5n/Rnqb/0d6 + m/9Ge5v/RXqb/0N4mv9CeJn/QHWY/z9zl/9Ac5j/QHSY/0F0mf8/c5j/PnKW/zxwlP87cZT/OW6V/zZr + lf80aZf/MmWT/y5ijf8sX4n/LmCJ/zJkjP80aI7/OG2S/zhwlP84c5f/O3ab/z16nf8/faH/Qn6i/0J+ + oP9Dfp//R4Gg/0qFov9OiaP/UYyk/1aPpP9bkab/XpKo/16Rqv9dkav/XJKp/1yRp/9dkqb/XZGn/1yQ + p/9ZjKj/Uoam/0yAo/9Ge6D/QXed/0J3nP9GfJ//S4Gj/02Do/9OhKP/TYSj/0qDof9HgKD/QXuc/zp1 + mP84c5b/OXKX/zx1mv9Dep7/S4Ci/1GFpf9ThqT/UoWi/1GFof9PhaP/TYOj/0uCov9KgaL/R3+h/0d9 + of9Fe5//Q3md/0R8n/9Ef6D/RIGh/0mEo/9MhqX/T4el/1CIpP9SiaP/Uomk/1KJpP9QiaX/TYaj/0iE + of9Bfp7/Pnib/zt2mf8+eZv/Qnyd/0iAoP9MgqH/TYKi/06Do/9QhKP/UIOi/06AoP9Mfp7/Snyd/0d6 + nf9BdJn/OGuT/zBijP8uYIz/LmCN/zNlkf85apX/Om2U/ztuk/88b5L/PG+S/ztvk/85bZP/NmuS/zJp + kP8uaI7/LWeM/yxmi/8vZov/MWeN/zNokP80aJH/NWiS/zNmkf8wY4//LGCL/yZciP8lXIf/Jl6J/ytk + jv8xapT/NW+Y/zdymv83c5z/N3Ob/zlxmv87bpf/NmmS/y9ijP8oXIb/J1mF/ydYhf8qWon/L1+N/zJj + jv80Zo7/M2eM/zRojv8zZY7/L1+L/ylYh/8iT3//Hkl6/x9Kef8kT33/KlaC/yxdh/8sYYr/KmKL/ylh + if8oX4b/J12E/yhcg/8qXYP/K16E/yxehP8pXIP/JlqB/yZagf8nW4L/K2CG/zBlif8yZ4n/NGmJ/zRr + iv82bY3/OG6P/zlukP86b5H/Om6R/zhrjv82aIz/NGeK/zNliv8xYon/Ll6G/yhYgv8gUX7/H1B9/x1P + e/8hVID/JViE/yldiP8tYY3/MWWR/zFlkv8vZJP/L2SU/y9pk/8ubJP/MHCU/zl3m/9BfKH/RoGi/0mB + of9Lg6H/TYSh/1GIo/9SiaT/U4ql/1GIo/9OhaL/S4Kh/0h/of9Dep//QHed/z91nP9Adp3/RXqf/0p/ + ov9OgqP/UIOk/0+Bo/9KfaD/RXic/z9ymP85bpX/M2mR/yxhjP8rX4z/LGGP/y5jjv8sY43/J2KL/yhi + jP8uaZD/NXCU/zt2mP8+eJn/Qnmc/0V9n/9Jf6D/TIGf/06Dnv9QhZ3/UYad/1KHnP9Thp7/UoWg/1KE + oP9RgqL/TX6g/0h5n/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woXIf8cWn//Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/GU5u/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CxQb/zlrj/82aY7/M2WL/zBh + iv8tXon/KVqG/yRUhP8fTn7/GEl5/xZId/8dTn3/JFWD/ylbiP8qXIj/KVqG/yhZhf8mV4P/IlOB/x5R + fv8cUn7/I1uF/ytljv8ybZT/NXGX/zdymP85c5n/PHWa/z12m/89dZn/PHSY/ztymP87cpj/OnGX/zlv + lf85b5P/OW+S/zpxkv89cpL/QHSU/0F1lf9BdZb/QnaW/0J2lv9Cdpf/Q3WW/0B1lP8/dJT/PXOU/zhu + kf8zaI7/MWaN/zNnjv83a5H/PnGX/0B1mf9Cd5r/RHib/0R4mv9DeJr/QHeZ/z50lv89cpX/PHGV/z5y + lf8/dJf/QXaZ/0J2mv9Bdpj/QXaY/0J3mP9AdZf/PHGY/zhsl/8xZJP/LV+N/ylbh/8pWYX/LFyH/zFj + jP82apH/OXCU/zx0mP8+eJz/QXye/0N/ov9FgKL/RYCh/0eBoP9IgaD/TIWh/0+Jo/9UjKT/WY6k/12S + pv9ek6j/XpKq/16Sqf9ckKn/XJCo/1yRp/9dkaj/W4+q/1eLqv9Qhab/SX6j/0N5n/9Ad5z/Qnmd/0d+ + oP9Mg6P/UIek/1KIpP9SiKT/T4aj/0uEov9GgJ//P3mb/zlylv81b5P/OHCW/z91m/9JfaL/TYCj/0+C + o/9PgZ//T4Kh/0+Do/9KgaH/Rn2e/0J5nf9BeZ3/QXid/0F5nv9DfJ7/RICe/0aCof9JhaP/TYel/1GK + p/9Ti6f/VYum/1aLpP9Wi6L/Vouk/1SKpP9RiqT/TIai/0Z/n/9BeZz/PHaZ/z13mf9Be5z/R36g/0uA + ov9NgaL/ToKj/06Do/9NgaL/S3+f/0h8nP9FeJv/Q3aa/z1xl/80aJD/LF+L/ydZhv8lV4X/KlyJ/zBi + jv82aZH/N2qQ/zhrj/85bI//OGuO/zZrj/80ao//MGmO/y9pj/8uZ47/LmaO/y5ljf8vZo7/MmeR/zRp + k/83a5T/NmmT/zVokf8yZY7/LGGL/yddiP8mXYn/KWGM/y9nkv80bZf/Nm+a/zdxm/84cZr/OnCZ/zpt + lf82aJH/Ll+K/yhZhf8lVYH/JFOB/ydVhP8sWYj/MV6M/zBfiv8vX4n/LmGK/y5fiv8rWYf/JlKD/x9K + e/8aRHX/GkR0/x5Hd/8nVID/KluG/ypgif8sYov/LWOK/ytgh/8pXoT/KVyC/ytcgv8sXoT/LV+E/yxd + g/8pXIL/JlqA/ydbgf8pXoP/LmOH/zJni/81aYv/N2yN/zhvj/83bY//OGyQ/zltkf86b5H/OW2O/zdq + jP83a4z/NmqM/zRmi/8xY4v/LV6I/yhZhP8iU4D/HU57/xxOe/8eUH7/JVeF/ypdi/8tYI//LWCQ/yxf + kP8rYpD/K2iQ/yttkP8yc5T/Onia/0J+n/9Gf6H/SICg/0uCoP9OhaL/UIai/1KIpP9TiaX/UYik/0+G + pP9NhKP/SoGj/0Z9ov9DeaD/PXOb/z1ym/9AdZ3/Q3ie/0h7oP9JfKH/SHqg/0J1nP87bpb/NmmR/zJo + kP8tZov/LGWL/y9njv8zapL/NGuV/zJrlP8uaJL/LGiP/y1qjv81cZP/OXSU/zx2lv9AeZr/RXue/0h9 + n/9LgKD/TYGg/0+Cn/9QhJ7/UoSe/1KDnf9Qgp3/UICf/05+of9MeqD/RnSd/wcNEv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/CRcg/xxZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8QOE//AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8bM0b/M2SL/zBiif8sX4f/KluF/ylahv8nWIX/IlWB/x9Rfv8bTXr/GUx5/x1P + fv8kVoT/KlyJ/y1fi/8uX4v/LF2I/yhZhf8kVoH/H1F+/x1Sfv8jWoX/KmSM/zJrkv82cJX/OXOX/zx0 + mf8+dZr/P3ab/z10mf89dJj/PHOX/zxzmP86cZb/OG6U/zdtk/84bZH/OG+R/zpvkf87cJH/PXGS/z5x + k/8+cpT/P3GU/0Fzlv9Bc5b/QHKV/z5ylP89cZT/N2uR/zBlj/8uY43/LmON/zJnkP84bJP/PHGY/z1z + mf8/dpn/QHea/0B3mv9Adpj/PnWX/z1ylf89cpX/P3SW/0F4mP9Depv/RXuc/0V7m/9Fe5v/RXub/0R6 + mv9Bd5n/OW+V/zNmkf8sXYz/JlWE/yRTgP8oVoL/MGCK/zVnj/85bpT/PnSY/0J6nP9Efp//RoGh/0eC + ov9Ig6H/SIGg/0mBn/9MhKD/UIii/1aMo/9bj6X/XZCm/16Sp/9ek6n/XpKo/16Rp/9dkKj/XpCp/1yQ + qf9ajar/VYqs/06EqP9HfqP/QXif/0F5nf9EfJ7/SICg/0yEov9Qh6P/U4qk/1OKpf9TiaT/T4ak/0mD + ov9Efp//Pnea/zdwlf80bJP/OnGX/0F0nP9Ie6H/S32h/0x+of9OgKP/T4Ok/0d8nv9Ad5r/PXSZ/zty + mP88dJr/QHic/0WAn/9IhKD/Soej/06Ipf9Riqf/VY2p/1iNqP9Zjqf/WY6l/1mMo/9ZjKP/V42l/1WL + pf9RiKX/S4Ki/0R8nv8/eZv/O3aX/z53mv9Dep3/SHyh/0p9o/9KfqL/Sn6h/0l+oP9HfJ3/RHma/0B1 + mP88cJX/NmuQ/y5jjP8oXIf/IVWC/x9TgP8gVIH/JlqG/yxfiv8yZYz/NWiN/zZpjf82aY3/NGqM/zJr + jv8wa4//MGqQ/zFrkf8waZH/L2aQ/y9kkP8yZ5H/NmqV/zhslv85bZX/OGuU/zZpkf8wZI3/K1+K/ydd + iP8nXYr/KmKO/y9nk/80a5j/Nm+Z/zdvmf85bZf/N2qU/zNkjv8sXYj/JlaD/yJRfv8jUn//JlSC/yhX + hP8pWYX/KluG/ylahP8nWIP/JleD/ydVhP8hTn//HUd6/xhBc/8TPG3/GkRz/yNOfP8qWYX/LF6J/y1h + iv8uYor/K2CH/yldg/8qXIL/LF2D/y1ehP8uX4T/LmCF/yxeg/8pXIL/KFyB/ypfg/8tYob/MWaJ/zZp + i/83a4z/OGyO/zZsjv81aY7/N2yP/zhtj/85bo7/OW6O/zhtjf83bI3/N2qO/zVnjf8xY4z/LF6J/yZW + g/8eTnz/Gkp4/xtMev8fUX//JliH/ydaiv8pW43/KV2O/ydhjP8nZoz/LWyP/zZzlP87eZj/Qn6d/0WA + nv9IgJ//TIKg/0+Fof9QhqL/Uoik/1KIpP9SiKT/UIak/06Fpf9KgaT/SH6j/0J4n/89c5z/Om+Z/zlv + mP88cpr/QHSc/0F2nv9Ac5v/OmyX/zJlkP8vY43/LmSL/yxkiv8ybI7/N3ST/zt2lf88dZn/O3Wb/zhz + mf80b5L/MW+Q/y9tjv81cZH/O3WV/z92mf9Cdpz/RXme/0d7oP9KfaH/TH+g/06AoP9PgJ//T4Ce/09/ + nv9OfZ//TXuh/0t4oP9Cb5r/Dhkk/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8JFiD/HFp+/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/wwhL/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yJHZv8uX4f/LF+G/ylc + hP8qW4X/KVqF/yhahv8mWoX/I1iC/x9Uf/8eUn7/IFOA/yRXg/8qXYn/LmGN/zBijv8vYo3/K12I/yZX + g/8iU3//IVSA/yRZhP8rYov/MmqR/zdvlf87c5f/PnSY/z91mv8+dZr/PnSa/z10mv8+dJr/O3KX/zlv + lf83bZP/NmyS/zdskf83bJD/N2yP/zhtkP85bpD/Om2Q/zttkf87bZL/PG6T/z5wlP8/cJT/PnCU/zps + kv80Z5H/LWGO/yldiv8oXon/K2GM/zFnkP82bZT/OnGX/z11mP8+dpn/QHia/0F4mv9Ad5j/P3aX/0B2 + l/9CeJn/Rnyc/0d+nf9If53/SH+d/0h/nf9Hfp3/Rnyd/0F3mf87cZT/NWqQ/y9ijP8nVoP/Hkp6/yBN + e/8oVYL/MWCL/zhqkf88cpb/Qnib/0Z+n/9IgqH/SoSh/0qEoP9Jgp//SYGe/0uDnv9Qh6D/VYuj/1qN + pf9cj6X/XZCn/16Sp/9fk6f/X5Kn/1+Qpv9ej6n/XY6q/1mLq/9Th6r/S4Kn/0N7ov9BeZ7/QHqc/0R9 + nv9Jg6L/Toei/1KKpP9Ui6X/VYym/1WLpv9SiaX/TYWk/0eBov9Bep//O3Sa/zdwl/80a5T/OW6X/z1x + mf9Ed57/Snyk/01/pf9He6D/QHaa/zlxlf85c5f/OXKY/zlyl/9BfJv/SIOg/0uIov9Pi6X/Uoyn/1aO + qf9Yjqn/WpCp/1uPp/9cj6X/XI6l/1yOpf9ajqb/WI2n/1SKp/9OhaT/SICg/0J7nf8+d5n/PXWY/z91 + mv9Dd57/RXmg/0Z6of9Fe5//RHqd/0J5m/8/d5j/O3KU/zdtkf8xZ4z/LWKK/yVahf8fU4D/HVF//x5T + gP8fVIH/JVqF/ytfif8yZYz/NWmN/zVrjv80bI//Mm6R/zNvk/81b5X/NW6V/zNrlP8yaJP/MWWS/zNn + k/81aZX/OGyX/zptl/85bZX/NWmR/zJljf8tYIr/J1yI/yVbiP8mXIv/KV+P/y1lk/8ya5b/NG2X/zdt + l/82aZT/MWOP/ylah/8kVIL/IlF//yRUgv8mV4T/JliD/yZZg/8kWYH/JViB/yJVfv8hU37/IVF+/x9N + ff8cR3r/GkN2/xc/cf8ZQXH/Ikx6/ydTgP8rWoX/L2CK/y1fiP8rXYX/KVyC/ypcgf8tXoP/L1+E/zJh + hv8xYYb/L2CF/yxfhP8rX4P/K1+D/yxhhf8wZIb/M2eJ/zZpiv81aov/NWqM/zRqjf82a47/N2yO/zlu + j/85b47/OG6O/zdsjv83a4//N2qQ/zRnkP8uYIv/J1iE/x5OfP8aS3n/GUt5/xxOff8eUID/I1WF/yZX + iv8lW4n/JWCK/yhljP8wbJH/N3OV/z16mf9Df5z/RoCd/0iBnv9LgZ//T4Sh/1GGo/9RhqL/UIWi/1CG + ov9PhaP/ToSk/0uCpP9GfKD/P3Wd/zpxmf8zbJX/MmqU/zRsl/84b5v/OW6a/zdrmP8xZZL/MGSQ/zBk + j/8uYov/NGuQ/zp1lP9AfZf/Qn+Y/0N+m/9DfZ3/QXyd/z16mv83dpT/NHOR/zNxkf85cpP/PXOX/z9z + mv8+cZr/QHSc/0N2nv9GeJ7/SHqf/0t8n/9MfZ//THug/016oP9NeaP/SXWf/0Ftmv8NGCT/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8cWX//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWX7/BAsQ/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/KlqE/ypdhf8pXYX/LGCH/y1giP8tX4j/LWCL/yxhi/8pX4j/JluF/yJY + gf8jWIL/JluF/ytfiv8wZI//M2aR/zFkj/8uYYz/KlyH/yRVgv8jVIH/JFaD/ypfif8yZ5D/N2yT/ztw + lv8+c5f/PnSZ/z5zmv8+c5r/P3Wc/z1zmv87cZj/OG2U/zZqkf81aZD/NGiO/zRpjv81aY7/NWqO/zZq + jv84a4//OGqP/zhqkP85apD/OWqQ/zpqkf86a5L/NmiR/zBjkP8pXIv/JFmG/yJZhv8nXor/LGON/zFq + kv82cJX/O3SX/z94mf9Bepv/Q3uc/0R8m/9Ee5r/RHua/0d+nf9JgZ//S4Of/0uDn/9Kgp7/SoGe/0iA + n/9GfZ3/Qnia/zxylf86cJP/N2mP/y1dhv8iT3v/FkFx/xxIdv8mU3//MWGK/zttk/8/dJf/RXyc/0mC + oP9MhaL/SoSf/0mCnf9IgJv/SYGd/02FoP9SiaP/Voul/1uNpv9dkKf/X5Gn/2CSpv9gkaX/YJCl/1+O + p/9di6n/WIeq/1GCqP9IfKX/QXmf/z14m/89eZn/RoCf/0yHo/9Ri6X/U4ul/1aMpv9Xjaf/Voyn/1SL + pv9QiKX/S4Sk/0V/of8/eZ7/OXOZ/zRtlf8xaJL/NGmU/ztvmf9DdqD/RXii/z9zm/83bpX/OHCX/zt2 + m/88dpv/QXuc/0aBnf9KhqD/Toqj/1GMpf9Vjqj/WI+q/1uQqv9ckKj/XpGn/16Qpv9ekKb/Xo+m/1yQ + qP9ajqn/Voup/1CHpv9KgqP/RH2f/0B5nP89dJn/PXKZ/z9ym/8/c53/P3Sd/z51m/89dpr/PHWX/zt0 + lf85cZP/NW2Q/zJojv8vZIz/KF2H/yNZhP8fVIL/HlOB/x9Ugv8jWIX/Kl+J/zFljv80aY//Nm6R/zRw + k/80cJT/N3KX/zpzmv84cZj/Nm2X/zRplf8yZpP/M2aU/zRnlf83apf/OGuV/zhrk/80aI//MWSM/yxe + if8mWYb/I1eG/yJXh/8kW4v/KGGP/y1nkv8xapX/N22Z/zdrmP8wY5D/KVqI/yJTgf8jVYH/JliF/yhc + h/8oXoj/J16G/yZdhf8kW4P/I1mB/yFVgP8hU4D/IFGA/x9Mfv8dRnn/GkF0/xtCc/8fR3f/Ik17/yZT + gP8pWYT/LV2F/ytcg/8qW4L/K1yB/yxdgf8xYIX/MmKG/zJih/8wYYb/LmCF/yxghP8rYYT/LGKE/y5j + hf8xZof/MWaH/zJoiP8zaYn/NGmL/zVqjP83bI7/OW2P/zltj/84bI//N2yO/zZqj/82aZH/NGeQ/y9i + jP8nWYT/IFF9/xxNev8ZS3n/G017/xxOff8eUID/IFKC/yNYhf8kXYf/LGaN/zJskf84c5X/PnmZ/0N+ + m/9Hfpz/SX6c/0x/nv9PgqD/UYai/0+EoP9NgqD/ToKh/06Co/9NgqP/SX6h/0N4nf87c5n/NG6W/y1p + kv8rZpD/L2mV/zJrl/8xaZb/LWOR/y5jkf8yZpP/NWiT/zltlP8+dJf/RX6b/0eBnP9IhJz/SoWb/0mD + nv9Igp7/RYCe/0F+nf88epj/OnWU/zxzlP88cZX/O2+X/zlsmP84a5j/OWyY/z1wm/9Bc5v/RHWc/0d3 + nP9JeJ7/SHeg/0h0n/9Hcp7/QWua/xQkNf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xxZ + fv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpTdf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woVIP8pWoP/KV2E/yxh + hv8vZIn/MWaL/zJmjf8xZo//MmiR/zBmj/8sYov/KF6H/yVbhP8nXYb/LGGL/zFlkP81aZP/NGeS/zFl + kP8tX4v/KFqH/yRUgv8lVYP/KFmH/y5hjP80aJD/OG2T/zxwlf8+cpj/PnOZ/z5zmv8+c5r/PHKZ/zpv + l/82a5P/M2eP/zFljP8wZIv/MGSL/zFli/8yZov/M2eM/zVojf81aI//NmmQ/zZoj/80Zo7/NGSO/zRk + j/8zY5D/LF6M/yZZhv8fVIH/IFiE/yRdiP8pY4z/L2qQ/zVwlP86dZf/QHqa/0R+nP9Ffpz/R3+d/0d/ + nf9JgJ7/SoKf/0yEoP9NhaD/TIWg/0qDoP9JgaD/SICg/0Z+nv9Cepv/QXea/z91mP89cJX/M2OL/ydV + fv8cSHT/FD9s/xpGc/8nVX//MmOK/z1xlf9Depr/SYGf/0yEov9NhqL/SoOe/0eAnf9Gf5v/SYGd/0+F + of9TiaT/WY2n/12QqP9gkaf/YJKl/2GRo/9gjqT/Xoym/1uIp/9Wg6j/Tn2o/0V3o/8+dJ3/OXOY/z57 + mf9HhJ//Touk/1KLpv9Ui6f/Voun/1eNp/9Wjaf/VYyn/1OLp/9Oh6b/SIKk/0J9of86dJv/M2yV/y5n + kf8vZpH/NGmV/zlumv84bZj/NWqV/zNqk/82bpj/O3ac/0V/nv9LhJ//Toeg/06Iof9OiqP/Uoyl/1WN + p/9Yj6r/WpCq/1ySqP9dkKf/Xo+n/16Opv9ekKf/XZCp/1yQqv9WjKn/UYip/0uDpf9GfqH/QXie/z1y + mv88b5r/O26Z/zlumP84b5f/OHCX/zdxlf83cpT/OXOU/zlyk/83b5L/NmyR/zJokP8vZY7/K2GM/yZc + iP8hVoT/IleF/yVaiP8sYY3/MWeR/zRrkv80bpL/NnKV/zdzl/86dJr/OnOa/ztzm/85b5n/NGmV/zFm + kv8xY5H/MWOR/zNlk/80ZZL/MmSP/zFjjP8vYYv/LF6J/ydZhv8hVIP/H1SF/x9Xhv8kXYv/KWOQ/y1m + kf8zaZb/NGmW/zBjkf8pW4n/JViF/yVZhP8nXYf/LGOM/yxmjf8rZoz/KmOL/yliif8oYIj/KV6I/yZZ + hf8kVYT/I1OE/yBLfP8aQXP/GkBx/xtDcv8eSHb/IU15/yNSff8mVn//KVqB/ypbgf8rXIH/Ll6D/zFg + hf8yYoX/MmKF/zBihv8vYob/LGGE/ythhP8rYYT/LGKE/y9khf8wZYb/MGaG/zFmiP8zaIr/NGmL/zZq + jv83a5D/OGyQ/zZrj/81apD/NWqP/zRokP8yZI7/LV+J/yhbhf8kVoD/H1J8/xxPev8bTXn/G057/xxO + fP8cTn3/HlJ+/yZbhP8tY4v/NGuQ/zpylP8+d5f/Qnua/0V7mf9Ie5v/Sn2c/05/n/9NgJ//TICe/0p+ + nf9Kfp7/S3+h/0t/of9Ge57/P3Wa/zhxl/8wbpX/LGuT/ytokv8taZT/K2aT/yhij/8oYI7/LmSS/zZr + l/89cZr/Qnec/0h/n/9LgqD/TYag/0+IoP9QiKD/T4eg/06Gof9LhKL/R4Kh/0SAnv9De5n/QXaX/z9z + l/86bpb/NWmU/zFkkv8vY5H/M2eS/zlslv88bpf/Pm+X/0Bwmf9DcZz/Q2+b/0Fsmf88ZpX/GS5G/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Hll//xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/FTxX/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/FSxC/ytchf8sYYX/MWeJ/zNpjP80ao3/NGmO/zNpkP8zaZH/M2mS/zFm + kP8sYov/KV+I/yddhv8sYIr/MWWP/zRokv83bJX/M2eR/zBjjv8rXYr/J1mH/yVWhf8lVYb/J1eH/y1e + i/81Z5D/Om2U/zxwlf89cZf/PnKa/z1wmf86bpb/N2yU/zNnj/8wZIz/LmKJ/yxfh/8rX4b/LF+H/y5h + if8wY4r/MmWL/zNmjf80Z47/NGaO/zFjjP8wYIv/L12M/yxbiv8pWIf/I1SB/yFWgf8iWYT/JF6I/ytm + jf8wbJD/NXGT/zt3lv9BfJn/RYCc/0iCnv9Jgp//SoGe/0yCn/9MhKD/TISg/02Fn/9LhKD/SYKg/0iB + of9GgKD/RX6e/0R9nf9EfJ3/RHqd/0F1mf84aJD/LFmA/x5Kc/8WQGz/FUBt/x5Mdv8sXYT/OGyP/0J4 + mf9IgJ7/TIWh/02Hov9MhaH/SIGf/0R+nP9Ff53/SYKh/1CGpf9YjKj/XY+o/1+Qpv9hkKP/YY+i/2GO + o/9eiqT/WoWl/1N/pv9LeaT/QHKf/zdumv84c5n/P32b/0iGoP9Qiqb/VIqp/1aKqf9Wi6f/V42n/1eO + p/9Wjqf/VI2n/1CKp/9Lhqb/RoGk/z14n/8zbZb/LmiS/yxlkP8wZpP/MGWT/zBlkv8vZJH/MmmU/zZt + l/8+eJz/S4Of/1OJoP9UiqL/U4qj/1KLpf9Ri6X/VYyn/1eOqf9ZkKn/WpCo/1yPp/9cjab/Xo+n/12P + qP9dkar/Wo6p/1WLqf9RiKj/TISn/0Z/o/9DeqD/PnGb/zhrl/83apb/NWuV/zNrlP8zbZP/M26S/zZy + lP86dJX/O3WV/zx0lv86cZX/OG6U/zZrlP80aJP/LmOP/yhdiv8mXIr/KF6M/y1jkP8yaJL/NGyS/zRu + kv80cJP/N3OX/zl0mf86c5r/OXGZ/zdtl/8yZ5L/L2OQ/y1gjf8tX43/LV+N/y1fjP8tX4r/LF6I/yxe + iP8sXon/K1yJ/yZYh/8fU4P/HVSD/yBXhv8kW4j/KWCN/y1ikP8uYpD/LmCO/yldiv8lWYb/JVuG/yti + jP8vaZD/MW2S/y9skf8va5D/LmmQ/y9nkP8tY47/Kl+L/yhaif8mV4X/JFB//yBJd/8ZQXD/GUBw/xxF + c/8eS3f/H054/yJRev8jVHv/J1h+/ytbgP8uXYL/MF+D/zBfhP8wYYT/LmGE/yxghP8sYYT/LGGE/ypg + g/8sYYP/LWKE/y9khf8uY4T/L2OF/zBkiP8yZor/NGiN/zVpj/81aY7/NWmQ/zVpkP81aJH/MWWO/yxg + iv8pW4b/KFyF/ydbg/8lWYH/Ild//yBTff8eT3r/HUx5/xxLef8eTnr/JFR//yteh/8yZ43/OW2S/z1z + lf9AdZb/QnaX/0V3mf9JeZz/S3ue/0p8n/9Ie57/R3qc/0Z6nP9Hep7/RXid/0N3nP8+dJn/NnOX/zFx + l/8vb5b/MG+X/yxpk/8nY47/IVyI/ydhjf8waJT/OnGb/0F4n/9Jf6L/TYSj/0+Gov9RiaL/VIyk/1SM + pf9Vi6X/U4im/1CGpv9MhaP/SoKf/0l/nP9IfJz/Q3eb/ztvl/8zZ5H/LWGN/ytfjf8uYo//MGSQ/zVo + kv83aZP/N2mT/zpqlP87aZX/OmWU/zRfj/8XLET/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8aSmj/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xtZfv8OJzf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8gRWP/LWCH/zBl + if8za4v/NW2N/zVsjv81a4//NGqQ/zVqkf80apL/M2iS/y9lj/8rYIr/KF6H/ytgif8vZI3/M2iR/zVq + k/80aZL/MWWP/y1hjP8oW4n/JFaF/yJTg/8iUoP/J1eI/y9gjv81Z5H/OGuS/zltk/85bZT/OWyV/zdr + k/80aJH/MGSN/yxfiP8qXYX/KFuD/ydbgv8nWoP/KVyF/yxfh/8uYYj/L2KJ/zBiiv8xYov/MWCL/y9c + iv8sWIj/KFSE/yNSfv8iU33/I1aA/yVbg/8pYYn/LmmO/zNvkf84dZT/PXqX/0N+mv9HgZz/SYKd/0uD + n/9MgZ//TIGf/0yCnv9Lgp7/S4Oe/0qCn/9IgaD/RYCf/0WAn/9Ff57/RoCf/0d/oP9IfaD/Rnid/z5u + lf8yX4j/IEt1/xZAbP8UQGz/G0pz/yhagP82ao3/QHeX/0V+nf9LhaL/TYai/0yEov9KgaL/RX6g/0N9 + n/9GfqH/TYWl/1WKqP9ajqj/XY6k/1+Oov9gjaL/YYyj/16Jpf9ZhKf/Un2l/0Z1oP86bpr/NGyX/zd0 + m/8+f57/SIai/1GJqP9Yi63/WIqr/1eLqP9Yjqf/WY+o/1ePqP9Vjqf/UYul/02Ipv9JhKb/QXyi/zp0 + nP8ybJX/LWaR/ytjj/8qYI7/KV6N/y9mlP8za5f/OHCa/0V9nf9Qh6H/Vouk/1iLpv9YjKb/VYum/1SL + pv9VjKf/Vo6o/1iQqP9Zjqj/Woyn/1uNp/9cjqj/XJCp/1qPqf9Xi6n/VImp/0+Gp/9Kg6X/Rn6j/0N5 + oP8+cpz/OG2Y/zNolP8yapP/MmuS/zBskP8zbpL/OHOV/zx3l/9AeZn/QXia/0B2mv8/dJn/PHGZ/zpt + mP80aJT/LWKP/ylfjP8qX43/LmKQ/zFokP8za5H/M2yR/zJtkf81bpT/NnCW/zdxl/82bpb/MmmS/y5j + jv8pXYr/KFyJ/ydbh/8nWof/KFuH/ylbh/8oXYb/Kl6H/yxgif8uYIz/KlyK/yNXhv8eVIP/HFKA/x9S + gv8iVoX/KFqK/ytcjP8qXYr/JlmG/yNZhP8nXYj/LWaO/zJuk/80cZb/M3CU/zJvlP8ybpX/MmyU/zFo + k/8sYo7/Kl2M/ylbif8oVoL/IU15/xtGcv8YQW//G0Zz/x9Md/8gUHn/H1B4/x9Rd/8hU3r/Jld9/ypb + gP8sXIH/LF2B/yxdgf8rXoL/Kl6D/ytghf8rYYX/LGGE/yxihP8tY4T/LmOE/y9jhf8tYYX/L2OH/zBk + if8xZoz/MmaN/zFnjv8yZ4//M2eQ/zJmkP8wYo3/Kl6I/yhdhf8oXYX/KF6E/ypghv8rYIb/KFyD/yVU + fv8hTXr/Hkp3/x5MeP8hUHv/J1d//y5ghv81aI3/OmyQ/z1wkv9AcZX/QnOY/0R2mv9Fd5z/Rnie/0V4 + nf9Ddpv/Q3WZ/0J0mf9Bc5n/P3OY/z11mf85dpn/NXWZ/zZ1mv81dJr/MG6W/yZkjf8lYoz/J2SP/zFs + lv88dZ3/RH2h/0uFpf9Ph6T/UYmj/1OKo/9VjKX/WI6n/1iOqf9Xi6n/VImo/1CHpP9OhaH/TYOe/0yC + oP9JfqD/P3Oa/zRokv8uYo7/LGCN/yxgjf8vZI//MGaP/zJnkP8xZJD/MmSP/zNij/8zX47/LlmJ/xYu + Sv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xlHYv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/wYRGP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/y1ghv8xZYn/M2qL/zVtjP82bo3/Nm6N/zVtjv80a4//NmuS/zZr + lP81apT/MGWP/ythi/8nXYf/KmCJ/y5jjP8xZo//NGmS/zRokv8yZ5H/L2SO/ypeiv8kV4X/IFGB/x5P + gP8jU4X/KVmK/y1gjf8xZI3/M2aN/zRmjv8zZY7/M2WP/zFjjf8tYYr/Kl2G/yZZgv8kV4D/JlmB/yZZ + gf8lWIL/KFuF/ypdhf8rXYX/KlyE/y1bhv8vWYf/LlaH/ylSg/8jTn3/IEx5/yFQe/8kVn//KFyD/y1i + iP8xao3/N3GR/zt3lP8/e5f/RH6a/0iBnP9LgZ7/TIGf/0yAn/9MgJ//S3+d/0qAnv9Kgp7/SYKg/0aA + n/9Ef53/Q3+d/0WBn/9IgqD/SYKh/0p+of9Jep//RXWc/zpnkP8sV4L/HEhz/xNBbP8aSHP/JVd+/zNp + jP88dJX/Q3yb/0mCoP9OhKP/TYOj/0h+ov9Ee6H/Qnqh/0R8ov9KgaT/UYen/1aKpv9ajKP/XIuh/16L + ov9eiaT/XYen/1eCqf9MeaP/QHCc/zVqlv82cJn/OXic/z+AoP9KhqP/U4qn/1eLq/9Yiqv/WIyo/1mO + p/9akaj/WpKp/1eQp/9Ujqb/T4ql/0uGpP9FgaT/P3qg/zlym/8yapT/KWGN/yddi/8rYI//MGaU/zZt + mv89dpv/R3+f/1OKpP9Yjaf/WYyo/1qMqP9ajaf/WY2n/1mNqP9Yj6n/WI6p/1iNqf9Zi6n/Wo2o/1qO + qP9aj6n/WIyp/1WKqf9SiKj/ToSm/0qBpP9HfqH/Q3mf/z50nP84b5j/NG2V/zJrlP8ybZP/NHCT/zh0 + lf88d5f/QXub/0V9nf9Ifp//Rnye/0R5nf9Cd5z/PnKb/zlsl/8yZZL/LWCN/ypdiv8sYI3/MGWP/zBo + j/8waY//MGmO/zBqj/8ya5H/MmuS/zJqkv8uZo//LGGM/yhdif8kWIT/I1iD/yRXg/8lWYT/J1yG/ylf + h/8rYoj/LmSM/y9kjP8sYYz/JlqI/yNVhv8fUYL/Gkt9/x5Ogf8jUoT/J1eH/yZYhf8kV4P/JFmD/yhg + iP8uZ43/M2+T/zVylf81cZX/NHCV/zRvlv81bZf/MmqV/y9lkv8tYI//LV2M/ylXhf8iT3v/HEh0/xtG + cv8dSnT/IU96/yRTff8iVHz/H1J5/xxPdf8gUXj/IlR6/yVXff8nWX7/KFqA/ydagP8qXoT/K2CG/yxh + h/8tYoX/LmOF/y9khf8wZIb/L2OG/y5ih/8uYof/L2OJ/zBli/8wZYz/L2WM/y9ljf8vZY7/L2SO/yxg + i/8qXon/KV6G/ypghv8sZIf/L2eJ/zFoiv8yZIr/LluF/yhTf/8iTXj/HUhz/x9Ldv8jUXn/KViA/zBg + hv82Zov/OWqQ/z1tk/8/cJX/PnGX/z9zmf9Ac5r/P3KZ/z9yl/8+cpf/PnKX/z1wlv8/dJj/PXeY/zt5 + mf88epz/O3md/zp4nf80cZj/LWuT/ytokf8sapP/MXCX/zp3m/9FgKL/S4Wk/0+Jpf9Ri6T/U4uk/1WM + pf9XjKb/Wo2q/1qNrP9WjKr/U4ml/0+Hof9OhZ//ToOg/0p+nv9Cdpz/OGyV/zFmkf8uY4//L2WQ/zFp + kf8yaZH/M2mR/zFmkP8vYo7/L2CN/y5di/8rWIj/HDxh/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/HUtk/xtafv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8bVXf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8KFyD/MGWH/zZr + jP83bo3/N26O/zdtjv83bY7/NW2O/zVsj/82bZL/OG6V/zdslv8yZ5H/LGGL/yheiP8oXoj/LGGL/zFm + j/80aJL/NWmT/zNnkv8xZZD/LWKM/ydah/8gUoH/HU1//x9Ngf8jVIX/JliG/ypdhv8sX4f/LWCI/y1f + h/8sXof/LF2H/yxeiP8qXIX/JlmC/yVYgf8mWYH/J1qC/yhbhP8nWoP/KFuE/ydagv8pWIH/KVOB/yxR + gv8oTn//I0p7/x1Gdf8dSHb/H0x4/yNTff8pW4P/L2KI/zRqjf86cpH/PneU/0B6lf9EfZj/R36b/0t+ + nf9Mf5//TX+g/01+oP9Kfp7/SX+f/0iAoP9Gf57/RH6c/0J8m/9Ef53/R4Kg/0iEof9KgqL/S4Gi/0t9 + of9JeJ7/Q3CZ/zdjjf8qV4L/Hk13/xhJc/8iV3//LWSK/zdwk/9AeJj/R3yb/0t/nf9LfaD/Q3ie/z50 + nv88dJ7/Pneg/0V8of9MgqL/UYaj/1WIof9Xh6D/WYei/1qGpP9YhKf/UH6k/0Nznf83aZT/NGyW/zdy + mf86epz/QoGf/0uGoP9TiqT/VYql/1eLpv9YjKj/Wo+n/1yRqP9ck6j/W5So/1aQp/9Sjab/Toml/0mE + pP9Ef6P/P3if/zdul/8uZZD/KV+M/yxhjv8wZZL/N2+Y/z54m/9HgJ7/UIek/1eLqf9ajav/Wo2p/1uN + qP9ejqn/Xo+r/1qOqf9Zjan/Woyr/1qNq/9ajqr/WY6p/1eLp/9Wiqj/VImp/1CHp/9Mg6X/SYCj/0d9 + oP9CeJ3/PXSa/zhxmP82cZf/NnGX/zdzl/85dZf/Pnqa/0J8nP9Gf5//S4Kh/0uBov9Lf6H/SX2f/0V5 + nv9Ddp7/P3Gb/zhqlv8xYo//LF6K/ytdif8sYIr/LWOL/y1ljP8uZ43/LmiO/y1njf8waY//L2iP/y1m + jv8rYoz/J16J/yRbhf8hV4H/IVeB/yVbhP8oXof/LWOL/zBojv8yapD/MmqP/zFojf8sYIv/KFqJ/yZU + hv8iT4L/H0x//yFNgf8iUID/IlKA/yJUgP8lWoP/KWGI/zBpjv82cJT/N3OW/zZxlf81bpP/Nm6V/zZu + lv81a5f/MmaV/zBgkv8uXI//J1WG/yJQfv8dS3f/HEl0/x9Mdv8kU3z/KFiB/ydagv8iVn3/HlF5/xlM + c/8cTnX/H1F4/yJUe/8kV37/J1qC/ypfhf8tYon/LmOH/y5ihv8vY4b/MGWI/zFmiP8xZYj/MWWJ/zBl + if8vZYn/L2WK/y5ljP8uZYz/LWSL/yxkjP8rYov/KmGK/ytgif8rYYn/LmWK/zJpiv80bYz/NmuN/zdn + i/83Yov/MVyF/yhTfP8hTHb/G0Vv/x5Jc/8lUXn/K1mB/zJgiP82ZY3/OWmR/zpsk/85bZX/OW6W/zhu + lf84bZP/OG2T/zlxlv86cpj/PHSZ/z92mf9AeJn/PnmZ/z56nP8/fJ//PXqe/zh1m/8zcJj/MG+X/zBv + lv8zcpf/Onib/0F/oP9JhKP/T4ml/1OMpv9VjKX/VYuk/1iKp/9Zi6j/Woyq/1iMq/9Wi6f/U4qk/1GH + oP9Ngp3/Sn2c/0J2mv86b5b/NGmS/zFnkf80bJT/N3CW/zdwlv81bZT/NWqS/zNnkP8xY4//Ll+M/yta + if8cP2L/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8aQVb/HFt//xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xU+WP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xQuQf8yZ4n/N22N/zxxkf87b5H/Om6R/zdskP81a4//NmyR/zhu + lP85bpb/N2yW/zNok/8uY47/KV6J/yhdiP8rYYr/MGaP/zRpkv81apT/NWmU/zNnkv8vY47/Kl6J/yNU + g/8eS37/Hkx+/yBOf/8jVIL/JVmC/yhcg/8oXYL/KFuC/ydagf8nWYL/KFmD/ypbhP8pWoL/KFqC/yhb + g/8sX4b/LWCI/yxfh/8oW4T/J1iC/ylWgP8rUYD/Jkl7/yFEdv8bQXH/GUFw/xlDcv8cR3X/I1J9/ypa + gv8xY4n/N2uN/ztwkv8+dZT/P3eU/0N5lv9Fe5j/SHqa/0x8n/9OfqL/Tn2i/0p8of9HfaH/RX2f/0J7 + m/8/eZj/QXya/0R/nf9HgqD/SYSh/0yDof9NgqL/ToCj/0t7oP9HdZz/P22V/zRjjP8pWoT/IlV//yFX + gf8pYYv/MmyT/zxylf9Ed5X/SHqY/0N2mv88cZn/NmyX/zNql/83b5n/PXWc/0R8nf9Kf5//ToGe/1GC + nv9SgaD/U4Kk/09+pf9Gdp//OWyW/zJokv8xa5L/M3GV/zp4mv9Cfp3/S4Wf/1CJof9TiqH/VYuk/1iM + pv9ajqf/XJGm/12Up/9blKf/WJKo/1WPp/9Pi6b/S4el/0eCpP9BeqD/OXCZ/zJok/8tYo//LGGP/y9m + kf81b5X/PHeZ/0V/n/9OhaX/VImp/1eLqf9ZjKn/W4yp/12Mqv9fjqn/XI6n/1mMp/9ajar/W5Cs/1uQ + rP9YjKn/Vomn/1SIp/9Th6b/UIWl/0uBo/9GfJ//Qnqc/z93mf86c5f/OXOX/zp2mf87eJv/Pnqc/0J+ + nv9FgJ//SIGf/0yDov9OhKP/T4Sk/0+Do/9NgaH/SX2f/0Z6n/9Cdp3/PG6Y/zVlkv8sXYr/KFqH/yhc + hv8nXIb/KmKJ/yxli/8tZoz/L2iO/y9ojv8vaI//L2iR/y1lj/8pYYv/Jl6H/yRbhP8iWoL/JFuE/ylh + if8wZ4//NW6U/zdvlP82b5H/NWyP/zJnjf8uYIz/K1mL/yhUhv8lT4L/IEt9/x9LfP8fTnz/IFR+/yRZ + gf8pYob/MmyQ/zdxlP86dJf/OXGV/zhvlf84bpX/OW+X/zRolv8xYpT/L12S/ylXi/8kUoP/IE59/x1L + ef8dSnb/IU55/ydWf/8sXIT/K12E/ydbgv8jVn7/HlF5/xlMdP8aTHX/Hk95/yJUfv8oW4T/LF+I/y5i + iP8vY4j/MGSI/zFmif8zaIv/M2iL/zNpi/8yZor/MWaK/zFni/8wZov/L2WL/y5ljP8sZIv/K2SK/ypj + iv8rY4r/LGSL/y5li/8zao3/Nm6O/zhwj/85bo7/OmqO/zpnjf82Y4r/MVyE/yhTe/8iS3P/HUZv/x9J + cv8mUnv/LVqD/zRiiv80ZI7/NGeQ/zRpkv80aZH/MmmP/zFojv8zbJH/Nm+T/zhzl/89d5r/P3ib/z95 + mv8/eZj/QHub/0J8nv9BfJ//PXic/zdzmv80cZn/MXCY/zNymP84dpv/QH2e/0iEov9OiKX/U4un/1aN + p/9XjKf/WIun/1iJqP9Zi6r/WIuq/1iNqv9Yjaj/VIij/1CEn/9Lf5r/RHeY/zxwlf81a5L/NW2U/zdw + lf87dJj/PXWZ/zxzmP86b5b/OGyU/zZqk/8zZZD/L2CM/x5DZP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xg2Rv8bWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/ECk5/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/H0Zj/zFm + if84bI//PW+S/z9wlP88b5P/OGyS/zdqkf82a5H/OGyU/zhslf83a5X/M2eS/y5hjf8oXIj/J1yH/ypf + if8vZY7/MmiR/zRpk/81aZT/NmmU/zJlkf8tXoz/JlSF/yFNf/8eS33/IE9//yNUgf8mWYL/J12B/yZc + gP8lWn7/JVd+/yVWf/8mV4H/KFmC/ypbhP8rXYT/LV+G/zBjif8yZYz/MWSL/y9hiP8tXIX/L1iD/y1R + f/8kR3b/Gj5t/xY7av8XPmz/Fj9u/xxGc/8jUHr/K1uC/zFjiP84ao7/PG+S/zxxkv89c5P/QHWU/0N2 + lv9Gdpn/Snic/016of9Me6L/R3mh/0N5n/9AeZz/PHaX/zx3lv9AfJv/RIGf/0eDof9KhKH/TISi/06D + of9PgqL/TX6i/0l5nv9Ccpn/OGqS/y9ji/8oX4f/J1+I/yljjv8uaJL/NmyU/z9xk/9BcpX/PW+W/zZq + lv8uZJH/KmGP/y5mkv83b5b/PXaY/0F5mP9Gepn/Snub/0t7nv9Le6L/RHaf/zptmP8yZ5L/L2iQ/yxp + j/8xb5P/OHSW/0B7m/9Ig6D/T4ii/1OKo/9Vi6P/V4yl/1qPpv9ckqb/XZOm/1yUp/9akqf/Vo+m/1GM + pv9NiKb/SIOk/0J8oP87c5v/M2qU/y9lkP8sYo7/LWeQ/zNuk/86dZn/Q3yf/0uCpP9Qhqf/VIio/1aJ + p/9aiqf/W4qn/1yMpv9ajKT/WYyj/1uNqP9cj6v/Wo2r/1iKqf9Uh6b/UoWl/1CEpP9MgqL/Rnye/0F4 + m/8+d5j/O3WX/zp1l/86d5j/PXqa/0F9nv9GgaH/SYWj/0uEov9NhKH/T4Wi/1GGov9Sh6P/Uoak/0+D + ov9LgKD/SH6f/0R5n/8/c5v/NWeS/yteiv8mWYX/JFiD/yRag/8nXob/K2OK/y9ojv8xapD/M2yS/zRt + k/80bpT/MmuT/y9okP8qYov/J1+I/yZdhv8nXof/KmKK/zFpkP81bpP/N3CU/zhxk/83bpL/NGmQ/zJk + j/8vXo3/K1eJ/ydRhP8gS3z/HUp5/x1Mef8eUnv/I1mA/yxkiP80bJD/OXKW/ztzl/87cZb/Om+V/zpu + lv83apT/MmSU/y1ekf8nVov/IlCE/x5Mf/8dS3z/G0l5/xxKd/8hUHr/KViB/y5ehf8vYIf/K12E/yhb + g/8jVn//IFF8/xxOef8cTXn/IVJ9/ydYg/8sXon/LmGJ/zBjiP8xZIn/M2iL/zRpjP81ao3/NGqN/zRq + jf8zaYz/MmiM/zFnjP8wZ43/LmWL/yxkif8pY4j/K2WJ/ytmiv8sZov/MWqO/zZtj/86cpH/PHOS/z1y + kf89b5D/O22P/zlojP83Y4n/M12E/ytUfP8kTXX/IElz/yBKdP8nUn3/LFmE/y9fif8vYYz/L2SN/y1k + jP8sZYv/LWeN/y5qjv8ybZH/OXOW/z13mf8/eZv/PniZ/z95mv9CfJv/RH6e/0J8n/8+eZ3/OXSa/zVx + l/8ycJb/M3CW/zd1mf8+e5z/RoKg/02IpP9Ri6b/VY2o/1eMqf9ai6n/Woup/1qLqf9ai6r/Woyq/1qM + qf9Yiqf/UoWh/0x/nf9GeJj/PnGU/zlulP83b5T/OXKV/zx0lv8/d5j/P3eZ/z10mP88cZf/Om+W/zls + lP8yZY//KFh//wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GDZG/x1bf/8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxbfv8KGCH/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8qXIX/MGOJ/zdpjf87bJD/PW6T/zxulf86bJT/NmmS/zZp + kf81aJH/NGeS/zVnk/8xYpD/K16L/yZahv8kWIP/JVqF/ylfif8tZI3/MGeP/zFnkP8zZpH/NGaT/zBe + j/8pVYj/Ik2B/x9Lff8gT33/JFWA/ydbg/8oXYL/Jlx//yRZfP8kV3z/JFd9/yZXgP8oWYL/K1yF/y5f + hv8yY4n/M2WK/zRmi/81aI3/NWWN/zVhiv81Wob/K1B7/yFEcP8YPWn/Fjxp/xQ7av8YQG7/HUl0/yRQ + ev8qWID/MWGH/zdpjv85bJH/O26R/zxwkv8+c5T/QHWV/0N1mP9IdJz/SXae/0d2n/9CdZ7/P3Sb/zxz + mP84c5T/PXmY/0F+nP9FgZ//SYSi/0yGo/9OhaP/T4Wj/06Dov9MfqH/SHqe/0F0mv84bZT/MGeO/yxk + jP8rZY3/LGWP/y5mkv8xZ5P/NWmS/zZqkv82aZP/MWeT/yxij/8nX43/KWON/zFqkf83cZT/PHSU/z5z + lP9BdZj/Q3Wc/0BynP85bJn/MWaT/y9okv8saZH/LWuR/zFvk/84c5X/PniY/0aAnf9Oh6P/Uoml/1SL + pv9XjaX/W5Cl/12Spv9dk6f/XJOo/1mRqP9Ujqb/UIul/0yIpP9Ig6T/Qnyg/zx0mv81a5T/L2WQ/ypk + jf8qZY3/LmuQ/zZyl/8/eZ3/R4Ci/02Epf9Rhqb/VIen/1eHpv9XiaX/V4uj/1eMov9ZjKX/W4ym/1mM + qf9Xiqn/VYen/1OFpP9Qg6L/TICg/0Z7n/9Bd5z/PXWY/zp1l/87dpb/PHiZ/z57mv9Cfp7/RoKg/0uH + pf9OiKX/T4ek/1GHo/9ShqH/Uoah/1OHov9ShqL/UISi/02Dof9KgKD/RXyf/z92nP81apT/LGCL/yVZ + hf8iVoH/JFqD/yZehf8rY4n/MGmP/zRuk/82cJX/OHKX/zhzmP84cpn/NW6W/zFqkv8rY4z/KF+I/ydg + h/8qY4r/MGmQ/zRtk/83cJT/OHCU/zhulP82a5P/NGeS/zJikP8uW4z/JlKE/x9Le/8bSXf/Gkx3/x1S + ev8jWoD/K2SJ/zRskf86cZb/PHOX/zxxl/88bpX/OGmT/zJkkf8sXY7/J1eK/yBQhP8bSn7/HEp9/xpJ + ev8aSHj/G0p4/yFRe/8oWID/Ll+G/zBih/8vYYX/Kl2D/yhahP8mVoL/I1OA/yBPff8gTnz/JVWB/ypb + hf8tX4f/L2GI/zBjif8yZov/NGqN/zZsj/82bI//NWuO/zRqjf8yaY3/MmmO/zBnjP8tZYv/K2OI/ypj + h/8qZIj/K2aK/zBqjv80bpH/OHCT/z10k/9BeJX/QXeV/0B2lP8+cpL/PG2P/zpojP84Y4n/Nl+G/zBY + gf8mT3r/Ikt3/x5Idf8iTnv/JlWB/yhahf8qXof/KGCI/yliif8qZov/LmqO/zRukv85cpb/PnaZ/z54 + mv8/eZr/QHqa/0N8nP9Ffp//RHyf/z94nf87dJr/NXCX/zJtlP8yb5T/NXKW/zt4mv9Df5//Soaj/0+K + pf9Tiqf/Voup/1qMqv9bjav/XIyq/1yLqf9ciqn/Womo/1eIpv9ThaP/TH6e/0V3mf8+cZX/Om+U/zhu + lf85cZX/PHSU/z53lv8/d5f/P3WX/z1yl/87b5X/OGyU/zJmj/8rX4n/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8bOUn/HFp+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/HFp+/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BxEZ/ydZ + gv8uYIb/NGWJ/zhojf85aY//OWqS/zdpkv80ZpH/MWSP/zBjjf8vYY3/L2GO/y1ejP8oWYj/IlSC/yBS + gP8fU3//IleC/yVchf8qYYn/LGKM/y1hjf8vX47/MFyP/ypVif8iToH/Hkt8/x9OfP8jU3//J1mC/yhc + g/8mW4H/JFl9/yNXe/8kVn3/J1iA/ypbhP8sXYX/LmCH/zFiiP80ZYr/NGWJ/zRliv82ZIz/OmSO/zBY + gf8nTHT/HUJp/xxCa/8aQWz/GkJt/xtFcP8fSnX/Ik94/ydVff8uXoX/M2SL/zdpjv85bJD/O2+S/z1y + k/8+c5T/QHOX/0Nzmv9FdJ3/Q3Sc/z9ymv87cJj/Nm6T/zt0l/8/epr/Qn+d/0aCoP9JhKL/TIWj/1CH + pf9QhaX/ToKj/0t+of9Fep3/PnWZ/zZuk/8ybZL/LmuS/y1pkf8vaJL/MWeS/zFmkv8tY4//LmSO/zBl + j/8vZZH/LGSQ/y1nkf8vapH/MWyR/zVwkf85cpP/O3KU/zpvlf85bZb/NWqW/y9mk/8vaJb/LmmV/y5r + k/8yb5b/NnKW/zhzl/88dpb/QnuZ/0mBn/9QiKT/U4ql/1eMpv9aj6X/XJGn/1yRqP9akan/WI+o/1OM + pv9PiaX/TIal/0iCo/9Be5//OnOZ/zVslP8wapL/K2aO/ydljP8raI7/MWyS/zt1mf9EfZ//SoKj/06E + pf9ShaX/VIel/1aJpf9Wi6P/WIyl/1mMpv9Zi6j/V4mn/1OHp/9QhKX/ToGi/0x/n/9GeZ7/QHSc/z1z + mv87c5j/OnWY/zx5mf9BfZ3/Q4Cf/0aDof9LhqT/T4il/1GJpv9SiKT/U4ij/1SHov9UhqH/VIef/1OG + oP9RhqD/T4Sg/0uAn/9GfJ7/P3Wb/zdul/8uZI7/JluG/yRZg/8kWYL/J1+F/yxliv8ya5D/NnCU/zlz + mP86dJn/O3WZ/zt1mv88dZv/OHCW/zNrkv8tZYv/J1+G/ytki/8vaI//M2yT/zVulP82bpT/NmyV/zZr + lP81aJP/M2SS/y1cjP8mVIX/Hk17/xpKd/8aTnf/HlV7/yRdgv8qZIn/MmuQ/zhwlP88cZf/PHCW/zps + lP80ZZD/KlyL/yVXiP8hUoT/G0t//xpKfv8cS37/HEx8/xtLe/8cTHv/IVF8/yhYgf8wYIb/MWOI/zBj + hv8tYYT/K16D/ytchf8oV4T/JlOB/yVRgP8kU3//KFiC/ytchP8sXYX/LWGG/y9liP8zaYz/NmyP/zdt + kP81bI7/NWuP/zRrj/8yao//L2eM/yxkiv8pYob/KWKG/ylkh/8uaYz/M26R/zdxlP86cpT/PnWU/0J5 + lv9EfJj/Q3qX/0F3lf8/cZH/Pm6Q/zxpjv86Z43/NmCJ/y9YhP8nUH7/Hkh2/xlFcv8bSXb/H1F8/yJW + gP8lXIP/JmCG/yllif8wa47/OXGT/z1zlv8/dpn/QHia/0F6m/9DfJz/RH2d/0V9nv9EfJ//RHug/z93 + nv85cZr/M2yU/zBrkv8zbpP/OnaZ/0F+nv9HhaL/TIil/1CJpv9Viqf/WY2o/1uMqP9bi6j/W4qo/1qJ + p/9Yh6b/VYWk/1GCof9Ke57/QnWZ/ztvlP83bJP/N2yV/zhvlf86c5X/PXSU/z50lf8+c5b/O3CU/zhs + kv8zaJD/LmOM/ypfiP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xcwPv8eXH//Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8ZRmH/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8UKj3/KVuF/ypcgv8wYYb/MmOJ/zRji/8yZI3/MWSN/y9i + jf8tYYz/Kl+K/ypeiv8sXov/KluK/ydYh/8gUYH/HEx9/xtNfP8cUHz/IFWA/yRahP8mXIb/JlmG/yhW + h/8oVIf/JVGE/x9Lff8cSXn/HEx5/yBRfP8lVoH/J1qD/yZagv8jV37/IlV8/yRVff8nWID/K1qE/yxc + hf8tXoX/L2GG/zBhhf8wYIb/MF+G/zFdhv8vWoP/K1N6/x9Fa/8gRm3/IEdv/yFJcf8kTXX/JE93/yFM + dv8fSnT/I1B5/ypXgP8wYIj/NGWM/zdpj/85bJD/O26S/ztwlP88cZX/PXKW/z9zl/8+c5n/O3CX/zdt + k/83cJT/PXeZ/0B8nP9EgJ7/R4Kg/0mDof9Mg6L/ToWj/0+Fpf9Og6T/SX+h/0N6nP87c5f/OHKX/zVx + lv8ycJb/NHCW/zVtlf80apX/MGaR/y1kj/8rY43/LmeQ/zBpkv8ya5X/NW+Y/zhzmP85dJf/OnSW/zt0 + lf88c5b/Om+V/zRqk/8uZI//LWWS/y5pl/8wbZr/NHGa/zdzm/87dpv/OXSY/zp0lf89dpX/Q3ua/0qB + n/9Sh6T/VYqk/1aLpf9YjKb/Wo+p/1iPqv9Wjqn/Uoqn/06Hp/9LhKb/Rn+j/z94nv85c5n/Nm+W/zJt + lf8vbJP/LWqR/yxpjv8xbJH/N3CV/0F5m/9If6D/TIKj/1CEpP9RhqX/VIml/1WKpf9Wi6f/WYyp/1WI + p/9Shqb/ToOl/0p9o/9JfKD/Rnmd/z9ynP87b5r/OW+Z/zhwmP88eJv/QX6f/0WDov9IhqP/TIek/06I + pv9Riaf/U4mn/1WJpv9WiaX/Voij/1aIof9ViKD/VYef/1OGnv9QhJ7/TICe/0Z8nf9Bd5v/OnCX/zFo + kP8qYIr/JluF/yVahP8qYYf/L2eM/zVukv84cpX/O3WY/zx2mv89d5r/PXea/z13mv88dZr/OHCW/zRr + kf8tZYz/K2OK/y9okP8yapP/M2uT/zNrk/80apP/NGmT/zRnk/8yYpH/LFyL/yVUhP8eTX3/GUp4/xpO + ef8gWH7/JWCF/ypmiv8wa4//NG6T/zhvlf86bpX/N2mT/zBij/8nWor/IlSE/x9Qgf8dToD/H0+C/yBQ + g/8fUID/Hk5+/x5Off8iUn7/KVqC/zBhh/8zZYn/MmWH/zBkhP8wY4P/LmGE/yxchf8qVYP/JlOB/yVU + gP8mVoD/JleB/ydZgf8pXYP/LmKH/zFmiv8zaoz/Nm2P/zhvkf83bZH/N22R/zNrj/8waIz/K2SH/yli + hf8nYYT/KmSH/zJsj/83cZT/O3SW/zx0lf8/dZT/Q3mW/0R7l/9EfZn/QniW/0B0lP8/cZL/Pm+T/zxr + kf83ZI7/Ml2J/ypTgf8gSnj/F0Jw/xVEcP8YSXP/HFB5/yJXgP8mXoX/LGWJ/zVukP87cpP/P3WW/0B3 + mP9CeZr/RHuc/0Z9nf9Ffp7/Rn2d/0V7nv9Eep//RHqi/z10nf8zbZb/L2mR/zFsk/85dJj/QH2e/0OC + of9IhqP/TYik/1OKpP9WjKT/WYum/1mKpv9ZiKX/WIak/1aFo/9TgqP/T3+h/0l6nf8/cpj/N2uS/zNo + kf8zaZL/NWyW/zhvlv87cZT/PHGU/z1xlP85bZP/NmqQ/y9jjP8pXof/KFyG/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DRsj/xxbfv8aWX7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1l+/xI1Sf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x8+ + Wf8vYYj/LF6E/ytcgv8tXob/LmCI/y1gif8rYIr/KmCJ/yhfiP8pX4j/KV+J/ytfi/8rXYz/KVuK/yNU + hf8cSn3/Gkp7/xpMev8fUn//IVaB/yNXg/8jU4P/IlCB/yFOgP8fS33/HEl6/xhFdf8YRnX/HU16/yNU + gP8nWYX/J1mE/yRXgf8iVH7/IlJ9/yZVf/8nVoD/KVeC/ylZgv8qW4H/KlqA/ylYf/8oVYD/J1N+/yVP + ef8fSHD/H0ht/yNLcP8lTnP/K1V6/y5afv8vWn//JVB3/x9Lc/8cSHH/I1B7/ylYg/8uXoj/MGKK/zRl + jf83ao//OWyT/zlukv86cZL/OnGT/zlvkv82bJL/NWyS/zdxlf88d5n/Qn2c/0WAn/9IgqD/SYGf/0qB + oP9LgaL/TIKk/0uCpP9Hf6L/QHib/zt1mf84dZn/Nnab/zp2nP89dZv/P3Oc/zlul/8yaZP/LmaQ/y9n + kf8xapL/NW+W/zl0mf88d5z/QHue/0N9nv9DfJz/Qnqb/0F4mv89c5j/NWyT/y9nkP8sZZD/LmuW/zRw + mv85dZ3/PHig/zx3nv86dJr/OXGW/zpylP8/dpf/RXyc/02Dof9RhqT/Uoak/1KHpf9Uiqf/VY2p/1WN + qv9Oh6f/SoOm/0mCpv9Ce6H/PHad/zlzmv84c5n/NnGY/zZyl/80cJb/M26U/zRuk/84cJT/PXSX/0J5 + m/9Jf6D/TYKi/0+FpP9QhqT/Uoel/1KHpv9RhqX/T4Sk/02CpP9JfqP/Rnmh/0J2n/8/dZz/PHGa/zdt + mP80a5b/N3GZ/z15nf9EgqP/SIal/0uIpf9Oiqf/UYmn/1KJp/9Viqj/WIuo/1mLp/9YiaX/WImj/1iI + ov9Wh6D/VIaf/1CEnf9NgZz/R32c/0N4nP8+c5r/NmuU/y5ijf8nW4f/KFyH/ythif8xaI3/Nm+S/ztz + lf89dZj/PneZ/z94mP8+eJn/PneZ/z11mP88cpf/OW+U/zNqkP8wZ4//L2iR/y5nkP8vZo//MGeQ/zBn + kP8xZpD/MGSP/y9gjf8rXIr/JFWE/x1Nff8YSXj/Gk16/x9XgP8kYIb/KmeL/y5qj/8zbZP/N2+W/zZr + lf80ZpL/LmGQ/yZZh/8hU4L/H1GB/yJUhP8kVYf/JFSH/yNThf8hUoL/H1F//yFTf/8oWYL/L2GH/zNm + iv80Z4j/M2aF/zFlg/8wZIP/L2KD/yxcg/8nVoH/JFZ//yRUfv8kVX//I1Z+/ydZgf8rXoX/L2OI/zJo + jP80a47/N26R/zpwlP84bpP/NGuQ/zBnjP8qY4f/KGGE/ydhhP8sZon/M22Q/zlylf88dJf/P3aX/0F4 + lv9De5b/RX2Y/0Z8mP9Eepf/QXaW/z5zlv88cJb/O22U/zhmkf8yXor/KVSC/yBLef8aR3P/FkZx/xZH + cf8aTXX/H1V8/yZdgv8vZor/N22P/zxykv8/dZb/QneY/0R5mv9HfJz/R3yc/0Z8nP9GfJz/Q3qb/0J5 + nP9Bd53/PHOb/zRtl/8wa5P/Mm2U/zdzmP89ep3/Qn+g/0eEof9LhaD/UYeg/1WIof9WiaL/V4ij/1iH + pP9VhKH/U4Ki/1GBov9OfqL/Rned/zxwlv8yaJD/LWSN/y9mj/8xaZH/Nm2V/zhulP85bpP/Om2S/zls + k/81aJH/LmKM/yldh/8kWIL/AgUI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NHCT/H12A/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWn7/DiQy/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Llp+/zBhiv8tXob/KluE/ypchf8rX4j/K1+J/yph + iv8pYYj/KWKJ/ytjiv8sZIv/LWSN/y9jjv8uYI//KFqL/yFShP8cS37/HU1+/yBRgf8jVYT/I1WD/yNT + gv8iUYD/IE59/x5Le/8dSnr/Gkd3/xdFdf8aSnn/IVF//yZWhP8pWof/KFiF/yJTf/8gUHz/IE97/yJQ + e/8jUHv/I1B7/yJQef8iUHn/Ik54/yBLd/8gSnf/HUhx/x5Ib/8kTnT/KVJ3/y5Ye/80YIL/OGSH/zJf + gv8pVnr/IU90/x9MdP8cSXT/IlB7/yVVf/8qWoT/LV6I/zFijf80Zo//NWiP/zVqj/82a4//NWqP/zNp + j/82bZL/OHGV/zx3mf8/epv/RX+e/0iAnv9If57/SH+f/0qAov9KgKL/SH+h/0R8nv8+eJv/Onea/zh3 + mv87eZ3/QXug/0V7oP9DeJ//PnOc/zhvl/8za5T/MmqS/zJsk/83cpf/Pnmc/0F8nv9FgKD/SYOj/02E + pP9MgqL/SH6g/0N6nP88c5j/Nm+V/zJslP8wa5T/NnCY/zx2nf8/eqH/QHqi/zx2nf85cpj/OG+V/zxy + lv9Eepz/Sn+h/02Co/9NgqL/TYKi/06FpP9Ph6X/TYam/0eBo/9CfKH/QXqh/z54n/86dJz/O3Wc/zx2 + nP87dpz/PXid/z13m/87dZn/O3OX/zpylf87cpX/PnWX/0J4mv9HfJ7/Sn+g/0qAoP9LgaH/S4Gh/0h/ + oP9GfZ//Rnyg/0R5of9Cdp//P3ee/zx2m/85c5n/N2+Y/zVul/81b5j/O3md/0OAov9IhqT/TYmn/0+J + p/9Qiaf/Uomn/1aKqP9ZjKr/W4yp/1qKpv9ZiaX/WYmj/1eIof9Uh5//UYae/02DnP9KgJ3/R3ye/0N3 + nP88b5f/MmaQ/yxfiv8oW4f/K1+J/zFnjP82bpD/PHSU/z52lv8/dpf/P3iX/z93l/8+dpf/PnWW/zxz + lv85b5X/NWuS/zFokf8uZY7/K2OM/ytjjP8sY4z/LWSM/y5kjP8tYor/LV+J/ypch/8lV4P/IFF//xxN + fP8cT33/HlSA/yReiP8pZov/LGqP/zBtk/8zbJX/NGiU/zJikv8rXIz/JFaE/x1Pfv8eUH//I1SE/yha + i/8nWIr/JVaI/yJThP8eUX//IVR//ydagv8wY4n/M2aK/zVoiP8zZoX/M2aD/zJngv8xZoP/LWGD/ylc + gf8mWID/JVV//yRUf/8lVoD/JViA/ylcg/8sYYb/MGaK/zNqjf82bZD/OG6S/zhvk/81bJH/MGiN/ytk + iP8lX4L/KGKF/y5oi/80bpH/N3GU/ztzl/8+dZj/QXiY/0N6mf9HfZn/SHya/0Z6mP9CeJf/PXSY/ztx + lv84a5P/NmaP/y9dif8mU4H/IU57/x5Md/8bS3X/HE12/x5ReP8gVHv/JFqA/y5kh/82a43/O3CR/z5z + lP9BdZb/RXmZ/0d7m/9He5v/Rnqa/0R6mv9CeJn/QHeY/z91mf86cpn/NG2W/zBqkv8xa5L/NXCV/zp3 + mv9AfZ7/RYGg/0qEn/9OhJz/UIWd/1OGn/9Wh6H/Voaj/1SDov9SgaL/UH+j/0p7oP9Bc5v/OGyV/zBm + jv8sY4v/KmKK/y9njv8za5H/Nm2S/zVqkP84bJD/OGyR/zVqkv8wZY//K1+J/yVZhP8JFiD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/w4bI/8fXYD/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/x1bf/8FDRD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMG + Cf83aZH/MWKM/ypbhv8pW4X/KFuG/ytfif8tY4z/LWWN/yxmjP8tZ43/LmqO/zBrj/8xapD/MmmR/zJl + kv8tX47/JliJ/yJShP8gUIL/JFOF/yZYh/8nWYf/JleF/yVVg/8kVYH/I1KA/yJRf/8fTn3/HUt8/xxL + e/8eTH3/I1KD/ydWh/8mVoX/I1KB/x9Oe/8dS3f/HEp1/x1Kdf8cSXT/G0dy/xlEbv8YQm//G0Vx/xtF + cf8bRnD/I093/yxXff8xXYH/OGSG/z5qi/89a4z/NmWG/y9df/8pV3v/JFJ4/yFPd/8dTHb/Hk55/yNT + f/8mV4T/KluH/y1fif8vYYr/MWOL/zFljP8xZIz/NGmP/zdtk/85cZX/O3SY/z94mv9CfJz/RXyb/0Z9 + nP9Hfp7/SH6g/0d+oP9DfJ//QHqc/zx3mf83dpn/OXma/0F9nv9IgKH/S4Gk/0l+o/9Eep//PXSb/zdv + l/80bZT/NG6U/zdyl/89eJv/RX+e/0qDoP9Oh6P/Uomm/1SIqP9QhKT/S3+h/0V8nf8/eZr/OXSY/zhx + lv85cZb/PXWa/0B5of9Be6P/QXmj/zx0nf84b5f/OnGX/0B2mv9Fe5//SX6g/0l+oP9IfZ//SX+f/0iA + oP9FfqH/Pnqe/zt4nf88eJ7/OnWd/z53n/9AeqD/QXuf/0N+of9DfaH/Q3yf/0J6nv8/dpr/PHSX/zxz + lv86cJX/PHGX/z50mf9Bdpr/Qneb/0F5m/9BeJr/QHma/0B4nP9BeJ//QXif/0J5n/9Be57/P3ud/zx3 + nP85c5r/N3KZ/zhzmf86d5v/Pnye/0WDov9LhqT/Toim/1CHpf9Tiaf/Voqo/1iKqf9Ziqn/Woqo/1mJ + p/9XiKT/V4mi/1aJof9TiKD/UIWf/02Dn/9LgKD/Rnue/0Bymf83aZP/LmGM/ypdiP8qXYf/L2OK/zZs + jv87cZL/PnWV/z92lf8/dpX/P3aV/z91lf89dJX/O3GV/zdtlP80aJL/LmWO/ytii/8oX4j/KWCI/yph + if8rYor/LWSK/yxjif8rYIf/Kl6H/yhbhP8mWIP/I1WB/yBUgf8iV4T/JFyJ/ydjjP8raJD/LmuS/zBo + lP8xZJP/LV2P/yVVhv8eT37/G0x8/xxNff8fUIH/JFWG/ypajP8nWIr/IVOE/x5Rf/8fU37/JlqD/y1h + h/8zZ4r/NWiI/zNnhf8zZ4P/M2aB/zFlg/8uZIT/K2CD/ytdhP8pWoP/J1iC/yhZg/8oW4P/J1uC/ylf + hP8tYoj/MWeM/zVrkP81bJH/NWyR/zRrkP8xao7/KmSI/yljh/8rZYj/LmiM/zJskf82bpX/OnKX/zx0 + l/9Ad5j/Q3qZ/0d7m/9He5n/RnqY/0F3lv89dJb/Om+V/zZpkv8xYoz/K1uH/yZVgf8kVH//IlJ9/yJS + e/8kVHz/JVd9/yJWff8iWH//KF6E/zFni/84bZD/PHGT/0B0lv9Fd5n/R3qb/0h7m/9GeZr/RXma/0J3 + mP9Ad5n/PnSZ/zpxmf81bZb/MGqT/y1nj/8vapD/NnGW/z15nP9Ff6D/SYGe/0uBnP9NgZv/UYSe/1SG + of9UhaL/UoKi/09/ov9LfKH/Q3ad/zxvmP8zaJH/LWOM/yphif8sZIn/MWmN/zVtkP84bpL/OG2R/zhs + jv86bo//N2yQ/zNnj/8uYoz/KV6H/wkXIf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dhsk/yBe + gv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWn7/G1R3/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EyIv/zhplP8xYo7/KlyI/yZYhv8nWob/Kl+K/y5k + jv8ya5L/MmyR/zJukf8zcJL/NHCT/zZvlP82b5T/NGmR/zBjj/8rXIv/JleH/yRXhv8nWon/Kl6L/ypg + iv8qXon/Kl2I/ytdiP8rXYj/KVqH/yVVg/8iUYH/H05//x5Mfv8gTYD/IU+B/yJQgf8gT37/H0x6/xtI + df8aR3L/GkZw/xlFb/8XQWz/FD5p/xU+av8ZQm7/GURu/yFNd/8qWID/M2GG/zhlif88a4z/QG+P/z9w + j/87bYz/NmiI/zFihf8sXID/J1Z8/yFQef8fT3r/H098/yJUgf8kVYL/J1iD/ylahf8sXYf/LV6J/zFj + jv80Z5H/OG2U/zpxlv88dJf/PneZ/0F5mv9Cepv/RXub/0Z7nf9Fe57/Q3ue/z95nf88d5v/OXWY/zZ1 + l/89e5r/RoGe/02Dov9OhKX/ToSm/0mAo/9CeZ7/O3OZ/zZvlf81bpT/N3GW/zx2mf9DfJ3/SoOh/1GK + o/9Ui6X/Voun/1eKqP9ThqT/TYOi/0iAnv9Depv/P3WY/z5zlv8+dJn/P3ee/0F6ov9CeqT/Pnag/zpx + nP85cJj/OnGY/z51mv9Bd5v/Qnic/0F4mf9CeZn/QHmb/z53nP88d53/O3id/zp3nf89eZ//QXui/0R+ + o/9JgqX/SoSm/0qDpf9IgKL/Rn2g/0N6nf8+dZn/O3GW/zltlP84a5T/N2yT/zdulP84b5T/OXGW/zly + lv86dJf/PXed/0B4nv9Cep//RH2g/0V/of9Ff6L/Qn2g/z95nv88dpz/O3Wb/zt2m/89epz/QoCf/0iE + ov9NhaP/UIel/1OIpv9Wiaj/Voin/1eJqP9Yiaj/WIin/1eIpv9WiKT/Voqk/1SKo/9TiKL/UIWi/06D + of9KfqD/RHed/zptlP8wYoz/K16H/ytehv8uYon/NGiN/zlukf89cpP/P3WT/z51k/8+dJP/PXOT/z1y + lP86bpP/NmmS/zFlkP8sYIz/J1yH/ydeh/8pX4j/KmGI/y1kif8vZov/MGaK/y9lif8uY4j/LWGH/yxf + h/8pXIb/J1qG/yZbiP8lXIn/Jl6M/yhjj/8sZJH/L2KT/y5ekv8oWIv/H0+B/xlKe/8WR3j/F0h5/xlK + ev8eTn//IlKE/yVVhv8iU4T/H1F//yBSf/8kV4P/K1+H/zBkiv8zZ4j/MmeF/zFmgv8wZYP/L2WE/y1k + hf8vY4b/MGGG/zBfh/8uXof/K12G/ypehf8qXoX/KV6E/ypfhf8tYoj/L2WL/zBnjf8xaY7/MGiO/y5n + jP8tZ4v/LWeL/y1njP8vaI7/MWqQ/zVtlP83b5T/OnGV/z10mP9Cd5v/RHib/0R4mf9Bdpb/QHSV/zxw + lv86bJX/M2aQ/y1giv8nWIT/J1iE/yZZg/8nWoP/K1yE/yxdhP8pW4L/I1iA/yJYgP8mXYT/LGOK/zNp + jv84bpL/PXKV/0J2mf9GeJv/R3qb/0d6m/9EeJr/Q3eZ/0F3mv8/dpv/OnKY/zVtlv8waZP/LGaP/ytl + jP8xa5H/OnWY/0F6nP9Gfp3/R36a/0p/nP9PgZ7/UoSg/1CBoP9Of6D/Snuf/0J0m/87bpb/NWqT/y9l + jv8rYor/K2KJ/y9ni/8za43/OXCR/z1ylP89c5P/PXGR/zxwjv85bo//NWmO/zBkjf8sYor/Chgh/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/IF6C/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8YQlr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8dNkz/N2iV/zBhj/8qW4r/JliH/yVZiP8oXYr/LmSP/zJqkv80b5P/NnKU/zdzlP84c5X/OnSX/zhw + lf83bJL/M2aQ/y9hjP8pW4r/J1uJ/ylgi/8rY43/LmWN/y5kjf8vZI3/MWaO/zNnkP8vYo3/K12K/yZV + hf8fTX//HEl9/xxJfP8cSXz/Hkt8/x5Lev8cSXb/G0d0/xpGcf8ZRnD/GUVw/xhEb/8XQWz/GUJu/xxG + cf8gTHb/KFZ//zFhif82Zor/OmqM/z9vkP8+cI//PnCP/z5ykf8+cpL/OGyN/zJliP8tX4P/KFqA/yVW + f/8iVID/H1B9/yBRff8iUn7/JFSA/yZWgv8qWob/L1+M/zNlkf83a5P/OnCV/zx0l/8+d5f/P3iY/0J4 + m/9EeZz/RHmd/0J4nf8+d5v/O3Wb/zl0mv80cpf/OHaX/0B8mf9Igp3/TYai/1CGpf9Rh6f/TYOk/0d+ + of8/d5v/OXGW/zZvlP83cJX/O3SY/0F6nP9JgqD/UIii/1aNpf9Yjaf/WY2n/1iKpv9UiKP/ToSh/0h+ + nv9DeJn/PnOW/z1xmP8+dJz/QXih/0F4ov8+daD/OXCb/zVslv80a5T/NWyU/zhvlP85cJT/OnGT/zt0 + lf87dJf/OXSZ/zx3nv88eZ//P3ug/0N+o/9Gf6X/R4Cl/0qEpv9Oh6j/ToWn/0uCpP9Jf6L/RXue/0B1 + mv88b5f/N2qT/zNnkP8xZo7/L2aN/zJqkf80bZL/NG+U/zp0mf8+eJ7/Qnqg/0V8oP9Hf6H/SYKj/0uD + pv9Jg6b/RX6i/0J6oP8+dp7/PXWc/z54m/9Dfp7/SYOg/06Go/9RiKX/VImn/1WJp/9ViKf/VYio/1aI + qf9WiKj/Voim/1eJpv9XiaX/Voql/1SJpP9RhqP/T4Si/0yBov9He5//PnGX/zRnj/8sYIb/Kl2E/y1h + h/8yZ4v/OG2Q/ztwkv88cpL/PHOR/zxykP88cZH/O26R/zhrkf8zZY//LmGM/ylciP8mW4f/J12I/ypg + iP8tZIr/MWiN/zNqjv81bI3/NWyN/zRqjP8zaIz/MWaL/y5jiv8rYIr/J1yJ/yVciv8jW4v/JlyN/ytd + j/8uXJL/KlmP/yRUif8dToH/F0h6/xNEdv8URHX/FkZ3/xhIef8bS3z/Hk5//yBQgf8gUID/IFF//yNW + gf8pXYb/L2OJ/zJmif8xZof/L2WE/y9lhf8tZIb/LmSG/zBkiP8zZIj/NWSL/zRjjP8yYov/LWGI/ypf + hv8pXoX/KF2E/yhdg/8qX4b/K2KH/yxjiv8tZYv/LWWM/y9ojv8xa4//MmyQ/zNskf8zbJP/M2yT/zRs + k/83bpX/PHGY/0B0mv9BdJr/P3OX/zxwlP87bpT/O2uU/zZnkv8vYoz/KFyG/ydchv8nXIb/KF2G/y1h + if8yZY3/M2aM/y1hiP8mXIT/JFuD/yhfh/8qYor/LWWN/zNqkP83bZL/PHGV/0J1mf9Ed5r/RXeb/0R3 + mv9Cd5r/QXea/z51mf85cZf/NGyV/y5mkv8rZI//KmON/y9okf81b5b/PXaZ/0B3mf9Ee5r/SHya/0x/ + nf9Lfp3/S32d/0h6nf9Ac5n/OGuU/zFlkP8uY47/LGKM/yxji/8vZo3/MmmO/zZtj/87cZL/PnSV/0F2 + lv9AdJT/PXGS/zpukP80aI3/L2OL/ypgiP8LGSL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8gXYL/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p+/xIx + Q/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ytRcf80Z5T/L2GQ/ypbjP8lV4j/I1iI/ydc + i/8rYo//MGqR/zNwk/82c5T/OHWU/zp2lv86dJb/OXGW/zdtk/80Z5D/MGON/ytgi/8nYIv/KGOM/ytm + jv8uaI3/MWmO/zNrj/81bZL/NWuS/zRpkf8wY47/J1iG/x9OgP8YRXn/F0R4/xlGd/8aR3j/HEl3/x1K + dv8eSnX/HUly/xtJc/8bSXP/HEl0/x5KdP8gS3X/Ik54/yRTfP8rWoP/MWGJ/zVni/86a43/O2+N/zxw + j/88cI//PHKR/z50k/8/dJT/OGyN/zJmif8vYof/LV+I/ylahP8kVYD/IE97/x1Nev8fT3z/IVF//yZW + hP8rXIr/MGOO/zVokv84bpX/OnOW/zx2lf89d5X/PneX/0F4m/9Bdpz/PnSc/zpzmv84cpr/NHCY/zZy + mP86d5f/QHuW/0eAm/9MhaD/T4ek/1CHpf9OhqT/S4Ki/0V9nv8+dpn/OXGW/zhwlf86cpb/P3ia/0Z+ + nv9NhKH/VIuk/1iOpv9ajqX/WIyl/1aKpP9TiKX/TIOh/0V6nP89cpf/OW2U/ztwmP89c5z/P3Wg/ztx + nv81bJj/L2aR/ytijP8tZI3/L2eN/zBojf81bpH/N3GU/zZxlP85dZr/PHie/z98of9GgKP/SYKl/0qC + pv9GgaX/SYOl/0yFpv9Ohab/TYKl/0qAo/9Fep7/QHSb/zpsl/81ZpL/MGOO/yxhi/8tY4z/L2iP/zJs + k/82cZj/PHed/0J7of9HfqL/S4Gi/0yCov9MhKT/TYWm/02Fpv9Lg6b/Rn6i/0J5n/8/dZ3/P3ac/0F6 + nf9IgaH/Toek/1KKpv9Tiqb/U4ml/1SJp/9Vian/Vomq/1aIqf9WiKf/V4mm/1eJp/9Xiaf/VYil/1KG + o/9PhKL/TICh/0h8n/9Ddpv/OWyS/zBjif8rXoT/LGCG/zJli/82ao//Om+S/zpvkv86b4//OW6N/zlt + jf84ao//N2aP/y9gi/8pWof/JleE/ydah/8oXIn/K2GK/zFnjf81a5D/N26R/zpxkf87cpH/O3GR/zlu + kP82a4//MmeO/y5jjP8pX4v/JVuH/yNZiP8lV4r/KleM/yhWjP8lU4n/IVGG/xxMgP8YSXv/FER2/xRF + d/8WRnf/F0d4/xdHeP8ZSXr/HEx8/x1MfP8dTHz/IFB+/ydZg/8tYYn/MmeM/zFnif8tZYf/LGSG/y1l + iP8vZYj/MWaK/zRmi/83Z47/OGeP/zVljv8wY4v/LWCI/ypehf8pXYT/KF2E/yVbgv8mXIP/J16G/yhg + h/8uZo3/MWmP/zRrkf81bpP/N2+W/zZulv80bJT/M2qS/zVrk/85bpb/O2+X/zxwl/86bZP/OGqR/zZm + kP80ZI//MGGN/ylciP8nXIX/KF2G/yhgiP8sY4r/MmiO/zdskv87b5P/NmuP/y5liv8qYYn/J16I/yhg + iv8pYoz/K2OL/y5jjP8zaI//OW6U/z9zmf9AdZr/QXSY/z90mP8+dJf/PHKW/zhvlP8zapL/LWWP/ylh + jv8qYI3/LmOP/zRqlP84cJb/PXOX/0F2mP9FeZr/RXmZ/0R3mP9CdZn/PnGX/zdqk/8uYo7/LGCN/yle + i/8pX4r/L2aP/zNqkP82bZH/OXCR/zxyk/9AdJb/QXaX/0B0lf89cJP/OWyQ/zJmjf8rX4f/Kl+I/xgz + R/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yFegv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWn3/Choj/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/N2uV/zRolP8wY5H/KVyN/yRYif8iV4j/I1qJ/yhhjP8taI//Mm+S/zZzlP84dZX/OHWV/zp0 + lv85cpb/OG2U/zVokf8wZI7/KWOL/yRji/8mZIz/K2aO/y5ojv8xa43/NG6P/zZvkf82bpL/NWyT/zBk + jv8oW4j/H1CA/xpHev8VQnX/FkNz/xpHdv8eS3n/Ik97/yRRe/8hUHn/Hk94/x1OeP8fT3n/IVB6/yVS + fP8nVH3/KFeA/ytchP8tX4f/MWSK/zVoi/84bIv/OG2M/zlujf86cI//OnGQ/ztwkP86b4//NmuM/zNm + i/8yZIv/MWKL/yxbhv8lVH//Hk55/xtKd/8eTnz/IlKB/ydXhv8rXYr/MWSP/zVrkv85cJT/OnOU/zl0 + kv86dJP/O3OW/zx0mf86cZn/N3CY/zNvmP8zb5j/N3SY/zx5l/9BfJj/RX+Z/0uEn/9OhqH/T4ej/0+H + o/9NhaL/SYGg/0R8nv8/d5r/O3OX/zpyl/89dJn/RHuc/0qBoP9Rh6L/Voyk/1mOpf9ajqT/Voqk/1KI + pP9OhKT/SH2f/0F2mf86bpX/NmmS/zhslf83bJj/NmyY/zNplf8rYo3/J16I/ydeh/8pYIj/L2eN/zVu + kv83cpX/OXSZ/zt3nP8+ep//RYCg/0uEo/9OhqX/TYal/0uFpP9Kg6T/TISk/02DpP9NgqT/S4Cj/0V4 + n/8/cJz/OGmW/zFjkP8rX4v/Kl+K/y1jjf8vZ5D/M22U/zhzmv8/eqD/Rn6j/0yCpf9PhKX/T4Wl/0+F + pf9Qhqb/UIWm/02Epf9KgKL/RXuf/0J4nf9Bd53/P3Wb/0Z+oP9NhaT/Uoqn/1KKpf9RiaT/U4qn/1WM + qv9Wi6v/Vomp/1aIqP9WiKf/V4mo/1eIqf9Uhqb/UoSk/0+Cov9MgKH/Sn2f/0R3m/88bpP/NGaM/y9g + hv8uYIb/MGOJ/zRnjf82ao//OGuQ/zdqj/82aI3/N2eM/zZmjv8xX4n/KlmF/yRUgf8kVoT/JliG/ylc + if8uY43/M2iR/zhuk/89dJX/P3aW/0B2lv9BdpX/PnKU/zpukf81apD/MGSO/ytgiv8mW4j/I1iH/yFU + hv8jUYX/IE+E/x5Ng/8cS4H/G0p//xhIe/8aSnv/GUl7/xhIef8ZSXn/GUl4/xlJeP8aSXn/HEt6/xxL + ev8cS3r/I1SB/yteiP8wZYz/LWaK/ypkh/8qZYf/LmaJ/zFniv80aIv/NmmN/zhpj/84aZD/NmiQ/zJk + jf8uYYr/LGGI/ylfhv8oXoX/J1yE/yRag/8iWYL/J16G/yxji/8yaZH/NmyT/zhvlf85cJb/N26W/zRs + lP8yaZH/M2iR/zRpk/82apP/NWmS/zRnkP8yZI//MGCN/y1eiv8oW4b/JlqF/yhchv8pXof/LGOK/zFp + jf82bZH/OnCT/z1ylP8+c5b/N22S/zBoj/8rZIz/Jl6J/yVeif8jXIf/JFuG/yheiP8wZo7/N22U/zpw + lv87cZb/O3GW/ztwlf86b5T/N2yS/zJoj/8tZI3/Kl+K/ypciv8rXYv/L2KP/zNnkf85b5X/P3SY/0F1 + mP8+cpT/O2+S/zltkv81aZH/L2ON/yxgjf8qX4z/KF6L/ythjf8xZpD/NWuS/zhtkv87cJP/PXKV/0B0 + mP9Ac5f/PnGW/ztulP82aZD/L2KM/yhch/8tYYz/GTNI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/IV2B/xpZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x5d + gP8DBgn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woUG/80apP/M2eT/zBjkf8sX4//JluL/yJY + iP8hWYf/JV6J/ylljP8wbJH/NXGU/zd0lf84dZf/OXSX/zlyl/84bpX/NWqS/y9ljv8oY4v/JGKL/yZk + jf8rZY7/LmiO/zFrjP8zbY3/NG6P/zdvkv82bJL/MWaQ/ypdiv8iUoP/HUt9/xhFd/8YRXX/HEl4/yJP + fP8pVoH/KlmD/yVYgf8gVX//IFR+/yFTff8kVX7/J1eA/ylZgv8rW4T/KVuE/yldhv8sYIf/MWWI/zRo + if82a4r/N2yL/zdtjP83bo3/OG6N/zdsjf83a43/NmmM/zVnjP82ZY3/M2KL/yxbhf8jUn3/H057/xtK + eP8eTn3/IlOA/yZXhP8rXYn/MWWO/zRqkP82bpL/NW+Q/zVxkf83cJP/OHGW/zdvl/80bZb/MWyW/zRv + lv84dZj/Pnua/0R/nf9Hgp7/SYOd/0yFn/9Ph6L/UIij/0+Ho/9MhKH/SICf/0N7nf8/d5v/PXSZ/z10 + mf9BeJv/SH6e/06Eov9UiaT/V4yl/1iMpP9XiqP/U4ak/0+Cov9JfaD/Q3ic/ztvlv81aJL/L2OP/y5i + kf8vZZH/LWSO/ypiiv8mXof/Jl6H/ypiif8yapD/OHGW/zp2mv8+ep//QX2h/0R+n/9LgqD/UIah/1CI + ov9RiaT/UIik/0+HpP9OhaT/TYSj/0yBo/9JfaL/RHWf/z5snP80ZJP/LF6M/ydciP8qX4v/LWOO/y9m + kP8xa5P/OHKZ/0B5n/9If6P/ToKl/1CEpv9QhaX/UYal/1GHpf9Sh6b/UIWk/0yCo/9JfqH/RXuf/0J4 + nP9BeJ3/RHug/0qCpP9Oh6X/T4ik/0+Jov9Si6b/VIyo/1aMqv9Xiqn/VYin/1WHp/9Wh6j/Voan/1SF + pv9Sg6T/T4Gh/0yAoP9LfqD/RXeb/z5wlP81Z43/L2CH/yxehP8tX4b/L2KK/zFjjP8yZYz/MmOL/zNh + jP8zX4v/MFyI/ypXg/8jUX7/H1B+/yBSgP8iVYT/KV2K/zBjj/80aZL/O3CV/z92l/9Ee5r/Rnyb/0R4 + mf9BdZf/PXCT/zdqkf8yZY7/LmGL/ylei/8kWYj/IVSF/xlMfv8YSn3/GEh8/xhHfP8YR3z/HEt+/x5O + gP8hUIH/IVB//x5OfP8dTXv/HU57/x1Ne/8bSnr/G0p5/x1Me/8jUoH/K1uI/ythif8pZIf/JmOF/ytl + h/8vZ4n/MmmK/zZrjf83bI//OW2R/zltkv83a5L/M2iP/y9kjP8vZYz/LmSL/ytgiP8oXYb/JVqE/yRZ + hP8kWoT/KV+J/zBljf82a5H/O2+U/zlvlf83bZT/NGuT/zFnj/8wZY7/L2SN/zBkjf8wY43/L2GM/y1d + i/8rXYr/KVuG/yRYg/8mWoX/KV2H/ythif8waIz/NW6Q/zlykv8+c5T/QHSW/0B1l/88cpb/Nm2T/y5n + j/8oYYv/IluH/x9YhP8gWIP/I1qF/ydeh/8vZo7/NGqR/zZskv83bZL/N22S/zdskv83bJL/NGmQ/y5j + jP8qXYr/J1mH/ydXiP8pWIv/LV6N/zJlkP85bZX/O2+U/zdrkP80aY//M2iO/zFmjv8vY47/LmOP/yxh + jv8tYo7/MGWQ/zJokv80aZH/N2yR/ztvk/89cZb/P3KX/z9xmP88b5b/OGqT/zJlkP8sX4r/K16K/y1i + jP8ZM0j/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8gU3T/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/GVBv/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/Eyc1/zNokP8yZpH/MWSR/y1hjv8pXov/JVuJ/yNaiP8iXYf/J2OL/y1pkP80b5T/N3SX/zh1 + mP85dZn/OXOZ/zlxmP82bJT/MGiP/ypji/8mYIr/J2GM/ypijv8uZI//MWeN/zJrjP80bI3/NWyP/zZs + kf8zaJD/LV+M/ydVhv8gTX//HUl6/x1Jev8gTXz/KVaC/y1bhv8sXYf/J16H/yRbhP8jWIL/JViB/yZY + gP8oWoL/K1yE/ypcg/8oW4P/KFyE/ylehP8tYYb/MGSH/zNniP80aYn/NWqJ/zVriv82bIz/NmyM/zZr + jP83a43/OGuO/zdojf80ZIz/MGCI/ytahP8mVYD/IFB8/xtMef8dTnv/IlOA/ydZhf8rXoj/MGSM/zJo + jv80ao//NGyR/zVtk/81bZX/NGyW/zFqlf8wbJX/Mm+V/zd0mP9AfJ7/RoKh/0mDof9KhKD/TIWg/06H + of9QiKP/UIej/06Gov9Lg6D/Rn6f/0J6nf8/dpv/PnWa/0B2mv9Fe53/S4Ch/1GGpP9Wiab/V4qm/1aI + pP9ShKL/TYCh/0d7n/9Cdpr/PHCW/zNnkf8rX43/KV2N/yhfjP8pYIr/KGGK/yhgiv8pYYr/L2iO/zdw + lf89dpr/P3qe/0J9ov9GgKL/SoKg/06Env9QhZ//UYef/1KJoP9Ti6P/U4mj/1GHo/9PhKL/TYGi/0l8 + of9Dc57/OWiX/y9ejv8mWIb/KVyJ/yxgjP8uY47/LWWO/y9okP81bpX/QHed/0h+of9NgqT/T4Sk/1GG + pP9Sh6T/U4ik/1OHpP9RhaT/T4Sj/0uAof9HfZ//RHqd/0J5nf9Ee6D/R3+i/0qEpf9Mh6T/TYmj/1CK + o/9Ti6b/Voun/1aKp/9Viaf/VIam/1SFpv9Uhab/U4Sl/1GCo/9Of6D/S36f/0l8nv9GeZv/P3GV/zdn + jf8uXob/J1eB/yhXgv8pWYT/KlyH/ypdh/8rW4f/LFmG/y1Whv8pU4L/I098/x1Kef8XSHf/GEp6/yBT + g/8oW4r/MGOQ/zVqkv87cJX/QHaY/0Z8m/9Jfp3/SHyc/0R2mf8/cZX/OWqR/zNkjv8uYY3/K2CO/yhf + jf8hV4b/G09+/xNGd/8RQ3X/FER4/xhHe/8fTYH/I1KD/ydWhf8pWIX/KFeE/yVVgf8kVH//IVJ+/x9Q + fP8cTHr/HU17/yJRgP8mWYX/J1+G/yZjhf8pZIb/LWaI/zBoif80aov/N2yN/zluj/86cJH/OW+S/zdt + kf80a5D/M2mP/zRqkP8zapD/L2aL/ypfh/8mW4b/JVqF/yZbhv8pXYf/MGKI/zZojf85a5H/OWyU/zZr + k/8yaJD/LmSM/yxhif8qX4f/K1+H/ytfiP8rXYj/Kl2I/ypdiP8nW4b/KFyH/yleiP8rYIn/LmWK/zJs + jf83cpD/PHWT/z92lf9Cd5j/QXaZ/z5zl/84bpX/MWmS/ytjjf8jW4j/H1iE/yBZhf8jXIb/J1+I/ytj + i/8waI//NGqR/zRqkP81a5D/OG6T/zlulf83a5P/M2aR/ytei/8kVob/I1OE/yJShP8kU4b/KFiJ/y5g + jP8xZI3/MWWM/zFmjf8xZo3/MWeP/zRqk/8zaZT/MmeT/zNnlP8zZ5P/M2eR/zRnj/81aI//N2qS/ztt + lf89b5f/PXCZ/zptl/82aZT/MGOQ/ytei/8pXYn/K2CM/xk0SP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xlHYf8bWn3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8XQVn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8dOk//M2iP/zNmkP8yZZD/MWOP/y1g + jP8oXYn/JVyH/yRch/8nYYr/LGeP/zJtlP82cZf/OXWa/zh0m/84c5r/OnGZ/zpvmP8zaZL/LGKL/yde + iP8nXIj/Kl2K/y1ejP8xY4//M2eO/zRqjf80ao7/NWqQ/zNmkP8uYI3/KFeH/yJOgf8eSnv/H0t7/yRQ + fv8rV4T/L1+J/yxgiv8oYIn/Jl+H/yZehf8mW4P/J1uC/ypcg/8sXoX/KlyD/yhcg/8mWoH/JluC/yle + hf8uY4f/MWWJ/zNnif8zaYj/NWuK/zZtjP83bY7/OG2O/zltj/86bZD/N2mN/zVmi/8yY4n/MWGI/y5e + hv8oWIH/IVF9/x1Oev8dTnv/IVR//yZZhP8pXYj/LWKL/zBmjv8zaJH/M2iT/zJolP8xZ5T/L2mU/y9s + lP8wb5T/OHab/0F9oP9Hg6P/SoOh/0qDof9NhqH/UYmj/1KKpP9SiaT/UIej/02Fov9KgaH/RX2f/0J4 + nf8/dZv/P3Wc/0N5nv9IfaD/TYKj/1KFpf9UhqX/UoSk/06Aof9JfJ7/Qnab/zxxl/82a5L/LmKO/yte + jP8pX4z/KWCM/ydfiv8oYYv/KGKM/y5oj/81cJT/PHWZ/z53m/9Bep3/RH2h/0mBof9MgqD/T4Se/1GG + nf9Shpz/Uoee/1OJoP9Uh6H/Uoah/0+Dov9Mf6H/SHug/0FynP82ZZP/KlqJ/yhZif8sXoz/L2GP/y1i + jP8rY4v/LWaN/zRqkf89cpn/Rnqe/02Bo/9Pg6P/UYaj/1SIo/9UiKL/U4ii/1OHov9QhKL/TYGh/0p+ + nv9Fepz/Qnib/0J6nf9FfqD/SIKj/0qFpP9LhqP/T4ej/1KIpP9UiKX/VYim/1OHpf9ShaX/UoSl/1OE + pf9ThKX/UYOj/06AoP9Lf5//Snye/0d5m/9AcZb/NmeN/y5ehv8nVYH/IU99/yFQf/8iUoH/I1WB/yJS + fv8kUX//J1KB/yROfv8gSXn/Gkd2/xVFdf8URnf/G05//yVZh/8sYY3/MmiR/zlvlf9AdZn/RXqb/0h8 + nf9Ie53/RXea/z9wlf84aZH/MWKO/ytejf8oXY7/KF6N/yZciv8fVIH/FUp5/xFEdP8RQnT/Gkp9/yBP + gv8kUoT/J1WF/y5diP8vXYf/Ll2G/ypagv8mV4D/I1R9/x5Pe/8dTXr/IFF+/yNYgv8mYIX/J2OG/ypk + hv8uZoj/MmiJ/zVriv85bYz/Om+O/zpxj/85cJD/N22Q/zZtkf82bZL/N2+T/zVtkP8yaY3/LmSJ/yle + hv8mW4b/J1qF/ypcg/8wX4X/NGKJ/zVkjf82ZpD/NGeQ/zBkjP8sYYn/KV6G/ydbg/8oXYT/KF2F/ypd + hv8sX4n/LGCK/y1hiv8vY4z/L2ON/y9li/8xaYz/NG6O/zl0kf88d5L/P3iU/z93l/9Bdpn/P3SZ/zlv + lv8yaZH/LGOO/yZeif8kXIn/JF2J/ydgjP8sZY7/L2iR/zBpkP8xaI7/MmqP/zZskv85cJX/O3GX/ztu + l/83apT/MGKP/yZYh/8dTn//G0t9/xpKff8fToL/JlWG/ypciP8vY4v/MWeO/zFnj/80bJT/OHCY/zpy + mv85b5j/N2yV/zZqk/8zZo//MmWO/zJljf8yZY3/N2mS/zpslv87bZj/OWuX/zVnk/8uYY7/KVyJ/yda + iP8rYIv/GTRH/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Hkpk/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Glp9/xEvQf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yVNav8zZ5D/NWiR/zVokv80ZpL/MmWP/y1ii/8nXYf/JV2I/yZeif8rZY7/MWuT/zVv + l/83cpn/OHOb/zhym/86cZn/Om6X/zZokv8uYIr/KFqF/yZXhP8mV4T/KlqI/zBejP80Y4//M2SN/zJm + jP8zZo3/MWKN/y1cif8nVYX/IUx9/x1HeP8eSHj/JE58/ylWgv8sXYf/K2GK/ypiiv8pYYj/KWCH/yhd + hP8pXIL/K12D/yxehf8sXoX/KlyD/ydagP8lWoD/J1yC/yxhhv8wZIn/M2eL/zRpi/81a4z/OG6O/zht + kP84bZD/Om+S/zlukP84a47/NmiL/zVoi/80Zor/MmOJ/y5fiP8oWIP/IVJ+/x9QfP8dTnv/IFJ//yNW + gv8pXIn/LWGN/zBjkP8wY5L/LmOS/y1kkv8taZL/LWyR/zNylf87eJv/Qn6i/0aAov9IgaD/S4Sg/06G + of9RiKP/Uomk/1OKpf9RiKT/ToWj/0uCov9JgKL/RHqg/0F3nv8+dJz/QHWd/0R5n/9JfKD/TX+i/06A + o/9Nf6L/R3me/0Fzmf87bpX/NWuS/zBnjv8sYov/LGKN/y5kkP8vZZD/LGSO/ydijP8qZY3/MGuR/zdz + lv88d5f/PniZ/0F6nP9GfJ//SX+g/02Bn/9Pg57/UYSe/1GFnf9ThZ3/UoWe/1KEn/9Rg6D/UICh/0x8 + oP9Hd57/Pm6Y/zNjkP8qWon/KlqJ/y5gjv8wY4//LWKM/yphiP8qYIf/L2WM/zlulP9EeJz/S3+h/0+D + o/9RhqL/U4eh/1OHof9ViKD/VIeg/1GEoP9OgaD/SX2d/0V5m/9Cd5r/QHeZ/0J7nP9Ffp//SIGh/0uE + o/9QhaP/U4ak/1SGpP9ThqX/Uoak/1GEpP9Qg6T/UYOk/1GEpP9Rg6P/UIKi/02BoP9Kfp7/R3mb/0By + lv83Z47/LVyG/yZUgf8hTn7/Hkp8/x9Nfv8gUH//H1B7/yFQff8lUn//JVB9/yRPff8fS3j/GEd1/xVH + d/8YS3z/H1OD/yZcif8tY43/NGmR/ztwlf9BdZj/Q3eZ/0N2mf9Ac5b/PG6U/zRlj/8tXY3/JlmL/yZZ + i/8nW4v/JluJ/yRahv8cUn7/FEl3/xdLev8bTX3/IlKD/yRThf8nVob/LFqI/zNhiv8yYYj/L1+E/ytc + gf8lVn3/H1F6/xxOeP8fUn3/I1mC/ydfhf8qYob/K2OF/y5khf8wZYb/NGmI/zltjP85b43/OXCO/zZu + jv81bI7/Nm2Q/zlwk/84bpP/N2yQ/zRpjP8xZ4n/LmKH/ytehf8qWYT/LFqB/y9bgf8wXIb/MF6J/zFg + i/8uYIn/LWCJ/yxfiP8pXYX/Kl6E/yleg/8qX4T/LWKJ/zFljP8yZ4//NGmQ/zVpkf81aZD/M2qN/zRr + jf82b4//OXOT/zx2lP87dpT/O3WV/zxzl/87cZj/OW6W/zFnkf8rYYz/KGCL/yhgjP8oYIz/LWaQ/zNs + lf81b5f/NG2U/zNskf8xao//NW2T/zlwlv87cZj/PXCX/zlslf8yZZH/KFuJ/x9QgP8WRXf/FER2/xhI + ef8fT3//KVuH/zFkjP8zao//NW2S/zlylv87dJr/PHSZ/z10m/88cpj/OG2T/zVokP8xZIz/MGOL/zFj + jP80ZpD/N2mT/zhqlf83aJX/M2SS/ytdiv8kV4X/JViF/y1ii/8jSGP/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8dSmP/G1p+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/DB4q/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/LF6G/zNnkf82apT/OG2W/zdr + lP82aZL/M2eP/yxhi/8oXYj/Jl2I/ylhjf8uZpL/M2yX/zVumf82b5r/OHCa/zpul/84a5T/NGWP/y1d + if8nVoP/I1OA/yRTgf8mVYP/LFqI/y9div8uXon/LV6H/yxdh/8sXIf/KVeF/yRQgP8dSHn/GUN0/xlC + c/8fSXj/J1SA/ypbhv8sX4n/LGKK/y1ji/8qYIf/Kl6E/ylcgv8rXYP/LV+E/y1fhP8rXYT/KVyB/yZa + f/8nXIH/Kl+D/y9kh/8zZ4n/NWmL/zdsjf83bo//N22P/zdrj/84bZD/Om+Q/zhtjf84bI3/N2uM/zdq + jP81Z4z/MmSL/y5fif8oWYX/IlN//x5Pe/8aS3n/HlB+/yRWhP8qXIr/K16O/yxfkP8qXo//KWOO/yln + jv8tbZD/NHSU/z16mv9Cfp7/Rn+g/0mBn/9Lg6D/Toai/1GHo/9TiaX/U4ml/1KJpf9PhqT/TYSj/0uB + o/9HfaP/Qnif/z1zm/89cpv/PnOb/0J2nf9FeaD/R3qf/0R3nv8+cZn/NmmT/zNnkP8wZo3/LGaK/y5o + jP8zbJD/Nm6T/zdtl/81bZb/MWuT/y1pjv8ubI//NHCS/zh0lP88eJf/QXia/0V6nv9JfKD/Sn6h/0yA + oP9Ogp//UYOf/1GDn/9Rgp3/T4Ge/09/oP9OfaD/S3mg/0Nym/86aJT/MF6M/yhYhf8nV4X/K12J/y9k + jf8uY4z/KmCI/yhdhf8rYIj/NWqQ/0B1mv9JfZ//T4Ki/1GFof9ShZ//U4ae/1SGnv9ThZ//UYOe/02A + nv9JfJz/RHeY/z90l/8+dJf/P3aZ/0R8nf9IgKD/TIKh/1OEo/9ThKP/UoOi/1KDo/9ShaT/UYSk/0+D + o/9OgqL/T4Ki/0+Cov9PgqL/ToGg/0p+n/9GeZv/QHOW/zdoj/8tXIf/JFKA/yBNfv8fTX7/H1B//yFU + f/8kV4H/KFqE/yxahP8vXIb/LluF/ylXgf8dTHf/GEh1/xdKef8bT3//IFaD/yhdiP8uY4v/NGmO/zlt + kv8+cZT/PG6S/zhqj/80ZY3/L16M/ydViP8iUof/I1WH/yVZiP8mW4j/JFuG/yJYg/8hWIL/IVeC/yRZ + hP8mWIb/KVqI/ytbiP8xX4z/M2CL/zViif8yYYX/LV6A/ydZff8gUnf/HE94/x5Re/8iVn//KF2E/ytg + hv8tYob/LmKD/zBjg/80Z4f/N2yK/zhtjf84bo3/NW2N/zVtjv82bZD/OG6S/zhukf83bJD/NWqO/zRo + i/8yZYj/MGCI/y9ciP8uWYL/LFaB/yxWgv8tWIb/K1mH/yxch/8sXoj/LF6I/y1hiP8uY4j/LWOG/zBl + iP8zaIz/N2uQ/zlukv88cZX/PHGV/zlukv84bZD/NmyO/zZtkP84cZP/OXKU/zhxlP84cZX/N2+W/zZs + lv80aZP/LmON/ypgiv8pX4r/KWGM/y1mkP8ya5P/N3KY/zp0mv86dJr/N3GW/zVvk/81bZL/OG+U/ztx + lv87b5X/OWuU/zNmkf8qXIn/IFB//xdHd/8TQnP/FUR0/x1OfP8qW4b/NGeN/zdsj/84b5L/O3SW/zx1 + l/88dZf/PnWX/z91l/89cpX/OGyR/zNnjv8wY4v/MGKL/zNljv8yZI//MmSP/zJkkf8tX4z/J1mH/yNV + gv8nW4b/LWKL/yZPav8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x5KZP8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x1bfv8FDRD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wYMEv8wZJH/MmaS/zdqlv85bZf/OW6W/zptlf82aZH/MGON/ytfiv8nXIn/Jl2K/ylh + jv8uZZP/MmqX/zVtmP83bpf/N2yW/zZok/8wYo3/K1uH/yVUgf8hUH7/JFOB/yVVgv8nV4T/J1iE/yha + hP8nWYP/JFV//yRUgP8kUoD/IEx9/xxGeP8YQXL/Fz9w/xxFdf8jT33/KViD/ytdh/8uYYr/LWCI/ypf + hf8pXIL/K12C/yxdg/8uXoP/L2CF/y5fhf8sXoT/Kl2D/yldgv8qX4P/LWKF/zFmiP82aYv/OGuN/zdr + jf82ao3/NWmN/zZrjv84bY7/OW6O/zlujv84bY3/N2yO/zhrkP82aI//MmSO/yxdif8kVYL/HU57/xpL + eP8aTHr/H1F//yNVhf8nWYr/KVqO/yhdjf8nYIv/KGaM/y9tkP83dJT/PXqZ/0J/nP9GgJ7/SYCf/0uC + n/9OhqL/UYej/1KIpP9SiKT/UYej/1CGpP9PhaT/TIKk/0Z8ov9Bd57/PHOb/zdumP83bpf/Om+Z/z5z + nP8/c53/PXCb/zVplf8xZZD/LmKN/y5ji/8waY3/NXCQ/zp3lP89eJf/Pnia/z53nv87dZr/NnKU/zFw + kP8vbo7/NHGR/zp0lf8/dJj/QnWb/0N2nf9FeZ//SHyg/0t+n/9Nf6D/T4Cf/0+An/9Ofp//Tnug/016 + ov9JdZ//QW2Z/zdjkf8tWYf/JVOB/yFTf/8nW4T/K2GJ/ytiiv8nXYX/JluD/ypfhv8xZoz/O3CV/0V4 + m/9Mf5//ToGf/0+Cnf9Rg5z/UoSd/1KDnf9Qgp7/Tn+d/0l7m/9DdZj/PnGV/zxwlP89c5b/QXea/0d9 + n/9MgKH/T4Gh/1CAoP9Ofp//T4Ch/0+Bov9PgqL/TICg/0t/n/9Lf5//S3+f/0t+nv9Lf57/R3uc/0N3 + mv89cJT/NWaO/yxciP8lU4L/IE6A/yJRgv8lWYX/KF6H/y1iiP8yZIz/N2eP/zxqkf89a5T/M2GK/yZV + f/8bTHf/GEp3/xtOfP8eU4D/IleC/yhdhv8uYon/M2aM/zNli/8zZYv/MGGI/yxbhv8nVIX/Ik2C/yBN + gf8gUIH/JFaE/yheif8oYIn/KWGK/ypki/8sZYz/LmWO/zBljv8wZI7/NGWQ/zZlj/84ZY7/OGWL/zVj + h/8xYIL/K1t9/yZYff8gU3z/HFB5/yFTfP8lWID/K16F/y1fhP8vYoT/MWOF/zRmh/82aYr/N2yM/zZt + jf82bo7/Nm2P/zdukf83bJH/NmuQ/zdrkP83a5D/N2mO/zVmjP80YY3/MVyM/ytVhf8oUX//J1CA/yVR + gf8mU4T/KViH/y5div8wYov/MmWL/zNqjP82a43/OG2O/ztvkf88cpP/P3SW/0F2mP9AdZb/PnOU/zpv + kv82bJD/NGqP/zVrkf82bZL/Nm6U/zZulf81bJb/MmmU/zBmkf8rYYz/KV+I/yhfiP8rZIv/MGqQ/zVv + lf84c5j/PHaa/z14nP89eJz/OnWY/zhylf85cZT/OXCU/zlulf83a5P/M2aQ/yxeiv8gUn//GUl4/xRE + cv8VRHL/H097/ytbhf80Zov/OGyO/zpwkf88c5T/PXWV/z11k/8+dpT/QHeV/0B1lv8+cpf/OW2T/zRn + jv8xZIz/L2KL/y5hi/8tYIv/KlyJ/yZYhf8iVIL/JFaD/yhchv8tYov/JU1q/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/H0tk/xtafv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/GlR2/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ECAu/zJmk/8zZpT/NWiW/zhr + l/86bZf/OW2U/zVokP8wY43/K16J/yZah/8kWYj/JFqL/ylfjv8tZZP/MWqV/zVsl/82bJb/NWmU/y9h + jf8oWYf/IlKA/yNTgf8kVoL/JliE/ydahf8lWoP/JFiC/yNXgf8iVX//IFJ9/yBQff8fTX3/HUh6/xpD + dv8ZQHL/G0Nz/yFLev8mUn//KlqF/y1eh/8sXYb/KlyE/ypbgf8rXIH/LV6C/zBghP8yYof/MmKH/y9h + hf8sYIT/K2CE/ythhP8sYoX/MGSG/zNniP80aYr/NWqL/zRqi/80aoz/NmuN/zhsjv85bo//OW+O/zhu + jv83bI7/N2uQ/zdqkv80Z5D/LmCL/yVWg/8eTnz/Gkx5/xpMef8bTXv/HU9//yJThf8kVof/JFuJ/yRf + iP8rZo3/Mm2R/zl1lf8+epj/RH+b/0eBnf9KgJ3/TIKf/0+DoP9QhqL/UIai/1CGo/9PhaL/T4Sj/06D + pP9LgaP/RHqf/z10m/82b5f/MGmU/y9pk/8zbJf/Nm2a/zdtmv8zZ5X/MGSR/y9jkP8xZZD/M2iP/zdv + kv8/eZf/Qn6Y/0SBmv9FgJz/RX+d/0N+nv8/e5n/OniW/zVzk/8zb4//OnKU/z1yl/8+cZn/PG+a/z5x + m/9AdJ3/RHae/0d5nv9Ke57/Snue/0t7n/9MeaD/S3eh/0dynf9Ba5n/NV+O/ypWhP8hT3z/IVJ9/yVY + gv8oXob/Jl2G/yVbhf8lWoL/KV6F/y9jiv84bJH/QHSY/0d6m/9Lfpv/TH+a/01/m/9OgJv/UICd/1CA + n/9NfZ7/R3ib/0FymP88bZT/Om2S/ztvlP8+cpf/Q3ab/0h7nv9LfJ//SXqe/0l6nf9LfJ7/S32f/0l8 + nv9Ge5v/Rnua/0Z6mv9GeZr/RXia/0N3mf9CdZj/PnGV/zdpkP8wYYr/KlmF/yJRf/8iVIH/JlqG/yxi + iv8xaY//OG2S/zxxlP9DdZj/R3eb/0Z1mf8/bpT/MmGJ/yRUf/8dT3v/HU99/yFUgf8jWIP/JlyF/yxg + h/8vYon/MGKJ/yxehf8pWIL/JVKB/yFKf/8fSn7/Hkp9/x9Mfv8kVYP/KV+J/y5mjv8xbJH/NG6T/zZw + lf86cpj/O3KY/ztwmP87b5f/O2yU/ztqkP86Z4z/OGSI/zNhg/8vXoH/K1uC/yZZgv8iU33/IVB6/yVU + ff8nVn//LFqC/y9fhP8zY4f/NGaI/zZpiv81bI3/Nm6O/zZukP83b5L/NmyR/zVqj/81aY//OGyS/zlr + k/84apH/NWaP/zNhj/8uWor/J1KC/yJNff8gTHv/IEx+/yRRg/8pVoj/Ll2M/zNkj/82a4//OW+Q/z1z + k/9BdZX/QXWV/0F2lf9Eepj/RHqY/0N5l/9Bdpb/PXGV/zhtk/81apH/M2iR/zJokf80apP/NGuV/zVr + lv8zaZX/LmWQ/yphjP8mXob/KGCG/y9mjP80bpH/OHKU/zp0l/88d5n/P3qa/0B7nP9Ae5z/P3eZ/z1z + lf87cJP/N2uS/zZpkv8zZpH/LV+L/yVWg/8cTHr/FUVy/xlIdP8hUXv/LFyF/zFjif83ao3/O2+R/z50 + lP8+dpb/P3aU/0B4lP9BeJX/QXeY/0B1mf89cZf/OGyS/zNmjf8uYYn/KVyF/yhbhv8lV4T/IVOA/x9S + f/8jVoL/KFuG/y5jiv8lTWn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8iTWX/HFp//xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8ZRmH/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8aNEr/MmaT/zNllP80ZpT/N2mX/zdqlf81aJH/MmWO/zBjjP8rXYn/JliG/yFV + hf8hVof/JFqL/ylhj/8tZ5L/MWmU/zZsmf80aJX/L2GP/ydZh/8kVoP/JFeD/yZahf8pX4n/KmGJ/yhg + h/8nXob/JVyF/yRag/8kWIP/IlWB/yFRgP8gTX//HUZ5/xtBc/8bQXL/Hkd2/yJNev8lUn7/KFeC/ytb + hP8qW4L/KVuB/ytbgP8uXoP/MWGF/zNjh/8zY4f/MWKG/y5hhf8sYYT/K2GE/yxihP8uY4X/MGWG/zFm + h/8yZ4j/M2iJ/zRpi/81aoz/OGyP/zhtkP85bY//N2uP/zZrj/83a5D/NmqR/zNnkP8uYYv/JleD/yBR + fv8bTXn/GUx4/xpNev8cTn3/HU9+/x9Sgf8gVoL/Jl6H/y1njf81bZL/OnOV/z95mP9DfZv/R32a/0p+ + nP9Mf57/ToGg/0+DoP9Og6D/TYGg/02Cof9OgqL/TIGj/0d8oP9Adpr/OXGX/zFslP8raJH/KWWQ/y5p + lf8waZX/LmaT/yxikP8tY5D/M2eU/zhslv88cZf/Q3ma/0eAnf9JhJz/S4ad/0yHnf9LhZ//SYSf/0eC + n/9Cf53/PXuZ/z12lv89c5T/PHCV/zptl/83apb/NGeU/zVplf87bpn/P3Ka/0J0m/9EdZv/RXWc/0d1 + nv9Hc57/RW+c/z9olv8zXIz/J1KC/yFNfP8gT3z/IlWA/yNZhf8hWYb/IlqF/yRbhP8nXIT/LWGJ/zVp + j/88cJX/QnWY/0Z5mP9Je5n/S3ya/0t8mv9MfZz/TX2e/0t6n/9Hdpz/QG+X/zlpkv81Z4//NWeQ/zls + lP89cJj/QHOZ/0N1mv9DdZr/Q3SZ/0N1mv9DdZr/QXOX/z5zlf8+c5T/P3OT/z9yk/9Ac5T/PnGU/ztt + kv83aJD/MWGL/ypahv8jU4D/JFSB/yVZhP8qYYn/M2uR/zt0l/9BeJn/Rnub/0x/nv9QgaH/THue/0V0 + mP85aY//K1yF/yNUgP8jVYL/KFyI/ypgif8sYor/MWWM/zRnj/8zZY7/LV2G/ydVgP8hTH3/H0h8/x5I + fP8dSXv/IU9//yZXhf8rYIv/MWmQ/zdxlf88d5r/Pnmc/0B6nf9De6D/RXyh/0B1m/89cJX/O2yQ/zlp + jP82ZIf/M2KD/zBfgv8tXYT/KVmE/yVUf/8iT3v/Ik15/yNPev8pVX7/LlyD/zNjiP8zZon/M2aK/zRp + jf82bZD/N2+R/zVskf8zaY//MWaN/zNnjv82aZH/OWyU/zVokP8zZI//MF+N/ypZhv8kUYD/Hkt6/xtJ + dv8dSnn/Ik+A/ylWh/8uXov/M2aO/zpvkv8+c5T/QnaW/0N4l/9EeZb/RHmX/0V7l/9GfJn/R3uY/0N4 + mP8/cpf/Om6V/zdrlP80aJL/MmeQ/zJmkf81apX/N2yX/zZrl/8xaJL/K2KL/yZehf8qYoj/MGmM/zhx + kP87dZT/PneW/z94l/9Aepn/Qnyb/0R7m/9FeZv/QHWX/ztvk/83a5L/NGiR/zNlkP8uYYz/J1mF/x5Q + fP8aSnf/G0t3/yFRe/8oWID/MGGH/zZojf87b5P/PXOV/0B2l/8/dZf/QHaX/0F3l/9Cd5n/QHWY/z5y + l/87cJP/N2uQ/zFki/8qXYf/JVeC/yJUgf8fUX7/HlF+/yFUf/8oXIb/LmOK/yVOav8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/x5CVv8bWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll+/w8uQP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yZNb/8wY5H/L2KQ/zBi + kf8yZJL/MWOQ/y9ijf8vYYr/LV+J/yxdif8nWIb/IlSE/x9ThP8fVYX/JFyK/yhhjf8tZJH/MWaU/zJm + lf8uYZD/KFuI/yVZhf8lWYX/KWCJ/y1mjv8uaY//LWiP/yxmjP8qZIr/K2KL/ylfif8nW4f/JVeG/yRS + gv8gS3v/HEJ0/xpAcf8bQnH/HUd1/yBNef8jUnv/JVV+/ydYf/8oWX//K1uA/y5eg/8yYYX/MmOG/zFi + hv8wYob/LmKF/yxhhP8rYYT/K2GC/yxig/8uY4X/L2SF/y9khv8xZoj/MmaJ/zRpjP82ao7/N2uQ/zZq + j/82apD/NWmQ/zVpkP8zZ4//L2ON/ypeiP8pXIX/JFeB/x9TfP8dUXv/G055/xtNev8bTXv/G017/x5R + fv8mWoT/L2OK/zZskf87cpT/P3eX/0J4mP9EeZj/SHqa/0t7nf9Mfp//TH+g/0t+nf9JfZ3/SX2f/0p+ + oP9JfaD/RHid/z50mf82cZb/L26V/ytrk/8sa5T/KmeS/yhjj/8lYI3/KGGO/zBnlP85bpn/QHSc/0V7 + nv9LgqH/TYWh/0+IoP9RiqH/Uoqh/1GJov9Ph6P/TISi/0mDov9HgZ3/RXyZ/0N3mP8/c5f/OGyU/zNn + k/8uYpD/LmGQ/zFlkf82aZT/OmyW/zxtlv8+bpf/QG6Z/0Bsmf8/aZf/OGKR/zBZif8nUYL/IEx8/x5N + fP8gVYD/IlqF/yNch/8iW4b/JVyG/ylfh/8tYon/MmaO/zptk/8/cpb/Q3WY/0Z4mP9HeJn/RneY/0d2 + mf9Idpv/R3Wd/0Nxm/8+bJf/NWWP/y9fi/8uXor/L2GO/zVnkv84a5X/O26X/zxulf87bZP/OmyT/zhq + kf82aZD/N2qR/zdsj/84bI//O26Q/ztukv86bJH/NmeP/zFhjP8sW4j/JlSC/yJSf/8kVYH/KF2H/zBo + j/86c5b/Q3yc/0eAnf9Mgp7/UIWg/1KFov9Tg6P/Snqc/z1tkv8wYYn/JlmC/yZahP8rYIn/MGaP/zRr + kf83bpT/PHGY/z1vmP8zYo3/KVSC/yFMfP8dSHn/HUh6/yBMff8lVIP/KVuI/y5ijP8zaZH/OXGW/z52 + mv9CfZ//Qnyf/0N7n/9Dep7/QXic/zxxlP85bI//NmiK/zNkhv8yYoT/MWCD/y5dgv8sWYL/J1N+/yFL + eP8cRXL/Hkh0/yVQe/8rWIH/L16F/y9hhv8vY4j/L2WJ/zJpjv82bZL/NGqQ/zFmjf8vY4v/L2GK/zFk + jP8xZo3/MGWM/y9ii/8sXYn/KFiE/yRTf/8fTnr/HEt2/xxNd/8hUHz/J1eD/y1fif8yZ43/OW6R/z90 + lf9Dd5j/Q3mW/0R6lf9GfJf/SH2Y/0h9mf9Ie5n/RXma/0J1mf8/c5j/O2+W/zdrkv8zZ5D/M2eQ/zVp + k/83bJb/OG6X/zNrkv8tZo3/K2OJ/yxlif8xao3/OXKT/z53k/9BeZX/QnqV/0J7l/9Fe5r/R3qa/0V4 + mf9Bc5f/O26T/zdqkf81aJH/M2SQ/y9hjf8pWob/I1R//x9Qe/8dTnn/H094/yZVff8tXYT/NWaM/zpt + kv88cZX/PXKW/z1zmP8+dZf/P3WY/z91l/8/dJb/PHKU/zxwlP85bZL/NWiO/y5gif8nWYT/IVOA/x1P + ff8eUX7/IlWC/ypfif8vZYz/Jk9q/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/FzRE/xxb + fv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/DiQx/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/LV6H/y1gjf8rXov/KlyK/ytdi/8rXYr/K12I/ytdh/8rXof/K12I/yxc + iv8nWIj/IFSE/x5Ug/8dVYP/IlmH/yhejP8rX47/LWCP/y1fjf8oW4j/JFmE/yddh/8tZo7/MmyS/zJu + k/8xbpL/MW+T/zBrkf8waJH/LmWQ/ypfjP8oW4n/J1eF/yRRf/8fSXf/GkJw/xlBb/8cRnP/Hkx3/x9O + eP8gUnr/IlR7/yVXfP8qW4D/LV2B/y5eg/8vYIT/L2CE/y1hhP8sYIT/LGGE/ypghP8rYIP/LGKD/y1j + hP8vZIX/L2OF/y5ihf8wZIf/MmeL/zNojf80aY7/NGmP/zRokP80aJH/NGaQ/zBkjf8rX4j/KV2G/yhc + hf8nXIP/J1yC/yVagf8hVX7/Hk15/x1Lef8cSnj/H056/yRVf/8rXYX/MmaM/zlukf88cZP/QHOV/0J0 + lv9Fdpn/R3ib/0l5nv9Je5//R3qe/0Z5m/9GeJv/RXib/0R3m/9BdJr/PHWZ/zZzl/8wcZb/MXKZ/zFv + l/8tapT/JWGM/yNeiv8oYo//MmyX/zx0nP9Ee6D/S4Kj/06Go/9RiKP/U4qj/1WNpf9WjaX/VYym/1SJ + p/9Shqf/ToWj/0uDn/9LgZz/SX6d/0R4nP87b5f/MGSP/yxgjv8rX43/LWGO/zBkj/80aJL/NGiR/zVn + kv83ZpL/OWaT/zZhkf8xW4z/KlSG/yRNgP8gTH3/H1F9/yJZgv8mX4f/KGGK/yliiv8qYon/LmWL/zFn + jf81aZD/OWyT/z1wlv9Acpf/Q3SY/0N0l/9Bcpb/QHGW/z9ulf8+bJb/PWuX/zlnk/8zYY7/K1uJ/yRV + hf8nWYf/K12L/zBkkP81aJL/NmmR/zZokP8vYon/LF6G/yxehv8wY4v/MmaN/zRojf82ao//OGuR/zdp + kv8zZJD/Ll6M/yhXiP8kUoP/IlKA/yVYg/8tYov/N26U/0N7nf9IgZ//TYWf/0+Hnv9SiJ//U4eg/1OE + of9MfZ7/QXKV/zRmjP8qXYX/JVqC/ylgh/8waI7/OHCU/z93m/9Dep//QHKa/zhnk/8uWYf/Ik59/x1J + ef8eS3v/I1GA/yhWhf8qWof/LF6K/zFmjv82a5L/OW+U/ztzl/89dZn/PHWY/zpylv84cJT/OG+S/zVp + jP8yZYf/M2SG/zRkh/8yYoT/MF6E/y1agf8nUn3/HkZz/xhAbf8YQG7/IEl2/ydSff8qWIH/K1yD/yte + hP8rX4X/LGOI/y5kiv8wZYz/LmKK/y1giP8sXob/Kl6G/ytgh/8rYIf/K2CH/ypdhv8oWYT/J1eC/yVV + gP8iU3z/IFJ6/yJUfP8lWH//K1+F/zJni/85bZD/P3KU/0F1lv9Cd5X/RHiV/0d7mP9JfZn/Sn2a/0h7 + mf9Gepn/RXqb/0N4m/8+c5f/OG2S/zRojv8zZ4//NWmS/zhtlf84b5b/Nm6U/zJrj/8vaIz/MGmM/zRt + kP87dJX/QHmY/0F6lf9CepP/Q3qU/0V4lv9GeJf/RXeY/z9xlf87bpP/NmmR/zRnkf8yZI//MGGM/y1d + if8oWYT/JFR+/x9Pef8eTXj/I1F6/ytZgv8zYov/OWmR/zptlf87b5b/OnCW/ztylv87cpX/PHKV/ztx + k/88cpT/PXKV/zxwlP83a5D/MmSN/ytdiP8iVIL/H1F+/x5Qfv8mWoX/LGGK/zBnjf8mUGr/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8bN0b/G1p+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xxbf/8KGCL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMGCf8tYo3/KFyJ/yZa + hv8mWYb/JlmF/yZZhP8nXIX/KF6G/ylehv8tYYr/LmCM/ypdi/8jVof/H1OD/x1Rgf8cUIH/IVOD/yZY + if8qW4v/KFqI/yVYhf8iWIP/KF+J/y5pj/80b5T/NHGV/zNxlP8zcJT/NHCW/zNtlv8wZ5L/LWGP/yxe + jP8rWon/JlSC/yBNef8bRnH/G0Vx/x1IdP8gTnn/IVF7/x9Ref8fUnn/IFJ4/yVWfP8pWX7/KVp//ytc + gP8rXYH/KV6B/ytghP8rYYX/K2GF/yxihP8tYoT/LmOE/y5jhf8uYoX/LmKG/y9jh/8wZYr/MWaL/zJn + jf8wZ47/MGaO/zJmkf8xZJD/LWCM/ypeiP8oXYX/KV6F/ythhv8tY4f/LmSI/ytdhP8nVH//Ikx6/x5J + dv8eS3f/IVB6/ydWf/8uX4b/NWaM/zlrj/89bpL/P3GU/0Fyl/9Cc5n/Q3Wc/0R2nf9DdZv/QnSZ/0F0 + mf9Ac5j/P3KY/z9zmP88dpn/OHeZ/zh3mv84d5z/N3ac/y9ulf8pZpD/JmON/ylmkP8yb5f/PHed/0aA + o/9MhaX/UIik/1KKpP9Ui6T/VYyk/1iOqP9Zjar/WIyq/1WKqf9QiKT/TYag/0yEn/9Og6H/SX2g/z5y + mf8zZ5L/LWGO/y1hjv8tY47/L2WP/zFmj/8yZ5D/MWWP/zBijv8wYI3/MF2M/yxXiP8mUIL/IUx+/x5N + e/8gVn7/JV+F/ytliv8xao//MmqQ/zNrj/80bJD/NmyQ/zhtkf87b5T/PG+W/z5wl/9AcZf/Pm+W/zts + lP85apL/NmaR/zVkkP80Yo//MWCO/yxcjP8mV4j/I1WF/yFVhP8mWoj/Kl+L/y9kjv8yZ5D/MGSM/yxf + h/8kV4D/KFqD/y1fiP8wZIv/MWaN/zJnjf81aJD/NGaR/zFjkf8rXI3/JlWJ/yNRg/8iUoH/JlmE/zJm + jv8+dJj/R3+f/0yFof9QiaD/Uomf/1OJnv9Uh5//UYOe/0t8nP9Cc5b/N2iO/yxgh/8mW4P/J12E/y5m + jP83cZT/QHqc/0J5nf8+cJn/OmiU/yxZh/8hT33/HEp5/yBOff8lVIL/J1aE/yZWhP8nWIT/KlyG/y5i + if8xZYv/MWeM/zFojP8xaY7/LmaL/y1lif8vZYn/L2SG/y9jhP8xY4X/M2SF/zNjhv8vXoP/LVqB/yRQ + ef8bRXH/FT1q/xU9a/8aQnH/H0t3/yVTfv8nWIH/KFuC/ydcgf8nXYL/KV+F/ypfhv8qX4b/KV2E/yld + g/8oXoP/J16D/ylghv8rYIf/K1+H/yteh/8rXof/K1yG/ypbhf8oWoL/JVl//yVafv8qX4P/MWaJ/zhs + j/88cJH/PnKT/0B0k/9Fd5f/SHqZ/0l7mv9JfJr/SHuY/0d6mf9HfJv/RHma/z90lv85bpH/NWmO/zFl + i/8zaI3/OG2S/zpwlf84cJX/NGyQ/zJqjf8ya43/NW6Q/zt0lv8+dpj/QHeX/0B3lP9BdZL/QnSU/0N0 + lf9CdJb/QHOW/z1vlf84bJT/MmaP/y9jjP8uYIv/L2CM/y9fiv8rWYT/I1F8/x9NeP8gTXj/KVWA/zFe + iP83ZY//OmmU/zhslP84bpX/OXGV/zlwlP84b5L/OG+S/zpwk/8+c5X/PnGW/zlsk/81Z5D/LV6K/yVX + hf8hU4H/JFeE/yleiP8uZIz/MWiO/zRsj/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xo2 + Rv8cWn//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p//wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Cxkj/yphi/8mXIf/IVeC/yJXgv8jV4L/JFqD/yheh/8qYIj/LGSK/y5m + jP8wZo7/LWGM/ydbiv8jVYf/IFGD/x1Nf/8fToD/IlGD/yVUhP8kVYT/IlSB/yVag/8pYYn/L2mP/zRv + lP82cpX/NXGU/zRwlP81b5b/NW+X/zNqlv8wZJL/L1+Q/y1cjP8oVoT/IE58/xxJdf8bSHL/Hkt2/yNR + e/8lVn//JVd//yBTev8dUHf/HlB3/yFSeP8kVXz/Jlh+/ydZf/8pXIL/Kl+F/yxih/8tY4f/LWKG/y5j + hf8vZIb/L2SH/y9jhv8wZIj/L2SI/y9kif8vZYr/L2aM/y9mjP8vZoz/LmSN/y5ijf8sX4v/Kl6I/ypf + h/8rYof/LmaI/zJpi/8zaYv/NGSL/zFchv8qVH//IUt3/x1Hcv8fSnT/I1B5/ylXf/8wX4b/NWWL/zlp + jv88bZL/PW6V/z1vlv8+cZn/PHGY/zxxl/88cJb/PHKY/zxxl/89cZf/P3WY/z13mf88eZr/PXud/z17 + nv85d5z/NXKZ/y9tlf8ta5T/LmyU/zJxl/86eJz/RICi/0yGpP9Ri6X/U4ul/1SLpP9Vi6T/V4um/1mN + qv9ajq3/Voup/1KJpf9QiKL/Toag/0yCn/9IfZ7/QXWb/zdrlf8xZpH/L2WQ/zFokv80a5P/NGuT/zNp + kf8xZ5D/L2SN/y9gjf8sW4r/KVaG/yRQgf8fTX3/IFN9/yRdgf8qZYf/MmyP/zZwkv85cpT/O3SV/zxz + lf89c5T/PHGR/zxvk/88b5T/PW+W/zttl/86bJX/OGmT/zNkj/8xYY3/L1+M/y5di/8rW4r/KFmK/yNX + iP8iV4b/JFmH/yZbiP8pX4r/LmSN/zBmjv8uZIz/KmCH/ypehv8sYIf/LWCJ/zNmjv80aY//M2iO/zFl + jP8xZI7/LmCO/yhai/8jUYX/IE2A/x9Nff8pWob/NmmQ/0J3m/9KgJ//T4ai/1GKoP9SiZ//U4ie/1KG + nv9RgZ7/S3ub/0BxlP82Z47/K1+G/yZbg/8mXYT/K2OK/zdwlP87dJj/PHGY/ztrl/8yYI3/JlWC/xtL + eP8dTXr/IVF+/yVUgv8lVIL/IlOA/yJUgP8jVH//JliB/yhbg/8nW4L/KF2E/yhdhf8lXIP/JFuC/ydc + gv8qXoL/LGCC/y5ggv8vYIL/L1+D/y5dgv8oVn3/IE13/xlFcP8UP2v/FD1r/xY/bv8cSHX/IVB7/yVX + gP8mWoH/J1yC/yddgv8mXIH/KF6D/yldhP8pXYL/KV6D/ylghf8qYob/LWSJ/y9mi/8wZoz/MGaM/zFm + jP8yZY3/MWOM/y5hif8qXoT/KV2D/ypfg/8wZYj/NmuN/zpukP89cJH/QXKU/0V1mP9JeZv/Snuc/0p8 + m/9JfJn/RnuX/0Z7mf9EeZf/QHWV/zpvkf81aY3/MWWJ/zFmi/81a4//OW+T/zhvk/82bpH/NGyO/zJr + jf80bY//Nm+T/zlylv87c5f/O3KV/zxwk/89b5P/P3GU/0Bylv9Ac5j/P3Oa/zlulv8zaJH/LmOM/y5i + jP8yZI3/MmON/y9diP8oVoH/IU55/yFMef8lTnv/LVaE/zVejP82ZY//NmmS/zVsk/83bpT/OHCU/zdv + kv82bpL/OW+T/ztxlf87b5b/O22V/zRmkv8uYI3/J1mH/yRXhf8nW4f/K2CL/y9mjf8xao//NW+Q/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GzZH/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8ZT2//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ULD7/K2KN/yde + if8jWoX/IFeB/yJYgf8lW4T/KmCJ/y9njv8zbJD/M2yQ/zNsj/8xaI3/LWKM/ypbiv8nVYj/I1GD/yFM + gP8gTX//IE5+/yBQf/8iVYD/JVuD/ypih/8xa5D/N3GV/zhzlv83cZT/NW6U/zdulf83bpf/NGmW/zJk + lf8wX5L/K1qL/yZUhP8hT33/HUp3/x1KdP8hTnj/J1Z//ypbg/8oW4P/JFh//x9Sef8aTXX/HE52/x5P + d/8hU3v/JFd//ydag/8rX4j/LWKI/y5jiP8vZIf/MGWI/zJnif8yZ4r/MmeK/zFlif8wZYn/MGWK/zBm + i/8vZYv/LmWM/y1kiv8sZIv/K2OL/ythif8sYYn/LWOK/zBni/8za4z/NW2N/zdsjf84aI3/OGSM/zJd + hf8pU3z/Ikt0/xpDbf8eSHL/JFB4/ytYgP8xX4f/NmWN/zdpj/84a5L/OGyU/zdslP81a5L/NWqQ/zdu + lP84cZb/OXOX/z11mf9Ad5n/QHmZ/z56mv8/e5z/QH2f/z56nv84dZv/NXKZ/zJwmP8xcJf/NHOY/zp5 + m/9Cf6D/Soaj/1CKpf9TjKb/Voym/1aKpf9Yiqb/WYqo/1mMqv9Yjav/Vouo/1SKpf9Rh6H/ToKe/0h9 + m/9CdZn/Om6W/zNokv8zapL/Nm+V/zpzmf86cZf/N26V/zVsk/80aZL/MmWQ/y9gjf8qWoj/JlWD/yJU + f/8jWX//J2KD/zFsjP84cpL/O3WV/z13l/9BeZn/RHua/0R6mf9BdZb/PXGS/zxvkv8+cJX/PW+X/zls + l/82aJP/MmSO/y5fjP8rXIn/KVqI/ydYh/8lVof/JFiI/yRZiP8nXIn/KV6L/ythjP8uZY7/MGeO/y9n + jP8vZYz/MWeM/zJnjf80aZD/OG2T/zpvlf83bJH/M2iN/y9iif8rXoj/JleG/yFNgP8cRXj/IU19/yta + h/84apP/Q3ea/0uBoP9Qh6L/Uoig/1KInv9Sh57/UYOe/05/nf9JeZv/QHGW/zZnjv8tYIj/JFqC/yNa + gv8pYYj/MGiP/zRqkP80Z5D/MGGN/yhahf8fUHz/HU56/x9QfP8hUn7/I1SA/yNUgP8iVID/I1V//yJU + fv8iVHz/JFd//yZZgP8lWIH/IleA/yZahP8mWoP/JFd//yldgf8tYYH/LWCB/ypbfv8rW3//Kll+/yVU + e/8fTXb/GUdx/xVCbv8WQW7/GUVy/xxKdv8iUnz/J1mB/ylehP8pYIX/KmCF/yphhv8qYYb/K1+F/yxi + h/8tZIf/LWWI/zBojP8yao3/NW2Q/zhwk/84b5P/OG2T/zlulP83apL/NGeP/zBjiv8rX4X/K1+E/y5k + iP81a43/OnCR/z1xk/9BcZX/RXWY/0h4mv9Le5z/TH2c/0p8mv9He5j/RXqX/0R4lv9AdZX/PHCS/zZq + jf8yZoz/MWaM/zRqj/83bZH/OW6T/zdukv8za4//MWmN/zBpjf8waY7/MmuQ/zRrkv80bJT/N2yT/zpt + kv87bpP/P3KX/0F0mv8/c5v/OW6W/zJpkf8vZY3/MWWO/zNmj/80ZY7/M2CL/y1Zhf8nUn//JEx7/yRL + e/8nTn3/LFaE/zFei/8xY4z/MmiQ/zVskv84b5P/OG+T/zhvk/83bpT/OG2W/zlulv84a5X/NGaS/y1f + jv8nWon/JVmI/yddif8sY4z/L2iO/zJskP82cJH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8cN0j/Hlx//xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xVDXv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xs7Uv8uZ5D/KmOL/ydfif8kW4X/I1qE/yZdhf8rY4r/MWqQ/zdw + lv83cJT/Nm+R/zRsj/8zaI7/L2CN/yxZi/8qVIf/JE+C/yBLff8eS3v/Hk58/yBUff8lW4L/LGOJ/zRt + kf86c5b/O3KW/zlwlf84b5X/OW6W/zhslv80ZpX/MGCT/yxaj/8mVIj/IU+B/x9NfP8cSnj/HEl1/yNR + e/8qWYL/Ll+G/ytehf8nWoL/JFd//x9Sev8bTXf/G013/x1Oef8iVX//KVqF/y1fif8uYYn/L2OI/zFl + if8yZor/NWmM/zVqjf80aYz/M2iL/zFni/8xZov/MGaL/y9mjP8uZYz/LGSL/ytjif8qZIn/K2SK/yxl + i/8wZ4z/NGyO/zdwj/85cY//O26P/ztrj/85aY3/N2SK/zNdhf8rVHz/Ikt0/xxEbv8eR3L/JlF7/yxZ + hP8yYIr/M2SN/zNmkP8yZ5H/MWiP/zBnjv8waY//MWyR/zNvk/85dJj/PXaa/0B5m/9AeZn/QHqZ/0B7 + nP9CfZ7/QHue/zx4nP84c5r/NHGY/zJxl/80cpf/OXea/0B+nv9IhaP/T4ql/1OMp/9Wjaj/WIyo/1mK + qP9Ziqj/WIup/1mLqv9Zjar/WIun/1WJpP9Qg5//S36b/0N2mP88b5X/N2yT/zdulP86c5f/PHWY/z53 + mv89dZn/OnGX/zlvlv83bJX/NGeR/y9gjP8oW4b/JFmA/ydegv8tZ4j/NW+Q/zp0k/89d5b/P3mY/0N8 + mv9If53/Sn+e/0d7mv9Ddpb/P3KU/z9ylv8/cZj/O22X/zdpk/8yZJD/Ll+L/ypaiP8lVoX/JFOE/yRV + hf8mWIf/J1uJ/ylfi/8sYo3/LmWO/zBnj/8za5D/NGyQ/zZukv82bZL/N22S/zlvk/89cpX/PnOX/zxy + lf83bJD/MWWK/yxehf8mVoL/H0p8/x1Hef8hTHz/K1qG/zZokf9Cdpn/S4Gg/02FoP9Ph6D/UIef/0+E + nv9OgZ7/S32c/0Z1mf8/b5b/OGiR/y5hiv8nXIX/I1mC/yRahP8oXYf/K12H/ytchv8nWIP/IVN9/x5R + ev8gU33/IVV+/yNWgP8lV4L/JViD/yZahP8mW4T/J1uD/yhbg/8oW4L/KVyE/yhchf8pXIb/K16J/y1f + iv8sYIb/LWOD/zBlg/8tYYH/K15//yhaff8oWH7/JVR8/yBPef8bSnX/GUdz/xtIdP8dSnf/IVB7/yVX + gP8qXob/LWOJ/y5miv8uZ4r/LmaK/y9niv8vZ4n/MWmL/zJqjP8za43/NW6Q/zdxk/86dJX/PXaX/z12 + mP8+dZn/PXOY/zxwmP87bpf/NWiQ/y5iif8qX4X/K2GG/zJoi/83bpD/PHKU/0Bzlv9FdZj/SHea/0t5 + nP9LfJz/Snua/0d6l/9GeZb/RHiX/0N2l/8/cpX/OWyR/zNnjv8xZY3/M2eP/zZqkf86b5X/NmyT/zJp + j/8uZoz/K2OJ/ytjif8tY4v/LWSN/zBmj/8zaZD/NmuP/zpvkv8/c5f/Qnac/z1ymf84bpX/MmqR/zJp + j/8yaI//NGiQ/zdokP82ZY7/MV2K/ytUg/8lTH3/Ikh6/yJKev8mUID/KliG/y1hiv8wZY3/NGqQ/zds + kv84bpP/OG2S/zhtlP84bZb/N2yX/zRnk/8vYpD/K12M/ydaif8mW4n/KWCL/y1njv8wao//M2+Q/zZy + kf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xo2Rv8cWn7/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Diw//wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/KFNw/zRt + lf8xaZH/LGWN/ylhif8nX4f/J1+H/ytki/8ya5H/Nm+V/zdwlf83b5T/Nm2S/zRqkf8yZY//MF+O/yxX + iv8lUIL/Hkl6/xtKeP8bTnj/HlN7/yNbgP8tZov/NW6S/zpylv88c5f/O3CW/ztulf85a5X/NmiU/zBi + kv8rWo7/JFOH/x5Ngf8dS37/HEp7/xlHdv8cSnf/I1J8/ytag/8vX4f/MGGH/yxehf8nWoL/JVaB/yFS + fv8dT3r/HU56/yJRfv8nV4T/LV6I/y5gh/8vYoj/MWWJ/zRojP81ao3/NmuO/zZsjv80a43/MmmM/zJo + jf8xaI3/L2eN/y1li/8rY4r/KmOJ/ypkif8rZor/LmiN/zJsj/83b5H/O3KR/z50kv8/c5L/PnGR/zxu + kP86ao7/N2OJ/zVehf8sVX7/Jk55/x9Ic/8eSHP/JVB8/ylXg/8uXYj/LmCL/y1ijP8sY4v/K2WL/yxo + jf8uao7/NG+S/zp0l/8+d5r/P3ia/z94mv8/eZr/Qnyc/0N9nv9Ce57/PXic/zlzmf81cJf/M2+W/zNx + lf84dZf/P3ub/0aCoP9NiaX/Uoym/1WMqf9YjKr/W4yq/1uLqv9ai6r/Wouq/1uMqv9Zi6j/Voil/1KE + of9Lfpz/RHaY/z1xlv86bpT/OXCV/zpzlP88dZb/P3iY/z93mf8+dJj/PHKX/zpulv84bJX/M2WP/yle + h/8nXYT/KWCF/zFpjP82cJH/O3WU/z13lv9Bepn/RX6b/0mBnf9KgJ3/S36c/0d6mv9Ddpj/QnWY/0F0 + mf88bpj/N2mU/zJlkf8tX4v/J1iG/yNRgv8iUYL/I1WD/yZYh/8pXYn/LGGL/y5ljf8waI//MmmP/zVs + kP86cpT/PHSV/ztzlf87cZT/PHKV/z90lv8/dZf/PnOV/zlukf8yZ4v/LF6F/yhVgv8jTH7/H0l6/yJP + ff8pWYT/M2eN/z10lv9Fe5v/SYGe/0qDnv9Lg57/S4Cd/0p+nf9GeZv/QnOZ/z1ulv83aZL/MGON/yle + if8kWoX/I1eC/yJTf/8lU4D/I1N+/yFTfP8eUnr/IVV9/yNZgP8nXYP/KV+F/ypghv8rYon/LWWM/y1k + iv8uZIr/MGaK/zFli/8xZYv/MWaM/zJljf8zZpD/NGeO/zNoiv80aof/MWeF/y9khP8tYYL/LF+C/ypc + gf8nWH//JVR9/yFRev8fTnn/IE96/yJRfP8mVoD/KlyE/y5jif8yao7/MmyO/zJsjv80bY7/NG2P/zVt + jv82bY7/Nm2O/zZuj/84cJL/O3WV/z95mf9Aepn/QXqa/0B5mv9Ad5r/P3Sa/z5xmf85bZb/MmaP/y1i + iP8rYYb/K2KH/zJqjf85b5H/PnOV/0R1mP9Hd5n/Snib/0p6m/9IeZr/R3mX/0V4lv9Ddpf/Q3aZ/0F0 + mf85bJP/M2aQ/y9jjv8vY47/M2aR/zVpk/81apT/M2iR/yxjiv8oX4f/Jl2E/yheiP8qX4n/LmOM/zJn + jf81a4//OW+S/z50lf89cpb/O3CW/zVsk/8za5H/M2uP/zNqjv83a5H/OGqS/zhokP81YY3/LVeG/yZO + f/8gR3r/H0h6/yNPfv8mV4T/K1+J/zBkjP8zZ47/NWqQ/zZrkP83bJL/OGyU/zdrlv80aJT/MGSR/yxg + j/8oXYz/J1yK/ydciv8tZY//L2qR/zBskP8yb4//NHKR/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/GjZG/x9dgP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZfv8KGyf/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP81bY//OXOZ/zhxl/8zbJP/LWWN/ypiif8pYYn/K2SL/zFq + kf80bZP/Nm+V/zdvlf84bpb/NmuT/zRnkf8zYpH/LFqL/yRRgv8eSnr/GUl2/xpNeP8eU3v/JV2C/yxl + if80bZH/OnGW/z1yl/88cJf/O2yT/zZnkv8vYY//KVuM/yNTh/8cTID/G0p+/xtKff8ZSHv/G0l5/x1L + ef8hUXv/KVmB/y9ghv8xYof/LmCF/ytehP8pWoT/J1eD/yRTgf8iUH//IlF+/yZUgf8qWoP/LV+G/y5h + h/8vY4j/MmaL/zZrj/83bJD/N22P/zVrjv8zao7/MmmN/zNpjv8wZoz/LGSK/ypjiP8pYof/KmSJ/yxn + i/8xa4//NW+S/zlyk/89dZP/QnmW/0J4lv9BdpX/P3OT/z1ukP87aY3/OGSL/zdhif8vWIP/KFF8/yFK + d/8bRXL/H0x5/yNSf/8nWIT/J1yF/ydehv8pY4n/KmaL/y9rjv82cJP/PHSW/z52mP8/eJr/QHma/0F7 + nP9EfJ3/RX6f/0N8nv9AeZ3/O3Wb/zZvlv8ybZP/Mm6U/zVxlf89eZr/RICg/0uHpP9Piab/Uouo/1eM + qv9bjar/XIyq/1uMqf9bi6n/Woup/1mIp/9WhqX/UoOi/0p8nf9CdZj/PHCV/zhtlP84bpT/OnKV/z12 + k/8+dpX/P3aW/z50l/88cZX/OW2U/zdrk/8xZI7/K2CJ/yhfhv8sY4j/MmqN/zdwkv88dZX/PneX/0F6 + l/9Ffpr/SYCc/0qAnf9Jfpz/Rnqa/0N3mP9BdZj/QHOZ/z5vmf84aZT/MmSP/ytcif8jU4D/IE9+/yFQ + f/8lVYP/J1uG/ytfif8uZIv/MGaM/zNqjv81bZD/OXGT/z51lv9Ad5j/PnWW/zxzlP89cpT/QHWW/0B1 + lv8+c5T/Om+Q/zRniv8vXob/KVSD/yNNff8fSXr/IE17/ydYgv8wZIr/N2+Q/z12lf9Be5j/RH2Z/0R8 + mf9GfZr/RHmZ/0F1mf8+cZf/PG6X/zdplP8xZZD/KmCL/yhdif8oWob/JlSC/yBOe/8eTXn/HU54/yFV + fP8lXID/KGCD/y1liP8vaIr/MGiL/zBpjf8ya4//M22Q/zRtj/83bpD/OG6R/zlukf84bZD/OG2T/zlt + kv84bY//OG+N/zZui/80aoj/MmeH/zJoiP8zZ4j/MGOI/y1fhf8qWoL/JVZ//yRUfv8lVYD/J1mB/ypc + hP8uYoj/MWiL/zVvj/82cJH/NnCR/zdxkf85cZL/OnGS/zpxkv85cJH/OXCR/zpykv88dpT/P3mY/0J9 + mf9CfJn/QXqZ/0B4mf9Ad5n/P3SZ/zxwl/83a5T/MWaP/ytiif8qYYf/LWOJ/zNpjf88cJP/QnOW/0Z2 + mP9Hd5r/R3ea/0Z3mv9Edpj/Q3WX/0J0l/9Bc5n/PW+W/zhqlP8wY5D/LF6M/ytdjP8sXo7/MGKQ/zFl + kf8vZJD/KmGM/yVbhv8kWYT/JlqG/ypeif8vY4v/M2eN/zdskP87cZL/PHKS/ztwkv84bZH/NmuR/zNr + j/8ya47/NGyP/zdskP84a5H/OGeQ/zVijv8yWov/KFCB/yBIev8cR3j/Hk17/yVWgf8qXYb/L2OK/zJn + jP81aY7/NmuQ/zhskv84bJT/NmqU/zJnkv8uYpD/Kl+O/ylfjf8oXoz/LGSP/zBpkf8xbZL/MG6P/zJv + kP8ycJH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8XLz7/HVx//xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Glp9/wYRGP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Bw4T/zx2 + mv88dpv/PHab/zhxl/80a5L/L2eN/ypiif8sZIz/L2iQ/zNsk/81bZT/NW2U/zZslP83bJX/NWiT/zFi + j/8sW4v/JVKE/x5MfP8aS3f/GU13/x9Xfv8lX4T/LGaK/zJskP84b5X/O3GX/ztulv83apP/MWOP/yhb + iv8kVob/HlCB/xpKff8cTH//Hk2A/xxMfv8bSnv/HUx7/yJSff8qWoL/MGGH/zJkh/8wY4b/LmGE/y1f + hP8rXIX/KVeD/ydSgv8lUoD/JFN//yhYgv8pWYL/K12E/y1ghv8wZIn/MmiL/zZsj/83bZD/NmyQ/zVr + kP80a4//M2mO/y9mi/8sY4j/KWGG/yhihf8qZIj/MGqN/zVvk/84cZT/O3OU/z91lP9CeZb/Q3yY/0N6 + mP9Bd5X/P3GS/z1tkP88apD/OWaO/zdhiv8wWYX/Jk98/x1Hdf8VQG7/GUh0/x1Pev8gVH7/JVyD/ydg + hv8qZor/M22P/zpzlP8+dZf/QHaY/0B4mv9Depz/RHyd/0Z9nv9FfJ7/RHyf/0N7oP8/d5//OHKa/zJs + k/8vaZD/NG+T/zt3mv9Df6D/R4Si/0uHpP9Piab/VIum/1mMp/9bjKj/W4un/1mJp/9YiKb/VoWk/1SD + pP9PgKH/SHmd/0B0mP85bZT/NWqS/zZtlf83b5b/OnKV/z10lP8+dJX/PXKV/zpuk/82apH/MWWO/yxh + i/8pXoj/KV6H/y1jiv8za4//OXKV/zx2l/8+d5b/QXqX/0R8mf9Gfpr/SX6c/0Z7mf9Dd5f/QXaX/0B0 + mP8+cZj/O26W/zdok/8zYpD/LFqK/yRRgf8gT3z/JFSA/yhZhP8sXoj/L2SL/zJojP8za47/NW6O/zlx + kf89dZb/QXiY/0J4mP9Adpb/PnOT/z90k/9AdJT/QXaW/0F1lf88b5D/NmiL/zFfh/8oVIH/IUx7/xxH + d/8hTHv/JlaB/yxgh/8xaYz/NHCQ/zlzkv86dZT/PHaU/z10k/89c5X/O3GU/zluk/84a5T/NWmT/zBm + kP8tYo7/K1+M/y5ejP8oWIb/IlF+/x1MeP8eUHn/I1Z+/ydegv8uZoj/MmuM/zRujf80bY3/NG2N/zVv + kP84cpL/OnOS/ztzkv89dJT/O3KS/zpwkf85cJL/O3KS/ztykP86co//OXCN/zdti/81a4r/N2yL/zht + jv83a47/M2aK/y5gh/8pW4T/J1mC/yhZg/8rXYX/LmKI/zFoi/81bo7/N3GQ/zl0kv85dJP/PXWV/z91 + lf9AdZX/PnSV/z50lf89dJT/PXWT/z52k/9AeZf/QnyY/0N9mP9Ce5j/QXmY/0F4mP9Adpr/PnOZ/zpv + lv81apL/L2SO/ythif8rYYj/MWaM/zlskf9AcpT/Q3SX/0R1l/9EdZj/RHWY/0Fzlv8/cZb/P3CW/zxt + lv84aZT/MmOR/ypci/8kVob/I1WG/yZYif8pW43/K12P/ypejv8nXIr/I1iF/yJVgv8lWIT/KVyH/y9j + i/8zZ4//Om6S/zxxk/87cJL/Om+P/zhtj/82a4//M2qO/zNsj/80bI//NmyQ/zhqkP84Zo//NWGN/zBa + iP8pUoL/H0l5/xlGdP8dTHn/I1V+/ypdhP8vY4n/MmaL/zNojP84bJH/OW2S/zltlf83a5X/MWaS/y1i + j/8pXoz/KWCN/yxkj/8vaJH/MWyS/zBukf8ycJH/M3GS/zRzlf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/w0cI/8eXH//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8dWn//AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8PHSb/Pnea/z53m/89dpn/PHSZ/zlwlf81bJD/L2eO/yxl + jf8vaJH/MWmR/zJqkv8zapP/MmmS/zNnkv8zZpH/MGKO/ypbif8kVIP/HEt8/xhJd/8bUHr/IFmA/yZj + h/8rZ4z/L2uR/zRulP84bpb/OGuV/zVok/8uYY7/J1qI/yFTg/8cTn//HlCB/yBRg/8hUYT/IFGD/x9P + gP8fT33/IlR//ypbg/8xYof/NGaJ/zNmh/8xZYT/L2OE/y9ihP8tXIP/KVeC/yZUgf8lVH//JVaA/yVW + gP8mWID/Kl2D/y1ihv8wZon/M2mM/zZtj/84b5H/OG6T/zZskf8zao7/LmaK/ypjh/8oYYX/JmGE/yxn + iv8zbZD/OXKV/zx1l/89dZb/QHeW/0N6lv9EfJj/RHyY/0J5lv8/dJT/PnGU/z5vlP86apH/NmSO/zBb + iP8pUoD/H0l3/xlFcv8UQ27/Fkdx/x1Ref8iWH//Jl6E/y5niv83b5D/PXSU/0B2lv9Bd5j/Q3mb/0V8 + nf9GfZ3/Rn2d/0Z8nf9Ee53/RHqf/0N5of87cpv/M2yV/y9qkf8zbpT/Onaa/z98nv9DgqH/SIaj/02H + ov9TiaL/WIqj/1iKpP9ZiaT/WIil/1aFpP9Vg6T/UoGj/05+of9Gd5z/PHCW/zRpkP8yaJD/MmmS/zRs + lv84b5X/O3CU/zxxlP88b5P/OWyS/zRoj/8tYYv/KFyH/yZbhf8oXYb/LWOL/zNqkP85cZb/PHaY/z95 + mf9AeZj/QnqY/0R7mf9Eepj/Q3iW/z90lP8/c5b/PnKX/z1vl/86bJX/NmaR/zRgkP8yW4//KFKF/yJQ + f/8mVoL/LV+I/zBkiv80aYz/Nm2P/zdwkP85cZH/PHST/z93lv9CeZj/Q3mY/0N4l/9DeJb/QXWU/0J1 + lP9Ddpb/QnWV/z9wkf85aY3/MmGI/yhVgP8dSnb/HEl1/x9Nef8kU3//KVqD/yxih/8vaYv/MWyN/zNu + j/80bo//NW2P/zVsjv81a4//NWmQ/zJljv8wY43/LWKN/yxgjf8tXo3/LFyL/yhYhv8iUn//H1B7/yFT + fP8lWX//K2GF/zJpiv83cI//OHGQ/zhxkP83cY//OHKQ/zt0kv89dpP/PneT/z53kv88dZH/OnOP/zpy + kf87c5H/PHSR/z10kf88c5D/OXCN/zhujP85bo3/OW6O/zltkP82ao7/MmSK/yxfh/8pW4T/KFuE/ytf + hv8vZYr/NGyO/zZwkP85c5L/OnWT/z54lv9CeZj/RXqa/0R5mf9EeJj/QneY/0F3l/9BeJb/QnqW/0N7 + l/9Ffpn/Rn+Z/0R9mP9DfJb/QnqX/0J5mf9Bdpr/PnOZ/zlulf8yZ5D/LWKM/y5hiv8xZYz/NmqQ/ztt + kv8/cZX/QHGU/z9xk/89cJP/PW+T/ztskv86a5P/N2iS/zJjkf8tXo3/JleH/x5Pgf8dToD/IFKD/yNV + h/8lWIv/JlmL/yRXiP8gVIL/HlF+/yBTf/8mWYT/LGCJ/zNnj/84bJL/OG2R/zhtkP83bI//NmuO/zVp + jv80aY7/M2qP/zRrj/80aY//NWeO/zVkjf81YIz/LlmH/yZRgP8aR3b/FURx/xlJdP8hUnv/Kl2D/zBk + if8zaIz/NmqO/zdskP86bpP/O2+V/zhtlv8zaZT/LGKO/ylgjP8pYY3/LWaQ/zBskv8xb5P/MnGS/zRy + k/84dpn/OXaZ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DBsi/xxafv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xZIZ/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x87 + TP9AeJn/P3eZ/z52mP8+dZf/PHKV/zhuk/80apH/MGiR/y5mj/8uZo//L2aP/y9mj/8wZo//MGWO/y5j + jP8uYIv/KluI/yRUgv8dTXz/GEp5/xtPfP8fWYH/JWGI/ypojP8ubJH/Mm6T/zVtlf81aZX/MmWS/yxf + jf8lV4b/H1GA/x9Rgv8iVIX/JVeI/yVWiP8jVIb/IVKC/x9Rfv8iVH//KVuE/zFkif80Z4r/NWeI/zNm + hP8xZoP/MWaD/zBkg/8sXYL/J1eA/yRVf/8kVH//I1R+/yRWf/8nWoH/KmCE/y5kiP8yaIz/NWyP/zdu + kv86cJT/OG6T/zVrkP8vaIv/KmOG/ydghP8pY4f/LmiL/zVvkv85cpX/PHWX/0B3mP9CeZj/RHuY/0Z9 + mf9HfJn/RHmX/0B2lv8+dJb/PHCV/zpsk/81ZJD/L12I/ydSf/8gS3j/G0h0/xhIcv8YSnP/G052/yBV + fP8nXYL/MGeJ/zlvkP88cpP/QHWV/0J3mP9EeZv/R3yc/0Z9nf9FfJz/RXub/0N5m/9CeZv/P3ac/zpy + mv80bZb/MWyT/zNulP84dJn/PXqd/0F/oP9Gg6D/S4Wf/1CGn/9Th5//Voih/1eHov9XhqL/VYSi/1KB + ov9RgKP/Snug/0J0m/85bZX/MWeP/y1kjP8sZIz/MWiR/zVtlP84b5P/OG6S/zltkf84bJP/NGiR/y5i + jP8oXIf/I1eB/yZbhP8rYon/M2uR/zlwlv88dZj/PniZ/0B5mf9BeJn/QniY/0J4l/9AdZX/PnOV/z1x + lf88cJX/Om2U/zhpk/82ZJD/NF6P/y9Xi/8lToP/HUp7/yNSf/8tX4f/NmqN/zZrjf84b4//PHSS/z12 + lP8/d5X/QXeV/0B2lP9Cd5X/RHmX/0R5l/9FeZf/RHiV/0V3lv9Cc5T/Pm6R/zlpjP8zYoj/KlmC/yBP + eP8ZR3L/G0t0/yFSe/8mWID/KV2D/y1kiP8vZ4v/L2iM/y9pjP8waYz/MGiL/zBmiv8vZIr/LGGJ/ypd + h/8nWof/KFmI/ypaif8mVoX/IVF//x9PfP8fUHr/IVN8/ydagf8vZYf/NGuM/zhxkP87dJL/PHaU/z11 + k/89dpT/P3eV/0B4lf9AeJX/P3iT/z14kP89dZH/PHSS/zx0kv89dZP/PnWT/z51kv89c5D/O3GO/zpw + jf85b4//OG2Q/zdrj/8zZoz/LmGJ/ypdhf8nXIP/Kl+G/y9niv80bY7/N3GS/zp0lP8+d5b/QHiY/0R7 + mv9GfJz/SHyc/0d7m/9He5v/RXqZ/0V7mv9FfJn/Rn6a/0iAmv9Jgpz/SYGb/0Z+mP9EfZf/RHyZ/0N6 + mv9Bd5r/PXKY/zdrk/8yZY7/MWKM/zBhiv8yZYv/NmiO/zpskf86bZL/OWyQ/zhsj/82ao3/NmiO/zRm + j/8yY5D/L2CO/ytci/8kVoX/IlOD/x9Rgf8cTn//IFKF/yNViP8jV4n/IlWF/yBSgf8eUH7/HlB8/yBS + fv8oWoX/L2KM/zFljf8yZo3/NGiN/zRojf8zZ43/M2eO/zJmjv8yZo7/MWaN/zFmjP8xY4z/MF+K/y9b + iP8uWYf/JVKA/xtJd/8VRXH/FUZw/x5Pd/8oW4H/MWSJ/zZqjv84bJD/Om6S/zltk/85bZT/OW2X/zNo + k/8vZZH/K2KO/ypjjf8tZ4//MGyR/zJxkv81c5X/N3WX/zt3m/88d5v/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8NGyL/HFt+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/GUdj/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/KEpf/0B3mP9Adpb/P3WW/z50lf88cpX/OW+U/zRq + kv8wZpD/LGSN/yphiv8rYov/LGOK/y1ji/8tY4v/LGGJ/ytfiP8pXIb/JleD/yFSf/8fUH7/HVF+/x9W + gv8lX4j/KWWN/y1rkf8wbJP/M2mV/zJllP8vX5D/KFmJ/yBSgf8dT37/HU+A/yNVhf8nWYr/J1iJ/yZW + iP8hUoL/HlB+/yFUf/8pW4T/MWSK/zRoiv80Z4j/NGaF/zRmgv8yZ4L/MWWD/yxig/8oXYH/J1iB/yVV + gP8kVH//JliB/yZZgf8pXYT/LGGG/zBmiv80ao7/NmyR/zhuk/84bpP/Nm2R/zBojP8qY4f/J2GE/ypk + h/8vaYz/NG2R/zhxlf88dJf/P3aY/0J5mf9Ee5n/R32a/0d8mv9Gepj/QXeX/z1zlv86b5X/N2uT/zNj + jv8sW4f/JlOA/yJPe/8eTXj/HU13/yBRef8gVHr/HlR6/yRagP8uZIf/NmuO/ztwkf8/dJT/QneX/0Z5 + mv9He5v/Rnub/0Z6m/9Eepr/QniY/0B3mf89dJr/OXGY/zNtlv8wapP/MWyS/zRwlP86d5r/QH2e/0eB + n/9Kgp7/TYOc/0+Enf9ThZ7/VYah/1aFo/9TgqL/UYGi/019ov9GeJ7/PXGY/zVqk/8uZI3/KGCI/ytj + iv8xaI7/NWyR/zdtkf83a5D/N2yQ/zhskf81apL/MGSP/ypeiP8mW4T/JFmC/ylhh/8waY//N3CV/zt1 + mP88dZf/PnaX/0B3mf9Bd5j/QHaX/z50lv88cpT/Om+T/zptk/84a5H/NWaO/zRgjf8xW4v/K1SG/yBK + ff8ZRnj/H019/ypahf8xZYr/N2uM/zlvjv89dJH/QHeU/0F6lv8/dpT/PnST/0B1lP9Dd5f/RXiX/0Z5 + l/9Gepf/RXaW/0FxlP88a4//N2eM/zNiiP8sW4P/IFB4/xpKcv8bTHX/I1V9/yhagf8sX4X/MGOJ/zJn + jP8waIz/L2iL/y9ni/8vZ4r/LmWI/yxhh/8qXoX/JlqD/yNVgf8gUYD/IFCA/x5Ofv8aSnn/GUl1/xtM + d/8gUXv/J1uB/y9kiP82bY3/O3KR/z11k/8/d5X/QnmX/0J5l/9Cepj/QnqY/0N7mP9BepT/P3mT/z93 + lP8+dZT/PnWU/z92lf9Ad5T/P3aT/z51kf89c4//O3GP/zpwj/86b5D/OG2Q/zRojf8vYon/KV6F/yle + hf8qYYb/L2iL/zRukP84c5T/O3WV/z53l/9CeZn/RHua/0Z9nP9Ifp3/SX2d/0h9nP9HfJv/R32b/0d9 + m/9If5v/SYCc/0uCnf9Lg53/SoKb/0eAmf9Gfpj/RX2Z/0J6mf8/dZj/PG+W/zdnkf8yYoz/Ll6I/ypb + hf8tX4f/MWSL/zNmjf80Z43/MmeL/zFniv8zZ4z/MmaN/zBijv8wYY7/LV6M/yhbiP8nWYb/JVmG/yNX + hf8iVYX/IlWH/yRVhv8kVYT/IlSC/yFTgP8fUX3/HlB8/x5Qff8lVoL/KFqF/ylchv8rXoj/LWGJ/y9j + iv8xZY7/MWWO/y5ijP8tYov/LGCJ/yxfiP8rW4X/LFmF/ypXhP8nVYL/IU98/xtKdf8ZSXP/G0x0/yRW + fP8vYIb/NWiN/ztuk/86bZP/OGuS/zdqkv80aJL/MmaQ/y9lkP8tZY//LWaP/y5pj/8wbZH/M3CT/zZz + lv87dpr/O3Wa/zp0mP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwbIv8eXYD/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xtaff8RL0L/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8wWHD/P3aV/z91lP8/dJT/PXOV/ztwk/82a5P/MmeR/y1jjf8pYIn/KF+J/ylgiP8qYYj/LGOK/y5j + iv8sYoj/LGGI/ytfh/8oXIT/J1mE/yVYg/8jV4L/JFmG/yRcif8nYY3/KmaQ/y5nk/8wZZT/MGGT/ylZ + jP8gUYP/G0x8/xlKe/8aTHz/HlCA/yNUhf8oWIr/JVWG/yFSgv8cT33/H1N//ydag/8uYoj/M2eK/zRo + iP8zZ4X/MmaC/zJlgv8vZIT/LGOE/yxhhP8sX4T/KlqD/ylag/8pW4T/KFyD/yhdg/8qX4X/LGKH/zBm + i/8zaY7/NGuQ/zRrkP80a4//MGmN/ytlif8qZIj/LGaJ/y5ojP8zbJH/N2+U/zlxlf88dJf/QHeY/0N5 + m/9Gepz/R3ub/0R4mP9Adpf/PHKW/zhtlf80Z5D/L2CL/ylZhf8nV4L/JFV//yNUfv8mVn//KFh//yZZ + f/8iVn7/IVd//ydehf8xZ4v/OG2Q/z1ylP9BdZf/RXia/0d6nP9Ie5z/Rnmb/0R4mf9CeJj/QHeZ/z50 + mv85cZj/NG2V/zBpkv8tZo7/L2mQ/zRvlP8+eZv/RX+f/0mAnf9KgJv/TIGc/1CDnv9UhqH/U4Oh/1KB + ov9Pf6H/R3id/z9zmf85bZX/MWaP/ythiv8pYYj/LWWK/zNqjf83bZD/OnCS/zpvkf86bo7/Om6P/zhs + j/80aI//L2OM/ypfh/8nXoX/KGCG/y9njf81b5T/N3GV/zhylf86c5X/PXSX/z91mP8/dZj/PHGV/zpv + k/84bJH/NmmP/zRmjP8yYYr/MFyJ/y5Yh/8nUYL/Hkt7/xtKeP8eTnz/JVaD/y1fiP8zZov/OG2N/zty + kP9AdpT/P3aU/z50k/8+c5P/QHSU/0J1lv9Ddpb/RHeW/0N2lv9DdZb/QHCU/zlojv8zYon/L1+F/yZX + ff8eT3b/GUty/x5ReP8lWX//K1+F/y9iiP8zZov/NWiM/zRpjf8zaYz/MmmL/zBniv8vZon/LGKG/ypf + hP8mW4P/IVWA/x5Qfv8bTHv/GEh4/xREdP8TQ3H/FERx/x5Pef8oWoL/MGSI/zdtjv88cpL/PnaT/0B4 + lf9CeZb/RHqY/0R7mP9Ee5n/RHqY/0N6l/9BeJb/QHeW/z91lf8/dpT/QXeU/0F4lP9AdpL/P3aR/z50 + j/88c5D/PHKR/zxykv86b5L/NmuP/zFmi/8qYIf/KF6F/ylghv8vZ4z/NW+S/zp0l/89dpf/P3eX/0J5 + mP9Ee5r/Rn2c/0d+nf9HfZz/SH2c/0h9nP9HfZv/R32b/0h+nP9Jf5z/SYCc/0mBnP9Lg5z/SYGZ/0iA + mP9Hfpj/RXuX/0J3l/8+cZX/OWiS/zNgjf8rWof/JlaC/yRVgP8oWoP/LF+I/y5iiv8uYon/MGaK/zJo + i/8yaI3/NGiQ/zRmkf8yZI//MWOO/y5ii/8sYYv/LGCL/ylciv8mWYf/J1eF/ydXhv8oWYb/J1iF/yVX + g/8hU3//HlB9/xtMev8eT33/IVOA/yRXg/8lWIT/K16I/y9jjP8vY43/LGKL/ylgif8oXof/KV6H/ypd + h/8rWob/K1mF/ypXhP8mU3//IE55/x5Mdv8eTXb/I1J6/ypagf8zY4r/N2mP/zlqkv83aJH/NGaP/zFk + jv8vY43/LmWO/y9mj/8vaZD/MmyR/zJukv80cJP/N3KX/zlzmf86cpf/OXGV/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DBsi/xxafv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xMr + O/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zpsif89dJL/PnOS/z5zkv89cJP/OWyT/zVn + kf8vY4//K1+L/yhdiP8nXYf/KV+I/ytiif8vZYr/MGaM/zFni/8yZ4r/MWaI/y9jiP8tYYn/Kl6H/yhd + iP8mW4n/JlyK/yVdjP8oYI//LGGR/y5fk/8sXJH/JVWJ/xxNf/8XSHr/FUZ2/xZHd/8ZSXr/HU1+/yFR + gv8jU4T/IVGC/x9QgP8hU3//JFiD/ytgh/8wZYn/MmeJ/zFnhf8wZoP/MGWE/y9khf8uZIb/MGOF/zFi + h/8yYYn/MGCI/y5fiP8rX4b/Kl6F/ylehP8qX4X/K2GG/y1jif8wZoz/MGiN/y9ojf8tZ4v/L2mN/y9p + jf8wao7/MGmP/zJrkv80bZT/Nm6U/zlwlf89c5j/QXab/0R3m/9Cd5n/QHSW/z5ylf88bpX/OGqT/zFk + jv8rXYj/KFqF/ydahP8mWoP/Kl2G/y1gh/8vYYf/KFuC/yRZgP8jWYH/J16G/yxjiv8yaI//N22S/z1y + lv9BdZn/RXeb/0Z5m/9GeZv/RHia/0N4mv9Bd5r/Pnaa/zlxmP80bZb/L2iS/yxljv8rZIv/MmyS/zl0 + mf9Be5z/RX2c/0d+m/9Jfpv/ToKe/0+Cn/9Of5//TH2f/0V3m/89cJj/NmqU/zJnkP8uZI3/KWCJ/y1k + iv8xaIz/NWyO/ztxkv8+c5T/PnSU/z5zkv88cI//OW2P/zRojf8vZIv/LGKK/ytiif8tZov/MWqP/zNt + kf81bpL/Nm+S/zdvkv85cJT/PHGW/zxxlv87cJX/OGyS/zRnj/8zZIv/MWGI/y9dhv8uW4b/LVqG/yhW + g/8hT33/HU16/x1Oev8iU37/K1uG/zJjiv84ao7/O3CQ/z1zkv8+dJP/PnKU/z9ylP9Acpb/QXOV/0Fz + lP9AcpT/P3GU/z9wlf85aY//MWGI/yxcg/8nWH//IFJ4/xhKcf8dT3X/IVV8/yhcgv8tYof/MmaK/zVp + jf84a47/OGyO/zhsjv82a43/NWqM/zNpiv8wZoj/LWOH/ylghv8lXIT/IleB/x1PfP8ZSXj/FENy/xA/ + b/8TQnD/Gkt3/yVWf/8wY4n/N2yP/zxykv8+dZP/QHiU/0F5lf9Depb/RXqX/0V6mP9Eepj/Q3iY/0J4 + lv9Bd5b/QXeV/0F3lP9AdpL/QHaS/0F3kv9AdpH/QHWQ/z90kf8/dZP/P3SU/z1xk/84bZH/MmeN/ytg + h/8nXYT/KWCH/y9ojv82cJT/O3WW/z93lv9BeJj/QnmZ/0V8mv9GfZv/SH6c/0l+nf9IfZz/SH6d/0d9 + nP9HfZv/R3yc/0Z8m/9GfJr/Rn6a/0Z+mf9IgJn/SICY/0d+l/9GfJf/RXmX/0Fzlv87apP/M2KN/ytZ + hv8kU4H/IFF+/yFTgP8mWYX/Kl+J/y1hiv8wZYz/MmiO/zdskP85bZL/OWyU/zhrk/83a5H/NGqP/zJp + jf8xZo7/L2KM/ypbiP8rW4j/LV6K/y5fiv8uYIv/K12J/yhZhv8hUoD/HEx7/xtLe/8dTn7/IFKB/yNW + g/8mWoX/Kl+J/yxhi/8sYYv/K2GK/yliif8qYor/K2GK/y5giv8vXYn/LlyI/yxZhf8mU3//IEx4/yBN + d/8iUHr/KFZ//y5ehf8xYIr/M2OM/zRkjf8xYov/L2KL/y5ijP8tZI3/L2aP/zJrkf8zbpL/NXCU/zVw + lf82cJf/OHGY/zlxl/85cZT/Bw4S/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8LGiP/H1yB/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8dXH//Cxkj/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/PHGS/ztxj/87cI7/O3CP/zpskf83Z5H/MWKN/yxeiv8nW4f/J1uH/yhdiP8qX4n/L2WL/zNp + jv82bI//N26P/zdtjv82bIz/NWqM/zNojP8vZIv/K2GL/yddif8lW4n/JFqK/yZbjP8qW4//KlqO/ydX + jP8jU4f/HU2A/xZGef8SQ3X/FEV2/xZGd/8YSHn/Gkp7/xxMff8eTn7/H09+/yBRfv8jVoH/Kl6G/y9k + iv8xZ4n/MGeH/y5lhf8uZIX/LmSG/y9kh/8xZIj/NGSJ/zZkjP83ZY3/MmKL/y1giP8rYIf/KV6E/yle + hP8oXYT/KV6F/ylghv8rY4n/K2SJ/y5mjP8waY//MmyQ/zNtkf80bZP/NG2U/zFqkv80a5L/N22U/ztw + mP8/c5r/P3OZ/z1xlf87bpT/OWuT/zhok/8yZI//LGCK/ylch/8oXIb/J12G/ythif8xZYz/NWiO/zRo + jf8vY4n/JlyE/yZdhf8oX4j/K2KK/yxkjP8wZ47/NWuS/ztvlv9AdJn/Q3ea/0R4m/9Dd5r/Qnea/0F3 + mv89dJj/OXGW/zNrk/8tZpD/KmOO/ytijv8waJH/Nm+W/zx0mP9AeJn/RHqZ/0h8m/9JfZv/SXyc/0d6 + nP9DdZn/PG6V/zJmkf8vY4//LGKM/yhfif8uZY3/MGiO/zNrjv84bpH/PXKT/0F1lf9Cdpb/P3SU/z1w + kv84bJD/M2eN/y1iif8rYYn/L2eN/zJtkf80b5L/NG6S/zNtkP80bpH/NW2R/zZtkv83bJL/OG2T/zhs + k/82aZD/M2aN/zFiiv8wYIf/L16F/zBeh/8xYIn/Ll6I/ylahP8hUn3/Gkt2/x1OeP8lVX//MWCJ/zlo + j/89bZL/PnCT/z9ylP8+cpX/P3GW/z9wlf8/b5X/Pm6T/zprkP82ao7/NGaN/y5giP8mV3//I1V9/yFT + e/8bTnX/G051/x1SeP8jWH7/KmCF/zBmiv81a43/OG6P/ztwkP88cJD/PXCQ/ztuj/85bI3/OGyM/zVr + jP8xaYv/L2aK/y1kiv8rYIj/JliD/x5OfP8YR3b/E0Jx/xVEc/8aSXb/JFR+/y9gh/84ao//PXGS/z90 + k/9Ad5T/QXmT/0N6lP9Eepb/RnqX/0R4mP9DeJj/QneY/0J3lv9CeJX/QXeT/0B2kf9BdpH/QneS/0N4 + kv9CdpL/QXWR/0J1k/9BdZX/PnKU/zlukv8yZ43/Kl+H/yddhf8rYYr/MGmP/zdxlP89dpb/QHiW/0J5 + mP9Ee5r/Rn2b/0d+nP9Jf53/SX+d/0uAnv9Jfp3/SH6d/0d8nf9Ge5z/RHqb/0N5mv9DeZj/RHuX/0R9 + lv9Gf5f/SH+X/0d+mP9Ge5n/RHaX/z1uk/80ZI7/LFuH/yNSgf8eT37/H1GA/yNYhf8pXov/LmOO/zJn + kP81apL/Om+U/z1xlv89cZb/PXCV/zxwlP84bo//NWuN/zNpjP8wYov/Ll+K/y5eiP8wYYv/NGeQ/zZp + k/8zZ5D/LWCL/yZXhv8gUID/Hk5//x5Pgf8hUoT/JViG/ydah/8oXIf/KF2H/ypgiP8sYor/LWWM/y5m + jP8wZoz/MWSN/zJjjf8yYYz/Ml+L/y1ahv8mU4D/IEx6/yBMef8kUn3/J1aB/ytahf8uXYn/L16K/zBg + i/8wYYz/MGSO/zBnkP8xaZH/M2yT/zRvlP80b5b/NnGY/zdxmP84cZf/OnKW/zxzl/8PHCX/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wsaI/8dW3//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8GDRL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w4bJP86bpL/OW2P/zhsjv85bI3/N2iP/zNi + jP8tXYn/JliF/yZYhv8mWYf/KFyJ/y1ijP8yZ47/N2yR/zpwk/88c5P/PnST/zxykv86cJD/N2yO/zRo + jv8uY4z/KV6K/yNZh/8iV4f/JVaI/yZViv8lU4r/IlGH/x9PhP8cTH//F0d5/xVGd/8WR3f/F0d3/xdH + eP8XR3f/GUl5/xtKe/8dTHz/HU18/yBQfv8mWYP/LmKK/zJnjf8vZon/LGWH/yxkh/8uZYj/MGWI/zJm + iv81Z4z/OGeO/zhnj/80ZY7/MGKL/yxgiP8qX4b/KF2F/ydchP8mW4P/JlyE/yVchP8pYYn/LmWN/zJq + kf81bJL/Nm+U/zhwl/82bpT/NGuT/zFpkf80apP/OWyW/zpul/86bZX/OGuT/zVmkP80Y5D/MWGO/yxe + iv8oXIb/J1yG/yhdh/8pYon/LmaM/zRqkP85bZH/OnCT/zdtkf8wZ43/KmKK/yhgif8pYIv/KGCK/ydf + if8qYIr/MWaO/zhtlP8+c5n/P3OY/z9zl/8/dJf/PXOX/ztxlf83bpP/MmmR/yxkjv8pYIz/K1+M/y5i + j/8yaJP/N26V/zxzl/9Bd5n/Q3iZ/0J2l/9BdZb/P3GW/zltlf8zZo//LmKO/ypfjP8nXYn/K2GM/zBm + j/80a5H/N26R/zpwkv8+c5T/QXWX/0B0l/8/c5b/PG+U/zdqkP8wY4v/KV2H/yxhi/8waZD/NnCV/zhz + lv83cpX/NnCT/zRtkP81bZH/NWyR/zZrkv81aJD/NWiR/zRmj/8zZYz/M2WK/zJih/8xYIb/MWGH/zNj + iv80Zo7/MGSM/yZZgv8dT3n/Fkdx/yFRe/8tW4X/N2SO/z1qk/8+bZT/Pm+V/z1wlv87bZT/OmqS/zlp + kv83Z47/MGOK/yxhh/8qXob/JFeA/yFTfP8jVX7/IFR9/x9Te/8dVHr/H1Z8/yVbgP8sZIj/NGyO/zlw + kf88dJP/PnST/0B2lP9BdZP/P3OS/z1wkf88b5H/O26R/zdtkf80bI//M2mO/zFnjf8tYYv/KFmF/x9P + ff8aSXf/GEd1/xxLeP8kVH//Ll6H/zdpj/89cJP/QHOU/0F2lP9CeJX/RHqV/0d8l/9Fe5j/Q3iZ/0F2 + m/9AdZj/QXaW/0F3lP9Bd5P/QHaR/0F3kf9EeZP/RnqU/0R4lP9EdpT/QXST/0BzlP8/cpX/OW2R/zJm + jf8rYIj/KF6H/ythiv8xaY//OnOU/0B3lv9Cepf/Q3uY/0V8mv9Ifpv/SH6d/0qAnv9LgZ//S4Ge/0uA + nv9LgJ7/Sn+e/0d8nf9Fepz/QneZ/0F2mP9Bd5b/Q3qX/0V9mP9HfZj/Sn6a/0d7mv9Ddpf/PW+S/zZn + jf8sXIf/I1OB/x9Pf/8fUYH/I1aG/ylfjP8xZ5P/NWuV/zlvl/8+c5j/QXaa/0F1mf9BdJj/PnKW/ztw + k/83bY3/NGiN/zFjjP8wYYr/L2GI/zFjiv80aI//Om+V/zpvlv8yZpH/K16M/yRWhv8hUYT/IVKF/yVX + if8qXYz/Kl6L/yldh/8oXYb/KF6H/ytiiv8vZoz/MGiN/zFojf8zZ4//MmWP/zNkj/8yYo7/Ml+N/ytY + h/8lUYD/H0t6/x5LeP8hTnz/JVOB/ypZhv8tXYr/L2CL/zJlj/80aJH/NWqT/zZtlf8zbJT/MWuT/zFt + lf80b5b/NnCX/zhwl/87c5j/PXSZ/w8dJv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Cxoj/x5c + gP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/IV+C/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/ECAs/zZokP82Z47/NWaM/zVljP80Yov/LlyH/yZWgv8jVIL/I1WD/yRXhv8pXor/L2SP/zVq + kv86cJT/PnWW/0F3l/9CeZj/QXeW/z5zlP86bpL/NWmP/zBkjf8rYIv/JluI/yJWhv8gUoP/Hk6C/x1M + gv8bS4H/GkqA/xhIff8aSXz/HUx9/xtLfP8bSnv/Gkp6/xlKef8bSnr/G0p6/xtKe/8bSnr/Hk19/yVV + gv8tX4n/LmSL/ytlif8oZIb/K2aI/y9mif8yaIr/NWmM/zdqjv84a5D/OGuR/zZnkP8yZY7/LmKL/yxh + if8rYIj/KF6F/yZbhP8kWYP/JFmE/yZdhv8sY4z/MmiQ/zZskv86cJX/OHCW/zZulf80a5P/MmiR/zJn + kP8zZ5H/NGiR/zNnkP8yZI//MGGN/y5ei/8rXIn/JlmF/ydchf8oXYb/KWCI/y5mi/8ybI//N26S/zxx + lP8/dJX/PnOW/zhuk/8xaJD/KmKM/yRdif8kXIj/IlqG/yJZhf8mXIf/L2WN/zZrk/85bpX/Om+U/zpv + lP85bpP/N22S/zZskf8xaI//LGKM/yhdif8pWon/K1uL/y5fjv8xZZD/OGyU/z5zl/8+c5b/PHCT/zhs + kP83a5D/M2aP/y5ijf8sYY3/Kl+M/ypgjP8uZI//MmiR/zZrkv84bpL/PHGU/z5ylv9Ac5f/QHOX/z1w + lv85bJT/NGeP/y1gi/8rX4n/LmKN/zNpk/82b5X/OXOW/zt2mP84cpT/OHCT/zdvk/84b5T/OG6T/zZr + kf80Z4//NGeO/zRnjf81aIv/NGWI/zJjh/8zZIj/NWeM/zdrkf8zZ47/Kl6G/yBTff8eT3n/IVB6/ytY + gv8yXoj/OGSO/zxpk/86apL/OGqR/zRljv8vX4n/L1+J/y1fh/8mWoH/KV6F/yhchP8kWID/J1qD/yhc + hP8mW4P/JluD/yNagv8jW4H/J2CE/y1mif81b4//PXaU/0B5lf9AeZX/Q3qW/0V8l/9EeZb/QnaW/0Bz + lv9Bcpf/PXGU/zlvkf83bpD/NGqQ/zJmj/8uYIv/KVmF/yJRfv8cS3n/Hk16/yNTf/8uXoj/NmiQ/zxv + lP9Ac5X/QXWU/0N4lv9Ge5j/Rnya/0R6mv9Cd5r/QHWZ/0B1l/8/dJX/QHWT/0B2kv9Ad5H/Q3qT/0Z7 + lf9He5b/SHmW/0V3lf9CdJT/PnCS/ztukf84a5D/MmWM/y5ii/8rYIr/K2CK/zRrj/88dJT/QXiW/0R7 + mP9FfJn/R32Z/0l/m/9LgZ3/S4Ge/02Cn/9Ngp//TYKe/0yBnv9LgJ7/Sn+f/0d8nf9DeJv/QXWY/0B0 + mP9Cdpj/RHma/0V6nP9Gepz/R3ma/0Bzlf85bI//M2SL/ytbhv8kVIL/IFGA/x5Rgv8iVof/KV6M/zBn + k/82bZf/O3Ka/0B2m/9CeJv/RHia/0J2mf9BdJj/P3GV/zttkv83aY//M2WN/zFkiv8wZIn/MGWJ/zNp + jP83bZH/OG6V/zhulv8tYo//JlmJ/yJUhf8kVof/KFqK/yxfjv8vYo7/LWKM/ypgiP8pYIb/KWGI/y1l + i/8waI3/MWiN/zBmjf8xZY//MWSQ/zFikP8wYI7/LVmJ/ydSg/8gS3z/HEd4/xtHeP8gTn7/J1aE/y1d + iv8yZZD/NWiS/zdslP85b5b/OHCW/zVtlf8wa5L/LGeP/y9pkP8zbJP/OG+W/zxzmP8+dJn/Dx0m/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8KGSL/HFh+/xpZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8ZS2n/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8XMEX/L2GL/zBfi/8xXYr/MFyJ/y5Z + hv8nVID/IE57/x1NfP8eT3//I1eF/ypei/8wZZD/NmuT/ztxlv9Ad5n/RHub/0Z8nP9Ge5v/QXaX/zxv + k/83a5H/MWSN/y1hjf8pXov/JVqJ/x5Sgv8WSXv/FUd6/xZGe/8WRXr/GEd8/x1Mf/8hT4H/I1KC/yVT + gf8hUX7/IFB+/x9PfP8eT3z/HE16/xxLev8eTXz/JFOC/ylbhv8oYYj/JmOG/yhkhv8sZoj/MGiK/zRq + i/82bI3/OG2P/zlukf84bpL/NmyS/zNnjv8xZo7/MGeN/y9mjP8rYoj/KF2G/yRZhP8kWYT/JVuG/ytg + iv8xZIz/OGqQ/zptk/85bZX/NmyU/zJpkf8vZY7/L2SN/y5ijP8tYYv/LmGL/y1fiv8sXYr/KlyJ/yda + hv8nW4b/KFyG/ypeiP8tZIv/MmqO/zdxkf87c5P/P3WV/0F2l/9AdJj/PHKW/zVtk/8vZpD/J2CL/yFa + hv8eV4P/IFiE/yNahf8mXof/LmWN/zRqkP82a5L/N2yR/zZrkP83bZL/N2yR/zRpj/8vY4z/Kl2K/yZX + hv8mVob/KFiJ/ypci/8wYo//NWmR/zdskf81aY7/NGiO/zJmjv8wZY7/MWaQ/y9lkP8tYo//L2SR/zFm + kf8zaJL/NWmR/zhskf86bpP/PXCW/z9xmP8+cJf/O22W/zdpk/8xZI7/LGCL/ytfiv8uYo3/M2mS/zdu + lP86c5b/O3SW/zp0lv86cpT/O3KV/zxylf88cpb/OW2T/zdrkP82ao7/NmuN/zZqi/81aIn/MmSG/zRl + if84ao7/OWuR/zVpj/8uYon/JlmC/yNUfv8jU33/J1R+/yxYgv8xXoj/M2GL/zNjjf8xY4z/Kl2G/yha + g/8nWIL/JVmC/yhdhP8sYYj/L2SL/y9ji/8wZYz/MWaN/y9kjP8tY4v/KWGI/ydghv8pY4f/LmmL/zZx + kP88d5T/P3qV/0F7lf9DfZb/RX+X/0d+mv9Fepr/RHeb/0R1mv9BdJb/PXKT/zlvkf83bJD/NGiQ/zJl + jv8uX4r/KFiD/yJRff8fT3r/JFR//yxdh/81Z4//PG6V/0Bzl/9BdJf/Q3eX/0Z7mf9Eepv/QXec/z91 + mv89c5b/PnOV/z5zlP8+dJL/QHaR/0B3kv9CepT/RXyV/0d7l/9Iepf/R3iX/0N1lf89b5P/OmyR/zVo + jv8xZIz/L2OM/y1ii/8xZ47/N26Q/z52lP9BeZf/Q3qX/0V8mP9HfZn/SX+b/0uBnf9Og5//ToOf/06D + n/9Ngp7/TYKe/0yBn/9LgJ//SX6e/0Z7nP9Bdpr/QHSZ/z9zmf9AdZv/QHWd/0J1nf9Bc5n/PW+T/zdp + jf8wYYj/KluF/yVVgv8hUYD/IFKD/yJVhv8nXYz/L2WQ/zVtlv86cpn/P3aa/0F5m/9DeZr/QXeX/0F0 + lv9Bcpb/P2+T/zpqkP81Z43/MmWL/zFmif8xZ4j/MmmL/zRrjv81bJH/M2qR/y1jjv8mWof/I1aG/yRX + hv8pW4r/LWGN/zBkj/8wZo7/LmWL/ytjiP8rY4n/LGSK/y5mi/8wZoz/L2OL/y5jjP8wYo7/MGKQ/y5e + jP8rWYn/JlKD/x9JfP8aRXf/GkV4/x1LfP8lVIP/LV6L/zRnkP84bJX/Om+W/ztxmP86cZj/Nm+Y/zBp + kv8rZI3/KWKJ/y1mjf81bZP/OnKX/zx0mP8PHSb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woZ + Iv8dW4D/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxKZP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xg3U/8oWoT/KFeE/ypVhf8qVIT/JlCA/yBMev8aSHf/FER1/xhJef8gU4L/KFyL/zBk + kP81apL/O3GW/0F3mv9Ge5z/SX6f/0d7nf9Ed5r/PnCW/zhpkf8yZI7/LWCN/yphj/8oXoz/IVeG/xlO + ff8QQ3T/D0Fz/xFCdf8aSX3/IE6D/yRShP8oVob/LFqG/yxahf8nV4L/JVaB/yJTf/8gUXz/HE16/x5O + fP8iUoD/JVqE/yVhhv8mY4b/KWSG/y1niP8yaYr/NmyL/zhtjf85cI//OnCR/zlvkv82bJD/NWyQ/zVr + kP81a5L/M2qP/y9mjP8rYYf/J1yG/yVahf8mWob/K12G/zFih/82Zoz/N2iQ/zhqk/81aJH/MWWN/yxi + if8qYIf/Kl6G/ypehv8qXYf/Kl2H/ytdif8qXYj/Kl2I/ytfif8sYIr/LmOK/zBnjP81bo//OXOR/z53 + k/9AeJX/QneY/0F2mf8+c5j/N26V/zBokf8pYYz/I1uH/yBYhf8hWYb/JFyI/yhhiv8rY4z/MGeP/zJp + kP8zaZD/NmuR/zhulP86bpT/OGyT/zRnkf8sXov/JFaG/x9Qgv8gUIL/IFCD/yZXh/8rXYv/L2KL/zBl + jP8xZo3/MGaO/zNqkv82bJX/NGyW/zRqlf80aZT/NGiS/zNnkP8zZ4//NGaP/zdpkf87bZX/PW+X/z1v + mf86bJb/NWeT/y5hjv8qXYr/KF2J/yxijP8yaZD/OG+U/ztylf87dJT/PHST/z11lf8+dZb/PnSW/z1y + lf89cZX/Om+S/zhvjv85bo7/Om+P/zdrjP81Z4n/NGWJ/zZnjP84ao//NmmP/zJli/8qXYX/JFZ//yJS + fP8iUHr/JVJ8/yhWgP8pWIL/KVuE/yZag/8jWYH/JVmA/yZagf8oXYT/LmOJ/zNpjv82bJH/OW+T/zpw + lf83bZP/NWuS/zNqkf8uZoz/K2SJ/ytliv8uaoz/NnKR/zt3lP8+epX/QX2W/0N/l/9GgJj/Rn+a/0d8 + nf9Hep3/RXma/0N3l/9BdZT/PXKS/zlvkP83bJD/NWeP/zBii/8qW4X/JFN//yFRff8kVYD/K12G/zRm + j/87b5T/PnKW/z9zlv9BdZb/QXWZ/0F2m/8/dZz/PHGX/ztxlP88cZP/PnOT/z90kv8/dpL/QHiT/0J6 + lf9EfJX/RXyW/0Z5lv9Fd5b/Q3SW/z9wlP85a5L/NGaO/zBii/8tYIr/LmSM/zJpjv83cJL/PXaV/0F4 + lv9Depf/RHuX/0d8mP9Jfpn/TIKd/06Dnv9PhJ//T4Sf/02Cnv9Ngp7/TIGe/0uAn/9KgJ//R32d/0J4 + mf8/dJj/PXKY/ztymv87cpr/PHGb/zxvmP86bZT/NWiN/zBiiP8sXYb/KFiF/yRTg/8hUYL/JFWG/ydb + iv8rYo3/MmqS/zhxlv88dZj/QHma/0F5mf9BeZj/QnaW/0R1l/9BcJT/O2yR/zVnjv8xZYv/MGWI/zBn + h/8yaor/M2uN/zRsj/8xaI7/LWKM/yZbh/8hVYP/I1aE/yhbiP8tYov/MWaO/zJojv8xaI3/MGeN/y5m + jv8vZ47/L2eM/zBljP8vZIv/LmKL/y1gi/8tX4v/LF2K/ylZh/8kUX//HUh5/xdBdf8XQ3X/HEl6/yRU + g/8uYIz/NGeQ/zhsk/87cJX/O3GY/zpymv83b5n/MWmT/ytii/8oX4f/K2OK/zBojv82bpT/OXKX/w4d + Jv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Chki/x1agP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8bWn7/EzFD/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GT1g/yFTgP8gUH3/JFB//yZQ + gP8jTXz/IEt5/xtIdv8VRHP/E0R2/xpNf/8kWIj/K2GN/zJokf84bpT/P3SZ/0R6nP9He53/Rnmc/0N1 + mf89bpT/NmeQ/zBhjf8qXYz/KFyM/yhejP8mXIr/HlSB/xZKef8NQHD/EkV1/xtMff8iUYP/JFKE/yhW + hf8uXIj/MV+I/y9ehv8qW4P/J1mB/yJUfv8eUHv/HU56/yBTf/8kWoT/JmGF/yhjhv8rZYf/LmaH/zJo + iP82a4r/OW6M/zpwjv86cZD/OG6P/zZtj/82bY//OG+S/zhvk/82bZD/MmiM/y9kiP8rX4b/J1uF/yla + hP8sW4P/MV+D/zJgiP80Yoz/NWSO/zJkjv8vYov/K1+H/yhchP8mXIP/KF2E/ypehf8sX4j/LmGK/y5i + jP8vY43/MWWN/zFmjf8xZ4z/MmuN/zZvj/86dJL/PXiT/z53lf8+dpf/QHaZ/z1ymP83bZX/MWiR/ypi + jf8mXov/JV2K/yVeiv8qY47/L2iR/zFqkv8xaZD/MGmO/zJqj/82bpP/O3KY/zxxl/87bpf/OGqU/zBi + j/8mV4b/HU5//xlIe/8YSHv/Hk1//yRVhP8rXYj/L2SL/zFnjv80a5H/N2+V/ztymv87cpv/OnGY/zlv + lv81aZL/MmWO/zJljf8xZIz/M2WO/zZokv87bZb/O2yX/zlql/80ZZP/LF+M/yZZhv8mWYb/LWOM/zNp + kf84b5P/OnGT/z10k/89dJP/PXSU/z51lf89dJP/PHKS/ztykv87cpH/OnKQ/zxykP89cpH/O2+P/zhr + jP81Z4r/NmeL/zZni/83aY7/MWSL/yxfhv8mWIH/IFB6/x1Nd/8dTHf/Hk95/yBRe/8gU3z/H1R8/yJZ + f/8nXoH/KmCD/y9lif81bI//OXCS/zpxk/88dJX/PnSW/ztylf85cJT/N26T/zRrkf8vZ43/LWeM/zBs + jv81cZH/PHiU/z97lv9Cfpf/RICZ/0aAmf9Gf5v/R3yd/0d8nP9HfJz/RXqZ/0N4lf9AdZL/PXKR/zpu + kP83aY//MWOL/ypbhP8kVn//IVN9/yNVf/8qXYX/M2eO/zhtkv86cJT/O2+T/ztvlP86b5b/OnCY/zlv + lv84bZL/OG2Q/zxxkv8+dJP/P3WT/0B3lP9BeJT/Q3qV/0R8lv9Ee5b/Q3iV/0N2lf9CdJb/P3CV/zpr + kv8zZIz/LV+J/yxfiP8uZIv/MmqN/zhwkv89dZX/QXiY/0N6l/9Fepf/R3yY/0p/mv9Ngpz/ToOe/0+E + n/9PhJ//ToOf/0yBnv9LgJ//S4Cf/0qAn/9FfJv/QniZ/z50l/86cJn/Nm+Y/zVul/81bZX/OG+W/zhu + lP82a5D/NGeN/zJji/8uX4r/K1qJ/ydWh/8jUoT/JleH/ylfiv8vZo7/NG2S/zpzlf8+d5j/QXqZ/0N5 + mP9HeJn/R3aZ/0Jzl/86bJL/NWiP/zBljP8tZIn/MGiK/zJqi/8zbI3/M2uP/zJqj/8vZo3/KV6J/yRX + hP8gU4H/J1qF/y1gif8yZ43/NGuP/zNrj/8ya5D/MmqS/zNqkv8zaZD/MmeO/zBljP8vY4r/LWGI/ytf + iP8qXIb/J1mD/yNSfP8dSnf/F0Rz/xVBc/8aSHj/JFSB/yxfif8zZ47/N2yQ/zlulP86cJj/OnGc/zdu + mP8yaJL/LGGL/yheh/8qYIj/LmWM/zNrkf82b5X/Dhwl/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8LGSL/HVt//xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8VLz3/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8cSXb/IFF+/yJSff8jUX3/KFSB/yhUgf8lUX7/H014/xlIdf8VR3b/F0p8/x1T + gv8mXIj/LGKN/zRpj/86b5P/P3SX/0J1mP9Bc5f/Pm+V/zlpkf8yYo3/KluL/yZXif8mWIn/JlqJ/yZb + iP8kWob/HFJ9/xlOe/8aTnz/HVB+/yNUhP8mVob/KFaG/y9cif8zYIn/M2GI/zBeg/8qW4D/JFZ8/x5Q + eP8bT3j/H1N9/yNagv8nX4X/K2OH/yxkhv8vY4X/MmaG/zZpif85boz/OnCO/zlvj/82bY3/NWyN/zdu + j/84b5H/OW+S/zdsj/81aoz/MmeJ/y9ihf8tXoX/LFuE/y9bgP8uWYH/LluG/zBciv8vXor/LV+K/y1f + if8rXof/Kl6G/ylfhP8pX4P/LGGG/zBkiv8zZ47/NmqR/zdrkv84bJL/N2uQ/zVsjv81bI7/N2+Q/zpz + k/87dJT/OnOU/zpzlv86cZf/OW+X/zZslf8vZY//KmGL/yhgjP8pYYz/K2OO/zBpk/82cJn/N3GY/zZw + lf8zbZL/MWqP/zVtkv85cZb/PHKX/ztwl/84a5X/MWOP/yhah/8dTn7/FUR2/xREdv8YR3j/IFB//ytc + iP8yZo3/NWuQ/zdvk/88c5j/PHSZ/z11mf8/dpr/PXKX/zluk/81aI//MGOL/zBji/8xY4z/M2WP/zVn + kf83aJT/NmeU/zBikP8oWoj/IVSC/ydbh/8tY4v/NGqQ/zdtkP85cJD/O3KR/zxykf88c5L/PXSU/zxz + kv86cpD/O3SS/zt0kf89dZL/QXWU/0B0lP89cJH/Om2O/zdqjP81aIv/NWiM/zNmi/8wZIn/LF+H/yZY + gP8gUXr/G0x1/xlJc/8ZTHb/G094/xpPef8gVX7/KF2C/y5lhv8wZ4f/NW2N/zpykv87dJP/O3SR/z13 + lP8+d5T/PXaV/zx1lv86cpX/N3CU/zVtk/8ybJD/M26Q/zh0lP89eZb/QHyX/0J+mf9FgJn/RoCa/0d+ + nP9GfZv/Rn2b/0Z9mv9IfZr/RnuY/0N5lf8/dJH/PHCP/zhrjv8xZIr/KVyD/yJVfv8fUnv/IlV+/yld + hf8wZIz/NGqP/zZskP81a4//M2mP/zRpkv8zaZH/MmiP/zNpjf84bZD/PHKT/z91lP9Bd5X/QXeV/0J5 + lf9Ee5b/RnyY/0V7l/9EeJf/QnWV/z9xlf8+b5X/NmeP/y9gif8pXIb/KV+H/yxkiv8xao3/OHCT/z11 + lv9BeJj/Q3qZ/0V7mf9IfZn/Sn+a/02CnP9PhJ7/UIWf/0+En/9Ngp7/TYKe/0uAn/9LgJ//SH6d/0V7 + mv8/dpf/PnOY/zpwmf82bpj/MmyU/zNulP81b5X/OHGW/zlwlf85bpP/OGqR/zZmkP8yYo//L12N/yhW + h/8kVIP/J1mH/y1ii/8zao//N3CS/zt1lf9BeJf/SHiZ/0x4mv9JdZn/QXGW/zpskv80aJD/LmSN/y9m + jv8yapD/NW2Q/zVukP81bZH/NGuR/zJpkP8uZI3/KV2J/yZahf8nWoT/K1+H/zFmi/80ao//Nm2S/zRt + lP82bpX/OW+W/zlulf84bJL/NWmO/zJmjP8vZIn/LGGG/yxfhv8qW4P/JVV+/x5Md/8ZRnP/FkNy/xlH + d/8gUX3/KVuE/y9kif80aY7/N2yU/zhumP85b5n/Om6Z/zRolP8sYYz/KFyG/ydbhP8qYYn/L2iO/zNt + kv8NHCX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wsaI/8eXYL/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/HVp//wwaI/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yFUgP8kWIH/KFuE/y1d + hv8wX4j/M2GL/zJfif8pV4H/HEt2/xdIdf8YS3n/G09+/x9Vgv8mXIb/LWKK/zNojf83ao//Om2R/zhq + kP81Zoz/MWCK/yxaif8mU4f/IlKF/yNThf8lWIb/JluH/yVchv8jW4T/JFuF/yVchf8nXIf/J1uH/ytd + if8vX4v/M2GN/zZijf82Y4n/M2KF/y5egf8oWX3/IVN6/x5Ref8cUXr/IlZ//yhdhP8sYIb/LmGG/y9i + hP8xZIT/NWiH/zhri/84bo3/Nm6N/zZtjv82bY//Nm2P/zhukf83bZD/N2yP/zdrjv81aIr/M2SI/zJh + if8xXIn/LleD/ytUgf8rVIT/KlWF/ypYhv8qWof/LF6J/y5gif8vY4j/L2WI/zFnif8yaIr/NmuO/zht + kf88cZX/P3SY/z5ylf87cJL/OG6P/zRqj/82bZH/OG+S/zhwk/84cJT/N2+U/zZtlv80a5X/MGeS/yxi + jP8pX4r/KF+J/ytjjP8vZ5D/M22V/zdxmP88d5z/PHec/zlzmP82cJT/M22Q/zhvk/87cZb/PG+W/zhr + lP8yZI//KVuH/x1Off8WR3b/E0Ny/xZFdP8fT3z/LF2H/zZpjv84bZD/OnCS/zx0lv88dJb/PnWW/z91 + l/9AdZf/PnOV/zltk/80aI//L2KK/zBji/8wY4z/MWSN/zFijv8vYI3/KluJ/yNVg/8kV4T/KVyH/y5k + jP8zaY7/NmyP/zhvj/87cZD/PHGR/z1ykv8/c5P/P3SU/z92k/89d5P/PneU/0B3lP9Dd5b/QnSV/z9w + kv87bZD/OGuO/zZqjf80aIz/MmaL/y9kif8rYIb/JlmB/yBTe/8bTXb/GEp0/xdKdf8bT3j/H1R9/yZb + gv8xZ4n/M2qL/zVtjv86cpL/PHWU/zx2lP89d5P/P3qT/0B7lP8/eZb/P3iX/z53mP87dJf/OXGV/zhw + lf86dJf/PHeY/z96mf9BfJn/Q36a/0Z/mv9IgJv/R36a/0Z9mv9GfZn/R32Z/0d9mf9IfZn/RnqX/0F1 + lP8+cZH/OWuO/zJki/8pW4P/IVR8/x5Tev8hVn3/J1yD/yxhiP8wZYv/MGeL/y5miv8tY4r/LWOL/y1j + i/8uZIr/MWeM/zdukP89c5P/QXeW/0J4lv9CeJb/QniV/0R5l/9Ge5j/SX2b/0Z5mf9CdJb/PnCU/zlq + kf8zZIz/LF2H/yZbhP8lXIT/KWKI/zFqjv82b5P/PHSW/0F5mf9Ee5r/R32c/0h+m/9KgJv/TIGc/06D + nf9PhJ7/T4Sf/06Dnv9Ngp//S4Gf/0p/nv9HfJv/Q3mZ/z92mP88cpj/OnCY/zVulv8zbpX/M2+V/zh0 + l/87dpn/PXeZ/z52mP89cpb/PG6V/zpqlP8yYY7/K1mJ/ydWhf8nV4X/LF6J/zJnjf83b5L/O3OU/0F1 + lf9Jdpf/S3aY/0h0mP9Ab5X/OWuT/zJnkP8vZpD/MWmT/zVvlv83cJb/N3CU/zdvk/84b5X/N22U/zRp + kv8uY43/K1+J/ypdhv8rX4b/L2OK/zJoj/80bJT/N3CX/zlymP89dJr/PXOY/z5zl/86b5L/NWyN/zRp + i/8yZon/MGSI/y9gh/8rWoL/JFJ8/xtIdP8YRXP/GUV1/x5Nev8lWH//K2CF/zBli/80aJH/NmuV/zhs + l/85bJf/NWiU/y5hjP8nWoX/JVmD/yVbhP8pYon/LmmQ/wwbJP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/DRsk/x9cgf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWn7/ChQb/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8JFSH/J1yH/yxjiv8xZ43/N2mP/ztskf9BcJX/QG6U/zRji/8nV4D/G0t2/xlL + eP8cUH3/H1SA/yBWgP8oXIT/LWGI/zJkiv8xY4n/MGGI/yxchv8pVoT/JVCC/yJOgv8fTYH/H06A/yRX + hf8oXon/KWGJ/yxljP8uZ47/MGmQ/zNqkf80aZL/NGiR/zdpkf84aJH/OmaO/zpli/82Y4f/MmGC/yxd + f/8nWX7/IVR9/x9Re/8hU3z/JliA/ytbg/8uX4T/MGGE/zJjhv80Z4f/N2qK/zZsjf82bo7/Nm6Q/zdu + kf82bZH/N2yQ/zZrkP83a5H/OGuQ/zhpj/81ZY7/M2GO/y9ai/8pU4P/Jk9//yVOf/8lUID/JVOE/ypY + h/8uXov/MWOM/zNojf82bI3/OG2O/ztwkf88cZL/P3SU/0F3l/9CeJj/QneX/0B1lP87b5L/NmuQ/zNo + j/8zapD/NGyS/zZtk/82bJX/NGuV/zJolP8uZJH/KmGL/yhfiP8oX4j/LWWN/zJrkv82cJb/OnSZ/zx2 + m/8+eZ3/Pnqd/zx3mf87c5b/OnCU/zpwlP85bZT/N2qS/zNlkP8rXIn/IVKA/xlJd/8TQ3H/GEh1/yFR + fP8tXob/NGaM/zhsjv86cJH/PXSU/z51lP8+dpP/QHaV/0F3lf9Adpf/P3SY/zptk/81aI//MGOL/y1g + if8tYIn/K12J/yhah/8jVIL/IVSB/yRYg/8oXYf/LmSL/zNpjP82bI7/OG+P/zpwkP87cZD/PXKS/0B0 + k/9DdpX/RHiV/0N5lf9CeZb/Q3mY/0N2lv9Cc5X/QG+S/z1tkP86bI//N2uO/zNpjP8yZ4v/MGWK/y5j + if8pXYT/JFd//x5Ref8aTXb/Gk54/x1Re/8iV3//K2CG/zFniv82bI7/N2+Q/zlykv88dpX/P3mX/0B5 + lf9Ce5X/Q36V/0J9lv9Be5j/QHqY/0B3mf89dJj/PHSX/z12mf8/eZv/P3qa/0B7m/9EfZr/R3+a/0h/ + mv9Hfpn/RXyY/0V8mP9HfZj/R3yY/0Z7l/9GeZf/Q3aW/z9wk/85aZD/MmKL/yhZg/8iVHz/H1J5/yFX + ff8kW4D/KV+F/y1jiP8sZIj/KmOH/yhghv8rYoj/LWOK/y5lif8zao3/OG+R/z50lP9CeJj/RHmY/0N5 + l/9Bd5X/Q3eX/0V6mf9Gepr/RnmZ/0N1l/89bpP/NmeO/zBhiv8pXIb/I1qD/yFbgv8nYYb/LmeN/zVu + kv86c5b/P3aY/0R6mv9Ifp3/SoCd/0qAnP9MgZz/TIGc/02Cnf9Og57/ToOg/0yCn/9LgZ//SH2c/0V7 + m/9CeJn/P3WY/ztyl/84cJb/NW+W/zZxl/86dpv/Pnmc/0B7nf9CfZ7/Qnud/0F4mv9AdJn/PG6V/zZm + kP8sW4j/KVWF/ydVhP8rW4f/M2WO/zltkv89cpT/QXKT/0VylP9GcpX/Q3CW/z5tlP82aJL/MWaQ/zJp + k/82bpj/OXKb/zpymf86cpf/OnKW/ztxmP87cZn/OW2X/zRnkf8uYIr/K16H/ytfhv8uYor/MGaP/zRr + k/84cZb/O3Sa/z52mf8/dZn/QHWX/z5zlP86cJD/N22N/zZsjf83ao3/NmeM/zJhiv8rWYT/I09+/xtG + d/8YQ3b/G0Z4/yFPe/8nWoL/LF+I/zBjjv8zZpL/N2mV/zZolP8yY5D/LV+L/yhahf8kWIL/I1mD/yVe + hv8qZYz/Cxsk/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NGyP/H16A/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/x9cgP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woXIv8vZo7/Nm2S/zxz + lf9BdZf/R3mb/0p7nf9Hdpr/QG+V/zJiif8lVn//Hk97/x9Sf/8jWIP/JVuE/yhdhv8uYYn/MWSL/y9i + if8pWYP/J1WB/yNOf/8hS3//Hkp9/xxJe/8gT4D/JVeF/ylfif8waJD/M26T/zZxlf85c5j/Pnab/z51 + m/8+dJv/PXGX/zttk/87apD/OWeM/zdkh/8zYYP/L16C/ypcg/8nWIP/I1N+/yJRfP8kUnz/J1V+/yxa + gf8wYIX/M2SI/zVoif81aYr/NWuN/zZtj/83bpH/Nm6S/zVskP80aY//NmqR/zlsk/85bJT/NmmR/zVk + kP8zYJD/K1iI/yRQgP8fSnr/Hkp5/yBMff8kUYL/KleH/y9ei/8zZo7/N22Q/zpwkv8+dJT/QXaV/0J2 + lf9DeZb/RHqY/0V7mP9Fe5j/QnaX/z1wlf84a5L/NGmR/zNokP8yaJD/NGmT/zVrlf82a5b/NGmV/y5k + kP8pYIr/JV6F/ypiiP8waY3/Nm+S/zlzlf87dZf/PneZ/z96nP9Be53/Qnyd/0F4mf8/dJb/Om+T/zdq + kv81aJH/M2WQ/y1ei/8lVoP/G0x5/xdIdf8ZSXb/I1N9/ytbhP8yZIr/N2uO/ztwkv89dJX/PnaW/z92 + lf9BeJX/QniW/0F2mP9AdZj/PnOX/zltkv81aI7/LWCJ/ydahf8mWYT/I1WC/x9Rf/8fUn//IlaC/yhd + h/8uZIr/M2mN/zZsjv84bo//OnCQ/zxykf89c5L/QXWU/0V4lv9IeZb/R3qX/0d7mf9GeZj/RHWX/0Jy + lf9AcpX/P3CT/zxukf83a47/NGqN/zJqjf8zao7/MmiN/y5jif8pXoT/I1d//x5Rev8eUXr/H1N8/yNY + gP8qX4b/L2aK/zJqjf80bY//N3CS/zt0lP8/eJb/QXmW/0N7lf9EfJb/Q32W/0R+l/9Ee5r/QniZ/z51 + l/88c5b/PHSX/z12mf8/eJr/QHqZ/0N9mv9Hf5r/Rn2Z/0Z9mP9FfJf/RXyY/0Z8mP9He5j/RnqY/0R4 + l/9DdZf/QHCV/zlokf8wX4n/J1eC/yBQe/8dUHj/IFR7/yRbf/8mX4L/KmOG/ytkh/8pY4X/LGaJ/y5m + i/8waIz/M2uO/zZuj/86cZL/P3aW/0J5mP9EeZj/Q3iX/0N4l/9DeJj/RXiZ/0R4mf9Ddpj/QXOV/zpr + kP80ZYz/LWCJ/ydchv8iW4P/JF2F/yhiif8sZoz/MmqQ/zhwlP88dJf/QHeZ/0V7nP9Ifp3/SoCe/0qA + nf9LgJv/Sn+b/0uAnf9MgZ7/TYOg/0uAnv9IfZz/RHma/0F2mP8+dJf/OnKW/zdxlP83c5b/O3eb/0B8 + n/9EfaH/R4Ci/0iBov9Gfp//RHuc/0J4mv8/c5f/OWqS/zFfiv8pVYT/JlKB/ytYhv8zYY3/PGyU/z9x + k/9BcpL/QXGT/0Bvk/89bZP/OGmS/zFkkP8yZ5P/NmuX/zlxm/87dJz/PHSb/ztzmP88c5f/PXSX/z1z + mf87cJj/OGqT/zFjjf8rXYb/Kl2H/y1gi/8wZY//NGuT/zhwlv87c5j/PXaY/z52lv8/dpX/P3WU/z10 + kf88cpH/PHKR/zxwkf89bpH/OmiP/zJfi/8qVYT/IUp9/xpCef8ZP3f/HEZ5/yBPfv8mWIX/KlyI/y1f + i/8wYY7/MmOQ/y9fjf8qW4j/JViD/yNXgv8kWoX/Jl+I/yhkjP8LGiT/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/w0bJP8cW3//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HVV4/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/FzJG/zZvlP9AeJr/RHub/0l/nP9Qg6D/UIGh/019n/9Gdpn/OGiP/ytc + hf8lVoD/JlmE/yxgjP8uY4z/MGWO/zRokP83apP/NWeQ/y1diP8lUoD/IEt8/x5Ie/8cSHr/H0x9/yRS + gv8oWof/LWKM/zNrkv85c5j/PXib/0B6nf9De5//RH2h/0R7oP9Adpv/PG+U/zlrj/84aIr/NWSG/zNh + hP8wXoP/LV2E/ypZg/8mU3//Ik56/yBLd/8iTnn/KVV//y5chP8yYof/MmSI/zJnif8yaYz/NW2P/zZt + kf80a5D/MmiO/zFmjf8zZ47/NmmS/zdqk/80Z5D/MWOO/y5di/8pV4X/IVB9/x5Lef8bSXb/HEp4/yNR + gP8pV4b/L2CL/zRpjv86b5L/P3SV/0N3l/9EeZf/RXqW/0Z8mP9HfZn/R32Z/0d8mf9DeJj/P3OX/zxw + l/84bZT/NGmR/zJmkP8yZ5H/NGmU/zdsl/83bJb/MWiR/ypiiv8pYoj/K2SI/zFqjf85cpL/PXeU/z95 + lf9AeZf/Qnua/0N8m/9Fe5r/RHma/0B0l/86bpP/N2qS/zVokf8zZJD/L2CM/yZYhP8fUHz/HE14/x1N + eP8iUnv/KVmB/zBhh/83aY7/PHCU/z50lv8+dZf/P3aW/z92lv9Ad5f/QHeY/z90l/89cpX/O3CU/zdq + kP8xZIz/Kl2H/yNVgf8gUn//HlB9/x1Rff8hVYH/Kl6I/y9ljP80ao3/NmyO/zlvkP86cZD/PHKR/z90 + kv9Cd5X/RnqX/0h7mP9Ke5n/SXya/0h6mf9Gdpf/RHWX/0N0l/8/cpX/O26R/zdsj/81a43/Nm6Q/zVu + kf80bZD/MmmN/y5jif8qXYX/JViB/yFUff8hVX7/IliA/ydehP8sZIr/L2iM/zJsjv82b5D/OnKT/z52 + lv9CeZf/RHmW/0V6l/9FfJf/Rn2Z/0V9mv9DeZn/P3SW/ztwlP85b5P/OXGU/zx0l/8/eZj/QnyY/0N9 + mP9Ee5j/RHuY/0N6mf9Ee5j/RXyY/0R6mf9FeJn/RXaZ/0N0mf8/b5b/N2aQ/y5diP8mVID/H055/x1M + dv8iU3v/Jlp//ylghP8rZYj/LWiJ/y9piv8zbo7/NW+Q/zdwkv86cpT/PHSU/z92lf9BeJb/Q3qY/0R7 + mP9EeZj/Q3iY/0R3mf9DdZj/QnSX/0Bylv88bpL/NmiN/zFjif8sYYn/J1+H/ydgh/8qY4r/LWaM/y9n + jf8waI7/NGyR/zlxlf89dZf/QXiZ/0V7m/9Ifp7/SX6d/0h9nP9Jfpv/SH2b/0l+nP9Jf53/SH6c/0Z8 + m/9Cd5n/PnWX/zx0lv85dJX/OXWW/zt4mf9Afp3/RYCg/0mBov9MgqT/S4Gi/0l/oP9GfZ3/Q3ia/0F0 + mP87bZL/MmKK/ypXg/8nUoD/KFSC/y9dif83Z47/PXGR/0Bzk/8/cZP/PG+S/zdskf8yZ4//MmeR/zRp + lf83bZn/OXGa/zx0m/8+dpz/PnWa/z10l/8+dJb/PXOW/zxwlf84bJT/MWWN/yxfif8qXYj/K1+L/zBk + j/80aZP/OG6V/ztylv89dJX/PXWT/z91k/8/dZL/P3WS/z91kv8/dZP/QHOU/0BxlP8/bZT/OGSQ/y5Y + if8kTYH/HUN8/xlAeP8XQXb/GUl5/x9Qf/8kVYP/JVWE/ylaiP8sW4r/K1uJ/ydYhv8jV4P/IliE/ydf + if8qZI3/K2eP/wsbJP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DRsj/yFegv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8ZRmH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ZNkj/PneZ/0Z+ + nf9Kgp3/ToWe/1GFn/9ThaH/VIWj/0h5m/88bJL/L2CI/ydZgv8nW4X/LGGK/zNrkv83b5X/O3KX/0B1 + nP8+b5n/NGKO/yhUgv8hTHz/HEh4/x1Jev8iT4D/KFaG/ytcif8uYoz/NGuS/zlxlv89dpn/QXud/0B6 + nP9Bep3/Qnqe/z51mf86b5L/NmqN/zVniP80ZIb/M2KF/zBfg/8uXIL/LFiC/ydSfv8fR3X/GkFw/x1G + c/8kT3r/KliB/y5dhf8uX4b/LmKG/y9kif8yaIz/M2qP/zJojv8vZIv/LmGJ/y5gif8vY4v/L2SL/y5j + iv8tYIn/KlyH/yZWgv8kU4D/IFB8/x1Nd/8eT3j/IFF7/yhYgv8uYYj/NGiN/zpvkf9BdJb/Q3eW/0R4 + lv9Eepb/R3yY/0h+mv9Jfpr/R3ya/0V6mv9Cdpn/QHSY/zxwlv82apL/M2eQ/zNnkP82apP/OG2W/zhu + lv80a5L/MGiN/yxkif8uZ4r/NG2P/zt0k/9BepX/QXqU/0J6lP9De5b/RnqY/0Z6mf9Fd5f/P3KV/zlt + kv82aZL/NWiR/zNlkf8vYIz/KVqG/yRVgP8eT3r/Hk54/yBPef8mVX3/Ll2F/zVmjf87bJP/PHCV/zxy + lv89c5f/PXSW/z10l/89dJf/PXSV/z1ylP88cZP/OW2R/zVojv8tYIv/J1mF/yBSf/8dT3z/HVB9/yRY + g/8rYIn/MWeN/zNrjv82bo//OXCQ/ztykf89dJL/QHaT/0N5lf9Ge5j/SX2a/0t9m/9LfJv/SnqZ/0d3 + mP9Fd5n/Q3aZ/z5zlf84bpD/NWyO/zdvkP84cZP/OHKT/zhwk/83bpL/NGmO/y9jiv8qXob/JlmD/yVY + gv8jWYH/JV2F/yliiP8tZoz/MGqN/zRukP86c5T/QHeW/0R5l/9FeZj/RnmY/0h6mf9JfJr/R3ua/0R4 + mP9AdJb/O2+S/zhskP81bJD/OXGU/z12lf8/eJf/QHmX/0F5mP9BeZn/Q3qZ/0N6mf9Eepn/RHmZ/0R4 + mv9Ddpv/QnKZ/z1tlv82ZZD/LVuI/yRSfv8dS3f/IE54/ydVfv8sXIP/LmKH/zBojP8ybo7/NXCQ/zhz + kv88dpX/P3mX/0B5mP9BeZj/Q3qY/0R7mP9Ee5n/RnuZ/0Z7mf9GeZr/Q3aY/0Fzl/8/cZX/PG6T/zhq + j/8zZIr/LmKJ/yxiif8rY4v/LmaM/zFqj/80bZH/NW2S/zNrkP80bJH/Nm2S/ztylf8+dZf/QXeZ/0J4 + mf9Fe5v/Rnyb/0d8nP9GfJz/Rnua/0Z8mv9Eepr/QniZ/z51l/87c5b/OXSV/zp3lv88eZj/QH6c/0SB + n/9HgqD/TYSi/06Cov9NgaH/S3+g/0d9nv9Fe5z/Q3aa/z1ulP80Y4r/K1eC/yRPe/8mUX7/K1mD/zJk + iP85bI3/O3GS/zxyk/84b5H/M2uO/zFoj/8zapL/NW2X/zdvmP84b5j/OnKZ/zx0mf8+dZj/P3WX/z1z + lf89c5X/PHGU/zltkv8yZo7/LGCJ/ydch/8qXor/MGOO/zVokf85bJP/O3CU/zxyk/8+cpL/P3OR/0B1 + kv9CdpT/QXWU/0B0lP9AcpT/PnCU/z1slP83ZJH/MFqL/yVNg/8dRX3/GUN5/xZEdv8YSHj/Hk59/yNT + gv8kVIP/JVSE/yhWhv8lVYT/I1WD/yJWg/8kWob/KWGL/y1okv8xbpb/DBsl/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8NGyT/HVt//xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1l+/xlGYf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/yhPaP9EfZ3/SoOf/06GoP9Qh5//Uoee/1SHoP9Rg5//Snuc/z9w + lP8yZYv/KlyE/yVYgf8pYYf/MWmO/zl0l/9BfJ3/QXid/z9wmv85ZpL/K1iF/yBNfP8cSXn/IE19/yZT + g/8oV4b/KVmH/yxdif8wZI3/NGqQ/zduk/84b5T/OXGV/zhxlP82bpL/NWyR/zVrjv8yZ4n/MWSG/zNk + hv81ZYf/MmGF/zBdg/8uWoL/JU97/xtEcf8VPGr/Fz1t/x5Hdf8mUn3/KFeB/ypbg/8pXYP/Kl+E/yth + hv8tY4n/LmOK/y1hiP8rXYX/KlyF/yhdhP8oX4X/KmCH/ytgh/8pXYX/KFqE/ydZg/8mVoH/JFV//yNU + fP8jVn3/JFh+/ytghf8zaIv/Om2Q/z9ykv9BdZT/QnaU/0V4l/9Ie5n/Sn2a/0l8mf9IfJn/R3ua/0d7 + m/9Dd5n/PnKX/zdrkf8zZ43/M2eO/zVpkP85bZT/OXCV/zZuk/8ya4//MGmM/zFqjP82b5H/PHWX/0B5 + mP9BeZX/QnmT/0J3lP9EdpX/R3eX/0N1l/8/cZX/Om2T/zVpkP8zZpD/MWSO/zBgjP8uXor/KVqF/yRV + f/8fTnn/Hk13/yNQev8sWYP/NWOM/zppkv86a5T/Om2V/zpwlv87cpb/OnGV/zpxlP86cZP/PHKU/z1y + lf87b5T/N2qS/zJkjv8rXIn/I1SC/x1Pff8gVID/KFyH/y9kjP8xaI7/M2yO/zZwj/85cpL/PHST/z92 + lP9CepX/RHqW/0Z8mP9Jfpv/Sn2b/0t7m/9Jepr/RniZ/0R4mf9Adpf/O3KU/zVukP81bo//N3KR/zp0 + lP87c5P/OnKT/zpwk/86cJP/NmqQ/zBki/8rXoj/J1uF/yRag/8kXIX/J2CH/ytliv8uaIz/M2yQ/zlx + k/8/dZb/Q3eZ/0V4mf9HeZn/SXmZ/0t7m/9Jepr/RniZ/0Fzlv89b5P/OGuP/zVrj/83b5H/OnOU/zx1 + lv89dpb/PnaX/z92mP9Ad5n/Qnia/0N4mv9DeJr/Qnab/0J0m/9AcJr/PGuW/zRjj/8sWof/IlF+/x5N + ef8hUHr/KFV//y5dhv8zZI3/NGqQ/zVukv83cpP/OnaU/z55lv9Be5f/RX6a/0V+mv9FfJr/RXuY/0V7 + mP9HfJr/SHyb/0Z5mf9CdZf/P3GW/z1vlP86a5H/NmeO/y5hh/8qX4X/KWCG/y9njf8za5H/N2+T/zly + lf87dJX/OnKU/zhwlP84cJT/OXCV/zxzl/88c5b/PnSX/z91l/9BeJn/RHqb/0V7nP9Eepr/QniY/0B3 + mf8+dpn/O3SX/zhzlf85dpX/O3mX/0B/m/9Fg57/SIWg/0yGof9MhKH/TYOh/02Bof9MgaH/SoCg/0h+ + n/9EeZz/P3GW/zhnj/8sWoL/I095/yNPev8nVn//LV+F/zNniv83bY//Nm6Q/zNuj/8xa47/M2yR/zVu + lf84cZj/OXGY/zlxmP83b5X/OHCV/zpxlf87cpX/PHKV/ztxk/87cZP/OW6R/zRpj/8rYYr/J1yG/yhc + hv8uYYn/NWaP/zprkf89b5P/PnCT/z9xkv8/cpH/QXOT/0J0lP9Bc5P/PXCS/ztukv85apH/N2aQ/zNh + jv8sWIn/I06D/xxHfP8YRnj/GUl4/x5Pff8jU4H/JVWD/yVWhP8nVoX/JVSD/yJTgf8gUoD/IVaC/yZd + iP8qZI7/MGuT/zNwl/8NHCb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwbI/8fXID/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8bWX7/ES9C/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/MVp0/0iA + n/9NhqH/UIih/1KJn/9UiJ//VIaf/1CCnv9Je5v/QHGV/zRmjP8rXob/JlyD/ydehf8uZ4z/OXOV/z95 + m/9BeZ3/PW6Z/zRjj/8oV4P/HUx6/x5Me/8iT3//KFaF/yZVhP8lVoP/JliD/ydZhP8rX4f/LmOJ/y1j + if8uZIr/LWWK/ythh/8sYYf/LGKG/y5jhf8uYoP/MWKD/zNjhf8zYob/MF6D/ypXf/8hTXf/GEJu/xU9 + av8VPWz/GUFw/x9Ld/8kVH3/JliA/ydbgf8nXIL/J1yC/yhehP8pX4X/Kl6E/yhbgv8oXYP/J12D/yVd + gv8qYof/LGKI/yxhiP8sYIj/LF+I/yxfh/8rXYb/KVuE/ydbgP8nXIH/K2CD/zJnif84bI//PG+R/z5x + kf9BdJT/RXeY/0h6mv9KfJv/Snya/0l7mf9Ge5n/Rnua/0R5mf8/dJX/OG2Q/zNojP8vY4j/M2eN/zds + kv86cJX/OG+T/zRtkP8xaoz/M2yO/zZvkf86c5b/PHWX/z53l/8/dZT/QHOS/0Byk/9Bc5X/QnSW/z9y + l/89b5b/N2uT/zJmj/8vYoz/MGKM/zFhjP8yYYz/K1mE/yNRfP8eS3X/IUx4/ylUgP8yXIn/OGSP/zlo + k/84a5T/N26U/zhwlP85cJT/OG+T/zhvk/86cJT/PXKW/zxvlv85bJT/M2WQ/yxei/8lVoT/IlWD/yZZ + hv8rYIv/L2WN/zFpjv81bo//OHOS/zt2lP8+d5X/QXqW/0N8l/9Ee5f/R3yZ/0h8mv9JfJv/Snua/0d5 + mf9EeZn/QXiZ/z91lv86cpP/N3GS/zZykf83dJL/OnWT/zx1lP88c5L/PHOT/zxxlP85bZP/NWmQ/y9i + jP8qX4j/JVyF/yRchf8mX4f/KWOK/yxmjP8xao//N26S/z1ylf9CdZf/RXaZ/0Z2mP9Gdpn/SHia/0l5 + m/9Edpf/P3GU/zttkv82aY7/MmeL/zNrjf82bpL/OXGV/zpylf86cJb/O3GW/z1ymP8/dZr/QHWZ/0B1 + mf9AdJr/P3Ga/z1umP85aZX/M2GP/ypYhv8jUX//H057/yFQe/8kVH//KlqE/zFijP81aJL/NW2S/zZx + k/85dJL/PXiU/0J6lv9Gfpr/R36b/0Z9m/9Fe5n/RXqZ/0Z7mf9He5r/RXiY/0Fylf8+b5P/O22S/zlq + kf8zZYz/KV+F/yVcgv8qYYf/MWmN/zZukv87c5b/PXaX/z94mP8/eJj/PneW/z11lv89dJj/PHOY/zxy + l/87cZX/O3GV/zxzlv8/dpn/Qnia/0F3mv8/dpr/PHOZ/zpzmf85c5f/N3OV/zl3lv89fJn/Q4Ke/0iF + oP9Nh6H/Toeh/06Gof9OhKD/ToSh/06Fov9MhaL/SYCf/0Z7nf9CdZn/PGyT/zRhiv8pVX//I096/yRU + fv8oW4P/L2SJ/zJpjf8ya43/L2qM/zFtj/80b5L/OHKW/zp0mf88dZr/O3SY/zdwlf81bpL/M2yQ/zVt + kv82bpH/OG+S/zlukf84bZH/NWmP/y9jjP8pXYf/J1qD/yxehv8zZIr/OWqQ/z1tkv8+bpP/P2+T/0Bv + k/9BcJP/QHGU/zxukf85bI//NWiO/zJki/8wYYv/LFyJ/ydVhv8gT4D/Gkh6/xZHdv8bTXv/IlSC/ydY + hv8oWYb/J1mF/ydYhf8mVoT/IlKB/x9Rfv8eVID/I1uG/ytljv8xbZT/NXGY/w0cJv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DBsj/x1bf/8aWX7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8RLkH/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9AcZH/S4Kg/1CHov9RiaD/Uomf/1OInv9RhZ7/T3+d/0h5 + mv8/b5T/NWaN/ytehv8mW4L/Jl2E/y1li/82bpP/OXCW/zltlv82aJP/LV2J/yFRff8cTXn/Hk57/yJR + f/8kVIH/I1SA/yJTf/8iU3//I1V//yRWf/8mWYD/JlqB/yZbg/8kWoL/JluD/yVagf8nW4H/K1+B/yxg + gf8tX4D/LV6A/y5egf8tW4H/JlR7/x5Ldf8YRHD/Ez9r/xQ/bP8YQnD/HUl2/yJSfP8lWID/J1yC/ydd + gv8oXoT/J12D/yhehP8pXYP/Kl+E/ypghf8pYYX/K2OH/y5miv8xaYz/MmmO/zNoj/8zaI//NGiQ/zJl + jf8vYor/K16F/yleg/8rYYX/MGaJ/zZsjv86b5D/PXGS/0Fzlf9Fdpj/SHmb/0p7nP9MfZz/SXuZ/0d7 + mP9Fepj/Q3iW/z90lP86b5D/NWmN/zJmiv8xZYr/NWqP/zlvk/84cJP/Nm6Q/zNrjf8ya43/NG2P/zRt + kf83cJT/OXCV/zlvlf87b5P/PXCS/z5wlP9Acpf/QHSZ/z5ymf84bZX/MmeQ/y9jjP8vY4z/M2SO/zNj + jf8xXYn/KVaC/yNOev8jTHn/JEx6/ytVgv8yXYr/NWSP/zRnkP80a5L/Nm6T/zhvk/84b5P/N26T/zhv + lP86b5b/O2+X/zpslv80ZpH/LF6M/ydYh/8mWIf/KFyJ/yxijP8vaI7/MmuQ/zZxkf86dZP/PnmX/0F6 + mP9De5j/RHyY/0V7l/9GfJj/R3uZ/0l7mf9Hepn/RXqZ/0J5mP8/dpb/PXWW/zt0lf87dZX/OnaV/zp3 + lP89eJX/P3iV/z92lP8/dZP/PXGU/ztulP83apL/MmaO/ythiv8mX4f/JV6H/yVfh/8oYYj/K2SL/y5n + jP80a5D/Om6T/z9ylv9DdJj/RHSY/0N0l/9EdZj/RHWX/0Bylf86bY//NmmO/zBkiv8pYIP/LmSJ/zJp + kP81a5P/NWuT/zVrk/83bJT/OW2V/zpulf88cJb/PXGX/zxvlv87bpf/OmuW/zVlkv8uXYv/J1WE/yJQ + f/8eTXv/IFB8/yJTff8kVoD/KV2H/y5kjP8xapL/NG6S/zdxkf86dJL/QHiU/0R7l/9GfZn/Rn2a/0V8 + mv9Fepn/RnqZ/0R3mf9Bc5f/P2+U/zxskv85ao//NmiO/y5iiP8pX4T/KWCE/y5lif8za47/OnKU/z93 + mP9BeZr/Qnua/0N7mf9De5n/Q3qZ/0F5mf9Ad5r/PnWa/zxymP87cZb/OnGV/zpxlf87cpb/PXOY/zpx + l/84cJf/NnCY/zZyl/84dZj/O3mb/0B+nf9Fgp//TIah/0+Iov9QiKL/UIii/0+Hov9QiKT/T4ik/02G + o/9Kg6D/R36d/0V5m/9CcZb/OmeP/zJdif8rV4P/JFR//yZYgv8pX4b/LWWK/y1pjP8xbY7/NHCR/zdz + lP88dpf/P3ia/z94m/89dZn/OnKW/zVtkv8wao//LmiO/zFqkP8za5H/NWyR/zZrkf80aJH/MGOM/ytd + iP8oWYX/KluE/zBgh/83Zo3/OmmQ/zxrkv89a5L/PGuQ/z1rkf86ao//NmiN/zNljP8vYon/LF6H/ypc + h/8nWIX/JFWD/x5Qfv8XSnf/GEp4/xxOfP8jVoP/KVuI/yxdiv8rXYn/KlyH/ydYhP8jVIH/H1F+/x1R + fv8iWoT/KmSM/zFsk/82cJf/Dhwm/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8MGyT/IF2B/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1p+/wkYIf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/0R5 + m/9MgqL/UIah/1GIoP9SiZ7/UYae/1CDnv9Nfp3/RnaZ/z5tlP81Zo7/K1+H/yRZgv8kW4P/KWCI/y5l + jP8yZo7/MGKM/yxdiP8kVYH/HlB7/x1Qev8fUXz/IVJ+/yJUgP8jVYD/I1aB/yNWgf8jVX//JFd//yVY + gP8lWID/JVmC/yZag/8nW4T/KFuF/yhcgv8rYIL/LmOB/yxff/8pW3z/Klp+/ylYff8kU3r/Hkx2/xlG + cf8VQ2//FkRw/xpIdP8fTXn/JFV//yhcg/8qYIb/K2GH/ytih/8rYof/K2KH/yxjh/8uZYj/L2aJ/y5n + iv8yao7/NG2Q/zdwkv86cZX/OnGV/zpwlf87cJb/Om2V/zZpkP8wY4r/Kl6F/ypfhP8vZYj/NWuN/zpx + kv8+cpT/QXOW/0Z1mf9JeJv/THud/0x9nP9JfJn/R3qY/0V5lv9EeJb/QHSU/ztwkv82a4//M2eM/zJn + jf80aY//OG2S/zhvlP81bZH/MmqO/zBpjP8vZ4z/L2iN/zBoj/8yaZH/M2qR/zVrkf84bZH/PW+U/0By + mP9BdZz/PXKZ/zdtlP8yaJD/MWeN/zJnjv81aJD/NWaP/zNii/8uWob/KFGA/yRMe/8jSnr/JU18/ytV + g/8uXor/L2OM/zFnj/81bJL/N26T/zhvk/84bpP/N26V/zhulv85bZf/NmmU/zJkkf8sXo3/KFqJ/yda + iP8oXor/LWaO/zBqj/8zbpH/NnKS/zp2lP89eZf/QXya/0N9mv9EfJj/RHuY/0Z6l/9Iepj/R3qY/0Z6 + mf9Eepn/QHeW/z52lf88dJT/PXeX/z55mP8+epj/P3uY/0B7lv9DfZj/RHuY/0J3lv9Ac5b/PG+W/zZq + k/8wZo//K2KL/yliiv8nYYj/J2GI/yhhiP8qY4r/LWSK/zFnjf82apH/PG6V/0Bxl/9BcZj/QXKY/0Fy + lv8/cZX/O26R/zZpjf8xZIv/K2CJ/yhehf8qYIf/LWSM/y5kj/8vZZD/MGWQ/zJmkP81aZH/NWmQ/zVp + j/83a5H/N2uS/zdqk/81Z5H/MWGN/ypah/8jUoH/Hk18/x5Ne/8iVH//JFiA/yNZgP8hWID/Jl+G/ytk + iv8vaY7/Nm6S/ztxk/9AdJT/Q3mW/0V7mP9Ge5r/RXqa/0R4mf9Dd5j/QXSX/z9wlf88bZP/OmqQ/zZn + jv8xZYv/LGOI/ylhhv8uZYj/M2qM/zlwkv8/d5f/Qnqa/0V9nP9Hfpz/R3+c/0h/nP9If5v/SH+c/0Z9 + nf9Depz/QHeb/zxzmv85cJf/Nm6U/zVtk/80bJL/M2yT/zJrk/8xbpT/M3GW/zh2mv89e53/Q4Cg/0mE + ov9Oh6L/UIii/1CIov9RiaL/Uouk/1KMpf9Qi6X/TYii/0uFoP9KgZ7/SX2c/0d2mf9CbZT/OmKP/zFb + if8pVoX/JVeE/yZch/8pYor/LWmN/zNvkP83dJT/O3aW/z95mf9EfZ3/RXyd/0J5m/8+dZj/N2+U/zJr + kf8uaI//LGmP/zBpkf80apH/NWmS/zRnkf8wYoz/K1yI/yhXhf8nVoP/LFuF/zNhif83ZI7/OGaP/zdk + jv82Y43/NWOM/zJiiv8wYor/LmCI/ytdhv8pW4X/KFmE/yZZhP8lWIP/IVWA/xxRfP8bT3v/H1J+/yNV + gv8qXIn/LmGN/y9ijv8tX4v/KlyH/yVWgf8hU3//IFOA/yNZg/8qYor/MGqR/zVvlf8OHCb/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwaI/8eXH//Glp+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8cWX7/CRgh/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HDRL/Q3iZ/0l/n/9Ng6D/Toaf/0+Gnv9Og57/TYCd/0l7 + m/9EdJn/PW2V/zVmkP8uYYv/J1yH/yNahP8kWoT/J1uF/ypbhf8oWoP/I1V+/x5Rev8fU3z/IVZ+/yNX + f/8lWYL/JlmD/yZchf8nXoX/KF2G/ypehv8qX4b/Kl6E/ytfhv8sYIj/LF+I/y5hi/8vYor/L2SH/zBm + hf8vZYP/LWGB/yldfv8oW37/KVp+/yVVfP8gUHn/HUx2/xtJdf8cSnb/Hk54/yJTfP8nWoL/LGGH/y5l + iv8vaIv/MGiM/zBpjP8xaYz/MmmL/zNrjf8zbI3/NGyO/zZvkv85cpT/PHWW/z94mf8/eJr/P3aZ/z51 + mf8+cpn/O2+X/zVpkf8vY4r/Kl+G/ythhv8xaYz/N26Q/z1zlP9BdZb/RXWZ/0l3m/9LeZz/Snub/0l7 + mv9GeZj/RXiX/0R3l/9Ddpf/PnKW/zhskf8yZo3/MWWN/zJnkP82a5P/OW6W/zZslP8zao//LWSJ/ylh + h/8pYYj/K2GK/y1ijP8vZI7/MmmP/zZskP86b5L/QHOX/z90mf87cJf/NWyT/zNqkP8yaY7/M2mO/zVq + kP85apL/N2WP/zFcif8rU4P/JEp8/yFHef8iSnv/JVGA/ylahv8sYYr/MGaN/zRpj/82bJH/N22S/zdt + kv84bZT/OG2X/zVqlf8yZZL/LWCP/ypdjP8nW4n/JluI/ytijf8taI7/MGyQ/zNwkf82c5P/OHWT/zt3 + lv8/epj/Qnya/0R9mv9Fepf/RnmW/0d6mP9Ge5n/RXua/0N6mf8/d5b/PXWU/z53lv8+epj/QHya/0F8 + mf9DfJn/RH2Y/0Z+mf9If5v/Rnub/0J1mv88b5b/N2uT/zBnj/8uZo7/LGWN/ypki/8qZIv/KmOJ/ypj + if8tY4r/MGSM/zRnj/85a5P/PG2W/z9vl/8/cJj/Pm6V/zttk/83bJD/M2eN/y5ii/8qXYj/J1uF/ydc + hf8qX4n/KV6K/ypfjf8tYo3/L2ON/zBkjf8xZoz/MmaL/zJmjP8yZoz/M2aP/zFkjf8tXon/J1iE/yBP + fv8cSnr/IVN//yZag/8pXoX/KGCG/yZghP8iW4D/JF+C/ypkiP8zaY7/O22V/z5wlf9BdZb/RHiX/0Z5 + mf9EeJn/Q3aZ/0J1mf9Acpf/PW6V/zpqkv82Zo//MmWM/y9liv8sZIn/L2eM/zNqjf83bpD/PXWV/0J6 + mf9Hf53/SoKe/0qBnv9Lgp7/TIOf/0yDn/9NhKD/S4Kg/0l/n/9FfJ//QHed/ztymv84b5b/M2uR/zFq + kP8tZ47/LWqQ/y1skv8xcJX/N3Wa/z98nv9GgaH/TYSj/0+Go/9Ph6L/UIih/1CLo/9RjqX/U5Cn/1GN + pP9PiaL/TYag/02Cnv9Nf5z/S3mb/0dxmP8/aJP/NV+N/yxZiP8mV4X/JVuH/ylii/8xa5H/N3OV/zp2 + l/89eJf/QnuZ/0Z9nP9KgJ//SX6e/0J4mv87cpf/NW2U/zFrk/8vapL/MWmS/zNqkv80aJH/M2aP/zBj + jP8sXIj/JlSD/yRRgf8nUoL/LFmF/zFeif8zXor/Ml2J/zBdiP8tW4b/K1yF/ytehf8qXYX/K16G/ytd + hv8rXIf/K12J/ypeif8mXIX/IliB/yBVf/8iVYH/JViE/ypdif8uYo3/MmWQ/zFkj/8tYIv/KFqG/yRV + gf8iU4D/JFeD/ypgif8yaZD/Nm6T/w4cJf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DBsj/x5c + gf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/x1bf/8DBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w0a + I/89dJX/RHub/0iBnf9JgZ3/SYGc/0qAnP9IfJv/RXiZ/0Byl/88bZb/NmiS/y9ijf8oXon/JVuG/yRX + g/8kU3//I1J+/yFSfP8dUHn/IFR7/yJXfv8kW4H/KWCF/yxih/8tY4j/LWWL/y5njf8vZ43/MWiM/zNo + jf80aY3/NGmN/zNojv80aI//NWiQ/zVpjv81a4r/NWuI/zJohv8uY4P/L2OE/y5ihP8sXoP/KVqB/yVV + fv8iUnz/IVB7/yNSff8lVH//J1mB/ytfhf8vZov/M2uP/zNtj/8zbY//NW6Q/zZtkP83bo//N2+P/zdv + kP84cJD/OXGS/zx1lf8/epj/QHqZ/0F7mv9Bepr/QHeZ/z91mv89cpn/Om6X/zRokP8uY4r/KmGH/yti + h/8xaIz/OG6R/z90lf9FdZj/SHaa/0l4m/9Jepv/R3ia/0V3l/9Edpf/Q3WX/0N1mf8+cpj/OGuT/zJm + j/8vYY3/LmGO/zJlkf80aJT/N2uW/zFnkf8rYYv/JV2F/yRbhP8oXYf/Kl+J/y5jjP8yaI7/NmyP/ztx + kv8+c5T/PXKV/zlulP81bJH/M2uQ/zJqjv80a4//N2uQ/zlskf84Z5D/NV+N/y5Xhv8mTX7/HkV4/x5I + ef8iUH7/J1iE/yxfiP8wZIv/M2iN/zVqjv83a5D/OG2T/zltlP82a5X/M2iT/y5ikP8sYI7/KV2M/yZb + if8qYYz/LmeP/zFskf8wbY//MXCQ/zRykf83dJP/O3aV/z55mP9CfJr/RHyZ/0R6l/9GeJb/RHqY/0V8 + mv9Ee5r/QHiX/z93lv89d5b/PnmX/0B7mf9CfJr/RH2a/0V8mf9GfJj/R32Z/0h9m/9IfJ3/QnWb/ztu + lP80aZD/MmqQ/zBpj/8uaI7/LWeO/y5mjf8uZYz/LWSM/y1ji/8uYor/MmSN/zVmkP84apP/OmyV/zts + lf85a5L/N2uR/zRqkP8wZo3/LGKL/yleh/8nWoT/J1qE/yleiP8rYIv/Kl+M/y1ijf8vZI3/MGWL/y5l + if8wZYn/MGaI/zBmiv8wZoz/MGOM/yxeiP8mVoT/H059/yFSff8nWoL/LGGH/y1li/8uaIz/LWiL/ypm + h/8kX4D/JFyB/y5giP81ZY7/OmuU/zxvlP8/cpb/QXSX/0N1mP9CdJj/QXGY/z9vl/88bJX/N2eR/zJk + jf8tY4r/LGSJ/zFqjf81bpH/OXGT/z10lf9AeJf/Rn6b/0mBnf9MhKD/TYSg/02En/9OhaD/UIei/1CH + o/9PhaP/TYOi/0yAof9Fep7/Pnac/zpymP82b5X/MmuR/y1pj/8qaY7/LGuR/zFvlf83dJn/P3qd/0eA + ov9NhKX/T4aj/0+Hov9PiKH/T4uj/0+NpP9QjqT/UY2j/0+Kof9Ph5//T4Se/0+Anf9Oepz/SXSa/0Jt + lv85ZJH/LVyK/yZYhv8jWYb/K2ON/zVulf87dpn/PnmZ/0B6mf9DfJn/R3+c/0qAnv9Lf5//R3ud/0B1 + mf85cJf/Nm6V/zRslf80a5T/NWqS/zVpkP8yZo7/MWKL/yxbhv8nVIL/Ik1+/yJMfv8mT4H/KlSE/yxW + hf8tV4b/LFeF/ypYg/8oWYL/KV2D/ytghf8tYon/MGOK/y9iiv8wY4z/MGaP/y1jjP8pX4j/JluF/yRZ + g/8nW4b/K1+K/zBkj/8zZ5L/M2aR/zBjj/8rXor/J1mF/yRTgf8kVYP/KVuI/y9jjf81apH/AwcJ/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8LGiP/Hlt//xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HVp+/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EiYz/zVtj/87dZT/QHqX/0F6mP9Cepf/QnqY/0F3 + mP8/dJf/PXCW/zptlf82apP/L2SQ/ypgjP8pXYr/KVqI/yZUgv8gTnv/HU15/x5Qev8iVn3/Jl2B/ytj + hf8wZ4r/MmuM/zFpi/8xao3/M22Q/zVvkf82cJH/OHCS/zpxkv85b5H/N26R/zhtkv85bpL/OXCQ/zlw + jf83bov/NGqI/zJoiP80aYr/NGiK/zJmif8uYYf/KlyE/ydYgf8mVoD/J1eB/ylbg/8sX4X/MGWJ/zRr + jf82b5D/N3GR/zZxkf86cpP/PHKT/ztxkv87cpL/OnKS/zpykv87dJP/PXaV/0B6l/9BfJn/QnyZ/0J7 + mf9AeZn/QHeZ/z50mf88cZj/N2yU/zFnj/8tYor/K2GI/yphh/8zaY3/PXCT/0N0l/9Gdpj/R3ea/0d3 + mv9Fdpn/RHWX/0Jzlv9Bcpf/P3GX/zttlf81Z5P/LmCN/ylbif8oWon/K12N/y5hkP8wZJL/LmOR/yle + jP8kWYb/JFiE/ydbhv8rXon/L2SL/zNpj/85bpL/O3GT/zxxkv86b5H/OG2Q/zVrkP8zao7/M2yP/zVs + j/84bZH/OGuQ/zhlkP82YI7/MFiJ/ydPgP8fSHr/G0h3/yBPfP8lV4L/LF+H/zBki/8yZ4z/NGmN/zds + kP85bZP/OW2V/zZqlP8xZpL/LWKP/ypfjf8pXoz/KmGN/y5nkP8xbJL/MW6R/zFvkf8xcJD/MnGR/zZz + lP86dZb/PXiY/0F5mf9Depn/RXiX/0R5l/9DeZf/Q3uZ/0J6mf9AeJf/PneV/z15l/8/epj/QXuZ/0R8 + mf9FfJn/Rn2Z/0d9mP9HfJj/R3ua/0Z6m/9AdJj/NmqQ/zFnjf8waI7/MWqP/zJqj/8xao//MmmP/zFo + j/8xZo7/L2OM/y1hiv8tX4n/MGKM/zNkjv80Zo//NGeQ/zJmj/8xaI//MGiN/y1mjP8uZYv/LGKK/ytf + h/8sYIf/LWKK/y9ljP8wZo//MWeP/zJoj/8zao7/M2qM/zFpiv8yaYr/M2mL/zNojv8zZo7/LmGK/ydY + hP8kVYH/J1qC/yxhhv8vZ4v/MWuP/zNvkv81cZH/M26O/y9pif8qX4T/Jld//yxchP8uYIn/M2aP/zdq + k/86bZX/PG+V/z9wlv8+bpb/PGyV/zlpk/80ZpD/LWKL/ypiiv8tZ4z/M22R/zpzlf8+dpf/QXmZ/0V9 + m/9Hf5z/SoKe/02En/9OhZ//ToWf/0+FoP9Rh6L/Uoek/1GHpP9QhaP/ToKh/0l+n/9CeZ3/PHaa/zl0 + mP83c5f/MXCU/y5ukf8tbZH/MG+S/zdzl/8/eJv/Rn2g/0qBov9OhaP/TYai/0yIof9MiqL/TYqh/06L + ov9OiaH/UImg/1KIn/9ShJ7/UYCe/098nf9Ldpz/RHGY/zpok/8vX4z/JVeG/yZbif8tZI//Nm+X/zx2 + mf9AeZr/Q3ya/0Z+m/9If5z/Sn+e/0l9nv9Hep3/RHec/z9zmf86bpj/OG2X/zhrlf82aZL/NGeP/zJm + jP8wYYn/LFuE/yZTf/8fSnn/Hkd5/x9Ie/8iTH3/JU+A/yhSgv8qVYP/KleD/ypbg/8qX4T/LWSG/zFn + i/8yaIz/M2iO/zNoj/8zaJD/MmeQ/zBmj/8qYIr/KF6H/yhdhv8sYIv/MWWQ/zRokv81apP/MmeR/y5i + jf8qXYn/JliF/yVVhP8mVoX/KluJ/y9hjf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwZ + Iv8dW3//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8eWHj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8VMEL/L2eJ/zNujv83cZH/OXOS/zlykv86cpL/OXCT/zlvk/84bJP/NWmS/zJnkf8vZJD/LWGO/y1f + jf8sXYv/KFaE/yJQff8eTXn/H1F6/yRXfv8pYIT/MWmK/zRtjf81b4//NW6N/zRtjf82cJD/OXOT/zp0 + kv88dZL/PXWS/zxzkv84cJD/OXGR/ztykv87c5D/O3OQ/zlwjf83bYv/N22M/zdtjP84bY//N2uO/zNm + jP8uYYj/KVyE/yhagv8pW4P/K1+G/zBliv8zaoz/Nm+P/zhykf85dJP/O3WU/z52lv9Cd5f/QXaW/0B1 + lv8/dZX/PnWV/z52lf9AeJX/QnuX/0N9mf9DfZj/QnuX/0F6l/9BeJj/QHea/z50mf87cJf/NWmS/y9k + jf8rYIr/LGGJ/zJmjf86bZH/P3GU/0N0lv9EdZf/Q3SW/0Jzlv9AcpX/PnCV/z1ulf85a5X/NWeT/zBh + j/8oWon/IlOE/yJUhf8kVoj/KFqM/ypcjv8pXI3/JlqK/yFVg/8hVIH/JFeC/ypdh/8wY4z/NGmQ/zpv + k/88cZP/Om+R/zltj/82a4//NWqO/zNqjv80a4//NWyQ/zdrkP83aZD/N2WP/zRejP8vV4f/Jk6A/xxI + d/8ZR3X/HU54/yVXgP8rXoX/MGSJ/zNojP81aY7/OGyR/zpuk/86bpb/N2yV/zFmkv8sYo7/KV+M/yph + jv8tZpD/MGqS/zFtk/8xbpD/M3GS/zVzlf82c5X/NnOV/zp1lv8+d5j/QXmZ/0R4mP9EeJf/QXeW/0B4 + l/9AeJf/P3eW/z52lf8+eJf/PXiX/z56mP9Bepj/RHuY/0Z8mf9HfJj/SH2Z/0h9mv9He5n/RHiY/z5y + lf81aY7/LmSJ/y1liv8waI3/NGyQ/zVtkv81bJL/NWuR/zVpkf8yZo7/L2GL/yxeiP8rXIf/LV6J/y5g + i/8tYYv/LWOM/y5mjf8saIz/L2mO/zFqjf8waIz/MWiM/zNpjf81a4//NmyR/zdtk/83bZP/OXCU/zly + lP85cpL/OHCO/zdvjv83b4//N22R/zVrkf8yZo//LF+J/ylchP8qX4T/LWSI/zFrjv82cpP/OnaW/zx4 + l/89d5b/OnCS/zVnjP8tXoT/IlR8/yVYgf8pXYj/LWKP/y5lkP8yaJD/NmqR/zlpkf85aJH/NmWP/y9j + jf8rY4r/K2WK/zFrj/83cZT/PXeY/0J7m/9FfZz/R36b/0mAnP9NhJ7/T4Wg/0+GoP9PhqD/T4Wf/1CG + of9Sh6P/Uoek/1GFo/9Og6H/SX+f/0J8nf8+epz/O3ma/zt5m/85eZv/NXaX/zJylP81cpT/OHKV/z92 + mv9Depz/Rn2e/0mAn/9Kg6D/SYWg/0qHof9LiKH/TIif/06Hn/9Qh5//U4af/1WFoP9UgqD/UH2f/0t5 + nv9Ec5v/OWuU/yxfjP8nW4n/KF6L/y9mkf82bZX/O3OX/0B5mf9FfJv/R32b/0l+nP9JfZ3/SHyd/0d5 + nf9Edpz/QXOa/zxumf86bJf/N2mU/zRmkf8yZY3/MGKL/y5ghv8sW4P/JVJ8/x9Jd/8aQ3L/GUJ0/xxG + d/8gS3r/I1B9/ydVgP8sWYT/LV6F/y5jh/8yaYr/NGuM/zRsjf81a47/NGmQ/zRpkf80aZL/MmeQ/y5k + jf8qYIr/KV6H/yxgiv8wZI7/NGmS/zZqlP80aZL/MGWP/yxgjP8pXIn/JVeG/yNThP8kUoT/KVmJ/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Chgh/xxZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xlH + YP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMtQP8qYoX/LmeK/y5pjP8xa47/MmyO/zJr + jv8yao3/M2mN/zJnjv8vY4z/LGGL/ytgjP8sXoz/LV6M/yhZiP8lVYT/IVB9/yBQfP8hU3z/JlqA/yxj + hv80bIz/OHGQ/zlykf85cpD/OXKQ/zlzkf88dZT/PneV/z53k/8+eJL/PHaQ/zt0kf86cpD/PHSS/z11 + kv89dJH/PHOQ/ztxjv85b43/OW+N/zluj/84bZD/NmqO/zFkiv8sX4f/KFyE/yhbg/8rYIb/MGeK/zVt + j/84cpH/OnWT/zx3lP8/eZf/Q3ma/0Z6mv9FeZr/RXqa/0N4mP9CeZj/QnmY/0N7mP9FfZn/Rn6Z/0eA + mv9Gf5n/Q3yX/0N7mP9CeZn/QXia/z90mf86bpb/M2eQ/yxgi/8vY4v/MmWM/zdqj/87bpL/Pm+T/z5w + k/89cJP/PG+R/zptkP86a5L/OGiS/zVlkf8xYo//K1yL/yRVhv8gUYP/HlCB/x9Rg/8iVYf/JVeK/yVY + iv8jVoX/H1KB/xtOe/8gUn7/JViD/y1gif81aJD/NmqR/zhrkP84bJD/N2qO/zZpjv80aI3/M2iP/zNo + j/8zao//NGiP/zRljv80Yoz/Ml2K/y1Xhv8kT37/GEZ0/xNDb/8aSnX/IlN8/yxehf8yZYr/NGmN/zdr + j/85bZH/Om6T/zpvlv84bpf/MmiT/yxij/8pYIz/KmOO/y1okP8wbJL/MW+S/zNyk/82dJb/Onea/zp2 + mv85dZj/O3WX/z93mP9Cd5j/QneY/0F2lv8/dpX/PnWV/z11lP88dZT/PHeW/z14lv89eZf/P3iX/0J5 + l/9Eepf/RnuX/0Z7l/9HfJr/R3yb/0Z7mv9DeJn/P3OW/zdrkP8wZov/LWSJ/zFojP81bJD/N26S/zpw + lP86b5T/OGyT/zZokf8xY43/LF2I/ydZhf8mWIT/J1qF/yhdh/8qYYn/K2aL/y5qjv8zbpH/NW6R/zZv + kf83b5L/OXCS/zpxk/88c5b/PnSW/z90l/9Adpf/QXiZ/0F7mf9BeZb/QHiW/z93lv88c5T/OXCT/zVq + kf8vZIv/K2GG/ytihv8uaIr/Mm6Q/zh1lf8/epr/Qnyb/0R8nP9CdZj/PG6S/zNliv8qXIT/IlZ//yJX + g/8mXIn/KGCL/ydgiv8tYor/MWSL/zNjjP8vYov/K2KK/yhiif8tZ43/M22R/zp0lv9Aepr/RX+d/0iA + nf9IgJz/SoGc/0yCnP9PhZ//UYeh/1GHof9Sh6H/UYah/1KGov9Sh6P/UYWi/02CoP9IgaH/Qn+f/z59 + nv9Afp//QH6g/z9+n/88fZ3/O3ub/zt3mP89dpj/PnSX/0B2mf9Eepr/RHyb/0R+nf9Fgp7/SIWh/0qG + ov9MhqH/ToWf/1CFnv9Thp//VIWg/1SDov9Qf6H/S3uf/0J0m/83a5T/LWKO/ylejP8pYI3/LmWQ/zVs + k/86cpf/QHeZ/0R6mv9IfJz/SHyc/0d7nP9Hep3/Rnmc/0N1nP8/cZv/O2yY/zdolf80ZpL/MGOO/y9i + i/8uYIj/LV+F/ytcgv8oVX7/IUx5/xpEc/8WQG//F0Fw/xtHdP8hUHr/KFh//y1ehP8wYoj/MmiK/zRs + jP81bo3/NW6N/zVtjv81a47/NWqR/zZrk/80aZP/MGWP/ypfiv8oXoj/Kl+I/y5jjP8yZpD/NWmT/zRp + kv8yZ5D/LmON/ypeiv8kWIX/IFOB/yBPgf8kU4b/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8NHir/G1l+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gkdh/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/GTxX/ypehP8uZIj/L2eL/y5ni/8uZ4z/L2eL/y9niv8uY4j/LmKJ/ypeh/8oW4b/JVeE/yZX + hv8mVob/IlKC/x5Off8eTnv/Hk96/yFTfP8oXIH/MGWI/zZtjf86cpD/PHWT/z52lP8+dpT/P3aU/0B4 + lv9BeZf/QXmV/z96k/89eJL/PHWS/z10k/89dJL/PnWT/z92lP8+dZH/PHOQ/ztyj/86cI//Om+P/zlu + kP83a4//M2aL/y1hiP8pXoX/KV6F/ythhv8vZ4r/NW6P/zhyk/87dZX/P3iX/0J6mf9FfJz/R3yc/0h8 + nf9HfJz/Rnyb/0Z7mv9FfJr/Rn2Z/0h/m/9JgZz/SYGc/0mBm/9IgJr/RX6Y/0R8mP9Ee5n/QXeZ/z5y + mP84bJT/M2aP/zBhi/8vYIn/MWOK/zRmjP84a5H/OGuQ/zdqjv82ao3/NWmM/zVojf80Zo//MmOP/y5f + jf8qW4n/JleG/yNVhP8gU4L/HlCB/yFUhf8iVoj/I1WH/yNUhP8gUoD/H1F9/xxOe/8fUXz/JliE/yxe + if8vYoz/MWSL/zJli/8yZYv/MmaM/zNmjv8yZY7/MWWO/y9jjP8vY4v/MGGL/y5diP8tWob/LFiF/yRS + f/8bS3f/FUVx/xVGcP8eT3j/KVuC/zNmiv83a4//Om2R/zptkv85bZP/OW2W/zZrlf8yZ5L/LWSQ/yxj + jv8sZY//LWmP/zBtkf8zcJP/NnOV/zl3mf87dpr/PHaa/zt1mf88dZj/P3aY/0J2l/9Bdpf/QHWX/z10 + lP87cpL/O3KS/zt0lP87d5b/PHiY/z15l/8/eJf/QXmY/0N6mP9Eepj/RHqY/0R6mv9Eepz/RHmb/0J3 + mf89cpb/NmqR/y9ki/8vZYv/MmiN/zZskP85b5P/O2+U/z1xl/89bpf/OGqT/zFjjf8qXIf/JViE/yNW + gv8jV4L/JlyG/yliif8sZ4z/M26R/zdylP86dJX/O3SV/zt0lf8+dpf/QHeY/0J5mf9Eepr/RXqb/0Z8 + nP9Hfp3/R4Cd/0iAnf9HgJ3/RHub/0B3mP89c5b/N22S/zFnjP8tY4f/LWaI/zBsjP80cpH/O3iX/0F9 + nP9Hf5//SX6f/0Z6nP9Ac5f/OWuR/zBkjf8pX4n/JFuG/yJbhf8kXoj/Jl+I/yhfh/8rXof/K2CG/ylg + iP8mYIn/KWSL/y5pjv8zbpL/OnWX/0J8m/9Gf57/SYKe/0qCnf9LgZz/TIKc/06Env9Rh6H/U4mj/1SI + o/9UiKP/U4ei/1SHpP9ShaP/TYOi/0aCov9EgqP/Q4Gi/0WCov9GgqL/RYOi/0SDof9DgaD/Q36e/0J6 + m/9Adpj/QHaX/z52lv8+eJj/P3uZ/0J+nf9GgqD/SYWj/06GpP9QhqL/UIWf/1KGn/9ShJ//UIKg/06A + oP9He57/PnOZ/zZrlP8xZ5H/LGSP/ytijv8uZZD/M2uT/zpxlv8/dpn/Qnib/0N5m/9FeZv/RXib/0V4 + m/9Ddpv/QHOb/ztumv84apf/NGaT/zBhjv8uYIz/LWCJ/ytehv8tX4b/LF6F/ypZgf8nVH//IE15/xhE + c/8YQ3L/GUZy/yBPef8oWn//LmKF/zNoiv81bIz/Nm2N/zZtjv82bY7/NW2N/zRsjv81bJD/N2yU/zdr + lv8yZ5L/LGGM/yddh/8oXoj/LGKL/zFlj/80aJL/NGmS/zNokv8wZY//LGGM/yZahv8fUYD/Hk5//yBP + gv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMvQv8cWn7/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8VOlH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8fRWL/LmGH/zFkif8yZ4v/MWiM/zBn + jP8vZ4r/L2aJ/y5jiP8rX4X/KFyE/yRYgv8hVIH/Hk99/x5Ofv8aSnr/GEh3/xZGdP8YSHT/IFN7/ylb + gv8xZYn/N26O/zxzkf8+dpP/QHiW/0N6mP9DeZf/RHqX/0R7mf9De5j/QnqV/0B4lP8/dpX/PnWV/z91 + lP9AdpX/QHeU/z91kv8+dZH/PHOP/ztyj/87cZD/Om+R/zhtkf80aI3/LmKJ/ypfhv8oX4X/KmKH/zBp + jf82b5L/OnSW/zx2lv8/d5f/QnmZ/0V8nP9Hfp3/R36d/0h9nP9IfZz/R3yb/0Z8mv9HfZv/SH6b/0mA + nP9Kgp3/S4Oc/0qCm/9IgZn/Rn+Y/0V8mP9DeZj/QHWX/zxulf82Z5D/MmGM/ytbhf8oWIL/K1yF/y9h + if8yZY3/MmWM/zJlif8xZor/MmeL/zJmjf8zZY7/MWKO/y1fjP8sXYr/KVyI/ydbh/8mWoj/JFeH/yRX + h/8kVYX/JVaE/yRVg/8jVIH/IFJ+/x1PfP8cTXv/IlSA/yVXg/8oWoX/KVyG/ytfh/8vY4v/MmaO/zFl + j/8tYYv/K2CJ/ypfiP8rXoj/K1uG/ytZhf8qV4T/J1WC/yFQfP8dS3f/Gklz/xxLc/8mV33/L2CG/zhp + j/88bpP/OmyS/zlrkv82apL/M2iQ/zBlkf8vZZD/LWaQ/y5okf8vapH/MW6R/zRwk/83c5f/OXWZ/zt2 + mv86dJj/PHSY/z50l/9AdJb/QHWX/0B1mP8/dZf/PHKU/zlxkv84cZL/OnSW/zx2l/89eJn/P3iZ/z95 + mf9BeZn/Q3qZ/0J5mv9Bd5r/QXeb/0F3m/9Cd5v/QHWZ/zxwlv82apL/MWWO/y5kjP8xZ47/NWqQ/zlu + kv87b5T/PG6U/zxulf85a5T/MWOO/ypch/8kV4P/IFOA/yNYg/8mXof/KmWL/zBrkP83cZX/OnWX/zx3 + mP8+d5f/P3mY/0F7mP9EfJr/RX2b/0d+nP9Jf57/S4Gf/0yCof9LgqD/S4Og/0qCn/9If53/Q3qa/z50 + l/85b5T/NGmP/zBpjP8vaoz/MW6O/zh1lP8/e5n/RX+d/0mAn/9Lf6D/SXye/0J2mv87cZb/NmyU/zBp + kv8tZo7/KWSM/yZhiP8qY4r/LGKJ/ypghv8lX4P/JGCE/yZhh/8rZov/L2qQ/zRwk/87dpf/Qnyb/0eA + nf9Kg5//S4Oe/0yDnf9OhJ3/UIaf/1KIov9TiaP/VYmk/1WJpP9ViKT/VIik/1GGpP9JgqL/RoKj/0aE + pP9Ihqb/SoWl/0uFpP9MhqP/S4Wj/0uFo/9Kg6L/SICg/0V8nP9Ad5j/PXaW/zp1lf89eZj/QXyd/0WA + oP9Kg6P/TYWl/1CFo/9QhaD/T4Se/06Dnv9MgZ3/R32c/0J4m/87cZb/Nm6V/zNrk/8vaJH/LWWO/y5l + j/8zapP/OXGY/z51mv8/dpr/P3aa/0B1mf9Adpr/QXWa/z9zmf87bpj/N2uY/zRolv8yZZL/L2GO/yxe + if8rXof/LWCH/y9iiP8wY4j/L2CH/yxbhf8oVoH/IlB9/x1LeP8dS3f/IVF6/yhbgP8wZYf/N22N/zpv + kP86bpD/OW6Q/zdsj/82bI7/NWyO/zhukv85bpX/OG2W/zRpk/8uY47/Kl+K/yheiP8sYYv/MGWO/zNo + kf81aZP/NWiT/zNnkv8vZI7/Kl6J/yNUg/8dTH7/Hkt//wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/Ei1B/xpafv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xIvQf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yJIZP8xZYn/NWiM/zZpjf82ao7/NWmN/zNpjP8yaYr/MGaJ/y1ihv8pXoT/JVuD/yJW + gf8eUX7/Gkt6/xdGdv8TQnL/EUBv/xRFcv8eUHn/KFuB/zFlif84bo//PXSS/z92k/9BeJX/Q3mX/0V7 + mP9Fepj/RXqY/0V5l/9DeZf/QneW/0B2lv8/dZX/QHaU/0F3lf9BdpP/QHaS/z92kv89dJD/PXOR/z1y + kf89cZP/Om+T/zZqkP8vZIv/Kl+G/yhehP8rY4j/MGqO/zdxlf87dJf/PnaW/0B3lv9CeZj/RXyb/0Z9 + nP9HfZz/R32c/0h9nP9HfZz/Rnyb/0Z8m/9Ifpz/SH6b/0h/m/9JgZv/SYKa/0iBmf9IgZj/Rn6Y/0R7 + l/9Cd5f/P3CV/zlnkf8xYIv/KlmF/yRUgP8gUX3/JliD/yteiP8uYYr/L2OK/y9liv8zaIz/NGqO/zZq + kP82aJH/NGeQ/zJmjv8wZI3/LmSM/y1ijP8rXov/KFmH/yhYh/8qWof/KluH/yhahv8mWIT/I1WB/x1O + fP8YSXf/HE58/yFTf/8iVYH/JFiD/ypeiP8uYo3/L2ON/yxhi/8oXof/KV+I/ylfh/8qXYf/LFuH/y1a + hv8rWIT/JlWA/yFPe/8fTHf/IE53/yNSev8rW4L/NGSL/zdojv84aZD/N2iP/zJkjf8wZI3/LmKN/y5k + jv8vZ5D/MGqR/zJtkv80b5T/NXCW/zdxl/85c5j/OXKX/zpyl/87cpb/PnKW/0Bzl/9AdZj/QHaZ/z1z + lv86cJP/OW+S/zhxlP85c5b/O3aY/z12mf8/d5r/Qnmb/0N6m/9BeZv/P3ia/z92m/8+dZr/PnWZ/z50 + mf88cZf/Om+X/zVpk/8xZY//LmON/y9kjv8yaJD/NmuR/zhrkP85a5D/OWqS/zZnkP8yZI7/Kl6I/yNY + g/8iWIL/I1qC/ydgh/8tZ4z/NG6T/zp0mP88dpf/PHeX/z95mP9Be5n/RH6a/0Z/m/9IgZz/SoGd/02D + n/9OhaH/ToWi/02Eof9Mg6H/SoKf/0h/nf9Fe5v/QHWa/ztwl/82bZL/Mm2P/zJuj/82c5P/PXmY/0N+ + nf9HgJ//SoGg/0uAoP9IfZ//Q3md/z11mv84cZn/NnGX/zRwlv8yb5P/Mm2R/zJpj/8yaY7/L2iL/ylm + h/8jYYL/J2OG/ytmi/8wa5D/NXGT/zt3lv9BfZr/R4Ge/0uEoP9MhZ//ToWf/06Fn/9Qh6H/U4ii/1SJ + pP9ViqX/Voil/1WIpf9Th6T/TYSj/0eCof9EgaH/SIWk/0uHpv9Piqf/UYqm/1GJpf9Rh6T/UIei/1CG + o/9NhKL/SoGh/0R9nf89eJj/O3eX/zt3l/8+epv/RH2g/0mAov9MgaL/TIKg/0yCnf9LgZz/SYCc/0V9 + m/9BeZn/O3SW/zlylv84cZb/Nm+W/zJrkv8vZ47/LWSM/zNqkP84b5b/PHOZ/zxzmP87cpj/OnKY/zpx + mP87cZj/OW+W/zVrlP80apT/M2mU/zFmkf8wY43/LWCJ/yxgiP8vY4r/MmaL/zRnjP80Z43/M2SM/zBe + if8rWoX/J1aC/yNTf/8lVn//KlyD/zBlif84bY3/PG+R/z5xlP87b5L/OG2Q/zZrkP82bJH/OW2U/ztv + l/84bJX/NGiT/y5jjv8qXor/KF2I/ypgiv8wZo//M2mS/zVpk/82aZT/NWmU/zFmkP8tX4z/JlaF/yBM + f/8dSn3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8QLD//HFl9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8bWX7/ES5B/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/MGSJ/zRojP83a43/OWyP/ztt + j/87bY//OGyO/zZrjP80aor/MWiJ/y1liP8qYYf/KV+G/yVZg/8fUX7/GEh3/xJBcf8SQG//FURx/xtM + d/8mWID/MGSJ/zhtkP89c5P/P3aT/0B4lP9CepT/Q3qV/0V6l/9FeZf/RHiY/0N4mP9Cd5b/QXeW/0B2 + lf9Bd5T/QHWS/0F2kv9BdpH/QXaR/0B1kf9AdJL/QHSU/z9zlP88cZT/N2yQ/zBmjP8qX4f/KF6F/ypi + if8wapD/N3GU/zx0lv8/d5b/QnmX/0R6mP9FfJv/R32c/0h+nP9Jfpz/SX6d/0h9nP9HfZz/R3yc/0Z7 + m/9Ge5r/RnyZ/0V8mf9Ffpj/R3+X/0d/l/9Hfpf/RXyX/0V5mP9Bc5b/O2uR/zJgi/8pWIT/IlOA/x9Q + fv8gU4D/JlqG/ytfif8tYoz/MGSN/zRpj/84bpL/O2+U/ztulP85bZT/OW2T/zRqj/8yaY3/MmiO/y5h + i/8rXIn/LFyI/y9gi/8wYoz/MGKM/y5gi/8nWYb/IlOB/xxNfP8aS3v/HU5//yBSgf8kV4X/JVmF/ype + if8rYIr/K2GK/ythiv8qYor/LGOL/y1jiv8vYov/MF+K/y9dif8tWob/J1WB/yFOef8hTnn/I1B7/ylX + gf8tW4X/MGCJ/zJii/8yYoz/MWKL/y5hi/8uY43/LmSO/zBokP8zbJL/NG+U/zVwlv81cJf/N3CY/zlx + lv85cZb/O3GW/z1yl/8/dJf/QHWY/0F2mv8+dJf/O3CV/zlukv83b5P/OHGV/zlyl/87cpf/PHSY/z51 + mf9Bd5r/QXib/z93m/87dZr/O3Sa/zpzmf87c5n/OnCX/zhvlv82a5T/M2eS/y5jjv8sYo3/LWKN/y9l + j/8wZ47/MmeN/zRnjf80Zo3/M2WN/zBjjP8rX4n/KF2G/ydfhf8pYIX/KWKH/y9ojv82b5T/OXOW/zp1 + l/88dpf/PniY/0J8mf9Ffpr/SIGc/0qDnP9MhJ3/ToWf/1CHof9Qh6L/T4ei/02Eof9LgqD/SYCe/0d8 + nf9Cd5z/O3KY/zVwk/8zcJH/NnOS/zt3l/9BfJv/RoCf/0uBof9MgaL/SoCh/0Z8n/9Cep7/PXec/zt2 + m/85dpr/Onib/z15m/89d5r/PXWY/zp0lf84dJP/Mm+P/y9qi/8qZYj/LWaK/zJrkP82cZP/O3eX/0B8 + mv9GgJ3/S4Wh/0+Iov9QiKL/UYii/1KIov9TiaP/VYqk/1WKpf9ViaT/U4ek/0+Fo/9JgqH/RYGg/0aC + of9JhKP/TIel/1GKp/9Vjaj/Voym/1WKpP9ViaT/VYij/1OHo/9PhqT/SYKi/0N/n/8/e5v/PXma/z54 + mv9Dep3/R3yf/0h+n/9Hfp3/Rn6b/0V+mv9DfJr/QHqY/zx2lv85dJT/O3WX/zx1mP86c5j/N2+U/zNq + kP8xaI3/MWiM/zZtkv83bpX/N26V/zdvlf82b5b/N3CV/zhvlv83b5T/NW2T/zVslP80bJT/NGqT/zFn + jv8vY4r/MGSL/zNnjP82ao//OWyQ/zlskf84a5H/NWeP/zFijP8sXYj/J1iF/ydZg/8qXIX/MGOJ/zdq + jf88bpH/Pm+U/z1wlP87bZT/N2uR/zZqkf83a5T/N2qU/zdqlf8zZpH/LWCN/yhbiP8lWoX/KFyH/yth + iv8wZo//MmiR/zNokv8zZ5L/NGeT/y9fjv8pVYj/Ik2B/x9Mff8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xErQP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8KGyj/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8yaIz/N22P/zpvkP88cZL/PnKS/z5xkf89b5D/O26P/zlujv82bY7/M2uN/zBo + i/8vZov/LmOL/ydbhf8gUH7/GEd3/xRDcv8XRXP/HUx4/yZWgP8wYon/OGuQ/z1xkv9AdZT/QXeU/0J6 + lP9De5X/RnyX/0V6mP9DeJn/QXaa/0F2mP9Cd5b/QniV/0B2k/9AdpL/QXaR/0N4k/9Cd5L/QneS/0F0 + kv9BdJT/QHSV/z5ylP85bpH/MGaM/ylfhv8oXof/K2KL/zJpkP85cZT/P3aW/0F4l/9Depj/RXya/0d9 + mv9Ifpz/SoCd/0qAnf9Kf53/Sn+d/0l+nv9IfZ3/R3yc/0R5mv9DeZj/QnmY/0J6lv9FfZf/Rn6X/0d+ + l/9IfJj/R3qZ/0N2l/87bZL/M2OM/ypZhf8hUH//H09//yBSgf8lWYj/KmCN/zBkj/8zaJH/OGyU/zxx + lv8+dJf/P3OX/z9yl/88cJT/OG6Q/zRsjP8yZ4z/MGKL/y1eif8uYIn/MWOM/zZpkf83a5P/NGeR/y5g + jf8nWIf/IVKC/x9PgP8fUIL/JFWG/ydaif8oW4n/J1uG/yhehv8rYYn/LGOL/y9mjf8vZo3/MWeN/zJm + jf8zY43/MmGN/zFfi/8sWof/J1OB/yFNev8hTnv/I1F9/ydVgf8pV4T/LFyI/y9fif8vX4r/MGOO/zFm + j/8xZ5D/MmuR/zNsk/80b5T/NG+W/zZxmP83cJj/OHGX/ztyl/88c5f/PnSX/z92mf9Bd5n/QHaZ/zxz + lv85b5X/Nm6T/zVuk/80bZT/NW2U/zhulf85b5X/O3CW/z1ymP88c5n/OnOY/zlzmf85cpn/OHGX/zdv + lv82bJT/NGqT/zFmkP8tYYz/Kl6K/yldif8pX4r/LGKL/ytjiv8sZIn/L2WK/zBkiv8zZo7/MmaO/y5k + jf8vZYz/MWiM/zFoi/8waIv/MWqO/zRskf83cJT/OHOV/zt2l/8/eZj/QnuZ/0Z/m/9Jgpv/S4Sc/0yF + nf9Ohp//UIih/1KKo/9RiaP/T4ei/02Eof9Ng6H/S4Gf/0V6nf88dJf/NXKT/zRykv84dZX/PnmY/0N+ + nP9IgZ//S4Kh/02CpP9KgKL/RX2f/z97nf89epz/PHqc/zx7nf8/fJ3/Qn2e/0Z+oP9EfZ3/QXub/z98 + mv89eJj/OHKU/zRskP8yaY7/MmmQ/zVukv86dJb/P3uY/0R/nP9KhKD/Toei/1KLpf9SiqT/U4qk/1SK + pP9UiqX/VYmk/1SIpP9QhqP/S4Si/0eBoP9HgZ//SIOg/0yGov9PiaT/U4ym/1aNp/9Yjqb/WI2m/1iL + pf9YiqX/WIml/1SIpf9PhqT/SYOi/0SAoP9BfJz/QHeZ/0F3mv9CeJv/QXma/0J5mf9BeZj/QHqY/0B7 + mf8+eZj/PHeW/z55mP8/epr/QXuc/0B5m/8+dpj/OXCU/zVskP8zao7/MWiN/zNqj/80a5P/NGyU/zZu + lf84cJX/O3OU/zpzlP85cpT/OHGV/zhxlv84cJX/NmyS/zNojv8zaIz/NWqM/zhsj/88cJP/PHCT/zxv + k/85bpP/N2mS/zFkjf8rXon/J1qE/yhbg/8uYYf/NmeL/zpqj/87bJL/PG2U/zprk/82aJL/NGeP/zJl + j/8yZI//MWSP/zBij/8qXIr/JVeF/yFUgf8hVYH/JFqE/ylfiP8sY4z/LmSO/y9kjv8xYZD/MF2P/yxW + i/8kT4L/H0x9/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ECw//xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/wcWH/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BQ0R/zVuj/87cpL/PnWU/0B2 + lf9Cd5X/Q3eV/0F0lP8/cZL/PXCS/zxwk/85bpL/Nm2Q/zVrj/8yZ43/L2SL/ypdh/8iUX7/HEp4/xlI + df8dTHj/JlaB/y9gif84apH/PXCT/z9zlP9BdZT/Q3mW/0V7lv9HfZj/RHqa/0F3m/9Bdpr/QHWY/0B2 + lv9Bd5T/QHeS/0B2kf9CeJL/RXqU/0Z6lP9FeJT/Q3aT/0Fzk/8/cpP/PHCT/zhskf8xZoz/LGGJ/yle + iP8rYYr/NGuQ/zx0lf9BeZf/Q3qY/0R7mf9HfZr/SH+b/0qAnP9LgZ3/TIKe/0yCnv9MgZ7/S4Ce/0l+ + nv9HfJ3/RXqc/0J3mf8/dpf/QXeX/0N6mP9GfJj/R3yZ/0l8nP9Hepv/QXOV/zttkf8zZIz/KlqF/yJT + gP8eTn7/H1KC/yRZiP8rYY//MmmV/zdtlv86cJj/QHWa/0N3mv9Cd5r/QXSY/z9xlv88b5P/OGuP/zRn + jf8xY4v/MGGJ/zBjif8yZYv/NWmP/zlulP85bpX/M2eQ/ytei/8kVYf/IVGE/yRUhv8oWov/LmCQ/yxf + jP8qXon/J12F/yhfhv8sY4r/LmeM/zFpjf8yaI3/M2eO/zJlj/8yY5D/M2KO/zBejP8qV4b/JVCA/yBL + ev8eSnn/IE17/yRSgf8pWof/LV6L/zFjjf80Z5H/NmqT/zZtlP81bpT/M22U/zBrkv8xbJP/Mm2V/zZv + lv84cZj/O3OY/z10mf8+dZn/P3aZ/0B4mv8+d5j/O3SW/zZvk/8zbJH/MmuR/zJqkf8zaZH/M2iR/zVp + kv81a5L/NW2S/zVvlP81b5X/Nm+W/zZvlv82bpX/NGuT/zJpkf8wZo//LWGM/yldiP8lWob/JFqF/yVb + hf8oYIj/KmOJ/ylkiP8rZYf/MGiL/zRrj/82bJP/N22S/zlvkf86cZH/OXGR/zZukP81bZD/NGyQ/zRt + kf82cJP/OXOV/z13l/9De5n/R3+b/0mBnP9LhJz/TYad/0+Hnv9RiaH/Uoqh/1KKov9RiKL/T4Wg/06E + oP9PhaH/R32c/z52lv83c5P/NnSU/zt3l/9Aepn/RX+d/0mAn/9LgaH/TYGj/0iAov9CfZ//PXuc/z58 + nf8+fZ7/QH6e/0SAn/9HgKD/SYKh/0iCoP9HgZ7/RoCe/0R9nP9BeJv/PHGW/zhskv81apL/M2qS/zdw + lf88d5f/QX2a/0aBnf9MhaH/UIml/1GKpf9SiqX/VIql/1OIpP9TiKT/Uoek/02Fo/9Jg6H/SYKh/0iC + n/9LhKD/T4ii/1OMpP9VjaX/WI6m/1mOpv9ajqb/W42m/1qMpv9ai6f/WIqn/1SHpv9QhqX/S4Ki/0V9 + nv9CeZv/QHWZ/z51mf88dZj/PHSW/zt0lf89eJf/Pnqa/z15mf9Ae5r/QXyb/0R/nv9HgaD/SIGh/0V9 + nv8/dpj/OnGT/zdukP8zao//MmmP/zNqkf81bZP/OHCV/zx0lP8/dpX/P3eW/z12lv88dZf/PHWY/zx1 + mf86cZX/N26S/zZsj/83bI//OW6R/zxxk/8+c5T/PXKU/ztwlP85bJT/NmmT/zBjjv8qXYf/KVuE/yxd + g/8zY4f/NWWL/zZmjf82Z4//NGaP/zFljv8vY43/LmGM/yxfi/8tX4z/K1yL/yhYiP8hUoL/Hk9+/xxP + ff8dUn3/IVeB/yZchv8oXoj/KF2I/ypaif8sV4v/KFOH/yJNgP8bRHP/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8QLD7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/CRcg/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8MGiL/N3CR/z13lf8/eZb/QXqV/0R7l/9GfJj/RHqW/0N3lv9CdJj/QHKY/z1x + lf86cJL/N22R/zVqkP8zZ4//L2KM/ytch/8kUn//Hk16/x9Oev8lVID/L1+J/zhpkf89cJX/QHOW/0F1 + lv9DeJf/RnuY/0V7mf9DeZv/QHab/z50mP8+dJb/P3WU/z91k/8+dpL/QHiS/0J6k/9Fe5X/R3qW/0h6 + lv9Gd5X/QnST/z5xkv86bZH/NWmP/zJmjf8uY4v/LGCL/y9ljP82bZH/PneW/0F5mP9Ee5j/RXyZ/0d9 + mv9Jf5z/TIKd/02Dnv9OhJ//TYOf/02Cnv9MgZ7/S4Ce/0uAn/9HfJ3/Q3ib/0B1mP9AdJj/QneZ/0N4 + mv9EeJz/Rnie/0R2mf8+cJP/N2mN/zFhif8qWoX/I1OB/x9QgP8fUYH/I1eH/ypgjv8waJT/N3CZ/zx0 + m/9Ad5v/Q3mb/0V6m/9Bdpj/QHOX/z9xlf88bZH/N2mO/zNmjP8xY4r/MWWI/zFmif8zaYz/NmyQ/zht + k/81a5P/LGGN/yVYh/8jVIX/JVeH/ylbi/8uYY//MWWQ/y9kjP8rYIf/KmGG/ylghv8tZYv/L2eM/zBn + jP8wZYz/MWWO/zFjj/8xYpH/L16N/ytYif8mUYP/IEp9/xtGeP8cR3j/IU5//ydWhf8uX4z/NGeR/zZr + lP85bpb/OnGX/zhxl/8zbZT/L2mR/ypljP8tZ47/MmuS/zdwlv88dJn/PHWY/z11mP8+dpn/PXeZ/zx4 + mP85dpb/NHGT/zFtkf8vaI//L2aP/zBljv8vY47/L2ON/zFojv8xa5D/MWyR/zJtkv8zbZP/NG6U/zRs + k/8zapH/MWeQ/y9kjv8sYIv/J1yH/yNZhP8hV4L/JFyE/yhhiP8rZIr/LmiL/y9ri/8zb43/OXST/zx1 + lv8+dpb/QXmV/z92lP89dJP/PHOT/zpyk/82b5H/NW6R/zRtkf84cZT/PXWW/0N7mf9Gfpv/SH+c/0uC + nP9OhZ3/UIif/1KKoP9SiqD/U4mg/1KIof9QhaH/TYKg/0uAnv9He5r/P3WV/zpzk/85dJT/PHeX/0J8 + mv9Hfp3/Sn+g/0t/of9Jf6H/RH6g/z58nf8/fZ3/P36d/0F/nv9EgKD/SIKh/0uDof9MhaL/TISh/0yE + of9NhKH/S4Cg/0d7nf9CdJr/PG+W/zdrk/80a5L/NG2U/zhyl/89eJn/Qnyb/0iBnv9MhKH/T4ej/1GI + pf9Rh6X/UYak/1GGo/9NhaL/SoOi/0mDov9LhKH/TIWh/0+Gof9TiqP/Vo2k/1mPpv9aj6b/Wo6m/1uN + pv9bjaf/XI2o/1yMqf9biqj/WIin/1aGpv9Qg6T/SX6g/0N4m/8+dZr/O3OY/zlxlv82b5P/OHKU/zx3 + mP8/epv/QX2c/0N+nf9GgZ//SIKg/0yEov9OhqX/TYOi/0d9nv9BeJn/O3GU/zZtkv81bJH/NWyT/zdu + lP87cpX/P3eV/0J6l/9EfJj/QnqY/z94mf8/eJr/Pnib/zx1mf86cpX/OG+S/zhukf85bpH/O3CT/zxx + k/89c5T/PHGU/ztvlP84bJT/NWiT/zBjjf8tX4b/Ll+E/yxeg/8vYIb/MGGJ/zBiiv8uYov/K2GL/ypg + if8qX4n/Kl+K/ypei/8qXIv/KFmJ/yJShP8aSXz/GUp7/xtNe/8eU37/IliC/yVZhf8lVoX/JFGD/yRQ + gv8jToD/Hkp7/xM0Wv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xArP/8bWX7/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/x1afv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwaI/83cpH/PHeU/z97 + lf9BfZb/RH6W/0V/l/9Hfpr/Rnua/0V4m/9Ddpn/QHWW/z5yk/87cJL/N2yQ/zRpkP8zZo//L2CK/yhZ + hP8iUn7/IFB8/yVWgf8uX4j/NmiQ/zxvlf8/cpf/QXSX/0R4l/9EeZn/Q3mc/0B2nf8+dJj/PHKV/zxy + k/8+dJP/PnSS/z92kv9BeJP/Q3qU/0R8lf9Ge5b/R3qX/0d4l/9DdJX/PW+S/zlrkP80Zo7/MWSM/y5i + i/8uZIz/MmmP/zlxkv8+dpb/QnmX/0R7l/9GfZj/R32Z/0l/m/9Mgp3/T4Sf/06En/9Og5//TYKe/02C + nv9MgZ//S4Gf/0qAn/9Ge53/QXWa/z9zmf8+cpn/PnOb/0B0nf9AdJz/PnGY/zpskf81Z4z/LmCH/yla + hP8lVIH/IlGC/yFRgv8jV4f/KF2M/y5mkP81bZb/O3Sa/z94m/9Cepv/QnmZ/0F3l/9AdZb/QnKV/z9v + kv86ao//NGeM/zJmiv8xZoj/MWeI/zNpiv80a43/NWuR/zJokP8sYYz/JVmG/yNWhf8lV4f/KVyK/y1h + jf8wZo//MmiO/y9mi/8tZIn/LGSK/y1liv8uZov/L2aL/zBki/8uY4v/LmGN/y5gjf8tXYv/KViH/yRQ + gf8dSHr/GEJ2/xlFeP8fTX3/JlWF/y5fjP81Z5L/Om2V/zpwl/87cpn/OnKZ/zVvmP8vaZH/KmOL/yhh + iP8uZo3/Nm2T/zpxl/87dJj/PHWY/zt2mf88d5n/OneZ/zd1l/8zcpP/MG6Q/y9pj/8uZI7/LmOO/y5i + jv8uZI3/L2eN/zBskP8xbZH/MW2R/zJskf81bpP/NW2S/zRrkf8zaZH/L2WO/y1ii/8oXYf/JFmE/yJZ + gv8kXIT/KGGI/y9pjf8zbZD/NnKS/zt2lf8+epf/Q3qZ/0Z8mv9FfJj/Q3qW/0F4lf8/d5X/PXWV/zpz + lP83cJH/Nm+R/zhwk/89dZf/QnmZ/0V7mv9Ifpz/SoGd/02Env9QiKD/Uomg/1OJn/9TiaD/Uoei/1GF + ov9NgaD/Sn+e/0R5mv8/c5X/O2+S/zpxlP8/dpf/RHyb/0l/nv9LfqH/SX2h/0R9nv8/fJz/P32d/0B/ + nv9CgZ//RYOf/0mEof9MhaH/T4ej/1GIpP9Sh6P/Uoij/1GGo/9Pg6L/TH6f/0Z4nP8/cpj/OW2U/zZs + k/80bpT/NXGX/zl1mf89eZv/Q32d/0iAn/9Mg6H/T4Wj/0+Eo/9Og6L/TIOi/0qCof9IgqH/SYOg/0yF + of9Ph6L/U4qk/1eNpf9Zj6b/XJGn/1yPpv9bjqb/W42l/1yNqP9cjaj/XI2p/1uLqP9ZiKf/Voan/1SE + pf9Mf6L/RHid/z10mv83cJf/NG2T/zNskv83cpb/PHib/0F8nf9Dfp7/RoGf/0mDof9MhaH/T4ej/06G + o/9PhaP/ToWj/0d+nf9Bd5n/O3KW/zhvlf84b5X/OXGW/zx0l/9AeZj/RX6Z/0d/mv9FfZf/QnuY/0F6 + mv9Bepz/P3ib/zx0mP84cJP/N26R/zhukP86cJL/O3KT/zxzlP88cpT/PHGV/zpulf84apT/NWeQ/zBi + iv8tX4b/K12E/ypchP8sX4f/LGCI/ypgiP8qYYj/KWGJ/yhhiP8rYov/LGKM/y1hjf8sXo3/J1eI/x9P + gf8YSHr/G0p7/x9RgP8iVoL/IlWC/yJSgv8iT4D/IE1+/x1Lev8dSXr/EzVZ/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Dyo+/xtYff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HFp+/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Eig1/zdykf88d5X/P3uV/0J/lv9EgZf/RoCZ/0Z+m/9HfJ3/Rnqc/0V4 + mf9Dd5b/QXaT/z50kv87cJH/OGuR/zVokP8wYYr/KVqE/yNTf/8hUn3/JFaA/yxfh/80aI//Om6U/z1x + lf8+cpX/PnOV/z90l/8/dJv/PHKY/zpwlP84bpH/PHKT/z50k/8/dZL/QHaT/0F4lP9DepX/RHyW/0N7 + lf9FeZb/RXeW/0N0lf8/cJT/OWuR/zNljf8uYIr/LGCJ/y9ljP8za4//OHGS/z11lf9AeJf/Q3qX/0R7 + l/9Ifpn/SoCb/02Dnf9PhJ7/T4Sf/0+En/9Og5//TIGe/0yBnv9LgZ//SoCf/0Z8m/9Bd5n/PnOY/ztw + mf84cJn/OXCa/zpwmf86b5f/OWyU/zRnjf8wYon/LV6H/ylZhf8lVIT/I1OE/yRWhv8nW4n/LGKN/zJq + kv84cJb/PXaY/0B6mf9BeZj/QXiX/0R3l/9FdZf/QnGU/zprkP80Z43/MWaL/zBmiP8yaIj/MmqK/zRs + jf8za4//MWeO/yxii/8nW4f/IlWD/yNVhP8pXIj/L2OM/zJnjv8yaY7/MWmO/zBoj/8waI//MGiO/zBm + jf8wZYz/L2OK/y5iif8sYIn/LF+K/ytdiP8oWIP/I1B9/xtHd/8XQnX/F0R2/xtJe/8mVoP/LmCL/zVo + kP85bZP/O3CX/ztxmf86cZv/Nm2Y/zBokf8qYor/KGCH/ytiiv8xaI//Nm+U/zhyl/86dJj/OnWY/zl2 + mf85dpn/NnWX/zJyk/8wb5H/L2uQ/zBokP8wZpD/L2WP/y9oj/8xbI//Mm+Q/zRwkf81cJL/NnGT/zhx + lP84cJT/OG+V/zdslP80aZP/MWaP/yxhi/8oXof/JV2F/yZfhv8rZYv/MWyQ/zdylP88eJf/QHuZ/0R8 + mv9Ifp3/S3+d/0l/nP9HfZn/RXuX/0N7mP9AeZj/PHWV/zlyk/83cJL/OXGT/zxylv9AdZj/Q3mb/0Z8 + nP9Jf57/TYSg/1CGoP9Rh6D/U4ig/1OHof9UiKP/UoWk/02Bof9IfZ7/QneZ/zxwlP84bZL/OW6U/z10 + l/9DeZv/SH2f/01/ov9HfJ//QHqb/zx7m/89fZz/QYCf/0WDoP9JhqH/TYej/1GIpP9Viqb/V4um/1aK + pf9XiqX/VYij/1ODov9PgKD/Snud/0R1mv88cJb/N22T/zRulP81cZf/N3Wa/zl3nP8+ep3/Q32d/0h/ + n/9MgqD/TIKh/0uCof9IgaD/R4Gg/0mCof9KhKH/TYWh/1KJo/9WjKX/WY+m/1uRqP9dkKf/XY+m/1yN + pf9djqb/XI2n/12NqP9bjKn/Woqo/1mIqP9Whaf/U4Om/0x+ov9Bd53/O3OZ/zVulf8vaZD/M22T/zl0 + mf8+eZ3/Qn2e/0V/n/9IgqD/S4Sh/06Gof9PhqH/ToWh/06Eof9OhKP/TIKi/0Z8nv9Adpr/O3OX/zhw + lv84cZf/PHWZ/0F6m/9Gf53/R3+b/0V9l/9De5T/RH2Y/0N8nP9Ce53/Pnaa/zlylf81bpH/NW6Q/zdv + kf86cZL/PHOU/zxzlP89c5X/PHGW/zptlf83aZH/MmSM/yxeh/8pWoT/KFuE/ypfiP8sYor/LGOL/ypj + i/8qZYr/LWeM/y5njf8vZ47/MGeQ/y9jj/8rXY3/JFaH/yBQg/8fTYD/IVCC/yRWhf8kVoX/JFOC/yNT + gf8iUX//IE99/x9NfP8WOFv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NKT3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8gXYH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8YNkf/N3OS/zx4 + lf8/fJf/Qn+X/0SAmf9GgZn/R36c/0d8nP9He5z/R3yb/0Z7mP9EeZb/QniT/z1zkP87bpD/N2mO/zBi + iv8pW4T/I1V+/yBSfP8jVn//K1+H/zJnjv83bZH/OW6S/zltkf84bZL/OG2V/zhtlf83bJP/NWqP/zlu + kP89cpL/P3WU/0B2lP9Bd5T/QnmV/0R7lv9Ee5b/RHuW/0J3lP9CdJX/QXOW/z5vlP84aZD/MWKL/yxd + h/8rYIj/LmWL/zFqjv84cZP/PnaW/0F4mP9DeZj/RnyY/0d9mf9LgJv/ToOd/1CFn/9QhZ//ToOf/02C + nv9Ngp7/TIKe/0uAn/9Jfp3/RXua/0B2lv8+c5f/OnCZ/zZvmP8zbpb/NG6V/zZvlf84bpT/N2yS/zRo + jv8yZIz/L2CL/yxbiv8pV4j/JVSF/ydYh/8qXon/MGeP/zVtk/86c5X/PniY/0J7mf9Gepn/SXiZ/0l1 + mf9BcZb/OWuR/zNnjv8uZYz/L2aM/zFpjP8za4z/NGyO/zRskP8yaZD/LmWO/ypfiv8kV4T/I1aD/yhb + hv8tYYn/M2iN/zRrj/8za5D/M2uS/zRslP82bJP/NWqQ/zRojv8yZoz/L2OK/y1hiP8rX4f/Kl2F/yhZ + gv8jUXv/HUp2/xdEc/8VQnL/G0p6/yNUgP8sYIj/M2iO/zZskf85b5X/OXCZ/zlwmv83bZj/MWeS/ytg + iv8oXYf/KV6H/y5kjP8ya5H/NnCV/zZzlf83dJb/N3WY/zd1mP82dJf/NHKV/zJvk/8xbZL/M2yT/zRr + lP80bJP/M26Q/zRxkf82c5P/OHSU/zp1lf89dpf/PnaY/z50mP8+dJn/PXKY/zpvlv83bJT/MmeQ/y1i + i/8qYYn/KmKK/y5njv8ybZH/OXSW/z55mP9DfJr/R32b/0p9nP9MgJ3/TYKe/0yBnP9KgZv/SH+b/0N8 + mv8/eJj/O3SV/zlwk/85cJP/O3GV/z5zmP9AdZn/Q3mb/0h9nv9LgJ//TYOg/1CEoP9RhaD/UoWh/1KF + o/9QhKT/TICi/0Z7nv89c5f/OG2S/zRpkf81a5L/OnCW/z91mv9FeZ3/Rnqe/0N8nf8+epr/Pnyb/0B/ + nv9EgqD/SYai/0+JpP9SiqT/VYql/1iNp/9Zjab/WYyl/1mLpP9XiKP/VoWj/1OCof9Ofp//Rneb/z9y + mP85b5X/Nm+V/zVyl/83dZn/OHWb/zl2nP89eZz/RH2f/0d/of9JgaH/R4Gg/0eBoP9HgaD/SYKh/0yF + ov9Qh6P/VIuj/1eNpf9bkKf/XJCo/1yPp/9cjqX/XI2m/12Op/9djqn/XIyp/1uLqf9Zian/V4eo/1WE + pv9QgaX/Rnug/z93nP86cpr/NG2V/zNtlP81cJb/O3ac/z55nf9CfJ7/RoCf/0qDoP9NhaD/T4Wf/06E + n/9OhJ//T4Sh/0+Eo/9NgqP/SX+h/0N6nv8+dpv/OnKZ/zdxl/86dJn/QXqc/0V9nv9Hf53/Rn2Y/0d9 + lv9If5j/SH+b/0R9nP9BeZr/PHSX/zdvk/80bZD/NW6Q/zhxkv87dJT/PHWU/z11lf89cZf/PG+X/zpr + lP8zZI3/K12I/ydYhf8nWob/Kl2J/yxjjf8vaY//LmmP/y9rj/8xbJD/M26R/zRukv80bJL/M2iR/y5i + jv8qXIv/JFaH/yNThf8lVob/KFqJ/yldiv8oW4j/J1mF/yhYhf8oWIX/JlaD/xk9Yf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xU9W/8aWHz/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpQb/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xs4Sf86dpb/PXmX/0B8mP9Cfpn/RoCa/0d/m/9Hf5v/R32b/0Z9 + mv9GfZn/R32a/0Z8l/9EeZX/QHWS/zxvj/83aY7/MGOJ/yhcg/8hVXz/IFR7/yJXfv8qXYb/L2SK/zJp + jf8zao7/MmiO/zFnjv8wZpD/MWaO/zBljP8zaIz/OG6Q/z50k/9AdpX/QXeV/0J4lf9DeZb/RHqX/0Z8 + mP9Ge5j/Q3iX/0F0lf8/cZT/O2yS/zVljf8tXYf/KVuF/yhehv8qY4n/MmuP/zlxk/8+dpf/QXmZ/0R7 + mv9GfJn/SH6a/0qAm/9Mgpz/T4Se/0+En/9Og5//TYKe/0yCnv9LgZ//SoCe/0d9nP9DeZn/QHWX/z1y + mP86b5n/NW6X/zJtlP8ybZP/NnGV/zpzlv87cpX/Om+U/zhskv83aZH/NGSQ/y5cjP8oV4f/JVSE/yla + iP8sYor/M2mQ/zhxlP88dpb/QnmX/0t5mf9NeJr/SHSZ/z9vlv84a5P/MmeP/y9ljv8vaJD/M22T/zVu + kv82bpL/Nm6T/zVsk/8zaZL/L2SO/ytfif8oXIb/KFuE/y1hh/8wZov/NGuQ/zVuk/82b5X/OHCX/zxx + mP88cZf/OW2S/zZqj/8zaIv/MGWK/y5ih/8tYIb/KlyD/yZVff8fTXf/GEZz/xZEcv8bSXj/IVJ9/yhc + g/8vZIn/NGqP/zZrlP83bZf/OW6a/zlumf80Z5P/LWCL/yZahP8lW4P/KWCI/y5njf8ybZP/M3CU/zRy + lf81dJf/NHOW/zVzl/80cZb/NHCV/zVwlv83b5b/OnGX/zxzlv86dJT/OXWU/zx5l/8+epj/P3mY/0J7 + mv9Depr/Q3mb/0R4nP9Cdpr/P3SZ/ztwl/83bJT/MWeQ/y1kjf8sZI3/LmiP/zNuk/85dJb/QHmY/0d8 + mv9LfZr/S36a/0t/m/9Ngpz/UIaf/0+Fnv9Lgp3/R36b/0J7mv8/eJf/O3SW/zlwk/84bpL/Om+V/zxx + l/9AdJr/RHic/0d8nv9LfqD/TYCf/06Cn/9OgZ//ToKg/0yBof9JfqD/QXeb/zlwlv8yaZH/L2WO/zBn + j/80a5L/OnGX/z51mf8/eJr/PXiY/z57mv8/fZz/QoGg/0iGo/9OiqX/Uoym/1WMpv9XjKb/Wo2m/1uO + pv9cjaT/Woqj/1iIov9XhqP/VYSj/1CAof9Iepz/QHOY/zxxlv85cZb/N3OX/zZyl/83c5n/N3Sa/zl2 + nP8+eZ7/Q3yg/0N9n/9FgKD/RoCg/0mCof9LhKL/Toaj/1KJpP9Vi6X/WY6m/1uQp/9cj6f/W46m/1uN + pf9bjab/XY6o/1yOqf9cjar/Woqp/1iIqP9Vhaf/UIKl/0t/o/9Fe6H/P3ie/zt0nP84cZn/NXGX/zdz + mf87dpv/Pnea/0F6m/9IgJ7/TYSg/1CHof9PhJ7/ToOd/02Dnv9PhKH/UIWk/06Dpf9KgKL/Rnyf/0J6 + nv8+dpz/OnSa/zt0mv8/eJz/Q3ue/0Z9nf9Hfpv/SH6Z/0qAmf9JgJv/SICb/0N7mv8+dZj/OXGV/zZv + kv82bpH/OHCS/zp0lP88dpb/PXSW/z1ymP88bpn/OGmV/zJjj/8rXIr/J1mH/yVZh/8oXYr/LGSO/zBp + kP8zb5L/M3CS/zRxk/82cpT/OHOW/zhvlP81a5L/MmaP/y1fjP8oWon/JVmI/yhciv8qYo3/LWOO/y1i + jP8tYYr/LmKL/zBijf8uYIv/H0Nm/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Ez1a/xpY + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/GUhi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HjtM/z54 + mf8/epr/QHya/0N/m/9GgJv/SH+b/0d+mv9GfZr/Rn2Z/0Z9mf9HfZj/R32Y/0V5lv9BdJP/PW+R/zlp + jv8xYon/KFqB/yBUe/8dU3j/IVh9/yddg/8sYYf/L2WK/y5liv8sY4j/KWCH/ytiif8sYor/LGOJ/zJo + jP85cJD/PnSU/0F3lv9CeJf/QniW/0J4lf9EeZf/RnuY/0h8mv9FeJj/QnSW/z1uk/84aZD/MWGK/ypd + hv8kWoL/IlqC/yliiP8xao7/OXGU/zx0l/9AeJn/RHub/0h/nP9Jf5z/SoCc/0yCnf9Ngp7/ToOf/06D + nv9Ng5//TYOf/0uAn/9Ifpz/Rnya/0J4mP8/dJj/PHGY/zhwl/80bpb/M2+V/zZyl/86dpn/PXia/z95 + m/9Adpj/PnOW/zxwlf85apP/MmGO/ytZh/8nVoT/J1iF/ytdiP8zZ47/OG+S/zx0lP9DdZX/SXaX/0t1 + mP9Gcpf/Pm2U/zZpkv8wZpD/MWiS/zRslf83b5j/N3CX/zhwlv85cZb/OXCW/zhul/81aZP/MGSO/yxf + if8rXob/LGCH/y9liv8yaJD/NG2T/zhxl/87c5j/PnSZ/z90mf9AdZf/O3GS/zdtjv8zaov/M2mL/zJl + if8vYYf/LVuE/yVSff8cSXb/GER1/xhEdv8eTXv/JFd//ytehf8wZIz/M2eS/zVplf84a5f/N2qW/zRm + kv8tX4r/J1qF/yRYgv8jWYL/KWKJ/y1qkP8xb5T/M3KW/zRzlv80dJf/M3KV/zRxlf82cZb/OHGY/ztz + mP8+dZj/QniZ/0F5mf9AeZj/QXyZ/0J8mf9DfJr/RX2a/0d9m/9HfJz/R3uc/0R4m/9Bdpr/PnOY/zpw + lv81a5P/MGeQ/y5njv8vaZD/M26T/zpzlf9DeZj/TH6b/02Am/9Mf5r/TH+a/06CnP9PhZ7/UYee/02D + nP9Jfpv/RXyb/0F7m/8+d5j/OnKW/zduk/80apH/NmuS/zlulf8/c5r/RHee/0d6nv9JfZ3/S36d/0x/ + nf9MgJ//SX+f/0N6nP88dJj/NW6U/y9pkf8sZo//LGSM/zBokP81bpP/OnOW/zt2lf8+epf/QH2a/0GA + nf9FhKH/S4mk/1KNpv9Ujqj/V46o/1qOp/9cj6f/XI6l/1yNpP9aiqH/WYii/1iHo/9WhaT/UICh/0d5 + nP9Ac5j/PHGW/zpylv86dJj/OXSZ/zdyl/81cZf/N3KZ/zp0nP87eJ3/Pnue/0F+n/9GgaH/SYOh/02F + o/9Qh6T/U4ql/1aMpv9aj6f/W4+n/1uNp/9bjaX/WYum/1mLp/9bjKf/Woyq/1qLqv9Yian/VIan/1GC + pf9Kf6P/RX2i/0N7ov9Ce6L/P3mg/zt3nf83dJr/NnOZ/zh0mv88dZj/Qnua/0qAnv9QhqH/UYag/1GG + oP9PhJ7/T4Sf/0+Eof9PhaP/ToSm/0yBo/9JfaD/RXuf/z92nf88dJr/O3Oa/z52nP9CeZ7/RHue/0Z8 + nP9IfZv/SX+a/0p/mv9If5v/RX2b/0B3mf87cpb/OG+U/zZukv84cJT/OnOV/zt1lv87dJf/O3CZ/zps + mP82aJX/L2GQ/ylbi/8mWIj/JFeH/yddiv8rY47/MWmQ/zRvkv82cpT/N3SU/zl1lv86c5f/OnGV/zhs + k/80aJD/MGKM/yxeiv8nX4r/J2OM/ytljv8tZo3/MGeO/zJpj/8zapD/NWqS/zNmkf8iSGn/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8UPVv/Glh9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpafv8ZR2H/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8rUWr/QHmc/z95m/9BfJr/RH6b/0Z/mv9Gfpn/RX2Y/0V8 + mP9GfZn/Rn2Y/0d8mP9Gepf/RXiW/0N0lf8+b5T/OWmP/zFgif8nV4H/IFF6/x5Sef8fV3v/JFyA/ylg + hf8tY4j/K2OG/yhghP8pYYf/K2OI/ytjiP8vZ4v/NGuO/zlwkf8+dZT/QnmY/0N5mP9CeJf/QneW/0N3 + l/9FeZn/RnmZ/0Z4mf9Bc5b/O22R/zVmjf8uYIn/J1yF/yBZgf8iW4P/J2CI/y9njf81bZL/OnOW/z93 + mf9Depv/R32b/0qAnf9LgZ7/S4Gd/0yBnf9LgJz/TIKd/02Dnv9MgqD/S4Cf/0h9nP9Fepr/QXeY/z5z + l/86cZb/Nm+W/zVwlv84dJn/PXmd/0B7nv9DfZ//RH6g/0R8nf9CeZr/QHSY/zxulf81ZZD/LVuJ/yhW + hP8lVIL/LFuI/zVmj/86bZP/PnGT/0Jyk/9FcpT/RHKW/0Fvlf88apP/NGaQ/zJnkv80a5b/OXCb/zpy + m/86cpn/OnKX/zxzlv88c5j/O3GY/zhtlv80aJL/LmGL/ytdhv8rXob/LmKL/zFnkP80bJP/OXGX/zx1 + mf8+dpn/QHaY/0B2lv9AdpX/O3KQ/zpwj/85b4//OW2O/zdpjf8zYov/LlqG/yRPf/8cRXj/GUJ3/xtE + eP8gTXz/JliC/ytdif8uYY3/MWSR/zVnk/80ZZL/MWGO/ytdif8mWYT/IleC/yNZg/8kXob/KmaM/y5s + kv8xcZb/NHSY/zV0l/80c5b/NHKV/zZxl/86cpj/PXSY/0B3l/9DeJj/RHma/0N7mf9Depj/Q3uZ/0V8 + mf9Ge5j/R3yY/0l9mv9He5r/Rnma/0R4mv9Bdpr/PXKY/zdulf8zapH/MGiP/zBqkP81bpL/PXSU/0d6 + l/9Mfpr/TX+b/02Am/9OgZz/ToKc/1CFnv9PhJ3/TYGc/0p+m/9Ge5v/Q3mb/z53mv86c5j/NW6U/zFo + kP8tY4z/MmeQ/zdslP89cZr/RHib/0Z6mv9IfJv/SX6d/0l+nv9Fe53/P3ia/zhyl/8zbZT/LmiR/yxm + kP8sZ5D/MGmQ/zVukv86dJX/PXiX/0B9l/9CgZn/RYWe/0qJov9Pjab/VY+p/1ePqv9Zj6r/XJGp/12R + qP9ekKb/XI6j/1qLov9aiaP/Woml/1WFpP9Of6D/Rneb/z9zl/86cJT/O3OW/z94m/8/eZz/PHaa/zVv + lf80bpX/N3KZ/zh3nP86ep7/QH2g/0aCov9KhKL/TYWj/1CIpP9TiqX/V42n/1mOp/9ajaf/WYyn/1mL + pv9Yiqb/WIqm/1eJp/9Xiaj/Voio/1SFp/9Rg6X/TICj/0V9of9EfaH/RH2j/0R9pP9Ef6P/QH2h/zt5 + nf84dZv/NnGY/zp1mf9Bepr/SoCc/1CEn/9ShqD/Uoeg/1CFn/9PhZ//T4Sh/06Eo/9Og6T/TYGi/0t+ + n/9Hep3/QXaa/ztxmP86cZj/PHKa/0B1nf9EeJ7/RXmd/0d7nP9HfJr/R3ya/0d9m/9Fe5r/Q3ma/z92 + mv87cpf/OG+U/zhwlP85cZT/OXOV/zlxlf84b5f/OGyX/zVnlv8wYpH/Kl2N/yNWiP8iV4f/JVuJ/ylh + jf8vaJD/Mm6R/zVyk/84dJX/OHSW/zlzl/86cZb/OG2U/zVokP8xZI7/KmGL/yViiv8mZIv/K2eN/y1o + jf8wao3/M22Q/zZvkv82bZL/NGmT/xgyR/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xY/ + Xf8aWX7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xxIYv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/y1X + cf88dJf/P3ia/0B6mv9DfZn/RH2Z/0R8mf9EfJf/RHuY/0V8mP9FfJj/RXqY/0V5mP9Edpf/Q3SY/z9v + lv84Z4//Ll2H/yZVf/8fT3n/HlB4/yBVfP8jWn//J2CD/ytjh/8rZIb/LGaH/y9oiv8waYz/M2uO/zZt + kP85cJL/PHOU/0B3lv9DeZj/RHmY/0R5mP9DeJf/RHeY/0N3mP9Ddpj/QnSX/z5wk/84aY7/MWOK/yxf + h/8lXIT/IluD/yZfh/8qY4r/LGSL/zFqj/83b5P/PHSW/0B3mP9Fe5v/SH6d/0qAnv9KgJ3/Sn+b/0p/ + m/9Kf5z/SoCe/0uBnv9Jf53/R32b/0N5mf8/dpj/PHOX/zlylf83c5X/OHSX/z15nf9CfaH/Rn+i/0mA + ov9JgaH/R36f/0R7nf9Cd5r/P3GX/zhqkf8wX4n/KFWC/yZTgv8rWIf/M2KN/ztskf8/cZL/QnOT/0Bx + k/8+b5P/O2yT/zZokf8zZZH/M2iT/zZtmf86cZv/PXWd/z11mv89dZj/PXSX/z50lv89cpf/O3CX/zdq + k/8vYov/Kl2G/ypdh/8sYIv/MGWP/zVrk/85cJb/PHOX/z51lv8+dpX/P3aU/z91k/8+dZL/PnSS/z1z + kf8+cpL/P3CU/zxqkv8zX4v/KlOF/yJJfv8bQHj/GUB3/xtFef8fTn7/JVaE/yhZh/8qW4n/L1+N/zBg + jv8tXYr/KFmH/yNXg/8hV4P/JV2H/yZiiv8oZY3/LGuR/zFxlv80c5j/NnWZ/zZ0mP82cpf/NnGW/zly + l/89dZf/P3aW/0J4l/9DeZj/Q3mY/0N5l/9Depf/RXqX/0V6lv9He5b/SHyY/0h8mf9Ie5n/Rnqb/0N3 + mv8+dZj/OXCW/zNrkf8waY//MWmP/zdukf8/dJL/SHqV/0t9mf9Nf5v/ToCc/06Cnf9Og57/ToOe/0yB + nv9Lf53/SX2c/0d6m/9Dd5r/QHWZ/ztymP80bZT/L2eQ/yxkjf8sYoz/MGWP/zhsk/8+cpf/Q3iY/0R6 + mf9FfJv/RXyc/0F5mf87dZj/N3KX/zRvlv8xbZX/L2uU/zBslP8ybZT/NnKW/zx3mP9AfZv/RYKd/0eG + nf9Kip7/To6j/1OQqP9Ykqz/W5Ot/1uSqv9dkqn/X5So/2CSpv9ekKT/W42j/1mJpP9XiKT/U4Sk/0x+ + of9FeZz/PnKW/zpvk/8+dZj/Q3qd/0V+oP9BeZz/O3SZ/zdxl/84dJv/OXed/zx6n/9BfqH/RoKk/0uF + pP9Oh6T/UYij/1OKpf9WjKb/V42n/1iNqP9Yi6f/Vomm/1WIpv9Vh6X/VIal/1OFpf9Rg6X/T4Kk/0yB + pP9HfqL/RX6i/0R+ov9Gf6P/R4Gk/0eCpP9Gg6T/Qn6i/zt4nv84dJv/NnSZ/zx5mv9Ffpv/TYKd/1KG + nv9Rhp//UIWf/06En/9Ng6H/TYOi/06Cov9PgaD/TX2d/0d5m/9BdZj/PXGW/zpvl/86bpj/PXCZ/0Bz + m/9Ddpz/RHeb/0V4mv9GeZn/RXmZ/0R5mv9DeZz/QHed/z10m/84b5f/N26T/zZtkf81bY7/NW6R/zVt + k/81apX/M2eU/zFjk/8rXo//J1uL/yJYiP8gWIf/Jl+K/yxmjf8xbZH/NXGT/zdzlP84dJX/OXOX/zlx + l/84bZX/NWiS/zBmj/8oY4v/IWOJ/yVkjP8pZo3/LmiN/zFrjf8zbY7/NW+Q/zhwk/81bJL/GDNI/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/FkFe/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/FThL/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/KVJt/zlvk/87dJX/P3iX/0J6mP9De5n/QnqY/0N6 + mf9Ee5j/Q3qZ/0R6mf9Eepn/RXiZ/0R2mv9Bcpj/PW2V/zdlj/8tW4f/I1J9/x1Md/8fTXj/JFV9/yhb + gv8qYob/LWeJ/zBqiv8ybIz/NnGQ/zhykv87dJP/PXaV/z52lv9Ad5b/Q3qY/0R6mf9Fepn/RXqZ/0V4 + mf9Ddpj/QnWY/0Fzlv8+cJT/OmuQ/zRli/8wY4n/K2GI/yZfh/8pYon/LGWM/y9oj/8xaY7/MGiO/zRs + kf84cJT/PXSX/0B3mP9Eepv/Rnyc/0d9nP9Ifpz/SH2b/0d8m/9IfZz/SH2c/0h9nP9Depr/QHaY/zxz + lv87dZb/OXWV/zl3lv89e5r/QX6e/0aAof9LgqP/TIGj/0yBof9If5//RX2d/0N5m/9Ac5j/O2uS/zJg + if8pVoH/JVF+/yhUgv8vXoj/N2iM/z1wkP8/cpL/PXGU/zlukv81apD/M2eR/zJokv80a5b/Nm2Y/zlw + mv89dJv/PnWb/z92mv8/dZb/PnSV/z5zlf89cZb/N2uS/zFkjf8rXoj/KV2I/yxgi/8wZI//NWqS/zlu + lP87cZT/PXSU/z51k/8/dZL/QHWS/0F2k/9BdpP/P3WT/0BzlP9BcZX/Pm2V/zdjj/8uV4n/I0uA/xxC + ev8YQHf/F0N2/xpKe/8fT3//I1SC/yZWhf8pWIf/KlmI/ylZh/8lVoT/IVWB/yRahv8oYYv/KmaP/y1q + kv8vbZT/MXCW/zVzmf83dZr/N3WZ/zdzmP84cpf/OnOX/z11l/8/dpb/QHeX/0J4l/9CeJb/QniW/0N5 + l/9Fepf/RnqW/0d7lv9IfJf/SXyY/0h7mf9HfJv/RHma/0B1mf86cJX/MmqQ/y9njf8yaY7/OG2P/0By + kP9HeZb/S32a/01/nP9Mf53/TH+d/0yAnv9MgJ3/Sn+d/0h9nP9Ie5z/RXib/0N1mf9Ac5j/OnCW/zRs + k/8vaJH/LWWO/y1jjv8uY47/M2eP/zltk/88cZT/PnSW/0F3mP8/dpj/O3WX/zl0lv82cpb/NnOZ/zVz + mf82c5v/NXKZ/zdzmP86d5n/P3uc/0WCn/9Jh6D/S4qh/06Nov9TkKT/WJGo/1yTq/9clKz/W5Op/12T + p/9flKf/YZOn/1+Rpv9bjaX/WIml/1OEo/9OgKL/Sn2g/0N4m/8+cpb/PnSY/0J4m/9GfZ//Rn6g/0V9 + n/9BeZz/O3ab/zt2nP88eJ//Pnqf/0F8of9GgaP/TIWl/0+Ipf9SiaX/U4qk/1SLpf9Wi6f/Voun/1WK + p/9TiKf/Uoal/1CEpf9PgqP/ToCi/0x+of9JfqH/R3+i/0Z+ov9Ff6L/R4Ck/0mCpP9LhKX/S4al/0qF + pf9HgqT/Qn6i/z16nv85eJv/OXiZ/z96m/9Hf5z/TYKd/1CFn/9PhKD/ToOg/02Cof9Og6H/T4Kg/1CB + n/9Ofp3/SXqb/0N1mP8/cZf/O26W/zlslv85bJf/PG6Z/z5wmf9Bc5j/QnWX/0N2l/9Dd5j/Q3eZ/0J3 + nP9Adp3/PHKb/zdtl/80a5L/MmqM/zFpif8xaoz/M2uP/zNqkv8yZ5H/MGOR/y1gj/8oXYz/JVmJ/yFZ + h/8hXIf/J2OL/y5qj/80cJT/N3SX/zl1l/85dZj/OXKY/zdvmP81a5T/MGeP/ylki/8lYor/JmKM/ypk + jv8tZY//MGiN/zJsjP80bY3/Nm6Q/zdtkv8aNEj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8gVHn/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xtafv8VM0P/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8pUGz/NWuP/zlxk/89dpX/P3eW/0B4l/9AeJj/QXmY/0F4mv9DeJv/RHma/0R5m/9Dd5v/Q3Sa/0Jy + mv88bJb/NGOP/ytZhv8hUHz/H014/yFPev8pV4D/LV2G/y9ki/8yao7/NG+Q/zdxkf86dZP/PniW/0J7 + mP9Ce5n/QnqY/0N7mf9De5n/RXuZ/0Z8mf9He5v/RXiZ/0N1mP9Bc5f/PnCV/zttkv83aY7/MWOJ/y1h + h/8qYoj/LWWL/zBojv8za5H/Nm+U/zdvk/82bZL/NW2S/zZuk/86cZb/PXSY/z50mP9Bd5j/Q3ma/0V7 + m/9GfJ3/R3yc/0V6mv9Eepr/QnmZ/0B3mf87c5f/OnOW/zl1lf86eJb/Pnya/0J/nf9GgqD/SYKh/02C + ov9Og6L/TIGh/0uAoP9Ifp//RXud/0J1mv89bpT/NGGK/ypWgP8iTnn/JVB8/yxag/8yZIj/OGyN/zpw + kf85cZH/NW2Q/zFpjv8yaZH/NGyU/zdul/83b5j/N26W/zlxl/87c5j/PnSY/z91l/8+c5X/PXKU/zxw + k/84bJH/MmaN/ytfif8nXIf/K16J/zBjjf81aZD/OW2S/zxwk/89cpP/P3OT/0B0kv9BdpP/Q3aU/0F1 + lP8/c5P/PnKT/z1vk/87apP/NmKQ/y5Zi/8kTIL/G0V7/xhEeP8YR3j/Gkt7/yBRgP8jU4L/JVSE/yZV + hf8mVYX/I1SC/yFSgf8iV4P/JlyI/ypjjf8va5T/Mm+X/zNxl/81cpn/NnOZ/zl1mv85dZn/OXOY/zlz + mP87c5f/PXSX/z51l/8+dZb/P3aV/0B2lP9Bd5X/Q3mX/0V6mP9Gepf/R3uY/0h7mP9Ie5f/R3qZ/0V6 + mf9EeZn/QHWX/zlvk/8yaY7/MGeM/zRpjf85bI3/QHOS/0Z4l/9KfJz/S32b/0p9nP9JfZz/SX2c/0h8 + m/9Gepv/RHia/0R4mv9Dd5v/QnWa/0Byl/87b5T/N2yS/zRrkf8xZ5H/MGaR/zBlkf8yZpH/MWWN/zRo + j/83a5D/OW6S/zpwk/84cZP/N3KU/zZylv83dJn/Onid/zt5n/88eZ7/PHmd/z57nf9Dfp7/SISh/0uI + ov9Oi6L/UY6k/1eQpv9ckqn/XpKr/1ySqv9ckqj/XJKm/16Tpv9fk6f/XpGo/1uOqP9ViKX/T4Oj/0p8 + n/9GeZ3/Qnab/0J3m/9Fe57/SH6g/0l/oP9JgKD/SICg/0J8nf89d5r/O3aa/zp2mv89d5z/QHqe/0V+ + of9Mg6T/U4mm/1WJpv9Th6T/U4ik/1KIpf9Rh6X/UYal/1CGpv9Og6T/TIGj/0p+of9JfKD/R3ue/0V9 + oP9Ff6D/RYGi/0iCo/9Kg6T/TIWk/02Hpf9OiKb/TYim/0yEpP9HgqP/Qn+g/z18nf87eJr/PHea/0B6 + m/9If57/TIKf/06EoP9Ng6H/ToOi/0+Eov9RhKH/UIGf/0+Anv9LfJ3/Rnib/0Fzmf86bZX/NWiS/zVn + k/84apX/O22X/z5vl/8+cZb/P3KV/z9zlf9AdJf/QHSY/z5ymf85b5f/NGuU/zBokP8uZ4v/L2iI/zBp + iv8yaY3/M2iP/zJnkP8xZJD/L2KP/ytfjP8nXIn/JFuH/yNciP8mYIr/LGeO/zJtk/82cpb/OXaZ/zl0 + mv84c5r/OHGZ/zdulv8zapL/LGOM/yhfif8nXon/KV+L/y1hjf8yZI//M2iO/zNrjP80bI7/NmuQ/xo0 + SP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x9bgP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p+/xQx + Q/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zZrj/80ao7/Nm+Q/zpylP87dJb/PXSX/z10 + l/8+dZj/P3aZ/0J3mv9Dd5z/Q3ib/0J1m/9Cc5v/P2+Z/zpqlf8zYo//KliF/yJQff8eTXr/IlF7/yhW + gP8vXoj/NWaP/zRqkP81bpL/OXSU/zt1k/8/eJX/RHyY/0d/m/9Gfpv/Rn2a/0R7mP9Fe5j/RnyZ/0d7 + mv9FeJn/QnOX/z5wlf88bZP/OWuR/zNli/8rYIX/J12D/ypih/8xaY7/NW2S/zhwlP87dJf/PneY/zx0 + lv86cZT/OXCU/zpxlv88cpf/PHKX/zxylv89c5b/QXeZ/0N5m/9Eepz/RHqb/0F3mf8+dZj/PXSY/zly + l/84c5X/OXaW/zx6mP9CgJ3/R4Sf/0qEof9NhKH/TYSh/06DoP9Ng6H/TYOi/0uDof9Ifp7/RHib/0By + l/84Z4//LFmC/yNOef8iUHr/Jld//y1ghf8yZ4v/NWyO/zRtj/8wbI3/MWyP/zNtkv82cJX/OXGY/zpz + mP85cpf/Nm6T/zZuk/85cJT/OnCU/ztxlP87cZT/O3GT/zhtkf80aI7/K2GK/ydchv8pXYX/L2CJ/zRl + jf86a5L/PW+T/z5wk/9AcZL/QXKT/0Fzk/9CdJX/P3GT/zxvkv86bZH/N2mP/zRkjv8wXoz/KVaH/yFO + gv8aR3v/F0d3/xpLev8gUYD/JFWE/yZXhP8mV4T/JlaF/yRTg/8iUoL/H1GA/yFWgv8mXIj/K2WO/zBs + lP81cZn/NnKZ/zdzmf85dJr/O3Wb/zx1mv86dJn/O3KY/zpymP87c5f/O3KW/ztylf88c5P/PnST/0F2 + lf9CeJb/RHmX/0V5l/9FeZf/RnqY/0d6l/9GeZb/Q3eW/0B2l/8+c5X/OW+S/zNqjv8yaI3/NWmN/zpt + kP9Ac5X/RXiZ/0h6m/9He5v/Rnqb/0V6m/9EeZr/Q3ia/0F2mf8/dJj/QHSY/0F0mf9BdJn/P3OY/z1w + lf89cJT/Om+U/zhtlf82a5b/M2iV/zJmkv8uYo3/LV+J/y9iiv8yZYz/NGmO/zhukv83cZT/OHOW/zp2 + mv89ep3/P32h/0B+of9BfaD/Q3+f/0eBof9KhaL/TYmj/1GMpP9Wj6T/W5Gm/16SqP9ekar/XZGq/1yS + qf9ckab/XZKl/16Sp/9dkaj/WIyo/1KGpv9MgKL/Rnuf/0F2nP9Adpv/RXuf/0qAov9Ng6L/TYSi/02E + ov9KgqH/Rn+f/0B6nP86dJf/OXOX/zp0mP89dpr/Q3qe/0qAo/9Rhqb/U4el/1KFov9RhaL/T4Wi/02D + ov9LgqP/SYGi/0h/of9HfaH/RXqf/0R6nv9FfJ7/RH6f/0aBov9JhKP/TIak/0+Hpf9Qh6T/UYil/1KJ + pP9RiaT/UIil/0yGo/9HgqD/Qn2e/z54m/88dpn/P3mb/0R9nv9JgKD/TYKh/06Dov9Og6P/UYWk/1CD + ov9PgZ//TX6e/0t9nv9Hep3/QnSb/zhrk/8wYo3/LmCM/y9hjv81ZpL/O2yV/ztulf87bpP/PG+S/zxv + k/88cJT/OW2U/zZrk/8xaZH/LmiO/y1mjP8sZov/L2aL/zFnjf8zaJD/M2eR/zNnkf8yZZD/L2KO/ytg + iv8mXIf/JFyH/ydgif8sZY//MWuU/zVwmP83c5n/OHSb/zdznP86cZn/Om+X/zdqk/8uYYv/KVyH/ydZ + hv8oWYf/LFuK/zFgjf8zZI//NGaO/zNojf80aI7/GTJH/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/H1yA/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bW37/FTNE/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/M2eM/y9lif8xaY3/Nm6S/zhwlf84b5X/OW+V/ztwlv88cpf/PnSY/0B0mf9AdJn/QHKZ/z5w + mf87bJf/N2eT/zBfjP8oVoX/IVB+/x9Oe/8gUHz/JFR//ypbhf8vYov/M2eR/zRtk/82cZL/OXOR/z12 + kv9Cepb/Rn2Z/0h/nP9GfZr/RXuZ/0V7mf9Gepn/RXiZ/0N1l/9AcZX/PW6T/ztrkv83aI//L2OJ/ydd + g/8lXYH/K2OH/zNrjf84cZP/PHWW/z53mf9Bepr/QnqZ/0B4l/8+dZf/PnWY/z10mP88c5j/O3GW/ztx + lv86cZX/PnSX/0F3mv9CeZr/PXSZ/zpymP85cpj/OHOX/zd0l/86eJj/P36c/0SBnv9KhaD/Toeh/0+H + ov9Qh6L/T4ag/0+Gov9Oh6P/TIWh/0mCn/9GfJ3/QnWZ/z1rkv81YIr/K1aC/yVSfv8lVX//KFuC/y1j + iP8waIz/MWqN/zFsjv8ybpD/NnKT/zl0l/88dZn/PXaa/zt0mP84cJX/M22R/zFpj/8zbJD/NW2R/zZu + kv84bpH/OGyS/zRokP8vYo3/KVyH/yhbhP8tXob/M2OK/zloj/88bJL/Pm2T/z9uk/9AbpP/QG+T/z1u + kf86bJD/NmmO/zNljP8wYor/LV6J/ypahv8lVIP/Hk1+/xdHd/8XSXf/HU99/yNVg/8pW4j/KVuI/ylb + h/8nWYX/JVaD/yJSgf8eUX7/HlOA/yRchv8tZo//Mm2U/zZxl/83cpj/OXOZ/zx1m/89dZv/PXWa/zxz + mP87cpj/O3KY/zpxl/85cJb/OW+T/zlvkv87cJH/PnOT/0B1lP9BdpX/QnaV/0N2lv9Ddpb/Q3eX/0N2 + lv9AdZT/P3SU/z1zlP84bpH/M2mO/zFmjf80Z47/OWyS/z5yl/9Cdpr/Q3ea/0R4m/9DeJr/Qnia/0B2 + mP8+dJf/PXOW/zxxlf89cpX/P3SX/0F2mf9Bd5n/QXWY/0F1mP9Bd5f/P3SX/ztwl/83a5f/MWOS/yxf + jP8pW4j/KVqF/y1eiP8yZIz/NmuR/zlwlP87dJf/PXic/0B7n/9Df6L/RICi/0WAof9GgKD/SIKg/0yF + of9PiqP/VI2l/1iQpf9dkqb/XpOo/16Sqf9ekqr/W4+p/1yQqP9dkaf/XZGo/1uPqf9Xi6n/UIWn/0l/ + o/9DeZ7/P3ab/0J5nf9HfqD/TIOi/1CGpP9Rh6T/UIak/06Fo/9Jg6H/RX+e/z54mv83cZX/Nm+U/zlx + lv9Ad5v/SX2i/06BpP9QgaL/T4Gf/1CCoP9OgqL/S4Gh/0Z9nv9De53/Q3qe/0F4nf9Dep//Q3ud/0V/ + n/9HgqH/SYWj/0yHpf9Qiab/U4qm/1SLpv9ViqP/VYui/1SKo/9Ti6T/UYmk/0yFov9Gf5//QHmb/z12 + mf89d5n/Qnud/0d+oP9KgaL/TYKj/06CpP9Pg6T/ToKh/0x/n/9JfJz/Rnmb/0R4nP89cJf/NGiQ/yxf + iv8mWYb/J1mG/ytdiv8yY4//OGmS/zhqkf84a4//OWyP/zlsj/82a4//NGqP/y9ojv8taI7/LWeN/y5m + jf8tZY3/MGaO/zJnkP81apP/NmqU/zZpk/80Z5H/MWSO/ytgiv8mXYj/Jl2J/ypijf8waJP/NW6Y/zZw + m/83cZz/OHGb/zpwmf87bpb/NWeQ/y5fiv8oWYX/JVWC/yZUg/8oVYT/LVqJ/zBejP8wYYv/MGGK/zBi + iv8OHSv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8cWX7/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8QJTL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8uYYj/KmCF/yxjif8xaI//MmmR/zNp + kv80aZL/NmuT/zhsk/86bpP/Om+U/ztvlP87b5X/OWyV/zdolP8yYo//K1uI/yVUgv8gTn7/H057/yFS + ff8jVH//JViC/yhdhv8sY4z/MGmQ/zJtkP82cJH/O3OS/z94lP9FfJj/Rnya/0Z8m/9Fe5r/RXmZ/0R4 + mf9Ddpj/QHGW/z5uk/87a5H/OGiP/zJljP8rYYf/Jl2C/ytihv8wZ4v/N2+Q/zx1lv9AeZn/QnqZ/0N8 + mv9EfZv/RXya/0V8mf9Depr/QXib/z92mv89c5n/O3KX/zlxlv84cJT/OnGV/zpxlv83b5X/NG2V/zRw + lv81c5f/N3aZ/z17nP9CgJ7/R4Sg/0yGof9Oh6L/UIii/1GIov9RiaP/UImj/1CKpf9NhqL/SoKf/0h+ + nf9Gepv/QnGX/ztmkP81Xor/LFeF/yVUgv8lWIP/KF6H/yxliv8vaY3/MW2P/zZykv85dJX/PXeY/0F6 + nP9BeZz/P3aZ/ztzlv81bpP/MGmP/yxmjf8uaZD/MmuR/zRskf82apL/NGeQ/zBijf8rXIj/KFmE/ytb + hP8wX4f/NmWM/zppkP87apH/O2mQ/ztokP86aJD/N2aN/zNli/8wY4n/LV+H/ypchf8pWob/J1iE/yNV + gv8eUH3/GUx5/xlLef8dT33/JVeF/ypcif8uYIz/LV+L/ypch/8pWoX/I1WB/x9Rfv8eU3//JVuG/ytk + jf8ybJP/NnCW/zlzmP88c5j/PnWa/z91m/89dJn/PHOY/zxzl/87cpf/OnGW/zhvlf83bZP/OG2R/zlu + kf87cJH/PHGR/z5yk/8/c5P/P3KU/z9ylf9Bc5b/QXOW/0Fzlf8/c5T/PXKT/zZskf8xZo//LmKN/y9j + jf80aZD/OW6V/zxymP8/dJn/QHaa/0F3mv9Ad5r/QHaZ/z50l/88cpT/PXOV/z50lf9Bd5j/Q3qa/0R6 + mv9Fe5v/Rnub/0R6mv9DeZr/QHaZ/zlulf8yZZD/K1uK/yZVhP8lVIL/KVeE/zFhi/81aJD/OW+U/z50 + mf9Bepz/Q36f/0aBov9HgqL/R4Kh/0iBoP9Jgp//TISg/1GIov9WjKT/Wo+l/12Rpv9ekqf/XpOp/12R + qP9ckKj/XJCo/12Rqf9dkKn/Wo6r/1aLrf9OhKj/R32j/z93nv9AeJ3/RHye/0iAoP9NhKL/UYek/1OJ + pP9UiqX/Uomk/06Go/9JgqL/Q32d/z12mf82b5T/NW2U/ztxmP9Cd53/SXyi/0x9of9NfqD/T4Gi/06C + o/9HfJ7/QHia/z10mP88dJn/PXWb/0B4nP9Ff5//SISg/0qGo/9NiKX/UIqn/1SMqP9Yjqn/WI6n/1mN + pf9ZjKP/WI2k/1eMpf9Ui6X/UIej/0qBof9DfJ3/P3ma/zt1l/8/eJr/RHue/0h9ov9Kf6P/S3+j/0uA + ov9KfqD/R3yd/0N4mv9AdZj/PHCV/zZrkf8vZIz/J1yH/yJWgv8fU4D/IlWC/yhbiP8uYYz/M2aN/zVo + jf83ao3/NmmM/zVrjf8xao7/L2qO/zBrkP8xapH/MGiQ/y9lj/8vZI//MmaR/zZqlf84bJb/OGyV/zdr + k/81aJH/L2ON/ypeiv8mXIj/J16K/ytij/8waJT/NW2a/zZvmv83cJn/OW6X/zhplP8yY4//LV2J/yZW + g/8kU4D/I1OA/yZVg/8oV4T/KlmF/ytbhv8qWoT/KFiD/woVIf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/x9agP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HFp+/wsZIv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/ytfiP8oXYb/Kl+H/yxhi/8tY43/LWOO/y9kj/8yZo7/NGiP/zRpjv80aY3/NWqO/zZr + kP81aJD/M2SQ/y5ejP8oV4b/IlCA/x1Le/8gUH3/JFaA/yZZg/8lWoP/JFuD/yZghf8pZIj/L2qN/zVt + kf86cJT/P3WW/0R5l/9Fe5n/RXua/0R5mf9Dd5n/Q3aY/0Fyl/8+b5X/OmuS/zhnj/80Zoz/L2SK/yhg + hf8rY4f/MGeK/zVsjv87c5T/QXmZ/0V9nP9Gf5z/SICc/0iAnP9JgJz/SYCd/0mAnf9Hfp7/RHue/0F3 + nf88dJv/OXGX/zdvlP80bJL/MmqQ/zBpkf8wa5L/MW6U/zNylv85d5v/P3yd/0WBof9LhaL/Toai/0+H + ov9QiKH/UYqj/1KMpf9Sjqb/UIul/02Hov9LhJ//S4Gd/0p9m/9Id5r/QmyV/zpjkP8xW4n/KVaF/yVX + hf8mXIf/KmOL/y9qj/81cZL/OXWV/zx3l/9Be5r/Rn6d/0Z9nv9Fe5z/PnWY/zdvlP8ya5H/LmqQ/yxn + j/8uaZD/M2qS/zVpkf80Zo//MGKM/ytbiP8nVYT/J1SD/ytZhf8yX4n/N2SN/zdjjf81Y43/NGKM/zFg + if8vYIj/LmCH/yxfh/8qXYX/KVuE/yhahf8oWob/JVmE/yJWgf8eU33/HVF9/yBTgP8kV4T/K16K/y9i + jv8wY47/L2GM/ypciP8lVoL/IVN//yBUgP8lWoT/K2KL/zJqkv83cJX/O3KX/z50mf8/dJr/P3Wb/z50 + mv89dJn/PXSZ/ztyl/85b5X/OG6U/zdskv82bJH/N2yQ/zhtkP85bpD/Om6Q/ztukf86bpL/O26T/zxv + lP8/cZb/P3CV/z5wk/86bpL/M2eQ/yxgjv8pXov/Kl6K/y1ijP8yaJH/N26V/zpyl/89dZj/P3ea/0B4 + mv9BeJr/QHeY/z91lv8/dZf/QniY/0V9m/9Hf5z/R3+c/0h/nf9Ifp3/R32d/0V8nf9Bd5n/OnCU/zRo + j/8uYIv/JVOC/yBLfP8iT37/KViD/zJjjP85a5P/PnOX/0J5nP9Ff6D/SIKi/0qEov9KhKH/SIGf/0qB + nv9Lg5//UIeh/1aLo/9ajqT/XI+l/16Qp/9ekqj/X5On/16Rp/9fkKf/XpCo/12Oqv9ZjKv/U4eq/0uC + p/9De6H/P3md/0B6nf9EfZ7/SoKg/06Hov9SiaT/VIum/1WLpf9Vi6X/UYil/02FpP9HgKH/QHmd/zt0 + mf82b5b/Nm2V/zlvl/8+cpr/Rnef/0x9pP9MfaP/SXyh/0F3mv87c5f/OXOX/zlzmP86c5j/Qnyc/0iE + oP9LiKL/T4ul/1GMp/9Vjan/WI6q/1uQqf9bj6j/XI+l/1yPpf9ajqT/Wo6l/1eLp/9TiKb/TYSk/0d/ + oP9Be5z/PneZ/zx0l/9AdZr/RHif/0Z6of9Ge6H/RXuf/0V6nf9CeZv/P3eY/zxylf83bZH/MmeM/yxh + iv8lWoT/IFSB/x1Rf/8eUoD/IFWC/ydahv8tYIr/MmWM/zZpjf81ao3/M2yP/zBtkP8zbpL/NG6U/zVu + lf80apT/MmiS/zBlkf8zZ5P/NWmV/zhrl/86bZb/OGyU/zZpkP8xZI3/LF+K/ydbiP8mW4n/Jl2L/ypg + kP8uZpT/M2yX/zVtl/83bZf/NWmT/zJjjv8qWof/JVSC/yJSf/8kVIL/JVeD/yZYg/8lWYP/JVmC/yRY + gf8iVH7/CBUf/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HDxf/HFl+/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8bWn7/Chgi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/KV2H/yZahP8nW4X/Kl6I/yle + iv8rYIz/LWKN/y5jjP8vZIv/MWaL/zBlif8wZYn/MmaL/zJmjf8wYoz/K1yJ/yVWg/8fTn3/IFB9/yRX + gP8pXYT/KmCH/ypiif8nYof/I16B/yZhg/8oY4f/M2aO/ztrlP8+b5X/QHSW/0R4mP9FeZn/RHeZ/0J1 + mP9Bc5n/P3GX/zxslP83aJH/M2WN/y9ki/8sY4n/LmaL/zJqjf82bpD/OnKT/z93lv9EfJv/SICe/0qC + nv9Lg57/TIOe/06EoP9NhKD/TYSh/02Eof9KgaD/R3yg/0B3nf87c5n/OHCX/zNrkv8vaI//LGaN/y1p + kP8ubZL/MnGV/zh2mv9AfJ//SIKi/02FpP9PhqP/UIih/1CJof9QiqL/UY6m/1KPpv9RjKP/Toih/06G + n/9Ogp7/ToCc/0t4mv9Hcpj/QGmT/zRfjf8rWYj/JVaF/yVbh/8rZI3/M22T/zl1lv87d5f/P3qY/0N9 + m/9If53/TIGg/0l+nv9DeJv/PHKW/zZulP8ybJP/MWqS/zJqkv80aZH/NWiR/zRmj/8wYYv/K1uG/yZS + gv8kUID/JVCB/ytXhf8vW4j/MVyI/zFbif8uWof/LFqF/ytahf8qXYX/Kl6G/ytfh/8sX4j/LF+I/y1g + i/8rYIr/KF6H/yRag/8iV4H/I1eC/yZahf8sX4v/MGOO/zJlkf8xZI//LmGM/ylahv8kVYL/IlOB/yRW + g/8rYIr/MmiQ/zZuk/87cZb/PnSY/z50mf8+c5r/PnSb/z50m/8+dJv/O3GY/zhtlP82a5L/NWmQ/zRp + j/81aY//NWmO/zVqjv83a4//OGuP/zhrkP83apD/OGuQ/zpqkf87bJL/O2uS/zZokv8wYpD/KFyK/yRZ + h/8iWYX/J1+K/y1kjv8yapL/OHCW/zx0l/8/eJn/Qnqb/0N6m/9Depr/QnmZ/0N6mv9GfZz/SoKf/0qC + n/9Lg5//S4Ke/0mBn/9IgJ//Rn6d/0F4mf89c5b/OW+S/zRnjv8sXIb/IUx7/xhCc/8fS3j/KVaB/zNk + jP87bZT/QHSZ/0V9nf9Kg6H/TIai/0qEoP9Jgp7/SICb/0qCnf9OhqD/U4mi/1eMpf9bjqb/XpCn/1+S + p/9gkab/X5Gl/2CQpf9ejqf/W4yq/1iIq/9Rg6j/SHyl/0B5n/8+eJv/P3qa/0WAnv9Nh6P/UYql/1OL + pf9WjKb/V42n/1WMpv9Ui6b/UIil/0uDo/9EfaD/Pned/zlymv80bJX/MWiS/zRqk/89cZn/RHef/0d5 + ov8/dJv/OnCW/zlxlv86dZr/PHea/0B7m/9HgZ3/Soag/06Ko/9Rjab/VY6p/1iPqv9bkKv/XJCp/16R + p/9dkKb/XY+m/12Ppv9bj6f/WY2p/1aKqf9Qh6b/SYGi/0V9n/8/eJv/PXSZ/z1ymv9Acpz/QHWd/0B2 + nf8/dp3/PXaa/z11mP87dJX/OXGT/zZtkP8xaI3/LmOL/yhdh/8iV4P/HlOA/x5Tgf8gVYL/JFmF/ypf + iv8xZY7/NWqP/zZtkP8zb5L/NHCU/zZylv85dJn/OHCZ/zZsl/80aZX/MmaT/zJmk/80Z5X/N2qX/zhr + lv84a5P/NWiP/zFkjP8sXon/JlmG/yNYhv8iWIj/JFuL/ylikP8uaJP/MmuW/zdumf82apb/MGOP/yla + h/8kVYL/JFSC/yZYhP8nW4f/KF2H/yVdhf8lXIT/JFuC/yNYgf8IFSD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wgUHv8cWH3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxaf/8KGCL/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wsYIv8pX4f/JlqE/yldhf8rX4n/K2CM/ythjP8tY47/L2WN/y9li/8vZYf/MGaI/zBm + if8xZor/MWaM/y9ji/8rXYj/JFWC/yJTf/8kVoD/KV6E/y5kif8vaI3/MGuO/y9qjP8saIn/J2KC/yhe + g/8tX4f/M2OM/zhpkv86bZP/PHCV/0Bzl/9DdZf/QXOX/0Bwl/89bpf/OmqU/zVlkf8vY4z/KmKI/yxl + iv8zbI//Nm+T/ztzlf8/d5f/Q3ua/0Z+nP9JgZ7/TYSg/02Fn/9OhJ//T4Wg/1GIo/9Rh6P/T4ai/0+E + ov9MgaH/RXue/z92m/85c5n/N3CW/zFskf8ta5H/K2qP/yxskf8xcJX/OHWZ/0B6nf9IgKL/TYSj/06G + o/9Oh6L/Tomh/06Kov9PjKP/UIyj/1CMo/9QiqH/UIaf/1GDnf9Rf57/Tnqc/0p0mv9CbZf/N2SQ/y1c + iv8lV4b/JluI/y5kj/83cZf/O3aY/z96mf9Be5n/RX2b/0mAnf9LgJ//Sn2f/0Z5nf9AdZr/O3CX/zdt + lv82bJX/NmuU/zVpkv80aJD/MmaN/zBgiv8sWoX/JlKA/yFMff8gS33/I0x//yhRgv8qU4T/K1aF/ytW + hP8oVoL/KVqD/ylehP8rYYb/L2SJ/zFki/8xZYz/MWaP/zFnkP8uZI3/K2GK/yddhv8kWoP/J12G/y1h + jP8yZpD/NGmS/zNnkv8wY47/LV+L/ydZhv8jU4L/JVaE/ylZh/8vYo3/NWmR/zluk/88cZb/PnOY/z5z + mf8+c5r/P3Sb/zxymf85bpb/N2yU/zRoj/8xZYz/MGSL/zFki/8yZYv/M2aN/zNnjf81aI3/N2qP/zZp + kP81aI7/NWaN/zRljf81ZY//M2OQ/yxfjf8mWof/H1WC/yBYhP8lXon/K2ON/y9pkP81cJT/OnWX/0B6 + mv9EfZ3/RX2d/0Z9nf9Hf53/SICd/0uDoP9MhKD/TIWg/02FoP9KgqD/SYGf/0iBoP9FfZ3/Qnqb/0B3 + mf8/dJj/Om6T/zFiiv8mVH7/G0Zz/xQ+bP8dSHX/KViB/zRljP8+cpX/RHqb/0qCoP9MhaH/TIWh/0qD + nv9HgJz/Rn+b/0mCnv9PhqL/VIml/1qNp/9dkKj/YJGn/2CRpf9hkKP/YI6k/16Mpf9biaf/VYOo/059 + qP9Fd6T/PnWd/zt1mf8+epn/R4Of/06JpP9SjKf/VIun/1eMp/9Xjaf/Vo2n/1SMp/9Siqf/Toem/0mD + pP9BfKH/OnOb/zNtlf8uZpD/L2aS/zRqlf87b5v/Om+Z/zdsl/8zapT/NnCY/z13nP9Ff5//S4Sf/02G + oP9NiKH/T4uj/1KNpv9Wjqn/WI+r/1qQqv9dkqn/XpGo/16Ppv9fj6b/X4+n/12QqP9ajqr/V4up/1KI + qP9Lg6X/RX6h/0B4nf8+c5r/PG+a/zxvmv86bpj/OW+Y/zlxl/83cpX/NnGT/zlylP85cpP/Nm+R/zVs + kf8yaI//L2SO/ypgjP8lWof/IVaE/yFXhf8lWoj/LGGN/zJnkP81bJH/NG+S/zZylf83c5f/OnSa/zt0 + m/87c5v/OG6Y/zRplf8xZZL/MWSS/zJkkv8zZpP/M2WS/zJkj/8yZY3/L2KK/ytdiP8nWYb/IVSE/x9T + hf8gV4f/JV6M/yplkP8vZ5P/NGmW/zZqmP8wYpH/KVuJ/yVXhP8kWYT/KF2H/ytii/8sZYz/K2WL/yhj + if8oYYj/KF+H/wcRGf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BxMe/xtYff8aWX7/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/G1p9/woXIf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Cxkj/yxiiP8tYon/LmOJ/zBl + jP8yZ4//MWeQ/zFokf80apH/NGyP/zRrjP8yaYj/M2qK/zRrjf80aY7/MmaN/y1giv8nWoX/JliC/ylc + g/8tY4j/MGqM/zNukf82cpP/OHOT/zZxkP8yaoz/LWCG/ypagv8qW4T/LV+I/zFljv80Z5L/N2uT/zpu + lP9AcJX/PW6V/ztqlP84Z5P/MmWP/ytiiv8oYoj/L2mN/zZwkv87dJb/QHiY/0N7mf9GfZr/SYCc/0uD + n/9NhaD/ToWf/0+Fn/9QhqH/UIei/1KIpP9RhqT/T4Sj/02Bov9Kfp//Qnqd/zx3m/85dZn/OHWY/zJy + lv8vb5P/L2+S/zFwk/84dJf/QHmc/0Z9n/9KgKD/TYSh/0yGof9Lh6H/S4mi/0yJof9MiaH/T4mg/1GJ + oP9Th5//UoOe/1KAn/9Qe57/S3ed/0Jwmf84Z5L/LF6L/yZaiP8oXYr/MGaR/zdvlv88dpj/QXua/0V9 + m/9Hfpv/SoCd/0p/nf9JfJ3/Rnmd/0N1nP8+cpn/O26Y/zlsl/83apX/NWiR/zNnj/8yZYz/L2CI/ytZ + g/8kUnz/Hkh3/xxFd/8eR3n/IUp8/yVOf/8nUoH/KFSC/ypYhP8rXYX/K2CF/y9mif8yaYv/M2mN/zRp + jv8zaZD/M2mR/zNpkv8wZo//LGKL/yheh/8nXYb/LGCK/zFmj/81apP/NmqU/zJmkP8uYo3/Kl2J/ydY + hv8lVoX/JlaG/yhXh/8uX4z/NmmR/zpulP89cZb/PXKX/z5ymv89cZn/Om6W/zdslP8zZ4//MWWN/y5i + if8sYIf/LF+H/y1giP8vYon/MGOK/zJli/80Z47/NGeO/zRmjv8yZIv/MWCM/y9ejf8tXIz/KVqH/yNW + gv8gVYD/IlqE/yVeiP8rZY3/MGyQ/zZyk/88d5f/QXyb/0V/nf9IgZ//SYGe/0qBnv9Lg5//TISg/0yE + oP9NhZ//S4Sg/0mCoP9IgaH/R4Cg/0Z+nv9EfJ3/RXye/0N4nP9AdJj/N2iO/ylXf/8dSXP/FT9r/xVC + bf8fTnf/LV6F/zltkP9DeZr/SYCf/0yFof9NhqH/TIWh/0iBnv9Efp3/Rn+e/0qDof9Rh6X/WIyo/12Q + qP9fkKf/YY+j/2GPo/9hjaP/Xoql/1mFpf9Tf6b/S3mm/0BzoP84cJr/N3KY/z99m/9Jhp//T4ql/1SK + qf9Vi6j/Voun/1eNp/9Xj6f/Vo6n/1OMp/9Qiqf/S4Wm/0R/o/88d57/MmyV/y5nkv8tZZH/MGaT/zFm + k/8xZpP/MGWR/zJplP82b5j/P3ib/0qEn/9SiaH/U4qj/1KKo/9Ri6T/Uoum/1aMqP9Xjqn/WJCp/1uR + qP9cj6f/XY6m/16Op/9dj6j/XZCp/1qOqv9Wi6n/UYeo/0uEpv9Gf6L/QXie/z1xm/85bJj/N2uX/zVr + lv80a5T/M22T/zNukv82cpP/OXSV/zp0lP87cpX/OnCV/zdtlP82bJP/MmeS/yxijv8nXIr/JVuJ/yhe + jP8uY5D/MmiT/zNsk/80b5P/NXGU/zhzl/86dJr/OnOa/zlxmf83bZf/MmeS/y9jkP8tYY7/LF+N/y5g + jv8uYI3/LV+K/yxfif8sX4j/LF6I/ypciP8lV4f/HlKC/x5VhP8gWYb/JV2K/yphj/8uY5H/MGOS/y5g + j/8qXIr/JFiF/yZch/8sY4z/MGmQ/zBskf8va5D/L2uQ/y5oj/8uZo//AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8HEh3/GlZ8/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWX7/CBYg/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8MGiP/M2qO/zNqjf80ao//NmyR/zluk/85b5T/OXCV/ztylf89dJX/PHST/zpz + kf85cZD/OnGS/zhvkv82a5H/MmaP/yxgif8qXoX/LGGF/y5mif8ybY//OHSU/zx4mP8/epj/P3eX/zxx + k/83aI7/LV6F/yRWfv8lWIL/KFyI/ythjf8sZI//L2aO/zRoj/84aZD/N2WO/zJkj/8sYov/J2GI/yxm + jf8ybJH/OXOW/0B5mf9DfJv/R3+c/0h/m/9KgZz/TYOe/06En/9Qh6H/UYeh/1CGoP9RhqL/Uoaj/1KG + o/9QhaL/ToKh/0h/oP9BfZ7/PXuc/z17nP88e53/Onuc/zd4mf81dJb/NnOV/zpzlv8/d5n/Q3mb/0d9 + nP9HgJ3/SIOf/0iFoP9Kh6H/S4eh/0uHn/9Ohp7/UIad/1OGn/9VhaH/U4Gh/1B+oP9Kep//Q3Ob/zZo + k/8sYIz/JluJ/ylfjP8wZpH/Nm2V/zx1mP9Bepn/RXyb/0h+nP9IfZz/SXyd/0h7nf9GeZz/Q3Wc/z9x + mv87bZj/OGmW/zZnk/8yZY//MGOM/y9iiv8vYIb/K1qC/yRRfP8dSHX/F0Fv/xhBcf8bRXX/IEt5/yRR + ff8oVoH/LFyE/y1gh/8wZYj/M2qL/zVtjf81bI7/NWuO/zRqkP80apL/NGqS/zJokf8uY43/KmCK/ylf + iP8qYIn/L2SN/zNokf81apP/NGmS/zBkj/8sYIz/KFuJ/yRWhf8jU4T/I1KE/ylYif8vYY7/N2qS/zls + kv86bpT/Om6V/zptlv84a5T/NGeQ/y9jjP8sX4j/Kl2F/yhcg/8nW4P/KFyE/ytehv8tYIf/LmGI/y9i + if8wY4r/MGOK/zFgi/8uXIv/LVmK/yhVhP8kUoD/IVN8/yNXgf8mXIX/KWGI/y5pjv80b5L/OHWU/z16 + l/9DfZr/R4Gc/0mCnf9Lgp//TIKf/02DoP9Mg5//S4Oe/0uDnv9Kg6D/R4Cg/0Z/n/9GgJ//RX+e/0Z/ + n/9HfqD/R32g/0V4nP89bZT/MF2F/x1Icf8WQGv/FUFr/xtKc/8pW4H/NmyO/0F5mP9Hf57/S4Wi/02G + ov9MhKP/SYGi/0V+oP9DfZ//R4Ch/06Fpf9Wiqj/W46o/16OpP9gjqL/YY6i/2GMo/9eiab/WIOm/1F8 + pv9GdaH/PG+b/zNrl/83dJr/P3+e/0iHov9Siqj/V4us/1eKqv9XjKj/WI2o/1iPqP9XkKj/VI6m/1GL + pv9NiKb/R4Kk/0B7oP84cpv/MGqU/y1lkf8rYo//K2GP/yxhkP8wZpT/NGuX/zlxmf9FfZ3/T4ah/1aL + pP9Yi6b/V4ul/1WLpf9Vi6b/VIyn/1aOqP9YkKj/Wo+o/1qNp/9bjKb/W46o/1uPqf9ajqn/V4yp/1SJ + qP9Phqf/SoOl/0Z+o/9DeaD/PnKc/zhsmP8zaJT/MmmT/zJrkv8xbJH/M26S/zh0lP88dpb/P3iZ/0F3 + mv9AdZr/PnOZ/ztwmf84bZf/MmeS/y1hjv8pXoz/K1+O/y5jkP8yZ5L/M2yR/zNtkf8zbZL/NW+U/zZw + lv83cJf/Nm6W/zJpkv8vZI//K1+L/yhcif8oW4j/KVuI/ylbh/8oXIb/KVyG/ypdhv8sX4n/Ll+L/ylb + iv8jV4f/HVSC/xxTgv8eU4P/I1eG/ylci/8rXY3/KlyL/yZah/8lWYb/Jl6H/y1njv8ybZP/M3CU/zNw + lP8yb5P/Mm6V/zNslf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wshNP8bWH3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8GEBf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w4cJP83cJL/OXGS/zpy + k/89dJX/P3WX/0B2mP9Bdpn/QniZ/0N7mv9FfZv/Q3yY/0F5l/9Ad5b/PXSV/zpwlf80aZD/L2SK/ytg + hf8sZIf/L2qL/zRwkP87d5b/QXyb/0R+nf9Ge5z/Q3aZ/z1ulP80ZY3/K12G/yRYg/8kWoX/JV2I/yVf + if8lX4j/K2GK/zBhif8wYor/LGGK/ydgif8pY4r/LmiO/zNukv87dpj/QXub/0eAnv9JgZ3/SoGc/0uC + nP9Mg53/T4Wf/1GHof9SiKL/Uoei/1KGof9ThqL/U4aj/1GFov9MgqH/RoCh/0GAof9Af6D/Qn+f/0GA + oP9BgZ//P3+e/z59nP89eJn/PXWX/z50lv9Bd5f/QnmZ/0J8mv9Cfpz/RYKf/0iFoP9KhqH/TYah/06F + n/9QhJ7/U4Wf/1OEof9Tg6L/Tn+g/0h7nv9AdJn/NmuU/y5kjv8qYI3/KmCN/y5kkf81bZT/O3OX/0B4 + mf9Ee5v/Rnyb/0d8nP9Hepz/R3mc/0V3nP9CdJv/PW+a/zlqmP82ZpX/MmSQ/y9ijP8uYYr/LWCH/y1f + hv8sXIL/KFR+/yJNeP8bRXP/FD5t/xdBcP8dSXX/I1F7/ylbgf8tYIX/MWWI/zNpiv80bIz/NW6N/zZu + jf81bI7/NGuQ/zZrkv82a5P/NGmT/zBlj/8pX4n/J12H/ypfif8uY43/MmeQ/zRpkv80aZL/MmaQ/y5j + jv8pXYr/JFeF/x5Qf/8fT4H/JFOG/ypbjP8uYI7/MmWN/zRnjv80Z47/NGaP/zRmkP8xY43/LmGK/ypd + hv8mWYL/JlmB/yZZgf8mWYL/J1qD/ylchf8rXYX/K16G/yxehv8tXYf/L1qJ/y5Xif8pUoP/I059/x9M + eP8hUXv/JVeA/yhdhP8tZIj/MmuO/zZxkv87eJX/P3yX/0R+mf9IgZz/S4Ke/0uBnv9MgZ//TICf/0uA + nv9KgZ7/SoKf/0mCoP9GgJ//RH+d/0SAnv9FgZ//SIKg/0mBof9KfqH/SXqf/0Rzm/84ZY7/KVV//xpF + cP8TQGv/Gklz/yZZgP83bY//PXWW/0N9m/9Jg6H/ToSi/0yCov9IfqL/RHuh/0J6of9EfaL/S4Kl/1KI + p/9Xi6b/W4yj/12Lof9eiqL/X4mk/1yHp/9Xgqj/TXqk/0BwnP82a5f/NnCY/zl4nP8/gKD/Soej/1KK + p/9Yi6z/WIqr/1eLqP9Zjqf/WpGp/1qSqP9XkKf/U42m/06Jpf9KhaX/RICj/z55n/84cZr/MGmT/ylh + jf8oXoz/K2CP/zFnlf83bpn/PXab/0iBn/9UiqT/WIyn/1mMqP9ZjKj/WY2n/1iMp/9Xjaj/V4+p/1iO + qf9Zjan/WYuo/1mMqP9ajaj/Wo+p/1iNqf9Vi6n/UYeo/06Epv9KgaP/Rn6h/0R5oP8+c5v/N2+X/zNr + lP8xapP/Mm2T/zNvkv84c5X/PHeX/0B6mv9EfJ3/Rnye/0V6nf9DeJ3/QXWc/z5xmv84a5b/MWSR/yxf + jf8qXYv/LWGO/zFmj/8xaY//MGqP/zBpj/8xa5D/MmuS/zRtlP8yapL/L2aQ/yxhjP8oXYj/JFiE/yRX + hP8kV4P/JVmE/ydchf8oXob/K2GI/y5ji/8wZI3/LF+M/yVaif8hVYb/HlGB/xxNfv8fUID/JFSF/ydX + h/8mWIb/JViE/yRZhP8oYIn/LmiO/zNvk/81cpb/NXGV/zRwlf81b5b/NW6X/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Dic8/xpXfP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p+/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Dx0l/zx1lv89dpf/P3iX/0J6mP9De5n/RHub/0Z8nP9Ifp3/SYCe/0qC + n/9Kg5//SICd/0R8mv9AeJj/PXOW/zdskf8wZYv/LWWI/y1oif8wbo3/OHST/z56mf9Efpz/SICf/0l9 + n/9Hepz/QHKX/zhsk/8xZY//K2CM/ydfif8lXoj/JWGI/ydhiP8pXob/K16F/ylghv8mYIb/JmGJ/ytm + jP8uaY//NXCT/zx3mP9DfZz/SICe/0qBnv9Lgp3/TIKc/02Dnf9PhZ//Uoii/1SJo/9UiKL/VYij/1WH + o/9Vh6T/U4ek/0qDov9Gg6P/RIOj/0WDo/9HhKP/SYSi/0eEof9GhaL/RoKg/0Z/n/9De5v/QXiY/z92 + lv89dpb/PXiX/z97mv9Df57/RoKh/0uFo/9PhqP/UYai/1CFn/9RhZ//UYSg/06Cn/9Kf5//RHmd/ztx + l/82bJT/MWiS/y1kj/8sY47/LmWQ/zRrlP87cpf/QHea/0J5mv9CeZr/Q3mb/0R4m/9Fd5v/QnWa/z5x + mv86bJn/NmiW/zNlkv8vYY7/LWCK/yxfiP8sYIf/LWCG/y1fhP8sW4P/KVaA/yFNef8bRnT/GUVy/xlG + c/8iUnv/KlyB/y9kh/81aov/N22N/zdujv82bY7/NmyO/zVtjf80a5D/N22S/zhulv83bJX/MWaQ/yth + i/8nXYf/KF6I/y1ijP8yZpD/NGiS/zRokv8zZ5L/MWWQ/y1ijP8mWYb/IFGB/x1Nfv8gToL/JFWG/yda + h/8qXYf/LWCH/y1gh/8uYIj/LV+I/y1eiP8sXof/KVuE/yZZgf8lV4D/JViB/yhbg/8oW4T/J1qD/yhb + hP8nWoL/KFiC/ypUgv8sUoT/KU6B/yRLfP8fSHb/Hkl2/yFOef8lVX7/KVyD/y9jiP81a43/OnKR/z13 + lP9Be5b/RX2Y/0h+m/9Kf53/TH+f/01/oP9Nf6D/S36e/0l/n/9If5//R4Cf/0R+nP9Dfpz/RH+d/0aC + oP9IhKH/SoOh/0uAov9LfKD/SHed/0JwmP81YYv/KFR//xtJdP8ZSXT/I1iA/y9li/85cZP/QHmZ/0d9 + m/9LgJ7/TH6h/0N4n/8+dZ7/PXWe/z94oP9GfaL/TYOk/1OHo/9WiKL/WIih/1qIof9bh6T/WISo/1J/ + p/9EdJ7/OWyW/zRslf82c5j/O3qc/0KAn/9Lh6H/Uoqk/1WKpv9Wiqf/WIun/1qOp/9bkaj/W5Op/1qT + qP9WkKf/UY2m/0yIpf9IhKT/Q36i/z53nv82bZf/LmSQ/yhdi/8sYY//MGaT/zhvmP8+eJv/R4Cf/1GH + pf9YjKn/Wo2q/1qNqP9bjaj/Xo6p/16Pqv9bjqr/WY2q/1qMq/9ZjKr/Wo2q/1iNqf9YjKj/V4qp/1SI + qP9Rh6f/TYOl/0l/ov9GfKD/Q3id/zx0mv83b5f/NnCX/zZxlv81cZX/OXWX/z14mf9CfJz/Rn+e/0qB + oP9MgKH/Sn+g/0h8n/9Fep7/Qnad/z5vmv84aJX/MGGP/ytdi/8rXon/LWKL/y5ljf8uZYz/LmeN/y5n + jf8uaI7/MGmQ/y9okP8sZY7/KmKM/ydeiP8kWoT/IFWA/yJXgv8lWoT/J16H/y1ji/8wZ47/MmqP/zJp + j/8wZo3/Kl+L/ydZif8kVIb/IU+C/x5Lfv8hToD/IVCB/yJTgf8jVYD/JVqD/yphif8wao//NXGU/zZz + lf82cpX/NG6S/zZulf8sWXr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NKDv/Glh9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8bWX3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8PHSX/PneX/0B5 + mf9DfJn/RX6a/0Z/nP9IgJ3/SoGe/0yCoP9Ng6L/TIOh/0yDof9Kgp//R36c/0J5mv8/dJj/Om6V/zRq + kP8waoz/L2yN/zRxkP87eJf/Qn6c/0Z/nv9JgJ//TH+g/0d7nf9Ddpv/PHGX/zZulv8yapP/L2mR/ytn + jf8rZoz/LWWM/y1kiv8qYob/JWGC/yRhhP8nY4f/K2eM/y9rkP82cZP/PHeX/0J9nP9HgZ7/S4Sf/0yE + nv9Ng53/ToSe/1CGn/9SiKL/U4mj/1aJpP9WiaX/Voik/1WIpf9OhaP/SIKi/0SBof9HhKT/Soem/0yI + pv9OiKX/Toij/02Go/9NhqP/S4Si/0mCof9GfZ3/QHmZ/zx2lv86dpb/PXmZ/0B8nf9FgKD/S4Oj/0+F + pf9PhKL/ToSe/06Env9Mgp3/SH+c/0R8m/8+dpj/OnKX/zdulf8za5T/L2eQ/y5ljf8vZo//NGuU/zpx + mv9Ad5v/PnaZ/z51mf8+dJr/P3SZ/0B0mf88cZj/OGyW/zZqmP80aJX/MmWR/y5hjv8sXon/LF6I/y1h + iP8wZIn/MWSK/zBiif8uXob/K1iD/yVTf/8gTnr/H055/yJRe/8qXIL/MWaJ/zdtjv86cZD/Om+R/zht + kP83bI//NWuP/zZtkf84bpT/OnCX/zhslf8zaJL/LWKN/yleif8oXoj/LGKL/zFmj/80aZL/NWmU/zZp + lP8yZpH/L2SO/ypeif8jU4L/Hkt+/x5Mfv8gT4D/I1WC/yZagv8oXIP/KV2C/yhbgv8oWoL/KFmD/yha + g/8qXIT/KFqC/yhag/8oW4P/K16F/y1giP8rXof/J1qD/yZYgf8pVoD/K1GA/ydJfP8iRnf/HUJy/xpC + cf8bRHP/H0p3/yRTfP8qW4P/MWSI/zhrj/87cpL/PnWU/0B4lP9De5b/RnuY/0h7mv9MfJ//Tn6h/09+ + ov9KfaD/SH2g/0Z+oP9CfJv/QXua/0F9m/9EgZ7/R4Kf/0qEof9Lg6H/TIKi/02Aov9Me6D/RnSb/z1s + lP8yYYv/KFiC/yFUfv8gVYD/KWKL/zRsk/88c5X/RHiW/0h5mP9Dd5r/PHGZ/zZtmP81bZj/OHGa/z53 + nv9Gfp7/S4Cf/0+Cnv9Sg57/U4Kh/1SDpf9TgKf/Rnaf/zttl/8xaJH/MWyT/zRylv87eZr/Qn+d/0uE + oP9RiaH/U4qi/1WLpP9YjKb/W4+m/1ySp/9dlKf/W5Wn/1mTqP9Uj6f/T4um/0uGpf9GgaT/P3mf/zhv + mf8yZ5P/LWKO/yxhjv8wZpL/NXCW/z14mv9Gf6D/T4am/1SJqP9YjKr/WYyp/1uMqf9fjar/YI6r/1yN + qP9ZjKj/Wo2q/1uPrP9aj6v/WIyp/1aKp/9Uh6b/U4em/0+Fpv9KgaP/R32g/0R6nf8/d5r/OnOX/zlz + l/86dZr/O3ea/z56nP9BfJ3/RH+e/0iBn/9MgqH/ToSj/1CEo/9Pg6L/S4Ch/0d8n/9EeZ7/QnWd/zxt + mf8zZJH/LF2L/yhbh/8nXIb/KF6H/ypiif8sZYv/LWaM/y5njf8vaI7/L2iP/y9okP8sZI7/KGCK/yVd + hv8jWoT/IlmC/yRchP8pYon/L2eO/zZvlf82b5P/Nm+R/zRtj/8wZ47/LV+M/ypZiv8nU4b/I06B/x9L + fv8fTHz/H1B+/yFUfv8lWoL/K2OJ/zJskP84cpX/OnOX/zhxlf83b5T/N26V/ytScf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xAvRP8bWH3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxafv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xo0Qv8/eZn/QnuZ/0R9mv9Hf5v/SoKc/0uDnf9NhaD/Toah/06G + ov9NhKH/TISh/0qCn/9If53/RHqb/0B0mv86b5b/Nm6T/zJukP8ycJD/OHWV/z97mv9Ff57/SYCf/0yB + of9Jfp//Rnue/0J4nf89dJv/OnOZ/zdymP82c5j/NnKW/zZwlP82bZP/NG2Q/y9rjP8paIf/JmOD/yhk + h/8rZ4z/MGyQ/zZzlP88eJj/QX2b/0eCnv9LhaD/TIWg/0+FoP9PhqD/Uoih/1OJo/9UiqT/VYql/1aJ + pf9WiKX/UIWj/0qCov9FgKD/RYKh/0iFo/9Mh6b/UYqo/1GKp/9SiqX/U4mj/1OIo/9Sh6P/T4ai/0qD + ov9Ef57/Pnqa/zx4mf87d5j/P3qb/0V9n/9KgKP/TIKi/0uBnv9KgZz/SYCc/0d+m/9DfJn/PniX/zp0 + lf86c5b/OnOX/zdwlv80a5L/L2aN/y5ljP80a5H/OnGX/zpxmP86cpf/OXGX/zlxl/85cZf/OnGW/zdu + lf81a5T/M2qU/zNplP8yZ5H/MGSN/y1hif8uYYr/MWWL/zNnjP82ao7/N2qP/zRmjf8xYor/LV2I/yhY + g/8lVoD/JleA/ytdhP8yZon/OW2P/z1wkv8+cZT/O26T/zhskv82a5H/NmuR/zlulf85bJX/N2uU/zRn + kv8tYYz/KF2I/ydch/8rYIr/MGaP/zNokf80aZP/NmmU/zZplP8yZZH/LF2L/yZUhP8gTH//Hkx9/yBP + f/8jVIH/JlmB/ydcgf8nXID/Jlp+/yVXfv8lVoD/J1iB/yhZgv8rXIT/K12F/y1fhv8wY4n/MmWM/zFk + iv8tYIf/LFuE/y9Xg/8vUYD/JEZ2/xs+bv8WO2r/Fz5t/xhBcP8cR3T/JFF7/ypbgv8yZIn/N2uO/ztw + kf88cZH/PXOT/0F2lf9Ed5f/R3iZ/0p5nf9Oe6H/THyj/0h6oP9EeZ//QXmc/z54mP88d5b/QX2b/0WB + nv9Hg6D/S4Wi/0yEo/9Og6L/ToGj/01+ov9IeJ7/QXKZ/zdpkf8tYYr/J12G/ydeh/8pYo3/MGmS/zdu + k/8+cZP/QnKU/z1wl/83a5X/LmWS/ypij/8vaJL/N3GW/z53mf9Eepr/SHya/0p9nP9MfJ//TXyk/0V2 + n/87bpj/MWaR/y9nkP8vapH/MnCT/zl1l/9BfJz/SYOg/0+Jov9SiqP/VYqj/1eMpf9aj6b/XZKm/16U + pv9clKf/WZOn/1WQp/9RjKb/TIem/0eCpP9Be5//OnKa/zRplP8vZI//LGKO/y5nkP80bpT/O3aZ/0R9 + n/9Mg6T/UIen/1WJqP9Xiaf/WYqo/12Lqf9cjKb/Wo2k/1iMo/9bjan/W46r/1qOq/9Yiqn/VYen/1KF + pf9QhKX/TIGj/0Z9nv9CeZv/PnaY/zt1l/85dJb/OnaY/z16mv9BfZ7/RYGh/0iDov9KhKH/TISh/0+E + o/9RhaL/UYWj/1GFpP9NgqH/SoCg/0d9n/9EeZ//PnGa/zRmkv8qXIn/JlqF/yRYg/8kWoP/KF+H/ytk + iv8uZ43/MWqQ/zJrkf8zbZP/MmyU/zFrk/8uZo//KWGK/ydeh/8mXYb/Jl6G/yliif8xapD/NW6U/zhx + lf84cZL/Nm6R/zRqkP8xZI7/L16N/ytWif8mUIP/IEt8/x1Lef8dTnr/HlJ7/yRagf8sZYn/NG2R/zly + lf87cpb/O3GW/zpvlf86bpb/KlFw/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/FT9b/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/HFp+/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HjtM/0B5 + mP9DfJn/RX6a/0iBm/9Kg5z/TYWd/06Gn/9QiKH/UIii/0+Hov9OhaH/S4Kf/0qBn/9HfZ7/QXac/zpy + l/80cJP/MnCR/zd0lf87eJj/QXyc/0eAn/9Mg6L/TIGh/0l+of9Fe57/QHmd/z14nP87d5z/O3ic/zx5 + nP8/e5z/QXqc/z94mv88dpf/OnaV/zVxkf8wa43/LGWJ/y9njP8xa5D/N3KU/zt4l/9BfJr/R4Kd/0yG + of9QiKP/UIij/1GIo/9SiKP/U4mk/1WKpf9ViaX/VYik/1OHpP9NhKL/R4Gh/0WBoP9Hg6H/SoWj/06I + pf9Si6b/VY2n/1aNpf9Wi6T/Voqk/1eKpP9UiKT/UIak/0mEov9EgJ//QHyc/z56mv8+d5r/Qnmc/0V7 + n/9GfJ3/RXya/0V8mf9DfJn/QnyZ/z95mP87dpX/PHaW/z13mP8+dpn/PHSZ/zlwlf80a5D/MmmO/zBn + jP80a5H/Nm2U/zZtlP82bpX/Nm+W/zdvlv85cZX/OHCU/zVuk/82bpX/NW2U/zRrkv8yZ4//MWaM/zJm + i/80aI3/OGyQ/zltkP86bpH/OW2S/zdpkP8yZI3/LV+K/yhZhf8mWYP/K16F/zFkif84aY3/PW6R/z1v + lP89bpX/OmyU/zZqkv81aZL/NWmS/zVok/81Z5P/MWOP/yxei/8mWYb/JFmE/yZbhv8qYIr/L2WO/zFn + kP8zaJL/M2eS/zVmk/8vXo7/KVSH/yJNgP8fS33/IE99/yVVgf8oW4P/J12C/yVbfv8kWn3/JFh8/yVW + fv8mV4D/KVqD/ytchf8uX4f/MWKJ/zJliv80Zoz/NWiO/zVljf80YIn/NlyI/y1QfP8hRXD/Fztn/xY7 + af8VPWv/GEBu/x5JdP8jUHr/KlmB/zFiiP83aY3/Om2Q/ztvkf88cZL/P3SU/0F1lf9EdZn/SHWe/0p3 + oP9Hd6D/Qnae/z51m/88dZj/OnSW/zx4l/9BfZv/RYGf/0mEov9LhaT/TYWk/0+EpP9OgqP/TH6h/0l6 + nv9Ac5n/N2yS/y5ljP8rZIz/KmSN/yxmj/8uZpL/MmeS/zVqkf82apL/N2qT/zJmkv8qYY//KGGN/yli + jf8xa5H/OXKU/zx0lf8+dJb/QnWY/0R1nf9Bcp3/Om2Z/zFnk/8uZ5L/LWmQ/y1rkP8xbpP/OHSW/z95 + mf9HgZ7/Toej/1GKpP9Vi6X/WI2l/1uPpf9ek6b/XZOn/12Up/9Zkaf/VY+m/1CLpf9Mh6X/SIKj/0J8 + n/87c5r/NGuU/y9mkP8qZI3/KWWM/y9skf83c5j/QHqe/0iAo/9Ohab/UYen/1SIp/9XiKb/WIql/1iL + pP9XjKL/WIyk/1qMpv9ajan/WIuo/1WHp/9ThaT/UIOi/0yAof9HfJ//QXec/z12mP87dJb/OnSW/zx4 + mf8+epr/QX6c/0aCoP9LhaT/TYek/0+Ho/9QhqP/UYah/1KGof9Th6L/Uoai/1CFov9NgqD/SYCg/0V8 + n/8+dJv/NWmU/yxfi/8lWYT/IVaA/yNagv8mXoX/K2OK/zFpj/80bpP/Nm+V/zdyl/83cpf/N3GY/zRt + lf8waY//K2OL/ydfh/8oYIj/K2SL/zBpkP80bZP/N3CU/zhwk/83b5T/NmyS/zNnkf8yYZD/LVqL/yZR + g/8fS3v/G0l3/xpMdv8dUnr/I1uB/yxliv81bZH/OnKV/z1zmP88cZb/O26V/ztslP8jRWT/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8VP1z/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8dWn7/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8dO0v/P3mX/0N7mf9Hf5v/SYKc/0uEnf9NhZ3/T4ef/1CI + of9RiaL/UYmi/1CHof9OhKH/ToSh/0yBof9Eepv/O3SW/zNxkf82c5P/OXaW/z56mv9Efp3/SYGg/0yD + o/9NgqT/SH+i/0N9n/8+e53/PXud/z17nf8+fJ3/QX2e/0R/oP9GgKH/RH6e/0J9nP9BfJv/P3mZ/zpz + lf82bZH/NGmQ/zNpkf81bpP/OXSW/z56mf9Ef5z/SoSg/0+Io/9UjKf/Uoql/1KJpP9UiqX/VIml/1WJ + pf9Uh6T/ToWj/0mDov9HgaD/SIKf/0mEof9Nh6P/UYmk/1SMpv9Xjqb/WY6m/1mNpv9ZjKX/WYul/1iK + pf9Viab/UIel/0uEo/9GgqH/Qnyc/0B3mv9Adpr/QHaa/0B3mf8/d5f/P3eX/0B5mP9Aepj/PXiX/z14 + l/8/epn/Qn2c/0N8nf9Ce53/P3eZ/zpylf83bpD/NGuO/zBnjf8xaI//M2qT/zVslf83bpX/OXKV/zx1 + lf88dJT/O3OV/zlylv85cpb/OXGW/zZtk/80ao//NWqN/zZrjv86bpH/PXKU/z1xk/88b5P/O26U/zZq + kv8yZI//K16K/yVYg/8oWoP/MGGH/zZmi/84aI3/OmqQ/zpqkv83aZL/NGeR/zFlkP8wY47/L2GO/y9h + jv8tX4z/KFmJ/yJUg/8gU4D/H1R//yJYgv8nXof/K2KL/y1jjP8uYo3/MGCP/zFdkP8qVYj/Ik2A/x1K + e/8eTnz/I1R//ydagv8nW4L/JluA/yRYff8jV3v/JVd9/ydYgf8qW4T/LF2F/y9gh/8yY4n/NGWK/zRm + iv81Zov/NmWN/zpkjf8yWYL/J0x1/x1Cav8bQWr/GkFr/xlCbf8bRHD/H0p0/yNQef8oVn//L16G/zRl + i/84aY//OW2R/ztwkf8+c5P/P3OU/0F0l/9FdJv/RXSd/0N0nf8/c5r/OnCX/zhxlf87dZf/P3qZ/0J+ + nP9GgqD/SoSi/0yFpP9Ph6b/T4Wl/06Do/9Lf6H/Rnmd/z50mf81bpP/MWyS/y5rkf8saZD/MGiR/zBn + kf8wZZL/LWSP/y9ljv8wZpD/LWSQ/yxkkf8sZpD/LmmR/zFrkf82b5L/OnKT/zpylP86b5X/Om6X/zZr + lv8xZ5X/LmeU/y5qlP8tbJT/MW+V/zVylv84c5b/PXaW/0N8mv9Kg6D/UYmm/1SKpv9XjKb/W5Cl/1yR + pv9ckqj/W5Kp/1iPp/9UjKf/T4ml/0yGpf9HgqL/QXuf/zpzmf81bJT/MGiR/ypmjv8pZoz/LGiO/zNu + k/88d5v/RX2g/0uDpP9PhaX/UoWl/1SHpv9ViaX/Vouj/1eMpf9ZjKb/WYuo/1eKp/9Uh6b/UoSl/0+B + ov9Mf6D/R3qe/0B0m/89c5r/O3OY/zlzlv89eZn/QH2c/0OBn/9GgqD/S4aj/0+Ipf9RiaX/Uoik/1OH + o/9Uh6L/VIah/1SGoP9UhqH/UYWg/0+DoP9LgJ//RXye/z92m/83bpb/LmON/yZbhv8kWIP/JFmD/yde + hf8tZYz/M2uR/zZvlP84c5f/OXSZ/zp1mf88dZv/PHWa/zdwlf8yapD/K2OK/yhgh/8rZIv/L2iP/zNs + k/82b5X/Nm6V/zZslf83a5X/NWiT/zJkkP8tXIz/JlSF/x5LfP8aSnf/Gk53/x1Ve/8kXYL/K2SJ/zNs + kf84cZX/PHGX/zxvlv87bZX/NGWQ/xUuRv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xRA + Xf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/x5dgP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x06 + Sv8+eJf/Q3ua/0d+nP9JgZz/SoOc/02Gnv9Qh5//UYmg/1KKof9SiaH/UYeh/0+Fof9PhKH/TYKg/0Z8 + m/89dpX/OHOT/zd0lf87d5j/QHua/0Z+nf9KgaD/TIGj/0qAov9HgKL/QH2e/z59nf8+fZ3/P32e/0J+ + n/9GgaD/SYKh/0qDof9JgqD/SIGf/0eAnv9FfZ3/Qnib/z1yl/85bZT/NWqS/zNrkv83cJX/O3aY/0F7 + mf9GgJ3/TIWi/1CJpP9Siqf/Uomm/1OJpf9UiKX/VIil/0+Go/9LhKL/SIKi/0mDof9Kg6D/TYWh/1GK + o/9UjKT/V42l/1mOpv9ajqb/Wo6m/1uNpv9ajKb/W4yn/1qKp/9WiKf/UIal/0uCov9GfZ//Qnia/z51 + mf89dJj/OnOX/zpylf87dJX/PXeX/z96mv9AfJr/QHya/0N+nf9HgJ//SoOi/0qCov9Hfp7/QXmZ/zxz + lP83bpL/M2qQ/zJpj/8zapL/NW2U/zlxlf8+dZT/QHiW/0B4lv8+d5f/PXaY/zx2mf88dJn/OnKW/zhv + kv82bZD/N22Q/zpvkv89cZP/PnOU/z1ylP87b5T/OW2U/zZpk/8wY4//LF+J/ylbg/8sXoP/MGGH/zNk + iv80ZIz/M2WN/zJkjv8vY43/LWGM/ytfiv8rXov/LF2M/ytbi/8nV4f/IFGB/xtMfP8aTXv/HVF9/yFX + gf8lW4X/J1yH/ydah/8pV4j/KlWI/yZShP8fS33/HEl5/x1Mev8gUXz/JVeB/ydag/8mW4L/I1d+/yJV + fP8kVX3/KFmB/ypbg/8rXIT/Ll+G/y9ghv8wYYb/MWKG/zFghv8yXof/MlyF/ytTev8hR27/H0Rr/yFH + b/8hSXL/I0x0/yNOdv8gTHX/H0x1/yRRev8qWIH/MWCJ/zRljP83ao//OW2R/ztvkv88cZP/PXKV/z9y + lv8/c5n/P3OZ/zpwlv84bpT/OHCV/z13mf9BfJz/RH+e/0eDoP9Jg6H/S4Sj/06FpP9Qhqb/TYOk/0l+ + oP9DeZz/O3OX/zZxlf80cJb/MnCV/zNulf81bJX/NGqU/zBmkv8tZI//K2ON/y9nkP8waJL/MWqU/zVw + l/83cpf/OHOW/zp0lP87c5X/O3OV/zlvlv8zaZL/L2aR/y1lk/8uaZb/MW6a/zNwmv83c5v/OnSa/zp0 + l/86dJX/P3eX/0R8m/9Lg6D/Uoik/1aKpP9YjKT/WY6m/1qPqf9Zj6n/Vo2o/1KKp/9Oh6f/SoOk/0V/ + ov8/eZ3/OnOZ/zVulf8xbZT/L2uT/yxqkP8saI7/MWyR/zlxlv9BeZz/SX+g/02Co/9QhKT/U4el/1SJ + pf9ViqX/V4um/1iLqP9Wiaj/Uoan/0+Dpf9MfqP/SXyg/0Z5nf9Bc53/O3Cb/zlwmf84cZf/PHeb/0B9 + nv9FhKL/R4Wj/0uHpP9OiKX/UImn/1OJp/9Viab/Voik/1aIo/9Wh6L/Voig/1SHnv9Shp//UISe/0uA + nv9Fe53/QHaa/zlvl/8wZpD/KV6J/yVahP8mW4X/KmCH/y9njf80bZL/OXKV/zt1mP88dpr/PXea/zx2 + m/89dpr/PHSZ/zdvlf8yaY//LGSK/ypiiv8vaJD/M2yU/zNrk/80a5T/NWqU/zVok/80Z5P/MWKP/yxc + i/8lVIX/HUx9/xlKd/8aT3n/H1h//yRghf8qZor/MGqP/zVvlP85b5b/O26V/zdpk/8wYo//FC1E/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GlB1/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Hl1//wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HDhJ/z53l/9Depn/Rn2b/0h/nP9Lgp3/Toae/1CH + n/9SiaD/Uoqh/1OJoP9Sh6H/UIWh/02CoP9Kf57/RXqZ/z90lf86cpP/OXOV/z55mf9DfJv/SH+e/0p/ + oP9KfqD/R36g/0F9nf9Afp3/P36d/0B/nv9DgJ//RoGg/0qEof9NhaL/ToWi/0+Gov9OhqL/ToSi/0uA + oP9He53/Qnaa/z1wlv84bZP/NGyU/zRtlf83c5f/PHiZ/0J8m/9HgJ3/S4Oh/0+GpP9Rh6T/Uoek/1GF + o/9PhaP/S4Oh/0eBoP9Jg6H/SoSh/02Gov9RiaP/VYuk/1eNpf9bj6b/Wo6m/1qOpv9bjaX/XI2m/1uN + qP9cjan/Woqo/1iIp/9Whqf/UIOk/0p9n/9Cd5z/PXSa/zpyl/82cJX/NW+T/zhzlf89eJn/QHyc/0J+ + nf9Ef57/R4Kf/0qEof9OhqT/T4ak/02Eov9Ifp7/QniZ/zxzlf83bpP/Nm2T/zZtlP84b5X/PHSW/0B5 + l/9EfJj/RX6Z/0J7mP9AeZj/P3mb/z94m/89dZn/O3KV/zhvkv83bpH/OG+R/ztxk/88cpP/PXKU/zxx + lP86b5T/OGyV/zVok/8xY43/LmCH/yxeg/8sXYL/LV6G/y9giP8uYIn/K2CJ/ytgiv8pX4n/J16H/ypf + iv8sX4z/K12L/ylaiv8iUoP/G0t8/xlKev8cTXz/H1N//yJXgv8kV4T/I1SD/yJPgf8iToD/H0t9/xxJ + ev8YRXX/GEZ2/x5Oe/8kVYH/KFmF/ydZg/8kVoD/IVN9/yNTfv8nVoD/KFaB/ylYgv8pWYL/K1yC/ytc + gf8qWYD/KVaA/ylUgf8mUHr/IUpx/x9Ga/8jS3D/J090/ypUef8tWH7/K1d8/yRQd/8eSnL/HUp0/yRS + fP8qWYT/L1+J/zJji/81Z47/OGqQ/zptk/86bpL/O3CT/ztxlP85b5T/N22T/zVtkv84cZX/PHeZ/0J9 + nf9GgZ//SIKg/0mCof9KgaD/TIKi/02Do/9MgqT/R36g/0B4m/86dZj/N3WZ/zd1mv84dZv/PHSb/z1y + mv84bpf/MmiT/y5mkP8uZ5D/MWuS/zRulf84c5j/PHeb/z96nv9DfZ3/Qnub/0F6mv9BeJv/PHKX/zVr + k/8tZY//LGaR/y9rlv8zcJv/OXWf/zx3n/87dp3/OnSZ/zhylf87c5X/QHeX/0d+nf9OhKL/Uoak/1KH + pP9TiKX/VIqn/1eNqv9VjKn/T4en/0uEpv9IgaX/Qnuh/z13nf85c5r/N3KY/zZxmP81cZf/M3CW/zNu + k/8zbZH/OHCV/zxzl/9Depv/Sn+g/02Co/9QhaT/UYel/1KIpf9Th6X/Uoam/1CFpf9NgqX/Sn6j/0Z6 + ov9Cd5//P3Wc/zxxmv83bZn/NWyW/zdxmf8+eZ7/RIKk/0iGpf9LiKX/Toqn/1CJp/9Siaf/VYqo/1eK + qP9Yiqb/WIml/1mJo/9WiKD/VYif/1OGnf9QhJ3/S4Cd/0d8nP9DeJz/PXKZ/zVqk/8sYYz/J1uH/ydc + hv8sYYn/MWmN/zZvkf87c5X/PXWY/z53mf89eJr/PneZ/z11mf89dZj/PHOX/zduk/8yaZD/L2eP/zBp + kv8waJD/MGiQ/zFokf8xZ5D/MWaQ/zBkj/8vYI3/K1uK/yRUhP8cTHz/GUp5/xpPev8gWYH/JWGG/ypn + i/8ua5D/Mm2T/zZulf83bJX/NGeT/y5hjv8TLET/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8bWH3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8hXoL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8cOEn/PXSW/0F4mf9Ee5v/R36d/0uBnf9OhZ//UIeg/1KIoP9TiJ//U4eg/1OHo/9RhaP/TICg/0h9 + nf9DeJn/PXGU/zpukv86cJT/P3aY/0Z7nP9Kfp//S3+h/0h9oP9Be5z/Pnub/z59nP9AgJ7/RIKg/0eE + oP9KhaL/Toei/1KIpP9UiqT/VImk/1OIpP9Th6T/UIOh/0t+nv9HeZz/QHKX/zlulP82bZT/NG2V/zVx + mP84dZr/Pnmc/0J8nP9IgJ7/S4Kg/06Eov9PhKL/TYKh/0qCof9HgaD/SIKg/0qDoP9NhqL/UImj/1WM + pf9Yjqb/W4+m/1uPpv9cj6b/W42l/1yNpv9cjaf/XY2o/1uMqf9biqn/WYio/1eGp/9Ug6b/TH6i/0J3 + nP87cpn/NW6W/zFrkv80bpP/OHOY/z56nP9Bfp7/Q3+f/0eCoP9KhKD/Toah/0+Hov9PhqL/T4Wi/02D + of9If57/Qnia/zxyl/85b5X/N2+V/zlxlv89dpj/Qnua/0Z/nP9Hfpn/Rn2X/0J7l/9Ce5r/QXqc/0B5 + nP88dJj/OHCT/zZtkP83bpD/OXGS/ztyk/88c5T/PHKU/zxxlP86b5X/OGuT/zRnkP8xYon/LF6G/ypc + hP8pXIX/K1+H/ytfif8qYYn/KWGJ/ydhiP8qYor/LGOL/y1kjf8uYo7/LF+N/ydYif8gUIL/G0p9/x1M + fv8gUYH/IlWC/yJVgv8iUoL/IlCA/x9Mff8eS3v/HUp6/xlHdv8WRHT/G0p5/yJSgP8nV4X/KlqI/yZX + g/8iVH//IFB8/yFQe/8jUHz/JFF9/yNRe/8kUnr/JFJ6/yJOef8gS3j/IEt3/x9Jc/8cRm3/JE1z/ylS + dv8tWHr/NV+D/zVhhP8xXoH/KFV5/yFNdP8dS3P/HUp1/yNRfP8mV4D/KluE/y5fif8yZI3/NWeP/zZp + j/82a4//N22Q/zVqj/80ao//Nm2T/zhxlf88dpn/QHuc/0V/nv9IgZ//SICe/0l/oP9KgKH/S4Gj/0h/ + of9DfJ7/Pnib/zp3mv85eJv/Onmd/0F7n/9DeqD/Q3ee/z1ym/83bpb/MmqS/zFpkv8ybJT/N3KY/z55 + nP9BfJ7/RYCg/0mDo/9Mg6P/S4Gh/0d9n/9BeJv/OnGX/zRtk/8xa5P/L2qT/zZxmP87d53/P3qh/z96 + of87dZ3/OHGX/zdvlP89c5f/RXuc/0yBof9NgqP/ToOk/06Do/9PhaT/UIel/06Hpv9IgqT/Q32i/0F7 + of8/eKD/PHWd/zt1nP87dZv/O3ac/zt3m/87dpr/OXSY/zlzl/85cZX/OnKV/z91mP9DeZv/SH2f/0uA + of9LgaH/TIKh/02Cof9JgKD/SH+g/0d9of9FeKD/Q3ig/0B3nv88dpr/OnKZ/zZul/80bZb/NXCY/zx5 + nv9EgqL/SIWl/0yJp/9Piqf/UYmm/1SJp/9Wiqj/Woup/1uMqf9aiqb/WYmk/1iJov9Wh6D/VIef/1CG + nv9Mgpz/SX+d/0Z8nf9Dd5z/Om6X/zJlj/8rXor/KFuH/yxgif8xZ43/N2+R/ztzlP8+dpb/P3eY/z93 + mP8/dpf/PnaX/z51lv88c5b/OW6U/zVrk/8xaJH/LmaP/yxjjP8rY4z/LWSN/y1kjf8tY4z/LmKL/y1f + iv8qXIj/JVeD/x9Qfv8bTXv/G098/x5Vgf8kX4f/KWaM/y1qkP8xbZP/NW6V/zNolP8xYpL/K12M/wsb + Kf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xtXff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/yFe + gf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xw4Sf89c5b/P3aZ/0J4m/9Ge5z/SoCf/0yC + n/9PhaD/Uoag/1KGoP9ThqL/U4ak/1GEo/9NgKL/R3ye/0B1l/85bpP/N2uR/zlvlP89c5j/Q3ec/0l8 + n/9KfaD/RHye/z96m/88e5r/P36d/0OBn/9IhaH/TIej/0+JpP9TiaT/V4ul/1iMpf9Xi6X/V4ql/1aI + pP9UhKL/UIGg/0t8nv9Edpr/PHGW/zZuk/81b5X/NnGX/zh0mv85d5z/PXmc/0J7nf9IgKD/TIGh/0yC + of9IgaD/R4Cf/0eBoP9JgqH/S4Sh/06Hov9Ti6T/Vo2m/1qPp/9ckKf/XZCm/1yPpf9cjab/XI2n/12N + qP9cjKn/XIyp/1qJqP9Yh6f/VoWm/1KDpf9IfKH/QHac/zhxmP8zbZT/MWuS/zRulP86dpv/P3qd/0J9 + nv9GgJ//SYKg/02Fof9PhqH/T4ag/06FoP9OhKH/T4Wi/0yCov9HfZ//QXib/ztymP83b5b/OHGX/zx2 + mf9DfJ7/Rn6e/0d/nP9FfZf/Rn2V/0Z9mf9FfZz/Qnqc/z53mv86cpX/Nm6R/zVtkP82b5H/OXKT/ztz + lP88c5T/PXOV/zxxlv87bpX/N2mS/zFijP8rXIb/KVqF/yhchv8rX4r/LWKM/y1kjP8rZYz/K2aL/y5p + jv8wao//MGmQ/zJnkf8xZZH/LF6N/yVXiP8hUYP/IE+C/yNUhP8mWIb/JliG/yRVhP8kVYL/IlJ//yJR + f/8hT37/Hkx8/x1Le/8cSnr/H05+/yRUhP8nVob/J1eF/yJSgP8eTnv/HUt3/x1Kdv8dSnb/HUp1/xtI + cv8ZRW//GUJv/xtFcv8cRnH/GkVv/yNPdv8rVn3/MVyA/zZjhP88aIn/PGqL/zVkhf8uXH7/J1Z6/yNR + eP8gTnf/HUt1/x9Oef8kVID/KFmF/ytch/8uX4n/MWOL/zFljP8yZYz/M2eN/zRpkP83bZP/OnGW/zt1 + mP8/eZn/Q3ub/0V9nP9GfZz/R36e/0h+oP9GfaD/RHye/0B5m/87d5r/OHeZ/zh4mv9Bfp7/R3+h/0uB + o/9IfqL/Q3me/zxzmv82bpb/M2yU/zRtlf84cZj/PXib/0WAn/9Jg6H/Toek/1GIp/9Th6f/T4Ok/0p+ + oP9De5z/PneZ/zhzl/83cJb/OHCW/z12m/9AeqH/QHuj/0B6ov86c5z/OG+X/ztxl/9CeJz/Rnug/0l+ + ov9JfqL/SX+g/0qAoP9JgaD/RH6h/0B7oP88eJ3/O3ed/zx2nv8+d5//QHme/0F7n/9CfaH/Q32g/0J7 + n/9BeZ3/Pnaa/zx0l/87cpX/O3KV/z1yl/8/dJn/Qnib/0N5m/9EeZz/Qnqb/0F6m/9BeZz/Qnmf/0J4 + n/9CeZ//QXue/z95nf87d5v/OHKZ/zhxmf83c5n/Onic/0B9oP9Gg6P/S4el/06Hpf9Qh6X/U4im/1aK + qP9Ziqn/WYup/1qKp/9ZiaX/WIij/1eJof9WiaH/Uoig/0+Fnv9Ng5//Sn+g/0V6nf8/cpn/N2mT/y5g + jP8rXYj/K16H/zBki/82bI//O3KT/z52lf9AdpX/QHaV/z92lf8/dZX/PnSW/zxylf84bZT/M2iT/y5l + j/8rYov/KWCJ/ylhiv8qYYn/LGOK/y1kiv8sYon/LGCH/ypdh/8nWoT/JFeC/yJUgf8fUoD/IVaE/yRc + if8oY43/LGmQ/y9sk/8xaJT/MWST/y1dj/8lVob/CBQf/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8BBQf/G1l9/xpYff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/JGGD/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/HThK/ztxlP88cpf/QHWZ/0N4nP9Ge53/S3+f/06BoP9Qg6D/UIOf/1CDof9Qg6L/T4Kj/0t/ + ov9EeZ3/PHGW/zVrkf8zaI//NWqR/zlvlf8+dJn/Qnib/0N5nf9Aepv/Pnub/z58nP9BgJ//R4Sh/0yI + o/9Qi6X/U4ql/1aLpv9ajaf/Wo2m/1qMpP9Zi6P/WIii/1aFov9SgqP/Tn6f/0d4m/8+c5j/OXCV/zdw + lP83cpf/N3SZ/zd1mv84dZz/PXie/0N7nv9If6D/SICg/0eBoP9GgJ//SIKh/0qDov9NhaL/UYij/1WL + pP9YjaX/W4+n/1yQp/9bj6b/XI6l/1yNpv9djqj/XY6p/1yMqf9bi6r/WYio/1aFp/9Tg6X/TH+j/0V7 + oP8+dpz/OXKa/zVvl/80bpX/N3KZ/zt2m/9AeZ3/Qn2d/0iBn/9NhKH/UIah/0+Fn/9OhJ7/ToSe/1CF + of9PhaP/TYOj/0l/of9Eep7/P3ec/zpymf83cZj/O3Wb/0B6nf9FfZ//R36c/0Z9mf9Hfpf/SX+Y/0mA + m/9FfZz/QXma/ztzl/83b5P/NGyQ/zZukf84cZP/OnOU/zx1lf89c5b/PXGX/z1ul/84aZP/MWKO/ypb + iP8mWIX/J1uH/ypeiv8vZI7/MWqR/zBskP8xbZD/M2+R/zRwkv81b5P/Nm2T/zNnkf8vYo7/KlyL/yVW + h/8kVob/JlmH/ypdiv8rX4r/Kl6J/ylchv8qW4f/KluH/yhZhf8kVIH/IVCA/yBOf/8eTH//IE6B/yNR + gv8jUYH/IVB//x1Mef8aSHT/Gkdy/xlFcP8ZRXD/FkFs/xM9af8UPWn/GEJu/xtFcP8gTHb/Kld//zJg + hv84ZYj/O2qL/z9vj/8/cI//O2uL/zVmh/8wYIP/K1p//yVUe/8gUHj/Hk55/x9Qff8iVIL/JVaD/yhY + hP8rXIb/LV6I/y5giv8xY43/NWiR/zhsk/86cZb/PHWX/z94mf9BeZr/Q3qa/0V7nP9Ge53/RXue/0N7 + nv9AeZ3/PHeb/zh2mf82dZf/PHua/0aBn/9NhKP/TYSk/02Dpf9Jf6L/QXid/zpymP81bpX/NW6U/zhy + l/88dpv/Q32e/0uEof9RiaT/VYun/1aLp/9Wiaj/UoWk/0yCoP9Gfp7/QXmb/z51l/89c5f/PXSa/z92 + nv9CeqP/QXqj/z52oP86cZv/OnCZ/zxymf8/dpv/Qnid/0N5nP9DeZr/Q3qa/0F5nP8+eJ3/PHed/zp4 + nf86eJ3/PXif/0F7of9EfaL/SIKl/0mEpf9IgqT/R3+i/0Z9oP9CeZz/PnaZ/ztxlf85bpT/OGyT/zht + lP84bpT/OnGW/zpylv86c5f/OnSY/z52nf9AeJ//QXmf/0R9oP9FfqH/RH6h/0J8oP8+eJ3/PHWc/zp1 + nP86d5v/PXqc/0OAn/9JhKL/TYak/1GHpf9UiKb/Vomo/1eKqf9Xiaj/WImn/1iIp/9Xh6X/Voik/1aL + pP9ViqL/Uoeh/1CFof9NgqH/SX2g/0J2m/85bJT/MGKM/ypdh/8rXof/L2OJ/zRojf86b5H/PnOT/z91 + lP8+dJP/PnST/z90lP8+c5T/OW+U/zZqkv8xZZH/LGCM/yheiP8nXof/KWCI/yphif8tZIr/L2aL/y9m + iv8vZIn/LmKI/yxgh/8qXoX/KFuF/yZahf8lWoj/JlyK/yZfjP8oZJD/LWWT/y9ilP8vX5P/KFiL/x9Q + gf8GEx7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcVIP8bWH3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8eXH//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8cOEr/N26U/zhvlP86cJb/P3Oa/0N3 + nP9Hep7/S36f/0x/nv9NgJ7/TYGf/06BoP9LgKH/Rnuf/z50mv82bZP/MWmQ/y5ljv8vZo//NGuS/zlx + lf89dZj/PXaY/z15mf8+fJv/QH6d/0SCoP9Kh6L/UIym/1OMpv9WjKb/WY2m/1uOpv9cj6X/XI2j/1mJ + ov9ZiKH/WIej/1SDpP9Of6D/R3mb/0B0mP86cZb/OXKX/zhzl/83c5f/N3OZ/zdzmv85dJz/Pnee/0B6 + nv9CfZ//RX+f/0eBoP9Jg6H/TYSi/0+Ho/9TiqT/Voyl/1qOpv9ajqf/W46m/1qNpf9bjab/W42n/1yN + qP9cjar/W4yr/1mJqf9Whqj/U4Om/06ApP9IfqP/Q3qh/0B4n/88dZ3/N3KZ/zZymP83c5r/OnWb/z54 + mv9DfJz/SYGe/1CGov9RhqH/UISe/06DnP9OhJ7/T4Sh/1GGpP9Ng6T/S4Ci/0d8oP9DeZ7/PXWb/zpz + mv87dZv/Pnid/0R7nv9GfJ3/SH6c/0l/mv9KgJn/SoGa/0mAm/9Ee5r/P3aY/zlwlf83bpL/N2+S/zhx + k/87dJX/PHWW/zx0l/88cJj/OmyX/zZolP8wYY7/KlyK/yZYh/8lWIf/KV6L/y1kj/8xa5L/NXCU/zZy + lP83dJT/N3SV/zlzlv84cJX/NmuT/zJmkP8uX4z/KVuK/ydbif8pX4v/K2ON/y5ljf8uZIz/L2SN/zFl + jv8yZY//LmGM/ypbiP8lVIX/H01//x1Kff8dS33/HUt9/x5Lff8eS3v/HEh2/xtHc/8aRnH/GUVv/xlF + cP8XQ27/FD5p/xhCbP8bRXD/IEt1/yhWf/8wYIb/NmaL/zpqjP89bo//PnCP/z5xj/8/cpH/PXCR/zdq + jP8yY4f/K12B/ydYf/8kVX7/IlSA/x5Qff8hUn7/I1N//yVVgf8oWIT/K1uI/y9gjP80ZpL/N2uT/zpx + lv88dJf/PneY/0B4mf9CeJv/Q3mc/0R5nv9CeJ3/P3ec/zx2m/84dJr/NXSY/zh2l/9AfJn/SIKd/02G + ov9PhqT/T4am/0yDpP9GfaD/P3eb/zhwlv81bpP/N3CV/zt1mf9Ce5z/SYGg/1GJpP9Wjab/WI2n/1mM + p/9Wiqb/Uoej/02Dof9HfZ3/QneZ/z5zl/88cZj/PnSc/0F4of9BeaL/Pnag/zlwm/82bZf/NWyU/zdu + lf85cJX/OnKV/ztzlP88dJb/O3WX/zp1mv88d53/PXmf/z56oP9CfqP/RH6k/0eBpP9Lhaf/Toep/02E + pv9LgaT/SH6h/0V7nv9Adpr/O3CW/zdqk/81Z5H/MWaP/zFoj/8zapH/NG2S/zZwlf86dZr/Pnie/0J6 + oP9FfKH/R3+h/0mBov9Jg6X/SIKk/0R9of9Bep//PnWc/z12nP8+eJv/Qn6e/0iDof9NhqP/UYim/1SJ + p/9Viaf/VYin/1aJqP9Xiaj/Voio/1aIpv9WiaX/V4ql/1aKpP9UiaT/UYaj/06Dov9MgaH/Rnqd/z1w + lv8zZo3/K16G/yldhP8tYYf/M2iM/zhtkP88cZL/PHKR/zxykf89c5D/PHGQ/ztukf84apH/NGWQ/y5h + jP8qXYn/JlqG/yhdh/8qYIn/LGOK/zFojf8zao3/NGuN/zRqjP8zaYz/MmeL/zBliv8tYor/Kl+K/ydd + iv8lXIr/JFyL/yddjf8rXZD/LVyR/ypZj/8lVYn/Hk6B/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/CBUf/xpYfP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/yNggv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xw4S/80bJL/MmmQ/zNokf83bJX/PXGZ/0N2nf9Gepz/SXyc/0p9m/9Lf57/S3+f/0d9 + nv9AeJr/OXGX/zNsk/8uaJD/K2SO/y1ljv8xaZH/Nm+U/zpzlf88d5X/PXqX/0B/mv9Dgp7/R4Wi/02K + pf9Sjaf/VY6o/1iOqP9aj6f/XJCn/16Qpf9cjKL/Woqh/1mJov9aiaX/VYSk/01+oP9EeJv/PnOX/zty + lv87c5f/PHaa/zt2mv83c5f/NnGX/zZwmP85dJv/Onec/zx7nv9Cf6D/R4Kh/0qEov9OhqP/UYik/1SK + pf9Xjab/WY6n/1qOp/9ZjKb/WYyl/1mLpf9ajKf/Wouo/1uMqf9Ziqr/V4io/1OEpv9OgaT/SH6i/0V9 + of9DfKL/Q3ui/0B6oP87eJ3/N3WZ/zVzmf84c5n/PXaZ/0V8m/9Mg5//UIWg/1KHof9Shp//T4Se/0+E + n/9QhaL/T4Sk/06Dpf9MgaP/SX2g/0V6nf8/dpz/O3OZ/ztymf8+dZz/Q3mf/0R6nf9GfJ3/SH2b/0l+ + m/9Kf5v/SX+b/0V8mv9BeJn/PHOX/zlwlf82bpL/OHGU/zpzlv87dJf/O3KX/zpvmP85a5j/NGaV/y9h + kP8oWor/JFeH/yRYiP8nXYv/LGOP/zBqkf80cJP/NnOU/zh1lP85dZb/OnSW/zlxlv83bJT/NWeQ/zFi + jf8qYIv/J2CK/ylkjP8sZo7/LmiN/zFpjv8za5D/NWyR/zVrkv8zZ5H/LWCN/yZXhv8fTX//GUZ5/xhF + eP8ZRnj/Gkd4/xxJeP8dSXb/Hkp0/xxIcf8bSXL/G0lz/xpIc/8cSHP/H0p0/yJNd/8lUXv/K1qC/zJj + if82Z4v/OWyN/zxujv89cI//PHGP/z1ykP8+dJP/PXGS/zZqjP8xZYj/LmGG/ytehv8nWYT/I1SA/x5O + ev8fTnv/IFB9/yJSgP8nV4X/LF2L/zFjj/81aZT/OG6V/zpzlv89d5b/PneW/0B3mP9DeJz/QXec/z50 + m/87c5v/OHGZ/zZxmf82cpj/O3eW/0F7mP9IgZz/TIWh/1CIpf9QiKX/T4Wl/0qBov9FfZ7/PXWZ/zhw + lv84cJX/OnKX/0B5mv9Hf5//Toai/1WLpP9Zj6b/WY2m/1iMpf9WiqT/Uoek/0uCof9Fepz/PXKV/zpu + lf87cJn/P3We/0B2of88cp7/NmyZ/zBnkv8sY43/LWSN/zFojv8ya4//NW+R/zdxlP83cpb/OXWa/zx4 + nv9AfKH/RX+j/0mCpP9Jgqb/R4Gl/0qDpf9Nhaf/T4Sm/02CpP9JfqH/Rnyf/0B0m/87bZf/NWaS/zBj + jv8tYoz/LWSM/zBoj/8zbJP/N3GX/zt2nf9CeqH/R36i/0qAov9KgaP/TIOk/02Fpv9MhKf/SoKl/0Z9 + ov9CeZ7/P3Wc/z92nP9DfJ7/SYGh/1CIpf9Tiqb/U4qm/1OIpv9Tiaf/VYmo/1aKqv9WiKj/Voin/1eJ + pv9Xiaf/V4qm/1aJpv9ShqP/T4Oi/0yAov9IfJ//QnWa/zhrkP8vYoj/K16E/yxghf8yZov/N2uQ/ztw + k/86cJH/Om+P/zlujv85bY3/OWqP/zdlj/8wYIz/KluI/yZXhf8nWob/KF2J/ypgi/8wZo3/NWuQ/zhv + kv85cJL/OnGR/zpwkP85bo//NmqO/zJnjf8uZI3/KV+K/yNaiP8iWYn/JliK/ylXjP8pVoz/JlWL/yJR + h/8cTIH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8MIzb/Glh9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/IF6A/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HDlM/zRslP8vZo//LGKM/zBm + j/82apT/PXGY/0J3mf9FeZn/R3ub/0l+nf9Jf57/Qnqc/zx2mf82cZb/Mm2U/y5qkv8taJH/LWiR/zFr + kv82cJT/O3aW/z96mP9Cfpn/RYOa/0eGnv9MiqP/UY2n/1WPqv9Zkav/W5Cp/12Sqf9ek6j/XpCl/12O + o/9bi6L/Woqj/1iIpf9UhKT/TH6f/0V3m/8+cpb/OXCT/z11mP9AeZz/QXud/zx2mv82cJX/NW+W/zd0 + m/84d53/Onqf/0J+of9HgaP/S4Wj/06Go/9RiaT/VIum/1aNpv9Yjqf/WY2n/1iLp/9Yi6b/V4qm/1eJ + pv9XiKf/V4in/1WGp/9ShKb/T4Kl/0p/o/9EfaH/Q32h/0V+o/9Gf6T/RYCk/0F/ov88ep7/N3Sb/zRx + mP86dpn/Qnub/0yCnP9QhZ//Uoef/1KGn/9QhZ//T4Sg/06Dof9OhKP/ToKj/02Aof9Kfp7/Rnmc/0B0 + mf88cZj/OnCY/z1ymv9AdJz/Q3ee/0V4nP9GeZv/SHyb/0h9mv9HfJr/RHqb/0J5m/8/dpv/O3KX/zhv + lP83b5P/OHCT/zdxk/83b5T/N22V/zZqlv80Z5T/L2KR/ylbjf8jV4n/IliI/yRbiv8pYY3/L2mR/zNv + k/81cpT/N3SU/zh1lf86c5b/OnGW/zhslP81Z5D/L2SO/ylii/8iY4r/J2SM/ytnjf8uaY3/MWyN/zRu + kP82b5H/Nm6T/zRqkf8vY47/J1mI/yBQgP8ZR3r/E0B0/xZDdf8aR3f/Hkt4/yFOef8jUHr/IU94/x1O + eP8dTnj/H095/yFQef8lUnz/J1R9/yhWgP8rXIT/LmCI/zJliv82aYv/OW2M/zpujP86b43/OnGP/zty + kP87cZD/O2+Q/zVpi/8zZov/MmSL/y9giv8rWoT/JFN+/x5Nev8bS3j/Hk59/yNTgf8oWIf/LF6L/zFl + kP81a5P/OXCU/zp0lP86dZT/OnOT/zx0lv89c5n/OnGZ/zhwmf81b5j/M3CY/zh1mP89eZj/QnyY/0eA + m/9Lg5//Toai/1CIo/9Ph6P/TYWi/0mBoP9De53/PXWZ/zlxlv87cpf/PnWY/0V7nf9LgqD/UYii/1aM + pP9ZjaX/WIyk/1aKpP9TiKT/ToWl/0d9nv9AdZn/Om6U/zdqkv84bZf/OG6Z/zdsmv8yaZT/KmKM/yZd + h/8nXof/K2KJ/y9njf81b5P/OHKW/zl1mf87d5z/P3uf/0V/of9MhaP/Toak/02GpP9KhKT/SYOk/0yE + pf9OhKX/TYKl/0qAo/9FeZ//P3Gb/zlplv8xY5D/LGCM/ypfiv8tY43/L2eQ/zNtlf84c5r/P3mf/0Z+ + o/9NgqX/ToOl/0+EpP9Phqb/T4am/0+Fpv9NhKb/SYCj/0V7oP9CeJ7/QHac/0F3nf9HfqH/Toak/1OK + p/9SiqX/Uoml/1OKp/9Vi6r/Vour/1aJqf9WiKb/Voin/1eJp/9YiKn/VYem/1KFpP9Pg6L/TICh/0l8 + n/9Ddpr/PG6T/zRmi/8uYIb/LmCG/zBjif80Z43/OGuR/zhskP83ao7/N2mM/zdojP83Z47/MmGL/ypa + h/8lVoP/JVWD/yZZh/8pXYr/LmKN/zNpkP85b5P/PHOU/z51lf9AdZX/P3WU/z1xk/86bpH/NWmQ/zBk + jv8rYIr/JVuI/yJXhv8iVIb/JVKH/yJRhv8gToT/HUyC/xdBb/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/w0oPv8aWX7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8kYoT/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8cOEv/M2yU/y9nkP8sZI3/K2GM/zBljv83a5P/PnKV/0F2l/9DeJn/Rnyb/0N6 + m/8/eJj/OXSX/zZxl/80cZf/Mm+X/zFulv8ybpX/M2+V/zlzl/8+eZr/Qn+c/0eEnf9Jh57/TIyg/1CO + pP9WkKj/WpOu/1uTrf9ckqr/XpOo/2CVqP9gk6b/XpCk/1uMpP9XiaP/VYek/1GCo/9LfZ//RHeb/z1x + lf89c5b/QHeZ/0R9n/9FfqD/Qnqd/z11mf85c5n/Onac/zt4nv8+e6D/Qn+i/0iCo/9MhaT/T4ek/1CI + o/9TiqX/VYym/1eMqP9XjKj/Voqn/1aJpv9UiKb/VIel/1SGpf9ShKT/UIGj/02Ao/9JgKP/Rn6i/0N9 + ov9FfqP/R4Ck/0iCpf9JhKb/R4Ol/0J/o/89eZ7/OHWb/zR0mP88eZn/RX6b/02Cnf9Shp7/UYWf/1CE + n/9Og5//TIKh/02Cov9OgqH/T4Cf/0x8nP9IeZr/QXSY/z1xlv86bpf/Om6Y/zxwmf8/cpr/QnSb/0R3 + mv9FeJn/RXmY/0V5mf9DeZr/Qnid/0B3nf88c5v/N22W/zVtkv80bI7/M2yM/zRtj/80a5L/NGqU/zNn + k/8wY5H/Kl6O/yVbi/8iWIj/IVqI/yVfiv8qZo7/Mm6S/zVxlP83dJb/OHWX/zl0l/85cZf/OG6V/zVp + kv8uZY7/JmOL/yVji/8mZI3/K2aP/y5ojf8xa43/M26N/zZukP83b5L/NWyS/zBmj/8qXIn/I1KD/xxK + fP8YRXf/F0R1/xtId/8iT3z/KVaB/ypZgv8lV4D/IVV+/yBTff8hU33/JFR9/ydXgP8pWIH/KluE/ylb + hP8rXYX/LWGI/zJmif81aor/NmuK/zdsi/83bYz/N26N/zhujf84bY3/N2uM/zRoi/81Z43/NGWN/zJh + i/8qWYP/IlF9/x1Mef8cS3n/H09+/yNTgv8mWIX/LF+L/zJmj/81a5H/N2+S/zZwkP82cZD/N3GT/zhw + lv83b5b/NG2W/zFslv8zcJj/OXaZ/z97mf9Ff5z/R4Gd/0mDnf9NhqD/T4ii/1CIo/9OhqP/S4Oh/0d/ + n/9Cep3/Pnaa/zxzmP8+dJj/Qnib/0h+nv9OhKL/VImk/1eMpf9YjKT/Voqj/1OHo/9Og6P/SX2g/0J2 + m/87b5X/NWmS/y9jkP8vY5L/L2WS/y1kj/8pYIn/J16I/ydeh/8qYYj/MmqQ/zdylv87dpr/PXmf/0B8 + oP9EfqD/S4Og/0+Gof9QiKP/UIij/0+IpP9Ph6T/TYak/02Eo/9MgqP/Sn2i/0V0oP89bJr/NGST/yxf + jP8oXIn/Kl+L/y1jjv8vZpD/MmyT/zlzmv9Be6D/SYCk/06Cpf9QhKb/UIWl/1GGpf9Rhqb/UYem/06E + pP9MgqP/SH6g/0R6nv9BeJz/Qnid/0R7oP9Kg6T/Toel/0+Jo/9PiqP/Uoum/1SMqf9WjKr/V4qp/1aI + p/9Vh6f/Voeo/1aGp/9Uhab/UYOj/0+Bov9MgKH/Sn2f/0V3mv89b5P/NWaL/y9fhv8sXYX/LmCH/zFk + i/8yZI3/M2WN/zNkjP8zYov/NGGM/zNfiv8rWIT/I1J//yBQf/8gUoH/JFeF/ypdiv8wZI//NWuS/ztw + lf8/dpf/Q3qZ/0V6mf9EeZj/QHWW/ztwk/83a5D/MWWO/yxgi/8oXYr/I1iH/yBUhP8bTYD/Gkp+/xhI + ff8YR33/EzZe/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Di1F/xpYff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/yBdgv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x03Sv81a5L/MGiR/y9m + kP8uZI//L2OO/zNnkP83a5H/Om+T/z5ylf8+dJb/PXSW/zlylP84c5X/NnKX/zZzmf84dZv/OHWc/zh0 + mv84dJr/PHib/0F9nf9Hg6D/Soeg/0yLof9Qj6L/VpGk/1qSqf9ek6z/XJOr/1uSqP9dk6f/X5Sn/2GU + p/9fkab/Woyl/1aIpP9QgqL/TH+h/0h7n/9Cdpv/QXaa/0J3mv9FfJ7/R36f/0d/oP9GfZ//QHmc/zx3 + m/87eJ3/PHed/z55nv9CfaD/R4Kj/02Fpf9RiKX/U4ml/1KJpP9TiqX/VYun/1OJp/9Tiaf/Uoem/1CF + pf9Pg6T/ToKj/0x/ov9JfaH/SH6h/0Z/of9EfqL/RoCj/0iBo/9Kg6X/TYam/0yGpv9Khqb/SIKk/0N+ + ov8+e57/OXmb/zd2mf8+eZr/Rn2c/0yCnv9QhZ//T4Sf/02DoP9NgqH/ToKh/1CCof9QgJ//Tn6d/0p7 + nP9EdZn/PnGX/zptlf84a5X/OGuW/ztumP8+cZj/QHKY/0J0l/9CdZf/QnWX/0N2mf9Cdpv/P3Wc/zpw + mf81bJf/MmuR/zBoiv8waYn/MmmL/zNpj/8zaZH/MmaR/zBjkP8tYI7/KF2L/yRaif8iW4f/Il2I/yhk + i/8uapH/NHCU/zd0l/85dZj/OXSZ/zlymf85cJj/NWuT/zBnkP8oY4v/JmKK/ydhjP8rY47/LmWP/zFo + jf8za43/NGyN/zVtj/82bJL/MmaQ/yxei/8mVYb/IE1//xxIe/8cSHn/IE17/yhVgf8vXIb/K12H/yde + hv8jW4T/I1iB/yRXgP8lV4D/KVmC/ytbhP8qW4T/KFuD/ydchP8qXoX/LWGG/zFliP8zaIj/NWqJ/zVr + if81a4r/NmyM/zdsjf82a4z/NmuN/zhpjv84aI7/NGSL/zBfiP8qWYP/JFN//x9PfP8bS3n/Hk98/yNU + gf8nWYX/LGCK/zFljf8yaI7/M2uP/zRtkf81bpP/NW6V/zRslf8ya5X/MWyV/zNwlv84dZn/QX2d/0aC + oP9Jg6H/SoSf/0yFn/9Oh6H/UYmk/1CHo/9OhqL/SYGg/0Z+n/9CeZ3/P3ab/z51mv9Adpr/Rnue/0yC + ov9Sh6T/VYql/1eLpv9ViKT/UoSi/01/ov9He5//QnWa/zxwlv8zZ5H/K1+N/yldjP8qX4z/KWCK/yhg + iv8pYYr/KWGK/y9njv83b5T/PXaa/z96nv9CfqH/RYCj/0qCoP9OhJ7/UIaf/1GIn/9SiaH/VIqj/1OK + pP9Rh6P/ToSj/02Cov9Je6D/QnKe/zpnl/8vXo7/KVuJ/ylcif8sYIz/LmOO/y1ljv8wapH/Nm+W/0F4 + nv9KfqL/TYKk/0+Eo/9RhaT/Uoak/1OIpP9Th6T/UYak/06Dov9LgaH/R3ye/0N6nf9Cep3/RHyg/0eA + o/9LhKX/TYek/06IpP9Qi6T/VIum/1WLqP9Xiqj/VYin/1SGpv9Uhqb/VIWm/1OEpf9QgqP/ToCh/0t+ + n/9KfJ7/Rnic/z9wlf82Z4z/Ll6F/ylYgv8pWIL/KluF/ytdh/8rXof/LFyH/y1Zh/8vV4n/K1WE/yNP + ff8dSnn/GUl3/xtMff8hVIP/KVyL/y9kkP81a5P/O3GV/0F3mP9GfJv/Sn+e/0d7nP9Dd5n/PnCV/zhq + kf8yZI//LmGN/yphjf8nXov/IFaE/xpOff8SRXb/EkR3/xVFeP8TNl3/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8UP13/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/I2CD/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/HTdK/zltkv82a5L/MmmS/zFok/8yZ5P/MmaR/zBjjP8xZYz/NWmO/zdt + kf84bpL/OHCT/zdxlP82cpb/OHWZ/zt5nv89e6D/Pnug/z56nf9BfJ3/RYGf/0mFof9MiaL/T42j/1SP + pP9Zkab/X5Kp/16Rqv9dkqr/W5Ko/1ySpf9ekqb/X5Kn/16RqP9ZjKf/U4el/02Aov9He57/Q3ec/0J3 + nP9Eep7/SX+g/0uBof9LgaH/SoKh/0eAoP9CfJ7/PXib/zp1mf86dZn/PXeb/0B5nf9GfqD/TYOj/1OI + pv9TiKX/Uoej/1KHpP9Rh6T/UIak/1CGpf9OhKX/TYKk/0uAov9IfaD/R3uf/0V8n/9Efp//RICh/0eC + ov9KhKP/S4Sk/06Gpf9QiKX/UImm/0+Hpf9MhaX/SIKj/0OAoP8+fJ3/O3eb/zp1mf9Aepv/R3+e/0uC + n/9Og6D/ToOi/02Dov9QhKP/UYKh/1CAoP9Pf5//S3yd/0d4nP9Acpn/OGqU/zNmkP8zZJH/N2iU/zpr + lf88b5b/PnCW/z9xlf8/cpT/QHSW/z9zl/88cJf/Nm2V/zJqk/8vaI//LmeL/y5niP8wZ4r/M2iN/zNo + j/8zZpD/MmSQ/zBij/8sX4z/J1yJ/yRbh/8lXof/J2KM/y1okP8ybpT/N3OY/zh1mv85dJr/OHOb/zpx + mf85b5f/M2mS/yxii/8nXoj/J12I/ypei/8tYI3/MWOP/zNnjv80ao3/NGuP/zVqkP8zZpD/Ll+M/yhW + h/8iToD/Hkp8/x9Le/8kUH7/LVmF/y9gif8rYYn/J2GJ/ydfh/8mXYX/JlqD/yhbg/8qXIP/K12E/ypc + g/8oW4L/JluB/ydcgv8pXoX/LmKI/zFlif8zZ4n/M2mI/zVrif82bIz/N2yN/zhtjv84bY//Om2Q/zhq + jf80Zor/MmKJ/zBgiP8tXIX/JlaA/yBQfP8cTXr/Hk98/yJVgP8nWoX/K1+J/y1ii/8wZo//MmiR/zNp + k/8xaZP/MWiU/zBplP8vbJT/MW+W/zl2m/9CfqD/RoKi/0qDof9MhKD/TYWh/1GIo/9SiaT/Uomk/0+G + ov9NhaH/SYGg/0V8nv9BeJ3/PnWb/z92m/9DeJ3/SX6h/06Do/9ThqX/VIel/1KFpP9OgKH/Snye/0N2 + m/89cJf/NmuT/y9ij/8pXYz/Kl+M/ylfi/8nX4n/J2GL/ylijP8uZ4//NW6U/zt0mP8+eJr/QXue/0V/ + of9JgaH/TYKf/0+Env9Rhpz/Uoad/1KInv9UiaD/VImi/1KGov9QhKL/TICh/0h7n/9BcZz/NWST/ytc + i/8oWYn/LF6M/y1gjf8sYoz/K2OL/y5mjf81bJP/PnOa/0d8oP9NgaP/UISj/1GFo/9Th6P/VIii/1SI + o/9Th6L/UISi/0yBoP9JfZ7/RXuc/0J5nP9Dep3/RX6g/0mCo/9LhaX/S4ej/1CIo/9TiKT/VYil/1WJ + pv9Th6X/UoWl/1KFpf9ThKX/UoSk/1GDo/9OgKH/TH6f/0p9nv9HeZv/P3CU/zZnjP8uXYX/J1WB/yFP + ff8jUX//JFSC/yRWgv8jVID/JVCA/ydRgf8lTn7/H0l5/xpIdv8WRXX/E0Z3/x1QgP8lWYj/LWKO/zRp + kv86b5X/QHWZ/0d8nP9IfZ3/SHye/0V3m/8+b5b/OGmS/zJjjv8sX47/KV6O/yhfjf8lXIn/HVKA/xVJ + ef8PQnP/EkN1/w0lPv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xZCXv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZfv8hX4L/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8fOUv/PXGV/zxx + lf85b5X/N2yW/zZql/8yZJL/LmCN/ytdh/8tYIj/MGSL/zRpj/83bpL/OHGV/zp0mP88eJv/Pnue/0B+ + ov9Cf6H/Qn6g/0SAn/9IgqD/SoWh/0+KpP9TjaT/V4+k/12Sp/9ekqj/XpGq/12Rqv9ckKj/XJGm/12S + pf9dkaj/XI+p/1eKqP9Qhab/Sn+i/0R6nv9AdZv/Qnid/0d9oP9LgqP/T4Wk/0+Fo/9NhKL/SoOh/0aB + n/9Be5z/O3aY/zhylv84cZb/PXWZ/0R6nf9LgKL/UISk/1SGpP9RhKH/UISi/06Do/9KgaH/SYCh/0h/ + of9HfqH/Rnug/0R6n/9Dep3/RH2e/0WAn/9GgqH/S4ak/06Hpf9QiKX/Uoml/1OKpP9TiqP/U4mk/1CJ + pf9Mh6P/R4Oh/0J9nf89d5v/PHaa/z95m/9DfZ//SICg/0uBof9NgqP/T4Sk/1CEo/9Qg6L/ToCf/0t9 + nv9KfJ7/Rnmc/0Bymf82aJH/LmGL/ytei/8uX4z/M2SQ/zdpk/85bJP/Om2S/ztukf87b5L/Om6S/zhs + kv80apH/MGmP/y5ojv8sZoz/LWWM/y9mjP8xZ43/NGiQ/zRokv80Z5L/M2aR/zFkjv8sYIv/J12H/yZd + h/8nYIr/LGWP/zFrlP81cJj/N3Ka/zd0nP84cpv/OnGZ/zxvl/82aJL/LWCL/yhahf8lWIT/J1eF/yta + if8wX43/M2OO/zNljf8zZo3/MmaN/zFjjf8sXYr/J1WF/yBMff8dSHn/H0l5/yRPff8qVoP/LV6I/ytj + i/8qYor/KWGI/ylgh/8oXYT/KVyD/ypdg/8sXoX/K12E/ylcg/8mWoD/JVqA/yhdgv8sYYb/MGSJ/zNn + iv8zaYr/NWyM/zdujv84bo//OG6Q/zpvkf85bZD/OGuN/zVoiv81Z4v/M2WK/zJjif8uXoj/J1eC/yBR + ff8eT3z/HU97/yFUgP8kV4P/Kl2J/y5ijv8xZZH/MGSR/y9jkv8uZZP/LWmR/y5tkv8ycpX/PHmd/0J+ + of9HgaL/SYKg/0yEof9OhqL/UYij/1KJpP9TiqX/UYik/0+Go/9Lg6L/SH+g/0R7n/9Adp3/PnSc/0B2 + nf9FeqD/Sn2h/06Ao/9PgaT/TX+i/0h5nv9CdJr/O2+X/zZsk/8wZo7/KV+K/yxhjf8uY4//LmSP/ytk + jv8nYYv/KWWN/zBrkP83cpX/PHaY/z54mf9Ce5z/Rn2f/0p/oP9Ngp//T4Oe/1CFnf9Shp3/U4Wd/1OG + nv9ShJ//UYOg/1CAoP9LfKD/Rnef/z1umP8zY4//KlqJ/ypbiv8uYI//L2KP/y1jjP8qYYn/KmGJ/zBm + jf87cJX/RXmd/0x/of9QhKP/UYWi/1OHof9ViKH/VYig/1OGof9ShKD/ToGf/0l9nf9EeZv/Qnea/0B3 + mv9De5z/RoCg/0eCof9LhKP/UIaj/1SGpP9UhqT/VIek/1KFpP9RhKP/UYSk/1GDpP9ShKT/UYOj/1CC + ov9NgKD/Sn6e/0Z5m/9Acpb/NmeO/yxbhf8lU4D/IU59/x1Ke/8eTX3/IFF+/x9PfP8gTnv/JlF//yVQ + fv8jTnz/HUp3/xdGdf8VR3f/GEx8/yBUg/8oXYr/L2SO/zVrkv89cpb/QXaZ/0R4mv9Ed5r/QXOY/zxt + lP82Zo//Ll+N/yhai/8mWoz/J1yL/yZcif8jWYb/GU99/xVKeP8WSXn/DSY//wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/HFN2/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x5cf/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/yE7TP9Cd5j/QneY/z91mP8+c5n/OGuV/zFjkf8tXoz/KFmG/ylZ + hP8sXYf/MmSN/zdrkv87cZb/PXWZ/z95nP9Bfp//RIGi/0WCof9GgqD/RoGf/0iCn/9NhqL/UYqj/1aN + pP9bj6X/XZGm/16SqP9ekqr/XZGq/1yQqf9ckKf/XZGo/1yQqf9ajqr/VYqq/06Dpv9GfaH/Qned/0F4 + nf9Ee57/SH6g/02Eo/9Qh6T/Uoik/1KIpP9Oh6L/SoSh/0V/n/8/eZv/OXKW/zZvlP84b5X/QHab/0h8 + of9Nf6L/T4Ci/0+AoP9PgqH/ToKj/0h+oP9Depz/QXmc/0B4nf9Ad53/QHid/0R9nv9GgJ//R4Sh/0yG + pP9PiKb/Uoqn/1WLp/9Wi6X/Vouk/1aLo/9Wi6T/VIul/1GJpP9MhKL/Rn+f/0B5mv89dpn/PniZ/0F6 + nP9GfaD/S3+j/0yAo/9OgqT/TYKj/0yAoP9Kfp7/R3uc/0R3mv9AdJj/Om2U/zFkjv8qXYj/JFiE/yRX + hP8oW4f/MGKN/zVokP82aY//N2qP/zhrjv83ao3/NWqO/zJqj/8uaI7/LmmP/y5njv8uZo7/LWSO/zBl + j/8yZ5H/NmqU/zdrlf83apT/NWiS/zFlj/8rYIr/J1yH/ydeif8pYY3/LmeS/zNsl/81b5r/NnCa/zhw + mv87b5j/OGuU/zNlj/8sXYj/J1aD/yRTgf8kUoH/J1WE/yxbiP8wXov/L16K/y5fiP8uXoj/LVyI/ypX + hv8kUID/HUd5/xlDdf8ZQnP/H0p4/ydUgP8rXIf/LGCJ/yxii/8sY4r/Kl+G/yldg/8qXIL/K12D/yxe + hP8tX4X/K12E/ylcgv8nWoD/J1yB/ypfg/8vZIj/M2iK/zVqjP83bI3/OG+Q/zZsjv83bI//OW2Q/zlu + kP84bI7/N2uM/zdrjP82ao3/NWeM/zFji/8tXon/J1iE/yFSfv8eT3v/Gkt5/x9Rfv8lV4X/K12M/y1f + jv8sX5D/LF6R/ypjj/8qaY//LW+Q/zV0lf89epr/Q36f/0Z/oP9JgaD/S4Og/06Fov9Rh6P/Uomk/1OJ + pf9SiaX/UIek/0yDo/9KgaP/R32j/0F3n/89c5z/PXKb/z90nP9DeJ7/R3qg/0h6oP9Fd57/P3Ka/zhq + k/80Z5D/MWaO/yplif8uZ4z/MmuQ/zVtlP81bZX/M2yV/y9qkv8rZ43/LmuP/zVxk/85dJT/PXeX/0F5 + mv9Fep7/SX2g/0uAoP9NgaD/T4Kf/1GDn/9Rg57/UYKd/1CBnv9Pf6D/Tn2g/0t4n/9DcZv/OmiU/zBf + jf8pWYb/KFiH/ytdi/8vZI7/LWSM/ylfh/8nXYX/K2CI/zZrkf9Cd5v/Sn2f/0+Dof9ShaL/Uoag/1OG + n/9Uhp//U4Wf/1GDnv9NgJ3/SHyb/0R3mf9AdZj/PnWX/0F4mv9EfJ3/R4Cg/0yCov9ThaT/VISk/1OE + o/9RhKP/UoWk/1CEo/9Pg6P/T4Kj/0+Cov9Pg6L/ToKh/06Bof9Kfp7/Rnqb/z9ylv82aI//LFuG/yRS + gf8gTX7/Hkt+/x9Qfv8hU3//IlV//yhYgv8rWYT/LlqF/yxZhP8mVH7/G0p2/xdHdv8XS3r/HFB//yJX + hP8pXoj/L2WM/zVqkP86b5P/PnKV/z1vk/86a5H/NWaN/zBfi/8oV4n/I1SI/yRWiP8lWYn/JluI/yRa + hf8iWIT/H1aB/yBVgf8NIDH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8eWn3/Gll+/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/IF2B/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Ij5O/0Z8 + nP9Fe5v/RHub/z92mP85bpP/M2WP/ytbiP8nVYP/I1B+/yhWg/8xYIv/NWeP/zpulP8/dpr/Qnud/0V/ + oP9HgaH/SIOi/0mDof9Jgp//SYKf/02EoP9SiKL/V4yk/1uPpf9dkKb/XpKo/16SqP9ekqj/XpGn/16R + qP9ekaj/XI+q/1iMq/9Tiav/S4Kn/0R7of9BeZ7/QXqd/0R9n/9JgqH/TYWh/1GIo/9TiqX/U4qk/1OK + pP9Oh6P/SYOh/0N9n/88dpr/N3CW/zZulf86cJj/QHSc/0Z5n/9Je6D/TH6i/0+Bo/9MgKL/RHqd/z51 + mf86c5j/OnKY/ztzmv9Bep7/R4Kh/0qGov9Mh6T/T4mm/1OLqP9XjKj/WY6o/1qOp/9ajqT/WY2k/1mN + pP9YjaX/VIum/1CGpP9LgaL/RHyd/z94mf88dZf/P3aZ/0N4nf9Ie6H/Sn2j/0l+ov9Jf6H/SH6f/0V7 + nP9Cd5n/PnOW/zluk/8zaI7/LWKK/yZahf8eU4D/HlKA/yFVgv8mWoX/LGCJ/zFkjf80Z43/NmqN/zZq + jP8zao3/MGuP/zFrkf8xbJL/MmuS/zFokv8vZpD/L2OQ/zJnkv83apb/OWyW/zpulv84bJP/NWiQ/zBj + jP8qX4n/JlyJ/yZeiv8qYo//L2aU/zNrl/81bZj/N26Y/zhsl/82aJP/MWKN/ytbh/8lVIH/IU99/yNT + gP8lVYL/J1aE/ylZhf8qWoX/KFmE/yVVgP8mVYL/JFKA/x9LfP8bRnj/GEBy/xY+b/8bRnT/JFF+/ypa + hf8sXoj/LmGK/yxhiP8rX4b/KVyD/ypdgv8tXYP/L1+E/y9ghf8uX4X/LF6D/ypdg/8oXIH/Kl+D/y1i + hv8yZoj/NmiK/zhrjf83bI3/NmuO/zZqjv84bI7/OG2O/zlujv85bo7/OG2N/zdsjv84a4//NGeP/zFj + jP8sXYj/JVWC/x1Oe/8aS3n/Gkx6/x9RgP8mV4f/KFqL/ylbjv8oXY3/J2KM/ydnjP8vbpH/NnWV/z17 + mf9Df53/RoCe/0qAn/9Mg6D/ToWi/1GHo/9SiKT/Uoik/1GHpP9Qh6T/TYSl/0uBo/9GfKL/QHae/zty + mv84b5j/OG6Y/zpwmv8/dJ3/QHSd/z1wm/82aZX/MWSP/y9jjf8uY4v/L2iL/zNwj/86dpX/PHeX/z12 + mv89d57/OXSY/zRwk/8wbo//MG6O/zVxkf87dJX/QHWa/0F2nP9EeJ//Rnqf/0l9oP9Mfp//ToCg/0+B + n/9Pf5//T36e/058oP9NeqH/SHWe/0BsmP83Y5H/LVqI/yVUgf8iVID/KFyG/yxhif8rYor/KF6G/yZb + g/8rYIf/M2iN/z1xlf9Gep3/TYCg/1CDn/9Qg57/UYSc/1GEnP9Sg53/UIGe/0x+nf9Iepv/QnWY/z1x + lP88cZX/PnSX/0J5m/9HfZ//TYCh/1GBov9QgKH/T3+g/06Aof9PgaL/T4Gi/02Bof9MgKD/TH+f/0x/ + n/9Mf5//S36e/0h7nf9Ed5n/Pm+V/zVmjv8tXIf/JVOC/x9Lfv8iUoL/JFiE/yZchf8sYYj/MWOL/zZl + jv87aZD/OmeQ/zFeiP8kU33/G0p3/xhKeP8bTnz/H1OA/yJYgf8pXob/L2OK/zNnjP81Z4z/NGaL/zBh + iP8tXIf/KFWF/yJPhP8gT4L/IVKD/yRXhf8oXon/KGCI/yhgiP8pY4r/K2OM/wsYI/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/x9afv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8eXIH/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8kQE//SH+e/0d+nv9GfJz/QHeY/zlwkv81aZD/MGGK/yZT + gf8fTHr/IEx7/ydVgf8zYoz/OWqS/z1yl/9CeZv/Rn+f/0mDof9LhaH/SoOg/0mBnf9JgZz/TIOf/1GH + ov9Wi6P/Wo2l/1yPp/9ekKf/X5Kn/1+Spv9ekqb/X5Gm/16PqP9cjan/WIqr/1GFqf9IgKX/QXqg/z94 + nP9Aepz/RYCf/0yFov9PiaT/U4qk/1aMpv9WjKb/VIqm/1GJpf9NhqT/R4Gh/0B7nv86dJr/N2+X/zVs + lf84bZb/PHCY/0R3nv9Je6L/Sn2k/0R5nf89dJj/OXGW/zlzmP84cpj/O3WZ/0V/nf9KhaD/TYqk/1CM + pv9Tjaj/Vo6p/1qPqf9ckKn/XJCn/1yQpf9dj6X/XI+l/1qOp/9YjKj/VImn/02EpP9Hf6D/Q3ud/z52 + mf88c5f/P3Sa/0N2nv9EeKD/RHqg/0R6nv9Depz/QHiZ/z11l/86cZT/NWuQ/zBli/8rYIn/I1iE/x9U + gP8cUX//HlOB/yFWg/8nW4b/LWCK/zNnjP81ao7/NWyO/zRtkP8ybpH/NG+U/zZwlv82bpb/NGuV/zJn + k/8xZZL/M2aU/zZplv85a5f/OW2W/zltlP81aJD/MGON/ypdif8mWof/JFqI/yZci/8pX4//LmaT/zJr + lf81bJb/N2uW/zVolP8uYI3/KFmG/yJSgP8iU4D/JVaC/yZYhP8nWYT/JVmD/yRYgv8kWIH/IlV//yBS + ff8gT37/H0x8/x1Hev8aQnX/GD9x/xxEdP8iTXz/J1SB/ytbhv8tX4j/LF6G/ytdg/8pXIL/KlyB/y1e + g/8wYIX/MmKH/zFhh/8uYYX/LGCE/ytghP8rYIT/LWKF/zBkhv80Z4n/NmiK/zZqi/80aov/NmqN/zZq + jf83bI7/OW6P/zlvjv84bo7/N2yP/zdrkP84a5H/NGeQ/y1fiv8lVoL/HU17/xpLeP8aTHn/G018/x9R + gf8iVIb/JVeJ/yVbif8lYYn/K2eM/zJukv84dJb/P3uZ/0N/m/9HgJ3/SYCd/02Bn/9PhKH/UYej/1CG + ov9RhqP/T4Wi/0+FpP9NhKX/S4Gk/0R6nv89dJv/N2+Y/zBqlP8xapT/NGyX/zhvmv83bZn/NGiV/y9j + kP8wZJD/MWWP/zJmjv83bpH/PnmW/0F/mf9Df5n/RH+b/0N+nf9CfZ3/PnqZ/zh2lf80cpH/M2+P/zpy + lP89cpf/PnGZ/z1wmf8/c5v/QXWd/0V4nv9Iep7/S3yf/0t8nv9Me6D/THmg/0t3of9Hcp3/QGqY/zRf + jv8pVYP/IlB+/yJSfv8nWYP/KF2G/yddhv8lXIT/JVqC/ylehf8vZIv/OG2S/0F1mP9Ie5z/S36c/0x/ + m/9OgZr/UIGb/1CAnP9QgJ7/TH2e/0h5m/9Bcpj/PG6U/zlsk/87b5T/P3OY/0R4nP9KfaD/S32g/0t8 + nv9Je53/Snye/0t9n/9KfZ7/R3uc/0Z6mv9He5v/Rnqa/0Z5mv9FeJr/Q3aZ/z5wlf84aZD/MWKL/ypa + hf8iUX//I1KB/yZZhv8qYor/MWiO/zdskf88cJX/QnOX/0V1mf9Fc5n/PGuR/y5ehv8iUn3/HE16/x1Q + ff8gVIH/I1iB/yZbhP8sYIj/L2KJ/y9iif8sXoT/KlqD/yZTgf8jTYD/IEt//x5Kfv8fTn7/JFeE/ylf + if8uZ47/MWuQ/zJtkv81b5X/Dhwm/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8LGCD/HVp9/xpZ + fv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/x9egv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xww + O/9JgZ//SICf/0V8nP9Ad5j/PXOW/ztwlP82Z4//LVyF/yBMef8ZRHP/HUl2/ydUf/8zYov/Om2T/z92 + mP9FfZz/S4Sh/0yFov9LhKD/SIGc/0Z/m/9JgZ3/ToWg/1OJo/9Xi6X/Wo2m/16Qp/9hkqf/YJKl/2CR + pP9fj6X/Xo2m/1uLqf9Xhan/T4Co/0Z6pP8/eJ3/PHea/z97mv9Ig6D/T4ql/1KMpv9Ui6b/V4yn/1iO + p/9WjKb/Uoqm/0+Ipv9KhKT/Q36h/z54nf84cpn/M2uV/zBnkf81apX/PHCa/0N2oP9BdJ7/O2+Y/zVs + k/85cpj/PHab/z54m/9Efpz/R4Oe/0uHof9Oi6T/Uo2m/1aOqf9Yj6r/W5Gq/12RqP9ekaf/XZCm/16P + pv9ekKf/XI+o/1qOqv9Uiqj/T4an/0iBo/9DfJ//P3ic/z10mf89cZr/PnKb/z5znP89c5z/PXWb/zt1 + mP86dJX/O3OV/zlwk/80bI//MmmO/y5ji/8oXYj/I1mG/yBVg/8fVIL/IFWD/yVahv8tYYv/M2eP/zZr + kf81b5L/NXGU/zZylv84c5j/OXOZ/zhxmP83bJj/M2iU/zJmk/8zZZT/NWeV/zdplv84a5b/NWiS/zNm + j/8vYov/K12I/yZZhv8hVYX/IVaH/yVbjP8pYo//LWeS/zJqlf82bJj/NWiW/y5hjf8nWYb/I1SC/yRW + g/8mW4b/KV6I/ylgif8oX4f/Jl2F/yVchP8jWYL/IleC/yFTgf8gUH//IEx+/xxFeP8aQXP/HEJz/x9I + d/8iTXv/JlR//yhYgv8rW4T/KluC/ylbgP8rXIH/Ll6D/zJihv8zY4f/M2OI/zFihv8uYYX/K2GE/yth + hP8sYoT/L2OF/zFlhv8yZof/MmeI/zNpiv81aYz/NWqM/zdsjv85bY//OW2P/zdtjv82a47/NmqQ/zVp + kf80Z5D/LWCL/yRWgv8gUX7/G014/xlLeP8bTXr/HE58/x5Pf/8fU4H/I1iE/ydfiP8uZ47/NG2R/zt1 + lv9Aepn/Q36b/0d+m/9Kfpz/TH+e/0+CoP9QhKH/ToOg/02CoP9OgqH/ToKj/0yBo/9HfJ//QHea/zpx + l/8xbZT/LGiR/yllkP8vapb/MGmW/y9nlP8qYI//L2SR/zNok/83a5X/PHCW/0F4mf9HgJ3/SIOd/0qF + nP9LhZ3/SoSe/0iCn/9FgZ//QX6c/z16mP88dZT/PHKT/zxwlv86bpf/OGuX/zVplv84a5b/PXCZ/0By + m/9DdZv/RXac/0d2nf9IdZ//R3Oe/0VvnP8+Z5b/M12N/yhSg/8hTXv/IVB9/yNWgf8jWoX/IlmG/yNa + hP8lW4T/J1yE/y5jiv82apD/PXGV/0J1l/9Hepj/SnyZ/0t9mv9LfJr/TX2d/059nv9Me5//Rnab/z9v + lv85aZL/NWeP/zZokf86bZX/PnCZ/0J0m/9Edpz/RHab/0R1mv9Edpr/RXeb/0J1mf9AdZf/QHSV/z9z + k/9AdJT/QHOV/z5xlf87bpP/N2iQ/zJii/8rW4b/JFOA/yJTgP8lWIP/KmCJ/zJqkP87cpb/QXiZ/0Z7 + m/9MfZ3/UICh/0t6nf9Dcpf/OGeO/ylag/8jVH//I1WC/ydbh/8pXoj/LGGJ/y9ki/8zZo7/MmSM/y1d + hv8nVID/Ik19/x9JfP8eSHz/Hkp8/yFQgP8mV4X/LGGL/zFqkP83cZX/O3aa/z54m/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wsYIP8eWn3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HVuA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EiAo/0mBoP9IgJ//RX2d/0B5mf9BeJr/QHWZ/zxu + lP8zYYn/JVJ8/xpFcf8TPmv/HEl0/ydWf/8zZYv/PXKU/0R7m/9KgqD/TYWi/02Gof9Kg5//R4Cc/0N9 + mv9Jgp//ToWj/1SJpv9bjaf/XpCn/2CRp/9ikaT/YZCj/2CNpP9di6b/WYan/1SBp/9Meqf/Qnah/ztz + m/85dJf/QX2a/0mGoP9Pi6X/U4un/1WKp/9XjKf/V42n/1aOp/9Vjaf/Uoqn/02Hpv9HgqT/QXyg/zl0 + m/8xa5T/LmaR/y9mkv82apb/N2uY/zdqlv8yZ5P/NGuV/zZwmP89eZ3/SIGf/02Gn/9QiKH/Tomh/0+L + o/9Tjaf/Vo6p/1mQqv9akKn/XJKo/12Qp/9dj6b/Xo+m/12QqP9ckKn/WY6q/1WLqf9Qh6f/SoKl/0V9 + of9Ad53/PXKa/ztumf86bZn/OG2X/zdulv83cJX/NXGU/zhzlP85c5T/OHGT/zhwkv82bZL/M2mQ/zFm + jv8sYoz/JlyJ/yNYhv8jWIb/J1yK/y5jj/8zaZL/NWyS/zRvk/82c5b/OHOY/zl0mf87dJv/O3Kb/zdt + mP8zaJT/MGSR/zBjkf8xY5H/M2SS/zNkkf8xY47/MGKL/y5giv8sXon/J1mG/yJVhP8fVIT/IFeG/yVe + i/8pYo7/LmWR/zNolv8zZ5X/LmGO/yhbiP8kWIT/JluG/ylfif8tZY3/LmeP/yxnjv8qZYv/KWKK/ypi + iv8oXon/JlqG/yRXhf8kUoH/IEp7/xtCc/8aQHH/G0Ny/x5Idv8hTXr/I1J8/yZWf/8pWYH/KVqA/ytb + gP8vX4T/MmGF/zNihv8yYoX/MWKG/y5ihf8rYYT/K2GE/ythg/8sYoP/L2SF/zBlhv8wZIb/MWaI/zNn + iv80aIz/N2uO/zdrkP82a4//NmuP/zVpkP80aZD/M2eQ/y9jjP8rXoj/KFuE/yNWgf8fUnz/HE96/xtO + ef8bTnv/HE17/xtNe/8fU37/J1uF/y5ki/81bJH/PHOW/z94mP9Cepj/RXqZ/0l6m/9MfJ7/TX6g/0x/ + oP9Lf53/Sn6e/0p9nv9LfqD/SX2g/0R4nP89dJr/NnGX/y5ulP8rapP/LGqT/ypnkv8pZJH/JmCN/ypi + j/8wZ5T/OG2Y/z90m/9Fep7/S4Kh/0yFoP9Oh6D/UImg/1GJof9QiKH/Toaj/0uEo/9IgqH/RoCd/0R7 + mP9Cdpj/PXGX/zlslf8zZpP/L2OR/y5ikP8zZpP/OWuW/zttl/89bpf/P2+Y/0Fvmv9BbZr/QGmX/zli + kf8wWYn/J0+B/yBMfP8fTnz/IVWA/yJahv8iW4f/IlqG/yVchf8qYIf/LWKJ/zNnj/87bpP/P3KW/0N2 + l/9Gd5j/R3mZ/0d4mf9Hdpn/SHeb/0d1nP9Dcpv/Pm2W/zZlkP8wYYz/Ll+L/zFijv82aZT/OWyW/zxu + lv89b5b/PG6V/zxulP85a5L/OGqS/zhrkf84bZD/OW2P/ztukP87b5L/OmyS/zZokP8xYYz/LFyI/yZV + g/8hUH//JFWB/yhdh/8vZ47/OnKW/0J7nP9Hf5z/TIKd/1CEn/9ThKL/UYGh/0l4m/88bJL/LmCI/yZY + gv8mWYT/Kl+J/zFmkP8zapD/N22T/zxvl/8+b5n/MmGM/yhUgf8iTHz/Hkh5/x5Je/8gTH3/JlWE/yla + iP8uY43/M2uS/zlxlv8+d5r/Q32f/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ESk4/x1a + fv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8hX4L/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8SICj/R4Cg/0aAoP9Efp3/RH2d/0V9nv9Fep7/QXKY/zdmjf8pVn//G0dw/xU/av8XQm3/IVB4/y5g + hv86bpH/RHua/0iBn/9MhaL/Toei/0uEof9HgZ//RX6e/0V+nv9KgqL/UYem/1mMqP9fkKj/YJCl/2GP + o/9ij6P/YY2k/12Jpf9XhKb/UX6m/0d2ov89cJ3/NW2Y/zp2mv9Bf53/Soig/1GKp/9Viqr/Voqp/1aM + p/9Xjqf/V46n/1aNp/9Ti6b/T4mn/0uGpv9Ef6P/PHed/zJtlv8uZ5L/LWSQ/y9lkv8vZJL/LmKQ/zBl + k/8zapb/N2+Z/0N7nf9NhaD/Vouh/1WKo/9UiqT/UYuk/1GKpf9Vjaj/V46p/1mRqP9aj6j/XI6n/1yN + pv9cj6j/XI+o/1uQqv9YjKn/VIqo/0+Gp/9KgqX/Rn2j/0J3n/88cJv/OGyY/zVqlv8zapX/MmqS/zJs + kv8zbpL/N3KU/zp1lv88dZb/PXSX/zxylv85b5X/N2yV/zNpk/8uY47/KV2L/ydbiv8qX43/L2SR/zJp + k/80bJL/M26S/zVwlP84c5j/OXKZ/zpymv85cJn/NWuV/zBlkP8tYI3/K16M/ytdi/8sXov/LF6K/yte + if8rXoj/K1+I/ytdiP8rW4n/JleH/yBTg/8eVYP/H1aE/yNaiP8pXo3/LGCP/y5hkP8tX47/KFuI/yVZ + hf8nXYf/LmeP/zBrkf8ybpP/MW6S/y9tkv8wa5H/MGiQ/y1jjv8qX4v/J1uJ/yZWhP8jUX7/Hkd2/xlA + cP8aQnD/HEZz/x9Md/8gUHn/IVJ6/yNVe/8mWH3/KluA/y1egv8wX4P/MGCE/y9hhP8tYYT/LGCE/yxh + hP8rYYT/KmCD/yxig/8uY4T/L2SF/y5jhf8uYob/MGSI/zJni/80aI7/NGmP/zRpj/80Z5D/NWiR/zRn + kP8vY43/K1+J/yhchv8oXIX/J1yD/yZagv8jV4D/IFR9/x1NeP8dS3n/HEt4/x5Pe/8kVoD/LF6G/zNn + jf85b5L/PXOV/0B0lf9Cdpf/RHaZ/0l4nf9Kep7/SXuf/0h7nv9GeZv/Rnib/0Z5nf9EeJz/Qneb/z11 + mf82c5f/MXKX/zFxmP8wb5f/LGmT/yRgjP8iXon/KGKO/zNsl/88dJ3/RHug/0yDo/9OhaP/UIij/1KL + ov9VjKT/VYyl/1WLpf9TiKf/UIam/02Eo/9Lgp3/S4Cc/0h8nP9EeJz/Om6W/zBkkP8rX47/K1+N/y1h + jv8wZJD/NGeR/zZpkv82Z5L/OGeT/zpnlP83Y5H/MlyM/yxUhv8kTYD/IEx8/x9Qff8iWIL/Jl6H/yhh + iv8oYYr/KWGI/y5liv8xZ43/NGmQ/zlsk/8+cZb/QXOX/0Jzl/9DdJj/QXKX/0Fxlv8/b5b/P26X/z5s + l/85Z5T/M2KP/ytbif8mV4b/KFmI/y1fjP8yZZH/NWmT/zdqk/82aJD/MGKK/y1fiP8tX4f/MWSL/zNn + jf80aI3/N2uQ/zhskf83apL/M2WQ/y5ejP8oWIf/I1GC/yJSgP8mWIT/K2GK/zdulP9Cepv/SYGf/02F + n/9Php7/Uoaf/1SGof9Sg6D/THyd/0Bwlf8zZYz/KVyE/yZZgv8qX4j/MWiP/zhxlf8+dpr/RHqg/0By + m/84ZpL/LViG/yFNfP8eSXn/Hkt7/yRRgf8nVYT/KlqI/y1gjP8yZ4//Nm2T/ztyl/8tV3H/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8UMEH/HFp+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Glp+/x1b + f/8EBwj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xEgKP9FgJ//RH+e/0WAn/9GgJ//SICh/0h9 + n/9Fd5v/P26V/zBchf8fSXT/FkBr/xVAa/8dTXX/Kl6D/zhukP9AeJj/R4Ge/0yFov9NhKP/TIOj/0mB + o/9EfaD/Q3yg/0d/ov9Ohqb/Vouo/1uOp/9ejqP/X42h/2CNo/9fi6T/XYim/1eCp/9OeqT/QnKe/zds + mP81b5j/OXic/0GCn/9Lh6T/VIqp/1mLrf9Xi6r/V4yo/1iOp/9ZkKj/V5Cn/1WOpv9Qi6X/TIel/0eC + pP9AfKH/OHSb/zJrlf8tZZH/KWCN/ylfjf8rYY//MWeU/zZsmP88dJr/SYCf/1KIov9XjKX/WYum/1iM + p/9WjKf/VYyn/1OMp/9Xj6j/WI+o/1mNqP9Ziqf/Woyn/1uOqP9bkKn/WY6p/1aKqf9Sh6n/TYWm/0qB + pP9GfaL/Qnef/z1xnP83bJf/M2mU/zFqk/8xa5L/MGyR/zVwk/86dZX/PniZ/0J6m/9DeZv/Qneb/z90 + mv89c5r/OW6X/zNnk/8tYY7/Kl2M/ytfjf8vY5D/MmiR/zJqkf8ya5D/MmyR/zNuk/81b5X/N2+X/zRs + lP8wZ5H/LGGM/yldif8nW4f/JlmG/yZZhf8oWob/KFyG/yhdhv8qX4f/LWGK/y1gjP8oW4r/IlaG/x5T + g/8dUoH/HFCB/yJVhf8oWor/KluL/ylaif8lWIb/I1iD/yhgif8uaI//M3CU/zRxlf80cJT/M3CU/zRw + l/8zbJX/MGeS/yxhjv8rXYv/KlqI/ydUgf8gTHj/G0Vy/xpEcP8dSHT/IE54/yFRev8fUXn/H1J5/yFT + ef8mV3z/KVp//ypbgP8rXIL/K16C/ytegv8rX4T/K2CF/ythhf8rYYT/LWKE/y5jhP8vY4X/LmOF/y5i + hf8vY4j/MGWK/zJnjP8xZ43/MWeO/zJmj/8zZpH/MmSP/y5gjP8pXIf/KF2F/ylehf8qYIX/LGOH/yxi + hv8pXIP/JVR+/yBLd/8eSXb/Hkt3/yJRe/8oWID/L2CH/zVnjf87bJD/PW+S/z9xlP9Cc5j/Q3Sa/0R2 + nP9FeJ//Q3ac/0J0mv9CdZn/QXSZ/0BzmP8/dJn/PHaZ/zh2mf83dpn/OHac/zV0m/8vbZX/J2SO/yZj + jf8qZpH/M2+X/z14nv9HgKP/TYal/1CHpP9SiaT/U4uk/1WMpP9Yjqj/WI2p/1eMqv9Uian/T4ej/02F + oP9Ng5//ToKh/0d7n/88cJj/MWWR/yxhjf8sYY3/LWKN/y9kj/8xZo//MmeQ/zJljv8xYo7/MmCO/zBe + jf8sV4j/JlCC/yFMfv8fTnz/IVZ//yVehP8qZYr/L2mO/zBpj/8yapD/NGyP/zVsj/83bJH/O2+U/zxv + lv8+cJb/QHGY/z5wlf88bZT/OmuS/zhnkf82ZZH/NWOQ/zNhj/8tXYz/JliI/yBUhf8iVYX/J1uJ/ytg + jP8wZY//MmeQ/zFljf8sX4f/JlmB/ylbhP8uYIn/MGSM/zFmjP8zZ43/NWiQ/zVnkv8xY5H/LFyM/yZV + iP8jUYP/IlKB/yVYg/8xZo7/PnOZ/0d/n/9MhaH/UIeg/1KJn/9UiJ//VIef/1GCn/9LfJz/QXKW/zVn + jf8qX4b/JlyD/ydehf8uZoz/OHKV/0B7nP9DfJ7/PnGZ/zhmkv8sWof/IU99/xxKef8gTn3/JlOD/yhW + hf8mVoT/KFqG/yxeh/8wY4r/MmeM/yVOav8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xpB + WP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HVt//w0cJP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/ER8n/0N+nf9EgJ7/R4Gg/0iCof9JgaH/Sn6h/0h6n/9Dcpr/OmaQ/ypVgP8cR3L/F0Rw/xpK + dP8oXIL/NGqN/z11lv9EfZ3/SoGg/02Cov9NgqL/RXyh/0F5of9BeaH/RHyj/0uCpf9SiKf/V4qk/1mK + ov9ci6H/Xoqi/12Jpf9bhqf/VICn/0h2oP87bZn/NWuW/zdymf87ep3/QoGf/0yGo/9Viqn/V4qq/1iK + qv9YjKj/WY+n/1uSqP9ak6j/V5Cm/1OOpv9PiqX/SYWk/0R/o/8/eaD/OXKb/zBok/8qYY7/KF2L/yth + j/8xZ5X/OG+Z/0F6nP9KgqD/VIql/1iMqP9bjan/W42o/1qNp/9ajaj/WY6p/1iOqf9Yjqn/WYyp/1mM + qP9ZjKj/Wo+p/1mNqP9XjKn/VYmp/1GGp/9Mg6X/SICj/0Z9of9CeJ7/PXKb/zZtl/80bJX/M2yU/zJt + k/82cZX/OnWW/z55mf9DfJz/R36e/0l/n/9HfJ//RXmd/0F2nf8/cpv/OWyW/zJlkf8tX43/Kl2L/y1h + jP8wZY7/MGiP/zBojv8vaY7/MGqQ/zBqkP8xapH/MGmR/y1kjv8qYYv/JluH/yNXg/8iV4L/I1iD/yVa + hf8oXob/KmCI/y1jiv8uZoz/L2WN/yxgjP8mW4n/IlSG/x9Qgv8dTX//H06B/yNShP8lVYb/JVaF/yRW + g/8lW4T/KWKJ/zBqj/80cJT/NXKW/zVxlf81b5T/NW+W/zVumP8yapX/L2SS/y9fj/8vXY3/J1WD/yFO + e/8bR3P/G0hy/x9Md/8jUXv/JVZ//yNWfv8fUnj/HlF3/x9Rdv8iVHr/JVZ9/yZYfv8mWX//KVyB/ypf + hf8sYYf/LWKG/y1ihf8uY4X/L2SG/zBkhv8vY4b/L2OG/y9jiP8vZIn/L2WL/zBmjP8vZYz/L2WN/y9k + jf8vYo7/K16K/ypeiP8qX4f/K2GH/y5liP8xaYr/M2mL/zNjif8uW4T/KFN+/yBKdf8cR3L/H0t1/yRR + ef8rWID/MWCH/zZljP85ao//PW6T/z5wlf8+cZf/P3KZ/z5xmP8+cZj/PXCW/z1yl/89cpf/PXCW/z51 + mf8+d5n/PHma/z17nf88ep3/OXec/zNxl/8ubJT/LGqT/y9slP8zcZf/PHmd/0WBov9MhqT/UIql/1OK + pP9Ui6T/Voul/1iMp/9ajar/WY2s/1aLqf9TiaT/T4eg/06FoP9Ngp//SX2e/z9zmv82apP/MWaQ/y5k + jv8xZ5H/M2qS/zNqkf8yaJD/MmeP/y9jjf8vX4z/LFuK/ylVhv8jToD/IU5+/yBTff8jXID/KmWI/zBr + j/82cJP/OXKU/zpzlf88c5X/O3GS/ztwkf88cJP/PG+U/z1vl/88bpf/O22V/zhqk/80ZY//MWKN/y9f + jP8uXYv/LFuK/yhZif8hVof/IVaH/yNYh/8kWof/KV+K/y5kjv8wZo7/LmOL/ytgh/8qX4b/K16G/y5g + if8zZo7/M2iO/zJmjf8xZY3/MmSO/y5gjv8pWYz/JFKG/yFNgP8gTn3/KVqG/zZpkf9DeJz/SoCf/06G + of9RiqD/Uomf/1OInv9Thp7/UYKe/0p6m/9AcZX/NGaM/ytfhv8lW4L/JV2E/y1li/83cJT/Pnia/zxz + mf87bJf/M2GO/yZWg/8eTXr/HUx6/yFQfv8lU4L/JFSC/yNUgf8jVID/JVZ//ydZgf8pXIP/FC5B/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/G0Vf/xtZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8dW37/Dxwl/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8QHyb/QX2b/0WBnv9Hg6D/SYSh/0uC + ov9MgKL/S36h/0h4nv9Cbpf/NmON/ypXgv8eTXn/HE55/yNYgf8uZYz/OXGU/0B4mf9HfZv/TX6d/0h6 + n/9AdZ3/O3Kd/zpynf8+d5//RHyi/0uCov9RhqL/VYag/1eGoP9YhqL/WYal/1aEqP9MeqH/P3Ca/zVp + k/81bZb/N3SZ/zx7nP9FgZ//TIeh/1KJpP9ViqX/V4um/1mNqP9aj6f/XJKn/1yUqP9alKj/VpCn/1KN + pv9NiaX/SISk/0R+ov88dp3/NWyX/y1jj/8qYI3/LWKP/zFnk/84cJj/QHqb/0iCoP9SiKb/V4up/1qM + qv9ajKj/XI2o/1+Oqv9ej6r/W46o/1qNqv9ajav/Wo6r/1qOqv9YjKj/V4un/1aKqP9Th6f/UIam/0uB + o/9If6H/RHue/0F4nP87c5n/OHGY/zdxlv83cpj/OXWY/z14mv9BfJz/RX6d/0iAoP9MgqL/TYKi/0uA + of9JfaD/RXqe/0J1nf8/cJr/OWmV/zBhj/8rXYv/KV2I/ytgif8sYov/LWSM/y5mjf8tZ43/LmiO/y9o + j/8uZ4//LWWO/ytijP8mXYj/I1mF/yBWgf8hWIL/JVuE/ypgif8uZo3/MmqQ/zNrkP8za4//MWiN/yxg + i/8pWon/JlSH/yNPg/8gTID/IU6A/yBPf/8hUYD/IlWA/yRbg/8qY4n/MWuP/zdxlf84c5b/NnCV/zVu + k/82b5X/N26X/zRql/8xZJX/MF+S/yxai/8mVIT/IE18/xxKdv8dSnX/IU94/yZWf/8pWoP/J1uC/yNX + fv8eUnj/HE51/xxPdf8eUHj/IlR7/yRXf/8oW4P/K1+H/y5iif8uY4f/L2SH/y9kh/8yZ4n/MmeK/zBl + iP8wZYj/MGWJ/zBliv8wZov/L2WL/y5ki/8tZIv/LWSL/ypiiv8rYYn/LGKJ/yxjif8vZor/MmuL/zVu + jf82ao3/N2eM/zhjjP8wW4T/KFN8/yBJc/8bRG7/IEpz/yVRev8sWYL/M2GJ/zZmjf84apH/OWyT/zlt + lf84bZT/N2yT/zZskv84bpT/OXGW/zpzmP89dZj/QHeY/0B5mf8+epr/P3uc/0B9n/89eZ3/N3Wb/zRx + mf8xcJj/MXCX/zVzmP86eZv/Q4Cg/0uGpP9QiaT/VIym/1aMpv9Xi6X/WIqn/1mLqf9Zjav/V4yq/1aL + p/9UiqT/UIag/02Cnv9IfZz/QXWZ/zlulv8zaJH/M2qS/zVtlf85cZj/OG+W/zdtlP80a5P/M2iR/zFj + j/8uX4z/KViH/yVVg/8hU3//IVp+/yhihP8xa4v/N3KS/zp0lf89d5b/QHmZ/0N6mf9DeZj/QHWV/zxw + kP89b5P/PW+W/zxul/85a5b/NmiS/zJkj/8tX4v/K1yK/ylZif8oWIj/JVeH/yRYiP8kWYj/JluJ/yle + i/8rYYz/LmWN/zBnjv8wZ4z/L2WL/y9li/8wZoz/NGiP/zltlP85bZP/NmuR/zNnjf8uYor/K16J/yZX + h/8gToH/HEd6/yBMfP8sW4f/OGqT/0N3m/9LgZ//UIeh/1KIoP9SiJ//Uoee/1GDnv9Of53/SHia/z9w + lP82Z47/LF+H/yJYgP8kW4P/K2OJ/zRtkv81a5L/NWiR/zJjjv8pWob/IlJ+/x1Nev8fUHz/IVF+/yNT + gP8iU4D/IlSA/yNUf/8iVH3/I1V+/yRXfv8SLED/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8dVXb/G1l+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x1bgP8MGiP/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wsWHP9BfZv/RIGe/0eDoP9KhKH/TISh/02Dov9NgKL/S3yg/0Z1m/8+bJT/MmOM/ylb + hf8iV4H/I1qF/ytkjv8zbJT/PXKV/0V3lv9Fd5j/QXOa/zltmP8zaZX/MmmW/zVumP89dZv/Q3uc/0l/ + nf9OgJ3/UIGe/1GBoP9TgaX/S3qh/0Bym/8zZ5L/MWiR/zBskv80cpb/PHma/0N/nv9LhqD/UYmi/1SK + o/9Wi6T/WI2m/1yQpv9ckqb/XZOn/1uUqP9Zk6f/VI6m/0+Lpv9Lh6X/RoGj/z94nv84bpj/MWeS/y5j + j/8sYY7/MGiR/zZwlv89eZr/R3+g/06Fpv9Uian/V4qp/1mLqP9bi6j/X4yq/1+OqP9bjaX/WYym/1qO + qv9ckK7/Wo+r/1eKqf9ViKf/U4am/1KGpv9Og6T/SX+h/0R7nf9BeZv/PHaY/zp0l/85dJj/O3ea/z15 + nP9AfJ3/Q3+f/0eBoP9JgqD/ToWi/0+FpP9QhKP/T4Oi/0yAoP9Jfp//Rnqe/0J0nP87bJf/MmOQ/ytc + iv8nW4b/JlqF/yddhv8qYon/LGWL/y5njf8waY//MGmQ/zBpkP8vaJD/LmaP/ypijP8mXoj/I1uE/yNa + g/8mXYX/K2KK/zJpkf83cJb/N3CU/zdvkf80bI//MmaN/y5fjf8rWYr/KFOG/yVPg/8fS33/Hkx8/x5P + fP8gVX7/JFuC/ytkif80bZH/OXKV/zpzl/85cJX/OG6V/zlvlv84bZf/NGeV/zBglP8sWpD/JlSH/yJQ + gf8fTXz/HUt4/x1Kdv8jUXv/KlmB/y5ehv8rXYT/J1qC/yNWfv8eUXn/Gkx2/xtNd/8dT3r/I1Z//ylc + hf8tX4r/LmKJ/zBkiP8xZYn/M2eL/zRpjP80aoz/M2mL/zNoi/8xZor/MWeL/zBmjP8vZo3/LWWM/yxk + i/8rY4n/KmOJ/ytkiv8tZIr/MGeM/zNqjv83b4//OXCP/zptj/87a4//OWiN/zdjiv8xXIT/KFF6/yFJ + cv8aQmz/IEpz/yZSfP8uW4T/NGKL/zRkjv8zZ5D/M2iR/zFokP8xaI//MGmO/zJskf81cJX/OXSY/z13 + mv9AeZv/QHmZ/0B6mf9AfJz/QX2e/0B7n/88eJ3/NnOa/zNxmf8ycZj/NHOY/zl4mv9Bf5//SYai/0+J + pf9TjKb/Vo2n/1mLqP9Ziaf/WYqo/1iLqv9ZjKr/WYyq/1iMqP9TiKP/T4Oe/0p+m/9Cdpj/O2+V/zZr + k/82bpT/OXKW/zt0mP8+dpr/PHSY/zpwl/84bZX/N2qU/zNlkP8tX4v/KFqF/yNZgP8mXoL/LGaH/zZw + kP86dJP/PXeW/z95l/9DfJn/R36c/0l/nf9Gepn/QnWV/z9yk/8/cpb/PW+Y/zpslv82aZT/MmSQ/y1f + jP8qWon/JVWF/yNUhP8jVYX/JViH/ydbif8pXov/LGKM/y5kjv8wZ4//MmqR/zRskP81bZH/NmyR/zdt + kf85b5P/PHGV/z5yl/88cZX/NmuP/zBlif8rXoT/JlWC/yBLff8cRXf/IU18/yxbh/83apL/Qnea/0qA + n/9OhaH/UIeg/1GGn/9PhJ7/ToGe/0p7nP9FdZn/Pm6V/zhokP8uYIr/J1yF/yJYgf8lXYb/Kl+I/y1f + if8sXof/J1qD/yJVf/8eUXr/H1J8/yFUfv8jVoD/JFaB/yVYg/8lWYP/JVmC/yZagv8nWoL/JlmA/woW + IP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x5bfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/HFp+/w0aI/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/0F+nP9FgqD/SISh/0uE + of9NhKH/T4Si/06Bo/9MfaH/SHmd/z9xl/82aZH/LWKK/yhgif8nYYv/KmWQ/zBok/82bJP/PXCU/z5v + lP86bZb/NGiU/yxij/8pYY7/LmiR/zZvlf88dZf/QXeX/0V5mf9Iepv/SXmf/0d4oP9Acpz/NWqU/y9o + kf8taJD/LGuQ/zJwk/86dpf/QHyc/0qEoP9QiaP/U4qk/1WLpP9YjaX/W5Cl/12Tpv9dlKf/W5Sn/1mT + qP9VkKb/UIul/0uHpv9HgaP/Qnuf/zpxmf8zaZP/LmOP/ytijf8taY//M2+U/zt2mv9DfaD/S4Kl/1CG + p/9Uiaj/Vomo/1mIp/9biqf/Woul/1iMof9ZjKT/Wo2o/1uPq/9ajKv/V4mo/1OGpf9RhKP/ToKi/0p+ + oP9Fep3/QHeZ/zx2l/86dZf/OnaX/z97m/8/fJv/Q3+g/02Ipf9KhqT/TYak/1OLpv9PhaL/WI2n/1eL + pv9RhaP/WI6o/0+Fo/9PhqX/Uoio/z9zm/9DeJ3/NWmS/ypeiP86b5P/L2aL/zdvkv8+eJf/NG6S/0V/ + nv9CfJ3/PHeb/0mEo/88dZj/Q32d/0F8m/8rY4r/P3mZ/zZvkv87dJX/SIGh/zx2mv9Mh6T/R4Ce/z52 + l/9IgJ7/OG2U/z9vmP8/bJf/J1GD/zNji/8jUn3/J1mC/y5miP8oXoP/O3SU/zpzlP8+dpj/RH2c/z1y + lv9EeJv/QXGZ/zVolf84bJn/LVyQ/yxbjf8kVIf/HUt+/yJSgP8bSXj/Hk15/yZVfv8rWoL/MGKJ/y9g + h/8rXYX/J1mC/yNWf/8hUn3/HU55/x5Oe/8hU3//KVmG/y1eh/8uYIn/L2KI/zFlif80aIz/NWqN/zZs + jv81bI7/NGqN/zJojP8yaI3/MWeM/zBnjf8tZYv/KmOJ/yliiP8qZIn/K2WK/y5ojP8ya4//OG+Q/ztz + kf8+dJL/PnKS/z5wkf88bY//OmiM/zdjif8yXIP/LFR8/yVOdv8dRnH/H0l2/ydTfv8rWYT/L1+K/y5i + jP8tY4z/LWSM/yxli/8saI3/L2uQ/zRvkv86dJf/PXea/z94mv8+eJn/QXua/0N9nP9Dfp7/Qnye/z13 + nP84c5n/NXCY/zJvlv8ycJb/OHaZ/z98nf9Hg6H/TYml/1KMp/9VjKj/WYyp/1uLqv9bjKr/Wouq/1mL + qv9bjKr/WYup/1aIpf9RhKD/Sn2c/0R3mP89cJX/OW+U/zlwlf86c5X/PXaW/z53mP9Ad5n/PXSY/ztw + l/86bpb/OGyV/zFkjv8pXof/Jl2D/yphhf8xaoz/N3CR/zx1lP8+eJb/QXuY/0R+mv9JgZ3/SoCd/0t+ + nP9Hepn/Q3aY/0F0mP9Ac5n/PG6X/zdplP8yZZD/LV+M/ydXhv8jUYL/IVCB/yRVhP8mWIb/KVyJ/ytg + i/8tZY3/MGeO/zNqj/81bJH/OXGU/ztzlf86cpX/O3GU/zxylf8+c5b/QHWX/z5zlv85b5H/MmeK/y1e + hf8oVIL/IUl8/x9Jev8iT33/KlqF/zVojv8/dJf/Rnyc/0qCnv9Lg57/TIOe/0yCnv9Kfpz/R3mb/0Nz + mf8+bZX/N2iR/y9ijP8oXoj/JFqF/yJXg/8jVID/JVSA/yRUf/8hVHz/HlJ6/yBVff8jWYD/J1yC/yld + hP8qX4b/K2GI/yxjiv8tY4n/LmSK/y5kif8vZIn/DBki/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8IEhj/HVt+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8dWn//DyAs/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Qn+d/0WCn/9JhKH/TYaj/06Fo/9PhKP/ToKi/0t+of9GeZ3/P3KY/zZs + kv8waI//LGaO/ypnj/8sZ4//L2aS/zNok/8yaJH/NGmR/zRok/8wZZH/K2KP/yhhjf8qZY7/MmyS/zdw + k/87cpP/PXOV/z9zmf9Bcpv/PG+a/zVpl/8wZ5P/LmmT/ytqkP8ubJL/M3CV/zh1lv8/eZj/SIKe/06H + o/9SiqX/VYul/1iNpf9bkaX/XJKm/12Tp/9ck6j/WJCn/1SNp/9QiqX/TIal/0eCo/9Cep//OnKZ/zNq + k/8uZY7/KmSM/ydki/8va5D/OnSZ/0B5nv9IgKP/VIqq/1KHp/9YjKr/YZOv/1iJpf9imK7/Zpuw/1yO + pv9vo7n/bKG5/2OYsv9yqb//baW6/22lu/95ssb/bKS9/3CrwP99u8v/cq/B/367yf+CwMz/eLfF/4bG + z/+Gxc//hMHN/5LQ1v+Gw8z/i8jQ/5XR1v+Lx87/k9DV/5XS1f+Nyc//mtna/5HO0/+QzdL/nNrb/43L + 0f+S0NX/ktHV/4nGzf+Y19n/jMrQ/43L0P+Y19n/isjO/5bU1v+QztP/jMrP/5bU1/+Ny9D/kM3R/5LR + 0/+Kx87/ldTW/47M0f+Lyc//k9LV/4vKz/+Rz9L/jMvR/4fGy/+PztL/hcLK/4nGzf+Mys//frvF/47L + 0P9+u8T/f73F/43L0P98usP/icjN/4C9x/9+u8X/iMbL/3u2w/+Cv8j/frzH/3SwwP+Dwcn/bqm7/3Ox + v/90sL7/ZqC0/3ayv/9inLD/aqW2/2SdsP9inK//aaO0/1uUqv9gmq7/WpOq/1OMpv9XkKr/Sn+f/1CH + pP9PhaP/S4Cg/1OLp/9Fe5r/TIOg/0uDn/9EfJr/SoKf/z1zlP9Gf53/PHKU/zpwk/89dpf/MmiO/zZv + kv8tZYv/K2WJ/y1ni/8sZ4v/NW+S/zVukv85cZP/PnaU/0F4lP9BeZb/QXaU/z5ykv88bY//OmiM/zhj + if82X4f/LleB/yZPe/8fSHb/HUd1/yBNev8lU4D/KFqF/yldhv8oX4f/KGKJ/ytni/8ua4//NnCT/zx0 + l/8+dpn/P3iZ/0B5mv9Be5v/RH2d/0V+n/9DfJ//P3id/zpzmv80bpX/MmyU/zJulP82cpb/PXmb/0WB + n/9LhqP/T4mm/1KLqP9XjKr/Wo2p/1yNq/9bi6r/W4up/1uLqf9ZiKf/VYek/1CCof9KfJ3/Q3WY/z1w + lf85bpT/OG+U/zpylf88dZP/PneV/z92lv8+dJf/PHGW/zpvlf82apP/MWSO/ypfiP8oX4X/LGOI/zNq + jf84cZL/PHWV/z94lv9Bepf/RX+a/0l/nP9Kf53/SX2c/0d6mv9Dd5n/QnWY/0Bzmf8+cJn/OGqU/zJk + j/8rXIn/I1OB/x1MfP8hUYD/JFWD/ydahv8qX4n/LmOL/zBmjP8yaY7/NWyQ/zlwk/8+dJb/P3aY/z51 + lv88cpP/PXOU/z91l/9Adpb/PnSU/zlvkP8zaIr/Ll6G/ylTgv8jTH3/IEl7/yFOfP8oWYP/MWWL/zhw + kv8+d5b/QnyZ/0V+mv9FfZv/RXyb/0R6mv9Cdpn/P3GY/zxtlv83aZT/MGSP/ylfi/8mXIj/JlmG/yRU + gf8fTXr/H056/x5Pef8hVXz/JFt//yhfhP8tZIf/L2eJ/y9niv8waI3/MWuP/zNtkP80bI//Nm2Q/zht + kP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woZIP8dW37/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xxbf/8WMkT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9DgJ7/RoKf/0qE + of9NhqP/UIel/0+FpP9NgqL/Sn6g/0N4nP88c5j/Nm6U/zFtkv8ua5L/LmmR/zBokv8zaJP/MGWR/y1j + jv8tY47/L2aQ/y9mkf8tZpH/MGqS/zFskv8ybZH/N3GS/zlyk/86cZP/OG2U/zdrlf8zaJT/LmWU/zBq + lv8va5b/MG2V/zNwl/83c5j/OHKX/z12l/9CfJn/SoKf/1GIo/9UiqX/V4yl/1qPpf9bkab/W5Co/1qR + qf9Xjqf/Vo6q/0+Ipv9LhaX/VpCw/0mDpv9DfKL/V5Gx/0yIqf9Qjq3/ZKa+/2mpwf9vrsX/i8vc/4nI + 2f+OzNv/oeLs/5bV4f+a2eX/qOrx/5va5P+h4ur/qOnw/6Dg6f+n6O7/pebt/6Hi6P+m5+z/pOXr/6Tl + 6v+k5en/pOTo/6Tk6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh4/+h4OL/oODh/6Df4f+g3+D/n97f/5/e + 3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb3P+c29v/m9rb/5va2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5jX + 2f+Y19j/mNfY/5fW2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS + 1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/js3R/47N0f+OzdD/jczQ/43M + 0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJ + z/+Jyc//iMjP/4jIz/+IyM//iMjQ/4fI0P+Hx9D/hsfQ/4fH0P+Gx9D/hMTO/4bH0P+Cwsz/hcbQ/4PD + zv9/v8z/hMTP/327yf+DxND/fLzK/3i3xv99vcv/cK7A/3y9yf9urb7/bKq8/3Kxwv9pqLv/b62//2ai + uP9opbn/aqa6/2Gcsf9oo7f/WZKp/12UrP9SiKT/TX+f/0+Bov89Z5H/QW6T/y1Xgv8oVX//H014/xtJ + dv8oWoP/IlZ//yhfhv8qYoj/K2aL/zRvkf86cpT/PnWX/0B2mf9AeJr/Qnub/0V9nf9FfZ7/RX2e/0R7 + n/9Dep//P3ae/zhwmf8xapL/MGuR/zVwlP88eJr/Qn+f/0eEov9Mh6T/UImm/1WKp/9ajaf/W4yo/1uL + qP9Ziaf/WYin/1aGpP9UhKP/T3+h/0l6nf9Bc5f/Om2U/zVqkv82bZT/OG+V/zpzlf8+dZT/PnSV/z1y + lf86bpP/NmqR/zJmj/8sYYr/KV6I/yleh/8sY4r/M2uP/zlxlP89dpf/P3iX/0F6l/9De5j/R36b/0h9 + m/9Ge5r/QneX/0F1l/9AdJj/PnKY/zxul/84aJP/M2KQ/ytaif8iUID/H058/yRUgP8oWYT/LF6I/y9j + iv8xaIv/MmqN/zVtjv84cJH/PXSW/0F4mP9CeJj/P3aV/z5zk/8+c5P/P3SU/0F2lv9AdZT/PG+Q/zZn + i/8wXof/KFOB/yFMe/8eSXj/IUx8/ydXgv8tYYj/MmqN/zZxkf86dZT/PHaV/z12lf89dZT/PnSV/z1y + lf87bpX/OWuU/zZplP8wZZD/K2GN/ytfjP8sXIv/KViF/yFQff8dTXj/Hk95/yJWff8nXoL/LmaI/zNr + jP81bI3/M2yN/zNsjf81b5D/N3GS/zhykv86c5L/PXST/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/FCw6/xxbfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xUxRP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/0SBn/9Ig6D/SoOh/0yEo/9OhKT/UIam/06DpP9HfqD/QXib/zpz + mP82cpf/M3KX/zRxl/81b5f/N22W/zVqlP8xZ5D/LGSO/yxlj/8waJH/MmuT/zRvl/83cpn/OnWZ/zt2 + mP87dZb/PHWW/z50l/85b5T/MGaP/ytijv8uZpP/L2uX/zJwm/82c5z/OXWc/zt1m/85cpj/OnOV/z52 + lv9De5n/UYil/1OIpf9elK3/baO6/3Kpv/92sMb/jMnb/4zL3P+Kydr/nN3s/57e7f+Y2On/rO/7/6fo + 9v+j5fP/rvH7/63v+v+q7ff/re/5/6zv+P+s7vf/rO73/6vt9f+r7fX/quz0/6rs8/+p6/L/qerx/6nq + 8f+o6vD/qOnv/6fo7v+n6O7/puft/6bn7P+l5uv/pebq/6Xl6v+k5Oj/pOTo/6Pk5/+j4+b/o+Pm/6Li + 5P+i4eT/oeHj/6Hh4/+g4OH/oN/h/6Df4P+f3t//n97e/57d3f+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb + 2/+c29v/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW2P+X1tf/ltXX/5bV + 1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT1f+T0tX/k9LU/5LR1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP + 0v+Qz9L/j87S/4/O0f+PztH/js3R/47N0P+NzND/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vK + z/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI + 0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF + 0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fG0/+IyNP/iMjT/4fH1P+JyNT/h8fS/4nJ + 1f+Ix9P/h8XS/4fI1P+Avc3/i8rW/3ezxf96tsf/d7TF/2yovP97ucn/ZqG3/2qovf9kn7b/ZqG3/2ii + uP9fmLH/Y522/1OLp/9dlq//Vo+r/1KKp/9UjKj/RHud/02Epv9GfaX/Pnaf/zNtlf8uaZD/NXGW/zt3 + mv9Afp7/RIKi/0mGov9Oh6P/VIqj/1eKpP9ZiqT/WYql/1iHpP9WhaP/VIOj/1KBo/9OfqH/R3ed/zxv + lf80apH/MmiQ/zNqkv80bJb/OHCV/ztxlf89cZT/PHCT/zhskv80Z4//LWGL/yhdh/8mW4X/J1yF/y1j + i/8za5H/OXKW/z12mP8/eJn/QHmY/0J6mP9Ee5j/RHqY/0J3lv8/dJX/P3OV/z9yl/88cJb/OWyU/zZn + kf80YZD/MVqO/ydShP8jUH//KFiD/y1eh/8wY4n/NGiM/zZsj/83b5D/OXGR/zx0k/8/dpX/QniY/0N5 + l/9DeJf/QnaW/0B0k/9CdZT/Q3eV/0N1lf8/cJH/OGeM/zFfh/8oVH//Hkt3/xxJdv8fTXn/JFR//yhb + g/8tZIj/MGqL/zFtjf80b4//NW+P/zVuj/82bY//NmyQ/zVqkP8yZo7/MGSO/y5ijv8sYI3/LV+M/y1d + i/8pWIb/IlJ//x9Qev8hUnz/JVl//yxhhf8yaov/N2+P/zdxj/82cI7/N3CP/zhykP86dJP/PHaT/z53 + k/8uWW3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8VMkL/HFt+/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX7/FDFC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/QniV/0iC + n/9JgZ//SoCh/0yCov9Ng6T/S4Kk/0V9n/8+d5r/OnWZ/zh2mv83d5v/PHec/z92nP8+c5v/OG6X/zNp + kv8vZ5D/L2iR/zJslP83cZf/O3ab/z55nv9CfKD/RH6f/0V+nv9Fe53/QXia/z1zmP80a5L/LmaQ/yxm + kf8va5b/NnKb/zt4oP9RjbD/Uo2w/02Jqf9opL7/e7fM/4K90v+T0OD/r/D6/6jn8/+o5vP/svP9/7Lz + /f+x8/z/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+v8v3/r/L9/6/y/f+u8fv/rvD7/63w+v+t8Pn/rO/4/6zu + 9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr8/+p6vH/qerx/6jq8P+o6fD/qOnv/6fo7v+m5+3/pufs/6bn + 7P+l5ur/peXq/6Tl6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLl/6Lh5P+h4eP/oeHj/6Hg4v+g4OH/oN/g/5/e + 3/+f3t//n97e/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ2v+a2dr/mtna/5nY + 2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV1v+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS + 1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+Qz9L/j87R/4/O0f+OzdH/js3R/43M + 0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rKz/+Kyc//icnP/4nJ + z/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsfQ/4bG + 0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4bH + 0v+Hx9P/h8fT/4jI0/+IyNP/iMjT/4nI1P+JydT/icnU/4nJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL + 1v+My9f/jMvX/43L1/+NzNf/jczY/43M2P+OzNj/js3Z/47N2f+Oy9j/j83Z/4zK1/+Qztr/jcvY/4jF + 0/+Lydf/f7vM/4rI1v94tMn/drLH/3Ctw/9no7z/aqe9/16btv9mo7v/V5Su/2GZsP9dk6r/XpKo/1+T + qv9XiKL/XY2p/1aGo/9Ug6T/UH+i/0x8of9Edpv/OWyV/zFmjv8tZIz/LmWN/zFpkf81bZX/OG6T/zlu + kv85bZL/OGyT/zNnkP8tYYv/J1uG/yRYgv8mXIT/LGOK/zRskv84cpb/PHaY/z54mf9AeJn/QXmY/0J5 + mP9Bd5b/P3WV/z5zlP89cpX/PHCV/zptlP84aZP/NmSQ/zRej/8wV4z/JU6D/x5LfP8kU3//LmCH/zVo + jP82a43/OW+Q/zx0k/89dpT/P3eU/0F4lv9AdpX/QXiW/0R5l/9FeZf/RXiX/0V3lv9GeZf/QnOT/z1t + kP85aIz/MmGI/ypYgf8fTXj/GUdy/x1Mdv8iUnz/JliA/ypehP8uZYn/L2iL/y9pjP8waYz/MWmM/zBo + i/8wZor/MGWL/y1hif8qXYj/KVuI/ylbif8pWon/JlaF/yJSgP8fT33/H1B7/yJUfP8nW4H/L2SH/zRs + jP84cZD/OnOS/zx0k/88dZP/PXWT/z52lP9AeJX/QHmU/ytTZP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/x5FXP8aWn3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8SL0L/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP80X3b/R3+d/0h/nv9Jf5//SoCi/0mAov9HfqD/Qnud/z54 + mv85dpn/N3ea/z57nv9EfaD/R3yg/0N4n/8+dJr/OG+X/zNrk/8yapP/M22U/zlzmP8/epz/Q36e/0eB + of9Lg6T/ToSk/02Co/9Jf6D/Qnmc/0N7nv9IgaT/MWuU/2Sivf+Gw9f/m9rp/6De7f+v7vn/tfT+/7Lx + /P+19P7/tPT+/7T0/f+z9P3/s/T9/7Pz/f+y8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y + /f+v8v3/r/L9/67x/P+u8Pv/rfD6/63w+f+t7/n/rO/4/6zu9/+r7fb/q+31/6vt9f+q7PP/quvz/6nr + 8v+p6vH/qOrw/6jp8P+o6e//p+ju/6bn7f+m5+z/pufs/6Xm6/+l5er/pOXp/6Tk6P+k5Oj/o+Tn/6Pj + 5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg4f+g3+H/n97f/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/53c + 3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX2P+X1tj/l9bX/5fW + 1/+W1df/ltXX/5XU1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR0/+R0NP/kdDT/5HQ + 0/+Qz9L/kM/S/5DP0v+PztL/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vK + z/+Lys//i8rP/4rKz/+Kys//isrP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjP/4jI + 0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF + 0P+ExdD/hMXQ/4XG0f+FxtH/hcbR/4bG0f+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI0/+IyNP/iMjU/4nJ + 1P+JydT/icnV/4rJ1f+KytX/isrV/4vK1v+Lytb/i8rW/4zL1/+My9f/jMvX/43L1/+NzNj/jczY/47M + 2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/5DO2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5LP2/+Sz9z/ks/c/5PQ + 3P+T0N3/ks/d/5LO3P+U0d3/kMza/5XR3v+Qy9n/jcjX/5HM2v+GvtD/jMfX/3+3yv9/tsz/b6W//2ae + uf9alLH/SYKj/0Z/oP8yapD/Qnud/zhvlP88dJf/N2uQ/zhskP86bpP/NGmT/y9kjv8pXYj/JVqD/yNa + gf8qYoj/MWmP/zdwlf88dpj/PHaY/z53mP9BeJn/QXeY/0B2l/8/dJb/PHKU/ztwlP85bpL/OGuR/zVm + j/80YI7/MVuM/ypUhf8fSn3/FkN0/x9Pff8qXIX/MmaK/zdrjP85b4//PHSS/z94lf9BeZb/P3aU/z51 + k/9AdZT/Q3iW/0Z6mP9GeZf/RnqX/0V3lv9BcpP/PGyP/zdnjP8zYoj/LFuD/yFRef8bS3P/G0x0/yJU + fP8nWoH/LF+F/zBjif8xZov/MGeL/y9ni/8vZ4v/L2aJ/y5kiP8sYIb/Kl6F/yVZg/8jVoL/IVKA/yFS + gf8eTn7/Gkp5/xlJd/8cTXj/IFN8/yhcgf8vZYf/Nm2N/ztykP89dpP/P3eV/0N6mP9BeZf/QnmX/0N7 + mP9Cepb/ID1K/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HUpk/xtafv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1p9/xZAWv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zFc + dP9FfJv/Rnyc/0d8nv9IfaD/Rn2g/0J7nv8+eZz/Onea/zZ1l/88epv/RH+f/0uCo/9LgaT/SH6i/0N6 + n/88c5n/Nm+W/zNsk/81b5X/OHOY/z95m/9Ff57/SoSh/1CIpP9Siaf/ZZu3/3WsxP97tMv/jMbZ/6zo + 8/+39f7/t/X+/7f1/v+29f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT+/7P0/f+z9P3/s/P9/7Pz + /f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x+/+u8Pv/rfD5/63v + +f+s7/j/rO73/6vt9v+r7fX/q+31/6rs9P+q6/P/qevy/6nq8f+p6vH/qOrw/6jp7/+n6O7/p+ju/6bn + 7f+m5+z/pebr/6Xm6v+l5er/pOTo/6Tk6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh4/+h4eP/oODh/6Df + 4f+g3+D/n97f/5/e3v+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/m9rb/5va2/+b2tr/mtna/5rZ + 2v+Z2Nn/mdjZ/5nY2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT + 1f+U09X/k9LU/5PS1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/j87R/47N + 0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+My8//i8rP/4vKz/+Lys//i8rP/4rKz/+Kys//isnP/4rJ + z/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+Hx9D/h8fQ/4fH0P+Hx9D/hsfQ/4bH + 0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG + 0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydX/isnV/4rJ1f+KytX/i8rW/4vK + 1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jszY/47M2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO + 2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP3P+Sz9z/ktDc/5PQ3f+T0N3/k9Dd/5TR3f+U0d3/ldHe/5XR + 3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fS4P+X0+D/l9Pg/5jU4f+U0d7/kc3b/5bR3/+KxdX/k87d/4C6 + zf+DvNH/cqvA/3Cpvv9nnbf/V4+t/1KHqP83bJL/QHiZ/zFpjf86c5f/NW+U/zhylv86c5X/O3OW/z51 + l/9Adpj/QHWY/zxylf86b5P/OW2S/zZpj/81Z47/MmGL/zBbiP8tWIf/J1KB/xxIef8bSXj/Hk58/yZX + g/8uYIj/NWeL/zltjv88cpH/P3aU/z93lP89dJL/P3OT/0B0lP9CdZb/RHaW/0R3lv9Ed5b/Q3WW/0Bw + lP85aY7/NGSJ/y9fhf8nV37/H092/xlLcv8eUXj/JVl//yxfhP8vYoj/M2aL/zRnjP80aY3/MmmM/zFo + i/8wZ4r/L2WI/yxihv8pXYT/JVqD/yFVgP8dUH3/G0x7/xlJef8VRXT/E0Nx/xZGcv8eUHr/KFuB/y9k + if83bY7/PHOS/z52k/9BeZb/QnmX/0R6mP9Fe5j/RHqY/0N6l/8ZLTj/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8nYoP/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/GERg/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/LVNp/0N6m/9Ee5z/Rnud/0R6nv9BeZ3/Pnic/zp2 + mv83dJj/OHaY/0B8mv9Jgp//TYSj/06EpP9Phaf/SH+i/0F4nf86cpf/NW6U/zVvlP84cpf/PXea/0aA + oP9jnLb/hb/Q/6Xf6/+p4+//t/P8/7n2/v+49f7/uPX+/7f1/v+39f7/t/X+/7f1/v+29f7/tvT+/7X0 + /v+19P7/tfT+/7T0/v+09P7/tPT9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sfP9/7Dy + /f+w8v3/r/L9/6/y/f+u8fz/rvH7/67w+/+t8Pr/rfD5/6zv+P+s7vf/rO73/6vt9v+r7fX/quz0/6rs + 8/+q6/P/qerx/6nq8f+o6vD/qOnw/6fo7v+n6O7/puft/6bn7P+m5+z/pebq/6Xl6v+k5en/pOTo/6Pk + 5/+j4+b/o+Pm/6Li5f+i4eT/oeHj/6Hh4/+h4OL/oN/h/6Df4P+f3t//n97f/57d3f+e3d3/nt3d/53c + 3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va2v+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW + 2P+X1tf/l9bX/5bV1/+W1db/ldTW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5LR1P+S0dT/ktHT/5HQ + 0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+PztH/js3R/47N0f+NzND/jczQ/43M0P+My8//jMvP/4zL + z/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jI + z/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF + 0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Gx9L/h8fT/4fH0/+IyNP/iMjT/4jI + 1P+JyNT/icnU/4nJ1P+KydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M + 2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Qztr/kc7b/5HP2/+Rz9v/ks/b/5LP + 3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT + 4P+X0+D/mNTh/5jU4f+Y1OH/mNTh/5nV4v+Z1eL/mtXi/5rV4v+a1uP/m9bj/5vW4/+Z1OH/mdTi/5zX + 5P+Pytn/mNLi/4a/0/+Lxdf/drHG/3Ksw/9hmrX/XpWx/1iOq/9JgKH/SH6g/zptlP85bZP/MmSL/zJj + if8vXYb/L1uG/y1ahv8nVIL/H057/x1Mev8dTnr/I1R//ytchv8zZIr/OGuN/zxwkP8+c5L/PnOT/z5y + lP8/cpT/QHOW/0Fzlf9Cc5b/QXOU/0BylP8/cJX/O2uR/zJiif8sXYX/KFl//yBReP8bTXP/HE91/yJW + fP8nXIH/LmKH/zNmiv81aYz/N2qO/zhrjv83a43/NmuN/zRqi/8yZ4r/L2WH/yxihv8pX4X/JFqD/yFV + gf8cTnv/GEh3/xNCcv8QQG//FENw/xtLdv8mV4D/MWOJ/zhtj/89c5L/P3aU/0B4lP9BeZX/Q3qW/0R7 + l/9Fepf/RHqY/xEeJf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwcI/x9dgP8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZff8UQl7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8gPEz/Qnia/0R5nf9DeZ3/QXec/z12m/86dZr/NnOZ/zVzl/87eJf/Qn2Z/0qDnv9OhqL/UIak/0+G + pv9NhKX/R36g/z93mv85cpb/NW6T/0J7nv9lnrn/j8na/6ji7v+69v7/uvb+/7n2/v+59v7/ufb+/7j1 + /v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29f7/tfT+/7X0/v+19P7/tfT+/7T0/v+09P3/s/T9/7P0 + /f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+v8v3/r/L9/6/y/f+u8fz/rvD7/63w + +v+t8Pn/re/5/6zu9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr8/+p6/L/qerx/6jq8P+o6fD/qOnv/6fo + 7v+m5+3/pufs/6bn7P+l5uv/peXq/6Tl6f+k5Oj/pOTo/6Pj5v+j4+b/ouLl/6Li5P+i4eT/oeHj/6Hg + 4v+g4OH/oN/h/5/e3/+f3t//n97e/57d3f+e3d3/ndzc/53c3P+d3Nz/nNvb/5zb2/+b2tv/m9rb/5rZ + 2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV1/+V1Nb/ldTW/5XU + 1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+Qz9L/j87S/4/O + 0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rK + z/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jIz/+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH + 0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4XG + 0f+GxtL/hsfS/4bH0v+Hx9L/h8fT/4jI0/+IyNP/iMjT/4jI1P+JydT/icnU/4nJ1f+KydX/isrV/4rK + 1f+Lytb/i8rW/4zL1v+My9f/jMvX/4zL1/+NzNf/jczY/43M2P+OzNj/jszY/47N2f+Pzdn/j83Z/4/N + 2f+Qztr/kM7a/5DO2v+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+T0N3/lNHd/5TR + 3v+V0d7/ldHe/5XS3/+W0t//ltLf/5bS3/+X0+D/l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV + 4v+a1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y5f+e2OX/ntjm/57Y + 5v+c1uT/n9nm/5nT4/+Qydr/kcnb/3+2y/99tMv/aJ22/2WYs/9OgKD/ToCi/zZnkP81Z4//JVaA/xtM + d/8fT3n/JleA/zJhiv85aY//PW2R/z5xk/8+c5X/PnKV/0Bxlv8/cJX/QHCV/0BvlP87bJD/N2qP/zZo + kP8wYYn/KFqB/yRVff8hU3v/HVB3/xtPdf8eU3j/JFl+/ypghf8wZor/NWqN/zhtj/86b5D/PHCQ/zxw + kP86bo//OGyN/zdri/81aoz/MWiL/y5liv8sYon/Kl6H/yRXgv8cTHr/F0Z2/xNCcf8VRHH/G0p2/yVV + f/8vYYj/OGuP/z1xkv8/dZT/QHeU/0F5k/9DepT/RXuX/0V6l/9EeJj/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8OHCP/Il+B/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpS + df8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x48S/8/dpj/QHaa/0B1nP88c5v/OnKa/zZx + mf8zcJj/N3SX/zx4lf9CfZf/SYKd/02Fof9QiKT/T4ek/06GpP9KgqL/RX2f/z53mf9jnLb/m9Xk/7v3 + /v+79v7/u/b+/7r2/v+69v7/ufb+/7n2/v+59v7/ufb+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b1 + /v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/v+z9P3/s/T9/7Pz/f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz + /f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rvD7/63w+f+t7/n/rO/4/6zu9/+r7fb/q+31/6vt + 9f+q7PT/quvz/6nr8v+p6vH/qerx/6jp8P+o6e//p+ju/6fo7v+m5+3/pufs/6Xm6/+l5ur/peXq/6Tk + 6P+k5Oj/o+Tn/6Pj5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg4f+g3+H/oN/g/5/e3/+f3t7/nt3d/57d + 3f+e3d3/ndzc/53c3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Z2Nn/mNfY/5jX + 2P+X1tj/l9bY/5fW1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS1P+T0tT/ktHU/5LR + 1P+R0NP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O0f+OzdH/js3Q/43M0P+NzND/jMvP/4zL + z/+My8//jMvP/4vKz/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJz/+Jyc//icnP/4nI + z/+IyM//iMjP/4jI0P+IyND/h8fQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG + 0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4fH0v+Hx9P/h8fT/4jI + 0/+IyNP/iMjU/4nI1P+JydT/icnV/4rJ1f+KydX/isrV/4vK1v+Lytb/i8rW/4zL1v+My9f/jMvX/43L + 1/+NzNf/jczY/47M2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5LP + 2/+Sz9z/ks/c/5LQ3P+T0N3/k9Dd/5PQ3f+U0d3/lNHe/5XR3v+V0d7/ldLe/5bS3/+W0t//ltLf/5bT + 3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5nV4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW + 5P+c1+T/nNfk/5zX5P+d1+X/ndjl/53Y5f+e2OX/ntjm/57Z5v+f2eb/n9nm/5/Z5/+g2ef/oNrn/6Da + 6P+h2uj/oNnm/6Da6P+Z0eH/ntjn/4zF2P+Sytz/cai//2OYs/9GeJr/S3yf/0l5nv9FdJn/Q3SY/z5w + lf8+cZf/PG6U/zprkv87apL/OGiP/zFkiv8tYIf/K16G/yZZgf8gUnv/IlV+/yFUff8eUnr/HVJ5/yBW + fP8lXIH/LWSI/zRrjv85cJH/PXOS/z50k/9AdZT/QXWT/z9ykf88b5D/O2+Q/zpukP82bZD/M2qO/zJp + jf8wZo3/LGCK/yZXhP8eTXv/GUh2/xdHdP8cS3j/JVSA/y5fiP83ao//PXCU/0BzlP9AdZT/QXeU/0R7 + lf9GfJf/RXqY/ztph/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xgwPf8cW3//Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1d8/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/GDJA/zlzk/87c5b/O3OY/zlxmP82b5j/M26X/zRwmP84dJj/PXmX/0J+mf9HgZv/S4Sf/06H + ov9QiKP/T4ej/02Fov9Zka3/jcfZ/7Lt9v+89/7/u/f+/7v2/v+79v7/uvb+/7r2/v+69v7/ufb+/7n2 + /v+59v7/uPX+/7j1/v+39f7/t/X+/7f1/v+39f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT+/7T0 + /f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x + +/+u8Pv/rfD6/63v+f+s7/j/rO73/6zu9/+r7fX/q+31/6rs9P+q7PP/quvz/6nq8f+p6vH/qOrw/6jp + 8P+n6O7/p+ju/6bn7f+m5+z/pebr/6Xm6v+l5er/pOXp/6Tk6P+j5Of/o+Pm/6Pj5v+i4uX/ouHk/6Hh + 4/+h4eP/oeDi/6Df4f+g3+D/n97f/5/e3/+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/nNvb/5va + 2/+b2tr/mtna/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5fW1/+W1df/ltXW/5XU + 1v+V1Nb/lNPV/5TT1f+U09X/k9LV/5PS1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O + 0v+PztH/j87R/47N0f+OzdD/jczQ/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rK + z/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+HyND/h8fQ/4fH + 0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG + 0f+FxtH/hsbR/4bG0v+Gx9L/hsfS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydT/isnV/4rJ + 1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jczY/47M2P+Ozdn/js3Z/4/N + 2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/kc/b/5LP3P+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR + 3f+U0d3/lNHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU + 4f+Z1eL/mdXi/5rV4v+a1eL/mtbj/5vW4/+b1uP/m9bj/5zX5P+c1+T/nNfk/5zX5f+d2OX/ndjl/57Y + 5f+e2Ob/ntnm/5/Z5v+f2eb/n9nn/5/Z5/+g2uf/oNro/6Da6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Pc + 6v+j3Or/otvp/6Pc6v+b0+P/pd3r/5TK3v+Lwtb/ea7G/22hvf9dkrD/TH6h/0Jymf8xY4r/J1yC/yhd + hP8oXIT/JFeA/yZZgv8nW4T/JlqD/yRagv8jWoH/I1uA/ydghP8uZ4r/Nm6P/z13lf8/d5X/QXmU/0N6 + lv9Eepb/Q3iV/0F1lP9Acpb/P3GV/zxwlP85bpH/NmyQ/zRqj/8yZ4//LV+K/ydYhP8gUH3/HEt4/x1N + ev8kVID/L1+J/zdokP89b5T/P3KV/0F1lP9DeJb/RXqY/0d8mP9Eepr/MVlz/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/GztM/xxbf/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8ZWHz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NGyT/NW+R/zdwlP83b5b/Nm6W/zJs + lv8xbZb/NHCX/zh1mf8/e5v/RYCd/0iCnv9Kg53/TYag/0+Hov9TjKb/fLXI/7jz+v+99/7/vPf+/7z3 + /v+79/7/u/b+/7v2/v+79v7/uvb+/7r2/v+59v7/ufb+/7n2/v+49f7/uPX+/7j1/v+39f7/t/X+/7f1 + /v+29f7/tvX+/7X0/v+19P7/tfT+/7X0/v+09P7/tPT9/7P0/f+z9P3/s/P9/7Lz/f+y8/3/svP9/7Hz + /f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y/f+v8v3/rvH8/67w+/+t8Pr/rfD5/63v+f+s7vf/rO73/6vt + 9v+r7fX/quz0/6rs8/+q6/P/qevy/6nq8f+o6vD/qOnw/6jp7/+n6O7/puft/6bn7P+m5+z/pebr/6Xl + 6v+k5en/pOTo/6Tk6P+j4+b/o+Pm/6Li5f+i4uT/oeHj/6Hh4/+h4OL/oODh/6Df4P+f3t//n97f/5/e + 3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb2/+c29v/m9rb/5va2/+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX + 2f+Y19j/mNfY/5fW2P+X1tf/l9bX/5bV1/+W1df/ldTW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS + 1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O0v+PztH/js3R/47N0f+OzdD/jczQ/43M + 0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kys//isnP/4nJz/+Jyc//icnP/4nJ + z/+JyM//iMjP/4jIz/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH0P+GxtD/hcbQ/4XG + 0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+FxtH/hsbS/4bH0v+Gx9L/h8fS/4fH + 0/+IyNP/iMjT/4jI0/+JyNT/icnU/4nJ1P+JydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL + 1/+My9f/jczX/43M2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pzdn/kM7a/5DO2v+Qztr/kc7b/5HP + 2/+Rz9v/ks/b/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS + 3/+W0t//l9Pg/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mtXi/5rV4v+a1eP/m9bj/5vW + 4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X5f+d2OX/ntjl/57Y5v+e2Ob/ntnm/5/Z5v+f2ef/n9nn/6DZ + 5/+g2uj/oNro/6Ha6P+h2uj/odvp/6Lb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+k3ev/pd3s/6Xe + 7P+m3uz/pNzr/6ff7f+h2en/odfo/5DH2v+BuM3/b6W+/1yRr/9BdZn/PHGV/zNnj/8uY4v/LGKK/ylh + iP8mYIX/KWOH/y9qi/83cZH/PHeU/z96lv9BfJX/Q32W/0V+l/9Hf5n/RXqZ/0R3mv9DdZr/QHOV/zxx + kv86b5L/NmuQ/zRoj/8yZY7/Ll+K/ydWgv8hUHz/H056/yVUgP8tXoj/NmeQ/zxvlf9Ac5f/QXWW/0N3 + l/9Fepn/RHmb/0J3nP8jQlb/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8kUGf/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZff8FDxf/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wwaJP80a5H/NW2T/zRrlP8za5X/MWuV/zBslf8ycJb/OXaa/0F9n/9HgqH/SoSh/0qE + n/9NhqD/Vo+n/4a90P+48vv/vff+/733/v+89/7/vPf+/7z3/v+79v7/u/b+/7v2/v+69v7/uvb+/7n2 + /v+59v7/ufb+/7n2/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0 + /v+09P3/s/T9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+w8v3/r/L9/6/y + /f+u8fz/rvH7/63w+v+t8Pn/re/5/6zv+P+s7vf/q+32/6vt9f+r7fX/quz0/6rr8/+p6/L/qerx/6nq + 8f+o6fD/qOnv/6fo7v+n6O7/pufs/6bn7P+l5uv/pebq/6Tl6f+k5Oj/pOTo/6Pk5/+j4+b/ouLl/6Li + 5P+i4eT/oeHj/6Hg4v+g4OH/oN/h/6Df4P+f3t//n97e/57d3f+e3d3/ndzc/53c3P+d3Nz/nNvc/5zb + 2/+b2tv/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX2P+Y19j/l9bY/5fW2P+X1tf/ltXX/5bV + 1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT1f+T0tT/k9LU/5LR1P+S0dT/kdDT/5HQ0/+R0NP/kdDT/5DP + 0v+Qz9L/j87S/4/O0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4zLz/+Lys//i8rP/4vK + z/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+IyM//iMjP/4jIz/+IyND/iMjQ/4fH + 0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF + 0P+FxtH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ + 1f+KydX/isnV/4rK1f+Lytb/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M2P+OzNj/jszY/47N + 2f+Pzdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Sz9v/ks/c/5LP3P+S0Nz/k9Dd/5PQ + 3f+T0N3/lNHd/5TR3v+V0d7/ldHe/5XS3v+W0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU + 4f+Y1OH/mdTh/5nV4v+Z1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y + 5f+d2OX/ntjm/57Y5v+e2eb/n9nm/5/Z5v+f2ef/oNnn/6Da5/+g2uj/odro/6Ha6P+h2+j/odvp/6Lb + 6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td6/+l3ev/pd3s/6be7P+m3u3/p9/t/6ff7f+o3+7/qODu/6ng + 7v+p4O//pt3s/6rh8P+YzuH/j8ba/3ClwP9flbT/NGyR/zt1lv8qZYn/MG2O/zZykf87d5T/P3qV/0F9 + lf9DgJb/RoGY/0d/mv9HfJ3/Rnqd/0R4mv9Ddpf/QHST/zxykf85bpD/N2uQ/zVmkP8vYYv/KVqE/yNT + fv8hUn3/JFV//ytdh/80Z4//PG+V/z9yl/8/c5b/QXWW/0J3mf9Bd5v/P3Wb/xoyQv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/yFWc/8bWn3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/G1l9/wgVH/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CRMa/zJnkv8yZ5P/MWeU/zBm + lP8vapP/L22U/zJxl/87d5z/Q36h/0eCov9JgqH/TISh/02Hov+FvtD/uPD6/733//+99/7/vff+/733 + /v+89/7/vPf+/7v3/v+79v7/u/b+/7r2/v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/t/X+/7f1 + /v+39f7/t/X+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/v+09P3/s/T9/7Pz/f+z8/3/svP9/7Lz + /f+x8/3/sfP9/7Hz/f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rvD7/63w+v+t7/n/rO/4/6zu + 9/+s7vf/q+31/6vt9f+q7PT/quzz/6nr8v+p6vH/qerx/6jq8P+o6fD/p+ju/6fo7v+m5+3/pufs/6Xm + 6/+l5ur/peXq/6Tl6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLk/6Lh5P+h4eP/oeHj/6Dg4f+g3+H/oN/g/5/e + 3/+f3t//nt3d/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY + 2f+Z2Nn/mNfZ/5jX2P+X1tj/l9bY/5fW1/+X1tf/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS + 1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O0f+OzdH/js3Q/43M + 0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJ + z/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG + 0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4fH + 0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnU/4rJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL + 1v+My9f/jMvX/43L1/+NzNf/jczY/47M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO + 2/+Rztv/kc/b/5HP2/+Sz9z/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5XR3v+V0d7/ldLe/5XS + 3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5nV4v+a1eL/mtXj/5rW + 4/+b1uP/m9bj/5vW4/+c1+T/nNfk/5zX5P+c1+X/ndjl/53Y5f+e2OX/ntjm/57Z5v+f2eb/n9nm/5/Z + 5/+g2ef/oNrn/6Da6P+g2uj/odro/6Hb6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+j3Or/pN3r/6Xd + 6/+l3ez/pd7s/6be7f+n3+3/p9/t/6ff7v+o4O7/qeDu/6ng7/+p4e//quHv/6rh8P+r4vD/q+Lx/6ne + 7/+p3+//mM/h/5XL3/9xqsL/ZJ62/02IpP9Cfpj/QX6X/0SBmP9FgZn/R36b/0d8nf9HfJ3/Rnub/0V5 + mP9DeJX/QHaT/zxykf85bZD/NmiP/zFii/8qXIX/JFWA/yFTff8jVX//K16G/zRnjv86b5T/O2+U/ztw + lP87cJT/O3GX/zxxmP86cJb/Dhsk/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/J2SF/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8cWn//CRYh/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/L2KR/y9ikv8tYJL/LGWR/yxpkP8sbZD/NXOW/z16nf9Ef6L/R4Ch/0mC + oP9MhKD/da3B/7ny+v+++P//vvf//733/v+99/7/vff+/7z3/v+89/7/u/f+/7v2/v+79v7/u/b+/7r2 + /v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b0/v+19P7/tfT+/7X0 + /v+09P7/tPT+/7T0/f+z9P3/s/T9/7Pz/f+y8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y + /f+v8v3/r/L9/67x+/+u8Pv/rfD6/63w+f+t7/n/rO73/6zu9/+r7fb/q+31/6rs9P+q7PP/quvz/6nr + 8v+p6vH/qOrw/6jp8P+o6e//p+ju/6bn7f+m5+z/pufs/6Xm6v+l5er/pOXp/6Tk6P+k5Oj/o+Pm/6Pj + 5v+i4uX/ouLk/6Hh4/+h4eP/oeDi/6Dg4f+g3+D/n97f/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/53c + 3P+c29v/nNvb/5va2/+b2tv/mtna/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX2P+X1tj/l9bX/5fW + 1/+W1df/ltXW/5XU1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR0/+R0NP/kdDT/5HQ + 0/+Qz9L/kM/S/5DP0v+PztH/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vK + z/+Lys//i8rP/4rKz/+Kys//isrP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjP/4jI + 0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF + 0P+ExdD/hcXR/4XG0f+FxtH/hcbR/4bG0v+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI0/+IyNP/icjU/4nJ + 1P+JydT/icnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jMvX/43M1/+NzNj/jczY/47M + 2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kM7a/5HO2/+Rz9v/kc/b/5LP2/+Sz9z/ktDc/5PQ + 3P+T0N3/k9Dd/5TR3f+U0d3/lNHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5fT + 4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5rV4v+a1eL/mtXj/5vW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX + 5f+d1+X/ndjl/57Y5f+e2Ob/ntjm/57Z5v+f2eb/n9nn/5/Z5/+g2ef/oNro/6Da6P+h2uj/odro/6Hb + 6f+i2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd7P+l3uz/pt7s/6be7f+n3+3/p9/u/6jf + 7v+o4O7/qeDv/6nh7/+q4e//quHw/6vi8P+r4vH/rOLx/6zi8f+t4/L/rePy/67k8/+u5PP/pNvs/5rQ + 4v90rcP/Z6G2/0qCnf9Kgp//R32b/0Z9m/9HfZv/R3yb/0Z7mP9CeJT/P3SR/ztwj/83ao7/MWOK/ypc + hP8iVX7/H1F7/yNVf/8qXYb/MmaN/zVpj/82bJD/NmyQ/zRqkP81apL/NGqS/zNpj/8GDRH/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/w8cI/8fXX//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8TLkL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8pWIX/K12P/ypf + kP8oZI7/KGiM/y9vkf83dpb/Pnya/0N+n/9Gf6D/SYGf/16Wr/+t5fD/v/j//774//++9///vff//733 + /v+99/7/vPf+/7z3/v+89/7/u/b+/7v2/v+79v7/uvb+/7r2/v+59v7/ufb+/7n2/v+49f7/uPX+/7j1 + /v+39f7/t/X+/7f1/v+29f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT9/7P0/f+z9P3/s/P9/7Lz + /f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x+/+t8Pr/rfD5/63v + +f+s7/j/rO73/6vt9v+r7fX/q+31/6rs8/+q6/P/qevy/6nq8f+p6vH/qOnw/6jp7/+n6O7/p+ju/6bn + 7P+m5+z/pebr/6Xm6v+k5en/pOTo/6Tk6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh4/+h4OL/oODh/6Df + 4f+g3+D/n97f/5/e3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb3P+c29v/m9rb/5va2/+b2tr/mtna/5rZ + 2v+Z2Nn/mdjZ/5nY2f+Y19j/mNfY/5fW2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT + 1f+T0tX/k9LU/5PS1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/js3R/47N + 0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//i8rP/4rKz/+Kys//isnP/4rJ + z/+Jyc//icnP/4nJz/+Jyc//iMjP/4jIz/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH + 0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcbR/4XG0f+FxtH/hsbR/4bH + 0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydX/isnV/4rJ1f+KytX/i8rW/4vK + 1v+Lytb/jMvX/4zL1/+My9f/jcvX/43M2P+NzNj/jszY/47M2P+Ozdn/j83Z/4/N2f+Pzdn/j87a/5DO + 2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP3P+Sz9z/k9Dc/5PQ3f+T0N3/k9Dd/5TR3f+U0d7/ldHe/5XR + 3v+V0t7/ltLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mtXi/5rV + 4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X5f+d2OX/ndjl/57Y5v+e2Ob/ntnm/5/Z + 5v+f2ef/n9nn/6DZ5/+g2uf/oNro/6Ha6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td + 6/+k3ev/pd3r/6Xe7P+m3uz/pt7t/6ff7f+n3+7/qN/u/6jg7v+p4O7/qeDv/6rh7/+q4fD/quHw/6vi + 8P+s4vH/rOLx/6zj8v+t4/L/ruTz/67k8/+u5PP/r+T0/7Dl9P+r4O//quDv/4e90v9so7r/WI6o/0Z9 + mv9Ifpn/R32Z/0V5lv9BdJP/PHGR/zhrjv8yY4r/KVuD/yFUfP8eUnr/IVZ9/yhdhP8uYon/MWaM/zFo + jP8vZov/LWSL/y5kjP8tY4v/L2WL/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EiMs/yBe + gf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1l9/xIvQf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/xxCZ/8nWoz/J16M/yZhiv8paIz/MW+S/zl2lv8/fJr/RH+d/0eA + nv9NhKL/nNPh/774//+/+P//vvj//773//+99///vff+/733/v+89/7/vPf+/7z3/v+79/7/u/b+/7v2 + /v+69v7/uvb+/7r2/v+59v7/ufb+/7n2/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29f7/tvT+/7X0 + /v+19P7/tfT+/7T0/v+09P7/tPT9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy + /f+w8v3/r/L9/6/y/f+u8fz/rvH7/67w+/+t8Pr/re/5/6zv+P+s7vf/rO73/6vt9f+r7fX/quz0/6rs + 8/+p6/L/qerx/6nq8f+o6vD/qOnv/6fo7v+n6O7/puft/6bn7P+l5uv/pebq/6Xl6v+k5en/pOTo/6Pk + 5/+j4+b/o+Pm/6Li5P+i4eT/oeHj/6Hh4/+g4OH/oN/h/6Df4P+f3t//n97e/57d3f+e3d3/nt3d/53c + 3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW + 2P+X1tf/ltXX/5bV1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT1f+T0tX/k9LU/5LR1P+S0dT/ktHT/5HQ + 0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+PztH/js3R/47N0P+NzND/jczQ/43M0P+My8//jMvP/4zL + z/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jI + z/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF + 0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI + 1P+JyNT/icnU/4nJ1f+KydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M + 2P+OzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Rz9v/ks/c/5LP + 3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+V0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT + 4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+Z1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX + 5P+c1+T/ndfl/53Y5f+d2OX/ntjl/57Y5v+e2eb/n9nm/5/Z5v+f2ef/oNnn/6Da5/+g2uj/oNro/6Ha + 6P+h2+j/odvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/o9zq/6Td6/+l3ev/pd3s/6Xe7P+m3u3/p9/t/6ff + 7f+n3+7/qODu/6ng7v+p4O//qeHv/6rh8P+q4fD/q+Lw/6vi8f+s4vH/rOPy/63j8v+t4/L/ruTz/67k + 8/+v5PT/r+X0/7Dl9P+w5vX/seb1/7Hl9f+j2Or/mc7h/3CkvP9Kf5v/R3uY/0N1lf8+cJP/OWqQ/zJi + iv8oWYL/IVN7/x9Tev8gV3z/JVuB/ypghv8tZIj/LWWI/ytjh/8pYYb/K2KI/yxjif8iSmf/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8aN0f/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8bWX7/GkVi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Fzlb/yJX + hv8kXIj/JmGJ/y1ojv80b5L/OnaW/0B7mf9Ff5z/SH+d/2edtf+58vn/v/j//7/4//+++P//vvj//773 + //+99/7/vff+/733/v+89/7/vPf+/7v3/v+79v7/u/b+/7r2/v+69v7/uvb+/7n2/v+59v7/ufb+/7j1 + /v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/v+09P3/s/T9/7Pz + /f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+v8v3/r/L9/6/y/f+u8fv/rvD7/63w + +v+t8Pn/rO/4/6zu9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr8/+p6/L/qerx/6jq8P+o6fD/qOnv/6fo + 7v+m5+3/pufs/6bn7P+l5ur/peXq/6Tl6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLl/6Li5P+h4eP/oeHj/6Hg + 4v+g4OH/oN/g/5/e3/+f3t//n97e/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ + 2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV1v+V1Nb/ldTW/5XU + 1v+U09X/lNPV/5PS1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+Qz9L/j87R/4/O + 0f+OzdH/js3R/43M0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rK + z/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH + 0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG + 0f+GxtL/hsfS/4bH0v+Hx9L/h8fT/4jI0/+IyNP/iMjT/4nI1P+JydT/icnU/4nJ1f+KydX/isrV/4rK + 1f+Lytb/i8rW/4zL1v+My9f/jMvX/43L1/+NzNf/jczY/43M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O + 2v+Qztr/kM7a/5DO2v+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5TR + 3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Y1OH/mdXi/5nV + 4v+a1eL/mtXi/5rV4/+b1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y5f+e2OX/ntjm/57Y + 5v+f2eb/n9nm/5/Z5/+f2ef/oNnn/6Da6P+g2uj/odro/6Ha6P+h2+n/otvp/6Lb6f+i2+n/o9zq/6Pc + 6v+j3Or/pN3r/6Xd6/+l3ez/pd7s/6be7P+n3+3/p9/t/6ff7v+o3+7/qODu/6ng7/+p4e//quHv/6rh + 8P+r4vD/q+Lx/6zi8f+s4vH/rePy/63j8v+u5PP/ruTz/6/k9P+v5fT/sOX0/7Dl9P+x5vX/seb1/7Hm + 9v+y5/b/r+Py/6Xa7P95rMT/T4Gi/0Fyl/85aJD/L16I/yZWgf8gUXv/HlB4/x9Ue/8kW4D/J1+D/ypi + hv8rZIf/KmSG/yxliP8uZov/L2iL/x07UP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/x5G + Xv8cW3//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8ZRWH/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NJj7/HlKA/yBWgv8pYIj/MGiO/zZukv88dZb/QXqZ/0R8 + mv9LgZ//nNHg/773//+/+P//v/j//774//+++P//vvf//733//+99/7/vff+/7z3/v+89/7/vPf+/7v2 + /v+79v7/u/b+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b1 + /v+19P7/tfT+/7X0/v+19P7/tPT+/7T0/f+z9P3/s/T9/7Pz/f+y8/3/svP9/7Lz/f+x8/3/sfP9/7Hz + /f+w8v3/sPL9/6/y/f+v8v3/r/L9/67x/P+u8fv/rfD6/63w+f+t7/n/rO/4/6zu9/+r7fb/q+31/6vt + 9f+q7PP/quvz/6nr8v+p6vH/qOrw/6jp8P+o6e//p+ju/6bn7f+m5+z/pufs/6Xm6/+l5ur/pOXp/6Tk + 6P+k5Oj/o+Tn/6Pj5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg4f+g3+H/n97f/5/e3/+f3t7/nt3d/57d + 3f+d3Nz/ndzc/53c3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX + 2P+X1tj/l9bX/5fW1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR + 0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/5DP0v+PztL/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zL + z/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isrP/4rJz/+Jyc//icnP/4nJz/+Jyc//icnP/4jI + z/+IyM//iMjP/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG + 0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XG0f+FxtH/hcbR/4bG0f+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI + 0/+IyNP/iMjU/4nJ1P+JydT/icnV/4rJ1f+KydX/isrV/4vK1v+Lytb/i8rW/4zL1/+My9f/jMvX/43L + 1/+NzNj/jczY/47M2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/5DO2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5LP + 2/+Sz9z/ks/c/5PQ3P+T0N3/k9Dd/5PQ3f+U0d3/lNHe/5XR3v+V0d7/ldLf/5bS3/+W0t//ltLf/5bT + 3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5rV4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW + 5P+c1+T/nNfk/5zX5f+d1+X/ndjl/53Y5f+e2Ob/ntjm/57Z5v+f2eb/n9nn/5/Z5/+g2ef/oNrn/6Da + 6P+h2uj/odro/6Hb6P+i2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd6/+l3uz/pt7s/6be + 7f+n3+3/p9/u/6jf7v+o4O7/qeDu/6nh7/+q4e//quHw/6rh8P+r4vH/rOLx/6zi8f+s4/L/rePy/67k + 8/+u5PP/ruTz/6/k9P+w5fT/sOX0/7Dm9f+x5vX/seb2/7Ln9v+y5/b/s+f3/7Hm9v+r3/D/caPB/0Ny + mv8wXYn/JVR//x5Oef8aSnT/IlR7/yZbgP8pYIT/K2WI/y1nif8vaYr/Mm2N/zRvj/82b5H/GTJA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/JVh3/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/x5bgP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wwh + Nf8ZSnj/IFJ+/ydchf8vZYv/NmyR/ztylP8/dpf/QneX/1SHpf+17fb/wPj//7/4//+/+P//v/j//774 + //++9///vff//733/v+99/7/vPf+/7z3/v+89/7/u/f+/7v2/v+79v7/uvb+/7r2/v+59v7/ufb+/7n2 + /v+59v7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT+/7P0 + /f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x + +/+u8Pv/rfD5/63v+f+s7/j/rO73/6vt9v+r7fX/q+31/6rs9P+q7PP/qevy/6nq8f+p6vH/qOrw/6jp + 7/+n6O7/p+ju/6bn7f+m5+z/pebr/6Xm6v+l5er/pOTo/6Tk6P+j5Of/o+Pm/6Pj5v+i4uT/ouHk/6Hh + 4/+h4eP/oODh/6Df4f+g3+D/n97f/5/e3v+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/m9rb/5va + 2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5nY2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU + 1v+V1Nb/lNPV/5TT1f+U09X/k9LV/5PS1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O + 0v+PztH/j87R/47N0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rK + z/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+HyND/h8fQ/4fH + 0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG + 0f+FxtH/hsbR/4bG0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydX/isnV/4rJ + 1f+KytX/i8rW/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jszY/47M2P+Ozdn/js3Z/4/N + 2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP3P+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR + 3f+U0d3/ldHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU + 4f+Z1eL/mdXi/5rV4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfk/53X5f+d2OX/ndjl/57Y + 5f+e2Ob/ntnm/5/Z5v+f2eb/n9nn/6DZ5/+g2uf/oNro/6Da6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Pc + 6v+j3Or/o9zq/6Td6/+k3ev/pd3r/6Xd7P+m3uz/pt7t/6ff7f+n3+3/p9/u/6jg7v+p4O7/qeDv/6nh + 7/+q4fD/quHw/6vi8P+r4vH/rOLx/6zj8v+t4/L/rePy/67k8/+u5PP/r+T0/6/l9P+w5fT/sOb1/7Hm + 9f+x5vX/seb2/7Ln9v+z5/f/s+f3/7Po9/+y5vb/qd7v/16OsP8nVoL/HEp2/yBOeP8nVX7/LFyD/y1i + h/8vaIv/Mm2O/zRwkP84c5L/O3aU/z54l/8QHiX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8gXYH/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HFp//wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BxMe/x1LeP8fTnn/JVZ//yxfhf8zZ4z/Om6S/z1x + k/9Ac5T/ea7F/7/2/f/A+P//v/j//7/4//+/+P//vvj//774//+99///vff+/733/v+99/7/vPf+/7z3 + /v+79/7/u/b+/7v2/v+69v7/uvb+/7r2/v+59v7/ufb+/7n2/v+49f7/uPX+/7f1/v+39f7/t/X+/7f1 + /v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P7/tPT9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz + /f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y/f+v8v3/rvH7/67w+/+t8Pr/rfD5/6zv+P+s7vf/rO73/6vt + 9v+r7fX/quz0/6rs8/+q6/P/qerx/6nq8f+o6vD/qOnw/6fo7v+n6O7/puft/6bn7P+m5+z/pebq/6Xl + 6v+k5en/pOTo/6Pk5/+j4+b/o+Pm/6Li5f+i4eT/oeHj/6Hh4/+h4OL/oN/h/6Df4P+f3t//n97f/5/e + 3v+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va2v+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX + 2f+Y19j/l9bY/5fW2P+X1tf/l9bX/5bV1/+W1db/ldTW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5LR + 1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O0f+PztH/js3R/47N0f+NzND/jczQ/43M + 0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJ + z/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG + 0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Gx9L/h8fT/4fH + 0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ1P+JydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL + 1/+Ny9f/jczX/43M2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Qztr/kc7b/5HP + 2/+Rz9v/ks/b/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS + 3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mNTh/5nV4v+Z1eL/mtXi/5rV4v+a1uP/m9bj/5vW + 4/+b1uP/nNfk/5zX5P+c1+T/nNfl/53X5f+d2OX/ntjl/57Y5v+e2Ob/n9nm/5/Z5v+f2ef/n9nn/6Da + 5/+g2uj/oNro/6Ha6P+h2+j/odvp/6Lb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+l3ev/pd3s/6Xe + 7P+m3uz/p9/t/6ff7f+n3+7/qN/u/6ng7v+p4O//qeHv/6rh7/+q4fD/q+Lw/6vi8f+s4vH/rOLx/63j + 8v+t4/L/ruTz/67k8/+v5PT/r+X0/7Dl9P+w5fT/seb1/7Hm9f+x5vb/suf2/7Pn9/+z5/f/s+j3/7To + +P+06Pj/reHy/3Snw/8qWYT/IU96/yhWgP8vXYb/M2SM/zRrkP80b5L/N3OT/zp1lP8+eZb/QnyY/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dhsj/yJeg/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8cWX7/CBYg/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8GDhb/H0t3/x9Md/8iT3n/J1Z+/y9ghv81Zov/OmuQ/z5vkv+Gus//wPj//8D4//+/+P//v/j//7/4 + //+++P//vvj//773//+99///vff+/733/v+89/7/vPf+/7v3/v+79v7/u/b+/7v2/v+69v7/uvb+/7n2 + /v+59v7/ufb+/7j1/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29f7/tfT+/7X0/v+19P7/tfT+/7T0 + /v+09P3/s/T9/7P0/f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+v8v3/r/L9/6/y + /f+u8fz/rvD7/63w+v+t8Pn/re/5/6zu9/+s7vf/q+32/6vt9f+r7fX/quzz/6rr8/+p6/L/qerx/6jq + 8P+o6fD/qOnv/6fo7v+m5+3/pufs/6bn7P+l5uv/peXq/6Tl6f+k5Oj/pOTo/6Pk5/+j4+b/ouLl/6Li + 5P+i4eT/oeHj/6Hg4v+g4OH/oN/h/5/e3/+f3t//n97e/57d3f+e3d3/ndzc/53c3P+d3Nz/nNvb/5zb + 2/+b2tv/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV + 1/+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP + 0v+Qz9L/j87S/4/O0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vK + z/+Kys//isrP/4rKz/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jIz/+IyND/h8jQ/4fH + 0P+Hx9D/h8fQ/4bH0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF + 0f+FxtH/hcbR/4XG0f+GxtH/hsfS/4bH0v+Hx9L/h8fT/4jI0/+IyNP/iMjT/4jI1P+JydT/icnU/4nJ + 1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL1v+My9f/jMvX/4zL1/+Ny9f/jczY/43M2P+OzNj/jszY/47N + 2f+Pzdn/j83Z/4/N2f+Qztr/kM7a/5DO2v+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LP3P+T0Nz/k9Dd/5PQ + 3f+T0N3/lNHd/5TR3v+V0d7/ldHe/5XS3/+W0t//ltLf/5bS3/+X0+D/l9Pg/5fT4P+X0+D/mNTh/5jU + 4f+Y1OH/mdTh/5nV4v+a1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y + 5f+e2OX/ntjm/57Y5v+e2eb/n9nm/5/Z5/+f2ef/oNnn/6Da5/+g2uj/odro/6Ha6P+h2+j/otvp/6Lb + 6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td6/+l3ez/pd7s/6be7P+m3u3/p9/t/6ff7v+o3+7/qODu/6ng + 7v+p4e//quHv/6rh8P+q4fD/q+Lx/6zi8f+s4vH/rOPy/63j8v+u5PP/ruTz/67k8/+v5PT/sOX0/7Dl + 9P+w5vX/seb1/7Hm9v+y5/b/suf2/7Pn9/+z6Pf/tOj4/7To+P+16fj/ten5/4/B2f8pWYL/JVR//ypb + hf8xY4z/NGmR/zRtk/83cpP/OnWT/z13k/82ZHv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8WLj7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxZ + fv8IFyD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8hSnb/Hkhz/x9Kc/8jUHn/KVd//zBf + hv82ZYv/P3KW/7Pp8//A+P//wPj//7/4//+/+P//v/j//7/4//+++P//vvf//733//+99/7/vff+/7z3 + /v+89/7/vPf+/7v3/v+79v7/u/b+/7r2/v+69v7/ufb+/7n2/v+59v7/ufb+/7j1/v+49f7/t/X+/7f1 + /v+39f7/tvX+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/v+z9P3/s/T9/7Pz/f+z8/3/svP9/7Lz + /f+x8/3/sfP9/7Hz/f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rvD7/63w+f+t7/n/rO/4/6zu + 9/+r7fb/q+31/6vt9f+q7PT/quvz/6nr8v+p6vH/qerx/6jq8P+o6e//p+ju/6fo7v+m5+3/pufs/6Xm + 6/+l5ur/peXq/6Tk6P+k5Oj/o+Tn/6Pj5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg4f+g3+H/oN/g/5/e + 3/+f3t7/nt3d/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY + 2f+Z2Nn/mNfY/5jX2P+X1tj/l9bY/5fW1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS + 1P+T0tT/ktHU/5LR1P+R0NP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O0f+OzdH/js3Q/43M + 0P+NzND/jMvP/4zLz/+My8//jMvP/4vKz/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJ + z/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8fQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG + 0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4fH + 0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnV/4rJ1f+KydX/isrV/4vK1v+Lytb/i8rW/4zL + 1v+My9f/jMvX/43L1/+NzNf/jczY/47M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO + 2/+Rztv/kc/b/5LP2/+Sz9z/ks/c/5LQ3P+T0N3/k9Dd/5PQ3f+U0d3/lNHe/5XR3v+V0d7/ldLe/5XS + 3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5nV4v+a1eL/mtXj/5rW + 4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5P+d1+X/ndjl/53Y5f+e2OX/ntjm/57Z5v+f2eb/n9nm/5/Z + 5/+g2ef/oNrn/6Da6P+h2uj/odro/6Hb6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd + 6/+l3ez/pt7s/6be7f+n3+3/p9/t/6jf7v+o4O7/qeDu/6ng7/+q4e//quHw/6rh8P+r4vD/q+Lx/6zi + 8f+s4/L/rePy/63j8v+u5PP/ruTz/6/k9P+v5fT/sOX0/7Dm9f+x5vX/seb1/7Ln9v+y5/b/s+f3/7Pn + 9/+z6Pf/tOj4/7Xp+P+16fn/tOj4/47A1/8zZIv/JVeB/ytfh/8uZY3/MmuS/zRvkv82cZH/O3WT/ylL + Xf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xo+Vf8cW37/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1l+/xEuQf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yVJbf8gSXP/HEVu/x9Jcv8lUHr/LFiC/zJgh/9Fdpr/pdvo/8D4///A+P//wPj//7/4 + //+/+P//v/j//774//+++P//vff//733/v+99/7/vff+/7z3/v+89/7/u/f+/7v2/v+79v7/uvb+/7r2 + /v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+39f7/t/X+/7f1/v+39f7/tvX+/7b0/v+19P7/tfT+/7X0 + /v+09P7/tPT+/7T0/f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y + /f+v8v3/rvH8/67x+/+u8Pv/rfD6/63v+f+s7/j/rO73/6zu9/+r7fb/q+31/6rs9P+q7PP/quvz/6nq + 8f+p6vH/qOrw/6jp8P+n6O7/p+ju/6bn7f+m5+z/pebr/6Xm6v+l5er/pOXp/6Tk6P+j5Of/o+Pm/6Pj + 5v+i4uX/ouHk/6Hh4/+h4eP/oeDi/6Df4f+g3+D/n97f/5/e3/+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb + 3P+c29v/nNvb/5va2/+b2tr/mtna/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5fW + 1/+W1df/ltXW/5XU1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ + 0/+Qz9L/kM/S/4/O0v+PztH/j87R/47N0f+OzdD/jczQ/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vK + z/+Lys//i8rP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI + 0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF + 0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG0v+Gx9L/hsfS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ + 1P+JydT/isnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jczY/47M + 2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/kc/b/5LP2/+Sz9z/ktDc/5PQ + 3P+T0N3/k9Dd/5TR3f+U0d3/lNHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU + 4f+Y1OH/mNTh/5jU4f+Z1eL/mdXi/5rV4v+a1eL/mtbj/5vW4/+b1uP/m9bj/5zX5P+c1+T/nNfk/5zX + 5f+d2OX/ndjl/57Y5f+e2Ob/ntjm/5/Z5v+f2eb/n9nn/5/Z5/+g2uf/oNro/6Da6P+h2uj/odvo/6Hb + 6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Pc6v+k3ev/pd3r/6Xd7P+l3uz/pt7s/6ff7f+n3+3/p9/u/6jf + 7v+p4O7/qeDv/6nh7/+q4e//quHw/6vi8P+r4vH/rOLx/6zj8v+t4/L/rePy/67k8/+u5PP/r+T0/6/l + 9P+w5fT/sOX0/7Hm9f+x5vX/seb2/7Ln9v+z5/f/s+f3/7Po9/+06Pj/ten4/7Xp+f+16fn/tOj4/4u/ + 1f85bZL/I1qC/ydghv8sZYv/MGuP/zZvkv87cZP/HDNA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/IFBu/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8bWX3/EzRJ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/JUVj/ytUfP8hSnP/HERv/yBK + dP8mUHz/LVqE/zRjjP+68Pn/wfj//8D4///A+P//v/j//7/4//+/+P//vvj//774//++9///vff//733 + /v+99/7/vPf+/7z3/v+79/7/u/b+/7v2/v+79v7/uvb+/7r2/v+59v7/ufb+/7n2/v+49f7/uPX+/7j1 + /v+39f7/t/X+/7f1/v+29f7/tvX+/7X0/v+19P7/tfT+/7X0/v+09P7/tPT9/7P0/f+z9P3/s/P9/7Lz + /f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y/f+v8v3/rvH8/67w+/+t8Pr/rfD5/63v + +f+s7vf/rO73/6vt9v+r7fX/quz0/6rs8/+q6/P/qevy/6nq8f+o6vD/qOnw/6jp7/+n6O7/puft/6bn + 7P+m5+z/pebr/6Xl6v+k5en/pOTo/6Tk6P+j4+b/o+Pm/6Li5f+i4uT/oeHj/6Hh4/+h4OL/oODh/6Df + 4f+f3t//n97f/5/e3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb2/+c29v/m9rb/5va2/+a2dr/mtna/5rZ + 2v+Z2Nn/mdjZ/5jX2f+Y19j/mNfY/5fW2P+X1tf/l9bX/5bV1/+W1df/ldTW/5XU1v+V1Nb/lNPV/5TT + 1f+T0tX/k9LU/5PS1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O0v+PztH/js3R/47N + 0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kys//isnP/4nJ + z/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH + 0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+FxtH/hsbS/4bH + 0v+Gx9L/h8fS/4fH0/+IyNP/iMjT/4jI0/+IyNT/icnU/4nJ1P+JydX/isnV/4rK1f+KytX/i8rW/4vK + 1v+My9b/jMvX/4zL1/+My9f/jczX/43M2P+NzNj/jszY/47M2P+Ozdn/j83Z/4/N2f+Pzdn/kM7a/5DO + 2v+Qztr/kc7b/5HP2/+Rz9v/ks/b/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XR + 3v+V0t//ltLf/5bS3/+W0t//l9Pg/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mtXi/5rV + 4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X5f+d2OX/ntjl/57Y5v+e2Ob/ntnm/5/Z + 5v+f2ef/n9nn/6DZ5/+g2uj/oNro/6Ha6P+h2uj/odvo/6Lb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td + 6/+k3ev/pd3s/6Xe7P+m3uz/pt7t/6ff7f+n3+7/qN/u/6jg7v+p4O7/qeHv/6rh7/+q4fD/quHw/6vi + 8f+s4vH/rOLx/6zj8v+t4/L/ruTz/67k8/+u5PP/r+X0/7Dl9P+w5fT/sOb1/7Hm9f+x5vb/suf2/7Ln + 9v+z5/f/s+j3/7To+P+06Pj/ten4/7Xp+f+26fn/ten4/4e70/80bZD/IVuA/yRgg/8rZYn/M2qP/z1u + lv8QHCX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8gW4D/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtaff8YR2D/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8fOE3/M12E/y1Wf/8lTnj/HUZx/yFKdv8kUHz/RHOY/6vi7v/B+P//wPj//8D4 + //+/+P//v/j//7/4//+/+P//vvj//773//+99///vff+/733/v+89/7/vPf+/7z3/v+79v7/u/b+/7v2 + /v+69v7/uvb+/7n2/v+59v7/ufb+/7n2/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29f7/tvT+/7X0 + /v+19P7/tfT+/7T0/v+09P7/s/T9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy + /f+w8v3/r/L9/6/y/f+u8fz/rvH7/63w+v+t8Pn/re/5/6zv+P+s7vf/q+32/6vt9f+r7fX/quz0/6rr + 8/+p6/L/qerx/6nq8f+o6fD/qOnv/6fo7v+n6O7/pufs/6bn7P+l5uv/pebq/6Xl6v+k5Oj/pOTo/6Pk + 5/+j4+b/ouLl/6Li5P+i4eT/oeHj/6Hg4v+g4OH/oN/h/6Df4P+f3t//n97e/57d3f+e3d3/ndzc/53c + 3P+d3Nz/nNvc/5zb2/+b2tv/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX2P+Y19j/l9bY/5fW + 2P+X1tf/ltXX/5bV1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT1f+T0tT/k9LU/5LR1P+S0dT/kdDT/5HQ + 0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4zL + z/+Lys//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jI + z/+IyND/iMjQ/4fH0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF + 0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI + 1P+JyNT/icnU/4nJ1f+KydX/isnV/4rK1f+Lytb/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M + 2P+OzNj/jszY/47N2f+Pzdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Sz9v/ks/c/5LP + 3P+S0Nz/k9Dd/5PQ3f+T0N3/lNHd/5TR3v+V0d7/ldHe/5XS3v+W0t//ltLf/5bS3/+W09//l9Pg/5fT + 4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+Z1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX + 5P+c1+X/ndfl/53Y5f+d2OX/ntjl/57Y5v+e2eb/n9nm/5/Z5v+f2ef/oNnn/6Da5/+g2uj/odro/6Ha + 6P+h2+j/odvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td6/+l3ev/pd3s/6be7P+m3u3/p9/t/6ff + 7f+o3+7/qODu/6ng7v+p4O//quHv/6rh8P+q4fD/q+Lw/6zi8f+s4vH/rOPy/63j8v+t4/L/ruTz/67k + 8/+v5PT/r+X0/7Dl9P+w5vX/seb1/7Hm9f+y5/b/suf2/7Pn9/+z5/f/tOj4/7To+P+16fj/ten5/7bp + +f+26vn/t+r6/3Oqw/8oZIb/Il2A/yZegv8vYon/NmaQ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/DRkj/yFdgv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xxScv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xouPf85ZIv/NmCJ/y9Y + g/8nUH3/H0h1/x1Hdf8pV4L/rePu/8H4///A+P//wPj//8D4//+/+P//v/j//7/4//+++P//vvj//733 + //+99/7/vff+/733/v+89/7/vPf+/7v3/v+79v7/u/b+/7r2/v+69v7/uvb+/7n2/v+59v7/ufb+/7j1 + /v+49f7/t/X+/7f1/v+39f7/t/X+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/v+09P3/s/T9/7Pz + /f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rvD7/63w + +v+t7/n/rO/4/6zu9/+s7vf/q+31/6vt9f+q7PT/quzz/6rr8/+p6vH/qerx/6jq8P+o6fD/p+ju/6fo + 7v+m5+3/pufs/6Xm6/+l5ur/peXq/6Tl6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLk/6Lh5P+h4eP/oeHj/6Hg + 4v+g3+H/oN/g/5/e3/+f3t//nt3d/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ + 2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+X1tj/l9bY/5fW1/+X1tf/ltXX/5bV1v+V1Nb/ldTW/5TT + 1f+U09X/lNPV/5PS1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O + 0f+OzdH/js3Q/43M0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rJ + z/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH + 0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG + 0f+GxtL/hsfS/4fH0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnU/4rJ1f+KydX/isrV/4rK + 1f+Lytb/i8rW/4zL1v+My9f/jMvX/43L1/+NzNf/jczY/43M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O + 2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5HP2/+Sz9z/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5TR + 3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5nV + 4v+a1eL/mtXi/5rW4/+b1uP/m9bj/5vW4/+c1+T/nNfk/5zX5P+c1+X/ndjl/53Y5f+e2OX/ntjm/57Z + 5v+f2eb/n9nm/5/Z5/+g2ef/oNrn/6Da6P+g2uj/odro/6Hb6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc + 6v+j3Or/pN3r/6Xd6/+l3ez/pd7s/6be7f+n3+3/p9/t/6ff7v+o3+7/qeDu/6ng7/+p4e//quHv/6rh + 8P+r4vD/q+Lx/6zi8f+s4/L/rePy/63j8v+u5PP/ruTz/6/k9P+v5fT/sOX0/7Dm9f+x5vX/seb1/7Hm + 9v+y5/b/s+f3/7Pn9/+z6Pf/tOj4/7Xp+P+16fn/ten5/7bp+f+36vr/s+b3/zx3lf8uZoj/KV2D/yhY + gf8lS23/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8VLD3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/H12B/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/Dxsk/zxrkf85Zo7/NV+L/y1Xhf8kTnz/GkVz/xtJdv+68fn/wfn//8H4 + ///A+P//wPj//7/4//+/+P//v/j//774//+++P//vvf//733/v+99/7/vff+/7z3/v+89/7/u/f+/7v2 + /v+79v7/u/b+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b0 + /v+19P7/tfT+/7X0/v+19P7/tPT+/7T0/f+z9P3/s/T9/7Pz/f+y8/3/svP9/7Lz/f+x8/3/sfP9/7Hz + /f+w8v3/sPL9/6/y/f+v8v3/r/L9/67x+/+u8Pv/rfD6/63w+f+t7/n/rO73/6zu9/+r7fb/q+31/6rs + 9P+q7PP/quvz/6nr8v+p6vH/qOrw/6jp8P+o6e//p+ju/6bn7f+m5+z/pufs/6Xm6/+l5er/pOXp/6Tk + 6P+k5Oj/o+Pm/6Pj5v+i4uX/ouLk/6Hh4/+h4eP/oeDi/6Dg4f+g3+D/n97f/5/e3/+f3t7/nt3d/57d + 3f+d3Nz/ndzc/53c3P+c29v/nNvb/5va2/+b2tv/mtna/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX + 2P+X1tj/l9bX/5fW1/+W1df/ltXX/5XU1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR + 0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/5DP0v+PztH/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zL + z/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isrP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jI + z/+IyM//iMjP/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG + 0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hcbR/4bG0v+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI + 0/+IyNP/icjU/4nJ1P+JydT/icnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jMvX/43M + 1/+NzNj/jczY/47M2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kM7a/5HO2/+Rz9v/kc/b/5LP + 2/+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR3f+U0d3/lNHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT + 4P+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5rV4v+a1eL/mtXj/5vW4/+b1uP/m9bj/5vW + 5P+c1+T/nNfk/5zX5f+d1+X/ndjl/57Y5f+e2Ob/ntjm/57Z5v+f2eb/n9nn/5/Z5/+g2ef/oNro/6Da + 6P+h2uj/odro/6Hb6f+i2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd7P+l3uz/pt7s/6be + 7f+n3+3/p9/u/6jf7v+o4O7/qeDv/6nh7/+q4e//quHw/6vi8P+r4vH/rOLx/6zi8f+s4/L/rePy/67k + 8/+u5PP/ruTz/6/l9P+w5fT/sOX0/7Dm9f+x5vX/seb2/7Ln9v+y5/b/s+f3/7Po9/+06Pj/tOj4/7Xp + +f+16fn/tun5/7bq+f+36vr/e7LJ/zxyk/80Zov/K1yD/xQvRv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xg8VP8cWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8fXID/DBoi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8EBwn/PW6U/zpp + kv81Yo7/MFqH/yZQfv8dSHb/J1N9/4/D1P/B+f//wfj//8D4///A+P//v/j//7/4//+/+P//v/j//774 + //++9///vff//733/v+99/7/vPf+/7z3/v+89/7/u/b+/7v2/v+79v7/uvb+/7r2/v+59v7/ufb+/7n2 + /v+59v7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT9/7P0 + /f+z9P3/s/P9/7Lz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x + +/+t8Pr/rfD5/63v+f+s7/j/rO73/6vt9v+r7fX/q+31/6rs9P+q6/P/qevy/6nq8f+p6vH/qOnw/6jp + 7/+n6O7/p+ju/6bn7P+m5+z/pebr/6Xm6v+k5en/pOTo/6Tk6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh + 4/+h4OL/oODh/6Df4f+g3+D/n97f/5/e3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb3P+c29v/m9rb/5va + 2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5nY2f+Y19j/mNfY/5fW2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU + 1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS1P+S0dT/ktHU/5HQ0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O + 0v+PztH/js3R/47N0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+My8//i8rP/4vKz/+Lys//i8rP/4rK + z/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//iMjP/4jIz/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH + 0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcbR/4XG + 0f+FxtH/hsbR/4bH0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydX/isnV/4rJ + 1f+KytX/i8rW/4vK1v+Lytb/jMvX/4zL1/+My9f/jcvX/43M1/+NzNj/jszY/47M2P+Ozdn/j83Z/4/N + 2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP3P+Sz9z/k9Dc/5PQ3f+T0N3/k9Dd/5TR + 3f+U0d7/ldHe/5XR3v+V0t7/ltLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU + 4f+Z1eL/mdXi/5rV4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X5f+d2OX/ndjl/57Y + 5v+e2Ob/ntnm/5/Z5v+f2ef/n9nn/6DZ5/+g2uf/oNro/6Ha6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Pc + 6v+j3Or/o9zq/6Td6/+k3ev/pd3r/6Xe7P+m3uz/pt7t/6ff7f+n3+3/qN/u/6jg7v+p4O7/qeDv/6rh + 7/+q4fD/quHw/6vi8P+s4vH/rOLx/6zj8v+t4/L/ruTz/67k8/+u5PP/r+T0/7Dl9P+w5fT/sOb1/7Hm + 9f+x5vX/suf2/7Ln9v+z5/f/s+f3/7To+P+06Pj/ten4/7Xp+f+26fn/tur5/7fq+v+m2ez/XZCv/ztt + kv8yY4r/DyIw/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/H0xs/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZfv8RJzX/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP83aY3/OWqT/zRijf8tWYf/JVB+/x9Lef8bSXX/eq7D/8H5 + ///B+P//wPj//8D4///A+P//v/j//7/4//+/+P//vvj//773//+99///vff+/733/v+99/7/vPf+/7z3 + /v+79/7/u/b+/7v2/v+69v7/uvb+/7r2/v+59v7/ufb+/7n2/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1 + /v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P7/tPT9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz + /f+x8/3/sPL9/7Dy/f+w8v3/r/L9/6/y/f+u8fz/rvH7/67w+/+t8Pr/re/5/6zv+P+s7vf/rO73/6vt + 9f+r7fX/quz0/6rs8/+p6/L/qerx/6nq8f+o6vD/qOnv/6fo7v+n6O7/puft/6bn7P+l5uv/pebq/6Xl + 6v+k5en/pOTo/6Pk5/+j4+b/o+Pm/6Li5P+i4eT/oeHj/6Hh4/+g4OH/oN/h/6Df4P+f3t//n97f/57d + 3f+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX + 2f+Y19j/l9bY/5fW2P+X1tf/l9bX/5bV1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT1f+T0tX/k9LU/5LR + 1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+PztH/js3R/47N0P+NzND/jczQ/43M + 0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJ + z/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG + 0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fH + 0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ1P+KydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL + 1/+Ny9f/jczX/43M2P+OzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP + 2/+Rz9v/ks/c/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+V0d7/ldHe/5XS3v+V0t//ltLf/5bS + 3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+Z1eL/mtXi/5rV4/+a1uP/m9bj/5vW + 4/+b1uT/nNfk/5zX5P+c1+T/nNfl/53Y5f+d2OX/ntjl/57Y5v+e2eb/n9nm/5/Z5v+f2ef/oNnn/6Da + 5/+g2uj/oNro/6Ha6P+h2+j/odvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/o9zq/6Td6/+l3ev/pd3s/6Xe + 7P+m3u3/p9/t/6ff7f+n3+7/qODu/6ng7v+p4O//qeHv/6rh8P+q4fD/q+Lw/6vi8f+s4vH/rOPy/63j + 8v+t4/L/ruTz/67k8/+v5PT/r+X0/7Dl9P+w5vX/seb1/7Hm9f+x5vb/suf2/7Pn9/+z5/f/s+j3/7To + +P+16fj/ten5/7Xp+f+26fn/t+r6/7fq+v92qcP/P3KW/zdqj/8JEhr/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wIGCP8dWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1p+/xMwQv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ytS + cP81aJH/MWGM/ypZhf8lU3//IlB8/x5OeP91q8D/wfn//8H5///A+P//wPj//8D4//+/+P//v/j//7/4 + //+++P//vvj//773//+99/7/vff+/733/v+89/7/vPf+/7v3/v+79v7/u/b+/7r2/v+69v7/uvb+/7n2 + /v+59v7/ufb+/7j1/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0 + /v+09P3/s/T9/7Pz/f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+v8v3/r/L9/6/y + /f+u8fv/rvD7/63w+v+t8Pn/rO/4/6zu9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr8/+p6/L/qerx/6jq + 8P+o6fD/qOnv/6fo7v+m5+3/pufs/6bn7P+l5ur/peXq/6Tl6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLl/6Li + 5P+h4eP/oeHj/6Hg4v+g4OH/oN/g/5/e3/+f3t//n97e/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb + 2/+b2tv/m9rb/5rZ2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV + 1v+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP + 0v+Qz9L/j87R/4/O0f+OzdH/js3R/43M0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vK + z/+Kys//isrP/4rKz/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH + 0P+Hx9D/h8fQ/4bH0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF + 0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4bH0v+Hx9L/h8fT/4jI0/+IyNP/iMjT/4nI1P+JydT/icnU/4nJ + 1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL1v+My9f/jMvX/4zL1/+NzNf/jczY/43M2P+OzNj/js3Z/47N + 2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5DO2v+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LQ3P+T0Nz/k9Dd/5PQ + 3f+U0d3/lNHd/5TR3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU + 4f+Y1OH/mdTh/5nV4v+a1eL/mtXi/5rV4/+b1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y + 5f+e2OX/ntjm/57Y5v+f2eb/n9nm/5/Z5/+f2ef/oNnn/6Da6P+g2uj/odro/6Ha6P+h2+n/otvp/6Lb + 6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Xd6/+l3ez/pd7s/6be7P+m3u3/p9/t/6ff7v+o3+7/qODu/6ng + 7/+p4e//quHv/6rh8P+r4vD/q+Lx/6zi8f+s4vH/rePy/63j8v+u5PP/ruTz/6/k9P+v5fT/sOX0/7Dl + 9P+w5vX/seb1/7Hm9v+y5/b/suf2/7Pn9/+z6Pf/tOj4/7To+P+16fn/ten5/7bp+f+26vn/t+r6/5zQ + 5P9CdZn/N2mM/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CRgg/xxbfv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWX3/Gkhj/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GzVK/zJlj/8tX4r/KFiF/yZWgv8kVYD/JVaA/1iM + qf+17PT/wfn//8H4///A+P//wPj//7/4//+/+P//v/j//774//+++P//vvf//733//+99/7/vff+/7z3 + /v+89/7/vPf+/7v2/v+79v7/u/b+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+49f7/t/X+/7f1 + /v+39f7/tvX+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/f+z9P3/s/T9/7Pz/f+y8/3/svP9/7Lz + /f+x8/3/sfP9/7Hz/f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rfD6/63w+f+t7/n/rO/4/6zu + 9/+r7fb/q+31/6vt9f+q7PP/quvz/6nr8v+p6vH/qOrw/6jp8P+o6e//p+ju/6fo7v+m5+z/pufs/6Xm + 6/+l5ur/pOXp/6Tk6P+k5Oj/o+Tn/6Pj5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg4f+g3+H/oN/g/5/e + 3/+f3t7/nt3d/57d3f+d3Nz/ndzc/53c3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY + 2f+Y19n/mNfY/5jX2P+X1tj/l9bY/5fW1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS + 1P+T0tT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/47N0f+OzdH/js3Q/43M + 0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJ + z/+Jyc//icnP/4jIz/+IyM//iMjP/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4bG + 0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XG0f+FxtH/hcbR/4bG0f+Gx9L/hsfS/4fH + 0v+Hx9P/iMjT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnV/4rJ1f+KydX/isrV/4vK1v+Lytb/i8rW/4zL + 1/+My9f/jMvX/43L1/+NzNj/jczY/47M2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO + 2/+Rztv/kc/b/5LP2/+Sz9z/ks/c/5PQ3P+T0N3/k9Dd/5PQ3f+U0d3/lNHe/5XR3v+V0d7/ldLe/5bS + 3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5rV4v+a1eL/mtXj/5rW + 4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5f+d1+X/ndjl/53Y5f+e2Ob/ntjm/57Z5v+f2eb/n9nn/5/Z + 5/+g2ef/oNrn/6Da6P+h2uj/odro/6Hb6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd + 6/+l3uz/pt7s/6be7f+n3+3/p9/u/6jf7v+o4O7/qeDu/6nh7/+q4e//quHw/6rh8P+r4vD/rOLx/6zi + 8f+s4/L/rePy/67k8/+u5PP/ruTz/6/k9P+w5fT/sOX0/7Dm9f+x5vX/seb2/7Ln9v+y5/b/s+f3/7Pn + 9/+06Pj/tOj4/7Xp+P+16fn/tun5/7bq+f+36vr/pdjs/1uQr/8qUGr/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8RL0H/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8gWHr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8RIC3/L2GM/ypch/8oW4X/J1uF/yhchf8sX4f/NGaM/6bc6f/B+f//wfj//8D4///A+P//wPj//7/4 + //+/+P//v/j//774//++9///vff//733/v+99/7/vPf+/7z3/v+89/7/u/f+/7v2/v+79v7/uvb+/7r2 + /v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvX+/7b0/v+19P7/tfT+/7X0 + /v+09P7/tPT+/7P0/f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y + /f+v8v3/rvH8/67x+/+u8Pv/rfD5/63v+f+s7/j/rO73/6zu9/+r7fX/q+31/6rs9P+q7PP/qevy/6nq + 8f+p6vH/qOrw/6jp7/+n6O7/p+ju/6bn7f+m5+z/pebr/6Xm6v+l5er/pOTo/6Tk6P+j5Of/o+Pm/6Pj + 5v+i4uT/ouHk/6Hh4/+h4eP/oODh/6Df4f+g3+D/n97f/5/e3v+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb + 3P+c29v/nNvb/5va2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5nY2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5bV + 1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT1f+U09X/k9LV/5PS1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ + 0/+Qz9L/kM/S/4/O0v+PztH/j87R/47N0f+OzdD/jczQ/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vK + z/+Lys//i8rP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI + 0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF + 0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ + 1P+JydX/isnV/4rJ1f+KytX/i8rW/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jszY/47M + 2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP3P+Sz9z/ktDc/5PQ + 3P+T0N3/k9Dd/5TR3f+U0d3/ldHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU + 4f+Y1OH/mNTh/5nU4f+Z1eL/mdXi/5rV4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfk/53X + 5f+d2OX/ndjl/57Y5f+e2Ob/ntnm/5/Z5v+f2eb/n9nn/6DZ5/+g2uf/oNro/6Da6P+h2uj/odvo/6Hb + 6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+k3ev/pd3r/6Xd7P+l3uz/pt7t/6ff7f+n3+3/p9/u/6jg + 7v+p4O7/qeDv/6nh7/+q4fD/quHw/6vi8P+r4vH/rOLx/6zj8v+t4/L/rePy/67k8/+u5PP/r+T0/6/l + 9P+w5fT/sOb1/7Hm9f+x5vX/seb2/7Ln9v+z5/f/s+f3/7Po9/+06Pj/ten4/7Xp+f+16fn/tur5/7fq + +v+36vr/aaC9/xs0RP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xtJY/8bWn7/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x5b + f/8GDBH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYMEf8rXoj/KVyG/yhdhv8nXob/LGKK/zNn + jf83ao//q+Ht/8H5///B+f//wPj//8D4///A+P//v/j//7/4//+/+P//vvj//774//++9///vff+/733 + /v+99/7/vPf+/7z3/v+79/7/u/b+/7v2/v+69v7/uvb+/7r2/v+59v7/ufb+/7n2/v+49f7/uPX+/7f1 + /v+39f7/t/X+/7f1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P7/tPT9/7P0/f+z8/3/s/P9/7Lz + /f+y8/3/sfP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y/f+v8v3/rvH7/67w+/+t8Pr/rfD5/6zv + +P+s7vf/rO73/6vt9v+r7fX/quz0/6rs8/+q6/P/qerx/6nq8f+o6vD/qOnw/6jp7/+n6O7/puft/6bn + 7P+m5+z/pebq/6Xl6v+k5en/pOTo/6Pk5/+j4+b/o+Pm/6Li5f+i4eT/oeHj/6Hh4/+h4OL/oODh/6Df + 4P+f3t//n97f/5/e3v+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va2v+a2dr/mtna/5rZ + 2v+Z2Nn/mdjZ/5jX2f+Y19j/mNfY/5fW2P+X1tf/l9bX/5bV1/+W1db/ldTW/5XU1v+V1Nb/lNPV/5TT + 1f+T0tX/k9LU/5LR1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O0f+PztH/js3R/47N + 0f+NzND/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kys//isnP/4nJ + z/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH + 0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH + 0v+Gx9L/h8fT/4fH0/+IyNP/iMjT/4jI0/+JyNT/icnU/4nJ1P+JydX/isnV/4rK1f+KytX/i8rW/4vK + 1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO + 2v+Qztr/kc7b/5HP2/+Rz9v/ks/b/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XS + 3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mNTh/5nV4v+Z1eL/mtXi/5rV + 4v+a1uP/m9bj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X5f+d2OX/ntjl/57Y5v+e2Ob/n9nm/5/Z + 5v+f2ef/n9nn/6Da5/+g2uj/oNro/6Ha6P+h2uj/odvp/6Lb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td + 6/+l3ev/pd3s/6Xe7P+m3uz/p9/t/6ff7f+n3+7/qN/u/6ng7v+p4O//qeHv/6rh7/+q4fD/q+Lw/6vi + 8f+s4vH/rOLx/63j8v+t4/L/ruTz/67k8/+v5PT/r+X0/7Dl9P+w5fT/seb1/7Hm9f+x5vb/suf2/7Ln + 9v+z5/f/s+j3/7To+P+06Pj/ten5/7Xp+f+26fn/tur5/7fq+v9nobz/CxYd/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/JV5+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p9/w4fK/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yVWfv8oXIb/KF+H/yxkiv8waI3/NWyR/zpvkv94rcP/u/L6/8H5///B+P//wPj//8D4 + //+/+P//v/j//7/4//+++P//vvj//773//+99///vff+/733/v+89/7/vPf+/7v3/v+79v7/u/b+/7v2 + /v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29f7/tfT+/7X0 + /v+19P7/tfT+/7T0/v+09P3/s/T9/7P0/f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy + /f+v8v3/r/L9/6/y/f+u8fz/rvD7/63w+v+t8Pn/re/5/6zv+P+s7vf/q+32/6vt9f+r7fX/quzz/6rr + 8/+p6/L/qerx/6jq8P+o6fD/qOnv/6fo7v+m5+3/pufs/6bn7P+l5uv/pebq/6Tl6f+k5Oj/pOTo/6Pk + 5/+j4+b/ouLl/6Li5P+i4eT/oeHj/6Hg4v+g4OH/oN/h/5/e3/+f3t//n97e/57d3f+e3d3/ndzc/53c + 3P+d3Nz/nNvc/5zb2/+b2tv/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW + 1/+X1tf/ltXX/5bV1/+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR1P+S0dP/kdDT/5HQ + 0/+R0NP/kM/S/5DP0v+Qz9L/j87S/4/O0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4vL + z/+Lys//i8rP/4vKz/+Kys//isrP/4rKz/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI + z/+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF + 0P+ExdD/hMXQ/4TF0P+FxtH/hcbR/4XG0f+GxtH/hsfS/4bH0v+Hx9L/h8fT/4jI0/+IyNP/iMjT/4jI + 1P+JydT/icnU/4nJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4vK1v+My9f/jMvX/4zL1/+Ny9f/jczY/43M + 2P+OzNj/jszY/47N2f+Pzdn/j83Z/4/N2f+Qztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Sz9v/ks/c/5LP + 3P+T0Nz/k9Dd/5PQ3f+T0N3/lNHd/5TR3v+V0d7/ldHe/5XS3/+W0t//ltLf/5bS3/+X0+D/l9Pg/5fT + 4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+a1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX + 5P+c1+X/ndfl/53Y5f+d2OX/ntjm/57Y5v+e2eb/n9nm/5/Z5/+f2ef/oNnn/6Da5/+g2uj/odro/6Ha + 6P+h2+j/otvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td6/+l3ev/pd7s/6be7P+m3u3/p9/t/6ff + 7v+o3+7/qODu/6ng7v+p4e//quHv/6rh8P+q4fD/q+Lx/6zi8f+s4vH/rOPy/63j8v+u5PP/ruTz/67k + 8/+v5PT/sOX0/7Dl9P+w5vX/seb1/7Hm9v+y5/b/suf2/7Pn9/+z6Pf/tOj4/7To+P+16fj/ten5/7bp + +f+26vn/t+r6/3uzzP8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wsWG/8eXYD/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/EjBC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Gz9b/yhdhv8sYon/MWiN/zRt + kP85cJL/PXOV/0yBoP+s4+7/wfn//8H4///A+P//wPj//7/4//+/+P//v/j//7/4//+++P//vvf//733 + //+99/7/vff+/7z3/v+89/7/vPf+/7v3/v+79v7/u/b+/7r2/v+69v7/ufb+/7n2/v+59v7/ufb+/7j1 + /v+49f7/t/X+/7f1/v+39f7/tvX+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/v+z9P3/s/T9/7Pz + /f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rvD7/63w + +f+t7/n/rO/4/6zu9/+r7fb/q+31/6vt9f+q7PT/quvz/6nr8v+p6vH/qerx/6jq8P+o6e//p+ju/6fo + 7v+m5+3/pufs/6Xm6/+l5ur/peXq/6Tk6P+k5Oj/o+Tn/6Pj5v+i4uX/ouLk/6Lh5P+h4eP/oeHj/6Dg + 4f+g3+H/oN/g/5/e3/+f3t7/nt3d/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ + 2v+a2dr/mdjZ/5nY2f+Z2Nn/mNfZ/5jX2P+X1tj/l9bY/5fW1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT + 1f+U09X/lNPV/5PS1P+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O + 0f+OzdH/js3Q/43M0P+NzND/jMvP/4zLz/+My8//jMvP/4vKz/+Lys//i8rP/4vKz/+Kys//isrP/4rJ + z/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8fQ/4fH0P+Hx9D/h8fQ/4bH + 0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG + 0f+GxtL/hsfS/4fH0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnV/4rJ1f+KydX/isrV/4vK + 1v+Lytb/i8rW/4zL1v+My9f/jMvX/43L1/+NzNf/jczY/47M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O + 2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5LP2/+Sz9z/ks/c/5LQ3P+T0N3/k9Dd/5PQ3f+U0d3/lNHd/5XR + 3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5nV + 4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5P+d1+X/ndjl/53Y5f+e2OX/ntjm/57Z + 5v+f2eb/n9nm/5/Z5/+g2ef/oNrn/6Da6P+g2uj/odro/6Hb6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc + 6v+k3ev/pN3r/6Xd6/+l3ez/pt7s/6be7f+n3+3/p9/t/6jf7v+o4O7/qeDu/6ng7/+p4e//quHw/6rh + 8P+r4vD/q+Lx/6zi8f+s4/L/rePy/63j8v+u5PP/ruTz/6/k9P+v5fT/sOX0/7Dm9f+x5vX/seb1/7Hm + 9v+y5/b/s+f3/7Pn9/+z6Pf/tOj4/7Xp+P+16fn/ten5/7bq+f+36vr/gbPH/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/GDJA/yBegv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZfv8YRGD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8ULkP/K2CI/y9ni/80bY//OHKR/zx0k/9AdpX/QnaY/5PL2//B+f//wfn//8D4 + ///A+P//wPj//7/4//+/+P//v/j//774//+++P//vff//733/v+99/7/vff+/7z3/v+89/7/u/f+/7v2 + /v+79v7/uvb+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+39f7/t/X+/7f1/v+39f7/tvX+/7b0 + /v+19P7/tfT+/7X0/v+09P7/tPT+/7T0/f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Hz + /f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x+/+u8Pv/rfD6/63w+f+s7/j/rO73/6zu9/+r7fb/q+31/6rs + 9P+q7PP/quvz/6nq8f+p6vH/qOrw/6jp8P+n6O7/p+ju/6bn7f+m5+z/pufs/6Xm6v+l5er/pOXp/6Tk + 6P+j5Of/o+Pm/6Pj5v+i4uX/ouHk/6Hh4/+h4eP/oeDi/6Df4f+g3+D/n97f/5/e3/+e3d3/nt3d/57d + 3f+d3Nz/ndzc/5zb3P+c29v/nNvb/5va2/+b2tr/mtna/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5fW + 2P+X1tj/l9bX/5fW1/+W1df/ltXW/5XU1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+S0dT/ktHU/5LR + 0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/j87R/47N0f+OzdH/jczQ/43M0P+NzND/jMvP/4zL + z/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jI + z/+IyM//iMjQ/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG + 0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG0v+Gx9L/hsfS/4fH0/+Hx9P/iMjT/4jI + 0/+IyNT/icjU/4nJ1P+JydT/isnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M + 1/+NzNj/jczY/47M2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kM7a/5HO2/+Rz9v/kc/b/5LP + 2/+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR3f+U0d3/lNHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT + 4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5jU4f+Z1eL/mdXi/5rV4v+a1eL/mtbj/5vW4/+b1uP/m9bj/5zX + 5P+c1+T/nNfk/5zX5f+d1+X/ndjl/57Y5f+e2Ob/ntjm/5/Z5v+f2eb/n9nn/5/Z5/+g2uf/oNro/6Da + 6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Pc6v+k3ev/pd3r/6Xd7P+l3uz/pt7s/6ff + 7f+n3+3/p9/u/6jf7v+p4O7/qeDv/6nh7/+q4e//quHw/6vi8P+r4vH/rOLx/6zi8f+t4/L/rePy/67k + 8/+u5PP/r+T0/6/l9P+w5fT/sOX0/7Hm9f+x5vX/seb2/7Ln9v+z5/f/s+f3/7Po9/+06Pj/ten4/7Xp + +f+16fn/tun5/7bq+f9wmKf/AwQE/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8mTWT/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xtWeP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wsYIv8tZIr/MWqM/zZw + j/87dZL/PniT/0B4lf9Bd5j/aJy3/7bu9v/B+f//wfj//8D4///A+P//v/j//7/4//+/+P//vvj//774 + //++9///vff//733/v+99/7/vPf+/7z3/v+79/7/u/b+/7v2/v+79v7/uvb+/7r2/v+59v7/ufb+/7n2 + /v+49f7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvX+/7X0/v+19P7/tfT+/7X0/v+09P7/tPT9/7P0 + /f+z9P3/s/P9/7Lz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y/f+v8v3/rvH8/67w + +/+t8Pr/rfD5/63v+f+s7vf/rO73/6vt9v+r7fX/quz0/6rs8/+q6/P/qevy/6nq8f+o6vD/qOnw/6jp + 7/+n6O7/puft/6bn7P+m5+z/pebr/6Xl6v+k5en/pOTo/6Tk6P+j4+b/o+Pm/6Li5f+i4uT/ouHk/6Hh + 4/+h4OL/oODh/6Df4f+f3t//n97f/5/e3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb2/+c29v/m9rb/5va + 2/+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX2f+Y19j/mNfY/5fW2P+X1tf/l9bX/5bV1/+W1df/ldTW/5XU + 1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O + 0v+PztH/js3R/47N0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rK + z/+Kys//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH + 0P+Gx9D/hsfQ/4bH0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG + 0f+FxtH/hsbS/4bH0v+Gx9L/h8fS/4fH0/+IyNP/iMjT/4jI0/+IyNT/icnU/4nJ1P+JydX/isnV/4rK + 1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL1/+My9f/jczX/43M2P+NzNj/jszY/47M2P+Ozdn/j83Z/4/N + 2f+Pzdn/kM7a/5DO2v+Qztr/kc7b/5HP2/+Rz9v/ks/b/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/k9Dd/5TR + 3f+U0d7/ldHe/5XR3v+V0t//ltLf/5bS3/+W0t//l9Pg/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU + 4f+Z1eL/mtXi/5rV4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X5f+d2OX/ntjl/57Y + 5v+e2Ob/ntnm/5/Z5v+f2ef/n9nn/6DZ5/+g2uf/oNro/6Ha6P+h2uj/odvo/6Lb6f+i2+n/otvp/6Pc + 6v+j3Or/o9zq/6Td6/+k3ev/pd3s/6Xe7P+m3uz/pt7t/6ff7f+n3+7/qN/u/6jg7v+p4O7/qeHv/6rh + 7/+q4fD/quHw/6vi8f+s4vH/rOLx/6zj8v+t4/L/ruTz/67k8/+u5PP/r+X0/7Dl9P+w5fT/sOb1/7Hm + 9f+x5vb/suf2/7Ln9v+z5/f/s+j3/7To+P+06Pj/ten4/7Xp+f+26fn/ten5/3GUn/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/yZefv8bWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p+/wcRGP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/zJpjP8za4z/N3GQ/zp0kv8+d5P/PXeV/z51l/9LgaP/l83e/8H5 + ///B+P//wPj//8D4//+/+P//v/j//7/4//+/+P//vvj//773//+99///vff+/733/v+89/7/vPf+/7z3 + /v+79/7/u/b+/7v2/v+69v7/uvb+/7n2/v+59v7/ufb+/7n2/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1 + /v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P7/s/T9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz + /f+x8/3/sPL9/7Dy/f+w8v3/r/L9/6/y/f+u8fz/rvH7/67w+/+t8Pn/re/5/6zv+P+s7vf/q+32/6vt + 9f+r7fX/quz0/6rr8/+p6/L/qerx/6nq8f+o6fD/qOnv/6fo7v+n6O7/puft/6bn7P+l5uv/pebq/6Xl + 6v+k5Oj/pOTo/6Pk5/+j4+b/ouLl/6Li5P+i4eT/oeHj/6Hg4v+g4OH/oN/h/6Df4P+f3t//n97e/57d + 3f+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb2/+b2tv/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX + 2P+Y19j/l9bY/5fW2P+X1tf/ltXX/5bV1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT1f+T0tT/k9LU/5LR + 1P+S0dT/kdDT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+PztH/js3R/47N0P+NzND/jczQ/4zL + z/+My8//jMvP/4zLz/+Lys//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJ + z/+JyM//iMjP/4jIz/+IyND/iMjQ/4fH0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG + 0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fH + 0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ1f+KydX/isnV/4rK1f+Lytb/i8rW/4vK1v+My9b/jMvX/4zL + 1/+Ny9f/jczX/43M2P+OzNj/jszY/47N2f+Pzdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP + 2/+Sz9v/ks/c/5LP3P+S0Nz/k9Dd/5PQ3f+T0N3/lNHd/5TR3v+V0d7/ldHe/5XS3v+W0t//ltLf/5bS + 3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+Z1eL/mtXi/5rV4/+a1uP/m9bj/5vW + 4/+b1uT/nNfk/5zX5P+c1+T/ndfl/53Y5f+d2OX/ntjl/57Y5v+e2eb/n9nm/5/Z5v+f2ef/oNnn/6Da + 5/+g2uj/odro/6Ha6P+h2+j/odvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td6/+l3ev/pd3s/6be + 7P+m3u3/p9/t/6ff7f+o3+7/qODu/6ng7v+p4O//quHv/6rh8P+q4fD/q+Lw/6vi8f+s4vH/rOPy/63j + 8v+t4/L/ruTz/67k8/+v5PT/r+X0/7Dl9P+w5vX/seb1/7Hm9f+y5/b/suf2/7Pn9/+z5/f/tOj4/7To + +P+16fj/ten5/7Xp+f+26vn/VWx0/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NFxz/KmaI/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/DSMw/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/KFJq/zVt + jv84cJH/OnSU/zt0lP86c5T/OnKV/zlwl/9gl7X/wfn//8H4///A+P//wPj//8D4//+/+P//v/j//7/4 + //+++P//vvj//733//+99/7/vff+/733/v+89/7/vPf+/7v3/v+79v7/u/b+/7r2/v+69v7/uvb+/7n2 + /v+59v7/ufb+/7j1/v+49f7/t/X+/7f1/v+39f7/t/X+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0 + /v+09P3/s/T9/7Pz/f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+v8v3/r/L9/67x + /P+u8fv/rvD7/63w+v+t7/n/rO/4/6zu9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr8/+p6vH/qerx/6jq + 8P+o6fD/p+ju/6fo7v+m5+3/pufs/6Xm6/+l5ur/peXq/6Tl6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLl/6Lh + 5P+h4eP/oeHj/6Hg4v+g3+H/oN/g/5/e3/+f3t//nt3d/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb + 2/+b2tv/m9ra/5rZ2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+X1tj/l9bY/5fW1/+X1tf/ltXX/5bV + 1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP + 0v+PztL/j87R/4/O0f+OzdH/js3Q/43M0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vK + z/+Kys//isrP/4rJz/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH + 0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF + 0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4bH0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnU/4rJ + 1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL1v+My9f/jMvX/43L1/+NzNf/jczY/43M2P+OzNj/js3Z/47N + 2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5HP2/+Sz9z/ks/c/5LQ3P+T0Nz/k9Dd/5PQ + 3f+U0d3/lNHd/5TR3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU + 4f+Y1OH/mdXi/5nV4v+a1eL/mtXi/5rW4/+b1uP/m9bj/5vW4/+c1+T/nNfk/5zX5P+c1+X/ndjl/53Y + 5f+e2OX/ntjm/57Z5v+f2eb/n9nm/5/Z5/+f2ef/oNrn/6Da6P+g2uj/odro/6Hb6P+h2+n/otvp/6Lb + 6f+j3Or/o9zq/6Pc6v+j3Or/pN3r/6Xd6/+l3ez/pd7s/6be7f+n3+3/p9/t/6ff7v+o3+7/qeDu/6ng + 7/+p4e//quHv/6rh8P+r4vD/q+Lx/6zi8f+s4/L/rePy/63j8v+u5PP/ruTz/6/k9P+v5fT/sOX0/7Dl + 9P+x5vX/seb1/7Hm9v+y5/b/s+f3/7Pn9/+z6Pf/tOj4/7Xp+P+16fn/ten5/7Tn9/9KXmX/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/x41Qf8bWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZfv8VO1H/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8bNkf/NWuO/zZtkf83bpL/N2+T/zdvlP82bpX/NWyV/0J5 + oP+17Pb/wfn//8H4///A+P//wPj//7/4//+/+P//v/j//774//+++P//vvf//733/v+99/7/vff+/7z3 + /v+89/7/u/f+/7v2/v+79v7/u/b+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+49f7/t/X+/7f1 + /v+39f7/tvX+/7b1/v+19P7/tfT+/7X0/v+19P7/tPT+/7T0/f+z9P3/s/T9/7Pz/f+y8/3/svP9/7Lz + /f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y/f+v8v3/r/L9/67x/P+u8Pv/rfD6/63w+f+t7/n/rO73/6zu + 9/+r7fb/q+31/6rs9P+q7PP/quvz/6nr8v+p6vH/qOrw/6jp8P+o6e//p+ju/6bn7f+m5+z/pufs/6Xm + 6/+l5er/pOXp/6Tk6P+k5Oj/o+Pm/6Pj5v+i4uX/ouLk/6Hh4/+h4eP/oeDi/6Dg4f+g3+D/n97f/5/e + 3/+f3t7/nt3d/57d3f+d3Nz/ndzc/53c3P+c29v/nNvb/5va2/+b2tv/mtna/5rZ2v+a2dr/mdjZ/5nY + 2f+Y19n/mNfY/5jX2P+X1tj/l9bX/5fW1/+W1df/ltXX/5XU1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS + 1P+T0tT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/5DP0v+PztL/j87R/47N0f+OzdH/js3Q/43M + 0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isrP/4rJz/+Jyc//icnP/4nJ + z/+Jyc//icjP/4jIz/+IyM//iMjP/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG + 0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hcbR/4bG0v+Gx9L/hsfS/4fH + 0v+Hx9P/iMjT/4jI0/+IyNP/icjU/4nJ1P+JydT/icnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL + 1/+My9f/jMvX/43M1/+NzNj/jczY/47M2P+Ozdn/js3Z/4/N2f+Pzdn/j83Z/5DO2v+Qztr/kM7a/5HO + 2/+Rz9v/kc/b/5LP2/+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR3f+U0d3/lNHe/5XR3v+V0t7/ldLf/5bS + 3/+W0t//ltLf/5fT4P+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5rV4v+a1eL/mtXj/5vW + 4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5f+d1+X/ndjl/57Y5f+e2Ob/ntjm/57Z5v+f2eb/n9nn/5/Z + 5/+g2ef/oNro/6Da6P+h2uj/odro/6Hb6f+i2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd + 7P+l3uz/pt7s/6be7f+n3+3/p9/u/6jf7v+o4O7/qeDv/6nh7/+q4e//quHw/6rh8P+r4vH/rOLx/6zi + 8f+s4/L/rePy/67k8/+u5PP/ruTz/6/l9P+w5fT/sOX0/7Dm9f+x5vX/seb2/7Ln9v+y5/b/s+f3/7Po + 9/+06Pj/tOj4/7Xp+P+16fn/tun5/yQuMv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/JU1g/x5c + gP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xxScf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w4b + JP81apD/MmiO/zNpkP80a5L/NWuU/zVslf8zapX/MmmU/2ujvv+47/j/wfj//8D4///A+P//v/j//7/4 + //+/+P//v/j//774//++9///vff//733/v+99/7/vPf+/7z3/v+89/7/u/b+/7v2/v+79v7/uvb+/7r2 + /v+59v7/ufb+/7n2/v+59v7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvX+/7b0/v+19P7/tfT+/7X0 + /v+09P7/tPT9/7P0/f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y + /f+v8v3/rvH8/67x+/+t8Pr/rfD5/63v+f+s7/j/rO73/6vt9v+r7fX/q+31/6rs9P+q6/P/qevy/6nq + 8f+p6vH/qOnw/6jp7/+n6O7/p+ju/6bn7P+m5+z/pebr/6Xm6v+k5en/pOTo/6Tk6P+j5Of/o+Pm/6Li + 5f+i4uT/ouHk/6Hh4/+h4OL/oODh/6Df4f+g3+D/n97f/5/e3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb + 3P+c29v/m9rb/5va2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5nY2f+Y19j/mNfY/5fW2P+X1tj/l9bX/5bV + 1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT1f+U09X/k9LU/5PS1P+S0dT/ktHU/5HQ0/+R0NP/kdDT/5HQ + 0/+Qz9L/kM/S/4/O0v+PztH/js3R/47N0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+My8//i8rP/4vK + z/+Lys//i8rP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//iMjP/4jIz/+IyM//iMjQ/4jI + 0P+Hx9D/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF + 0P+ExdD/hcbR/4XG0f+FxtH/hsbR/4bG0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ + 1P+JydX/isnV/4rJ1f+KytX/i8rW/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jszY/47M + 2P+Ozdn/j83Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP3P+Sz9z/ktDc/5PQ + 3f+T0N3/k9Dd/5TR3f+U0d7/ldHe/5XR3v+V0t7/ltLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU + 4f+Y1OH/mNTh/5nU4f+Z1eL/mdXi/5rV4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X + 5f+d2OX/ndjl/57Y5v+e2Ob/ntnm/5/Z5v+f2eb/n9nn/6DZ5/+g2uf/oNro/6Ha6P+h2uj/odvo/6Hb + 6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+k3ev/pd3r/6Xd7P+m3uz/pt7t/6ff7f+n3+3/qN/u/6jg + 7v+p4O7/qeDv/6rh7/+q4fD/quHw/6vi8P+s4vH/rOLx/6zj8v+t4/L/ruTz/67k8/+u5PP/r+T0/6/l + 9P+w5fT/sOb1/7Hm9f+x5vX/suf2/7Ln9v+z5/f/s+f3/7To+P+06Pj/ten4/7Xp+f+ezNv/GB8h/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ya4v/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/H12B/wcN + Ef8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zhskv80aZH/MGWP/zJokP8zaZL/NmuW/zZs + l/8zaZT/OXCY/5LJ2v/B+P//wPj//8D4///A+P//v/j//7/4//+/+P//vvj//773//+99///vff+/733 + /v+99/7/vPf+/7z3/v+79/7/u/b+/7v2/v+69v7/uvb+/7r2/v+59v7/ufb+/7n2/v+49f7/uPX+/7f1 + /v+39f7/t/X+/7f1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P7/tPT9/7P0/f+z8/3/s/P9/7Lz + /f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+w8v3/r/L9/6/y/f+u8fz/rvH7/67w+/+t8Pr/re/5/6zv + +P+s7vf/rO73/6vt9f+r7fX/quz0/6rs8/+p6/L/qerx/6nq8f+o6vD/qOnw/6fo7v+n6O7/puft/6bn + 7P+l5uv/pebq/6Xl6v+k5en/pOTo/6Pk5/+j4+b/o+Pm/6Li5P+i4eT/oeHj/6Hh4/+g4OH/oN/h/6Df + 4P+f3t//n97f/57d3f+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va2v+a2dr/mtna/5nY + 2f+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW2P+X1tf/l9bX/5bV1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT + 1f+T0tX/k9LU/5LR1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+PztH/js3R/47N + 0P+NzND/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJ + z/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG + 0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH + 0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ1P+KydX/isnV/4rK1f+KytX/i8rW/4vK + 1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M2P+OzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO + 2v+Rztv/kc7b/5HP2/+Rz9v/ks/c/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+V0d7/ldHe/5XS + 3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+Z1eL/mtXi/5rV + 4/+a1uP/m9bj/5vW4/+b1uP/nNfk/5zX5P+c1+T/nNfl/53Y5f+d2OX/ntjl/57Y5v+e2eb/n9nm/5/Z + 5v+f2ef/oNnn/6Da5/+g2uj/oNro/6Ha6P+h2+j/odvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/o9zq/6Td + 6/+l3ev/pd3s/6Xe7P+m3u3/p9/t/6ff7f+n3+7/qODu/6ng7v+p4O//qeHv/6rh7/+q4fD/q+Lw/6vi + 8f+s4vH/rOPy/63j8v+t4/L/ruTz/67k8/+v5PT/r+X0/7Dl9P+w5vX/seb1/7Hm9f+x5vb/suf2/7Pn + 9/+z5/f/s+j3/7To+P+16fj/ten5/57L2f8KDQ7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/EyEm/yJf + gf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWn//Eic0/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/KU1n/zhslP80aJH/MWWQ/zNnkv82a5X/OG2X/zZslv8wZ5D/Uouo/8H5///B+P//wPj//8D4 + //+/+P//v/j//7/4//+++P//vvj//773//+99/7/vff+/733/v+89/7/vPf+/7v3/v+79v7/u/b+/7v2 + /v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29P7/tfT+/7X0 + /v+19P7/tPT+/7T0/v+09P3/s/T9/7P0/f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy + /f+v8v3/r/L9/6/y/f+u8fv/rvD7/63w+v+t8Pn/re/5/6zu9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr + 8/+p6/L/qerx/6jq8P+o6fD/qOnv/6fo7v+m5+3/pufs/6bn7P+l5ur/peXq/6Tl6f+k5Oj/pOTo/6Pj + 5v+j4+b/ouLl/6Li5P+h4eP/oeHj/6Hg4v+g4OH/oN/g/5/e3/+f3t//n97e/57d3f+e3d3/ndzc/53c + 3P+d3Nz/nNvb/5zb2/+b2tv/m9rb/5rZ2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW + 1/+X1tf/ltXX/5bV1v+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR1P+S0dP/kdDT/5HQ + 0/+R0NP/kM/S/5DP0v+Qz9L/j87R/4/O0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4vL + z/+Lys//i8rP/4vKz/+Kys//isrP/4rKz/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI + z/+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF + 0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4XG0f+GxtL/hsfS/4bH0v+Hx9L/h8fT/4jI0/+IyNP/iMjT/4nI + 1P+JydT/icnU/4nJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL1v+My9f/jMvX/4zL1/+NzNf/jczY/43M + 2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5DO2v+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LQ + 3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5TR3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT + 4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+a1eL/mtXi/5rV4/+b1uP/m9bj/5vW4/+b1uT/nNfk/5zX + 5P+c1+X/ndfl/53Y5f+e2OX/ntjm/57Y5v+e2eb/n9nm/5/Z5/+f2ef/oNnn/6Da6P+g2uj/odro/6Ha + 6P+h2+n/otvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td6/+l3ez/pd7s/6be7P+m3u3/p9/t/6ff + 7v+o3+7/qODu/6ng7/+p4e//quHv/6rh8P+r4vD/q+Lx/6zi8f+s4vH/rePy/63j8v+u5PP/ruTz/67k + 8/+v5fT/sOX0/7Dl9P+w5vX/seb1/7Hm9v+y5/b/suf2/7Pn9/+z6Pf/tOj4/7To+P+16fn/ZYKL/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8jQ1L/H1yA/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xta + fv8cQFX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8bMkL/O2+V/zVpkP8zZ4//M2eQ/zdr + lP85bpb/N22V/zRrkv8vaI3/mdLf/8H4///A+P//wPj//7/4//+/+P//v/j//7/4//+++P//vvf//733 + //+99/7/vff+/7z3/v+89/7/vPf+/7v2/v+79v7/u/b+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1 + /v+49f7/t/X+/7f1/v+39f7/tvX+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/f+z9P3/s/T9/7Pz + /f+y8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rfD6/63w + +f+t7/n/rO/4/6zu9/+r7fb/q+31/6vt9f+q7PP/quvz/6nr8v+p6vH/qerx/6jp8P+o6e//p+ju/6fo + 7v+m5+z/pufs/6Xm6/+l5ur/pOXp/6Tk6P+k5Oj/o+Tn/6Pj5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg + 4f+g3+H/oN/g/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/53c3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ + 2v+a2dr/mdjZ/5nY2f+Z2Nn/mNfY/5jX2P+X1tj/l9bY/5fW1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT + 1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/47N + 0f+OzdH/js3Q/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4vKz/+Kys//isrP/4rJ + z/+Kyc//icnP/4nJz/+Jyc//icnP/4jIz/+IyM//iMjP/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH + 0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XG0f+FxtH/hcbR/4bG + 0f+Gx9L/hsfS/4fH0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnV/4rJ1f+KydX/isrV/4vK + 1v+Lytb/i8rW/4zL1/+My9f/jMvX/43L1/+NzNj/jczY/47M2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/4/O + 2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5LP2/+Sz9z/ks/c/5PQ3P+T0N3/k9Dd/5PQ3f+U0d3/lNHe/5XR + 3v+V0d7/ldLe/5bS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5rV + 4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5f+d1+X/ndjl/53Y5f+e2Ob/ntjm/57Z + 5v+f2eb/n9nn/5/Z5/+g2ef/oNrn/6Da6P+h2uj/odro/6Hb6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc + 6v+k3ev/pN3r/6Xd6/+l3uz/pt7s/6be7f+n3+3/p9/u/6jf7v+o4O7/qeDu/6ng7/+q4e//quHw/6rh + 8P+r4vD/rOLx/6zi8f+s4/L/rePy/67k8/+u5PP/ruTz/6/k9P+w5fT/sOX0/7Dm9f+x5vX/seb2/7Ln + 9v+y5/b/s+f3/7Pn9/+06Pj/tOj4/7Hj8v9DV13/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zBf + dv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/yFae/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wgOEv88cJT/NmqP/zNnjP8zZ47/NmqR/zpvlv85cJX/Nm6T/zJrjv9Ykaz/reXv/8D4 + ///A+P//wPj//7/4//+/+P//v/j//774//++9///vff//733/v+99/7/vPf+/7z3/v+89/7/u/f+/7v2 + /v+79v7/uvb+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvX+/7b0 + /v+19P7/tfT+/7X0/v+09P7/tPT+/7T0/f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy + /f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x+/+u8Pv/rfD6/63v+f+s7/j/rO73/6zu9/+r7fX/q+31/6rs + 9P+q7PP/qevy/6nq8f+p6vH/qOrw/6jp7/+n6O7/p+ju/6bn7f+m5+z/pebr/6Xm6v+l5er/pOXp/6Tk + 6P+j5Of/o+Pm/6Pj5v+i4uT/ouHk/6Hh4/+h4eP/oODh/6Df4f+g3+D/n97f/5/e3v+e3d3/nt3d/57d + 3f+d3Nz/ndzc/5zb3P+c29v/nNvb/5va2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5nY2f+Y19n/mNfY/5fW + 2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT1f+U09X/k9LV/5PS1P+S0dT/ktHU/5LR + 0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/j87R/47N0f+OzdD/jczQ/43M0P+NzND/jMvP/4zL + z/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jI + z/+IyM//iMjQ/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG + 0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI + 0/+IyNT/icjU/4nJ1P+JydX/isnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M + 1/+NzNj/jszY/47M2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/kc/b/5LP + 3P+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR3f+U0d3/ldHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT + 4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mdXi/5rV4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX + 5P+c1+T/nNfk/53X5f+d2OX/ndjl/57Y5f+e2Ob/ntnm/5/Z5v+f2eb/n9nn/6DZ5/+g2uf/oNro/6Da + 6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Pc6v+k3ev/pd3r/6Xd7P+l3uz/pt7t/6ff + 7f+n3+3/p9/u/6jg7v+p4O7/qeDv/6nh7/+q4fD/quHw/6vi8P+r4vH/rOLx/6zj8v+t4/L/rePy/67k + 8/+u5PP/r+T0/6/l9P+w5fT/sOb1/7Hm9f+x5vX/seb2/7Ln9v+z5/f/s+f3/7Po9/+06Pj/pNPh/xIX + GP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8KERT/JWKE/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Hlx//woUGv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/zVkgf83bI//MmeK/zFl + if80aI7/OG6T/ztxlf84cJP/NG2P/zZvkf96ssb/wPj//8D4///A+P//v/j//7/4//+/+P//vvj//774 + //++9///vff+/733/v+99/7/vPf+/7z3/v+79/7/u/b+/7v2/v+69v7/uvb+/7r2/v+59v7/ufb+/7n2 + /v+49f7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P7/tPT9/7P0 + /f+z8/3/s/P9/7Lz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y/f+v8v3/rvH7/67w + +/+t8Pr/rfD5/6zv+P+s7vf/rO73/6vt9v+r7fX/quz0/6rs8/+q6/P/qevy/6nq8f+o6vD/qOnw/6jp + 7/+n6O7/puft/6bn7P+m5+z/pebq/6Xl6v+k5en/pOTo/6Pk5/+j4+b/o+Pm/6Li5f+i4uT/oeHj/6Hh + 4/+h4OL/oODh/6Df4P+f3t//n97f/5/e3v+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va + 2v+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX2f+Y19j/mNfY/5fW2P+X1tf/l9bX/5bV1/+W1db/ldTW/5XU + 1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O + 0f+PztH/js3R/47N0f+NzND/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rK + z/+Kys//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH + 0P+Gx9D/hsfQ/4bH0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG + 0f+GxtH/hsbS/4bH0v+Gx9L/h8fS/4fH0/+IyNP/iMjT/4jI0/+JyNT/icnU/4nJ1P+JydX/isnV/4rK + 1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N + 2f+Pztr/kM7a/5DO2v+Qztr/kc7b/5HP2/+Rz9v/ks/b/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR + 3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mNTh/5nV + 4v+Z1eL/mtXi/5rV4v+a1eP/m9bj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X5f+d2OX/ntjl/57Y + 5v+e2Ob/n9nm/5/Z5v+f2ef/n9nn/6DZ5/+g2uj/oNro/6Ha6P+h2uj/odvp/6Lb6f+i2+n/otvp/6Pc + 6v+j3Or/o9zq/6Td6/+l3ev/pd3s/6Xe7P+m3uz/p9/t/6ff7f+n3+7/qN/u/6jg7v+p4O//qeHv/6rh + 7/+q4fD/q+Lw/6vi8f+s4vH/rOLx/63j8v+t4/L/ruTz/67k8/+v5PT/r+X0/7Dl9P+w5fT/sOb1/7Hm + 9f+x5vb/suf2/7Ln9v+z5/f/s+j3/7Po+P9si5X/BQYG/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xou + OP8lYoT/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8dW37/FjNE/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/IkBS/zlukP8zaIz/MWWK/zJmi/81a5D/OG6T/zhvk/81bY//MmuO/zhx + kv+p4e3/wPj//8D4//+/+P//v/j//7/4//+++P//vvj//773//+99///vff+/733/v+89/7/vPf+/7z3 + /v+79v7/u/b+/7v2/v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1 + /v+29f7/tfT+/7X0/v+19P7/tfT+/7T0/v+09P3/s/T9/7P0/f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz + /f+x8/3/sPL9/7Dy/f+v8v3/r/L9/6/y/f+u8fz/rvH7/63w+v+t8Pn/re/5/6zv+P+s7vf/q+32/6vt + 9f+r7fX/quzz/6rr8/+p6/L/qerx/6jq8P+o6fD/qOnv/6fo7v+m5+3/pufs/6bn7P+l5uv/pebq/6Tl + 6f+k5Oj/pOTo/6Pk5/+j4+b/ouLl/6Li5P+i4eT/oeHj/6Hg4v+g4OH/oN/h/5/e3/+f3t//n97e/57d + 3f+e3d3/ndzc/53c3P+d3Nz/nNvc/5zb2/+b2tv/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX + 2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV1/+W1db/ldTW/5XU1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR + 1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+Qz9L/j87S/4/O0f+OzdH/js3R/47N0P+NzND/jczQ/4zL + z/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rKz/+Kyc//icnP/4nJz/+Jyc//icnP/4nJ + z/+IyM//iMjP/4jIz/+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG + 0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxtH/hcbR/4XG0f+GxtH/hsfS/4bH0v+Hx9L/h8fT/4jI + 0/+IyNP/iMjT/4jI1P+JydT/icnU/4nJ1f+KydX/isnV/4rK1f+Lytb/i8rW/4vK1v+My9f/jMvX/4zL + 1/+Ny9f/jczY/43M2P+OzNj/jszY/47N2f+Pzdn/j83Z/4/N2f+Qztr/kM7a/5DO2v+Rztv/kc7b/5HP + 2/+Sz9v/ks/c/5LP3P+T0Nz/k9Dd/5PQ3f+T0N3/lNHd/5TR3v+V0d7/ldHe/5XS3/+W0t//ltLf/5bS + 3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+a1eL/mtXi/5rV4/+a1uP/m9bj/5vW + 4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y5f+d2OX/ntjm/57Y5v+e2eb/n9nm/5/Z5/+f2ef/oNnn/6Da + 5/+g2uj/odro/6Ha6P+h2+j/otvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td6/+l3ev/pd7s/6be + 7P+m3u3/p9/t/6ff7v+o3+7/qODu/6ng7v+p4e//quHv/6rh8P+q4fD/q+Lx/6zi8f+s4vH/rOPy/63j + 8v+u5PP/ruTz/67k8/+v5PT/sOX0/7Dl9P+w5vX/seb1/7Hm9v+y5/b/suf2/7Pn9/+z6Pf/reDv/yk2 + Ov8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/KlJm/x1cf/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8gTmz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8MFRv/Om+S/zVq + jv8zZ43/MmeN/zVqkP84bZP/OW+U/zVskP8xaYz/L2iL/1aPq//A+P//wPj//8D4//+/+P//v/j//7/4 + //+++P//vvf//733//+99/7/vff+/7z3/v+89/7/vPf+/7v3/v+79v7/u/b+/7r2/v+69v7/ufb+/7n2 + /v+59v7/ufb+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0 + /v+z9P3/s/T9/7Pz/f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x + /P+u8fv/rvD7/63w+f+t7/n/rO/4/6zu9/+r7fb/q+31/6vt9f+q7PT/quzz/6nr8v+p6vH/qerx/6jq + 8P+o6e//p+ju/6fo7v+m5+3/pufs/6Xm6/+l5ur/peXq/6Tk6P+k5Oj/o+Tn/6Pj5v+j4+b/ouLk/6Lh + 5P+h4eP/oeHj/6Dg4f+g3+H/oN/g/5/e3/+f3t7/nt3d/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5va + 2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Z2Nn/mNfZ/5jX2P+X1tj/l9bY/5fW1/+W1df/ltXX/5bV + 1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP + 0v+PztL/j87R/4/O0f+OzdH/js3Q/43M0P+NzND/jMvP/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vK + z/+Kys//isrP/4rJz/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH + 0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF + 0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4fH0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnV/4rJ + 1f+KydX/isrV/4vK1v+Lytb/i8rW/4zL1v+My9f/jMvX/43L1/+NzNf/jczY/47M2P+OzNj/js3Z/47N + 2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5LP2/+Sz9z/ks/c/5LQ3P+T0Nz/k9Dd/5PQ + 3f+U0d3/lNHd/5XR3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU + 4f+Z1OH/mdXi/5nV4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5P+d1+X/ndjl/53Y + 5f+e2OX/ntjm/57Z5v+f2eb/n9nm/5/Z5/+g2ef/oNrn/6Da6P+g2uj/odro/6Hb6P+h2+n/otvp/6Lb + 6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd6/+l3ez/pt7s/6be7f+n3+3/p9/t/6ff7v+o4O7/qeDu/6ng + 7/+p4e//quHw/6rh8P+r4vD/q+Lx/6zi8f+s4/L/rePy/63j8v+u5PP/ruTz/6/k9P+v5fT/sOX0/7Dm + 9f+x5vX/seb1/7Hm9v+y5/b/s+f3/7Pn9/+HsLv/CAsL/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wUI + Cv8uaIn/G1l9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Glp+/yFegf8IDhL/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP82Y4L/N2qR/zJmjv8xZY7/M2eQ/zdslP84bZT/NWuT/zFn + j/8pYYj/LGSJ/3uxyP+68vv/wPj//7/4//+/+P//v/j//774//+++P//vff//733/v+99/7/vff+/7z3 + /v+89/7/u/f+/7v2/v+79v7/uvb+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+39f7/t/X+/7f1 + /v+39f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT+/7T0/f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz + /f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y/f+v8v3/r/L9/67x+/+u8Pv/rfD6/63w+f+s7/j/rO73/6zu + 9/+r7fb/q+31/6rs9P+q7PP/quvz/6nq8f+p6vH/qOrw/6jp8P+n6O7/p+ju/6bn7f+m5+z/pufs/6Xm + 6v+l5er/pOXp/6Tk6P+j5Of/o+Pm/6Pj5v+i4uX/ouHk/6Hh4/+h4eP/oeDi/6Df4f+g3+D/n97f/5/e + 3/+f3t7/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/nNvb/5va2/+b2tr/mtna/5rZ2v+a2dr/mdjZ/5nY + 2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5fW1/+W1df/ltXW/5XU1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS + 1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/5DP0v+PztH/j87R/47N0f+OzdH/jczQ/43M + 0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJ + z/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG + 0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG0v+Gx9L/hsfS/4fH + 0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydT/icnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL + 1/+My9f/jcvX/43M1/+NzNj/jczY/47M2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kM7a/5HO + 2/+Rz9v/kc/b/5LP2/+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR3f+U0d3/lNHe/5XR3v+V0t7/ldLf/5bS + 3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5jU4f+Z1eL/mdXi/5rV4v+a1eL/mtbj/5vW + 4/+b1uP/m9bj/5zX5P+c1+T/nNfk/5zX5f+d1+X/ndjl/57Y5f+e2Ob/ntjm/5/Z5v+f2eb/n9nn/5/Z + 5/+g2uf/oNro/6Da6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+k3ev/pd3r/6Xd + 7P+l3uz/pt7s/6ff7f+n3+3/p9/u/6jf7v+p4O7/qeDv/6nh7/+q4e//quHw/6vi8P+r4vH/rOLx/6zi + 8f+t4/L/rePy/67k8/+u5PP/r+T0/6/l9P+w5fT/sOX0/7Hm9f+x5vX/seb2/7Ln9v+z5/f/s+f3/z9S + V/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Ficv/yVihP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xYtPP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yI+ + VP82aZL/MGOO/y1hjf8tYY7/MWSR/zRok/81apX/L2WP/yhgif8kW4P/NGuR/4e90v/A+P//v/j//7/4 + //+/+P//vvj//774//++9///vff//733/v+99/7/vPf+/7z3/v+79/7/u/b+/7v2/v+79v7/uvb+/7r2 + /v+59v7/ufb+/7n2/v+49f7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvX+/7X0/v+19P7/tfT+/7X0 + /v+09P7/tPT9/7P0/f+z9P3/s/P9/7Lz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y + /f+v8v3/rvH8/67w+/+t8Pr/rfD5/63v+f+s7vf/rO73/6vt9v+r7fX/q+31/6rs8/+q6/P/qevy/6nq + 8f+o6vD/qOnw/6jp7/+n6O7/puft/6bn7P+m5+z/pebr/6Xl6v+k5en/pOTo/6Tk6P+j5Of/o+Pm/6Li + 5f+i4uT/ouHk/6Hh4/+h4OL/oODh/6Df4f+f3t//n97f/5/e3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb + 2/+c29v/m9rb/5va2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5jX2f+Y19j/mNfY/5fW2P+X1tf/l9bX/5bV + 1/+W1df/ldTW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP + 0v+Qz9L/kM/S/4/O0v+PztH/js3R/47N0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vK + z/+Lys//isrP/4rKz/+Kys//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyM//iMjQ/4fI + 0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF + 0P+FxdH/hcbR/4XG0f+FxtH/hsbR/4bH0v+Gx9L/h8fS/4fH0/+IyNP/iMjT/4jI0/+IyNT/icnU/4nJ + 1P+JydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL1/+My9f/jcvX/43M2P+NzNj/jszY/47M + 2P+Ozdn/j83Z/4/N2f+Pzdn/kM7a/5DO2v+Qztr/kc7b/5HP2/+Rz9v/ks/b/5LP3P+Sz9z/k9Dc/5PQ + 3f+T0N3/k9Dd/5TR3f+U0d7/ldHe/5XR3v+V0t//ltLf/5bS3/+W0t//l9Pg/5fT4P+X0+D/l9Pg/5jU + 4f+Y1OH/mNTh/5nU4f+Z1eL/mtXi/5rV4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X + 5f+d2OX/ntjl/57Y5v+e2Ob/ntnm/5/Z5v+f2ef/n9nn/6DZ5/+g2uf/oNro/6Ha6P+h2uj/odvo/6Lb + 6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+k3ev/pd3s/6Xe7P+m3uz/pt7t/6ff7f+n3+7/qN/u/6jg + 7v+p4O7/qeHv/6rh7/+q4fD/quHw/6vi8f+s4vH/rOLx/6zj8v+t4/L/ruTz/67k8/+u5PP/r+T0/7Dl + 9P+w5fT/sOb1/7Hm9f+x5vb/suf2/7Ln9v+cytn/GSEj/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8pSlz/H12A/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWn7/IU9s/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Bw0S/zNkkf8sXYv/J1mI/yhaiv8rXo3/LmGQ/y5i + kf8tYY//KFyK/yNZhf8jWIT/OW2V/6vi7v+/+P//v/j//7/4//+/+P//vvj//773//+99///vff+/733 + /v+89/7/vPf+/7z3/v+79/7/u/b+/7v2/v+69v7/uvb+/7n2/v+59v7/ufb+/7n2/v+49f7/uPX+/7f1 + /v+39f7/t/X+/7b1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P7/s/T9/7P0/f+z8/3/s/P9/7Lz + /f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+w8v3/r/L9/6/y/f+u8fz/rvH7/67w+/+t8Pn/re/5/6zv + +P+s7vf/q+32/6vt9f+r7fX/quz0/6rr8/+p6/L/qerx/6nq8f+o6vD/qOnv/6fo7v+n6O7/puft/6bn + 7P+l5uv/pebq/6Xl6v+k5Oj/pOTo/6Pk5/+j4+b/ouLl/6Li5P+i4eT/oeHj/6Hg4v+g4OH/oN/h/6Df + 4P+f3t//n97e/57d3f+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb2/+b2tv/m9rb/5va2v+a2dr/mtna/5nY + 2f+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW2P+X1tf/ltXX/5bV1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT + 1f+T0tT/k9LU/5LR1P+S0dT/kdDT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+PztH/js3R/47N + 0P+NzND/jczQ/4zLz/+My8//jMvP/4zLz/+Lys//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJ + z/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyND/iMjQ/4fH0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG + 0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH + 0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ1f+KydX/isnV/4rK1f+Lytb/i8rW/4vK + 1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M2P+OzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO + 2v+Rztv/kc7b/5HP2/+Sz9v/ks/c/5LP3P+S0Nz/k9Dd/5PQ3f+T0N3/lNHd/5TR3v+V0d7/ldHe/5XS + 3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+Z1eL/mtXi/5rV + 4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+T/ndfl/53Y5f+d2OX/ntjl/57Y5v+e2eb/n9nm/5/Z + 5v+f2ef/oNnn/6Da5/+g2uj/odro/6Ha6P+h2+j/odvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td + 6/+l3ev/pd3s/6be7P+m3u3/p9/t/6ff7f+o3+7/qODu/6ng7v+p4O//quHv/6rh8P+q4fD/q+Lw/6vi + 8f+s4vH/rOPy/63j8v+t4/L/ruTz/67k8/+v5PT/r+X0/7Dl9P+w5vX/seb1/7Hm9f+y5/b/suf2/2+P + mf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/y1hgP8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8eW4D/Bw0R/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/JUxy/yVWh/8hUoT/IlOF/yVWiP8nWoz/KFyN/ydajP8kWIf/IVSB/yBTgP8lV4P/Z525/8D4 + //+/+P//v/j//7/4//+++P//vvj//733//+99/7/vff+/733/v+89/7/vPf+/7v3/v+79v7/u/b+/7r2 + /v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/t/X+/7f1/v+39f7/t/X+/7b1/v+29P7/tfT+/7X0 + /v+19P7/tPT+/7T0/v+09P3/s/T9/7Pz/f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy + /f+v8v3/r/L9/67x/P+u8fv/rvD7/63w+v+t7/n/rO/4/6zu9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr + 8/+p6vH/qerx/6jq8P+o6fD/p+ju/6fo7v+m5+3/pufs/6Xm6/+l5ur/peXq/6Tl6f+k5Oj/o+Tn/6Pj + 5v+j4+b/ouLl/6Lh5P+h4eP/oeHj/6Hg4v+g3+H/oN/g/5/e3/+f3t//nt3d/57d3f+e3d3/ndzc/53c + 3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+X1tj/l9bY/5fW + 1/+X1tf/ltXX/5bV1v+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ + 0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O0f+OzdH/js3Q/43M0P+NzND/jczQ/4zLz/+My8//jMvP/4vL + z/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI + 0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF + 0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4bH0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI + 1P+JydT/icnU/4rJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL1v+My9f/jMvX/43L1/+NzNf/jczY/43M + 2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LQ + 3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5TR3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT + 4P+Y1OH/mNTh/5jU4f+Y1OH/mdXi/5nV4v+a1eL/mtXi/5rW4/+b1uP/m9bj/5vW4/+c1+T/nNfk/5zX + 5P+c1+X/ndjl/53Y5f+e2OX/ntjm/57Y5v+f2eb/n9nm/5/Z5/+f2ef/oNrn/6Da6P+g2uj/odro/6Hb + 6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+j3Or/pN3r/6Xd6/+l3ez/pd7s/6be7P+n3+3/p9/t/6ff + 7v+o3+7/qeDu/6ng7/+p4e//quHv/6rh8P+r4vD/q+Lx/6zi8f+s4/L/rePy/63j8v+u5PP/ruTz/6/k + 9P+v5fT/sOX0/7Dl9P+x5vX/seb1/7Hm9v+g0uL/Hycq/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8XJi7/IF2B/xpafv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x5c + f/8VLTz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8QIjP/IlOD/x9Rgv8fUYL/H1GD/yNW + iP8kV4n/JFeJ/yFUhP8eUH//HU98/yBSfv8sX4n/iL7S/7/4//+/+P//v/j//774//+++P//vvf//733 + //+99/7/vff+/7z3/v+89/7/u/f+/7v2/v+79v7/u/b+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1 + /v+49f7/t/X+/7f1/v+39f7/tvX+/7b1/v+19P7/tfT+/7X0/v+19P7/tPT+/7T0/f+z9P3/s/T9/7Pz + /f+y8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y/f+v8v3/r/L9/67x/P+u8Pv/rfD6/63w + +f+t7/n/rO73/6zu9/+r7fb/q+31/6rs9P+q7PP/quvz/6nr8v+p6vH/qOrw/6jp8P+o6e//p+ju/6bn + 7f+m5+z/pufs/6Xm6/+l5er/pOXp/6Tk6P+k5Oj/o+Pm/6Pj5v+i4uX/ouLk/6Hh4/+h4eP/oeDi/6Dg + 4f+g3+H/n97f/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/53c3P+c29v/nNvb/5va2/+b2tv/mtna/5rZ + 2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX2P+X1tj/l9bX/5fW1/+W1df/ltXX/5XU1v+V1Nb/ldTW/5TT + 1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/5DP0v+PztL/j87R/47N + 0f+OzdH/js3Q/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isrP/4rJ + z/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjP/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH + 0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hcbR/4bG + 0v+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI0/+IyNP/iMjU/4nJ1P+JydT/icnV/4rJ1f+KytX/isrV/4vK + 1v+Lytb/jMvW/4zL1/+My9f/jMvX/43M1/+NzNj/jczY/47M2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/5DO + 2v+Qztr/kM7a/5HO2/+Rz9v/kc/b/5LP2/+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR3f+U0d3/lNHe/5XR + 3v+V0d7/ldLf/5bS3/+W0t//ltLf/5fT4P+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5rV + 4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5f+d1+X/ndjl/57Y5f+e2Ob/ntjm/57Z + 5v+f2eb/n9nn/5/Z5/+g2ef/oNro/6Da6P+h2uj/odro/6Hb6P+i2+n/otvp/6Lb6f+j3Or/o9zq/6Pc + 6v+k3ev/pN3r/6Xd7P+l3uz/pt7s/6be7f+n3+3/p9/u/6jf7v+o4O7/qeDu/6nh7/+q4e//quHw/6rh + 8P+r4vH/rOLx/6zi8f+s4/L/rePy/67k8/+u5PP/ruTz/6/l9P+w5fT/sOX0/7Dm9f+x5vX/seb2/1Jv + fP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ytKXP8iXoH/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x1Nav8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wIFCP8kUn//I1aF/yBTgv8hU4T/IlWH/yNWiP8jVYb/IlSE/x9RgP8eUH3/G015/yBS + ff84a5L/ksnb/773//+/+P//v/j//774//++9///vff//733/v+99/7/vPf+/7z3/v+89/7/u/b+/7v2 + /v+79v7/uvb+/7r2/v+59v7/ufb+/7n2/v+59v7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvX+/7b0 + /v+19P7/tfT+/7X0/v+09P7/tPT+/7P0/f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy + /f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x+/+t8Pr/rfD5/63v+f+s7/j/rO73/6vt9v+r7fX/q+31/6rs + 9P+q6/P/qevy/6nq8f+p6vH/qOnw/6jp7/+n6O7/p+ju/6bn7P+m5+z/pebr/6Xm6v+l5er/pOTo/6Tk + 6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh4/+h4OL/oODh/6Df4f+g3+D/n97f/5/e3v+e3d3/nt3d/53c + 3P+d3Nz/ndzc/5zb3P+c29v/m9rb/5va2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5nY2f+Y19j/mNfY/5fW + 2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT1f+U09X/k9LU/5PS1P+S0dT/ktHU/5HQ + 0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/js3R/47N0f+OzdD/jczQ/43M0P+My8//jMvP/4zL + z/+My8//i8rP/4vKz/+Lys//i8rP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jI + z/+IyM//iMjQ/4jI0P+Hx9D/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG + 0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI + 0/+IyNT/icjU/4nJ1P+JydX/isnV/4rJ1f+KytX/i8rW/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M + 1/+NzNj/jszY/47M2P+Ozdn/j83Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP + 3P+Sz9z/ktDc/5PQ3f+T0N3/k9Dd/5TR3f+U0d7/ldHe/5XR3v+V0t7/ltLf/5bS3/+W0t//ltPf/5fT + 4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mdXi/5rV4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX + 5P+c1+T/nNfl/53X5f+d2OX/ndjl/57Y5f+e2Ob/ntnm/5/Z5v+f2eb/n9nn/6DZ5/+g2uf/oNro/6Ha + 6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+k3ev/pd3r/6Xd7P+m3uz/pt7t/6ff + 7f+n3+3/qN/u/6jg7v+p4O7/qeDv/6rh7/+q4fD/quHw/6vi8P+s4vH/rOLx/6zj8v+t4/L/rePy/67k + 8/+u5PP/r+T0/6/l9P+w5fT/sOb1/7Hm9f+bzuH/FBsc/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8FBwn/LWKB/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Hlx//wYMEf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xs7V/8qXIn/KFyI/ydb + iP8lWYj/JFaH/yVWhf8lVYT/JVaE/yNVgf8gUn7/HE56/x1Pe/86bZT/k8rb/7/4//+/+P//vvj//774 + //+99///vff+/733/v+99/7/vPf+/7z3/v+79/7/u/b+/7v2/v+69v7/uvb+/7r2/v+59v7/ufb+/7n2 + /v+49f7/uPX+/7f1/v+39f7/t/X+/7f1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P7/tPT9/7P0 + /f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y/f+u8fz/rvH7/67w + +/+t8Pr/re/5/6zv+P+s7vf/rO73/6vt9f+r7fX/quz0/6rs8/+q6/P/qerx/6nq8f+o6vD/qOnw/6fo + 7v+n6O7/puft/6bn7P+l5uv/pebq/6Xl6v+k5en/pOTo/6Pk5/+j4+b/o+Pm/6Li5P+i4eT/oeHj/6Hh + 4/+h4OL/oN/h/6Df4P+f3t//n97f/57d3f+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va + 2v+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW2P+X1tf/l9bX/5bV1/+W1db/ldTW/5XU + 1v+U09X/lNPV/5TT1f+T0tX/k9LU/5LR1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O + 0f+PztH/js3R/47N0P+NzND/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rK + z/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH + 0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG + 0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ1P+KydX/isnV/4rK + 1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N + 2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Rz9v/ks/c/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR + 3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV + 4v+Z1eL/mtXi/5rV4v+a1uP/m9bj/5vW4/+b1uP/nNfk/5zX5P+c1+T/nNfl/53Y5f+d2OX/ntjl/57Y + 5v+e2eb/n9nm/5/Z5v+f2ef/oNnn/6Da5/+g2uj/oNro/6Ha6P+h2+j/odvp/6Lb6f+i2+n/o9zq/6Pc + 6v+j3Or/o9zq/6Td6/+l3ev/pd3s/6Xe7P+m3u3/p9/t/6ff7f+n3+7/qN/u/6ng7v+p4O//qeHv/6rh + 7/+q4fD/q+Lw/6vi8f+s4vH/rOPy/63j8v+t4/L/ruTz/67k8/+v5PT/r+X0/7Dl9P+w5vX/seb1/1R4 + if8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xgrN/8eXX//Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWn3/FDRJ/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/ChMa/zFljP8vZIz/LmOM/yteiv8oWYf/KViH/ypbiP8rXIn/KVyH/yZY + hP8iU4D/HE17/xlKeP85bZT/pN3q/7/4//+++P//vvj//773//+99/7/vff+/733/v+89/7/vPf+/7v3 + /v+79v7/u/b+/7v2/v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1 + /v+29P7/tfT+/7X0/v+19P7/tfT+/7T0/v+09P3/s/T9/7P0/f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz + /f+x8/3/sPL9/7Dy/f+v8v3/r/L9/6/y/f+u8fz/rvD7/63w+v+t8Pn/re/5/6zu9/+s7vf/q+32/6vt + 9f+q7PT/quzz/6rr8/+p6/L/qerx/6jq8P+o6fD/qOnv/6fo7v+m5+3/pufs/6bn7P+l5uv/peXq/6Tl + 6f+k5Oj/pOTo/6Pj5v+j4+b/ouLl/6Li5P+h4eP/oeHj/6Hg4v+g4OH/oN/g/5/e3/+f3t//n97e/57d + 3f+e3d3/ndzc/53c3P+d3Nz/nNvb/5zb2/+b2tv/m9rb/5rZ2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX + 2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV1/+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR + 1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+Qz9L/j87R/4/O0f+OzdH/js3R/47N0P+NzND/jczQ/4zL + z/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rKz/+Kyc//icnP/4nJz/+Jyc//icnP/4nI + z/+IyM//iMjP/4jIz/+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG + 0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4XG0f+GxtL/hsfS/4bH0v+Hx9L/h8fT/4jI + 0/+IyNP/iMjT/4nI1P+JydT/icnU/4nJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL1v+My9f/jMvX/4zL + 1/+NzNf/jczY/43M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5DO2v+Rztv/kc/b/5HP + 2/+Sz9v/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5TR3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bS + 3/+X0+D/l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+a1eL/mtXi/5rV4/+b1uP/m9bj/5vW + 4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y5f+e2OX/ntjm/57Y5v+e2eb/n9nm/5/Z5/+f2ef/oNnn/6Da + 6P+g2uj/odro/6Ha6P+h2+n/otvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td6/+l3ez/pd7s/6be + 7P+m3u3/p9/t/6ff7v+o3+7/qODu/6ng7/+p4e//quHv/6rh8P+r4vD/q+Lx/6zi8f+s4vH/rOPy/63j + 8v+u5PP/ruTz/67k8/+v5fT/sOX0/6/k9P+Qxdv/Eh0i/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/IUdg/x5cf/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpYff8dVXj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/KFBq/zNp + jP8yZ4z/LmCK/y1cif8tXYj/L2GM/zFkjf8xZI7/LWCL/ydahv8gUoD/HE19/xpKe/9BdJz/uPH5/7/4 + //+++P//vvf//733//+99/7/vff+/7z3/v+89/7/vPf+/7v2/v+79v7/u/b+/7r2/v+69v7/ufb+/7n2 + /v+59v7/ufb+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0 + /f+z9P3/s/T9/7Pz/f+y8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x + /P+u8fv/rfD6/63w+f+t7/n/rO/4/6zu9/+r7fb/q+31/6vt9f+q7PT/quvz/6nr8v+p6vH/qerx/6jp + 8P+o6e//p+ju/6fo7v+m5+z/pufs/6Xm6/+l5ur/pOXp/6Tk6P+k5Oj/o+Tn/6Pj5v+i4uX/ouLk/6Lh + 5P+h4eP/oeDi/6Dg4f+g3+H/oN/g/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/53c3P+c29z/nNvb/5va + 2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Z2Nn/mNfY/5jX2P+X1tj/l9bY/5fW1/+W1df/ltXX/5bV + 1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR1P+R0NP/kdDT/5HQ0/+R0NP/kM/S/5DP + 0v+PztL/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zLz/+My8//jMvP/4vKz/+Lys//i8rP/4vK + z/+Kys//isrP/4rJz/+Kyc//icnP/4nJz/+Jyc//icnP/4jIz/+IyM//iMjP/4jI0P+HyND/h8fQ/4fH + 0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XG + 0f+FxtH/hcbR/4bG0f+Gx9L/hsfS/4fH0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnV/4rJ + 1f+KydX/isrV/4vK1v+Lytb/i8rW/4zL1/+My9f/jMvX/43L1/+NzNf/jczY/47M2P+OzNj/js3Z/4/N + 2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5LP2/+Sz9z/ks/c/5PQ3P+T0N3/k9Dd/5PQ + 3f+U0d3/lNHe/5XR3v+V0d7/ldLe/5bS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU + 4f+Z1OH/mdXi/5nV4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5f+d1+X/ndjl/53Y + 5f+e2Ob/ntjm/57Z5v+f2eb/n9nn/5/Z5/+g2ef/oNrn/6Da6P+h2uj/odro/6Hb6P+h2+n/otvp/6Lb + 6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd6/+l3uz/pt7s/6be7f+n3+3/p9/t/6jf7v+o4O7/qeDu/6ng + 7/+q4e//quHw/6rh8P+r4vD/rOLx/6zi8f+s4/L/rePy/67k8/+u5PP/ruTz/6/k9P+w5fT/reHx/z5k + fv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcOEv8pY4b/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxaf/8OJDL/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8VKTb/NWuM/zJmjP8vYYr/L2CJ/y9hif8yZIz/NmqR/zds + k/80aJL/LWGM/yZYh/8gUoL/Hk+B/yFRhP9pnbz/vvf+/774//++9///vff//733/v+99/7/vff+/7z3 + /v+89/7/u/f+/7v2/v+79v7/uvb+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1/v+39f7/t/X+/7f1 + /v+29f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT+/7T0/f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz + /f+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x+/+u8Pv/rfD6/63v+f+s7/j/rO73/6zu + 9/+r7fX/q+31/6rs9P+q7PP/qevy/6nq8f+p6vH/qOrw/6jp7/+n6O7/p+ju/6bn7f+m5+z/pebr/6Xm + 6v+l5er/pOXp/6Tk6P+j5Of/o+Pm/6Pj5v+i4uT/ouHk/6Hh4/+h4eP/oODh/6Df4f+g3+D/n97f/5/e + 3/+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/nNvb/5va2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5nY + 2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5fW1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT1f+U09X/k9LV/5PS + 1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/j87R/47N0f+OzdD/jczQ/43M + 0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJ + z/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG + 0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG0v+Gx9L/h8fS/4fH + 0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydT/isnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL + 1/+My9f/jcvX/43M1/+NzNj/jszY/47M2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO + 2/+Rz9v/kc/b/5LP3P+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR3f+U0d3/ldHe/5XR3v+V0t7/ldLf/5bS + 3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mdXi/5rV4v+a1eP/mtbj/5vW + 4/+b1uP/m9bk/5zX5P+c1+T/nNfk/5zX5f+d2OX/ndjl/57Y5f+e2Ob/ntnm/5/Z5v+f2eb/n9nn/6DZ + 5/+g2uf/oNro/6Da6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Pc6v+k3ev/pd3r/6Xd + 7P+l3uz/pt7t/6ff7f+n3+3/p9/u/6jg7v+p4O7/qeDv/6nh7/+q4fD/quHw/6vi8P+r4vH/rOLx/6zj + 8v+t4/L/rePy/67k8/+u5PP/r+T0/63k8v96r8n/Fig2/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/FS0+/xpZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1p9/xtHZf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8wXn3/NWaN/zFii/8xY4n/MGOJ/zFmi/82bJD/OXCV/zdslP8yZ5H/KV2K/yRVhv8iUoX/JFWH/y5g + kP9/tc3/uvT8/774//++9///vff+/733/v+99/7/vPf+/7z3/v+79/7/u/b+/7v2/v+69v7/uvb+/7r2 + /v+59v7/ufb+/7n2/v+49f7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0 + /v+09P7/tPT9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y + /f+v8v3/rvH7/67w+/+t8Pr/rfD5/6zv+P+s7vf/rO73/6vt9v+r7fX/quz0/6rs8/+q6/P/qevy/6nq + 8f+o6vD/qOnw/6jp7/+n6O7/puft/6bn7P+m5+z/pebq/6Xl6v+k5en/pOTo/6Pk5/+j4+b/o+Pm/6Li + 5f+i4uT/oeHj/6Hh4/+h4OL/oODh/6Df4P+f3t//n97f/5/e3v+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb + 2/+c29v/m9rb/5va2/+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX2f+Y19j/mNfY/5fW2P+X1tf/l9bX/5bV + 1/+W1db/ldTW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP + 0v+Qz9L/kM/S/4/O0f+PztH/js3R/47N0f+NzND/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vK + z/+Lys//isrP/4rKz/+Kys//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI + 0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF + 0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Gx9L/h8fS/4fH0/+IyNP/iMjT/4jI0/+JyNT/icnU/4nJ + 1P+JydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL1/+My9f/jczX/43M2P+NzNj/jszY/47N + 2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Qztr/kc7b/5HP2/+Rz9v/ks/b/5LP3P+S0Nz/k9Dc/5PQ + 3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU + 4f+Y1OH/mNTh/5nU4f+Z1eL/mtXi/5rV4v+a1eP/m9bj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X + 5f+d2OX/ntjl/57Y5v+e2Ob/n9nm/5/Z5v+f2ef/n9nn/6DZ5/+g2uj/oNro/6Ha6P+h2uj/odvp/6Lb + 6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+l3ev/pd3s/6Xe7P+m3uz/pt7t/6ff7f+n3+7/qN/u/6jg + 7v+p4O//qeHv/6rh7/+q4fD/q+Lw/6vi8f+s4vH/rOLx/63j8v+t4/L/ruTz/67k8/+v5PT/kMbb/y9g + gv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8gU3T/G1l9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p//wgS + Gv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xYoNv83aI7/NGaM/zJlif8wZYj/MWaK/zNp + jf82bJH/N22T/zJnkP8rX4v/I1aG/yNVhv8mWIj/Kl2M/zltmP9+t83/t/H6/773//+99///vff+/733 + /v+89/7/vPf+/7z3/v+79v7/u/b+/7v2/v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/uPX+/7f1 + /v+39f7/t/X+/7b1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P3/s/T9/7P0/f+z8/3/svP9/7Lz + /f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+w8v3/r/L9/6/y/f+u8fz/rvH7/63w+v+t8Pn/re/5/6zv + +P+s7vf/q+32/6vt9f+r7fX/quzz/6rr8/+p6/L/qerx/6jq8P+o6fD/qOnv/6fo7v+n6O7/pufs/6bn + 7P+l5uv/pebq/6Tl6f+k5Oj/pOTo/6Pk5/+j4+b/ouLl/6Li5P+i4eT/oeHj/6Hg4v+g4OH/oN/h/6Df + 4P+f3t//n97e/57d3f+e3d3/ndzc/53c3P+d3Nz/nNvc/5zb2/+b2tv/m9rb/5va2v+a2dr/mtna/5nY + 2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW2P+X1tf/ltXX/5bV1/+W1db/ldTW/5XU1v+U09X/lNPV/5PS + 1f+T0tT/k9LU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+OzdH/js3R/47N + 0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rKz/+Kyc//isnP/4nJ + z/+Jyc//icnP/4nJz/+IyM//iMjP/4jIz/+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsfQ/4bG + 0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxtH/hcbR/4XG0f+GxtH/hsfS/4bH + 0v+Hx9L/h8fT/4jI0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ1f+KydX/isnV/4rK1f+Lytb/i8rW/4vK + 1v+My9f/jMvX/4zL1/+Ny9f/jczY/43M2P+OzNj/jszY/47N2f+Pzdn/j83Z/4/N2f+Pztr/kM7a/5DO + 2v+Rztv/kc7b/5HP2/+Sz9v/ks/c/5LP3P+T0Nz/k9Dd/5PQ3f+T0N3/lNHd/5TR3v+V0d7/ldHe/5XS + 3v+W0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+a1eL/mtXi/5rV + 4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y5f+d2OX/ntjm/57Y5v+e2eb/n9nm/5/Z + 5/+f2ef/oNnn/6Da5/+g2uj/odro/6Ha6P+h2+j/odvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td + 6/+l3ev/pd7s/6be7P+m3u3/p9/t/6ff7v+o3+7/qODu/6ng7v+p4e//quHv/6rh8P+q4fD/q+Lw/6zi + 8f+s4vH/rOPy/63j8v+u5PP/ruTz/6PZ6/9Jgab/FC0//wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/Dhsk/yNgg/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8cWn7/FzxU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/zJdff8zZ4z/MWaJ/zBnh/8waIn/MmmL/zVrj/80a5D/MGaP/yleiv8kWIb/I1aF/yVY + h/8qXYr/LmOM/zpwlv99tMr/u/T9/733//+99/7/vff+/7z3/v+89/7/vPf+/7v3/v+79v7/u/b+/7r2 + /v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b1/v+29P7/tfT+/7X0 + /v+19P7/tPT+/7T0/v+09P3/s/T9/7Pz/f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/7Dy + /f+v8v3/r/L9/67x/P+u8fv/rvD7/63w+f+t7/n/rO/4/6zu9/+s7vf/q+31/6vt9f+q7PT/quzz/6nr + 8v+p6vH/qerx/6jq8P+o6e//p+ju/6fo7v+m5+3/pufs/6Xm6/+l5ur/peXq/6Tk6P+k5Oj/o+Tn/6Pj + 5v+j4+b/ouLk/6Lh5P+h4eP/oeHj/6Dg4f+g3+H/oN/g/5/e3/+f3t7/nt3d/57d3f+e3d3/ndzc/53c + 3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Z2Nn/mNfZ/5jX2P+X1tj/l9bY/5fW + 1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ + 0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O0f+OzdH/js3Q/43M0P+NzND/jczQ/4zLz/+My8//jMvP/4vL + z/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI + 0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF + 0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4fH0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI + 1P+JydT/icnV/4rJ1f+KydX/isrV/4vK1v+Lytb/i8rW/4zL1v+My9f/jMvX/43L1/+NzNf/jczY/47M + 2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5HP2/+Sz9z/ks/c/5LQ + 3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5XR3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT + 4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5nV4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX + 5P+d1+X/ndjl/53Y5f+e2OX/ntjm/57Z5v+f2eb/n9nm/5/Z5/+g2ef/oNrn/6Da6P+g2uj/odro/6Hb + 6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd6/+l3ez/pd7s/6be7f+n3+3/p9/t/6ff + 7v+o4O7/qeDu/6ng7/+p4e//quHw/6rh8P+r4vD/q+Lx/6zi8f+s4/L/rePy/63j8v+o3u7/Y5m5/y9j + if8DBgn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8hRVv/Glp+/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZ + ff8eW4D/Bg0S/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/FSc2/zJnjf8wZov/L2WJ/zFp + iv8yaov/NGyO/zNqj/8wZ47/K2GK/yVZhv8iVoP/I1aD/ypdh/8vZIv/MmiN/zVskP93sMf/ufL7/733 + /v+99/7/vff+/7z3/v+89/7/u/f+/7v2/v+79v7/uvb+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1 + /v+39f7/t/X+/7f1/v+39f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT+/7T0/f+z9P3/s/P9/7Pz + /f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y/f+v8v3/r/L9/67x+/+u8Pv/rfD6/63w + +f+s7/j/rO73/6zu9/+r7fb/q+31/6rs9P+q7PP/quvz/6nq8f+p6vH/qOrw/6jp8P+o6e//p+ju/6bn + 7f+m5+z/pufs/6Xm6v+l5er/pOXp/6Tk6P+j5Of/o+Pm/6Pj5v+i4uX/ouHk/6Hh4/+h4eP/oeDi/6Dg + 4f+g3+D/n97f/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/nNvb/5va2/+b2tr/mtna/5rZ + 2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX2P+X1tj/l9bX/5fW1/+W1df/ltXW/5XU1v+V1Nb/ldTW/5TT + 1f+U09X/k9LV/5PS1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/5DP0v+PztH/j87R/47N + 0f+OzdH/jczQ/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isrP/4rJ + z/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH + 0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG + 0v+Gx9L/hsfS/4fH0/+Hx9P/iMjT/4jI0/+IyNP/icjU/4nJ1P+JydT/icnV/4rJ1f+KytX/isrV/4vK + 1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jczY/47M2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO + 2v+Qztr/kM7a/5HO2/+Rz9v/kc/b/5LP2/+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR3f+U0d3/lNHe/5XR + 3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5jU4f+Z1eL/mdXi/5rV + 4v+a1eL/mtbj/5vW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5f+d1+X/ndjl/57Y5f+e2Ob/ntjm/5/Z + 5v+f2eb/n9nn/5/Z5/+g2uf/oNro/6Da6P+h2uj/odro/6Hb6f+i2+n/otvp/6Lb6f+j3Or/o9zq/6Pc + 6v+k3ev/pd3r/6Xd7P+l3uz/pt7s/6ff7f+n3+3/p9/u/6jf7v+p4O7/qeDv/6nh7/+q4e//quHw/6vi + 8P+r4vH/rOLx/6zi8f+t4/L/rePy/4e90/8/dZz/Hj5U/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/CRAT/yVihv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x1bf/8UMUP/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/KVNz/y1kjP8vZ43/MmqN/zNsjf80bY7/NGyR/zJpkP8vZY7/Kl+J/yVY + hP8lWIT/KV2G/y5jiv8zaI3/NWuP/zRskf97tMv/u/X8/733/v+99/7/vPf+/7z3/v+79/7/u/b+/7v2 + /v+79v7/uvb+/7r2/v+59v7/ufb+/7n2/v+49f7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvX+/7X0 + /v+19P7/tfT+/7X0/v+09P7/tPT9/7P0/f+z9P3/s/P9/7Lz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy + /f+w8v3/r/L9/6/y/f+v8v3/rvH8/67w+/+t8Pr/rfD5/63v+f+s7/j/rO73/6vt9v+r7fX/q+31/6rs + 8/+q6/P/qevy/6nq8f+o6vD/qOnw/6jp7/+n6O7/puft/6bn7P+m5+z/pebr/6Xm6v+k5en/pOTo/6Tk + 6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh4/+h4OL/oODh/6Df4f+f3t//n97f/5/e3v+e3d3/nt3d/53c + 3P+d3Nz/ndzc/5zb3P+c29v/m9rb/5va2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5jX2f+Y19j/mNfY/5fW + 2P+X1tf/l9bX/5bV1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS1P+S0dT/ktHT/5HQ + 0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O0v+PztH/js3R/47N0f+OzdD/jczQ/43M0P+My8//jMvP/4zL + z/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kys//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jI + z/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF + 0P+ExdD/hMXQ/4TF0P+ExdD/hcbR/4XG0f+FxtH/hsbR/4bH0v+Gx9L/h8fS/4fH0/+IyNP/iMjT/4jI + 0/+IyNT/icnU/4nJ1P+JydX/isnV/4rK1f+KytX/i8rW/4vK1v+Lytb/jMvX/4zL1/+My9f/jcvX/43M + 2P+NzNj/jszY/47M2P+Ozdn/j83Z/4/N2f+Pzdn/kM7a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP + 3P+Sz9z/k9Dc/5PQ3f+T0N3/k9Dd/5TR3f+U0d7/ldHe/5XR3v+V0t//ltLf/5bS3/+W0t//l9Pg/5fT + 4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mtXi/5rV4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX + 5P+c1+T/nNfl/53X5f+d2OX/ndjl/57Y5v+e2Ob/ntnm/5/Z5v+f2ef/n9nn/6DZ5/+g2uf/oNro/6Ha + 6P+h2uj/odvo/6Lb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+k3ev/pd3r/6Xe7P+m3uz/pt7t/6ff + 7f+n3+7/qN/u/6jg7v+p4O7/qeHv/6rh7/+q4fD/quHw/6vi8f+s4vH/rOLx/6zj8v+b0eT/Uoip/0B3 + nP8HDhL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8dOkr/IV+C/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/x5Xev8DBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8MGSP/L2aQ/zFq + k/81bpX/NW6T/zZuk/82bpP/Nm2U/zNqkv8vZI7/K16J/ylchv8qXYb/LWKI/zFnjP80apD/NGyT/zZu + lf+KxNj/vff+/733/v+89/7/vPf+/7z3/v+79/7/u/b+/7v2/v+69v7/uvb+/7n2/v+59v7/ufb+/7n2 + /v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P7/s/T9/7P0 + /f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+w8v3/r/L9/6/y/f+u8fz/rvH7/67w + +/+t8Pn/re/5/6zv+P+s7vf/q+32/6vt9f+r7fX/quz0/6rr8/+p6/L/qerx/6nq8f+o6vD/qOnv/6fo + 7v+n6O7/puft/6bn7P+l5uv/pebq/6Xl6v+k5Oj/pOTo/6Pk5/+j4+b/ouLl/6Li5P+i4eT/oeHj/6Hh + 4/+g4OH/oN/h/6Df4P+f3t//n97e/57d3f+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb2/+b2tv/m9rb/5va + 2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW2P+X1tf/ltXX/5bV1/+W1db/ldTW/5XU + 1v+U09X/lNPV/5TT1f+T0tT/k9LU/5LR1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O + 0f+PztH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4zLz/+Lys//i8rP/4vKz/+Lys//isrP/4rK + z/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyND/iMjQ/4fH0P+Hx9D/h8fQ/4fH + 0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG + 0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ1f+KydX/isnV/4rK + 1f+Lytb/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M2P+OzNj/jszY/47N2f+Ozdn/j83Z/4/N + 2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Sz9v/ks/c/5LP3P+S0Nz/k9Dd/5PQ3f+T0N3/lNHd/5TR + 3f+V0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV + 4v+Z1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+T/ndfl/53Y5f+d2OX/ntjl/57Y + 5v+e2eb/n9nm/5/Z5v+f2ef/oNnn/6Da5/+g2uj/oNro/6Ha6P+h2+j/odvp/6Lb6f+i2+n/o9zq/6Pc + 6v+j3Or/pN3r/6Td6/+l3ev/pd3s/6be7P+m3u3/p9/t/6ff7f+o3+7/qODu/6ng7v+p4O//qeHv/6rh + 8P+q4fD/q+Lw/6vi8f+s4vH/odjp/2GWtP9Mg6T/LE5k/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yxffP8cW37/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HVp//xUwQ/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8iSGX/NW2X/zdwmP84cZf/OXGW/zpxlv87cZf/OW+X/zNp + kv8wZI3/LF+I/ypdhf8sYYj/L2WM/zJokf81bpT/OHGX/0V8oP+Nxtj/vff+/733/v+89/7/vPf+/7v3 + /v+79v7/u/b+/7r2/v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/t/X+/7f1/v+39f7/t/X+/7b1 + /v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/v+09P3/s/T9/7Pz/f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz + /f+x8/3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rvD7/63w+v+t8Pn/rO/4/6zu9/+s7vf/q+32/6vt + 9f+q7PT/quzz/6rr8/+p6vH/qerx/6jq8P+o6fD/p+ju/6fo7v+m5+3/pufs/6bn7P+l5ur/peXq/6Tl + 6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLl/6Lh5P+h4eP/oeHj/6Hg4v+g3+H/oN/g/5/e3/+f3t//nt3d/57d + 3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX + 2P+X1tj/l9bY/5fW1/+X1tf/ltXX/5bV1v+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS1f+T0tT/ktHU/5LR + 1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O0f+OzdH/js3R/43M0P+NzND/jczQ/4zL + z/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJz/+Jyc//icnP/4nI + z/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG + 0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4bH0v+Hx9P/h8fT/4jI + 0/+IyNP/iMjU/4nI1P+JydT/icnU/4rJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL1v+My9f/jMvX/43L + 1/+NzNf/jczY/43M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5DO2v+Rztv/kc/b/5HP + 2/+Sz9v/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5TR3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT + 3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Y1OH/mdXi/5nV4v+a1eL/mtXi/5rW4/+b1uP/m9bj/5vW + 4/+c1+T/nNfk/5zX5P+c1+X/ndfl/53Y5f+e2OX/ntjm/57Y5v+f2eb/n9nm/5/Z5/+f2ef/oNrn/6Da + 6P+g2uj/odro/6Hb6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+j3Or/pN3r/6Xd6/+l3ez/pd7s/6be + 7P+n3+3/p9/t/6ff7v+o3+7/qeDu/6ng7/+p4e//quHv/6rh8P+r4vD/q+Lx/6Xb6/9xp7//UIel/02E + pP8JEBT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8bMDr/JGKE/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/IVl7/wcNEv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcN + Ev81apH/OnKb/zpzmf87cpf/PHOX/z1zmf87cZj/OW2W/zRnkP8tYIn/K12G/ytehv8uY43/MWiQ/zZt + lf86cpj/PHWY/0d+oP9/uMv/t/H5/7z3/v+89/7/u/f+/7v2/v+79v7/u/b+/7r2/v+69v7/ufb+/7n2 + /v+59v7/uPX+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b1/v+19P7/tfT+/7X0/v+19P7/tPT+/7T0 + /f+z9P3/s/T9/7Pz/f+y8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y/f+v8v3/r/L9/67x + /P+u8Pv/rfD6/63w+f+t7/n/rO73/6zu9/+r7fb/q+31/6rs9P+q7PP/quvz/6nr8v+p6vH/qOrw/6jp + 8P+o6e//p+ju/6bn7f+m5+z/pufs/6Xm6/+l5er/pOXp/6Tk6P+k5Oj/o+Pm/6Pj5v+i4uX/ouLk/6Lh + 5P+h4eP/oeDi/6Dg4f+g3+H/n97f/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/53c3P+c29v/nNvb/5va + 2/+b2tv/mtna/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX2P+X1tj/l9bX/5fW1/+W1df/ltXX/5XU + 1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/5DP + 0v+PztL/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rK + z/+Kys//isrP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjP/4jI0P+HyND/h8fQ/4fH + 0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG + 0f+FxtH/hcbR/4bG0v+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI0/+IyNP/iMjU/4nJ1P+JydT/icnV/4rJ + 1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jMvX/43L1/+NzNj/jczY/47M2P+OzNj/js3Z/4/N + 2f+Pzdn/j83Z/5DO2v+Qztr/kM7a/5HO2/+Rz9v/kc/b/5LP2/+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5PQ + 3f+U0d3/lNHe/5XR3v+V0d7/ldLf/5bS3/+W0t//ltLf/5fT4P+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU + 4f+Z1OH/mdXi/5rV4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5f+d1+X/ndjl/57Y + 5f+e2Ob/ntjm/57Z5v+f2eb/n9nn/5/Z5/+g2ef/oNrn/6Da6P+h2uj/odro/6Hb6P+i2+n/otvp/6Lb + 6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd7P+l3uz/pt7s/6be7f+n3+3/p9/u/6jf7v+o4O7/qeDu/6nh + 7/+q4e//quHw/6rh8P+m3e3/d6/E/06Hov9QiKP/MVRm/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/ytfe/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX7/Gj5T/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xoyRP89dZz/PnWb/z10mP89dJb/PnSW/z1y + mP87b5b/NmmS/y9hiv8qXIb/K16I/y1ijP8xZ5D/NmyU/zlwlv88c5f/PnWW/0F4l/90rMD/r+nz/7z3 + /v+89/7/u/f+/7v2/v+79v7/uvb+/7r2/v+59v7/ufb+/7n2/v+59v7/uPX+/7j1/v+39f7/t/X+/7f1 + /v+29f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT+/7P0/f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz + /f+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x+/+u8Pv/rfD5/63v+f+s7/j/rO73/6vt + 9v+r7fX/q+31/6rs9P+q6/P/qevy/6nq8f+p6vH/qOnw/6jp7/+n6O7/p+ju/6bn7f+m5+z/pebr/6Xm + 6v+l5er/pOTo/6Tk6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh4/+h4OL/oODh/6Df4f+g3+D/n97f/5/e + 3v+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/m9rb/5va2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5nY + 2f+Y19j/mNfY/5fW2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT1f+U09X/k9LU/5PS + 1P+S0dT/ktHU/5HQ0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/j87R/47N0f+OzdD/jczQ/43M + 0P+My8//jMvP/4zLz/+My8//i8rP/4vKz/+Lys//i8rP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJ + z/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+Hx9D/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG + 0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG0v+Gx9L/h8fS/4fH + 0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydX/isnV/4rJ1f+KytX/i8rW/4vK1v+Lytb/jMvW/4zL + 1/+My9f/jcvX/43M1/+NzNj/jszY/47M2P+Ozdn/j83Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO + 2/+Rz9v/ks/b/5LP3P+Sz9z/ktDc/5PQ3f+T0N3/k9Dd/5TR3f+U0d7/ldHe/5XR3v+V0t7/ltLf/5bS + 3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mdXi/5rV4v+a1eP/mtbj/5vW + 4/+b1uP/m9bk/5zX5P+c1+T/nNfk/53X5f+d2OX/ndjl/57Y5f+e2Ob/ntnm/5/Z5v+f2eb/n9nn/6DZ + 5/+g2uf/oNro/6Ha6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+k3ev/pd3r/6Xd + 7P+m3uz/pt7t/6ff7f+n3+3/qN/u/6jg7v+p4O7/qeDv/6rh7/+q4fD/qd/v/364y/9Oh6H/TYag/06H + of8KERT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8WKzf/Il+B/xtafv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8jX4L/ChQa/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/y5YdP9Ad5v/P3aZ/z91l/8+c5T/PnKU/zxwlP83aZD/MGKL/ypeiP8pXYn/LWGM/zJm + kP82a5L/OW+U/zxylf89c5T/PnST/0J4lP9on7X/quTv/7z3/v+79/7/u/b+/7v2/v+69v7/uvb+/7r2 + /v+59v7/ufb+/7n2/v+49f7/uPX+/7f1/v+39f7/t/X+/7f1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0 + /v+09P7/tPT9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y + /f+u8fz/rvH7/67w+/+t8Pr/re/5/6zv+P+s7vf/rO73/6vt9v+r7fX/quz0/6rs8/+q6/P/qerx/6nq + 8f+o6vD/qOnw/6fo7v+n6O7/puft/6bn7P+l5uv/pebq/6Xl6v+k5en/pOTo/6Pk5/+j4+b/o+Pm/6Li + 5f+i4eT/oeHj/6Hh4/+h4OL/oN/h/6Df4P+f3t//n97f/57d3f+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb + 2/+c29v/m9rb/5va2v+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW2P+X1tf/l9bX/5bV + 1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT1f+T0tX/k9LU/5LR1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP + 0v+Qz9L/j87S/4/O0f+PztH/js3R/47N0P+NzND/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vK + z/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI + 0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF + 0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Gx9L/h8fT/4fH0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ + 1P+KydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M2P+NzNj/jszY/47N + 2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Rz9v/ks/c/5LP3P+S0Nz/k9Dc/5PQ + 3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU + 4f+Y1OH/mNTh/5nV4v+Z1eL/mtXi/5rV4v+a1uP/m9bj/5vW4/+b1uP/nNfk/5zX5P+c1+T/nNfl/53Y + 5f+d2OX/ntjl/57Y5v+e2eb/n9nm/5/Z5v+f2ef/n9nn/6Da5/+g2uj/oNro/6Ha6P+h2+j/odvp/6Lb + 6f+i2+n/o9zq/6Pc6v+j3Or/o9zq/6Td6/+l3ev/pd3s/6Xe7P+m3uz/p9/t/6ff7f+n3+7/qN/u/6ng + 7v+p4O//qeHv/6rh7/+Kw9f/Uo2o/0qDn/9NhZ//LExa/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yFOaP8fXYD/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8dSWP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Bw4S/zdsjv8/dZj/PnSX/z1z + lf89cpT/PHGT/zhskP8wZIz/KV6H/yZchv8rX4j/MWSM/zZpkf86bZP/PHGT/z5yk/8/cpL/QXOS/0J1 + k/9il7D/pd7p/7r2/v+79v7/u/b+/7v2/v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/uPX+/7f1 + /v+39f7/t/X+/7b1/v+29f7/tfT+/7X0/v+19P7/tfT+/7T0/v+09P3/s/T9/7P0/f+z8/3/svP9/7Lz + /f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+v8v3/r/L9/6/y/f+u8fz/rvD7/63w+v+t8Pn/re/5/6zu + 9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr8/+p6/L/qerx/6jq8P+o6fD/qOnv/6fo7v+m5+3/pufs/6bn + 7P+l5uv/peXq/6Tl6f+k5Oj/pOTo/6Pj5v+j4+b/ouLl/6Li5P+h4eP/oeHj/6Hg4v+g4OH/oN/g/5/e + 3/+f3t//n97e/57d3f+e3d3/ndzc/53c3P+d3Nz/nNvb/5zb2/+b2tv/m9rb/5rZ2v+a2dr/mtna/5nY + 2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV1/+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS + 1f+T0tT/k9LU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+Qz9L/j87S/4/O0f+OzdH/js3R/47N + 0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rKz/+Kyc//icnP/4nJ + z/+Jyc//icnP/4nIz/+IyM//iMjP/4jIz/+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsfQ/4bG + 0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4XG0f+GxtL/hsfS/4bH + 0v+Hx9L/h8fT/4jI0/+IyNP/iMjT/4nI1P+JydT/icnU/4nJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL + 1v+My9f/jMvX/4zL1/+NzNf/jczY/43M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/N2f+Qztr/kM7a/5DO + 2v+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5TR3v+V0d7/ldLe/5XS + 3/+W0t//ltLf/5bS3/+X0+D/l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+a1eL/mtXi/5rV + 4/+b1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y5f+e2OX/ntjm/57Y5v+e2eb/n9nm/5/Z + 5/+f2ef/oNnn/6Da6P+g2uj/odro/6Ha6P+h2+n/otvp/6Lb6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td + 6/+l3ez/pd7s/6be7P+m3u3/p9/t/6ff7v+o3+7/qODu/6ng7/+p4e//mdHi/1eSr/9JhKH/S4Sg/0h9 + l/8FCAr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NGyT/JWGG/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x5cf/8PJjP/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/ESIu/zdvk/85cJP/OnCT/zpxk/86b5P/OG2R/zJnjv8rX4j/J1yG/yhc + g/8vYYj/NmeO/ztrkv89b5P/PnCT/0Bxkv9BcZP/QnKU/0FylP9Lfp3/mdPh/7v2/v+79v7/u/b+/7r2 + /v+69v7/ufb+/7n2/v+59v7/ufb+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b1/v+29P7/tfT+/7X0 + /v+19P7/tPT+/7T0/f+z9P3/s/T9/7Pz/f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/7Dy + /f+v8v3/r/L9/67x/P+u8fv/rfD6/63w+f+t7/n/rO/4/6zu9/+r7fb/q+31/6vt9f+q7PT/quvz/6nr + 8v+p6vH/qerx/6jp8P+o6e//p+ju/6fo7v+m5+z/pufs/6Xm6/+l5ur/pOXp/6Tk6P+k5Oj/o+Tn/6Pj + 5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg4f+g3+H/oN/g/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/53c + 3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Z2Nn/mNfY/5jX2P+X1tj/l9bY/5fW + 1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS1P+T0tT/ktHU/5LR1P+R0NP/kdDT/5HQ + 0/+R0NP/kM/S/5DP0v+PztL/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zLz/+My8//jMvP/4vK + z/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJz/+Jyc//icnP/4jIz/+IyM//iMjP/4jI + 0P+IyND/h8fQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF + 0P+ExdD/hMXQ/4XG0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4fH0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI + 1P+JydT/icnV/4rJ1f+KydX/isrV/4vK1v+Lytb/i8rW/4zL1v+My9f/jMvX/43L1/+NzNf/jczY/47M + 2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5LP2/+Sz9z/ks/c/5LQ + 3P+T0N3/k9Dd/5PQ3f+U0d3/lNHe/5XR3v+V0d7/ldLe/5bS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT + 4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5nV4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX + 5f+d1+X/ndjl/53Y5f+e2Ob/ntjm/57Z5v+f2eb/n9nm/5/Z5/+g2ef/oNrn/6Da6P+h2uj/odro/6Hb + 6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+k3ev/pN3r/6Xd6/+l3ez/pt7s/6be7f+n3+3/p9/t/6jf + 7v+o4O7/qeDu/5vT5f9Xk7L/SIKi/0mCoP9LhKH/IjtH/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yRUc/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/yFZe/8DBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/GTVI/zNr + j/81bZH/N26S/zdtkv82a5H/M2eP/y5hjP8pXIb/KVuE/y1ehf80ZIv/OmmP/zxrkf8+bpP/Pm6S/z5u + kv8/bpL/O2yQ/zdqjv89cJX/kMjZ/7jz/P+79v7/uvb+/7r2/v+69v7/ufb+/7n2/v+59v7/uPX+/7j1 + /v+39f7/t/X+/7f1/v+39f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT+/7T0/f+z9P3/s/P9/7Pz + /f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x+/+u8Pv/rfD6/63v + +f+s7/j/rO73/6zu9/+r7fX/q+31/6rs9P+q7PP/qevy/6nq8f+p6vH/qOrw/6jp8P+n6O7/p+ju/6bn + 7f+m5+z/pebr/6Xm6v+l5er/pOXp/6Tk6P+j5Of/o+Pm/6Pj5v+i4uT/ouHk/6Hh4/+h4eP/oODh/6Df + 4f+g3+D/n97f/5/e3/+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/nNvb/5va2/+b2tr/mtna/5rZ + 2v+Z2Nn/mdjZ/5nY2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5fW1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT + 1f+U09X/k9LV/5PS1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/j87R/47N + 0f+OzdD/jczQ/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isnP/4rJ + z/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH + 0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG + 0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydT/isnV/4rJ1f+KytX/isrV/4vK + 1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jszY/47M2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO + 2v+Qztr/kc7b/5HO2/+Rz9v/kc/b/5LP3P+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR3f+U0d3/ldHe/5XR + 3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mdXi/5rV + 4v+a1eP/mtbj/5vW4/+b1uP/m9bj/5zX5P+c1+T/nNfk/5zX5f+d2OX/ndjl/57Y5f+e2Ob/ntnm/5/Z + 5v+f2eb/n9nn/6DZ5/+g2uf/oNro/6Da6P+h2uj/odvo/6Hb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Pc + 6v+k3ev/pd3r/6Xd7P+l3uz/pt7t/6ff7f+n3+3/p9/u/6jg7v+Wz9//UIuq/0N+oP9Gf6H/SYGg/z1r + gv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8WKzn/H12B/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/G1p+/xY9U/8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HEFZ/y9qkP8ya5D/NWuS/zZpkv8yZY//Ll+M/ypZ + iP8oWIT/K1qE/zFfiP82ZYz/O2mQ/ztokP86Z5D/OmeQ/zhnjv80ZYz/MWSL/y5hiP8wYon/a6C7/7Ls + 9v+79v7/uvb+/7r2/v+59v7/ufb+/7n2/v+49f7/uPX+/7j1/v+39f7/t/X+/7f1/v+29f7/tvT+/7X0 + /v+19P7/tfT+/7T0/v+09P7/tPT9/7P0/f+z9P3/s/P9/7Lz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy + /f+w8v3/r/L9/6/y/f+v8v3/rvH7/67w+/+t8Pr/rfD5/63v+f+s7vf/rO73/6vt9v+r7fX/quz0/6rs + 8/+q6/P/qevy/6nq8f+o6vD/qOnw/6jp7/+n6O7/puft/6bn7P+m5+z/pebq/6Xl6v+k5en/pOTo/6Tk + 6P+j4+b/o+Pm/6Li5f+i4uT/oeHj/6Hh4/+h4OL/oODh/6Df4P+f3t//n97f/5/e3v+e3d3/nt3d/53c + 3P+d3Nz/ndzc/5zb2/+c29v/m9rb/5va2/+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX2f+Y19j/mNfY/5fW + 2P+X1tf/l9bX/5bV1/+W1db/ldTW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS1P+S0dT/ktHT/5HQ + 0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O0f+PztH/js3R/47N0f+OzdD/jczQ/43M0P+My8//jMvP/4zL + z/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kys//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jI + z/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF + 0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+FxtH/hsbS/4bH0v+Gx9L/h8fS/4fH0/+IyNP/iMjT/4jI + 0/+JyNT/icnU/4nJ1P+JydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL1/+My9f/jczX/43M + 2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Qztr/kc7b/5HP2/+Rz9v/ks/b/5LP + 3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT + 4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mtXi/5rV4v+a1eP/m9bj/5vW4/+b1uP/m9bk/5zX + 5P+c1+T/nNfl/53X5f+d2OX/ntjl/57Y5v+e2Ob/ntnm/5/Z5v+f2ef/n9nn/6DZ5/+g2uj/oNro/6Ha + 6P+h2uj/odvp/6Lb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+k3ev/pd3s/6Xe7P+m3uz/pt7t/6ff + 7f+n3+7/i8XY/0eEov8+e5n/Q3+d/0aAn/9JgJ//Dhgd/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/yVYef8bWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX7/IF+C/w4hLP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8DBgn/JFR1/zFpkP80apH/NWmR/zNmj/8uYIv/KlqH/yVTg/8nU4P/LFmF/zJfif81Y4z/NmKN/zVh + jP8yX4r/MF+I/y5eh/8tX4f/K16G/ylchf8pWoX/Vomq/67o8/+69v7/uvb+/7n2/v+59v7/ufb+/7j1 + /v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0/v+09P3/s/T9/7P0 + /f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+w8v3/r/L9/6/y/f+u8fz/rvH7/63w + +v+t8Pn/re/5/6zv+P+s7vf/q+32/6vt9f+r7fX/quzz/6rr8/+p6/L/qerx/6nq8f+o6fD/qOnv/6fo + 7v+n6O7/pufs/6bn7P+l5uv/pebq/6Tl6f+k5Oj/pOTo/6Pk5/+j4+b/ouLl/6Li5P+i4eT/oeHj/6Hg + 4v+g4OH/oN/h/6Df4P+f3t//n97e/57d3f+e3d3/ndzc/53c3P+d3Nz/nNvc/5zb2/+b2tv/m9rb/5va + 2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX2P+Y19j/l9bY/5fW2P+X1tf/ltXX/5bV1/+W1db/ldTW/5XU + 1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O + 0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Lys//isrP/4rK + z/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+IyM//iMjP/4jIz/+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH + 0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxtH/hcbR/4XG + 0f+GxtH/hsfS/4bH0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ1f+KydX/isnV/4rK + 1f+Lytb/i8rW/4vK1v+My9f/jMvX/4zL1/+Ny9f/jczY/43M2P+OzNj/jszY/47N2f+Pzdn/j83Z/4/N + 2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Sz9v/ks/c/5LP3P+T0Nz/k9Dd/5PQ3f+T0N3/lNHd/5TR + 3v+V0d7/ldHe/5XS3v+W0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV + 4v+a1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y5f+d2OX/ntjm/57Y + 5v+e2eb/n9nm/5/Z5/+f2ef/oNnn/6Da5/+g2uj/odro/6Ha6P+h2+j/odvp/6Lb6f+i2+n/o9zq/6Pc + 6v+j3Or/pN3r/6Td6/+l3ev/pd7s/6be7P+m3u3/pd7r/4G6z/87eJj/OXWV/z98mP9EgJ3/R4Ce/ylI + Wf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8XMUD/IV6C/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/JF1+/wQH + Cf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DBgn/KVV2/zRpkf81aJD/M2aO/zBh + iv8qWYX/JVGB/yJOgP8lT4H/K1aG/y5Zh/8vWoj/L1uI/y1ahf8qWoT/KluE/ypdhP8qXob/LGCH/y1g + iP8uX4r/PnOa/5fS4v+69v7/uvb+/7n2/v+59v7/ufb+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b1 + /v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/v+09P3/s/T9/7Pz/f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz + /f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rvD7/63w+v+t7/n/rO/4/6zu9/+s7vf/q+31/6vt + 9f+q7PT/quzz/6nr8v+p6vH/qerx/6jq8P+o6e//p+ju/6fo7v+m5+3/pufs/6Xm6/+l5ur/peXq/6Tl + 6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLk/6Lh5P+h4eP/oeHj/6Dg4f+g3+H/oN/g/5/e3/+f3t7/nt3d/57d + 3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Z2Nn/mNfZ/5jX + 2P+X1tj/l9bY/5fW1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS1f+T0tT/ktHU/5LR + 1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O0f+OzdH/js3Q/43M0P+NzND/jczQ/4zL + z/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJz/+Jyc//icnP/4nI + z/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG + 0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4fH0v+Hx9P/h8fT/4jI + 0/+IyNP/iMjU/4nI1P+JydT/icnV/4rJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL1v+My9f/jMvX/43L + 1/+NzNf/jczY/47M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5HP + 2/+Sz9z/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5XR3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT + 3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5nV4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW + 5P+c1+T/nNfk/5zX5P+d1+X/ndjl/53Y5f+e2OX/ntjm/57Z5v+f2eb/n9nm/5/Z5/+g2ef/oNrn/6Da + 6P+g2uj/odro/6Hb6P+h2+n/otvp/6Lb6f+j3Or/o9zq/6Pc6v+j3Or/pN3r/6Xd6/+l3ez/pd7s/6Xe + 7f+EvNP/O3WY/zVukv86dJb/QHua/0R9m/8/boj/BAcJ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AwcI/yVdf/8cW3//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8cW3//IE5m/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8DBgn/K1V2/zRoj/8yZIz/L1+I/ypYgv8lUH7/IEp7/yBJfP8jTH//J1GB/ypT + g/8rVYT/KlaE/ylYgv8pW4P/Kl+E/y5ih/8wZor/MGWL/zFmjv8xZ5D/PnSa/3+4zv+28vv/ufb+/7n2 + /v+59v7/uPX+/7j1/v+49f7/t/X+/7f1/v+39f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT+/7T0 + /f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y/f+v8v3/r/L9/67x + +/+u8Pv/rfD6/63w+f+s7/j/rO73/6zu9/+r7fb/q+31/6rs9P+q7PP/quvz/6nr8v+p6vH/qOrw/6jp + 8P+o6e//p+ju/6bn7f+m5+z/pufs/6Xm6v+l5er/pOXp/6Tk6P+j5Of/o+Pm/6Pj5v+i4uX/ouLk/6Hh + 4/+h4eP/oeDi/6Dg4f+g3+D/n97f/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/nNvb/5va + 2/+b2tr/mtna/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX2P+X1tj/l9bX/5fW1/+W1df/ltXW/5XU + 1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/5DP + 0v+PztH/j87R/47N0f+OzdH/jczQ/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rK + z/+Kys//isrP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+HyND/h8fQ/4fH + 0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG + 0f+FxtH/hsbR/4bG0v+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI0/+IyNP/icjU/4nJ1P+JydT/icnV/4rJ + 1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jczY/47M2P+Ozdn/js3Z/4/N + 2f+Pzdn/j87a/5DO2v+Qztr/kM7a/5HO2/+Rz9v/kc/b/5LP2/+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR + 3f+U0d3/lNHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5jU + 4f+Z1eL/mdXi/5rV4v+a1eL/mtXj/5vW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5f+d1+X/ndjl/57Y + 5f+e2Ob/ntjm/5/Z5v+f2eb/n9nn/5/Z5/+g2ef/oNro/6Da6P+h2uj/odro/6Hb6f+i2+n/otvp/6Lb + 6f+j3Or/o9zq/6Pc6v+k3ev/pd3r/6Xd7P+l3uz/hLvR/0B0mf8vZYz/Nm2S/zt0lf8/eJj/QnqY/w0W + HP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8cPVH/Il+C/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8jYIT/HT5Q/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DBgj/KVNz/zFk + i/8vXob/KliB/yNOe/8cRnX/G0R2/x1GeP8hSnv/JE9+/ydSgP8pVYH/LFqF/yxehf8uY4f/MmiK/zNq + jP8zao3/M2mO/zNpkf80apL/OG+W/2CYtv+r6PP/ufb+/7n2/v+49f7/uPX+/7j1/v+39f7/t/X+/7f1 + /v+29f7/tvX+/7X0/v+19P7/tfT+/7X0/v+09P7/tPT9/7P0/f+z9P3/s/P9/7Lz/f+y8/3/svP9/7Hz + /f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y/f+v8v3/rvH8/67x+/+t8Pr/rfD5/63v+f+s7/j/rO73/6vt + 9v+r7fX/q+31/6rs8/+q6/P/qevy/6nq8f+o6vD/qOnw/6jp7/+n6O7/puft/6bn7P+m5+z/pebr/6Xm + 6v+k5en/pOTo/6Tk6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh4/+h4OL/oODh/6Df4f+f3t//n97f/5/e + 3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb3P+c29v/m9rb/5va2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5jX + 2f+Y19j/mNfY/5fW2P+X1tf/l9bX/5bV1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS + 1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O0v+PztH/js3R/47N0f+OzdD/jczQ/43M + 0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kys//isnP/4nJz/+Jyc//icnP/4nJ + z/+Jyc//iMjP/4jIz/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH0P+GxtD/hcbQ/4XG + 0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcbR/4XG0f+FxtH/hsbR/4bH0v+Gx9L/h8fS/4fH + 0/+IyNP/iMjT/4jI0/+IyNT/icnU/4nJ1P+JydX/isnV/4rJ1f+KytX/i8rW/4vK1v+Lytb/jMvX/4zL + 1/+My9f/jcvX/43M2P+NzNj/jszY/47M2P+Ozdn/j83Z/4/N2f+Pzdn/kM7a/5DO2v+Qztr/kc7b/5HO + 2/+Rz9v/ks/b/5LP3P+Sz9z/k9Dc/5PQ3f+T0N3/k9Dd/5TR3f+U0d7/ldHe/5XR3v+V0t//ltLf/5bS + 3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mtXi/5rV4v+a1eP/mtbj/5vW + 4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X5f+d2OX/ndjl/57Y5v+e2Ob/ntnm/5/Z5v+f2ef/n9nn/6DZ + 5/+g2uf/oNro/6Ha6P+h2uj/odvo/6Lb6f+i2+n/otvp/6Pc6v+j3Or/o9zq/6Td6/+k3ev/pd3r/4K5 + z/83apD/JleA/y1fiP80aY7/OnCT/z1zlP8cM0H/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/Dhwl/ylkif8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8mY4X/GCw4/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/HTxV/y5fhf8qWYH/JE97/xtGdP8VPm7/Fj9x/xxG + dv8hTHn/JFJ8/ylYgf8tXYX/LmOH/zFoif80a4z/NWyN/zVtjf80a4//NGqQ/zRqkv80aZL/M2iS/0Z9 + of9+uc7/t/P8/7n2/v+49f7/uPX+/7f1/v+39f7/t/X+/7b1/v+29f7/tvT+/7X0/v+19P7/tfT+/7T0 + /v+09P7/s/T9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+w8v3/r/L9/6/y + /f+u8fz/rvH7/67w+/+t8Pn/re/5/6zv+P+s7vf/q+32/6vt9f+r7fX/quz0/6rs8/+p6/L/qerx/6nq + 8f+o6vD/qOnv/6fo7v+n6O7/puft/6bn7P+l5uv/pebq/6Xl6v+k5Oj/pOTo/6Pk5/+j4+b/o+Pm/6Li + 5P+i4eT/oeHj/6Hh4/+g4OH/oN/h/6Df4P+f3t//n97e/57d3f+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb + 2/+b2tv/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW2P+X1tf/ltXX/5bV + 1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT1f+T0tX/k9LU/5LR1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP + 0v+Qz9L/j87S/4/O0f+PztH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4zLz/+Ly8//i8rP/4vK + z/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI + 0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF + 0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ + 1f+KydX/isnV/4rK1f+Lytb/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M2P+OzNj/jszY/47N + 2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Sz9v/ks/c/5LP3P+S0Nz/k9Dc/5PQ + 3f+T0N3/lNHd/5TR3f+V0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU + 4f+Y1OH/mdTh/5nV4v+Z1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+T/ndfl/53Y + 5f+d2OX/ntjl/57Y5v+e2eb/n9nm/5/Z5v+f2ef/oNnn/6Da5/+g2uj/oNro/6Ha6P+h2+j/odvp/6Lb + 6f+i2+n/o9zq/6Pc6v+j3Or/pN3r/6Td6/9worz/LVqD/x9NeP8jUXz/KVmC/zBhif82aI3/JURa/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8mVHP/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8kYIT/DBUb/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/Fi5C/ytagv8nVH3/IU15/xlDcf8RO2r/FkJw/x1Jdv8kU3z/KlyB/y9ih/8yZ4r/M2qL/zVs + jP82bo7/Nm6O/zVtjf80a4//NmuT/zZrlP81apT/LmSO/y9ljv9dlbP/pODt/7j1/v+49f7/t/X+/7f1 + /v+39f7/t/X+/7b1/v+29P7/tfT+/7X0/v+19P7/tPT+/7T0/v+09P3/s/T9/7Pz/f+z8/3/svP9/7Lz + /f+x8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+v8v3/r/L9/6/y/f+u8fv/rvD7/63w+v+t8Pn/rO/4/6zu + 9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr8/+p6vH/qerx/6jq8P+o6fD/p+ju/6fo7v+m5+3/pufs/6bn + 7P+l5ur/peXq/6Tl6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLl/6Lh5P+h4eP/oeHj/6Hg4v+g3+H/oN/g/5/e + 3/+f3t//n97e/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ2v+a2dr/mtna/5nY + 2f+Z2Nn/mNfZ/5jX2P+X1tj/l9bY/5fW1/+X1tf/ltXX/5bV1v+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS + 1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+Qz9L/j87R/4/O0f+OzdH/js3R/43M + 0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJ + z/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG + 0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4bH + 0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnU/4nJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL + 1v+My9f/jMvX/43L1/+NzNf/jczY/43M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5DO + 2v+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5TR3v+V0d7/ldLe/5XS + 3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Y1OH/mdXi/5nV4v+a1eL/mtXi/5rW + 4/+b1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y5f+e2OX/ntjm/57Y5v+f2eb/n9nm/5/Z + 5/+f2ef/oNrn/6Da6P+g2uj/odro/6Hb6P+h2+n/otvp/6Lb6f+i2+n/o9zq/6Pc6v+Y0eH/XI6u/yhU + f/8eSHT/HUhz/yBMdv8lUnv/K1qC/ylPbv8DBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/GTVI/x9cgf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtafv8kXH3/ChQc/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Dh0p/ylVfP8oVYD/IU56/xxI + dv8XQ3H/HEp1/yNUfP8rXoP/MmiJ/zZsjf84bo7/OG6O/zdtjv82bY7/NWyO/zVtkP83bZT/OW6W/zZq + lP8wZY//KmCK/yleif86cZf/grrR/7Tx+/+49f7/t/X+/7f1/v+39f7/tvX+/7b1/v+19P7/tfT+/7X0 + /v+19P7/tPT+/7T0/f+z9P3/s/T9/7Pz/f+y8/3/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y + /f+v8v3/r/L9/67x/P+u8Pv/rfD6/63w+f+t7/n/rO73/6zu9/+r7fb/q+31/6vt9f+q7PP/quvz/6nr + 8v+p6vH/qOrw/6jp8P+o6e//p+ju/6bn7f+m5+z/pufs/6Xm6/+l5er/pOXp/6Tk6P+k5Oj/o+Tn/6Pj + 5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg4f+g3+H/n97f/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/53c + 3P+c29v/nNvb/5va2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX2P+X1tj/l9bX/5fW + 1/+W1df/ltXX/5XU1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR0/+R0NP/kdDT/5HQ + 0/+Qz9L/kM/S/5DP0v+PztL/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vK + z/+Lys//i8rP/4rKz/+Kys//isrP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjP/4jI + 0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF + 0P+ExdD/hcXR/4XG0f+FxtH/hcbR/4bG0f+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI0/+IyNP/iMjU/4nJ + 1P+JydT/icnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jMvX/43L1/+NzNj/jczY/47M + 2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/5DO2v+Qztr/kM7a/5HO2/+Rz9v/kc/b/5LP2/+Sz9z/ks/c/5PQ + 3P+T0N3/k9Dd/5PQ3f+U0d3/lNHe/5XR3v+V0d7/ldLf/5bS3/+W0t//ltLf/5fT4P+X0+D/l9Pg/5fT + 4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5rV4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX + 5f+d1+X/ndjl/57Y5f+e2Ob/ntjm/57Z5v+f2eb/n9nn/5/Z5/+g2ef/oNrn/6Da6P+h2uj/odro/6Hb + 6P+i2+n/otvp/6Lb6f+j3Or/kMjZ/1aIp/82YYr/LlmD/yZRev8eSHL/G0Vv/yBLdP8lTnP/BgsQ/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woUG/8kYIX/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/x9cgf8lXYD/CRQa/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/BgwR/yJGZP8rWoT/JVN//yFPfP8fT3n/JFR9/yxehP8zaIv/OXCP/zxx + kf87b5H/OW2R/zZrkP82bJD/N22R/zlvlf86b5f/N2uV/zJmkf8sYoz/KV+J/ylfif81apL/X5W1/5/a + 6f+39f7/t/X+/7f1/v+29f7/tvX+/7b0/v+19P7/tfT+/7X0/v+09P7/tPT+/7P0/f+z9P3/s/P9/7Pz + /f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x+/+u8Pv/rfD5/63v + +f+s7/j/rO73/6vt9v+r7fX/q+31/6rs9P+q6/P/qevy/6nq8f+p6vH/qOrw/6jp7/+n6O7/p+ju/6bn + 7f+m5+z/pebr/6Xm6v+l5er/pOTo/6Tk6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh4/+h4OL/oODh/6Df + 4f+g3+D/n97f/5/e3v+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/m9rb/5va2/+b2tr/mtna/5rZ + 2v+Z2Nn/mdjZ/5nY2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT + 1f+U09X/k9LU/5PS1P+S0dT/ktHU/5HQ0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/j87R/47N + 0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+My8//i8rP/4vKz/+Lys//i8rP/4rKz/+Kys//isnP/4rJ + z/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+Hx9D/h8fQ/4fH0P+Hx9D/hsfQ/4bH + 0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG + 0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydX/isnV/4rJ1f+KytX/i8rW/4vK + 1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jszY/47M2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO + 2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP3P+Sz9z/ktDc/5PQ3f+T0N3/k9Dd/5TR3f+U0d7/ldHe/5XR + 3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mdXi/5rV + 4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfk/53X5f+d2OX/ndjl/57Y5f+e2Ob/ntnm/5/Z + 5v+f2eb/n9nn/6DZ5/+g2uf/oNro/6Ha6P+h2uj/odvo/6Hb6f+i2+n/otvp/5HJ2/9XjKf/O2qO/zln + jf82Yor/L1qC/yZQeP8fSHD/GUBm/wYOFf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8DBgn/I1h3/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/x5c + gP8lXX//CRQa/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xgx + Rv8tXYj/KFeE/yVWgf8nWYL/LF+F/zNmiv85bY//PnCT/z5wlP87b5P/OGyS/zZrkf83bJP/OG2V/zds + lf82a5X/MWWQ/yxgi/8oXIj/J1yH/ythiv8wZo//Rn2h/365z/+q5vP/t/X+/7f1/v+29f7/tvT+/7X0 + /v+19P7/tfT+/7T0/v+09P7/tPT9/7P0/f+z8/3/s/P9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sfP9/7Dy + /f+w8v3/r/L9/6/y/f+u8fz/rvH7/67w+/+t8Pr/re/5/6zv+P+s7vf/rO73/6vt9v+r7fX/quz0/6rs + 8/+q6/P/qerx/6nq8f+o6vD/qOnw/6fo7v+n6O7/puft/6bn7P+l5uv/pebq/6Xl6v+k5en/pOTo/6Pk + 5/+j4+b/o+Pm/6Li5f+i4eT/oeHj/6Hh4/+h4OL/oN/h/6Df4P+f3t//n97f/57d3f+e3d3/nt3d/53c + 3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va2v+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW + 2P+X1tf/l9bX/5bV1/+W1db/ldTW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5LR1P+S0dT/ktHT/5HQ + 0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+PztH/js3R/47N0P+NzND/jczQ/43M0P+My8//jMvP/4zL + z/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jI + z/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF + 0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Gx9L/h8fT/4fH0/+IyNP/iMjT/4jI + 1P+JyNT/icnU/4nJ1P+KydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M + 2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Rz9v/ks/b/5LP + 3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT + 4P+X0+D/mNTh/5jU4f+Y1OH/mNTh/5nV4v+Z1eL/mtXi/5rV4v+a1uP/m9bj/5vW4/+b1uP/nNfk/5zX + 5P+c1+T/nNfl/53Y5f+d2OX/ntjl/57Y5v+e2Ob/n9nm/5/Z5v+f2ef/n9nn/6Da5/+g2uj/oNro/6Ha + 6P+h2+j/odvp/6Ha6f+Mxdb/UYek/z9ykv88b5D/O2yP/zlnjP83Yoj/MFqB/ydNc/8GDhb/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xk/Vv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpaff8kXH7/ChQb/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wkSGv8kTHD/KFqF/ydZhP8sXob/MmSJ/zlq + jv88bJL/PW6T/z1vlv85bJP/NmmR/zZpkv80Z5L/NGeS/zNmkv8vYo//KlyK/yVYhf8jWIT/JVuF/ypg + iv8uZY3/MWiQ/02EqP+GwdX/ruv2/7b1/v+29f7/tfT+/7X0/v+19P7/tfT+/7T0/v+09P3/s/T9/7P0 + /f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+v8v3/r/L9/6/y/f+u8fz/rvD7/63w + +v+t8Pn/re/5/6zu9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr8/+p6/L/qerx/6jq8P+o6fD/qOnv/6fo + 7v+m5+3/pufs/6bn7P+l5uv/peXq/6Tl6f+k5Oj/pOTo/6Pj5v+j4+b/ouLl/6Li5P+h4eP/oeHj/6Hg + 4v+g4OH/oN/h/5/e3/+f3t//n97e/57d3f+e3d3/ndzc/53c3P+d3Nz/nNvb/5zb2/+b2tv/m9rb/5rZ + 2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV1/+V1Nb/ldTW/5XU + 1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+Qz9L/j87S/4/O + 0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rK + z/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jIz/+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH + 0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4XG + 0f+GxtL/hsfS/4bH0v+Hx9L/h8fT/4jI0/+IyNP/iMjT/4jI1P+JydT/icnU/4nJ1f+KydX/isrV/4rK + 1f+Lytb/i8rW/4zL1v+My9f/jMvX/4zL1/+NzNf/jczY/43M2P+OzNj/jszY/47N2f+Pzdn/j83Z/4/N + 2f+Qztr/kM7a/5DO2v+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5TR + 3v+V0d7/ldHe/5XS3/+W0t//ltLf/5bS3/+X0+D/l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV + 4v+a1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y5f+e2OX/ntjm/57Y + 5v+e2eb/n9nm/5/Z5/+f2ef/oNnn/6Da6P+g2uj/odro/6Ha6P+W0N7/aaG7/z92lv9Ad5X/QXeV/0B1 + lP8+cZH/PGyO/zpmi/80XID/ChEZ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8PJTP/HFp+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8lXH7/ESMu/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8TKTz/I1J7/ypchP8wYYf/NmaK/zhojf86apD/OGqS/zZokf8zZpD/MWSO/y9i + jf8uYI3/Ll+O/ytdjP8mV4f/IVKB/x5Rf/8fVID/I1iD/yddhv8qYYr/LGKL/y9ijv9Ogaf/jMbc/63s + 9/+29P7/tfT+/7X0/v+19P7/tPT+/7T0/v+z9P3/s/T9/7Pz/f+z8/3/svP9/7Lz/f+x8/3/sfP9/7Hz + /f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rvD7/63w+f+t7/n/rO/4/6zu9/+r7fb/q+31/6vt + 9f+q7PT/quvz/6nr8v+p6vH/qerx/6jp8P+o6e//p+ju/6fo7v+m5+z/pufs/6Xm6/+l5ur/peXq/6Tk + 6P+k5Oj/o+Tn/6Pj5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg4f+g3+H/oN/g/5/e3/+f3t7/nt3d/57d + 3f+d3Nz/ndzc/53c3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Z2Nn/mNfY/5jX + 2P+X1tj/l9bY/5fW1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS1P+T0tT/ktHU/5LR + 1P+R0NP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zL + z/+My8//jMvP/4vKz/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJz/+Jyc//icnP/4nI + z/+IyM//iMjP/4jI0P+IyND/h8fQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG + 0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4fH0v+Hx9P/h8fT/4jI + 0/+IyNP/iMjU/4nI1P+JydT/icnV/4rJ1f+KydX/isrV/4vK1v+Lytb/i8rW/4zL1v+My9f/jMvX/43L + 1/+NzNf/jczY/47M2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5LP + 2/+Sz9z/ks/c/5LQ3P+T0N3/k9Dd/5PQ3f+U0d3/lNHe/5XR3v+V0d7/ldLe/5bS3/+W0t//ltLf/5bT + 3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5nV4v+a1eL/mtXj/5rW4/+b1uP/m9bj/5vW + 5P+c1+T/nNfk/5zX5f+d1+X/ndjl/53Y5f+e2OX/ntjm/57Z5v+f2eb/n9nm/5/Z5/+g2ef/oNrn/6Da + 6P+h2uj/hr/S/02Gpf87c5T/PnWU/0J5lv9Ee5j/QnmW/0B1lf8+cJH/NF59/wsTGv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BxIZ/x5cgf8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8iX4P/FzBA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FCxH/GjlS/y1e + hP8xYYb/MmOJ/zNjiv8yZIz/L2OM/y1hjP8rYIr/Kl+J/ytei/8sXYz/KVqK/yVWhv8gUID/Gkp6/xpN + e/8dUX3/IVeB/yVchf8mW4b/J1iG/ylWiP8qV4n/UoOo/6Pf7f+v7vn/tfT+/7X0/v+09P7/tPT+/7T0 + /f+z9P3/s/P9/7Pz/f+y8/3/svP9/7Hz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x + +/+u8Pv/rfD6/63v+f+s7/j/rO73/6zu9/+r7fX/q+31/6rs9P+q7PP/quvz/6nq8f+p6vH/qOrw/6jp + 8P+n6O7/p+ju/6bn7f+m5+z/pebr/6Xm6v+l5er/pOXp/6Tk6P+j5Of/o+Pm/6Pj5v+i4uT/ouHk/6Hh + 4/+h4eP/oeDi/6Df4f+g3+D/n97f/5/e3/+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/nNvb/5va + 2/+b2tr/mtna/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5fW1/+W1df/ltXW/5XU + 1v+V1Nb/lNPV/5TT1f+U09X/k9LV/5PS1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O + 0v+PztH/j87R/47N0f+OzdD/jczQ/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vKz/+Lys//i8rP/4rK + z/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+HyND/h8fQ/4fH + 0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG + 0f+FxtH/hsbR/4bG0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydT/isnV/4rJ + 1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jczY/47M2P+Ozdn/js3Z/4/N + 2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/kc/b/5LP3P+Sz9z/ktDc/5PQ3P+T0N3/k9Dd/5TR + 3f+U0d3/lNHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU + 4f+Z1eL/mdXi/5rV4v+a1eL/mtbj/5vW4/+b1uP/m9bj/5zX5P+c1+T/nNfk/5zX5f+d2OX/ndjl/57Y + 5f+e2Ob/ntnm/5/Z5v+f2eb/n9nn/6DZ5/+g2uf/oNro/3u1yv9LhaT/PHSW/z11lf9AeJb/Q3qW/0R9 + mP9EfJj/QXiW/zReeP8EBwn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wQL + D/8dVXj/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8dW3//HkRZ/wQHCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Cxcg/yFGYv8tXob/LmCI/yxfiP8rYIn/KmCJ/yhf + h/8oX4j/K2CK/yxfjP8rXYz/KVmK/yFRg/8cS33/GUl6/xtNfP8gVID/IleC/yNWg/8jUYL/Ik+A/yFN + f/8eS3z/J1SD/0x+o/+a1eX/qefz/7X0/v+09P7/tPT9/7P0/f+z9P3/s/P9/7Lz/f+y8/3/svP9/7Hz + /f+x8/3/sfP9/7Dy/f+w8v3/r/L9/6/y/f+v8v3/rvH8/67w+/+t8Pr/rfD5/63v+f+s7vf/rO73/6vt + 9v+r7fX/quz0/6rs8/+q6/P/qevy/6nq8f+o6vD/qOnw/6jp7/+n6O7/puft/6bn7P+m5+z/pebr/6Xl + 6v+k5en/pOTo/6Tk6P+j4+b/o+Pm/6Li5f+i4uT/oeHj/6Hh4/+h4OL/oODh/6Df4P+f3t//n97f/5/e + 3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb2/+c29v/m9rb/5va2/+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX + 2f+Y19j/mNfY/5fW2P+X1tf/l9bX/5bV1/+W1df/ldTW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5PS + 1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O0f+PztH/js3R/47N0f+OzdD/jczQ/43M + 0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kys//isnP/4nJz/+Jyc//icnP/4nJ + z/+JyM//iMjP/4jIz/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH0P+GxtD/hcbQ/4XG + 0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+FxtH/hsbS/4bH0v+Gx9L/h8fS/4fH + 0/+IyNP/iMjT/4jI0/+JyNT/icnU/4nJ1P+JydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL + 1/+My9f/jczX/43M2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Qztr/kc7b/5HP + 2/+Rz9v/ks/b/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS + 3/+W0t//l9Pg/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mtXi/5rV4v+a1eP/m9bj/5vW + 4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X5f+d2OX/ntjl/57Y5v+e2Ob/ntnm/5/Z5v+f2ef/n9jn/5LK + 2/9blrD/OXKV/zpzlv89dZf/QHeY/0F5l/9De5f/Rn2Y/0Z8mP8qS17/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BBQf/GEZm/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/I1Jv/wcOEv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xAiMv8mU3j/K2CJ/ylhif8pYoj/KGOI/ytli/8tZYz/LmSO/y9ij/8tXo7/J1iK/yBQ + gv8dTH7/Hk5//yFSgv8jVoT/I1WD/yJSgf8iT4D/Hkx8/x9MfP8dSnr/Gkd3/x5Lef9CdJv/hcDV/5/c + 7P+09P3/s/T9/7P0/f+z8/3/svP9/7Lz/f+y8/3/sfP9/7Hz/f+x8/3/sPL9/7Dy/f+w8v3/r/L9/6/y + /f+u8fz/rvH7/63w+v+t8Pn/re/5/6zv+P+s7vf/q+32/6vt9f+r7fX/quz0/6rr8/+p6/L/qerx/6nq + 8f+o6fD/qOnv/6fo7v+n6O7/pufs/6bn7P+l5uv/pebq/6Tl6f+k5Oj/pOTo/6Pk5/+j4+b/ouLl/6Li + 5P+i4eT/oeHj/6Hg4v+g4OH/oN/h/6Df4P+f3t//n97e/57d3f+e3d3/ndzc/53c3P+d3Nz/nNvc/5zb + 2/+b2tv/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX2P+Y19j/l9bY/5fW2P+X1tf/ltXX/5bV + 1/+W1db/ldTW/5XU1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR1P+S0dT/kdDT/5HQ0/+R0NP/kdDT/5DP + 0v+Qz9L/j87S/4/O0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4zLz/+Lys//i8rP/4vK + z/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+IyM//iMjP/4jIz/+IyND/h8jQ/4fH + 0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF + 0P+FxtH/hcbR/4XG0f+GxtH/hsfS/4bH0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ + 1f+KydX/isnV/4rK1f+Lytb/i8rW/4vK1v+My9f/jMvX/4zL1/+Ny9f/jczX/43M2P+OzNj/jszY/47N + 2f+Pzdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Sz9v/ks/c/5LP3P+T0Nz/k9Dd/5PQ + 3f+T0N3/lNHd/5TR3v+V0d7/ldHe/5XS3v+W0t//ltLf/5bS3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU + 4f+Y1OH/mdTh/5nV4v+Z1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX5P+c1+X/ndfl/53Y + 5f+d2OX/ntjm/57Y5v+e2eb/n9nm/5fR4f9wqcD/MGqM/zBqjf81b5L/OXKW/z11mP8/d5j/QnqZ/0V8 + mf9DdJD/Gy45/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQUH/xdE + Y/8aWH3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/IVp7/xQpNf8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8RJTX/J1h7/ytm + i/8uaY3/L2uP/zFrkP8za5L/MmmR/zBkkP8qXYz/JleI/yFShP8hUoP/JFaF/ydZiP8mWYb/JleE/yVV + g/8kU4H/JFKB/yJQf/8fTXz/HUt8/xxKe/8gT4D/OWuW/2ykwv+Y1eT/sfH7/7Py/P+z8/3/svP9/7Lz + /f+x8/3/sfP9/7Hz/f+w8v3/sPL9/7Dy/f+v8v3/r/L9/67x/P+u8fv/rvD7/63w+v+t7/n/rO/4/6zu + 9/+s7vf/q+31/6vt9f+q7PT/quzz/6nr8v+p6vH/qerx/6jq8P+o6e//p+ju/6fo7v+m5+3/pufs/6Xm + 6/+l5ur/peXq/6Tl6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLk/6Lh5P+h4eP/oeHj/6Dg4f+g3+H/oN/g/5/e + 3/+f3t//nt3d/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY + 2f+Z2Nn/mNfZ/5jX2P+X1tj/l9bY/5fW1/+X1tf/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS + 1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O0f+OzdH/js3Q/43M + 0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJ + z/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG + 0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4fH + 0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnU/4rJ1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL + 1v+My9f/jMvX/43L1/+NzNf/jczY/47M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO + 2/+Rztv/kc/b/5HP2/+Sz9z/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5XR3v+V0d7/ldLe/5XS + 3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5nV4v+a1eL/mtXj/5rW + 4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX5P+c1+X/ndjl/53Y5f+e2OX/ntjm/57Z5v+a1OP/XJWx/zNt + jv8qZIf/MGqN/zRtkv83b5X/OnKW/z52l/9BeJj/N2N+/w0XHf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wIFB/8aR2b/G1h9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Hlx//x5GXv8DBgn/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Eig2/yxgf/80cZP/NnGU/zZvlP82bZP/M2iR/y5h + jv8qXIr/JVaH/yVXh/8nW4n/Kl+L/ytfi/8qXoj/Kl2H/ytdiP8rXYj/KVmG/yVUg/8iUID/Hkx+/x5M + fv8gToH/IlCB/y9fjP9PhKb/gr3S/6Xk8f+v8Pr/svP9/7Lz/f+x8/3/sfP9/7Hz/f+w8v3/sPL9/6/y + /f+v8v3/r/L9/67x+/+u8Pv/rfD6/63w+f+s7/j/rO73/6zu9/+r7fb/q+31/6rs9P+q7PP/quvz/6nr + 8v+p6vH/qOrw/6jp8P+o6e//p+ju/6bn7f+m5+z/pufs/6Xm6v+l5er/pOXp/6Tk6P+j5Of/o+Pm/6Pj + 5v+i4uX/ouLk/6Hh4/+h4eP/oeDi/6Dg4f+g3+D/n97f/5/e3/+f3t7/nt3d/57d3f+d3Nz/ndzc/5zb + 3P+c29v/nNvb/5va2/+b2tv/mtna/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX2P+X1tj/l9bX/5fW + 1/+W1df/ltXW/5XU1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR0/+R0NP/kdDT/5HQ + 0/+Qz9L/kM/S/5DP0v+PztH/j87R/47N0f+OzdH/jczQ/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vK + z/+Lys//i8rP/4rKz/+Kys//isrP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI + 0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF + 0P+ExdD/hcXR/4XG0f+FxtH/hcbR/4bG0v+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI0/+IyNP/icjU/4nJ + 1P+JydT/icnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jMvX/43M1/+NzNj/jczY/47M + 2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kM7a/5HO2/+Rz9v/kc/b/5LP2/+Sz9z/ktDc/5PQ + 3P+T0N3/k9Dd/5TR3f+U0d3/lNHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU + 4f+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5rV4v+a1eL/mtXj/5vW4/+b1uP/m9bj/5vW5P+c1+T/nNfk/5zX + 5f+d1+X/ndjl/57Y5f+Pytr/Z5+5/zhylP8tZ4v/LmiM/y5ojP8uaI3/MmuS/zVulf83b5X/OnGW/x86 + TP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CBgj/HElo/x1Z + fv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/yVe + fv8QISz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/xQrN/8yZYP/OnOW/zdvlP82apL/M2WP/y1fjP8oXIn/Jl2K/ylhjf8sZI3/LmWN/y5k + jf8wZY7/MmeP/zJmj/8vYY3/KlqJ/yRSg/8eTH7/G0h8/xtJfP8cSnz/HUt7/x5Lev8fTHn/KViA/1eM + qf+CvNH/puXx/63v+v+x8/3/sfP9/7Dy/f+w8v3/sPL9/6/y/f+v8v3/rvH8/67x+/+t8Pr/rfD5/63v + +f+s7/j/rO73/6vt9v+r7fX/q+31/6rs8/+q6/P/qevy/6nq8f+o6vD/qOnw/6jp7/+n6O7/p+ju/6bn + 7P+m5+z/pebr/6Xm6v+k5en/pOTo/6Tk6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh4/+h4OL/oODh/6Df + 4f+g3+D/n97f/5/e3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb3P+c29v/m9rb/5va2/+b2tr/mtna/5rZ + 2v+Z2Nn/mdjZ/5jX2f+Y19j/mNfY/5fW2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT + 1f+T0tX/k9LU/5PS1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O0v+PztH/js3R/47N + 0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kys//isnP/4rJ + z/+Jyc//icnP/4nJz/+Jyc//iMjP/4jIz/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH + 0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcbR/4XG0f+FxtH/hsbR/4bH + 0v+Gx9L/h8fS/4fH0/+IyNP/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydX/isnV/4rJ1f+KytX/i8rW/4vK + 1v+Lytb/jMvX/4zL1/+My9f/jcvX/43M2P+NzNj/jszY/47M2P+Ozdn/j83Z/4/N2f+Pzdn/j87a/5DO + 2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP3P+Sz9z/k9Dc/5PQ3f+T0N3/k9Dd/5TR3f+U0d7/ldHe/5XR + 3v+V0t7/ltLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU4f+Z1eL/mtXi/5rV + 4v+a1eP/mtbj/5vW4/+b1uP/m9bk/5zX5P+c1+T/nNfl/53X5f+d2OX/ebLH/0V9nf8tZYv/LmeM/zBq + jv8ybJD/MmyR/zNskv8ybJP/M2uT/ypYd/8KFBv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AgUI/xxLaf8eW3//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/yJfg/8hSGH/Bg0R/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8OHSX/K1Rw/zdr + k/80ZpD/MGKM/ylgiv8mYov/KGSM/yxnjv8uaY3/MWqP/zNrkf82bZP/NWqS/zJlkf8tX4z/JFWF/x1M + fv8YRXn/FkN2/xhFd/8bSHj/HEl3/x5Ld/8eSnX/Hkl0/xxKc/80ZYr/SX2e/4rH2f+a2ej/sPL9/6/x + /P+w8v3/r/L9/6/y/f+u8fz/rvH7/67w+/+t8Pn/re/5/6zv+P+s7vf/rO73/6vt9f+r7fX/quz0/6rs + 8/+p6/L/qerx/6nq8f+o6vD/qOnv/6fo7v+n6O7/puft/6bn7P+l5uv/pebq/6Xl6v+k5en/pOTo/6Pk + 5/+j4+b/o+Pm/6Li5P+i4eT/oeHj/6Hh4/+g4OH/oN/h/6Df4P+f3t//n97e/57d3f+e3d3/nt3d/53c + 3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX2f+Y19j/l9bY/5fW + 2P+X1tf/ltXX/5bV1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT1f+T0tX/k9LU/5LR1P+S0dT/ktHT/5HQ + 0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+PztH/js3R/47N0P+NzND/jczQ/43M0P+My8//jMvP/4zL + z/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+JyM//iMjP/4jI + z/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF + 0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI + 1P+JyNT/icnU/4nJ1f+KydX/isnV/4rK1f+Lytb/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M + 2P+OzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Rz9v/ks/c/5LP + 3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+V0d7/ldHe/5XS3v+V0t//ltLf/5bS3/+W09//l9Pg/5fT + 4P+X0+D/mNTh/5jU4f+Y1OH/mdTh/5nV4v+Z1eL/mtXi/5rV4/+a1uP/m9bj/5vW4/+b1uT/nNfk/5zX + 5P+b1uP/isLV/1SNqf8xaY3/J1+G/yphif8uZo3/MWqQ/zRskv82cJT/N2+V/zJmi/8ZNUn/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wcRGf8gV3r/HFp//xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/x5cgP8oXn//FzRG/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Bw0S/yBAWv8sXoT/KGOK/yRjiv8oZY3/K2eO/y9q + jf8xbI3/NG6Q/zZvkv83bpP/NGqS/y5ijf8mV4b/Hk1//xdFeP8UQXX/F0R1/xpHdv8fTHn/I1B8/yVS + e/8gUXr/HU94/x1Pef8gUHr/I1J7/zZmjf9Iep7/baW//5bT5f+e3+3/r/L9/67x/P+u8fv/rvD7/63w + +v+t8Pn/rO/4/6zu9/+s7vf/q+32/6vt9f+q7PT/quzz/6rr8/+p6vH/qerx/6jq8P+o6fD/qOnv/6fo + 7v+m5+3/pufs/6bn7P+l5ur/peXq/6Tl6f+k5Oj/o+Tn/6Pj5v+j4+b/ouLl/6Lh5P+h4eP/oeHj/6Hg + 4v+g4OH/oN/g/5/e3/+f3t//n97e/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5zb2/+b2tv/m9ra/5rZ + 2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV1v+V1Nb/ldTW/5XU + 1v+U09X/lNPV/5PS1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+Qz9L/j87R/4/O + 0f+OzdH/js3R/43M0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rK + z/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH + 0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG + 0f+GxtL/hsfS/4bH0v+Hx9P/h8fT/4jI0/+IyNP/iMjT/4nI1P+JydT/icnU/4nJ1f+KydX/isrV/4rK + 1f+Lytb/i8rW/4zL1v+My9f/jMvX/43L1/+NzNf/jczY/43M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/4/O + 2v+Qztr/kM7a/5DO2v+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LQ3P+T0Nz/k9Dd/5PQ3f+U0d3/lNHd/5TR + 3v+V0d7/ldLe/5XS3/+W0t//ltLf/5bT3/+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Y1OH/mdXi/5nV + 4v+a1eL/mtXi/5rW4/+b1uP/m9bj/5vW4/+b1uT/grzP/0+GpP8oXYX/JluE/yRZgv8kWoT/J16H/y1k + jf8zaZH/Nm2T/zlvlP8jRl7/Bw0S/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8OIzL/IFd6/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8hXoL/Ild1/wwZ + I/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wMGCP8RKzz/HlBx/ydkjv8sZo7/L2iN/zFrjP8zbY3/NW6Q/zZukf81a5L/MGOO/yla + iP8iUYH/G0h6/xhFd/8ZRXb/Hkt5/yRRfv8qV4P/KVmD/yRYgf8gVn//IVR9/yJUff8lVX7/KFiB/yla + gv8sXIP/K12G/0B3mv9Ph6X/ebbL/4zL3P+m6PP/quz3/63w+f+t7/n/rO/4/6zu9/+r7fb/q+31/6vt + 9f+q7PP/quvz/6nr8v+p6vH/qOrw/6jp8P+o6e//p+ju/6bn7f+m5+z/pufs/6Xm6/+l5ur/pOXp/6Tk + 6P+k5Oj/o+Tn/6Pj5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg4f+g3+H/n97f/5/e3/+f3t7/nt3d/57d + 3f+d3Nz/ndzc/53c3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5jX + 2P+X1tj/l9bX/5fW1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/k9LV/5PS1P+T0tT/ktHU/5LR + 0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/5DP0v+PztL/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zL + z/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isrP/4rJz/+Jyc//icnP/4nJz/+Jyc//icnP/4jI + z/+IyM//iMjP/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG + 0P+ExdD/hMXQ/4TF0P+ExdD/hMXQ/4XG0f+FxtH/hcbR/4bG0f+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI + 0/+IyNP/iMjU/4nJ1P+JydT/icnV/4rJ1f+KytX/isrV/4vK1v+Lytb/i8rW/4zL1/+My9f/jMvX/43L + 1/+NzNj/jczY/47M2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/5DO2v+Qztr/kM7a/5HO2/+Rztv/kc/b/5LP + 2/+Sz9z/ks/c/5PQ3P+T0N3/k9Dd/5PQ3f+U0d3/lNHe/5XR3v+V0d7/ldLf/5bS3/+W0t//ltLf/5fT + 4P+X0+D/l9Pg/5fT4P+Y1OH/mNTh/5jU4f+Z1OH/mdXi/5rV4v+a1eL/mtXj/5rW4/+W0t//g73Q/1yS + sP8/d5r/LmWL/ypgh/8mXIX/JFmD/yNZg/8mXIb/K2CK/zJnjv8qUW3/Dhsl/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ES5C/yBdgf8aWn7/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8eXID/IV2B/x9JZv8MGST/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BxIa/xs9 + Wf8sX4b/MWeN/zNqjf80bY3/NW2Q/zVrkv8yZZD/LF2L/yVTg/8fTX7/HEh6/x5Jev8kUH7/K1iE/y5d + h/8rXof/JV6H/yNbhP8kWIH/JVeA/yZYgf8qWoP/K1yE/ylbg/8oW4P/KFyF/ylehf8tYoj/NGqN/0V6 + mP9alK3/erjL/4fF1v+h4+7/o+Pu/6rr9P+r7fX/q+31/6rs9P+q6/P/qevy/6nq8f+p6vH/qOrw/6jp + 7/+n6O7/p+ju/6bn7f+m5+z/pebr/6Xm6v+l5er/pOTo/6Tk6P+j5Of/o+Pm/6Li5f+i4uT/ouHk/6Hh + 4/+h4eP/oODh/6Df4f+g3+D/n97f/5/e3v+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb3P+c29v/m9rb/5va + 2/+b2tr/mtna/5rZ2v+Z2Nn/mdjZ/5nY2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5bV1/+W1df/ltXW/5XU + 1v+V1Nb/lNPV/5TT1f+U09X/k9LU/5PS1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ0/+Qz9L/kM/S/4/O + 0v+PztH/j87R/47N0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+My8//i8rP/4vKz/+Lys//i8rP/4rK + z/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI0P+Hx9D/h8fQ/4fH + 0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG + 0f+FxtH/hsbR/4bG0v+Gx9L/h8fS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ1P+JydX/isnV/4rJ + 1f+KytX/i8rW/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jszY/47M2P+Ozdn/js3Z/4/N + 2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/ks/b/5LP3P+Sz9z/ktDc/5PQ3f+T0N3/k9Dd/5TR + 3f+U0d3/ldHe/5XR3v+V0t7/ldLf/5bS3/+W0t//ltPf/5fT4P+X0+D/l9Pg/5jU4f+Y1OH/mNTh/5nU + 4f+Z1eL/mdXi/5rV4v+a1eP/hcDR/1mRrP8zaY7/M2qP/zNqkP8za5D/LmWL/ylfhv8mW4X/JVmF/ydb + hv8hRmX/DBgi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AgUH/xpEYv8dW3//G1p+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8bWn7/HFp+/yFcg/8bPFb/BQsR/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMGCP8TJTb/I0dh/zRpjf81ao7/NGmP/zJk + j/8sXYv/JlWF/yFNfv8fSnv/IEt8/ydSgP8uW4b/LmCJ/ypgif8oYIj/J16G/yZchP8nWoL/KFuD/ytd + hP8rXYT/KlyD/ydbgf8lWoH/JluD/ylehf8uY4j/MmaJ/zNoiP80aYj/O3KQ/ztzkf9Ujqj/WJGq/3+7 + zv+HxdX/pujx/6Dg6v+q6/P/qOnw/6nq8f+o6vD/qOnw/6fo7v+n6O7/puft/6bn7P+m5+z/pebq/6Xl + 6v+k5en/pOTo/6Pk5/+j4+b/o+Pm/6Li5f+i4eT/oeHj/6Hh4/+h4OL/oN/h/6Df4P+f3t//n97f/57d + 3f+e3d3/nt3d/53c3P+d3Nz/nNvc/5zb2/+c29v/m9rb/5va2v+a2dr/mtna/5rZ2v+Z2Nn/mdjZ/5jX + 2f+Y19j/l9bY/5fW2P+X1tf/l9bX/5bV1/+W1db/ldTW/5XU1v+V1Nb/lNPV/5TT1f+T0tX/k9LU/5LR + 1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+PztH/js3R/47N0f+NzND/jczQ/43M + 0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJ + z/+JyM//iMjP/4jIz/+IyND/iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG + 0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Gx9L/h8fT/4fH + 0/+IyNP/iMjT/4jI1P+JyNT/icnU/4nJ1P+KydX/isnV/4rK1f+KytX/i8rW/4vK1v+My9b/jMvX/4zL + 1/+Ny9f/jczX/43M2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Qztr/kc7b/5HP + 2/+Rz9v/ks/b/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+U0d7/ldHe/5XS3v+V0t//ltLf/5bS + 3/+W09//l9Pg/5fT4P+X0+D/mNTh/5jU4f+Y1OH/mNTh/5nV4v+JxNP/d7DD/1qRq/9Bd5f/NW2O/zZt + kP83bpL/OHCT/zVsj/8yaIz/LmOI/yhdhf8dRGT/ChYh/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/woXIf8iWX3/G1p+/xtaff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxaf/8lXYX/GTxU/wUM + EP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/BgwR/xYsPf8pUXL/MGGM/ytaif8kUoL/Hkl7/xxHeP8fSXn/JlB9/ytZ + hP8sXoj/KmKK/ytiiv8qYYj/KF6F/yhdg/8pXIP/K1yD/yxehf8rXoT/KFuB/ydagP8lWX//KF2D/y1h + hv8xZYn/NGiK/zVqiv82bI3/OG+P/zhtj/85bpD/O2+R/z5ylP9EeJf/UYij/1mRq/95s8f/hcHR/5bV + 4f+c3eb/qOnv/6Tl7P+m5+3/pufs/6bn7P+l5uv/peXq/6Tl6f+k5Oj/pOTo/6Pj5v+j4+b/ouLl/6Li + 5P+i4eT/oeHj/6Hg4v+g4OH/oN/h/5/e3/+f3t//n97e/57d3f+e3d3/ndzc/53c3P+d3Nz/nNvb/5zb + 2/+b2tv/m9rb/5rZ2v+a2dr/mtna/5nY2f+Z2Nn/mNfZ/5jX2P+Y19j/l9bY/5fW1/+X1tf/ltXX/5bV + 1/+V1Nb/ldTW/5XU1v+U09X/lNPV/5PS1f+T0tT/k9LU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP + 0v+Qz9L/j87S/4/O0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vK + z/+Kys//isrP/4rKz/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jIz/+IyND/h8jQ/4fH + 0P+Hx9D/h8fQ/4bH0P+Gx9D/hsfQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF + 0f+FxtH/hcbR/4XG0f+GxtL/hsfS/4bH0v+Hx9L/h8fT/4jI0/+IyNP/iMjT/4jI1P+JydT/icnU/4nJ + 1f+KydX/isrV/4rK1f+Lytb/i8rW/4zL1v+My9f/jMvX/4zL1/+Ny9f/jczY/43M2P+OzNj/jszY/47N + 2f+Pzdn/j83Z/4/N2f+Qztr/kM7a/5DO2v+Rztv/kc/b/5HP2/+Sz9v/ks/c/5LQ3P+T0Nz/k9Dd/5PQ + 3f+T0N3/lNHd/5TR3v+V0d7/ldHe/5XS3/+W0t//ltLf/5bS3/+X0+D/l9Pg/5fT4P+X0+D/l9Pg/4zI + 2P+Dvs//Zp20/02Dnv87cJD/OW+O/zVsjf81bI7/N26Q/zlwkv85cJP/NmyP/zNpjP8lTGb/Cxgh/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMG + CP8YN03/I12D/x1af/8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8fXIH/IV2D/xc6Uv8HERn/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8FCxD/EiU6/xs+Zv8bRnf/GEFz/xhBcv8hS3r/KFaB/ytdh/8sYYr/LGOL/yxiiv8qX4b/KlyD/ypc + gv8sXYT/LV6E/y1fhf8rXYP/KVyC/ydbgP8nXIH/K2GF/zBliP80Z4r/N2qM/zdtjv83bo//N22P/zds + j/84bY//OW6P/zhsjf84bI3/N2uM/zZqjP80Zoz/Om2S/z9ymP9HfZ7/Vo2q/2aguf98uMr/js3Z/57f + 5f+g3+f/peXq/6Lj5/+k5Oj/o+Tn/6Pj5v+i4uX/ouLk/6Lh5P+h4eP/oeDi/6Dg4f+g3+H/oN/g/5/e + 3/+f3t7/nt3d/57d3f+e3d3/ndzc/53c3P+c29z/nNvb/5va2/+b2tv/m9ra/5rZ2v+a2dr/mdjZ/5nY + 2f+Z2Nn/mNfY/5jX2P+X1tj/l9bY/5fW1/+W1df/ltXX/5bV1v+V1Nb/ldTW/5TT1f+U09X/lNPV/5PS + 1P+T0tT/ktHU/5LR1P+R0NP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O0f+OzdH/js3Q/43M + 0P+NzND/jMvP/4zLz/+My8//jMvP/4vKz/+Lys//i8rP/4vKz/+Kys//isrP/4rJz/+Kyc//icnP/4nJ + z/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8fQ/4fH0P+Hx9D/h8fQ/4bH0P+Gx9D/hsbQ/4bG + 0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG0f+GxtL/hsfS/4fH + 0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnV/4rJ1f+KydX/isrV/4vK1v+Lytb/i8rW/4zL + 1v+My9f/jMvX/43L1/+NzNf/jczY/47M2P+OzNj/js3Z/4/N2f+Pzdn/j83Z/4/O2v+Qztr/kM7a/5HO + 2/+Rztv/kc/b/5LP2/+Sz9z/ks/c/5LQ3P+T0N3/k9Dd/5PQ3f+U0d3/lNHe/5XR3v+V0d7/ldLe/5bS + 3/+W0t//ltLf/5bT3/+V0d//l9Pg/5LO3P9noLb/SH+a/zFkhf81aIj/OGyL/zhujf83bY3/NWyN/zVs + jv82bY//OG6R/zdtkP8iQ1n/Bg0R/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8MGSH/JVd3/x1bf/8bWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8bWn7/G1p//x5bgf8aRGT/CRgh/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMIDv8KGzH/EzRc/xxG + df8lU4D/KlqG/yxeiP8uYYr/LGCH/ypehf8pXIL/K1yC/y1eg/8vX4X/L2CG/y5fhf8sXoT/Kl2D/ype + g/8qYIT/LWOH/zJmiP82aYv/OGyN/zZrjf81ao3/NWqO/zdsjv84bY7/OW6O/zhujf84bY3/OGuO/zdq + j/80Z4//MGKN/ypciP8iU4D/HEx6/xxOe/8fUX7/NGeQ/0J3n/9Wja//a6W//3+8zP+MzNb/ldXc/6Pj + 5v+d3eD/ouHk/6Hh4/+h4eP/oeDi/6Df4f+g3+D/n97f/5/e3/+e3d3/nt3d/57d3f+d3Nz/ndzc/5zb + 3P+c29v/nNvb/5va2/+b2tr/mtna/5rZ2v+a2dr/mdjZ/5nY2f+Y19n/mNfY/5fW2P+X1tj/l9bX/5fW + 1/+W1df/ltXW/5XU1v+V1Nb/lNPV/5TT1f+U09X/k9LV/5PS1P+S0dT/ktHU/5LR0/+R0NP/kdDT/5HQ + 0/+Qz9L/kM/S/4/O0v+PztH/j87R/47N0f+OzdD/jczQ/43M0P+NzND/jMvP/4zLz/+My8//i8vP/4vK + z/+Lys//i8rP/4rKz/+Kys//isnP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jIz/+IyM//iMjQ/4jI + 0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+GxtD/hsbQ/4XG0P+FxtD/hcbQ/4XG0P+ExdD/hMXQ/4TF + 0P+ExdD/hcXR/4XG0f+FxtH/hsbR/4bG0v+Gx9L/hsfS/4fH0/+Hx9P/iMjT/4jI0/+IyNT/icjU/4nJ + 1P+JydT/isnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4zL1/+My9f/jcvX/43M1/+NzNj/jczY/47M + 2P+Ozdn/js3Z/4/N2f+Pzdn/j87a/5DO2v+Qztr/kc7b/5HO2/+Rz9v/kc/b/5LP3P+Sz9z/ktDc/5PQ + 3P+T0N3/k9Dd/5TR3f+U0d3/lNHe/5XR3v+V0t7/ldLf/43I1/+Evs//erTH/1qQrP9DeJn/LF6E/y5e + hP8wYYX/MmSF/zVoh/83aov/NmyN/zVtjf82bo//Nm6Q/zBgf/8YLz//AwYI/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8GDRH/H0Ze/yJf + gv8eXH//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xxZf/8eWoH/G0tt/w8j + Nf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AgQH/w0dLv8bOlj/KVV+/yxdh/8sXoX/KVyC/ypb + gf8rXIH/LV2C/zFhhv8xYYf/MWGG/y5ghf8sYIT/K2CE/yxihf8tY4b/MGSG/zRnif80aIn/NGqL/zRq + i/82ao3/NmuN/zhsjv85bo//OG6O/zhtjv83bI//N2uR/zZpkv8yZY//K12J/yNUgf8cTXr/Gkt4/xlL + ev8bTXz/H1GB/yJUhv8kWIj/JVyJ/y9rkf84dJb/RoOg/1qWrv9hnrP/d7TC/325x/+Qztb/j83U/57c + 3v+Z2Nv/n97f/57d3v+e3d3/nt3d/53c3P+d3Nz/ndzc/5zb2/+c29v/m9rb/5va2/+a2dr/mtna/5rZ + 2v+Z2Nn/mdjZ/5jX2f+Y19j/mNfY/5fW2P+X1tf/l9bX/5bV1/+W1df/ldTW/5XU1v+V1Nb/lNPV/5TT + 1f+T0tX/k9LU/5PS1P+S0dT/ktHT/5HQ0/+R0NP/kdDT/5DP0v+Qz9L/kM/S/4/O0v+PztH/js3R/47N + 0f+OzdD/jczQ/43M0P+My8//jMvP/4zLz/+Ly8//i8rP/4vKz/+Lys//isrP/4rKz/+Kys//isnP/4nJ + z/+Jyc//icnP/4nJz/+JyM//iMjP/4jIz/+IyM//iMjQ/4fI0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bH + 0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF0P+ExdD/hMXQ/4TF0P+FxdH/hcbR/4XG0f+FxtH/hsbS/4bH + 0v+Gx9L/h8fS/4fH0/+IyNP/iMjT/4jI0/+JyNT/icnU/4nJ1P+JydX/isnV/4rK1f+KytX/i8rW/4vK + 1v+My9b/jMvX/4zL1/+My9f/jczX/43M2P+NzNj/jszY/47N2f+Ozdn/j83Z/4/N2f+Pzdn/kM7a/5DO + 2v+Qztr/kc7b/5HP2/+Rz9v/ks/b/5LP3P+S0Nz/k9Dc/5PQ3f+T0N3/lNHd/5TR3f+U0d7/hb7P/3Or + vv9elKz/Sn+e/zNmjP8iUn3/IlJ8/yRUff8pV3//LVyD/zBghP8zZYf/NWeI/zVpi/81bI7/Nm2P/yJF + Wv8OGyT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/GDRE/yhef/8eXH//Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8cWn7/HVuA/yFZf/8UMUb/BQwS/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/ChYg/xgySf8iS2n/KVuA/yxcgf8vX4T/MWGG/zNjh/8yY4f/MGKG/y5h + hf8rYYT/K2GE/yxihf8vZIX/MGSG/zFmh/8yaIj/M2iK/zRpi/81aoz/N2yO/zhskP84bJD/N2yO/zZr + j/82apD/NWmR/zJlj/8rXoj/JFeC/x9Qff8bTHn/Gkx5/xtNev8bTXz/HU9+/x9Sgf8iWYT/KWGJ/zBo + jv82b5L/PHWX/0B6mf9Ffpz/SH2a/0x/nf9ViaX/VIek/2Obsf9km7D/dK29/3avv/+Ewcv/hL/K/5LP + 0/+QztP/k9LW/5zb2/+W1tj/m9rb/5rZ2v+a2dr/mtna/5nY2f+Z2Nn/mdjZ/5jX2P+Y19j/l9bY/5fW + 2P+X1tf/ltXX/5bV1/+W1db/ldTW/5XU1v+U09X/lNPV/5TT1f+T0tT/k9LU/5LR1P+S0dT/kdDT/5HQ + 0/+R0NP/kdDT/5DP0v+Qz9L/j87S/4/O0f+OzdH/js3R/47N0P+NzND/jczQ/4zLz/+My8//jMvP/4zL + z/+Lys//i8rP/4vKz/+Lys//isrP/4rKz/+Kyc//isnP/4nJz/+Jyc//icnP/4nJz/+IyM//iMjP/4jI + z/+IyND/iMjQ/4fH0P+Hx9D/h8fQ/4fH0P+Gx9D/hsfQ/4bG0P+GxtD/hcbQ/4XG0P+FxtD/hcbQ/4TF + 0P+ExdD/hMXQ/4TF0P+FxtH/hcbR/4XG0f+GxtH/hsbS/4bH0v+Hx9L/h8fT/4fH0/+IyNP/iMjT/4jI + 1P+JyNT/icnU/4nJ1f+KydX/isnV/4rK1f+Lytb/i8rW/4vK1v+My9b/jMvX/4zL1/+Ny9f/jczX/43M + 2P+OzNj/jszY/47N2f+Pzdn/j83Z/4/N2f+Pztr/kM7a/5DO2v+Rztv/kc7b/5HP2/+Sztv/ks/c/5LP + 3P+IxdT/gb3P/324yv9wqL//V4yp/0x9m/9Id5f/NWSG/y9egv8sXIT/KViD/yVSfv8hTnr/IU55/yRQ + ev8qWID/MF6F/zJjh/8yZYn/KVRw/xMnNf8DBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ESY0/ydZeP8fXID/HVt//xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/x5dg/8iXoT/HURh/w4eLf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8FCw//ECIw/yBBW/8uW33/MWGF/zFihv8wYob/LmGF/yxhhP8rYYP/KmCC/yxig/8uZIX/L2SF/y9k + hv8wZYf/MmeK/zVpjP82ao3/N2uP/zZqj/81aZD/NWmP/zRpkP8yZo7/LWGL/ylchv8mWYT/JFaA/x9S + fP8cUHn/HU96/xxNev8bS3r/G0x6/yBUf/8oXIX/MGaM/zdtkv87c5X/P3eX/0N5mf9FeZn/SXqb/0x8 + n/9NfqD/S36f/0p9nf9JfJ3/Sn2f/0p+oP9MgKH/QXeb/0eAoP8/e5z/Roal/0+Pq/9Tkaz/ZaK3/2aj + t/98usb/eLXD/5LQ0/+Kxs7/k9HV/5TS1f+U0tb/l9bY/5bU1f+X1tf/ltXX/5bV1v+V1Nb/ldTW/5TT + 1f+U09X/lNPV/5PS1f+T0tT/ktHU/5LR1P+S0dP/kdDT/5HQ0/+R0NP/kM/S/5DP0v+PztL/j87R/4/O + 0f+OzdH/js3Q/43M0P+NzND/jczQ/4zLz/+My8//jMvP/4vLz/+Lys//i8rP/4vKz/+Kys//isrP/4rJ + z/+Kyc//icnP/4nJz/+Jyc//icnP/4nIz/+IyM//iMjP/4jI0P+IyND/h8jQ/4fH0P+Hx9D/h8fQ/4bH + 0P+Gx9D/hsbQ/4bG0P+FxtD/hcbQ/4XG0P+FxtD/hMXQ/4TF0P+ExdD/hMXQ/4XF0f+FxtH/hcbR/4bG + 0f+GxtL/hsfS/4fH0v+Hx9P/h8fT/4jI0/+IyNP/iMjU/4nI1P+JydT/icnU/4rJ1f+KydX/isrV/4rK + 1f+Lytb/i8rW/4zL1v+My9f/jMvX/43L1/+NzNf/jczY/47M2P+OzNj/js3Z/47N2f+Pzdn/j83Z/43N + 2f+JxtT/kM7a/4XB0v96tMj/frrL/3Gtwv9cl7P/UYyp/1eQr/9IgqP/PnWZ/zpvkv84a4z/NWeI/zRk + hf8yYYT/MF+D/y1dg/8rWIH/JVB8/x5Hdf8bQ3H/IEl2/ydSff8lSWr/FCk6/wYMEP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/ChYh/xxFZP8gXYD/HVt//xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpafv8aWX3/IlyD/x9R + df8RLUL/BAsQ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8JEhj/FCk5/yBC + W/8qWnz/LGGE/ythhP8sYYP/LGKD/y5khf8vZIX/LmOF/y5ihv8xZYn/M2eL/zRojv80aI3/M2iO/zRn + j/81Z5L/M2aQ/y9ijP8pXYf/KF2F/yhdhP8mXIL/JluC/yRZgP8gVHz/H056/x5LeP8cSnj/H056/yVW + f/8tX4b/NGiN/zpvkv89cpT/QHSV/0J1l/9Gdpr/SHic/0h6nv9IfJ//Rnmd/0Z4m/9GeJz/RHec/0N2 + m/8/dJn/OnSY/zVzl/8xcpb/MnKY/zFul/8rZ5L/IFyI/yNeiv8zbZb/N3Ca/0uEp/9MhKX/XJWv/2KZ + sf9ln7L/ca26/3Ksu/9+ucT/e7bC/4fDzP+Ewcr/iMXM/43Lz/+Kyc3/k9HU/4vJz/+Q0NP/kM7S/5HP + 0v+R0NP/j87R/5HQ0/+Qz9L/kM/S/5DP0v+PztH/j87R/47N0f+OzdH/js3Q/43M0P+NzND/jMvP/4zL + z/+My8//i8vP/4vKz/+Lys//i8rP/4rKz/+Kys//isrP/4rJz/+Jyc//icnP/4nJz/+Jyc//icjP/4jI + z/+IyM//iMjP/4jI0P+HyND/h8fQ/4fH0P+Hx9D/hsfQ/4bH0P+Gx9D/hsbQ/4XG0P+FxtD/hcbQ/4XG + 0P+ExdD/hMXQ/4TF0P+ExdD/hcXR/4XG0f+FxtH/hcbR/4bG0v+Gx9L/hsfS/4fH0v+Hx9P/iMjT/4jI + 0/+IyNP/icjU/4nJ1P+JydT/icnV/4rJ1f+KytX/isrV/4vK1v+Lytb/jMvW/4vK1v+My9f/jMvX/4fG + 0/+Jx9X/jczY/3q0x/9yq8H/cqvB/1qRrf9KfqD/T4Kl/0R3nP8rW4n/PnKY/zpwlf82bJL/OXGV/ztz + lv88dZj/OnOW/zlxlf84b5P/NmyP/zNoiv8xZIX/NGaH/zRkhv8yYIT/MF2D/yxYgf8kT3r/GkNw/xIy + WP8LHDH/BAkO/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CRUe/xZAXf8fWX//G1l9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/HFl+/xxZf/8eWYD/HU1t/w8lNP8DBwn/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8IEhn/Eyo6/x9DW/8rXX3/LmOE/y9j + hf8uYoX/LmKG/y5jh/8wZYv/MmaM/zJnjf8wZY3/MWWP/zJlj/8xY4//LF+K/yldh/8pXob/KV+E/yti + hv8uZIj/LWOG/ypbg/8lUn7/IEt5/x5Kdv8eTHf/IlB6/ylZgP8wYYf/NmeM/ztskP89bpL/P3GV/0Jy + mP9CdJn/Q3Wc/0R3nf9CdZr/QXSZ/0Fzmf9Ac5n/P3OY/z51mP87dpj/OHaY/zl3mv84d5v/NnSa/y5r + lP8nZI7/JWKN/yxok/82cZn/P3qf/0qEpf9Oh6X/UYik/1KKo/9Ui6T/Vo2m/1iOqP9bj6z/V4yr/1iP + q/9Qh6P/U4yk/1iOp/9WjKj/WZCr/0d8oP9Riab/TISj/1KMqP9dmK//W5St/2umuP9norX/drLA/3Ks + vP93sr//f7vH/3izwf+Kx8z/e7fC/4C8xv+Ix83/gL3G/4zLz/+Ew8r/iMjO/4vKz/+Hxsz/i8rP/4jI + zv+Kys//isnP/4jIzv+Jyc//iMjP/4nJz/+Jyc//h8bO/4jIz/+IyM//iMjQ/4fI0P+GxtD/h8fQ/4fH + 0P+Gx9D/hsfQ/4bH0P+GxtD/hsbQ/4TG0P+FxtD/hcbQ/4XG0P+ExdD/g8TP/4TF0P+ExdD/hcXR/4XG + 0f+FxtH/hcTQ/4bH0v+Bwc7/h8fS/4fH0/+AwM3/hsbR/4XF0P+Av83/hsXQ/4HAzP99uMf/g8LQ/3ax + xP9qpLr/bqm+/1uWrv9OiKP/VZCq/02Hpf9Oiab/WZau/02Epf9Ddpz/P26W/ypXhP8fTnv/H0x8/yJQ + gP8lVIP/JlWE/yZWhP8oWIX/Kl2G/y5iiv8wZYv/MGaL/zBnjP8waI3/LmWK/y1jiP8vZIj/LmOG/y9j + hP8yZIX/NGSG/zJhhf8sVnv/HTxX/wwcLP8BBAf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ChYg/xlD + YP8fWH3/Gll9/xtZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8dW3//IV+D/yVjh/8gSmP/Eig2/wMGCP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8GDBD/EiUy/xo4S/8jSmX/L2SI/y5kif8wZYv/MGWM/y9l + jP8uZIz/LmSN/y1hjP8qX4n/Kl+I/ypgh/8tZIj/MGiJ/zJriv80aIv/M2KI/zBahP8oUn3/Hkh0/x5J + c/8fS3T/JFF5/ypYgP8yYIf/NmaM/zpqkP88bZP/PG6V/z1wl/89cpn/PHCX/zxwl/87cJb/O3KX/z1y + l/8+c5j/PnaY/z14mf89eZr/PXqd/zx6nf84dpv/M3GY/y5slP8sa5P/Lm2V/zRymP8+e53/R4Ki/02I + pf9Ri6X/U4ul/1WLpf9Wi6T/WYuo/1qNq/9Zjaz/VYuo/1KJpf9Ph6H/T4Wg/0uBn/9Ge53/PXGY/zZr + k/8wZY//L2WP/zJpkv80bJP/NGyS/zVrk/8xZpD/M2eQ/y9gjf8vXoz/NGON/yJQf/8vYIj/KWCE/zVv + jv8/epf/OXSU/02Io/9Kg6D/UYul/1WQp/9Lgp7/Xpes/1aNp/9el63/X5aw/1mPq/9jnLT/WpKr/1aN + qf9ela7/VImm/2Gbsv9Yj6z/WpOu/1+bs/9WkKz/aKW5/1uXsP9bl7D/Yp+2/1qVrv9hnLL/XJmw/1KM + qP9embH/WJOt/1qUrf9fmrL/U4yo/1yVrv9Ykq7/SoKl/02FqP9EeJ7/NmeR/0N3mv8+cpj/R32g/1eO + q/9QiKP/WZGp/1qTqf9TiZ//WZCk/1aKpP9Of57/Snyd/z5uk/8zZIv/K16F/yRbgv8nXoX/MGiN/zlz + lf88dJj/PHCY/zlplv8uXor/JFN//xtMeP8eTnv/IlF//yVUgv8kU4L/I1SA/yNUf/8kVX//JliB/ydb + gv8mW4L/J12E/yZdhP8kW4L/JluC/yhdg/8qX4L/LGCB/yVPaf8XL0D/Cxcg/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/ESUz/x9NbP8iXIL/Gll9/xpZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX7/G1p+/x5c + f/8iYYX/JWKH/yBIYv8SJzf/AwYI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/DBki/xQsPf8gRV//KFd6/y1kiv8rZIv/KmKK/ythif8sYor/LWSK/zJo + i/81bI3/Nm6N/zhqjf85Z43/N2OK/zBbhP8oUnv/H0hx/x1Gb/8gSnL/JlF6/y1ag/8yYIj/NmaN/zdp + kf84bJP/OGyV/zZrlP81a5L/NWuR/zdvlP85cZb/O3SY/z52mv9AeJr/P3mZ/z96mv9AfJ3/QHyf/z15 + nf83dJr/M3GZ/zFwmP8ycZf/NXSY/zt6nP9EgaD/TIak/1GKpv9Vjaf/Vo2m/1eLpv9Yiqf/WYqp/1mL + qv9Yi6r/Vouo/1WKpP9QhaD/TIGd/0d6mv8/c5f/OGyU/zJokf80a5P/N3CW/zpyl/85cZb/Nm6V/zVs + lP80aJL/MmOP/y5fjP8pWYf/JVWC/yJWfv8jXID/KmSG/zNtj/84cpP/O3WV/z54l/9Cepn/Q3ua/0N6 + mf9BdJX/PnGS/z1wlP89b5b/PG6X/zlrlf82aJL/MGKN/yxdiv8rW4n/KFiI/ylZiP8lVof/JViI/yZa + if8nXIr/K2CN/yxjjf8vZo//MmqQ/zFnjf8wZ4z/MWeN/zNojf82a5L/OW2U/zpulP84bZD/MmaL/y9i + if8qXYn/JVSG/x5Jfv8bRHf/I1B+/y9fiv88bpb/RXmd/0yCoP9Qh6H/UYig/1GInv9Rhp7/UIOe/0x9 + nf9Gdpn/PGyT/zRljP8rXob/JFmC/yVchP8rZIv/MmqQ/zRpkP8zZI//Ll+L/yZYg/8fUHz/Hk97/x9Q + fP8hUn7/I1SA/yNVgP8jVYD/IlV//yNVfv8kVn7/I1V9/yVYgP8kWID/I1iA/yZahP8gSWr/FjNI/w0d + KP8DBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DBgj/GDRF/yNWdv8iXoL/HFt//xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8cWn//HFt//yNfhf8lXob/HD9g/w8h + NP8CBQj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AwYI/woYIv8VMkX/Gz5W/yVScP8yaY3/NWyN/zlxkP87cZD/PG6Q/ztqjv86aI3/N2OK/zBa + gv8oUXn/IUlx/x1Gb/8hS3X/J1N8/y9chv8zYov/M2SO/zJmj/8yaJD/MGeP/y9mjf8waY//Mm2R/zVx + lf87dZj/Pnia/0B5m/8/eZj/QHqa/0F7nP9DfZ//QHqf/zt2m/82cpr/M3GY/zJxl/81dJf/O3mb/0OB + n/9KhqP/UIqm/1SMp/9Yjqn/WIyo/1mKqP9aiqn/WYqp/1mMqv9Zjan/WIun/1SHo/9Pg57/SXya/0F0 + lv86bpP/N2yT/zhvlf86c5f/PXWZ/z92mf88dJj/OnGW/zlvlv83a5T/NGaR/y1fiv8nWYT/I1p//ydg + g/8vaYv/N3GS/zt1lf89d5b/QXqY/0R9mv9Jf53/SH6c/0Z6mf9Ddpb/QHOV/z9yl/8+cJj/OmyW/zVo + kv8xY47/LF6K/yhZh/8lVYT/I1KE/yVWhv8nWoj/J1yK/ypgi/8sYo3/L2aP/zFokP80a5H/Nm6R/zdv + kv83bpH/OG6S/zpvlP89cpb/P3OY/ztwlP80ao3/L2SI/ypchP8lU4H/H0d6/xxEd/8jUH7/L1+K/zpt + k/9Fepz/TIKg/02FoP9PhqD/UIaf/0+Env9NgJ3/Snqb/0RzmP89bJT/NGWP/yxfiP8mW4X/I1iC/yZd + hv8pXYf/K12H/ypbhf8kVoD/IFN8/x5Se/8gVX3/IlZ+/yRXgf8kV4L/JluF/ydbhf8nW4T/J1yD/ylc + g/8pXIP/H0Zj/xQuQv8KFyH/AwYI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8MGSP/HEBX/yhkiP8gXoL/HVt//xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xtaf/8bWX7/HleB/xxUgP8UPF7/DCE1/wUNFv8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8LFRv/Fis2/x86Sf8vVW3/OmmI/zxsj/86aIz/N2KJ/zJbg/8sVX3/JE12/xxFcP8hS3f/J1N+/ytZ + hP8uXon/LWCL/yxiiv8rY4r/LGWL/y1ojf8wbI//NXCU/zt1mf8+d5v/Pnia/z95mf9Be5r/Q32d/0N9 + nv9Bep7/PXab/zhymv8zb5f/Mm+V/zNxlv85dpn/QX6d/0iEov9OiaX/Uoun/1WMqf9Zjav/W4yq/1uM + qv9bjKr/W4uq/1uMqv9Ziqj/VYek/1CCoP9Ke5v/QnSX/zxvlP85bpT/OXGV/ztzlf8+dpb/QHeY/0B3 + mv89c5j/PHGX/ztwl/84bJX/L2ON/yhchf8nXYT/K2OH/zRsjv84cpL/O3WU/z54lv9Be5j/Rn+b/0mB + nf9Lf53/SX2b/0Z5mf9Ddpj/QXSZ/z9xmf87bZb/NmiT/zBjj/8qXIn/JVaE/yFPgP8hUYH/JFaE/yda + iP8qXor/LGGL/y5mjv8xaI//NGuR/zdvkv87c5b/PHSW/ztzlf87cpT/PXOV/z90lv9AdZf/PXKU/zdt + jv8wZon/LFyE/ydSgf8hSnz/IEp7/yJQff8rXIX/NmuP/0B3l/9Gfpz/SYKd/0qCnv9Lgp3/S4Gd/0l9 + nP9GeJr/QXKY/zxslf81Z5D/LWGM/yddiP8jWoX/I1aC/yRVgP8kU3//IlN9/yBTfP8eU3r/Ild+/yVb + gf8oX4P/K2CF/ytgh/8sY4r/JVJy/x0/V/8SJjT/CRMa/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wYNEf8VLjz/JFh3/yRhg/8eXX//HFp+/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Glh+/xpZff8aVHz/G1R7/xlIbf8TLkb/DRwo/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAcJ/w8b + I/8WJzX/HDFF/yhIZv8oTHH/JU56/x5Hdf8dSXb/IE16/yVUgf8oWoX/J1yF/ydgh/8oY4n/K2iM/zFt + kP85cZT/PHSX/z93mv8/eJn/QXqa/0J8nP9Efp7/RX6f/0N7nv9AeJ3/OnOa/zRulv8ybZT/Mm6U/zZy + lv8+e5z/RoOh/0uHpP9Piaf/U4qo/1iLqf9cjqr/XY2q/1yMqf9bi6n/W4qp/1iHpv9UhaT/T4Cg/0l6 + nP9Bc5f/O2+U/zhtlP84b5T/OnKU/z11lP8/dpb/P3SX/z1zl/87cJX/OG2U/zVqkv8vZI3/KV+I/ylf + hv8uZIn/NGyP/zlyk/89dpb/P3iW/0J7l/9Gf5r/SX+c/0l/nP9JfJr/RXiY/0N2mP9BdJj/QHKa/zxt + l/83aJP/MGKN/yhZh/8hUX//Hk59/yJSgP8lVYP/KVyH/y1hif8vZIv/MWiN/zNqjv82bpH/O3KV/z52 + mP8/d5j/PXWW/zxylP8+dJT/QHWW/0B0lv89c5T/OW6O/zNmif8tXIb/KFKB/yJLfP8gSnr/IlF9/ypb + hP8wZor/OHGR/z53lv9Ce5j/RHya/0R8mf9Ee5n/RHmZ/0F1l/8+cZf/Om2W/zZpk/8uZI//KF+K/ydc + if8nWYb/JVOA/yBOe/8eT3r/HU95/yJWff8mXIH/H0lk/xo6Tf8SJzT/DBoi/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwYI/xMoNf8hSWD/J2OG/yJf + gf8bWn7/Glp9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Glh9/x1Z + ff8gWn//JV6B/x5DW/8SKTn/CBIY/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Bg4W/wgV + JP8LITj/ES5K/xc9XP8eTHD/JVyE/yhiiP8taIz/N2+S/zx0lf8/dZf/QHeZ/0J5m/9Ee5v/RX2d/0V+ + nv9FfZ7/RHuf/0J5n/8/d57/N3CY/zFrkv8wbJH/NXGW/zx5nP9EgaH/SIWj/0yHpf9Qiab/Voym/1qN + p/9bjKf/W4un/1qJp/9Yh6b/VoWk/1OCo/9NfqD/Rnib/z1xlv83bJP/NWuT/zZslP84cJb/OnOV/z10 + lP8+c5X/PHGV/zltkv80aJD/MGSN/ytgif8pXoj/Kl+H/y5li/81bJH/O3SX/z53mP8/eJf/QXqX/0R8 + mf9HfJr/SH2b/0R5mP9Cdpf/QXWX/z9zmP89cZj/OmyW/zZnkv8xYI7/K1iI/yFPfv8hUH3/JVaD/yla + hv8tX4j/MGSL/zJpjP80bI7/Nm6P/zpxkv8/dpb/QnmZ/0J4mP8/dpb/PnSU/z50k/9AdZT/QXWW/0B0 + lP87bY//NWWK/zBchv8nUn//H0t5/xxHd/8hTnz/J1mC/y1jh/8waov/NXCQ/zlzk/87dJT/O3ST/zxz + k/88cpT/O3CV/zltk/83a5P/M2eS/y9kkP8sYY3/K1+M/ylVgf8dQGP/FDJN/w4mPP8IFB7/BAsP/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/Eyk1/yFKYP8pZYj/Il+D/x9cgP8aWX3/G1p9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZfv8aWX3/HVp+/yBbf/8iXX//JFp5/xpA + WP8SKDn/BxAY/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BQwQ/wwa + I/8VKTb/HzpK/ylKXv8xWnP/QHOS/0d9nf9GfZ3/Rn2d/0Z9nf9Ee53/Q3mg/0B3n/84cZr/MmuU/y9q + kf80cJX/O3ib/0B+n/9FgqL/Soaj/0+Iov9ViqL/WIuj/1iLpP9YiaT/WIek/1WEo/9TgqP/UYCj/019 + of9DdZv/OW6U/zJokP8wZ4//MmmS/zRslf84b5X/OnCU/zxwk/86bpP/N2uT/zFlj/8qXon/KFyH/yZa + hP8oXYb/L2WN/zVtkv86c5f/PneZ/z95mf9AeZj/QnqY/0N6mP9DeZj/QXaV/z90lf8+c5b/PnGW/zxu + lv84apP/NmSQ/zRfkP8vV4z/JVGC/yJRf/8qWoT/LWCI/zFmi/80ao3/N26Q/zhxkP86c5H/PXWU/0B3 + lv9CeZj/QniX/0R5mP9Cd5b/QnaU/0J2lP9Ed5X/QnSU/z1tkP83Zoz/MF2G/yVTfv8dSnf/HEl2/yBO + ev8kVX//KV2E/yxkh/8vaov/MGuM/zNtj/80bo//M2yO/zRsjv8uXn7/Jk5r/x8/WP8XMUb/ECQ1/wsX + I/8DBgj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wIFB/8RJTT/HkVd/yRffv8iX4L/HVyA/xxbf/8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1l9/xpZff8cWn3/HVp+/x1Zf/8hWoD/HlJ3/xc6V/8PJTf/Bg8X/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wQH + Cf8RHib/ER4m/x01Q/8gPE3/IkFX/ypVc/8lUHD/LmSK/zRvlv85dZr/PXyd/0OBoP9JhKD/TYWf/1KG + nv9Uh5//Voig/1eHov9WhaL/U4Kh/1KBov9Pf6L/SXqf/0Bymv82a5P/L2WO/yxjjP8sZI3/MmqS/zVs + k/84bpP/OGyR/zhskf83a5L/MmaR/yxgi/8mWoX/I1iB/yddhf8tZIv/NW2T/zlylv88dpj/PniZ/0B4 + mf9CeZj/QniY/0B3lv8+dJX/PXKU/zxwlP87b5T/OWyU/zdnkv81YY//M1yN/y1ViP8hTH//HUp6/yVV + gf8xY4j/NWmM/zZsjv86cZD/PXaU/z53lf8/eJX/QHaV/0B2lf9Cd5b/RHiX/0Z6mP9FeZf/RXiW/0Z4 + lv9BcpL/PGyP/zdmjP8xYIf/KFd//x5Mdv8bSXT/Hk14/yFOdf8cQmH/H0hk/xo5Tf8XNEX/DiAr/wwa + I/8GDRH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CBIY/xAoOf8bRGH/I12B/yBc + gP8fXH//Glp9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpafv8aWX3/G1h+/xxXfv8dV37/H1R3/xpEYP8ULkH/Cxgh/wMGCP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8PHif/EB8n/xIgJ/8hOUT/J0FO/yhBTv80VGT/QWZ5/0Bkev89YXn/UICj/0t8 + of9DdZz/O26X/zNokf8tY4v/KmGJ/y1li/8yapD/NW2R/zdskf84bJH/OGyQ/zhskf80aJL/LmON/yld + h/8lWoP/JVuD/ytjif8ya5D/OHGW/zt1mP88dZf/PnaY/0B4mf9Bd5j/QHWW/z1ylf87cJP/Om+S/zls + kv83aZH/NGSO/zNejf8vWIn/KFGD/xxHef8ZRnj/IlJ//yxehf8zZ4v/N2yN/zlwj/89dZL/QHmW/0F5 + lv8+dZP/QHSU/0B1lP9EeJf/PGmE/zRbcv80W3H/M1hw/yhFXP8dNEf/GzNF/w8eKv8KFh//BxMd/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMG + CP8RISz/IEJX/yNVdf8kXYL/HVp+/x1Zff8aWX7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZ + ff8bWX7/HFl+/xxafv8hXID/I16D/yJRbv8bP1X/Fi4+/wkUGf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wsYIv8KGCL/DBki/w0a + I/8OGyT/GjFA/x03SP8dN0f/HTdH/xs1SP8ZM0f/FjFF/xQvQ/8TLkL/FTFE/yRPa/8oVHD/KlVv/ypV + b/8rVnD/Lldx/zBYc/8vV3L/LFVw/ytSbf8oT2z/KE5r/yZLaf8fO1X/Fy1E/xYrQv8SJz//DiQ8/w4l + PP8PKD//FCxB/xQqO/8NGiP/Dhsj/w8cJP8QHSX/Dx0k/wQHCf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8EBwj/EiMs/x49T/8mVW//KWSG/yRgg/8gXYH/Gll9/xtZfv8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8bWn3/HFp+/x5b + f/8eXID/JGCF/yRghf8eSmT/FzdM/xAmNP8LGSL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CA4S/xIjLf8eP0//K1ly/ytlhv8oY4T/IV2B/x1b + f/8dW37/G1p+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWn7/G1l+/xxafv8fXYD/HlyA/yVh + hf8lYYb/I1Jx/x5GX/8ZNUj/DRok/wcNEv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w8dJf8dOUn/Jk1j/ypd + ef8sZoj/Il+C/yFegP8eXH//G1p+/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Glp+/xtafv8bW37/HlyB/x9cgP8jX4T/JmGH/ytf + hP8hS2j/HTpP/xgyRv8MGCL/BQsQ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAcI/xAc + JP8dOEj/KEtb/ylYcv8waov/KWSI/yFegP8hX4H/HVt//xpafv8bWn7/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpafv8aWX3/G1p+/x1bf/8eWoD/IFuB/yBagf8hWoL/H1iA/x1J + av8ZQFr/FC9D/xAlM/8MGyP/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8CBAf/BxQe/w8mN/8YNEz/JExo/ytggf8qZYf/JWGD/yNgg/8iX4H/G1t//xpafv8bWn7/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX7/Gll9/xpZfv8aWX7/HFl+/xxafv8eXID/IF6C/yRghP8sZoj/LWiJ/yhS + bP8mT2r/GjZI/xczRv8LGSP/CRch/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/w4aI/8QISz/FzJF/xw+Vv8cRWP/IFF4/xxUfP8cVnv/HVh+/x5af/8eW3//HVyA/xpZ + ff8bWn7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/G1l+/xxaf/8aWX3/HlyA/x5cgP8gXoP/Hlx//yBdg/8fXIL/HFiA/x1Z + gf8XQ2L/GUVk/xQ1TP8VMUX/FCw+/wwaIv8NGiP/AwYI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/BAcI/xAfJf8VJy//IDtL/yNCVf8rVG7/KVJt/zBpi/8sZoj/KGKH/yNeg/8hXoL/HluA/xxZ + fv8bWX7/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8bWX7/Gll9/xtafv8aWX7/G1l//xpZff8cWn//HFp//yBdgv8eXID/I16D/yJf + g/8sZYv/K2OJ/yxhhP8iTGn/I0tq/xY0TP8RKkH/DSc//wgaLf8HEx7/CBQg/wkVIP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w4b + JP8OHCT/ECEs/xYzRv8VMkX/GT5U/x5LZv8iT2j/KGKA/y9siv8vbYv/LWyJ/yhmhv8nZIb/I1+C/x9c + gP8gXYH/Gll9/xtafv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xtZff8aWX3/G1p+/xpZff8cWn7/G1p//x5cgP8dWn//HlqA/x1Y + fv8aVn3/GFN7/xhSev8bVH3/HVZ9/yNdg/8lX4X/KGOI/yRUcf8kT2v/JVBr/yZRbf8mUWv/GjVI/xg0 + Rv8YMkX/FjBE/xYwRP8MGCL/DBkj/w0ZI/8MGST/DRkk/wsYI/8KFiH/CBYg/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AwYI/wwZIv8MGCL/Chcg/wkWH/8HFB7/BxMc/wYSHP8IGCX/DSg8/w0nPP8QLD//Ei5B/x9J + Yv8gSmP/IUxm/yJOaP8sY4H/LGeJ/y5oiv8pZYj/J2SG/yZjhv8iXoP/IF6C/x5cgP8eXID/HVx//xxb + f/8dXH//Gll9/x1bfv8aWX3/Gll9/xpZfv8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZ + ff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/Gll9/xpZff8aWX3/ + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter23/ShapedForms/bin/Debug/ShapedForms.exe b/Pro Windows Forms 2.0/Chapter23/ShapedForms/bin/Debug/ShapedForms.exe new file mode 100644 index 0000000..f98f07f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter23/ShapedForms/bin/Debug/ShapedForms.exe differ diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.csproj b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.csproj new file mode 100644 index 0000000..2e0b159 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.csproj @@ -0,0 +1,74 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {4B88ECEA-4EFC-463E-BC38-152F3C68477F} + WinExe + Properties + DrawingShapes + DrawingShapes_Controls + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + DrawingSurface.cs + + + + + DrawingSurface.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Component + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.csproj.user b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.sln b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.sln new file mode 100644 index 0000000..e9730e4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DrawingShapes_Controls", "DrawingShapes_Controls.csproj", "{4B88ECEA-4EFC-463E-BC38-152F3C68477F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4B88ECEA-4EFC-463E-BC38-152F3C68477F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B88ECEA-4EFC-463E-BC38-152F3C68477F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B88ECEA-4EFC-463E-BC38-152F3C68477F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B88ECEA-4EFC-463E-BC38-152F3C68477F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.suo b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.suo new file mode 100644 index 0000000..5a3c080 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingShapes_Controls.suo differ diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingSurface.Designer.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingSurface.Designer.cs new file mode 100644 index 0000000..fc11a17 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingSurface.Designer.cs @@ -0,0 +1,146 @@ +namespace DrawingShapes +{ + partial class DrawingSurface + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.mnuSelectShape = new System.Windows.Forms.ContextMenuStrip(this.components); + this.mnuColor = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuRemoveShape = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuBringToFront = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuSendToBack = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuInsertShape = new System.Windows.Forms.ContextMenuStrip(this.components); + this.mnuRectangle = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEllipse = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuTriangle = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuSelectShape.SuspendLayout(); + this.mnuInsertShape.SuspendLayout(); + this.SuspendLayout(); + // + // mnuSelectShape + // + this.mnuSelectShape.AllowDrop = true; + this.mnuSelectShape.Enabled = true; + this.mnuSelectShape.GripMargin = new System.Windows.Forms.Padding(2); + this.mnuSelectShape.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuColor, + this.mnuRemoveShape, + this.mnuBringToFront, + this.mnuSendToBack}); + this.mnuSelectShape.Location = new System.Drawing.Point(25, 66); + this.mnuSelectShape.Name = "contextMenuStrip1"; + this.mnuSelectShape.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.mnuSelectShape.Size = new System.Drawing.Size(153, 111); + this.mnuSelectShape.Visible = true; + // + // mnuColor + // + this.mnuColor.Name = "mnuColor"; + this.mnuColor.Text = "Change Color"; + this.mnuColor.Click += new System.EventHandler(this.mnuColorChange_Click); + // + // mnuRemoveShape + // + this.mnuRemoveShape.Name = "mnuRemoveShape"; + this.mnuRemoveShape.Text = "Remove Shape"; + this.mnuRemoveShape.Click += new System.EventHandler(this.mnuRemoveShape_Click); + // + // mnuBringToFront + // + this.mnuBringToFront.Name = "mnuBringToFront"; + this.mnuBringToFront.Text = "Bring to Front"; + this.mnuBringToFront.Click += new System.EventHandler(this.mnuBringToFront_Click); + // + // mnuSendToBack + // + this.mnuSendToBack.Name = "mnuSendToBack"; + this.mnuSendToBack.Text = "Send To Back"; + this.mnuSendToBack.Click += new System.EventHandler(this.mnuSendToBack_Click); + // + // mnuInsertShape + // + this.mnuInsertShape.AllowDrop = true; + this.mnuInsertShape.Enabled = true; + this.mnuInsertShape.GripMargin = new System.Windows.Forms.Padding(2); + this.mnuInsertShape.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuRectangle, + this.mnuEllipse, + this.mnuTriangle}); + this.mnuInsertShape.Location = new System.Drawing.Point(25, 66); + this.mnuInsertShape.Name = "contextMenuStrip1"; + this.mnuInsertShape.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.mnuInsertShape.Size = new System.Drawing.Size(172, 70); + // + // mnuRectangle + // + this.mnuRectangle.Name = "mnuRectangle"; + this.mnuRectangle.Text = "Create New Rectangle"; + this.mnuRectangle.Click += new System.EventHandler(this.mnuNewShape_Click); + // + // mnuEllipse + // + this.mnuEllipse.Name = "mnuEllipse"; + this.mnuEllipse.Text = "Create New Ellipse"; + this.mnuEllipse.Click += new System.EventHandler(this.mnuNewShape_Click); + // + // mnuTriangle + // + this.mnuTriangle.Name = "mnuTriangle"; + this.mnuTriangle.Text = "Create New Triangle"; + this.mnuTriangle.Click += new System.EventHandler(this.mnuNewShape_Click); + // + // DrawingSurface + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(465, 381); + this.ContextMenuStrip = this.mnuInsertShape; + this.Name = "DrawingSurface"; + this.Text = "Drawing Shapes"; + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DrawingSurface_MouseDown); + this.mnuSelectShape.ResumeLayout(false); + this.mnuInsertShape.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ContextMenuStrip mnuSelectShape; + private System.Windows.Forms.ToolStripMenuItem mnuColor; + private System.Windows.Forms.ToolStripMenuItem mnuRemoveShape; + private System.Windows.Forms.ToolStripMenuItem mnuBringToFront; + private System.Windows.Forms.ToolStripMenuItem mnuSendToBack; + private System.Windows.Forms.ContextMenuStrip mnuInsertShape; + private System.Windows.Forms.ToolStripMenuItem mnuRectangle; + private System.Windows.Forms.ToolStripMenuItem mnuEllipse; + private System.Windows.Forms.ToolStripMenuItem mnuTriangle; + + } +} + diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingSurface.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingSurface.cs new file mode 100644 index 0000000..e344c50 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingSurface.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DrawingShapes +{ + public partial class DrawingSurface : Form + { + public DrawingSurface() + { + InitializeComponent(); + } + + private void mnuNewShape_Click(object sender, System.EventArgs e) + { + // Create and configure the shape with some defaults. + Shape newShape = new Shape(); + newShape.Size = new Size(40, 40); + newShape.ForeColor = Color.Coral; + + // Configure the appropriate shape depending on the menu option selected. + if (sender == mnuRectangle) + { + newShape.Type = Shape.ShapeType.Rectangle; + } + else if (sender == mnuEllipse) + { + newShape.Type = Shape.ShapeType.Ellipse; + } + else if (sender == mnuTriangle) + { + newShape.Type = Shape.ShapeType.Triangle; + } + + // To determine where to place the shape, you need to convert the + // current screen-based mouse coordinates into relative form coordinates. + newShape.Location = this.PointToClient(Control.MousePosition); + + // Attach a context menu to the shape. + newShape.ContextMenuStrip = mnuSelectShape; + + // Connect the shape to all its event handlers. + newShape.MouseDown += new MouseEventHandler(ctrl_MouseDown); + newShape.MouseMove += new MouseEventHandler(ctrl_MouseMove); + newShape.MouseUp += new MouseEventHandler(ctrl_MouseUp); + + // Add the shape to the form. + this.Controls.Add(newShape); + } + + // Keep track of when drag or resize mode is enabled. + private bool isDragging = false; + private bool isResizing = false; + + // Store the location where the user clicked on the control. + private int clickOffsetX, clickOffsetY; + + private void ctrl_MouseDown(object sender, + System.Windows.Forms.MouseEventArgs e) + { + // Retrieve a reference to the active label. + Control currentCtrl; + currentCtrl = (Control)sender; + + // Required for the focus rectangle. + ctrlToFocus = currentCtrl; + // Invalidate to show the focus rectangle. + Invalidate(); + + if (e.Button == MouseButtons.Right) + { + // Show the context menu. + currentCtrl.ContextMenuStrip.Show(currentCtrl, new Point(e.X, e.Y)); + } + else if (e.Button == MouseButtons.Left) + { + clickOffsetX = e.X; + clickOffsetY = e.Y; + + if (currentCtrl.Cursor == Cursors.SizeNWSE || + currentCtrl.Cursor == Cursors.SizeNS || + currentCtrl.Cursor == Cursors.SizeWE) + { + // The mouse pointer is at one of the sides, + // so resizing mode is appropriate. + isResizing = true; + } + else + { + // The mouse is somewhere else, so dragging mode is + // appropriate. + isDragging = true; + } + } + } + + private void ctrl_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) + { + // Retrieve a reference to the active shape. + Control currentCtrl; + currentCtrl = (Control)sender; + + if (isDragging) + { + // Move the control. + currentCtrl.Left = e.X + currentCtrl.Left - clickOffsetX; + currentCtrl.Top = e.Y + currentCtrl.Top - clickOffsetY; + } + else if (isResizing) + { + // Resize the control, according to the resize mode. + if (currentCtrl.Cursor == Cursors.SizeNWSE) + { + currentCtrl.Width = e.X; + currentCtrl.Height = e.Y; + } + else if (currentCtrl.Cursor == Cursors.SizeNS) + { + currentCtrl.Height = e.Y; + } + else if (currentCtrl.Cursor == Cursors.SizeWE) + { + currentCtrl.Width = e.X; + } + } + else + { + // Change the cursor if the mouse pointer is on one of the edges + // of the control. + if (((e.X + 5) > currentCtrl.Width) && + ((e.Y + 5) > currentCtrl.Height)) + { + currentCtrl.Cursor = Cursors.SizeNWSE; + } + else if ((e.X + 5) > currentCtrl.Width) + { + currentCtrl.Cursor = Cursors.SizeWE; + } + else if ((e.Y + 5) > currentCtrl.Height) + { + currentCtrl.Cursor = Cursors.SizeNS; + } + else + { + // This misleadingly named cursor is the four-way + // mouse pointer often used for moving objects. + currentCtrl.Cursor = Cursors.SizeAll; + } + } + } + + private void ctrl_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) + { + isDragging = false; + isResizing = false; + + // Invalidate to show the focus rectangle. + Invalidate(); + } + + private void mnuColorChange_Click(object sender, System.EventArgs e) + { + // Show color dialog. + ColorDialog dlgColor = new ColorDialog(); + if (dlgColor.ShowDialog() == DialogResult.OK) + { + // Change shape background. + mnuSelectShape.SourceControl.BackColor = dlgColor.Color; + } + } + + private void DrawingSurface_MouseDown(object sender, MouseEventArgs e) + { + if (ctrlToFocus != null) + { + ctrlToFocus = null; + Invalidate(); + } + if (e.Button == MouseButtons.Right) + { + this.ContextMenuStrip.Show(this, new Point(e.X, e.Y)); + } + } + + private Control ctrlToFocus; + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + if (ctrlToFocus != null && !isDragging) + { + Rectangle rect = ctrlToFocus.Bounds; + rect.Inflate(new Size(2, 2)); + ControlPaint.DrawFocusRectangle(e.Graphics, rect); + } + } + + private void mnuRemoveShape_Click(object sender, System.EventArgs e) + { + Control ctrlShape = mnuSelectShape.SourceControl; + this.Controls.Remove(ctrlShape); + } + + private void mnuBringToFront_Click(object sender, EventArgs e) + { + Control ctrlShape = mnuSelectShape.SourceControl; + ctrlShape.BringToFront(); + } + + private void mnuSendToBack_Click(object sender, EventArgs e) + { + Control ctrlShape = mnuSelectShape.SourceControl; + ctrlShape.SendToBack(); + } + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingSurface.resx b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingSurface.resx new file mode 100644 index 0000000..86432a8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/DrawingSurface.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 14, 17 + + + 158, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Program.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Program.cs new file mode 100644 index 0000000..0ed23f8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DrawingShapes +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new DrawingSurface()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..84a2e32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DrawingShapes")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DrawingShapes")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("674a3d29-d8b6-489a-8894-594167c30192")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Resources.Designer.cs new file mode 100644 index 0000000..a797d3b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Resources.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DrawingShapes.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DrawingShapes.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DrawingShapes.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] + +namespace DrawingShapes.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DrawingShapes.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Settings.Designer.cs new file mode 100644 index 0000000..3475788 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Settings.Designer.cs @@ -0,0 +1,31 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "DrawingShapes.Properties.Settings.get_Default():DrawingShapes.Properties.Settings")] + +namespace DrawingShapes.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = new Settings(); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Shape.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Shape.cs new file mode 100644 index 0000000..22ef446 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/Shape.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing.Drawing2D; +using System.Drawing; + +namespace DrawingShapes +{ + public class Shape : System.Windows.Forms.Control + { + // The types of shapes supported by this control. + public enum ShapeType + { + Rectangle, Ellipse, Triangle + } + + // The current shape. + private ShapeType shape = ShapeType.Rectangle; + private GraphicsPath path = null; + public ShapeType Type + { + get { return shape; } + set + { + shape = value; + RefreshPath(); + this.Invalidate(); + } + } + + // Create the corresponding GraphicsPath for the shape, and apply + // it to the control by setting the Region property. + private void RefreshPath() + { + if (path != null) path.Dispose(); + path = new GraphicsPath(); + switch (shape) + { + case ShapeType.Rectangle: + path.AddRectangle(this.ClientRectangle); + break; + case ShapeType.Ellipse: + path.AddEllipse(this.ClientRectangle); + break; + case ShapeType.Triangle: + Point pt1 = new Point(this.Width / 2, 0); + Point pt2 = new Point(0, this.Height); + Point pt3 = new Point(this.Width, this.Height); + path.AddPolygon(new Point[] { pt1, pt2, pt3 }); + break; + } + this.Region = new Region(path); + } + + + protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) + { + base.OnPaint(e); + if (path != null) + { + SolidBrush shapeBrush = new SolidBrush(this.BackColor); + Pen shapePen = new Pen(this.ForeColor, 4); + + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + e.Graphics.FillPath(shapeBrush, path); + e.Graphics.DrawPath(shapePen, path); + + shapePen.Dispose(); + shapeBrush.Dispose(); + } + } + + protected override void OnResize(System.EventArgs e) + { + base.OnResize(e); + RefreshPath(); + this.Invalidate(); + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/bin/Debug/DrawingShapes_Controls.exe b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/bin/Debug/DrawingShapes_Controls.exe new file mode 100644 index 0000000..b1588a1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_Controls/bin/Debug/DrawingShapes_Controls.exe differ diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/App.ico b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.csproj b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.csproj new file mode 100644 index 0000000..e8c7bde --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.csproj @@ -0,0 +1,125 @@ + + + Local + 8.0.50727 + 2.0 + {0226B012-028E-4F6D-8720-E7DFC1726B0E} + Debug + AnyCPU + App.ico + + + DrawingShapes + + + JScript + Grid + IE50 + false + WinExe + DrawingShapes + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + Form + + + DrawingSurface.cs + + + + True + True + Resources.resx + + + + + + + Designer + DrawingSurface.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + Shape.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.csproj.user b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.csproj.user new file mode 100644 index 0000000..7562390 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.sln b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.sln new file mode 100644 index 0000000..fa72068 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DrawingShapes", "DrawingShapes.csproj", "{0226B012-028E-4F6D-8720-E7DFC1726B0E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0226B012-028E-4F6D-8720-E7DFC1726B0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0226B012-028E-4F6D-8720-E7DFC1726B0E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0226B012-028E-4F6D-8720-E7DFC1726B0E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0226B012-028E-4F6D-8720-E7DFC1726B0E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.suo b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.suo new file mode 100644 index 0000000..da8fa4f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingShapes.suo differ diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingSurface.Designer.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingSurface.Designer.cs new file mode 100644 index 0000000..bce409e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingSurface.Designer.cs @@ -0,0 +1,369 @@ +namespace DrawingShapes +{ + partial class DrawingSurface + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DrawingSurface)); + this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); + this.toolStrip2 = new System.Windows.Forms.ToolStrip(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.cmdDelete = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton3 = new System.Windows.Forms.ToolStripButton(); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.newToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.openToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.saveToolStripButton = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.cmdRectangle = new System.Windows.Forms.ToolStripButton(); + this.cmdEllipse = new System.Windows.Forms.ToolStripButton(); + this.cmdTriangle = new System.Windows.Forms.ToolStripButton(); + this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); + this.mnuForm = new System.Windows.Forms.ContextMenuStrip(this.components); + this.mnuRectangle = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuEllipse = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuTriangle = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.newDrawingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveDrawingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.loadDrawingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mnuShape = new System.Windows.Forms.ContextMenuStrip(this.components); + this.changeColorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeShapeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bringToFrontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sendToBackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStrip2.SuspendLayout(); + this.toolStrip1.SuspendLayout(); + this.mnuForm.SuspendLayout(); + this.mnuShape.SuspendLayout(); + this.SuspendLayout(); + // + // toolStrip2 + // + this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButton1, + this.cmdDelete, + this.toolStripSeparator, + this.toolStripButton2, + this.toolStripButton3}); + this.toolStrip2.Location = new System.Drawing.Point(0, 25); + this.toolStrip2.Name = "toolStrip2"; + this.toolStrip2.Size = new System.Drawing.Size(567, 25); + this.toolStrip2.TabIndex = 3; + this.toolStrip2.Text = "toolStrip2"; + // + // toolStripButton1 + // + this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(76, 22); + this.toolStripButton1.Text = "Change Color"; + this.toolStripButton1.Click += new System.EventHandler(this.mnuColorChange_Click); + // + // cmdDelete + // + this.cmdDelete.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.cmdDelete.Image = ((System.Drawing.Image)(resources.GetObject("cmdDelete.Image"))); + this.cmdDelete.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cmdDelete.Name = "cmdDelete"; + this.cmdDelete.Size = new System.Drawing.Size(50, 22); + this.cmdDelete.Text = "Remove"; + this.cmdDelete.Click += new System.EventHandler(this.mnuRemoveShape_Click); + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + this.toolStripSeparator.Size = new System.Drawing.Size(6, 25); + // + // toolStripButton2 + // + this.toolStripButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); + this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton2.Name = "toolStripButton2"; + this.toolStripButton2.Size = new System.Drawing.Size(52, 22); + this.toolStripButton2.Text = "To Front"; + this.toolStripButton2.Click += new System.EventHandler(this.mnuToFront_Click); + // + // toolStripButton3 + // + this.toolStripButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image"))); + this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton3.Name = "toolStripButton3"; + this.toolStripButton3.Size = new System.Drawing.Size(48, 22); + this.toolStripButton3.Text = "To Back"; + this.toolStripButton3.Click += new System.EventHandler(this.mnuToBack_Click); + // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripButton, + this.openToolStripButton, + this.saveToolStripButton, + this.toolStripSeparator1, + this.cmdRectangle, + this.cmdEllipse, + this.cmdTriangle}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(567, 25); + this.toolStrip1.TabIndex = 2; + this.toolStrip1.Text = "toolStrip1"; + // + // newToolStripButton + // + this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image"))); + this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripButton.Name = "newToolStripButton"; + this.newToolStripButton.Size = new System.Drawing.Size(23, 22); + this.newToolStripButton.Text = "&New"; + this.newToolStripButton.Click += new System.EventHandler(this.mnuNew_Click); + // + // openToolStripButton + // + this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image"))); + this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripButton.Name = "openToolStripButton"; + this.openToolStripButton.Size = new System.Drawing.Size(23, 22); + this.openToolStripButton.Text = "&Open"; + this.openToolStripButton.Click += new System.EventHandler(this.mnuLoad_Click); + // + // saveToolStripButton + // + this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image"))); + this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripButton.Name = "saveToolStripButton"; + this.saveToolStripButton.Size = new System.Drawing.Size(23, 22); + this.saveToolStripButton.Text = "&Save"; + this.saveToolStripButton.Click += new System.EventHandler(this.mnuSave_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + // + // cmdRectangle + // + this.cmdRectangle.Image = ((System.Drawing.Image)(resources.GetObject("cmdRectangle.Image"))); + this.cmdRectangle.ImageTransparentColor = System.Drawing.Color.White; + this.cmdRectangle.Name = "cmdRectangle"; + this.cmdRectangle.Size = new System.Drawing.Size(75, 22); + this.cmdRectangle.Text = "Rectangle"; + this.cmdRectangle.Click += new System.EventHandler(this.mnuNewShape_Click); + // + // cmdEllipse + // + this.cmdEllipse.Image = ((System.Drawing.Image)(resources.GetObject("cmdEllipse.Image"))); + this.cmdEllipse.ImageTransparentColor = System.Drawing.Color.White; + this.cmdEllipse.Name = "cmdEllipse"; + this.cmdEllipse.Size = new System.Drawing.Size(56, 22); + this.cmdEllipse.Text = "Ellipse"; + this.cmdEllipse.Click += new System.EventHandler(this.mnuNewShape_Click); + // + // cmdTriangle + // + this.cmdTriangle.Image = ((System.Drawing.Image)(resources.GetObject("cmdTriangle.Image"))); + this.cmdTriangle.ImageTransparentColor = System.Drawing.Color.White; + this.cmdTriangle.Name = "cmdTriangle"; + this.cmdTriangle.Size = new System.Drawing.Size(65, 22); + this.cmdTriangle.Text = "Triangle"; + this.cmdTriangle.Click += new System.EventHandler(this.mnuNewShape_Click); + // + // mnuForm + // + this.mnuForm.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.mnuRectangle, + this.mnuEllipse, + this.mnuTriangle, + this.toolStripSeparator2, + this.newDrawingToolStripMenuItem, + this.saveDrawingToolStripMenuItem, + this.loadDrawingToolStripMenuItem}); + this.mnuForm.Name = "mnuForm"; + this.mnuForm.Size = new System.Drawing.Size(192, 142); + // + // mnuRectangle + // + this.mnuRectangle.Name = "mnuRectangle"; + this.mnuRectangle.Size = new System.Drawing.Size(191, 22); + this.mnuRectangle.Text = "Create New Rectange"; + this.mnuRectangle.Click += new System.EventHandler(this.mnuNewShape_Click); + // + // mnuEllipse + // + this.mnuEllipse.Name = "mnuEllipse"; + this.mnuEllipse.Size = new System.Drawing.Size(191, 22); + this.mnuEllipse.Text = "Create New Ellipse"; + this.mnuEllipse.Click += new System.EventHandler(this.mnuNewShape_Click); + // + // mnuTriangle + // + this.mnuTriangle.Name = "mnuTriangle"; + this.mnuTriangle.Size = new System.Drawing.Size(191, 22); + this.mnuTriangle.Text = "Create New Triangle"; + this.mnuTriangle.Click += new System.EventHandler(this.mnuNewShape_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(188, 6); + // + // newDrawingToolStripMenuItem + // + this.newDrawingToolStripMenuItem.Name = "newDrawingToolStripMenuItem"; + this.newDrawingToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.newDrawingToolStripMenuItem.Text = "New Drawing"; + this.newDrawingToolStripMenuItem.Click += new System.EventHandler(this.mnuNew_Click); + // + // saveDrawingToolStripMenuItem + // + this.saveDrawingToolStripMenuItem.Name = "saveDrawingToolStripMenuItem"; + this.saveDrawingToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.saveDrawingToolStripMenuItem.Text = "Save Drawing"; + this.saveDrawingToolStripMenuItem.Click += new System.EventHandler(this.mnuSave_Click); + // + // loadDrawingToolStripMenuItem + // + this.loadDrawingToolStripMenuItem.Name = "loadDrawingToolStripMenuItem"; + this.loadDrawingToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.loadDrawingToolStripMenuItem.Text = "Load Drawing"; + this.loadDrawingToolStripMenuItem.Click += new System.EventHandler(this.mnuLoad_Click); + // + // mnuShape + // + this.mnuShape.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.changeColorToolStripMenuItem, + this.removeShapeToolStripMenuItem, + this.toolStripSeparator3, + this.bringToFrontToolStripMenuItem, + this.sendToBackToolStripMenuItem}); + this.mnuShape.Name = "mnuShape"; + this.mnuShape.Size = new System.Drawing.Size(158, 98); + // + // changeColorToolStripMenuItem + // + this.changeColorToolStripMenuItem.Name = "changeColorToolStripMenuItem"; + this.changeColorToolStripMenuItem.Size = new System.Drawing.Size(157, 22); + this.changeColorToolStripMenuItem.Text = "Change Color"; + this.changeColorToolStripMenuItem.Click += new System.EventHandler(this.mnuColorChange_Click); + // + // removeShapeToolStripMenuItem + // + this.removeShapeToolStripMenuItem.Name = "removeShapeToolStripMenuItem"; + this.removeShapeToolStripMenuItem.Size = new System.Drawing.Size(157, 22); + this.removeShapeToolStripMenuItem.Text = "Remove Shape"; + this.removeShapeToolStripMenuItem.Click += new System.EventHandler(this.mnuRemoveShape_Click); + // + // bringToFrontToolStripMenuItem + // + this.bringToFrontToolStripMenuItem.Name = "bringToFrontToolStripMenuItem"; + this.bringToFrontToolStripMenuItem.Size = new System.Drawing.Size(157, 22); + this.bringToFrontToolStripMenuItem.Text = "Bring To Front"; + this.bringToFrontToolStripMenuItem.Click += new System.EventHandler(this.mnuToFront_Click); + // + // sendToBackToolStripMenuItem + // + this.sendToBackToolStripMenuItem.Name = "sendToBackToolStripMenuItem"; + this.sendToBackToolStripMenuItem.Size = new System.Drawing.Size(157, 22); + this.sendToBackToolStripMenuItem.Text = "Send To Back"; + this.sendToBackToolStripMenuItem.Click += new System.EventHandler(this.mnuToBack_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(154, 6); + // + // DrawingSurface + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.White; + this.ClientSize = new System.Drawing.Size(567, 431); + this.Controls.Add(this.toolStrip2); + this.Controls.Add(this.toolStrip1); + this.Name = "DrawingSurface"; + this.Text = "Drawing Shapes"; + this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form_Paint); + this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form_MouseUp); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form_MouseMove); + this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form_MouseDown); + this.Load += new System.EventHandler(this.Form1_Load); + this.toolStrip2.ResumeLayout(false); + this.toolStrip2.PerformLayout(); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.mnuForm.ResumeLayout(false); + this.mnuShape.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.SaveFileDialog saveFileDialog; + private System.Windows.Forms.ToolStrip toolStrip2; + private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.ToolStripButton cmdDelete; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator; + private System.Windows.Forms.ToolStripButton toolStripButton2; + private System.Windows.Forms.ToolStripButton toolStripButton3; + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton newToolStripButton; + private System.Windows.Forms.ToolStripButton openToolStripButton; + private System.Windows.Forms.ToolStripButton saveToolStripButton; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton cmdRectangle; + private System.Windows.Forms.ToolStripButton cmdEllipse; + private System.Windows.Forms.ToolStripButton cmdTriangle; + private System.Windows.Forms.OpenFileDialog openFileDialog; + private System.Windows.Forms.ContextMenuStrip mnuForm; + private System.Windows.Forms.ToolStripMenuItem mnuRectangle; + private System.Windows.Forms.ToolStripMenuItem mnuEllipse; + private System.Windows.Forms.ToolStripMenuItem mnuTriangle; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem newDrawingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveDrawingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem loadDrawingToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip mnuShape; + private System.Windows.Forms.ToolStripMenuItem changeColorToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeShapeToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem bringToFrontToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem sendToBackToolStripMenuItem; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingSurface.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingSurface.cs new file mode 100644 index 0000000..d6ad2ad --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingSurface.cs @@ -0,0 +1,376 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Drawing.Drawing2D; +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; + +namespace DrawingShapes +{ + public partial class DrawingSurface : Form + { + public DrawingSurface() + { + InitializeComponent(); + } + + + private void Form_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) + { + // Check for a hit on a focus square. + Shape.HitSpot hitSpot; + if ((currentShape != null) && (currentShape.Selected) && + (currentShape.HitTestFocusBorder(new Point(e.X, e.Y), out hitSpot))) + { + // The border was clicked. Turn on resize mode. + clickOffsetX = e.X - currentShape.Location.X; + clickOffsetY = e.Y - currentShape.Location.Y; + isResizing = true; + } + else + { + // Remove the last selected shape. + ClearSelectedShape(); + + // Retrieve a reference to the selected shape + // using hit testing. + currentShape = shapes.HitTest(new Point(e.X, e.Y)); + + if (currentShape == null) + { + // No shape was clicked. + // Depending on the mouse button, show a menu. + if (e.Button == MouseButtons.Right) + { + mnuForm.Show(this, new Point(e.X, e.Y)); + } + } + else + { + // Select the new shape and refresh the form. + currentShape.Selected = true; + + // Make sure the display is updated to reflect + // newly selected or de-selected shapes. + //Invalidate(); + Invalidate(currentShape.GetLargestPossibleRegion()); + + // Check what action should be performed with the + // shape, depending on the mouse button that was clicked. + if (e.Button == MouseButtons.Right) + { + // Show the context menu. + mnuShape.Show(this, new Point(e.X, e.Y)); + } + else if (e.Button == MouseButtons.Left) + { + // Start dragging mode. + clickOffsetX = e.X - currentShape.Location.X; + clickOffsetY = e.Y - currentShape.Location.Y; + isDragging = true; + } + } + + } + } + + private void mnuNewShape_Click(object sender, System.EventArgs e) + { + // Create and configure the shape with some defaults. + Shape newShape = null; + // Configure the appropriate shape depending on the menu option selected. + if (sender == mnuRectangle || sender == cmdRectangle) + { + newShape = new RectangleShape(); + } + else if (sender == mnuEllipse || sender == cmdEllipse) + { + newShape = new EllipseShape(); + } + else if (sender == mnuTriangle || sender == cmdTriangle) + { + newShape = new TriangleShape(); + } + else + { + throw new ApplicationException("Not a valid shape command."); + } + + newShape.Size = new Size(40, 40); + newShape.ForeColor = Color.Coral; + + if (sender is ToolStripButton) + { + newShape.Location = new Point(150, 100); + } + else + { + // To determine where to place the shape, you need to convert the + // current screen-based mouse coordinates into relative form coordinates. + newShape.Location = PointToClient(Control.MousePosition); + } + + // Remove the last selected shape. + ClearSelectedShape(); + currentShape = newShape; + currentShape.Selected = true; + + // Add the shape to the form and trigger a refresh. + shapes.Add(newShape); + Invalidate(newShape.GetLargestPossibleRegion()); + } + + + // Keep track of when drag or resize mode is enabled. + private bool isDragging = false; + private bool isResizing = false; + private Shape.HitSpot resizingMode; + + // Store the location where the user clicked on the control. + private int clickOffsetX, clickOffsetY; + + // Store the selected shape. + private Shape currentShape; + + + private void mnuColorChange_Click(object sender, System.EventArgs e) + { + if (currentShape == null) return; + // Show color dialog. + ColorDialog dlgColor = new ColorDialog(); + if (dlgColor.ShowDialog() == DialogResult.OK) + { + + // Change shape background. + currentShape.BackColor = dlgColor.Color; + Invalidate(currentShape.Region); + } + } + + + private void mnuRemoveShape_Click(object sender, System.EventArgs e) + { + if (currentShape == null) return; + shapes.Remove(currentShape); + //Invalidate(currentShape.GetLargestPossibleRegion()); + ClearSelectedShape(); + } + + private void mnuToFront_Click(object sender, EventArgs e) + { + if (currentShape == null) return; + shapes.BringShapeToFront(currentShape); + Invalidate(currentShape.GetLargestPossibleRegion()); + } + + private void mnuToBack_Click(object sender, EventArgs e) + { + if (currentShape == null) return; + shapes.SendShapeToBack(currentShape); + Invalidate(currentShape.GetLargestPossibleRegion()); + } + + private ShapeCollection shapes = new ShapeCollection(); + + private void Form_Paint(object sender, PaintEventArgs e) + { + Graphics g = e.Graphics; + g.SmoothingMode = SmoothingMode.AntiAlias; + g.Clear(Color.White); + shapes.ReverseSort(); + foreach (Shape shape in shapes) + { + if (e.ClipRectangle.IntersectsWith(shape.GetLargestPossibleRegion())) + { + shape.Render(g); + } + } + } + + private void Form_MouseMove(object sender, MouseEventArgs e) + { + if (isDragging) + { + Rectangle oldPosition = currentShape.GetLargestPossibleRegion(); + currentShape.Location = new Point(e.X - clickOffsetX, e.Y - clickOffsetY); + + Rectangle newPosition = currentShape.GetLargestPossibleRegion(); + //Invalidate(); + Invalidate(Rectangle.Union(oldPosition, newPosition)); + } + else if (isResizing) + { + int minSize = 5; + + // Keep track of the old size. Useful + // for invalidating when NOT double-buffering. + Rectangle oldPosition = currentShape.GetLargestPossibleRegion(); + + // Resize the control, according to the resize mode. + switch (resizingMode) + { + case Shape.HitSpot.Top: + case Shape.HitSpot.TopRightCorner: + if (e.Y < (currentShape.Location.Y + currentShape.Size.Height - minSize)) + { + currentShape.Size = new Size(currentShape.Size.Width, + currentShape.Location.Y + currentShape.Size.Height - (e.Y - clickOffsetY)); + currentShape.Location = new Point(currentShape.Location.X, e.Y - clickOffsetY); + } + break; + case Shape.HitSpot.Bottom: + if (e.Y > (currentShape.Location.Y + minSize)) + { + currentShape.Size = new Size(currentShape.Size.Width, e.Y - currentShape.Location.Y); + } + break; + case Shape.HitSpot.Left: + case Shape.HitSpot.BottomLeftCorner: + case Shape.HitSpot.TopLeftCorner: + if (e.X < (currentShape.Location.X + currentShape.Size.Width - minSize)) + { + currentShape.Size = new Size((currentShape.Location.X + currentShape.Size.Width) - (e.X - clickOffsetX), currentShape.Size.Height); + currentShape.Location = new Point(e.X - clickOffsetX, currentShape.Location.Y); + } + break; + case Shape.HitSpot.Right: + if (e.X > (currentShape.Location.X + minSize)) + { + currentShape.Size = new Size(e.X - currentShape.Location.X, currentShape.Size.Height); + } + break; + case Shape.HitSpot.BottomRightCorner: + if (e.Y > (currentShape.Location.Y + minSize)) + { + currentShape.Size = new Size(currentShape.Size.Width, e.Y - currentShape.Location.Y); + } + if (e.X > (currentShape.Location.X + minSize)) + { + currentShape.Size = new Size(e.X - currentShape.Location.X, currentShape.Size.Height); + } + break; + } + + // Invalidate() + // Find the largest invalidate area for NO double buffer scenario. + Rectangle newPosition = currentShape.GetLargestPossibleRegion(); + Invalidate(Rectangle.Union(oldPosition, newPosition)); + } + else + { + if ((currentShape != null) && (currentShape.Selected) + && (currentShape.HitTestFocusBorder(new Point(e.X, e.Y), out resizingMode))) + { + switch (resizingMode) + { + case Shape.HitSpot.Top: + case Shape.HitSpot.Bottom: + case Shape.HitSpot.TopRightCorner: + Cursor = Cursors.SizeNS; + break; + case Shape.HitSpot.Left: + case Shape.HitSpot.Right: + case Shape.HitSpot.BottomLeftCorner: + case Shape.HitSpot.TopLeftCorner: + Cursor = Cursors.SizeWE; + break; + case Shape.HitSpot.BottomRightCorner: + Cursor = Cursors.SizeNWSE; + break; + default: + Cursor = Cursors.Arrow; + break; + } + } + else + { + Cursor = Cursors.Arrow; + } + } + } + + private void Form_MouseUp(object sender, MouseEventArgs e) + { + isDragging = false; + isResizing = false; + } + + + + private void ClearSelectedShape() + { + if (currentShape != null) + { + currentShape.Selected = false; + + // Make sure the display is updated to reflect + // newly de-selected shape. + // Only use if NO double-buffering. + Invalidate(currentShape.GetLargestPossibleRegion()); + } + currentShape = null; + } + + private void Form1_Load(object sender, EventArgs e) + { + } + + private void mnuSave_Click(object sender, EventArgs e) + { + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + try + { + using (FileStream fs = + File.Create(saveFileDialog.FileName)) + { + BinaryFormatter f = new BinaryFormatter(); + f.Serialize(fs, shapes); + } + } + catch (Exception err) + { + MessageBox.Show("Error while saving. " + err.Message); + } + } + } + + private void mnuLoad_Click(object sender, EventArgs e) + { + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + ShapeCollection newShapes = null; + try + { + using (FileStream fs = + File.Open(openFileDialog.FileName, FileMode.Open)) + { + BinaryFormatter f = new BinaryFormatter(); + newShapes = (ShapeCollection)f.Deserialize(fs, null); + } + } + catch (Exception err) + { + MessageBox.Show("Error while loading. " + err.Message); + } + + // Trigger a refresh. + shapes = newShapes; + Invalidate(); + } + } + + private void mnuNew_Click(object sender, EventArgs e) + { + shapes.Clear(); + Invalidate(); + } + + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingSurface.resx b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingSurface.resx new file mode 100644 index 0000000..ef1f98d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/DrawingSurface.resx @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 27, 25 + + + 149, 25 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAkVJREFUOE+tk11I + k3EUxr2MCMILI+hiYRFBYYotIwnNpHKQZh8XFrhMFLFQrNSpM0ONJvOrgaK+pfk5K9M5w+X6YosJU9DN + XjYLmlEiCM4uIii2+bTzD/2/BGFgLxzeq+d3nnPO8w8J+R9f82M7pKXrG4f2oRXVba+g1j3HDa0RuVUD + uFKmx6XCLpzPb8eZqwLWepPY58df6/sPwPttBfPeFXxYCGB6LoC9J2//G2BJdMN9OQqiMhIzNpGJu00e + 7DlRsT6AOpMY82P4+fo6Js/txFt3AB0j77E7UQKgmf8cYdW2mB75W1ybiPFUGcYcfrQ9nUF4wi3ugBYm + BUhnJtvUmcRDw04YJvxo0k9AFl/OAbTtVcCsZxEFlQIru2uZzUy2qTOJ+20+NHZaseOomgPoVAT4+MXL + hAZPH8yfh6FIz4EwOIW4lCxWrYZZdFl8qBVeYHtsGQfQnUlc2R4Uz/XCtewIQnrRMFmBi6ocGF9Ow2R5 + RwK0ji7hbvMzhB0u5QAKyZ0eAcZPeri+Otm/xVmDaksBrhku4GxeBjqfvEHjgxEGqbo3iFB5CQdQwoY8 + PWtiQaxDja0YhaNKZPSfgqJpH6KTUpCv1iFXVccgW6NVHEDxtC6YWecOtw719nKUmrOQPZCM1PtyxNfL + EKPZBnnacSjS8hCXnIktUcUcQNlucWiZbY2tCDdNSmQ+SgqKD+JYQzgTx2jC2P9QyS7sP3Iamw9IAPQw + KNsUT0oYhYTuTKeibdPCaGayTZ1JvCmiiDvYyIv+BQh9MVb8RJN+AAAAAElFTkSuQmCC + + + + 248, 25 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQ9JREFUOE+t09lq + wkAUBmBfyr5DfY32jaReSOmFCyKCgkKLFrVUBZeKiEbshqRuaNw1xiXmLxMJBJ0Zc+GBw9zMfDPnHMZm + u1ZE35s4zXCqjmC8Al+sgHLjD9y7yGFWPIbecOO45yORtMAEHnxxJHL1IyKI9JeEXqtMwOl50Q8bSS0l + 8PzBBPbqAQQxICrgjeapgKZpkJUdBmNZB+y3d/QSnsIZKrDdqZjMFYj9OR9wB1NngHrQsJC36EkrfIkT + PuDyJ84AZbOHNF2j1Z2h9i3xAVKfOUjjZssN2oMFmq0xSkLfOmBu3E97iurnENlKxzpgbpzwO0Kh1kOy + KFoDjHmzVuYYjRmTDZfyWh9Yd/4B2Mz2w1z7EGUAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I + k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC + TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p + AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0 + BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr + UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG + CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5 + F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS + rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt + NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp + 59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W + AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAixJREFUOE+tk91L + k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz + V7TEoabYRDD49ju/6Pm1Mi+iH5zLz+c855zvo1L9j/fsaRRUvvZltHmX8Ni9gMaGCO47ZlBb8wn22yHc + KJ9CackECgteIy93FBfOB6H0JrC3B6ipXsVGb2V1Dca0XhxOe8JLEXhbF7mgsuLLX3mCIwsr2G1+DrVa + huWQRwjcj+a5oLTk87qCn/D78CLiTD4UXJ7GAXOTEDjrZ7ngku3dH4Jf4ZHJCLZJXlhzxpGa4hSCurth + LsjOGo0R/A4PBsPYrHdDlgMwmRxCUF31kQvkMwFFsB7c4/+ATYkNOHL0BZKSaoXgZuU0urvATgkcP/kK + lmMDfNu0MJqZPps6/4D7cNDSCUmyC8HVskl0+MAyADS5vrG7f0X59Tm+VFoYzZyZEVTg5NR2GAwVQnCl + cByeZuChc40FJwpjek5MmU/YkH6uiHdOTmHwfg/0+jIhsOWNMRiouhPlnUnAQoI4rYSht7MYm5qDnHsN + e41tHNbucUGnKxICiqXjHpTPJgHBZ/Nv4U1oHqGZJVwstiNe72JwI+J3PYA2MV8IMjOG2dzLfOatBg+2 + 7JDQ0tEPX9cguvv8GHg5hH0mC9S6eiQweLumDhqNVQgo06dP9fN4UsIoJHRnOhVtmxZGM1NXKoJ3JmTH + Cv71r/4OTrQ4xWMwWlcAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAALJJREFUOE+lkkEK + AjEMRTOe0AMJHsWley/gypWoDIOIIIiiqGt3Mp1vKmb8aq2FFh4taf4j0BbrSwN5rtfJKuG9U1DdC4zV + uUEKnBEOYFsB42Ec7eGMLE8OxiPc78bRHs6EBYPe9xS+5uWfguroYLQTaBPX/fnXnZR6aaQKOJMvWBwc + jNQJOCPZgtm+hpE6AWdkuqthtII/z8iZsCD2mfSJ3wSTzQ1G6lfmjIzmV+SQLbgD37ZEvPujP6sAAAAA + SUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAASFJREFUOE9jvPny + 3/8///4zkA1ABlx9/pdszHD9BW4D/t+//B+Gj975hdUSBnTbQQr/L2///78+ABPPLv+PbhCKAf9P7/j/ + vzkMoXF64f//82sgGNnA7XPhrmG4/BTif7BTYZpX94JtQsf/dy9GqAFaBtLHAFP0vz8NYgtQETbNcHWX + D0PUAS0DiSEMAAm2R+PVDDcE5qXrJyAG/D+/F2Lq4ibiDAB5BepasAFrTn6CCAC9gc/5cBfAYgloMQNI + M9gAoPPBhgADk5AhsMAGhwHcgMNrIQZ0J/7/D/Qb1lh4fPP/f1DUgtQBXQHSCzcA7ArkBARMNP/3L4eE + D4hGlpucA9aMYQDYEJBLYN5BT43AqINpxGkAugJCfBQvEFKMTR4A0Ng1nOpCYJsAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAARVJREFUOE+lkj9r + AkEUxPf8hKnSp7HPJxBMYSHBMmlSWVhomlholyKIBklCCEFEEfJH1DZluMv45i17nLeXU7mD2WP3Zn7v + 7e4F080fjDx2PO4pBeIngJqsj5cW3xdEo5wLN++rCFQWCA+3QOUE6F5nfmcuH3BxagHUauFBFPC2jECl + O0DvxgYdpFn1PMyZVxmoJIDV4vDXFKif2flktONjLhvQqtmAdEEwhnd2fnXuA16+I1CuA8yerVmq7nQl + t6HrAnPrzBkPIFXSRu1C2k+DFfD0GYJS07hvTf/cPbeQ3BpzZvwRglKAOyw5cdy3fLUv48Oln7kYoAF3 + 54e85aAVMJj/gtK/LqtqzhpzpvP4gyIqDNgC3WZHgI8tlx0AAAAASUVORK5CYII= + + + + 31, 55 + + + 142, 52 + + + 241, 52 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Program.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Program.cs new file mode 100644 index 0000000..0ed23f8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DrawingShapes +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new DrawingSurface()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Properties/Resources.Designer.cs new file mode 100644 index 0000000..b426294 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Properties/Resources.Designer.cs @@ -0,0 +1,68 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50215.44 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="DrawingShapes.Properties.Resources.get_ResourceManager():System.Resources.Resourc" + + "eManager")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="DrawingShapes.Properties.Resources.get_Culture():System.Globalization.CultureInfo" + + "")] +[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope="member", Target="DrawingShapes.Properties.Resources.set_Culture(System.Globalization.CultureInfo):" + + "Void")] + +namespace DrawingShapes.Properties { + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DrawingShapes.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Properties/Resources.resx new file mode 100644 index 0000000..824d56a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Shape.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Shape.cs new file mode 100644 index 0000000..640db6e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Shape.cs @@ -0,0 +1,278 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +namespace DrawingShapes +{ + [Serializable] + public abstract class Shape : IComparable + { + // Support sorting based on z-order. This makes it easy + // to paint groups of Shape controls in the right order. + public int CompareTo(object shape) + { + return ZOrder.CompareTo(((Shape)shape).ZOrder); + } + + // Even internally, all access to the path should + // go through the Path property, so that the path + // is regenerated if null. + [NonSerialized] + private GraphicsPath path = null; + public GraphicsPath Path + { + get + { + // The path is refreshed automatically + // as needed. + if (path == null) + { + RefreshPath(); + } + return path; + } + } + + // Create the corresponding GraphicsPath for the shape. + private void RefreshPath() + { + path = GeneratePath(); + } + + protected abstract GraphicsPath GeneratePath(); + + [NonSerialized] + private Region region; + public Region Region + { + get + { + if (region == null) + { + region = new Region(Path); + } + return region; + } + } + + // This is useful when refreshing the form. + // It takes into account the region occupied by the + // border and focus rectangle. + public virtual Rectangle GetLargestPossibleRegion() + { + Rectangle rect = Rectangle.Round(Path.GetBounds()); + rect.Inflate(new Size(focusBorderSpace, focusBorderSpace)); + return rect; + //return new Region(rect); + } + + // Check if the point is in the shape. + public virtual bool HitTest(Point point) + { + // if (rotation != 0) + //matrix.RotateAt(rotation, new PointF(location.X, location.Y), + // Drawing.Drawing2D.MatrixOrder.Append) + //path.Transform(matrix) + return Path.IsVisible(point); + } + + // Check if the point is in the outline of the shape. + public virtual bool HitTestBorder(Point point) + { + if (outlinePen == null) + { + return false; + } + else + { + return Path.IsOutlineVisible(point, outlinePen); + } + } + + public enum HitSpot + { + Top, Bottom, Left, Right, + TopLeftCorner, BottomLeftCorner, + TopRightCorner, BottomRightCorner, + None + } + + public bool HitTestFocusBorder(Point point, out HitSpot hitSpot) + { + hitSpot = HitSpot.None; + if (!selected) + { + return false; + } + else + { + Rectangle rectInner = Rectangle.Round(Path.GetBounds()); + Rectangle rectOuter = rectInner; + rectOuter.Inflate(new Size(focusBorderSpace, focusBorderSpace)); + if (rectOuter.Contains(point) && !rectInner.Contains(point)) + { + // Here's the simplest hit-testing code. + // However, it's insufficient because it doesn't indicate + // the side where the hit took place. + } + else + { + return false; + } + + bool top = false; + bool bottom = false; + bool left = false; + bool right = false; + if (Math.Abs(point.X - location.X) < focusBorderSpace) + { + left = true; + } + if (Math.Abs(point.X - (location.X + size.Width)) < focusBorderSpace) + { + right = true; + } + if (Math.Abs(point.Y - location.Y) < focusBorderSpace) + { + top = true; + } + if (Math.Abs(point.Y - (location.Y + size.Height)) < focusBorderSpace) + { + bottom = true; + } + if (top && left) hitSpot = HitSpot.TopLeftCorner; + else if (top && right) hitSpot = HitSpot.TopRightCorner; + else if (bottom && left) hitSpot = HitSpot.BottomLeftCorner; + else if (bottom && right) hitSpot = HitSpot.BottomRightCorner; + else if (top) hitSpot = HitSpot.Top; + else if (bottom) hitSpot = HitSpot.Bottom; + else if (left) hitSpot = HitSpot.Left; + else if (right) hitSpot = HitSpot.Right; + + if (hitSpot == HitSpot.None) + return false; + else + return true; + } + } + + // The following properties duplicate some of the Control-class + // functionality that's needed. + private Color foreColor; + public Color ForeColor + { + get + { + return foreColor; + } + set + { + foreColor = value; + } + } + + private Color backColor; + public Color BackColor + { + get + { + return backColor; + } + set + { + backColor = value; + } + } + + private int zOrder; + public int ZOrder + { + get + { + return zOrder; + } + set + { + zOrder = value; + } + } + + private bool selected; + public bool Selected + { + get + { + return selected; + } + set + { + selected = value; + } + } + + private Size size; + public Size Size + { + get + { + return size; + } + set + { + size = value; + path = null; + } + } + + private Point location; + public Point Location + { + get + { + return location; + } + set + { + location = value; + path = null; + } + } + + // These details could be wrapped in properties + // to provide more customization for line thickness + // and border patterns. + private int penThickness = 3; + private int focusBorderSpace = 5; + [NonSerialized] + Pen outlinePen; + + public void Render(Graphics g) + { + // Create the pen and brush. + if (outlinePen != null) + { + outlinePen.Dispose(); + } + + outlinePen = new Pen(foreColor, penThickness); + Brush surfaceBrush = new SolidBrush(backColor); + + // Paint the shape. + g.FillPath(surfaceBrush, Path); + g.DrawPath(outlinePen, Path); + + // If required, paint the focus box. + if (Selected) + { + Rectangle rect = Rectangle.Round(Path.GetBounds()); + rect.Inflate(new Size(focusBorderSpace, focusBorderSpace)); + ControlPaint.DrawFocusRectangle(g, rect); + } + surfaceBrush.Dispose(); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Shape.resx b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Shape.resx new file mode 100644 index 0000000..7e32396 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Shape.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/ShapeCollection.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/ShapeCollection.cs new file mode 100644 index 0000000..969eccf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/ShapeCollection.cs @@ -0,0 +1,96 @@ +#region Using directives + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Drawing; + +#endregion + +namespace DrawingShapes +{ + // You could use generics rather than creating a custom collection, + // but this approach makes it easier to organize code that works + // on groups of shapes (like hit testing and re-ordering). + [Serializable] + public class ShapeCollection : CollectionBase + { + public void Add(Shape shapeToAdd) + { + // Reorder the shapes so the new shape is on top. + foreach (Shape shape in List) + { + shape.ZOrder++; + } + shapeToAdd.ZOrder = 0; + List.Add(shapeToAdd); + } + + public void Remove(Shape shapeToRemove) + { + List.Remove(shapeToRemove); + } + + public Shape this[int index] + { + get + { + return (Shape)this.List[index]; + } + } + + public Shape HitTest(Point point) + { + Sort(); + foreach (Shape shape in List) + { + if (shape.HitTest(point) || shape.HitTestBorder(point)) + { + return shape; + } + } + return null; + } + + public void Sort() + { + InnerList.Sort(); + } + + [NonSerialized] + private IComparer ReverseComparer = new ReverseZOrderComparer(); + public void ReverseSort() + { + InnerList.Sort(ReverseComparer); + } + + public void BringShapeToFront(Shape frontShape) + { + foreach (Shape shape in List) + { + shape.ZOrder++; + } + frontShape.ZOrder = 0; + } + + public void SendShapeToBack(Shape backShape) + { + int maxZOrder = 0; + foreach (Shape shape in List) + { + if (shape.ZOrder > maxZOrder) maxZOrder = shape.ZOrder; + } + maxZOrder++; + backShape.ZOrder = maxZOrder; + } + } + + public class ReverseZOrderComparer : IComparer + { + public int Compare(object shapeA, object shapeB) + { + return ((Shape)shapeB).CompareTo((Shape)shapeA); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Shapes.cs b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Shapes.cs new file mode 100644 index 0000000..8d72a69 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/Shapes.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing.Drawing2D; +using System.Drawing; + +namespace DrawingShapes +{ + //[Serializable] + //public class CustomShape : Shape + //{ + // private GraphicsPath path; + // public GraphicsPath Path + // { + // get { return path; } + // set { path = value; } + // } + // protected override GraphicsPath GeneratePath() + // { + // return path; + // } + //} + + [Serializable] + public class RectangleShape : Shape + { + protected override GraphicsPath GeneratePath() + { + GraphicsPath path = new GraphicsPath(); + path.AddRectangle(new Rectangle( + Location.X, Location.Y, Size.Width, Size.Height)); + return path; + } + } + + [Serializable] + public class EllipseShape : Shape + { + protected override GraphicsPath GeneratePath() + { + GraphicsPath path = new GraphicsPath(); + path.AddEllipse( + Location.X, Location.Y, Size.Width, Size.Height); + return path; + } + } + + [Serializable] + public class TriangleShape : Shape + { + protected override GraphicsPath GeneratePath() + { + GraphicsPath path = new GraphicsPath(); + Point pt1 = new Point( + Location.X + Size.Width / 2, Location.Y); + Point pt2 = new Point( + Location.X, Location.Y + Size.Height); + Point pt3 = new Point( + Location.X + Size.Width, Location.Y + Size.Height); + path.AddPolygon(new Point[] { pt1, pt2, pt3 }); + return path; + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/bin/Debug/DrawingShapes.exe b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/bin/Debug/DrawingShapes.exe new file mode 100644 index 0000000..1baa5f1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/bin/Debug/DrawingShapes.exe differ diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/bin/Debug/DrawingSquares.exe b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/bin/Debug/DrawingSquares.exe new file mode 100644 index 0000000..73e2509 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/bin/Debug/DrawingSquares.exe differ diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/bin/Debug/SampleShapes b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/bin/Debug/SampleShapes new file mode 100644 index 0000000..1a69cc4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/bin/Debug/SampleShapes differ diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/circle.bmp b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/circle.bmp new file mode 100644 index 0000000..6746ea1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/circle.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/square.bmp b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/square.bmp new file mode 100644 index 0000000..dc9cac9 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/square.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/triangle.bmp b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/triangle.bmp new file mode 100644 index 0000000..ad5005e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter24/DrawingShapes_NonCtrl/triangle.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders.sln b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders.sln new file mode 100644 index 0000000..7c7d879 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExtenderProviders", "ExtenderProviders\ExtenderProviders.csproj", "{D378C9FA-9462-4488-8F39-E4A545B5A9A7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExtenderProvidersHost", "ExtenderProvidersHost\ExtenderProvidersHost.csproj", "{112B6528-7884-4ED6-B64F-2B4CD423FBD0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D378C9FA-9462-4488-8F39-E4A545B5A9A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D378C9FA-9462-4488-8F39-E4A545B5A9A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D378C9FA-9462-4488-8F39-E4A545B5A9A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D378C9FA-9462-4488-8F39-E4A545B5A9A7}.Release|Any CPU.Build.0 = Release|Any CPU + {112B6528-7884-4ED6-B64F-2B4CD423FBD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {112B6528-7884-4ED6-B64F-2B4CD423FBD0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {112B6528-7884-4ED6-B64F-2B4CD423FBD0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {112B6528-7884-4ED6-B64F-2B4CD423FBD0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders.suo b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders.suo new file mode 100644 index 0000000..2081467 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders.suo differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/ExtenderProviders.csproj b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/ExtenderProviders.csproj new file mode 100644 index 0000000..4faa11d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/ExtenderProviders.csproj @@ -0,0 +1,73 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {D378C9FA-9462-4488-8F39-E4A545B5A9A7} + Library + Properties + ExtenderProviders + ExtenderProviders + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Component + + + HelpIconProvider.cs + + + + True + True + Resources.resx + + + Component + + + + + Designer + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/ExtenderProviders.suo b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/ExtenderProviders.suo new file mode 100644 index 0000000..de4e164 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/ExtenderProviders.suo differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/HelpIconProvider.Designer.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/HelpIconProvider.Designer.cs new file mode 100644 index 0000000..0b30db6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/HelpIconProvider.Designer.cs @@ -0,0 +1,25 @@ +namespace ExtenderProviders +{ + partial class HelpIconProvider + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/HelpIconProvider.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/HelpIconProvider.cs new file mode 100644 index 0000000..18bceaf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/HelpIconProvider.cs @@ -0,0 +1,168 @@ +using System; +using System.ComponentModel; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Windows.Forms; +using System.Drawing; + +namespace ExtenderProviders +{ + [ProvideProperty("HelpID", typeof(Control))] + public partial class HelpIconProvider : Component, IExtenderProvider, ISupportInitialize + { + public HelpIconProvider() + { + InitializeComponent(); + } + + public HelpIconProvider(IContainer container) + { + container.Add(this); + + InitializeComponent(); + } + + public bool CanExtend(object extendee) + { + return (extendee is Control); + } + + private string helpFile; + public string HelpFile + { + get { return helpFile; } + set { helpFile = value; } + } + + // Store the context-senstive ID for each control. + private Dictionary contextIDs = + new Dictionary(); + + // Store the dynamically inserted PictureBox controls. + private Dictionary pictures = + new Dictionary(); + + public void SetHelpID(Control extendee, string value) + { + // A blank value string indicates the control is trying to unregister. + if (value.Length == 0) + { + // Check if the item is registered. + if (pictures.ContainsKey(extendee) && !DesignMode) + { + // Perform this step only if the form is created. + if (extendee.Parent != null) + UnRegister(extendee); + } + // Stop maintaining the help ID. + contextIDs.Remove(extendee); + } + else + { + // The user has supplied a value. + // Check if the item is registered. + if (!pictures.ContainsKey(extendee) && !DesignMode) + { + if (extendee.Parent != null) + Register(extendee); + } + // Update or store the help ID. + contextIDs[extendee] = value; + } + } + + public void BeginInit() + { } + public void EndInit() + { + // No design-time PictureBox controls are created. + // Add them now. + foreach (KeyValuePair item in contextIDs) + { + Register(item.Key); + } + } + + private void Register(Control control) + { + // Create new PictureBox. + PictureBox pic = new PictureBox(); + pic.Image = Properties.Resources.help; + pic.Size = new Size(16, 16); + pic.Location = new Point(control.Right + 10, control.Top); + // Register for DoubleClick event. + pic.DoubleClick += new EventHandler(PicDoubleClick); + // Store a reference to the help icon + // So you can remove it later. + pictures[control] = pic; + // Add it to the form. + control.Parent.Controls.Add(pic); + } + + private void UnRegister(Control control) + { + // Detach event handler. + pictures[control].DoubleClick -= new EventHandler(PicDoubleClick); + // Remove the picture from the form. + pictures[control].Dispose(); + control.Parent.Controls.Remove(pictures[control]); + pictures.Remove(control); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + // Dispose all the PictureBox controls. + foreach (KeyValuePair item in pictures) + { + item.Key.Dispose(); + } + } + + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + public string GetHelpID(Control extendee) + { + if (contextIDs.ContainsKey(extendee)) + { + return contextIDs[extendee]; + } + else + { + return String.Empty; + } + } + + public void PicDoubleClick(object sender, EventArgs e) + { + // This message box is for debuggin purposes. + // Trying to show a help file with non-existent topic + // will not generate an error. + MessageBox.Show("Help triggered."); + + // Find the related control. + Control ctrl = null; + foreach (KeyValuePair item in pictures) + { + if (item.Value == sender) + { + ctrl = item.Key; + break; + } + } + // Show the help. + if (ctrl != null) + { + Help.ShowHelp(ctrl, helpFile, HelpNavigator.Topic, + contextIDs[ctrl]); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4f9551d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ExtenderProviders")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ExtenderProviders")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("bb9e7053-961b-4a69-8299-3f278dca6e7b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Properties/Resources.Designer.cs new file mode 100644 index 0000000..482aefc --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Properties/Resources.Designer.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.26 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ExtenderProviders.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ExtenderProviders.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static System.Drawing.Bitmap help { + get { + object obj = ResourceManager.GetObject("help", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Properties/Resources.resx new file mode 100644 index 0000000..b426fd4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\help.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Resources/help.gif b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Resources/help.gif new file mode 100644 index 0000000..8e36fbf Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/Resources/help.gif differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/StatusStripHelpLabelProvider.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/StatusStripHelpLabelProvider.cs new file mode 100644 index 0000000..a906692 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/StatusStripHelpLabelProvider.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; +using System.Windows.Forms; + +namespace ExtenderProviders +{ + [ProvideProperty("HelpText", typeof(ToolStripItem))] + public class StatusStripHelpLabel : ToolStripStatusLabel, IExtenderProvider + { + // The collection for tracking the help text information. + private Dictionary helpText = + new Dictionary(); + + public bool CanExtend(object extendee) + { + return (extendee is ToolStripItem); + } + + public void SetHelpText(ToolStripItem extendee, string value) + { + // A blank value string indicates the control is trying to unregister. + if (value.Length == 0) + { + // Check if the item is registered. + if (!helpText.ContainsKey(extendee) && !DesignMode) + { + // Unregister. + extendee.MouseEnter -= new EventHandler(MenuSelect); + extendee.MouseLeave -= new EventHandler(MenuClear); + } + helpText.Remove(extendee); + } + else + { + // The user has supplied help text. + // Check if the item is registered. + if (!helpText.ContainsKey(extendee) && !DesignMode) + { + // It hasn't been registered yet. Register it now. + extendee.MouseEnter += new EventHandler(MenuSelect); + extendee.MouseLeave += new EventHandler(MenuClear); + } + // Either way, update the help text. + helpText[extendee] = value; + } + } + + [DisplayName("HelpText")] + [Category("Behavior")] + [Description("This text appears in the linked StatusStripHelpLabel.")] + public string GetHelpText(ToolStripItem extendee) + { + if (helpText.ContainsKey(extendee)) + { + return helpText[extendee]; + } + else + { + return string.Empty; + } + } + + private void MenuSelect(object sender, System.EventArgs e) + { + base.Text = helpText[(ToolStripMenuItem)sender]; + } + + private void MenuClear(object sender, System.EventArgs e) + { + base.Text = string.Empty; + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/bin/Debug/ExtenderProviders.dll b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/bin/Debug/ExtenderProviders.dll new file mode 100644 index 0000000..a14945c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/bin/Debug/ExtenderProviders.dll differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/bin/Release/ExtenderProviders.dll b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/bin/Release/ExtenderProviders.dll new file mode 100644 index 0000000..0927fdd Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProviders/bin/Release/ExtenderProviders.dll differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/ExtenderProvidersHost.csproj b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/ExtenderProvidersHost.csproj new file mode 100644 index 0000000..146fcc9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/ExtenderProvidersHost.csproj @@ -0,0 +1,107 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {112B6528-7884-4ED6-B64F-2B4CD423FBD0} + WinExe + Properties + ExtenderProvidersHost + ExtenderProvidersHost + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Form + + + HelpIconProviderTest.cs + + + Form + + + Menu.cs + + + + + Designer + HelpIconProviderTest.cs + + + Menu.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + Designer + StatusStripHelpLabelTest.cs + + + True + Resources.resx + + + Always + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + Form + + + StatusStripHelpLabelTest.cs + + + + + {D378C9FA-9462-4488-8F39-E4A545B5A9A7} + ExtenderProviders + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/ExtenderProvidersHost.sln b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/ExtenderProvidersHost.sln new file mode 100644 index 0000000..03950c9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/ExtenderProvidersHost.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExtenderProvidersHost", "ExtenderProvidersHost.csproj", "{112B6528-7884-4ED6-B64F-2B4CD423FBD0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {112B6528-7884-4ED6-B64F-2B4CD423FBD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {112B6528-7884-4ED6-B64F-2B4CD423FBD0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {112B6528-7884-4ED6-B64F-2B4CD423FBD0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {112B6528-7884-4ED6-B64F-2B4CD423FBD0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/ExtenderProvidersHost.suo b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/ExtenderProvidersHost.suo new file mode 100644 index 0000000..1d49dcb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/ExtenderProvidersHost.suo differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpIconProviderTest.Designer.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpIconProviderTest.Designer.cs new file mode 100644 index 0000000..31e79f4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpIconProviderTest.Designer.cs @@ -0,0 +1,83 @@ +namespace ExtenderProvidersHost +{ + partial class HelpIconProviderTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.helpIconProvider1 = new ExtenderProviders.HelpIconProvider(this.components); + ((System.ComponentModel.ISupportInitialize)(this.helpIconProvider1)).BeginInit(); + this.SuspendLayout(); + // + // textBox2 + // + this.helpIconProvider1.SetHelpID(this.textBox2, "ValueOfHelp.htm"); + this.textBox2.Location = new System.Drawing.Point(12, 74); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(100, 20); + this.textBox2.TabIndex = 1; + this.textBox2.Text = "The Value of Help"; + // + // textBox1 + // + this.helpIconProvider1.SetHelpID(this.textBox1, "BadHelp.htm"); + this.textBox1.Location = new System.Drawing.Point(12, 39); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(100, 20); + this.textBox1.TabIndex = 0; + this.textBox1.Text = "Bad Help"; + // + // helpIconProvider1 + // + this.helpIconProvider1.HelpFile = "HelpTest.chm"; + // + // HelpIconProviderTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(266, 235); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.textBox1); + this.helpIconProvider1.SetHelpID(this, ""); + this.Name = "HelpIconProviderTest"; + this.Text = "HelpIconProviderTest"; + this.Load += new System.EventHandler(this.HelpIconProviderTest_Load); + ((System.ComponentModel.ISupportInitialize)(this.helpIconProvider1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private ExtenderProviders.HelpIconProvider helpIconProvider1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.TextBox textBox2; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpIconProviderTest.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpIconProviderTest.cs new file mode 100644 index 0000000..86d1bc6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpIconProviderTest.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.IO; + +namespace ExtenderProvidersHost +{ + public partial class HelpIconProviderTest : Form + { + public HelpIconProviderTest() + { + InitializeComponent(); + } + + private void HelpIconProviderTest_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpIconProviderTest.resx b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpIconProviderTest.resx new file mode 100644 index 0000000..4704d06 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpIconProviderTest.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpTest.chm b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpTest.chm new file mode 100644 index 0000000..e566b4b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/HelpTest.chm differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Menu.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Menu.cs new file mode 100644 index 0000000..995a89b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Menu.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Reflection; + +namespace ExtenderProvidersHost +{ + public partial class Menu : Form + { + public Menu() + { + InitializeComponent(); + } + + private void cmd_Click(object sender, EventArgs e) + { + Control ctrl = (Control)sender; + Assembly assembly = Assembly.GetAssembly(typeof(Menu)); + Form frm = (Form)assembly.CreateInstance("ExtenderProvidersHost." + ctrl.Text); + frm.ShowDialog(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Menu.designer.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Menu.designer.cs new file mode 100644 index 0000000..af4ae1c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Menu.designer.cs @@ -0,0 +1,73 @@ +namespace ExtenderProvidersHost +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(12, 41); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(153, 23); + this.button2.TabIndex = 4; + this.button2.Text = "HelpIconProviderTest"; + this.button2.Click += new System.EventHandler(this.cmd_Click); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(153, 23); + this.button1.TabIndex = 3; + this.button1.Text = "StatusStripHelpLabelTest"; + this.button1.Click += new System.EventHandler(this.cmd_Click); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(177, 153); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "Menu"; + this.Text = "Menu"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + } +} + diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Menu.resx b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Menu.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Menu.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Program.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Program.cs new file mode 100644 index 0000000..7c96262 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ExtenderProvidersHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Menu()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ed3f135 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ExtenderProvidersHost")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ExtenderProvidersHost")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2f346799-149e-4f29-b0a4-41d4b2bd5016")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Resources.Designer.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Resources.Designer.cs new file mode 100644 index 0000000..c05faf6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.7 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ExtenderProvidersHost.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ExtenderProvidersHost.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Resources.resx b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Settings.Designer.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Settings.Designer.cs new file mode 100644 index 0000000..72e1095 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.7 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ExtenderProvidersHost.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Settings.settings b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/StatusStripHelpLabelTest.Designer.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/StatusStripHelpLabelTest.Designer.cs new file mode 100644 index 0000000..1c6c2a6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/StatusStripHelpLabelTest.Designer.cs @@ -0,0 +1,118 @@ +namespace ExtenderProvidersHost +{ + partial class StatusStripHelpLabelTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.MenuStrip1 = new System.Windows.Forms.MenuStrip(); + this.FileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.OpenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.statusStripHelpLabel1 = new ExtenderProviders.StatusStripHelpLabel(); + this.statusStrip1.SuspendLayout(); + this.MenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.statusStripHelpLabel1}); + this.statusStrip1.Location = new System.Drawing.Point(0, 244); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(292, 22); + this.statusStrip1.TabIndex = 0; + this.statusStrip1.Text = "statusStrip1"; + // + // MenuStrip1 + // + this.MenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.FileToolStripMenuItem}); + this.MenuStrip1.Location = new System.Drawing.Point(0, 0); + this.MenuStrip1.Name = "MenuStrip1"; + this.MenuStrip1.Size = new System.Drawing.Size(292, 24); + this.MenuStrip1.TabIndex = 1; + this.MenuStrip1.Text = "MenuStrip1"; + // + // FileToolStripMenuItem + // + this.FileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.NewToolStripMenuItem, + this.OpenToolStripMenuItem}); + this.statusStripHelpLabel1.SetHelpText(this.FileToolStripMenuItem, ""); + this.FileToolStripMenuItem.Name = "FileToolStripMenuItem"; + this.FileToolStripMenuItem.Size = new System.Drawing.Size(35, 20); + this.FileToolStripMenuItem.Text = "File"; + // + // NewToolStripMenuItem + // + this.statusStripHelpLabel1.SetHelpText(this.NewToolStripMenuItem, "The New command creates a new document."); + this.NewToolStripMenuItem.Name = "NewToolStripMenuItem"; + this.NewToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.NewToolStripMenuItem.Text = "New"; + // + // OpenToolStripMenuItem + // + this.statusStripHelpLabel1.SetHelpText(this.OpenToolStripMenuItem, "The Open command opens an existing document."); + this.OpenToolStripMenuItem.Name = "OpenToolStripMenuItem"; + this.OpenToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.OpenToolStripMenuItem.Text = "Open"; + // + // statusStripHelpLabel1 + // + this.statusStripHelpLabel1.SetHelpText(this.statusStripHelpLabel1, ""); + this.statusStripHelpLabel1.Name = "statusStripHelpLabel1"; + this.statusStripHelpLabel1.Size = new System.Drawing.Size(0, 17); + // + // StatusStripHelpLabelTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.MenuStrip1); + this.Controls.Add(this.statusStrip1); + this.Name = "StatusStripHelpLabelTest"; + this.Text = "StatusStripHelpLabelTest"; + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.MenuStrip1.ResumeLayout(false); + this.MenuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.StatusStrip statusStrip1; + internal System.Windows.Forms.MenuStrip MenuStrip1; + internal System.Windows.Forms.ToolStripMenuItem FileToolStripMenuItem; + internal System.Windows.Forms.ToolStripMenuItem NewToolStripMenuItem; + internal System.Windows.Forms.ToolStripMenuItem OpenToolStripMenuItem; + private ExtenderProviders.StatusStripHelpLabel statusStripHelpLabel1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/StatusStripHelpLabelTest.cs b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/StatusStripHelpLabelTest.cs new file mode 100644 index 0000000..8bae6aa --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/StatusStripHelpLabelTest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ExtenderProvidersHost +{ + public partial class StatusStripHelpLabelTest : Form + { + public StatusStripHelpLabelTest() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/StatusStripHelpLabelTest.resx b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/StatusStripHelpLabelTest.resx new file mode 100644 index 0000000..5462c81 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/StatusStripHelpLabelTest.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 127, 17 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Debug/ExtenderProviders.dll b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Debug/ExtenderProviders.dll new file mode 100644 index 0000000..a14945c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Debug/ExtenderProviders.dll differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Debug/ExtenderProvidersHost.exe b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Debug/ExtenderProvidersHost.exe new file mode 100644 index 0000000..48e0826 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Debug/ExtenderProvidersHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Debug/HelpTest.chm b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Debug/HelpTest.chm new file mode 100644 index 0000000..e566b4b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Debug/HelpTest.chm differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Release/ExtenderProviders.dll b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Release/ExtenderProviders.dll new file mode 100644 index 0000000..0927fdd Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Release/ExtenderProviders.dll differ diff --git a/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Release/ExtenderProvidersHost.exe b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Release/ExtenderProvidersHost.exe new file mode 100644 index 0000000..5c2daf5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter25/ExtenderProvidersHost/bin/Release/ExtenderProvidersHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/Container.cs b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Container.cs new file mode 100644 index 0000000..9dd83f6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Container.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.Drawing; +using System.ComponentModel; +using System.ComponentModel.Design; + +namespace ContainerControls +{ + [Designer(typeof(ContainerDesigner))] + public class Container : Control + { + protected override void OnPaint(PaintEventArgs e) + { + Pen p = new Pen(Color.Blue, 10); + e.Graphics.DrawRectangle(Pens.Blue, this.ClientRectangle); + p.Dispose(); + } + + protected override Control.ControlCollection CreateControlsInstance() + { + return new ContainerChildControlCollection(this); + } + } + + public class ContainerChildControlCollection : Control.ControlCollection + { + public ContainerChildControlCollection(Control owner) + : base(owner) + {} + + public override void Add(System.Windows.Forms.Control value) + { + if (value is ContainerChild) + { + base.Add(value); + } + else + { + throw new NotSupportedException("Only ContainerChild controls can be added to a Container control."); + } + } + } + + + public class ContainerDesigner : ParentControlDesigner + { + public override bool CanParent(Control control) + { + // Children can only be of type ContainerChild. + return (control is ContainerChild); + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerChild.cs b/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerChild.cs new file mode 100644 index 0000000..95ae60a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerChild.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.Windows.Forms; +using System.ComponentModel; +using System.Windows.Forms.Design; +using System.ComponentModel.Design; + +namespace ContainerControls +{ + //[ToolboxItem(false)] + [Designer(typeof(ContainerChildDesigner))] + public class ContainerChild : Control + { + protected override void OnPaint(PaintEventArgs e) + { + e.Graphics.FillRectangle(Brushes.Red, this.ClientRectangle); + e.Graphics.DrawString(Text, SystemFonts.IconTitleFont, + Brushes.White, this.ClientRectangle); + } + + protected override void OnParentChanged(EventArgs e) + { + // Allow a null parent to support drag-and-drop + // (from one Container to another) at design time. + if ((this.Parent is Container) || (this.Parent == null)) + { + base.OnParentChanged(e); + } + else + { + throw new NotSupportedException("A ContainerChild control can only be added to a Container control"); + } + } + } + + public class ContainerChildDesigner : ControlDesigner + { + public override bool CanBeParentedTo(IDesigner parentDesigner) + { + // Control can only be parented by Container. + return (parentDesigner is ContainerDesigner); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.csproj b/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.csproj new file mode 100644 index 0000000..14c4fef --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.csproj @@ -0,0 +1,62 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {900B6B2F-CDF1-4ADE-BD11-CD65E3627BA3} + Library + Properties + ContainerControls + ContainerControls + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + Component + + + Component + + + + + Form + + + Test.cs + + + + + + Designer + Test.cs + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.csproj.user b/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.csproj.user new file mode 100644 index 0000000..6481ba3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.csproj.user @@ -0,0 +1,5 @@ + + + 8.0.50215 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.sln b/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.sln new file mode 100644 index 0000000..edfdb2d --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContainerControls", "ContainerControls.csproj", "{900B6B2F-CDF1-4ADE-BD11-CD65E3627BA3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {900B6B2F-CDF1-4ADE-BD11-CD65E3627BA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {900B6B2F-CDF1-4ADE-BD11-CD65E3627BA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {900B6B2F-CDF1-4ADE-BD11-CD65E3627BA3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {900B6B2F-CDF1-4ADE-BD11-CD65E3627BA3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.suo b/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.suo new file mode 100644 index 0000000..d347e4b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/ContainerControls/ContainerControls.suo differ diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/Program.cs b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Program.cs new file mode 100644 index 0000000..5e0ac92 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace ContainerControls +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Test()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/Properties/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f713bd1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ContainterControls")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ContainterControls")] +[assembly: AssemblyCopyright("Copyright © 2005")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f792f2b7-397c-4432-a8d9-a5ce89f436fe")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/Test.Designer.cs b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Test.Designer.cs new file mode 100644 index 0000000..e76d89e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Test.Designer.cs @@ -0,0 +1,118 @@ +namespace ContainerControls +{ + partial class Test + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.container2 = new ContainerControls.Container(); + this.containerChild1 = new ContainerControls.ContainerChild(); + this.container1 = new ContainerControls.Container(); + this.containerChild3 = new ContainerControls.ContainerChild(); + this.containerChild2 = new ContainerControls.ContainerChild(); + this.containerChild4 = new ContainerControls.ContainerChild(); + this.container2.SuspendLayout(); + this.container1.SuspendLayout(); + this.SuspendLayout(); + // + // container2 + // + this.container2.Controls.Add(this.containerChild1); + this.container2.Location = new System.Drawing.Point(76, 9); + this.container2.Name = "container2"; + this.container2.Size = new System.Drawing.Size(202, 88); + this.container2.TabIndex = 8; + this.container2.Text = "container2"; + // + // containerChild1 + // + this.containerChild1.Location = new System.Drawing.Point(42, 32); + this.containerChild1.Name = "containerChild1"; + this.containerChild1.Size = new System.Drawing.Size(88, 23); + this.containerChild1.TabIndex = 0; + this.containerChild1.Text = "containerChild1"; + // + // container1 + // + this.container1.Controls.Add(this.containerChild4); + this.container1.Controls.Add(this.containerChild3); + this.container1.Controls.Add(this.containerChild2); + this.container1.Location = new System.Drawing.Point(76, 128); + this.container1.Name = "container1"; + this.container1.Size = new System.Drawing.Size(202, 148); + this.container1.TabIndex = 7; + this.container1.Text = "container1"; + // + // containerChild3 + // + this.containerChild3.Location = new System.Drawing.Point(64, 30); + this.containerChild3.Name = "containerChild3"; + this.containerChild3.Size = new System.Drawing.Size(91, 23); + this.containerChild3.TabIndex = 1; + this.containerChild3.Text = "containerChild3"; + // + // containerChild2 + // + this.containerChild2.Location = new System.Drawing.Point(23, 76); + this.containerChild2.Name = "containerChild2"; + this.containerChild2.Size = new System.Drawing.Size(90, 23); + this.containerChild2.TabIndex = 0; + this.containerChild2.Text = "containerChild2"; + // + // containerChild4 + // + this.containerChild4.Location = new System.Drawing.Point(101, 106); + this.containerChild4.Name = "containerChild4"; + this.containerChild4.Size = new System.Drawing.Size(75, 23); + this.containerChild4.TabIndex = 2; + this.containerChild4.Text = "containerChild4"; + // + // Test + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(350, 288); + this.Controls.Add(this.container2); + this.Controls.Add(this.container1); + this.Name = "Test"; + this.Text = "Test"; + this.container2.ResumeLayout(false); + this.container1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private Container container2; + private ContainerChild containerChild1; + private Container container1; + private ContainerChild containerChild3; + private ContainerChild containerChild2; + private ContainerChild containerChild4; + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/Test.cs b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Test.cs new file mode 100644 index 0000000..6834bb1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Test.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace ContainerControls +{ + public partial class Test : Form + { + public Test() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/Test.resx b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Test.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/ContainerControls/Test.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Debug/ContainerControls.dll b/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Debug/ContainerControls.dll new file mode 100644 index 0000000..305b7c1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Debug/ContainerControls.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Debug/ContainterControls.dll b/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Debug/ContainterControls.dll new file mode 100644 index 0000000..4371fda Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Debug/ContainterControls.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Release/ContainerControls.dll b/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Release/ContainerControls.dll new file mode 100644 index 0000000..84ade3c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Release/ContainerControls.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Release/ContainterControls.dll b/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Release/ContainterControls.dll new file mode 100644 index 0000000..d568516 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/ContainerControls/bin/Release/ContainterControls.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTree.sln b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTree.sln new file mode 100644 index 0000000..6a5ec5f --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTree.sln @@ -0,0 +1,28 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryTreeControl", "DirectoryTreeControl\DirectoryTreeControl.csproj", "{3BAAC556-742E-413E-B3EC-12E23DB99DB8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryTreeHost", "DirectoryTreeHost\DirectoryTreeHost.csproj", "{822BA761-DEC0-48C6-BA50-290B02E1BF77}" + ProjectSection(ProjectDependencies) = postProject + {3BAAC556-742E-413E-B3EC-12E23DB99DB8} = {3BAAC556-742E-413E-B3EC-12E23DB99DB8} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Release|Any CPU.Build.0 = Release|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTree.suo b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTree.suo new file mode 100644 index 0000000..f29a8b3 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTree.suo differ diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTree.bmp b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTree.bmp new file mode 100644 index 0000000..ce685df Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTree.bmp differ diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTree.cs b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTree.cs new file mode 100644 index 0000000..54bb191 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTree.cs @@ -0,0 +1,106 @@ +using System; +using System.IO; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Drawing.Design; +using System.Drawing; + +namespace DirectoryTreeControl +{ + [ToolboxBitmap(typeof(DirectoryTree), "DirectoryTree.bmp")] + [DefaultEvent("DirectorySelected"), + DefaultProperty("Drive"), + Designer(typeof(DirectoryTreeDesigner))] + public class DirectoryTree : TreeView + { + public delegate void DirectorySelectedDelegate(object sender, + DirectorySelectedEventArgs e); + public event DirectorySelectedDelegate DirectorySelected; + + private Char drive; + //[Editor(typeof(DriveEditor), typeof(UITypeEditor))] + [TypeConverter(typeof(DriveCharConverter))] + public Char Drive + { + get + { + return drive; + } + set + { + drive = value; + RefreshDisplay(); + } + } + + // This is public so a Refresh can be triggered manually. + public void RefreshDisplay() + { + // Erase the existing tree. + this.Nodes.Clear(); + + // Set the first node. + TreeNode rootNode = new TreeNode(drive + ":\\"); + this.Nodes.Add(rootNode); + + // Fill the first level and expand it. + Fill(rootNode); + this.Nodes[0].Expand(); + } + + private void Fill(TreeNode dirNode) + { + DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath); + + // An exception could be thrown in this code if you don't + // have sufficient security permissions for a file or directory. + // You can catch and then ignore this exception. + + foreach (DirectoryInfo dirItem in dir.GetDirectories()) + { + // Add node for the directory. + TreeNode newNode = new TreeNode(dirItem.Name); + dirNode.Nodes.Add(newNode); + newNode.Nodes.Add("*"); + } + } + + protected override void OnBeforeExpand(TreeViewCancelEventArgs e) + { + base.OnBeforeExpand(e); + + // If a dummy node is found, remove it and read the real directory list. + if (e.Node.Nodes[0].Text == "*") + { + e.Node.Nodes.Clear(); + Fill(e.Node); + } + } + + protected override void OnAfterSelect(TreeViewEventArgs e) + { + base.OnAfterSelect(e); + + // Raise the DirectorySelected event. + if (DirectorySelected != null) + { + DirectorySelected(this, + new DirectorySelectedEventArgs(e.Node.FullPath)); + } + } + } + + public class DirectorySelectedEventArgs : EventArgs + { + public string DirectoryName; + + public DirectorySelectedEventArgs(string directoryName) + { + this.DirectoryName = directoryName; + } + } + + +} diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTree.resx b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTree.resx new file mode 100644 index 0000000..7e32396 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTree.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj new file mode 100644 index 0000000..edec52c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj @@ -0,0 +1,120 @@ + + + Local + 8.0.50215 + 2.0 + {3BAAC556-742E-413E-B3EC-12E23DB99DB8} + Debug + AnyCPU + + + + + DirectoryTreeControl + + + JScript + Grid + IE50 + false + Library + DirectoryTreeControl + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Design + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Design.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Component + + + Code + + + + Code + + + Form + + + + DirectoryTree.cs + + + SelectDrive.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj.user b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj.user new file mode 100644 index 0000000..9a93a83 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.sln b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.sln new file mode 100644 index 0000000..11228a9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryTreeControl", "DirectoryTreeControl.csproj", "{3BAAC556-742E-413E-B3EC-12E23DB99DB8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryTreeHost", "..\DirectoryTreeHost\DirectoryTreeHost.csproj", "{822BA761-DEC0-48C6-BA50-290B02E1BF77}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3BAAC556-742E-413E-B3EC-12E23DB99DB8}.Release|Any CPU.Build.0 = Release|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {822BA761-DEC0-48C6-BA50-290B02E1BF77}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.suo b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.suo new file mode 100644 index 0000000..cb751eb Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeControl.suo differ diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeDesigner.cs b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeDesigner.cs new file mode 100644 index 0000000..6e2e5c0 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DirectoryTreeDesigner.cs @@ -0,0 +1,124 @@ +using System; +using System.IO; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Drawing.Design; + +namespace DirectoryTreeControl +{ + public class DirectoryTreeDesigner : ControlDesigner + { + private DesignerVerbCollection verbs = new DesignerVerbCollection(); + + private DesignerVerb verbSetDrive; + + public DirectoryTreeDesigner() + { + // Configure the designer verb collection. + // Add the Set Drive verb that calls up the form. + verbSetDrive = new DesignerVerb("Set Drive", + new EventHandler(OnVerb)); + verbs.Add(verbSetDrive); + + // Add a verb for quickly setting each possible drive value + // (for demonstration purposes). + string[] drives = System.IO.Directory.GetLogicalDrives(); + + foreach (string drive in drives) + { + verbs.Add(new DesignerVerb("Set Drive " + drive, + new EventHandler(OnVerb))); + } + } + + private IComponentChangeService changeService; + public override void Initialize(IComponent component) + { + base.Initialize(component); + + // Update your designer verb whenever ComponentChanged event occurs. + changeService = + (IComponentChangeService)GetService(typeof(IComponentChangeService)); + if (changeService != null) + changeService.ComponentChanged += + new ComponentChangedEventHandler(ComponentChanged); + } + + protected override void Dispose(bool disposing) + { + if (changeService != null) + changeService.ComponentChanged -= + new ComponentChangedEventHandler(ComponentChanged); + } + + private void ComponentChanged(object sender, ComponentChangedEventArgs e) + { + DirectoryTree tree = (DirectoryTree)this.Control; + + if (tree != null) + { + foreach (DesignerVerb verb in verbs) + { + if (verb != verbSetDrive) + { + if (verb.Text[10] == tree.Drive) + verb.Enabled = false; + else + verb.Enabled = true; + } + } + } + } + + public override DesignerVerbCollection Verbs + { + get + { + return verbs; + } + } + + protected void OnVerb(object sender, EventArgs e) + { + char oldValue = ((DirectoryTree)this.Control).Drive; + char newValue; + + if (sender == verbSetDrive) + { + // Show the form. + using (SelectDrive frm = new SelectDrive()) + { + frm.DriveSelection = oldValue; + + // Exit in case Cancel is clicked. + if (frm.ShowDialog() != DialogResult.OK) return; + + // Get the result. + newValue = frm.DriveSelection; + } + } + else + { + // Retrieve the selected drive. + newValue = ((DesignerVerb)sender).Text[10]; + } + + // Adjust the associated control. + ((DirectoryTree)this.Control).Drive = newValue; + + // Notify the IDE that the Drive property has changed. + PropertyDescriptorCollection properties; + properties = TypeDescriptor.GetProperties(typeof(DirectoryTree)); + PropertyDescriptor changedProperty = properties.Find("Drive", false); + this.RaiseComponentChanged(changedProperty, oldValue, newValue); + } + + protected override void PostFilterProperties(System.Collections.IDictionary + properties) + { + properties.Remove("Nodes"); + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DriveCharConverter.cs b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DriveCharConverter.cs new file mode 100644 index 0000000..2fcb343 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DriveCharConverter.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; +using System.Collections; + +namespace DirectoryTreeControl +{ + public class DriveCharConverter : CharConverter + { + + private static TypeConverter.StandardValuesCollection svc; + + public override System.ComponentModel.TypeConverter.StandardValuesCollection + GetStandardValues(ITypeDescriptorContext context) + { + if (svc == null) + { + ArrayList drives = new ArrayList(); + foreach (string drive in System.IO.Directory.GetLogicalDrives()) + { + drives.Add(drive[0]); + } + svc = new TypeConverter.StandardValuesCollection(drives); + } + + + return svc; + } + + public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) + { return false; } + + public override bool GetStandardValuesSupported( + ITypeDescriptorContext context) + { return true; } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DriveEditor.cs b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DriveEditor.cs new file mode 100644 index 0000000..e3b872a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/DriveEditor.cs @@ -0,0 +1,44 @@ +using System; +using System.IO; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Drawing.Design; + +namespace DirectoryTreeControl +{ + public class DriveEditor : UITypeEditor + { + public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle( + System.ComponentModel.ITypeDescriptorContext context) + { + // We will use a window for property editing. + return UITypeEditorEditStyle.Modal; + + } + + public override object EditValue( + System.ComponentModel.ITypeDescriptorContext context, + System.IServiceProvider provider, object value) + { + SelectDrive frm = new SelectDrive(); + + // Set current drive in window. + frm.DriveSelection = (char)value; + frm.ShowDialog(); + + // Return the new value. + return frm.DriveSelection; + } + + public override bool GetPaintValueSupported( + System.ComponentModel.ITypeDescriptorContext context) + { + // No special thumbnail will be shown for the grid. + return false; + } + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/SelectDrive.cs b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/SelectDrive.cs new file mode 100644 index 0000000..a416c08 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/SelectDrive.cs @@ -0,0 +1,142 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace DirectoryTreeControl +{ + /// + /// Summary description for SelectDrive. + /// + public class SelectDrive : System.Windows.Forms.Form + { + internal System.Windows.Forms.Button cmdClose; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.ListBox lstDrives; + internal Button button1; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public SelectDrive() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.cmdClose = new System.Windows.Forms.Button(); + this.Label1 = new System.Windows.Forms.Label(); + this.lstDrives = new System.Windows.Forms.ListBox(); + this.button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // cmdClose + // + this.cmdClose.DialogResult = System.Windows.Forms.DialogResult.OK; + this.cmdClose.Location = new System.Drawing.Point(26, 224); + this.cmdClose.Name = "cmdClose"; + this.cmdClose.Size = new System.Drawing.Size(104, 24); + this.cmdClose.TabIndex = 5; + this.cmdClose.Text = "OK"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(8, 8); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(208, 16); + this.Label1.TabIndex = 4; + this.Label1.Text = "Choose a Drive:"; + // + // lstDrives + // + this.lstDrives.Location = new System.Drawing.Point(8, 24); + this.lstDrives.Name = "lstDrives"; + this.lstDrives.Size = new System.Drawing.Size(248, 173); + this.lstDrives.TabIndex = 3; + // + // button1 + // + this.button1.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.button1.Location = new System.Drawing.Point(133, 224); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(104, 24); + this.button1.TabIndex = 6; + this.button1.Text = "Cancel"; + // + // SelectDrive + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(266, 260); + this.Controls.Add(this.button1); + this.Controls.Add(this.cmdClose); + this.Controls.Add(this.Label1); + this.Controls.Add(this.lstDrives); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "SelectDrive"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "SelectDrive"; + this.Load += new System.EventHandler(this.SelectDrive_Load); + this.ResumeLayout(false); + + } + #endregion + + public Char DriveSelection; + + private void SelectDrive_Load(object sender, System.EventArgs e) + { + string[] drives = System.IO.Directory.GetLogicalDrives(); + lstDrives.DataSource = drives; + + // Select the current drive. + lstDrives.SelectedIndex = lstDrives.FindString(DriveSelection.ToString()); + + // Attach the event handler. + // This step is performed after the selected index is set, + // to prevent it from being overwritten as the list is built. + lstDrives.SelectedIndexChanged += new + EventHandler(lstDrives_SelectedIndexChanged); + + } + + private void lstDrives_SelectedIndexChanged(object sender, + System.EventArgs e) + { + DriveSelection = lstDrives.Text[0]; + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/SelectDrive.resx b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/SelectDrive.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/SelectDrive.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/bin/Debug/DirectoryTreeControl.dll b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/bin/Debug/DirectoryTreeControl.dll new file mode 100644 index 0000000..1dc062c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/bin/Debug/DirectoryTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/bin/Release/DirectoryTreeControl.dll b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/bin/Release/DirectoryTreeControl.dll new file mode 100644 index 0000000..28c6eb5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeControl/bin/Release/DirectoryTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/App.ico b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj new file mode 100644 index 0000000..e752ff6 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj @@ -0,0 +1,117 @@ + + + Local + 8.0.50727 + 2.0 + {822BA761-DEC0-48C6-BA50-290B02E1BF77} + Debug + AnyCPU + App.ico + + + DirectoryTreeHost + + + JScript + Grid + IE50 + false + WinExe + DirectoryTreeHost + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Design + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Design.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + + Form + + + DirectoryTreeTest.cs + + + + Designer + DirectoryTreeTest.cs + + + + + + {3BAAC556-742E-413E-B3EC-12E23DB99DB8} + DirectoryTreeControl + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj.user b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj.user new file mode 100644 index 0000000..1fceeb3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 08\DirectoryTreeControl\bin\Debug\;D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 07\DirectoryTreeControl\bin\Debug\;D:\Matthew\2002\Writing\Books\User Interfaces in VB .NET (and C#)\C#\Code\Chapter 08\DirectoryTreeControl\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.Designer.cs b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.Designer.cs new file mode 100644 index 0000000..67a1c9c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.Designer.cs @@ -0,0 +1,76 @@ +namespace DirectoryTreeHost +{ + partial class DirectoryTreeTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.directoryTree1 = new DirectoryTreeControl.DirectoryTree(); + this.propertyGrid1 = new System.Windows.Forms.PropertyGrid(); + this.SuspendLayout(); + // + // directoryTree1 + // + this.directoryTree1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.directoryTree1.Drive = 'C'; + this.directoryTree1.Location = new System.Drawing.Point(281, 4); + this.directoryTree1.Name = "directoryTree1"; + this.directoryTree1.Size = new System.Drawing.Size(291, 274); + this.directoryTree1.TabIndex = 4; + // + // propertyGrid1 + // + this.propertyGrid1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.propertyGrid1.LineColor = System.Drawing.SystemColors.ScrollBar; + this.propertyGrid1.Location = new System.Drawing.Point(4, 4); + this.propertyGrid1.Name = "propertyGrid1"; + this.propertyGrid1.SelectedObject = this.directoryTree1; + this.propertyGrid1.Size = new System.Drawing.Size(260, 272); + this.propertyGrid1.TabIndex = 3; + // + // DirectoryTreeTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(577, 282); + this.Controls.Add(this.directoryTree1); + this.Controls.Add(this.propertyGrid1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "DirectoryTreeTest"; + this.Text = "DirectoryTreeTest"; + this.ResumeLayout(false); + + } + + #endregion + + private DirectoryTreeControl.DirectoryTree directoryTree1; + private System.Windows.Forms.PropertyGrid propertyGrid1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.cs b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.cs new file mode 100644 index 0000000..d325f87 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace DirectoryTreeHost +{ + public partial class DirectoryTreeTest : Form + { + public DirectoryTreeTest() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.resx b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/DirectoryTreeTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/Program.cs b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/Program.cs new file mode 100644 index 0000000..c609036 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace DirectoryTreeHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new DirectoryTreeTest()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeControl.dll b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeControl.dll new file mode 100644 index 0000000..1dc062c Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeHost.exe b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeHost.exe new file mode 100644 index 0000000..668383a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Debug/DirectoryTreeHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeControl.dll b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeControl.dll new file mode 100644 index 0000000..28c6eb5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeHost.exe b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeHost.exe new file mode 100644 index 0000000..4910dc1 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/DirectoryTree/DirectoryTreeHost/bin/Release/DirectoryTreeHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanel.sln b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanel.sln new file mode 100644 index 0000000..47d9663 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanel.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GradientPanelControl", "GradientPanelControl\GradientPanelControl.csproj", "{249E3320-5FB8-48DC-AD25-DBE71195209A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GradientPanelHost", "GradientPanelHost\GradientPanelHost.csproj", "{9BA9D88F-A938-44BF-ACDE-29F63B54D586}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {249E3320-5FB8-48DC-AD25-DBE71195209A}.Release|Any CPU.Build.0 = Release|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9BA9D88F-A938-44BF-ACDE-29F63B54D586}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanel.suo b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanel.suo new file mode 100644 index 0000000..9b4f5ac Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanel.suo differ diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanel.cs b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanel.cs new file mode 100644 index 0000000..e01cd81 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanel.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Drawing.Drawing2D; +using System.Drawing.Design; +// Needed for advanced visual styles scenarios +using System.Windows.Forms.VisualStyles; + +namespace GradientPanelControl +{ + [Designer(typeof(GradientPanelDesigner))] + public class GradientPanel : Panel + { + private LinearGradientBrush gradientBrush; + private LinearGradientBrush GradientBrush + { + get + { + if (gradientBrush == null) + { + gradientBrush = + new LinearGradientBrush(ClientRectangle, colorA, + colorB, gradientStyle); + } + return gradientBrush; + } + } + + private Color colorA = Color.LightBlue; + private Color colorB = Color.Purple; + private LinearGradientMode gradientStyle = LinearGradientMode.ForwardDiagonal; + + + public Color ColorA + { + get + { + return colorA; + } + set + { + colorA = value; + gradientBrush = null; + Invalidate(); + } + } + + public Color ColorB + { + get + { + return colorB; + } + set + { + colorB = value; + gradientBrush = null; + Invalidate(); + } + } + + public LinearGradientMode GradientFillStyle + { + get + { + return gradientStyle; + } + set + { + gradientStyle = value; + gradientBrush = null; + Invalidate(); + } + } + + public GradientPanel() + { + ResizeRedraw = true; + } + + protected override void OnPaintBackground( + System.Windows.Forms.PaintEventArgs e) + { + e.Graphics.FillRectangle(GradientBrush, ClientRectangle); + } + + protected override void OnScroll(ScrollEventArgs se) + { + Invalidate(); + } + } + + +} diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanel.resx b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanel.resx new file mode 100644 index 0000000..cde0d27 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanel.resx @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + GradientLabel + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelActionList.cs b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelActionList.cs new file mode 100644 index 0000000..175963e --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelActionList.cs @@ -0,0 +1,151 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Drawing.Drawing2D; + +#endregion + +namespace GradientPanelControl +{ + public class GradientPanelActionList : System.ComponentModel.Design.DesignerActionList + { + private GradientPanel linkedControl; + + // The constructor associates the control to the smart tag action list. + + public GradientPanelActionList(GradientPanel ctrl) :base(ctrl) + { + linkedControl = ctrl; + } + + + // A helper method to retrieve control properties. + // GetProperties ensures undo and menu updates to work properly. + + private PropertyDescriptor GetPropertyByName(String propName) + { + + PropertyDescriptor prop; + prop = TypeDescriptor.GetProperties(linkedControl)[propName]; + + if (null == prop) + { + throw new ArgumentException( + "Matching property not found.", propName); + } + else + { + return prop; + } + } + + + // Properties that are targets of DesignerActionPropertyItem + // entries. + + public Color ColorA + { + get + { + return linkedControl.ColorA; + } + set + { + GetPropertyByName("ColorA").SetValue(linkedControl, value); + } + } + + public Color ColorB + { + get + { + return linkedControl.ColorB; + } + set + { + GetPropertyByName("ColorB").SetValue(linkedControl, value); + } + } + + public LinearGradientMode GradientFillStyle + { + get + { + return linkedControl.GradientFillStyle; + } + set + { + GetPropertyByName("GradientFillStyle").SetValue(linkedControl, value); + } + } + + // Method that is target of a DesignerActionMethodItem + + public void ChooseRandomColors() + { + Random rand = new Random(); + + // Set the colors through the property procedures + // in this class. + ColorA = Color.FromArgb(rand.Next(255), rand.Next(255), rand.Next(255)); + ColorB = Color.FromArgb(rand.Next(255), rand.Next(255), rand.Next(255)); + + } + + + + // Implementation of this abstract method creates smart tag + // items, associates their targets, and collects into list. + public override DesignerActionItemCollection GetSortedActionItems() + { + // Create 8 items. + DesignerActionItemCollection items = new DesignerActionItemCollection(); + + // Begin by creating the headers. + items.Add(new DesignerActionHeaderItem("Appearance")); + items.Add(new DesignerActionHeaderItem("Information")); + + // Add items that wrap the properties. + items.Add(new DesignerActionPropertyItem("ColorA", + "Gradient Color A", "Appearance", + "Sets the first color in the gradient.")); + + items.Add(new DesignerActionPropertyItem("ColorB", + "Gradient Color B", "Appearance", + "Sets the second color in the gradient.")); + + items.Add(new DesignerActionPropertyItem("GradientFillStyle", + "Gradient Fill Style", "Appearance", + "Sets the blend direction for the gradient.")); + + // Add an action link. + // This item is also added to the context menu + // as a designer verb. + items.Add(new DesignerActionMethodItem(this, + "ChooseRandomColors", "Randomize colors", + "Appearance", + "Chooses random colors for the gradient.", + true)); + + // Create entries for static Information section. + items.Add(new DesignerActionTextItem( + "Location: " + linkedControl.Location.ToString(), + "Information")); + + items.Add(new DesignerActionTextItem( + "Location: " + linkedControl.Size.ToString(), + "Information")); + + return items; + + } + + + } + +} diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelControl.csproj b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelControl.csproj new file mode 100644 index 0000000..6e8f1cb --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelControl.csproj @@ -0,0 +1,114 @@ + + + Local + 8.0.50727 + 2.0 + {249E3320-5FB8-48DC-AD25-DBE71195209A} + Debug + AnyCPU + + + + + GradientPanelControl + + + JScript + Grid + IE50 + false + Library + GradientPanelControl + OnBuildSuccess + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + Code + + + Component + + + + + GradientPanel.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelControl.csproj.user b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelControl.csproj.user new file mode 100644 index 0000000..5414047 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelControl.csproj.user @@ -0,0 +1,58 @@ + + + 7.10.3077 + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelControl.suo b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelControl.suo new file mode 100644 index 0000000..82348c8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelControl.suo differ diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelDesigner.cs b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelDesigner.cs new file mode 100644 index 0000000..c2fb8d5 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/GradientPanelDesigner.cs @@ -0,0 +1,30 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms.Design; +using System.ComponentModel.Design; + +#endregion + +namespace GradientPanelControl +{ + public class GradientPanelDesigner : System.Windows.Forms.Design.ParentControlDesigner + { + private DesignerActionListCollection actionLists; + + public override DesignerActionListCollection ActionLists + { + get + { + if (actionLists == null) + { + actionLists = new DesignerActionListCollection(); + actionLists.Add(new GradientPanelActionList((GradientPanel)Control)); + } + return actionLists; + } + } + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/bin/Debug/GradientPanelControl.dll b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/bin/Debug/GradientPanelControl.dll new file mode 100644 index 0000000..6f82fb8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/bin/Debug/GradientPanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/bin/Release/GradientPanelControl.dll b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/bin/Release/GradientPanelControl.dll new file mode 100644 index 0000000..5fa82f5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelControl/bin/Release/GradientPanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/App.ico b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelHost.csproj b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelHost.csproj new file mode 100644 index 0000000..6f757e4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelHost.csproj @@ -0,0 +1,126 @@ + + + Local + 8.0.50727 + 2.0 + {9BA9D88F-A938-44BF-ACDE-29F63B54D586} + Debug + AnyCPU + App.ico + + + GradientPanelHost + + + JScript + Grid + IE50 + false + WinExe + GradientPanelHost + OnBuildSuccess + GradientPanelHost.Program + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + Form + + + GradientPanelTest.cs + + + + Designer + GradientPanelTest.cs + + + + + + {249E3320-5FB8-48DC-AD25-DBE71195209A} + GradientPanelControl + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelHost.csproj.user b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelHost.csproj.user new file mode 100644 index 0000000..9c11a20 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelHost.csproj.user @@ -0,0 +1,57 @@ + + + 8.0.50215 + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 13\GradientLabel\bin\Debug\;C:\Code\UserInterfaces\Code\Chapter 13\GradientLabel\bin\Debug\;D:\Code\UserInterfaces\Chapter 17\GradientLabel\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelTest.Designer.cs b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelTest.Designer.cs new file mode 100644 index 0000000..3b6a55c --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelTest.Designer.cs @@ -0,0 +1,126 @@ +namespace GradientPanelHost +{ + partial class GradientPanelTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.gradientPanel1 = new GradientPanelControl.GradientPanel(); + this.label3 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.gradientPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // gradientPanel1 + // + this.gradientPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gradientPanel1.AutoScroll = true; + this.gradientPanel1.ColorA = System.Drawing.Color.LightCyan; + this.gradientPanel1.ColorB = System.Drawing.Color.Crimson; + this.gradientPanel1.Controls.Add(this.label3); + this.gradientPanel1.Controls.Add(this.button1); + this.gradientPanel1.Controls.Add(this.label2); + this.gradientPanel1.Controls.Add(this.label1); + this.gradientPanel1.GradientFillStyle = System.Drawing.Drawing2D.LinearGradientMode.Vertical; + this.gradientPanel1.Location = new System.Drawing.Point(4, 6); + this.gradientPanel1.Name = "gradientPanel1"; + this.gradientPanel1.Size = new System.Drawing.Size(427, 190); + this.gradientPanel1.TabIndex = 1; + // + // label3 + // + this.label3.BackColor = System.Drawing.Color.Transparent; + this.label3.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.ForeColor = System.Drawing.Color.White; + this.label3.Location = new System.Drawing.Point(18, 57); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(328, 39); + this.label3.TabIndex = 2; + this.label3.Text = "These labels have a transparent background, which lets the gradient show through." + + ""; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(231, 109); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "Test Button"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(40, 226); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(108, 37); + this.label2.TabIndex = 1; + this.label2.Text = "label2"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(17, 12); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(277, 37); + this.label1.TabIndex = 0; + this.label1.Text = "Transparent Text"; + // + // GradientPanelTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(435, 260); + this.Controls.Add(this.gradientPanel1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "GradientPanelTest"; + this.Text = "GradientPanel"; + this.gradientPanel1.ResumeLayout(false); + this.gradientPanel1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private GradientPanelControl.GradientPanel gradientPanel1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + + + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelTest.cs b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelTest.cs new file mode 100644 index 0000000..0cb237b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelTest.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace GradientPanelHost +{ + public partial class GradientPanelTest : Form + { + public GradientPanelTest() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelTest.resx b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelTest.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/GradientPanelTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/Program.cs b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/Program.cs new file mode 100644 index 0000000..dfed262 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace GradientPanelHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new GradientPanelTest()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelControl.dll b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelControl.dll new file mode 100644 index 0000000..6f82fb8 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelHost.exe b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelHost.exe new file mode 100644 index 0000000..832f53e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Debug/GradientPanelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Release/GradientPanelControl.dll b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Release/GradientPanelControl.dll new file mode 100644 index 0000000..5fa82f5 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Release/GradientPanelControl.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Release/GradientPanelHost.exe b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Release/GradientPanelHost.exe new file mode 100644 index 0000000..b5749fe Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/GradientPanel/GradientPanelHost/bin/Release/GradientPanelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabel.sln b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabel.sln new file mode 100644 index 0000000..7479435 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabel.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarqueeLabelHost", "MarqueeLabelHost\MarqueeLabelHost.csproj", "{F933461B-85EC-4C6C-8DE8-C2B65C51E696}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarqueeLabel", "MarqueeLabelControl\MarqueeLabel.csproj", "{2ED8BBD1-D421-450A-92A5-A6CAAACCE155}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Release|Any CPU.Build.0 = Release|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabel.suo b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabel.suo new file mode 100644 index 0000000..65576b4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabel.suo differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.cs new file mode 100644 index 0000000..9fb2aea --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace MarqueeLabel +{ + [Designer(typeof(MarqueeLabelDesigner))] + public class MarqueeLabel : Control + { + private System.ComponentModel.IContainer components; + + public MarqueeLabel() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + DoubleBuffered = true; + ResizeRedraw = true; + } + + public void Scroll(bool state) + { + tmrScroll.Enabled = state; + } + + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmrScroll = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // tmrScroll + // + this.tmrScroll.Tick += new System.EventHandler(this.tmrScroll_Tick); + // + // MarqueeLabel + // + this.Size = new System.Drawing.Size(360, 104); + this.ResumeLayout(false); + + } + #endregion + + private string text; + private int scrollAmount = 10; + internal System.Windows.Forms.Timer tmrScroll; + private int position = 0; + + private void tmrScroll_Tick(object sender, System.EventArgs e) + { + position += scrollAmount; + + // Force a refresh. + Invalidate(); + } + + [Browsable(true), + DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public override string Text + { + get + { + return text; + } + set + { + text = value; + Invalidate(); + } + } + + public int ScrollTimeInterval + { + get + { + return tmrScroll.Interval; + } + set + { + tmrScroll.Interval = value; + } + } + + [DefaultValue(10)] + public int ScrollPixelAmount + { + get + { + return scrollAmount; + } + set + { + scrollAmount = value; + } + } + + + protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) + { + base.OnPaint(e); + + + if (position > Width) + { + // Reset the text to scroll back onto the control. + position = -(int)e.Graphics.MeasureString(text, Font).Width; + } + + //e.Graphics.FillRectangle(new SolidBrush(BackColor), e.ClipRectangle); + e.Graphics.DrawString(text, Font, new SolidBrush(ForeColor), position, 0); + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.csproj b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.csproj new file mode 100644 index 0000000..4be9318 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.csproj @@ -0,0 +1,109 @@ + + + Local + 8.0.50727 + 2.0 + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155} + Debug + AnyCPU + + + + + MarqueeLabel + + + JScript + Grid + IE50 + false + Library + MarqueeLabel + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + Code + + + Component + + + + MarqueeLabel.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.csproj.user b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.csproj.user new file mode 100644 index 0000000..277f465 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.resx b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.resx new file mode 100644 index 0000000..205e144 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabel.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 22, 27 + + + False + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabelDesigner.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabelDesigner.cs new file mode 100644 index 0000000..91cac59 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/MarqueeLabelDesigner.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms.Design; +using System.Collections; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; + +namespace MarqueeLabel +{ + public class MarqueeLabelDesigner : ControlDesigner + { + private bool allowDesignTimeScroll; + public bool AllowDesignTimeScroll + { + get { return allowDesignTimeScroll; } + set + { + ((MarqueeLabel)Control).Scroll(value); + allowDesignTimeScroll = value; + } + } + + protected override void PreFilterProperties(IDictionary properties) + { + base.PreFilterProperties(properties); + + // Add a new property. + properties["AllowDesignTimeScroll"] = TypeDescriptor.CreateProperty( + typeof(MarqueeLabelDesigner), "AllowDesignTimeScroll", typeof(bool), + CategoryAttribute.Design, DesignOnlyAttribute.Yes); + } + + + private DesignerVerbCollection verbs = new DesignerVerbCollection(); + + public MarqueeLabelDesigner() + { + verbs.Add(new DesignerVerb("Apply Funky Theme", + new EventHandler(OnVerbFunky))); + } + + public override DesignerVerbCollection Verbs + { + get { return verbs; } + } + + protected void OnVerbFunky(object sender, EventArgs e) + { + // Get the associated control. + MarqueeLabel lbl = (MarqueeLabel)Control; + + // Get the IComponentChangeService. + IDesignerHost host = (IDesignerHost)GetService(typeof(IDesignerHost)); + IComponentChangeService changeService = + (IComponentChangeService)GetService(typeof(IComponentChangeService)); + + // Start the transaction. + DesignerTransaction tran = host.CreateTransaction("Apply Funky Theme"); + + changeService.OnComponentChanging(lbl, null); + lbl.ForeColor = Color.LimeGreen; + lbl.BackColor = Color.Yellow; + lbl.Font = new Font(lbl.Font.Name, 48, FontStyle.Bold); + changeService.OnComponentChanged(lbl, null, null, null); + + // Commit the transaction. + tran.Commit(); + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll new file mode 100644 index 0000000..615aedc Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/bin/Release/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/bin/Release/MarqueeLabel.dll new file mode 100644 index 0000000..125784b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelControl/bin/Release/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/App.ico b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeLabelHost.csproj b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeLabelHost.csproj new file mode 100644 index 0000000..a08f4ac --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeLabelHost.csproj @@ -0,0 +1,118 @@ + + + Local + 8.0.50727 + 2.0 + {F933461B-85EC-4C6C-8DE8-C2B65C51E696} + Debug + AnyCPU + App.ico + + + MarqueeLabelHost + + + JScript + Grid + IE50 + false + WinExe + MarqueeLabelHost + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + Form + + + MarqueeTestForm.cs + + + + Designer + MarqueeTestForm.cs + + + + + + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155} + MarqueeLabel + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeLabelHost.csproj.user b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeLabelHost.csproj.user new file mode 100644 index 0000000..5b35e22 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeLabelHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 13\MarqueeLabel\bin\Debug\;D:\Matthew\2002\Writing\Books\User Interfaces in .NET\C#\Code\Chapter 13\MarqueeLabel\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeTestForm.Designer.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeTestForm.Designer.cs new file mode 100644 index 0000000..d41df23 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeTestForm.Designer.cs @@ -0,0 +1,139 @@ +namespace MarqueeLabelHost +{ + partial class MarqueeTestForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.tbInterval = new System.Windows.Forms.TrackBar(); + this.Label1 = new System.Windows.Forms.Label(); + this.tbAmount = new System.Windows.Forms.TrackBar(); + this.marqueeLabel1 = new MarqueeLabel.MarqueeLabel(); + this.GroupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tbInterval)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.tbAmount)).BeginInit(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.tbInterval); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.tbAmount); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(22, 177); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(336, 132); + this.GroupBox1.TabIndex = 6; + this.GroupBox1.TabStop = false; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(12, 76); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(80, 23); + this.Label2.TabIndex = 6; + this.Label2.Text = "Scroll Interval:"; + // + // tbInterval + // + this.tbInterval.Location = new System.Drawing.Point(96, 72); + this.tbInterval.Maximum = 500; + this.tbInterval.Minimum = 10; + this.tbInterval.Name = "tbInterval"; + this.tbInterval.Size = new System.Drawing.Size(228, 45); + this.tbInterval.TabIndex = 5; + this.tbInterval.TickFrequency = 10; + this.tbInterval.Value = 100; + this.tbInterval.ValueChanged += new System.EventHandler(this.tbInterval_ValueChanged); + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(12, 20); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(80, 23); + this.Label1.TabIndex = 4; + this.Label1.Text = "Scroll Amount:"; + // + // tbAmount + // + this.tbAmount.Location = new System.Drawing.Point(96, 16); + this.tbAmount.Maximum = 20; + this.tbAmount.Name = "tbAmount"; + this.tbAmount.Size = new System.Drawing.Size(228, 45); + this.tbAmount.TabIndex = 3; + this.tbAmount.Value = 10; + this.tbAmount.ValueChanged += new System.EventHandler(this.tbAmount_ValueChanged); + // + // marqueeLabel1 + // + this.marqueeLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.marqueeLabel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); + this.marqueeLabel1.Font = new System.Drawing.Font("Verdana", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.marqueeLabel1.ForeColor = System.Drawing.Color.Navy; + this.marqueeLabel1.Location = new System.Drawing.Point(-2, 7); + this.marqueeLabel1.Name = "marqueeLabel1"; + this.marqueeLabel1.ScrollTimeInterval = 100; + this.marqueeLabel1.Size = new System.Drawing.Size(384, 156); + this.marqueeLabel1.TabIndex = 7; + this.marqueeLabel1.Tag = ""; + this.marqueeLabel1.Text = "This scrolls!"; + // + // MarqueeTestForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(381, 322); + this.Controls.Add(this.marqueeLabel1); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "MarqueeTestForm"; + this.Text = "MarqueeTestForm"; + this.Load += new System.EventHandler(this.MarqueeTestForm_Load); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tbInterval)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.tbAmount)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private MarqueeLabel.MarqueeLabel marqueeLabel1; + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.TrackBar tbInterval; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.TrackBar tbAmount; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeTestForm.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeTestForm.cs new file mode 100644 index 0000000..7c661a8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeTestForm.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MarqueeLabelHost +{ + public partial class MarqueeTestForm : Form + { + public MarqueeTestForm() + { + InitializeComponent(); + } + + private void tbAmount_ValueChanged(object sender, EventArgs e) + { + marqueeLabel1.ScrollPixelAmount = tbAmount.Value; + } + + private void tbInterval_ValueChanged(object sender, EventArgs e) + { + marqueeLabel1.ScrollTimeInterval = tbInterval.Value; + } + + private void MarqueeTestForm_Load(object sender, EventArgs e) + { + marqueeLabel1.Scroll(true); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeTestForm.resx b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeTestForm.resx new file mode 100644 index 0000000..ed8f4b3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/MarqueeTestForm.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/Program.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/Program.cs new file mode 100644 index 0000000..33a6330 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace MarqueeLabelHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new MarqueeTestForm()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll new file mode 100644 index 0000000..615aedc Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe new file mode 100644 index 0000000..752ce3d Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe new file mode 100644 index 0000000..206e0af Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_DesignTimeProperty/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabel.sln b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabel.sln new file mode 100644 index 0000000..7479435 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabel.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarqueeLabelHost", "MarqueeLabelHost\MarqueeLabelHost.csproj", "{F933461B-85EC-4C6C-8DE8-C2B65C51E696}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarqueeLabel", "MarqueeLabelControl\MarqueeLabel.csproj", "{2ED8BBD1-D421-450A-92A5-A6CAAACCE155}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F933461B-85EC-4C6C-8DE8-C2B65C51E696}.Release|Any CPU.Build.0 = Release|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabel.suo b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabel.suo new file mode 100644 index 0000000..aedef81 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabel.suo differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.cs new file mode 100644 index 0000000..0206000 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace MarqueeLabel +{ + [Designer(typeof(MarqueeLabelDesigner))] + public class MarqueeLabel : Control + { + private System.ComponentModel.IContainer components; + + public MarqueeLabel() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + DoubleBuffered = true; + ResizeRedraw = true; + } + + public bool EnableScrolling + { + get { return tmrScroll.Enabled; } + set { tmrScroll.Enabled = value; } + } + + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tmrScroll = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // tmrScroll + // + this.tmrScroll.Tick += new System.EventHandler(this.tmrScroll_Tick); + // + // MarqueeLabel + // + this.Size = new System.Drawing.Size(360, 104); + this.ResumeLayout(false); + + } + #endregion + + private string text; + private int scrollAmount = 10; + internal System.Windows.Forms.Timer tmrScroll; + private int position = 0; + + private void tmrScroll_Tick(object sender, System.EventArgs e) + { + position += scrollAmount; + + // Force a refresh. + Invalidate(); + } + + [Browsable(true), + DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] + public override string Text + { + get + { + return text; + } + set + { + text = value; + Invalidate(); + } + } + + public int ScrollTimeInterval + { + get + { + return tmrScroll.Interval; + } + set + { + tmrScroll.Interval = value; + } + } + + [DefaultValue(10)] + public int ScrollPixelAmount + { + get + { + return scrollAmount; + } + set + { + scrollAmount = value; + } + } + + + protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) + { + base.OnPaint(e); + + + if (position > Width) + { + // Reset the text to scroll back onto the control. + position = -(int)e.Graphics.MeasureString(text, Font).Width; + } + + //e.Graphics.FillRectangle(new SolidBrush(BackColor), e.ClipRectangle); + e.Graphics.DrawString(text, Font, new SolidBrush(ForeColor), position, 0); + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.csproj b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.csproj new file mode 100644 index 0000000..4be9318 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.csproj @@ -0,0 +1,109 @@ + + + Local + 8.0.50727 + 2.0 + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155} + Debug + AnyCPU + + + + + MarqueeLabel + + + JScript + Grid + IE50 + false + Library + MarqueeLabel + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + Code + + + Component + + + + MarqueeLabel.cs + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.csproj.user b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.csproj.user new file mode 100644 index 0000000..277f465 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.resx b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.resx new file mode 100644 index 0000000..205e144 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabel.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 22, 27 + + + False + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabelDesigner.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabelDesigner.cs new file mode 100644 index 0000000..aa085d4 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/MarqueeLabelDesigner.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms.Design; +using System.Collections; +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; + +namespace MarqueeLabel +{ + public class MarqueeLabelDesigner : ControlDesigner + { + public bool EnableScrolling + { + get { return (bool)ShadowProperties["EnableScrolling"]; } + set { ShadowProperties["EnableScrolling"] = value; } + } + + public override void Initialize(IComponent c) + { + base.Initialize(c); + + // Shadow the EnableScrolling property. + EnableScrolling = ((MarqueeLabel)Control).EnableScrolling; + + // Now turn off scrolling in the underlying control. + ((MarqueeLabel)Control).EnableScrolling = false; + } + + protected override void PreFilterProperties(IDictionary properties) + { + base.PreFilterProperties(properties); + + properties["EnableScrolling"] = TypeDescriptor.CreateProperty( + typeof(MarqueeLabelDesigner), + (PropertyDescriptor)properties["EnableScrolling"], + new Attribute[0]); + } + + private DesignerVerbCollection verbs = new DesignerVerbCollection(); + + public MarqueeLabelDesigner() + { + verbs.Add(new DesignerVerb("Apply Funky Theme", + new EventHandler(OnVerbFunky))); + } + + public override DesignerVerbCollection Verbs + { + get { return verbs; } + } + + protected void OnVerbFunky(object sender, EventArgs e) + { + // Get the associated control. + MarqueeLabel lbl = (MarqueeLabel)Control; + + // Get the IComponentChangeService. + IDesignerHost host = (IDesignerHost)GetService(typeof(IDesignerHost)); + IComponentChangeService changeService = + (IComponentChangeService)GetService(typeof(IComponentChangeService)); + + // Start the transaction. + DesignerTransaction tran = host.CreateTransaction("Apply Funky Theme"); + + changeService.OnComponentChanging(lbl, null); + lbl.ForeColor = Color.LimeGreen; + lbl.BackColor = Color.Yellow; + lbl.Font = new Font(lbl.Font.Name, 48, FontStyle.Bold); + changeService.OnComponentChanged(lbl, null, null, null); + + // Commit the transaction. + tran.Commit(); + } + + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll new file mode 100644 index 0000000..b41ff4a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/bin/Debug/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/bin/Release/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/bin/Release/MarqueeLabel.dll new file mode 100644 index 0000000..ccfc54a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelControl/bin/Release/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/App.ico b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeLabelHost.csproj b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeLabelHost.csproj new file mode 100644 index 0000000..a08f4ac --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeLabelHost.csproj @@ -0,0 +1,118 @@ + + + Local + 8.0.50727 + 2.0 + {F933461B-85EC-4C6C-8DE8-C2B65C51E696} + Debug + AnyCPU + App.ico + + + MarqueeLabelHost + + + JScript + Grid + IE50 + false + WinExe + MarqueeLabelHost + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + Form + + + MarqueeTestForm.cs + + + + Designer + MarqueeTestForm.cs + + + + + + {2ED8BBD1-D421-450A-92A5-A6CAAACCE155} + MarqueeLabel + + + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeLabelHost.csproj.user b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeLabelHost.csproj.user new file mode 100644 index 0000000..5b35e22 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeLabelHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 13\MarqueeLabel\bin\Debug\;D:\Matthew\2002\Writing\Books\User Interfaces in .NET\C#\Code\Chapter 13\MarqueeLabel\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.40607 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeTestForm.Designer.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeTestForm.Designer.cs new file mode 100644 index 0000000..7ce2ea9 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeTestForm.Designer.cs @@ -0,0 +1,140 @@ +namespace MarqueeLabelHost +{ + partial class MarqueeTestForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.Label2 = new System.Windows.Forms.Label(); + this.tbInterval = new System.Windows.Forms.TrackBar(); + this.Label1 = new System.Windows.Forms.Label(); + this.tbAmount = new System.Windows.Forms.TrackBar(); + this.marqueeLabel1 = new MarqueeLabel.MarqueeLabel(); + this.GroupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tbInterval)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.tbAmount)).BeginInit(); + this.SuspendLayout(); + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Controls.Add(this.Label2); + this.GroupBox1.Controls.Add(this.tbInterval); + this.GroupBox1.Controls.Add(this.Label1); + this.GroupBox1.Controls.Add(this.tbAmount); + this.GroupBox1.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.GroupBox1.Location = new System.Drawing.Point(22, 177); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Size = new System.Drawing.Size(336, 132); + this.GroupBox1.TabIndex = 6; + this.GroupBox1.TabStop = false; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point(12, 76); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size(80, 23); + this.Label2.TabIndex = 6; + this.Label2.Text = "Scroll Interval:"; + // + // tbInterval + // + this.tbInterval.Location = new System.Drawing.Point(96, 72); + this.tbInterval.Maximum = 500; + this.tbInterval.Minimum = 10; + this.tbInterval.Name = "tbInterval"; + this.tbInterval.Size = new System.Drawing.Size(228, 45); + this.tbInterval.TabIndex = 5; + this.tbInterval.TickFrequency = 10; + this.tbInterval.Value = 100; + this.tbInterval.ValueChanged += new System.EventHandler(this.tbInterval_ValueChanged); + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point(12, 20); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(80, 23); + this.Label1.TabIndex = 4; + this.Label1.Text = "Scroll Amount:"; + // + // tbAmount + // + this.tbAmount.Location = new System.Drawing.Point(96, 16); + this.tbAmount.Maximum = 20; + this.tbAmount.Name = "tbAmount"; + this.tbAmount.Size = new System.Drawing.Size(228, 45); + this.tbAmount.TabIndex = 3; + this.tbAmount.Value = 10; + this.tbAmount.ValueChanged += new System.EventHandler(this.tbAmount_ValueChanged); + // + // marqueeLabel1 + // + this.marqueeLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.marqueeLabel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); + this.marqueeLabel1.EnableScrolling = true; + this.marqueeLabel1.Font = new System.Drawing.Font("Verdana", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.marqueeLabel1.ForeColor = System.Drawing.Color.Navy; + this.marqueeLabel1.Location = new System.Drawing.Point(-2, 7); + this.marqueeLabel1.Name = "marqueeLabel1"; + this.marqueeLabel1.ScrollTimeInterval = 100; + this.marqueeLabel1.Size = new System.Drawing.Size(384, 156); + this.marqueeLabel1.TabIndex = 7; + this.marqueeLabel1.Tag = ""; + this.marqueeLabel1.Text = "This scrolls!"; + // + // MarqueeTestForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(381, 322); + this.Controls.Add(this.marqueeLabel1); + this.Controls.Add(this.GroupBox1); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Name = "MarqueeTestForm"; + this.Text = "MarqueeTestForm"; + this.Load += new System.EventHandler(this.MarqueeTestForm_Load); + this.GroupBox1.ResumeLayout(false); + this.GroupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tbInterval)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.tbAmount)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private MarqueeLabel.MarqueeLabel marqueeLabel1; + internal System.Windows.Forms.GroupBox GroupBox1; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.TrackBar tbInterval; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.TrackBar tbAmount; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeTestForm.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeTestForm.cs new file mode 100644 index 0000000..06f4571 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeTestForm.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace MarqueeLabelHost +{ + public partial class MarqueeTestForm : Form + { + public MarqueeTestForm() + { + InitializeComponent(); + } + + private void tbAmount_ValueChanged(object sender, EventArgs e) + { + marqueeLabel1.ScrollPixelAmount = tbAmount.Value; + } + + private void tbInterval_ValueChanged(object sender, EventArgs e) + { + marqueeLabel1.ScrollTimeInterval = tbInterval.Value; + } + + private void MarqueeTestForm_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeTestForm.resx b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeTestForm.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/MarqueeTestForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/Program.cs b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/Program.cs new file mode 100644 index 0000000..33a6330 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace MarqueeLabelHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.Run(new MarqueeTestForm()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll new file mode 100644 index 0000000..b41ff4a Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/bin/Debug/MarqueeLabel.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe new file mode 100644 index 0000000..760d404 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/bin/Debug/MarqueeLabelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe new file mode 100644 index 0000000..8fecc7e Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/MarqueeLabel_ShadowedProperty/MarqueeLabelHost/bin/Release/MarqueeLabelHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChart.sln b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChart.sln new file mode 100644 index 0000000..6f5309a --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChart.sln @@ -0,0 +1,25 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleChartHost", "SimpleChartHost\SimpleChartHost.csproj", "{3CD20CA2-3CDA-4102-9A25-B76CF3B692AF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleChartControl", "SimpleChartControl\SimpleChartControl.csproj", "{68E24D61-5B4F-4657-BF86-796C101D5614}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3CD20CA2-3CDA-4102-9A25-B76CF3B692AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3CD20CA2-3CDA-4102-9A25-B76CF3B692AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3CD20CA2-3CDA-4102-9A25-B76CF3B692AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3CD20CA2-3CDA-4102-9A25-B76CF3B692AF}.Release|Any CPU.Build.0 = Release|Any CPU + {68E24D61-5B4F-4657-BF86-796C101D5614}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68E24D61-5B4F-4657-BF86-796C101D5614}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68E24D61-5B4F-4657-BF86-796C101D5614}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68E24D61-5B4F-4657-BF86-796C101D5614}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChart.suo b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChart.suo new file mode 100644 index 0000000..3786ade Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChart.suo differ diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItem.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItem.cs new file mode 100644 index 0000000..3c44f80 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItem.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.Design; +using System.ComponentModel; +using System.Globalization; +using System.Reflection; +using System.ComponentModel.Design.Serialization; +using System.Collections; +using System.Drawing; + +namespace SimpleChart +{ + [Serializable()] + [TypeConverter(typeof(BarItemConverter))] + public class BarItem + { + private string shortForm; + public string ShortForm + { + get { return shortForm; } + set { shortForm = value; } + } + + private float barValue; + public float Value + { + get { return barValue; } + set { barValue = value; } + } + + public BarItem() + { + } + + public BarItem(string shortForm, float value) + { + this.ShortForm = shortForm; + this.Value = value; + } + } + + + +} diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItemCollection.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItemCollection.cs new file mode 100644 index 0000000..66ecbc1 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItemCollection.cs @@ -0,0 +1,43 @@ +#region Using directives + +using System; +using System.Collections; +using System.Text; +using System.ComponentModel.Design; +using System.Drawing.Design; + + +#endregion + +namespace SimpleChart +{ + [System.ComponentModel.Editor(typeof(BarItemCollectionEditor), + typeof(System.Drawing.Design.UITypeEditor))] + public class BarItemCollection : CollectionBase + { + public void Add(BarItem item) + { + this.List.Add(item); + } + + public void Remove(int index) + { + // Check to see if there is an item at the supplied index. + if ((index > Count - 1) || (index < 0)) + { + throw new System.IndexOutOfRangeException(); + } + else + { + this.List.RemoveAt(index); + } + } + + public BarItem this[int i] + { + get {return (BarItem)this.List[i]; } + set {this.List[i] = value;} + } + } + +} diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItemCollectionEditor.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItemCollectionEditor.cs new file mode 100644 index 0000000..0b69973 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItemCollectionEditor.cs @@ -0,0 +1,32 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel.Design; + +#endregion + +namespace SimpleChart +{ + public class BarItemCollectionEditor : CollectionEditor + { + public BarItemCollectionEditor(Type type) : base(type) + { } + + public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value) + { + object returnObject = base.EditValue(context, provider, value); + ((SimpleChart)Context.Instance).RebuildChart(); + return returnObject; + } + + protected override object CreateInstance(Type itemType) + { + BarItem item = new BarItem("Enter Title Here", 0); + return item; + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItemConverter.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItemConverter.cs new file mode 100644 index 0000000..c3eadff --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/BarItemConverter.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.ComponentModel; +using System.Globalization; +using System.ComponentModel.Design.Serialization; +using System.Reflection; + +namespace SimpleChart +{ + public class BarItemConverter : ExpandableObjectConverter + { + public override bool CanConvertFrom(ITypeDescriptorContext context, Type t) + { + if (t == typeof(string)) + return true; + else + return base.CanConvertFrom(context, t); + } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destType) + { + if (destType == typeof(InstanceDescriptor) || destType == typeof(string)) + return true; + else + return base.CanConvertTo(context, destType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo info, object value) + { + if (value is string) + { + try + { + string[] elements = ((string)value).Split(','); + return new BarItem(elements[0], float.Parse(elements[1])); + } + catch + { + throw new ArgumentException("Could not convert the value"); + } + } + return base.ConvertFrom(context, info, value); + } + + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo info, object value, Type destType) + { + if (destType == typeof(string)) + { + BarItem item = (BarItem)value; + return String.Format("{0}, {1}", item.ShortForm, item.Value); + } + else if (destType == typeof(InstanceDescriptor)) + { + BarItem item = (BarItem)value; + ConstructorInfo ctor = + typeof(BarItem).GetConstructor( + new Type[] { typeof(string), typeof(float) }); + + return new InstanceDescriptor(ctor, + new object[] { item.ShortForm, item.Value }); + } + else + { + return base.ConvertTo(context, info, value, destType); + } + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChart.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChart.cs new file mode 100644 index 0000000..8244ca8 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChart.cs @@ -0,0 +1,263 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Windows.Forms.VisualStyles; +using System.ComponentModel.Design; +using System.Collections; + +namespace SimpleChart +{ + [Designer(typeof(SimpleChartDesigner))] + public class SimpleChart : Control + { + private IContainer components; + + public SimpleChart() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + // TODO: Add any initialization after the InitForm call + DoubleBuffered = true; + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.toolTip = new System.Windows.Forms.ToolTip(this.components); + this.SuspendLayout(); + // + // SimpleChart + // + this.Size = new System.Drawing.Size(372, 228); + this.Resize += new System.EventHandler(this.SimpleChart_Resize); + this.ResumeLayout(false); + + } + #endregion + + private BarItemCollection bars = new BarItemCollection(); + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + public BarItemCollection Bars + { + get + { + return bars; + } + set + { + bars = value; + RebuildChart(); + } + } + + private List barRectangles = new List(); + + public void RebuildChart() + { + int barWidth; + float maxValue; + + if (bars.Count == 0) + { + return; + } + + // Find out how much space a single bar can occupy. + barWidth = (int)(base.Width / bars.Count); + + // Set the maximum value on the chart. + maxValue = 0; + + // Determine the maximum value. + foreach (BarItem bar in bars) + { + if (bar.Value > maxValue) + { + maxValue = bar.Value; + } + } + + // Create the rectangle shapes. + barRectangles.Clear(); + + // Track the x-coordinate while laying out the bars. + int x = 0; + // Leave some space at the top. + int topMargin = 5; + // Leave some space between bars. + int barGap = 4; + + foreach (BarItem bar in bars) + { + int height = (int)(bar.Value / maxValue * (Height - topMargin)); + int top = Height - height; + + barRectangles.Add(new Rectangle(x + barGap / 2, top, barWidth - barGap, height)); + x += barWidth; + } + + base.Invalidate(); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + // Fill the background. + if (Application.RenderWithVisualStyles) + { + VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.ExplorerBar.NormalGroupBackground.Normal); + renderer.DrawBackground(e.Graphics, e.ClipRectangle); + } + else + { + // Use a solid fill with the BackColor. + Brush brush = new SolidBrush(base.BackColor); + e.Graphics.FillRectangle(brush, e.ClipRectangle); + brush.Dispose(); + } + } + + protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) + { + base.OnPaint(e); + + if (barRectangles.Count == 0) return; + + foreach (Rectangle rect in barRectangles) + { + if (Application.RenderWithVisualStyles) + { + VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.StartPanel.UserPane.Normal); + renderer.DrawBackground(e.Graphics, rect); + } + else + { + // Draw bar (two rectangles are used for a shadowed effect). + int shadowMargin = 4; + Rectangle rectShadow = rect; + rectShadow.Offset(shadowMargin, shadowMargin); + + e.Graphics.FillRectangle(Brushes.White, rectShadow); + e.Graphics.FillRectangle(Brushes.SteelBlue, rect); + } + } + + // Draw text separately so it's superimposed on any + // overlapping bars. + int index = 0; + foreach (Rectangle rect in barRectangles) + { + // Get title. + string text = bars[index].ShortForm; + + // Get the position. + int textTopOffset = 10, textLeftOffset = 15; + Point ptText = rect.Location; + ptText.Offset(textTopOffset, textLeftOffset); + + // Draw the title. + e.Graphics.DrawString(text, Font, Brushes.White, + ptText); + + index++; + } + + // Draw bottom line of the the grid. + Pen pen = new Pen(Color.Black, 3); + e.Graphics.DrawLine(pen, 0, Height - 1, Width, + Height - 1); + pen.Dispose(); + //e.Graphics.DrawLine(Pens.Black, 0, 0, 0, base.Height); + + } + + private ToolTip toolTip; + protected override void OnMouseMove(MouseEventArgs e) + { + if (DesignMode) return; + + BarItem bar = HitTest(e.Location); + if (bar != null) + { + // Get matching value. + string text = String.Format("{0:C}", bar.Value); + + // Get point in form coordinates. + Point pt = e.Location; + pt.Offset(base.Location); + toolTip.Show(text, base.FindForm(), pt); + return; + } + else + { + // No bar found. + toolTip.Hide(base.FindForm()); + } + } + + protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) + { + base.OnMouseDown(e); + if (DesignMode) + { + BarItem bar = HitTest(e.Location); + + if (bar != null) + { + ISelectionService selectService = + (ISelectionService)GetService(typeof(ISelectionService)); + ArrayList selection = new ArrayList(); + selection.Add(bar); + selectService.SetSelectedComponents(selection); + } + + } + } + + + public BarItem HitTest(Point p) + { + // Hit test all the bars. + for (int i=0; i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + False + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChartControl.csproj b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChartControl.csproj new file mode 100644 index 0000000..465cacf --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChartControl.csproj @@ -0,0 +1,110 @@ + + + Local + 8.0.50727 + 2.0 + {68E24D61-5B4F-4657-BF86-796C101D5614} + Debug + AnyCPU + + + + + SimpleChart + + + JScript + Grid + IE50 + false + Library + SimpleChart + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + Code + + + + + + Component + + + + SimpleChart.cs + + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChartControl.csproj.user b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChartControl.csproj.user new file mode 100644 index 0000000..7562390 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChartControl.csproj.user @@ -0,0 +1,58 @@ + + + Debug + AnyCPU + + + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + + false + false + false + false + false + + + Project + + + + + + + + + + + false + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChartDesigner.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChartDesigner.cs new file mode 100644 index 0000000..6f85012 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/SimpleChartDesigner.cs @@ -0,0 +1,61 @@ +#region Using directives + +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +using System.ComponentModel; +using System.Collections; +using System.ComponentModel.Design; +#endregion + +namespace SimpleChart +{ + public class SimpleChartDesigner : System.Windows.Forms.Design.ControlDesigner + { + private Pen pen; + + public override void Initialize(IComponent c) + { + base.Initialize(c); + pen = new Pen(Color.Red); + pen.DashStyle = DashStyle.Dash; + } + + protected override void OnPaintAdornments(System.Windows.Forms.PaintEventArgs pe) + { + base.OnPaintAdornments(pe); + + // Add a border at design-time. + pe.Graphics.DrawRectangle(pen, 0, 0, Control.Width - 1, Control.Height - 1); + + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (pen != null) + pen.Dispose(); + } + base.Dispose(disposing); + } + + + protected override bool GetHitTest(System.Drawing.Point point) + { + point = Control.PointToClient(point); + + SimpleChart chart = (SimpleChart)Component; + BarItem bar = chart.HitTest(point); + + // If the mouse is positioned over a bar, + // allow the mouse events to occur. + return (bar != null); + } + + + } +} diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/bin/Debug/SimpleChart.dll b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/bin/Debug/SimpleChart.dll new file mode 100644 index 0000000..421c1f4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/bin/Debug/SimpleChart.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/bin/Release/SimpleChart.dll b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/bin/Release/SimpleChart.dll new file mode 100644 index 0000000..8cf3e4f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartControl/bin/Release/SimpleChart.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/App.ico b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/App.ico new file mode 100644 index 0000000..3a5525f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/App.ico differ diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/AssemblyInfo.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/Program.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/Program.cs new file mode 100644 index 0000000..2b6d9a3 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace SimpleChartHost +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new SimpleChartTest()); + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartHost.csproj b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartHost.csproj new file mode 100644 index 0000000..ce72333 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartHost.csproj @@ -0,0 +1,115 @@ + + + Local + 8.0.50727 + 2.0 + {3CD20CA2-3CDA-4102-9A25-B76CF3B692AF} + Debug + AnyCPU + App.ico + + + SimpleChartHost + + + JScript + Grid + IE50 + false + WinExe + SimpleChartHost + + + + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + + + + System + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.dll + + + System.Data + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Data.dll + + + System.Drawing + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Drawing.dll + + + System.Windows.Forms + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.Windows.Forms.dll + + + System.XML + C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\System.XML.dll + + + + + + + + Form + + + SimpleChartTest.cs + + + + + + {68E24D61-5B4F-4657-BF86-796C101D5614} + SimpleChartControl + + + + + Designer + SimpleChartTest.cs + + + + + + + + + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartHost.csproj.user b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartHost.csproj.user new file mode 100644 index 0000000..0b5586b --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartHost.csproj.user @@ -0,0 +1,57 @@ + + + Debug + AnyCPU + D:\Matthew\Writing\Books\Programming .NET User Interfaces\C#\Code\Chapter 13\SimpleChart\bin\Debug\ + + + + + 0 + ProjectFiles + 0 + 8.0.50215 + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + + false + false + false + false + false + + + Project + + + + + + + + + + + true + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartTest.Designer.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartTest.Designer.cs new file mode 100644 index 0000000..a352e99 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartTest.Designer.cs @@ -0,0 +1,79 @@ +namespace SimpleChartHost +{ + partial class SimpleChartTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Label1 = new System.Windows.Forms.Label(); + this.simpleChart1 = new SimpleChart.SimpleChart(); + this.SuspendLayout(); + // + // Label1 + // + this.Label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.Label1.Font = new System.Drawing.Font("Verdana", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Label1.Location = new System.Drawing.Point(10, 304); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size(357, 36); + this.Label1.TabIndex = 4; + this.Label1.Text = "Historical Sales Report"; + // + // simpleChart1 + // + this.simpleChart1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.simpleChart1.Bars.Add(new SimpleChart.BarItem("Bar Item 1", 140F)); + this.simpleChart1.Bars.Add(new SimpleChart.BarItem("Bar Item 2", 80F)); + this.simpleChart1.Bars.Add(new SimpleChart.BarItem("Bar Item 3", 121F)); + this.simpleChart1.Bars.Add(new SimpleChart.BarItem("Bar Item 4", 37F)); + this.simpleChart1.Location = new System.Drawing.Point(15, 10); + this.simpleChart1.Name = "simpleChart1"; + this.simpleChart1.Size = new System.Drawing.Size(475, 281); + this.simpleChart1.TabIndex = 5; + this.simpleChart1.Text = "simpleChart1"; + // + // SimpleChartTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(508, 355); + this.Controls.Add(this.simpleChart1); + this.Controls.Add(this.Label1); + this.Name = "SimpleChartTest"; + this.Text = "SimpleChartTest"; + this.Load += new System.EventHandler(this.SimpleChartTest_Load); + this.ResumeLayout(false); + + } + + #endregion + + private SimpleChart.SimpleChart simpleChart1; + internal System.Windows.Forms.Label Label1; + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartTest.cs b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartTest.cs new file mode 100644 index 0000000..9c4bd20 --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartTest.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using SimpleChart; + +namespace SimpleChartHost +{ + public partial class SimpleChartTest : Form + { + public SimpleChartTest() + { + InitializeComponent(); + } + + private void SimpleChartTest_Load(object sender, EventArgs e) + { + } + } +} \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartTest.resx b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartTest.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/SimpleChartTest.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Debug/SimpleChart.dll b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Debug/SimpleChart.dll new file mode 100644 index 0000000..421c1f4 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Debug/SimpleChart.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Debug/SimpleChartHost.exe b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Debug/SimpleChartHost.exe new file mode 100644 index 0000000..c31b951 Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Debug/SimpleChartHost.exe differ diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Release/SimpleChart.dll b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Release/SimpleChart.dll new file mode 100644 index 0000000..8cf3e4f Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Release/SimpleChart.dll differ diff --git a/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Release/SimpleChartHost.exe b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Release/SimpleChartHost.exe new file mode 100644 index 0000000..352943b Binary files /dev/null and b/Pro Windows Forms 2.0/Chapter26/SimpleChart/SimpleChartHost/bin/Release/SimpleChartHost.exe differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..af48704 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +#Apress Source Code + +This repository accompanies [*Pro .NET 2.0 Windows Forms and Custom Controls in C#*](http://www.apress.com/9781590594391) by Matthew MacDonald (Apress, 2006). + +![Cover image](9781590594391.jpg) + +Download the files as a zip using the green button, or clone the repository to your machine using Git. + +##Releases + +Release v1.0 corresponds to the code in the published book, without corrections or updates. + +##Contributions + +See the file Contributing.md for more information on how you can contribute to this repository. diff --git a/contributing.md b/contributing.md new file mode 100644 index 0000000..f6005ad --- /dev/null +++ b/contributing.md @@ -0,0 +1,14 @@ +# Contributing to Apress Source Code + +Copyright for Apress source code belongs to the author(s). However, under fair use you are encouraged to fork and contribute minor corrections and updates for the benefit of the author(s) and other readers. + +## How to Contribute + +1. Make sure you have a GitHub account. +2. Fork the repository for the relevant book. +3. Create a new branch on which to make your change, e.g. +`git checkout -b my_code_contribution` +4. Commit your change. Include a commit message describing the correction. Please note that if your commit message is not clear, the correction will not be accepted. +5. Submit a pull request. + +Thank you for your contribution! \ No newline at end of file