Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / WinForms / System / WinForms / Design / DockEditor.cs / 1 / DockEditor.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- /* */ namespace System.Windows.Forms.Design { using System.Runtime.InteropServices; using System.ComponentModel; using System; using System.ComponentModel.Design; using Microsoft.Win32; using System.Diagnostics; using System.Drawing; using System.Design; using System.Drawing.Design; using System.Windows.Forms; using System.Windows.Forms.ComponentModel; using System.Windows.Forms.Design; using System.Diagnostics.CodeAnalysis; ////// /// /// public sealed class DockEditor : UITypeEditor { private DockUI dockUI; ////// Implements the design time editor for specifying the /// ///property. /// /// /// /// Edits the given object value using the editor style provided by /// GetEditorStyle. A service provider is provided so that any /// required editing services can be obtained. /// [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")] // everything in this assembly is full trust. public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { object returnValue = value; if (provider != null) { IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); if (edSvc != null) { if (dockUI == null) { dockUI = new DockUI(this); } dockUI.Start(edSvc, value); edSvc.DropDownControl(dockUI); value = dockUI.Value; dockUI.End(); } } return value; } ////// /// Retrieves the editing style of the Edit method. If the method /// is not supported, this will return None. /// [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")] // everything in this assembly is full trust. public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { return UITypeEditorEditStyle.DropDown; } ////// /// User Interface for the DockEditor. /// ///private class DockUI : Control { // Even though the selections are mutually exclusive, I'm using // CheckBoxes instead of RadioButtons because RadioButtons fire Click // events whenever they get focus, which is bad when the user is trying // to tab to a specific control using the keyboard. private ContainerPlaceholder container = new ContainerPlaceholder(); private CheckBox fill = new DockEditorCheckBox(); private CheckBox left = new DockEditorCheckBox(); private CheckBox right = new DockEditorCheckBox(); private CheckBox top = new DockEditorCheckBox(); private CheckBox bottom = new DockEditorCheckBox(); private CheckBox none = new DockEditorCheckBox(); private CheckBox[] upDownOrder; private CheckBox[] leftRightOrder; private CheckBox[] tabOrder; private DockEditor editor = null; private object value; private IWindowsFormsEditorService edSvc; public DockUI(DockEditor editor) { this.editor = editor; upDownOrder = new CheckBox[] { top, fill, bottom, none}; leftRightOrder = new CheckBox[] { left, fill, right}; tabOrder = new CheckBox[] { top, left, fill, right, bottom, none}; InitializeComponent(); } public object Value { get { return value; } } public void End() { edSvc = null; value = null; } public virtual DockStyle GetDock(CheckBox btn) { if (top == btn) { return DockStyle.Top; } else if (left == btn) { return DockStyle.Left; } else if (bottom == btn) { return DockStyle.Bottom; } else if (right == btn) { return DockStyle.Right; } else if (fill == btn) { return DockStyle.Fill; } return DockStyle.None; } [SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters")] private void InitializeComponent() { SetBounds(0, 0, 94, 116); this.BackColor = SystemColors.Control; this.ForeColor = SystemColors.ControlText; this.AccessibleName = SR.GetString(SR.DockEditorAccName); none.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; none.Location = new Point(2, 94); none.Size = new Size(90, 24); none.Text = DockStyle.None.ToString(); none.TabIndex = 0; none.TabStop = true; none.Appearance = Appearance.Button; none.Click += new EventHandler(this.OnClick); none.KeyDown += new KeyEventHandler(this.OnKeyDown); none.AccessibleName = SR.GetString(SR.DockEditorNoneAccName); container.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right; container.Location = new Point(2, 2); container.Size = new Size(90, 90); none.Dock = DockStyle.Bottom; container.Dock = DockStyle.Fill; right.Dock = DockStyle.Right; right.Size = new Size(20,20); right.TabIndex = 4; right.TabStop = true; right.Text = " "; // Needs at least one character so focus rect will show. right.Appearance = Appearance.Button; right.Click += new EventHandler(this.OnClick); right.KeyDown += new KeyEventHandler(this.OnKeyDown); right.AccessibleName = SR.GetString(SR.DockEditorRightAccName); left.Dock = DockStyle.Left; left.Size = new Size(20,20); left.TabIndex = 2; left.TabStop = true; left.Text = " "; left.Appearance = Appearance.Button; left.Click += new EventHandler(this.OnClick); left.KeyDown += new KeyEventHandler(this.OnKeyDown); left.AccessibleName = SR.GetString(SR.DockEditorLeftAccName); top.Dock = DockStyle.Top; top.Size = new Size(20,20); top.TabIndex = 1; top.TabStop = true; top.Text = " "; top.Appearance = Appearance.Button; top.Click += new EventHandler(this.OnClick); top.KeyDown += new KeyEventHandler(this.OnKeyDown); top.AccessibleName = SR.GetString(SR.DockEditorTopAccName); bottom.Dock = DockStyle.Bottom; bottom.Size = new Size(20,20); bottom.TabIndex = 5; bottom.TabStop = true; bottom.Text = " "; bottom.Appearance = Appearance.Button; bottom.Click += new EventHandler(this.OnClick); bottom.KeyDown += new KeyEventHandler(this.OnKeyDown); bottom.AccessibleName = SR.GetString(SR.DockEditorBottomAccName); fill.Dock = DockStyle.Fill; fill.Size = new Size(20,20); fill.TabIndex = 3; fill.TabStop = true; fill.Text = " "; fill.Appearance = Appearance.Button; fill.Click += new EventHandler(this.OnClick); fill.KeyDown += new KeyEventHandler(this.OnKeyDown); fill.AccessibleName = SR.GetString(SR.DockEditorFillAccName); Controls.Clear(); Controls.AddRange(new Control[]{ container, none}); container.Controls.Clear(); container.Controls.AddRange(new Control[]{ fill, left, right, top, bottom, }); } private void OnClick(object sender, EventArgs eventargs) { DockStyle val = GetDock((CheckBox)sender); if (val >= (DockStyle)0) { value = val; } Teardown(); } protected override void OnGotFocus(EventArgs e) { base.OnGotFocus(e); // Set focus to currently selected Dock style for (int i = 0; i < tabOrder.Length; i++) { if (tabOrder[i].Checked) { tabOrder[i].Focus(); break; } } } private void OnKeyDown(object sender, KeyEventArgs e) { Keys key = e.KeyCode; Control target = null; int maxI; switch (key) { case Keys.Up: case Keys.Down: // If we're going up or down from one of the 'sides', act like we're doing // it from the center if (sender == left || sender == right) sender = fill; maxI = upDownOrder.Length - 1; for (int i = 0; i <= maxI; i++) { if (upDownOrder[i] == sender) { if (key == Keys.Up) { target = upDownOrder[Math.Max(i-1, 0)]; } else { target = upDownOrder[Math.Min(i+1, maxI)]; } break; } } break; case Keys.Left: case Keys.Right: maxI = leftRightOrder.Length - 1; for (int i = 0; i <= maxI; i++) { if (leftRightOrder[i] == sender) { if (key == Keys.Left) { target = leftRightOrder[Math.Max(i-1, 0)]; } else { target = leftRightOrder[Math.Min(i+1, maxI)]; } break; } } break; case Keys.Tab: for (int i = 0; i < tabOrder.Length; i++) { if (tabOrder[i] == sender) { i += ((e.Modifiers & Keys.Shift) == 0 ? 1 : -1); i = (i < 0 ? i + tabOrder.Length : i % tabOrder.Length); target = tabOrder[i]; break; } } break; case Keys.Return: InvokeOnClick(((CheckBox)sender), EventArgs.Empty); // Will tear down editor return; default: return; // Unhandled keys return here } e.Handled = true; if (target != null && target != sender) { target.Focus(); } } public void Start(IWindowsFormsEditorService edSvc, object value) { this.edSvc = edSvc; this.value = value; if (value is DockStyle) { DockStyle dock = (DockStyle)value; none.Checked = false; top.Checked = false; left.Checked = false; right.Checked = false; bottom.Checked = false; fill.Checked = false; switch (dock) { case DockStyle.None: none.Checked = true; break; case DockStyle.Top: top.Checked = true; break; case DockStyle.Left: left.Checked = true; break; case DockStyle.Right: right.Checked = true; break; case DockStyle.Bottom: bottom.Checked = true; break; case DockStyle.Fill: fill.Checked = true; break; } } } private void Teardown() { edSvc.CloseDropDown(); } // // // private class DockEditorCheckBox : CheckBox { protected override bool ShowFocusCues { get { return true; } } protected override bool IsInputKey(System.Windows.Forms.Keys keyData) { switch (keyData) { case Keys.Left: case Keys.Right: case Keys.Up: case Keys.Down: case Keys.Return: return true; } return base.IsInputKey(keyData); } } ///// ///// /// private class ContainerPlaceholder : Control { public ContainerPlaceholder() { this.BackColor = SystemColors.Control; this.TabStop = false; } protected override void OnPaint(PaintEventArgs e) { Rectangle rc = this.ClientRectangle; ControlPaint.DrawButton(e.Graphics, rc, ButtonState.Pushed); } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TimelineGroup.cs
- CellTreeNodeVisitors.cs
- CollectionCodeDomSerializer.cs
- CompositeCollection.cs
- SiteMap.cs
- MD5Cng.cs
- HeaderElement.cs
- ToolStripControlHost.cs
- LocalClientSecuritySettingsElement.cs
- DiscoveryClientDocuments.cs
- WebPartUtil.cs
- ItemType.cs
- LambdaCompiler.Statements.cs
- Calendar.cs
- TimelineGroup.cs
- PeerTransportListenAddressValidatorAttribute.cs
- BulletedList.cs
- TextBlockAutomationPeer.cs
- QueryCursorEventArgs.cs
- AsyncDataRequest.cs
- OutputWindow.cs
- VisualBrush.cs
- WorkflowRuntimeServiceElementCollection.cs
- NullExtension.cs
- ScrollViewer.cs
- OracleDateTime.cs
- BaseDataBoundControlDesigner.cs
- HttpConfigurationContext.cs
- ListViewGroup.cs
- Location.cs
- ScrollData.cs
- ChangeProcessor.cs
- StructuralCache.cs
- PointHitTestParameters.cs
- DataRecordInfo.cs
- ButtonField.cs
- MediaContext.cs
- Rotation3D.cs
- ObjectNotFoundException.cs
- XmlImplementation.cs
- GridViewRowCollection.cs
- OleDbDataAdapter.cs
- DateTimeUtil.cs
- PersonalizationState.cs
- ClientBase.cs
- CodeTypeConstructor.cs
- remotingproxy.cs
- DiagnosticsConfiguration.cs
- CellParaClient.cs
- XPathDocumentNavigator.cs
- EntryPointNotFoundException.cs
- EventTrigger.cs
- JumpItem.cs
- WebConfigManager.cs
- DBDataPermission.cs
- loginstatus.cs
- PropagatorResult.cs
- CacheMemory.cs
- LinkGrep.cs
- EntityConnectionStringBuilderItem.cs
- PropertyPathWorker.cs
- ChangesetResponse.cs
- AuthenticationException.cs
- BuildProvidersCompiler.cs
- TextElement.cs
- DateTimeParse.cs
- AuthenticationModuleElementCollection.cs
- SettingsPropertyIsReadOnlyException.cs
- GroupBoxAutomationPeer.cs
- Tokenizer.cs
- PageCache.cs
- ByteStorage.cs
- SiteMapHierarchicalDataSourceView.cs
- cookiecontainer.cs
- ListViewContainer.cs
- HtmlEmptyTagControlBuilder.cs
- WebPartCollection.cs
- invalidudtexception.cs
- MediaTimeline.cs
- ToolStripActionList.cs
- MetadataExchangeClient.cs
- WebPartTracker.cs
- WebAdminConfigurationHelper.cs
- MailWebEventProvider.cs
- TypeElement.cs
- GeometryGroup.cs
- NativeMethods.cs
- CustomGrammar.cs
- SqlBulkCopyColumnMapping.cs
- DispatcherHooks.cs
- Win32.cs
- PartialCachingControl.cs
- ProfileGroupSettings.cs
- SkinBuilder.cs
- APCustomTypeDescriptor.cs
- dataSvcMapFileLoader.cs
- ValueChangedEventManager.cs
- DataObjectCopyingEventArgs.cs
- WebPartDisplayModeCancelEventArgs.cs
- WindowsSolidBrush.cs