Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / WinForms / Managed / System / WinForms / ToolStripGrip.cs / 1 / ToolStripGrip.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Windows.Forms {
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using System.Windows.Forms.Layout;
using System.Diagnostics;
///
///
internal class ToolStripGrip : ToolStripButton {
private Cursor oldCursor;
private int gripThickness = 0;
Point startLocation = Point.Empty;
private bool movingToolStrip = false;
private Point lastEndLocation = ToolStrip.InvalidMouseEnter;
private static Size DragSize = LayoutUtils.MaxSize;
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
internal ToolStripGrip() {
// if we're using XP themes we've got to be a bit thicker.
gripThickness = ToolStripManager.VisualStylesEnabled ? 5 : 3;
SupportsItemClick = false;
}
///
/// Deriving classes can override this to configure a default size for their control.
/// This is more efficient than setting the size in the control's constructor.
///
protected internal override Padding DefaultMargin {
get {
return new Padding(2);
}
}
public override bool CanSelect {
get {
return false;
}
}
internal int GripThickness {
get {
return gripThickness;
}
}
internal bool MovingToolStrip {
get {
return ((ToolStripPanelRow != null) && movingToolStrip);
}
set {
if ((movingToolStrip != value) && ParentInternal != null) {
if (value) {
// dont let grips move the toolstrip
if (ParentInternal.ToolStripPanelRow == null) {
return;
}
}
movingToolStrip = value;
lastEndLocation = ToolStrip.InvalidMouseEnter;
if (movingToolStrip) {
((ISupportToolStripPanel)this.ParentInternal).BeginDrag();
}
else {
((ISupportToolStripPanel)this.ParentInternal).EndDrag();
}
}
}
}
private ToolStripPanelRow ToolStripPanelRow {
get {
return (ParentInternal == null) ? null : ((ISupportToolStripPanel)ParentInternal).ToolStripPanelRow;
}
}
protected override AccessibleObject CreateAccessibilityInstance() {
return new ToolStripGripAccessibleObject(this);
}
public override Size GetPreferredSize(Size constrainingSize) {
Size preferredSize = Size.Empty;
if (this.ParentInternal != null) {
if (this.ParentInternal.LayoutStyle == ToolStripLayoutStyle.VerticalStackWithOverflow) {
preferredSize = new Size(this.ParentInternal.Width, gripThickness);
}
else {
preferredSize = new Size(gripThickness, this.ParentInternal.Height);
}
}
// Constrain ourselves
if (preferredSize.Width > constrainingSize.Width) {
preferredSize.Width = constrainingSize.Width;
}
if (preferredSize.Height > constrainingSize.Height) {
preferredSize.Height = constrainingSize.Height;
}
return preferredSize;
}
private bool LeftMouseButtonIsDown() {
return (Control.MouseButtons == MouseButtons.Left) && (Control.ModifierKeys == Keys.None);
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) {
// all the grip painting should be on the ToolStrip itself.
if (ParentInternal != null) {
ParentInternal.OnPaintGrip(e);
}
}
///
///
///
///
protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs mea) {
startLocation = TranslatePoint(new Point(mea.X, mea.Y), ToolStripPointType.ToolStripItemCoords, ToolStripPointType.ScreenCoords);
base.OnMouseDown(mea);
}
protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs mea) {
bool leftMouseButtonDown = LeftMouseButtonIsDown();
if (!MovingToolStrip && leftMouseButtonDown) {
// determine if we've moved far enough such that the toolstrip
// can be considered as moving.
Point currentLocation = TranslatePoint(mea.Location, ToolStripPointType.ToolStripItemCoords, ToolStripPointType.ScreenCoords);
int deltaX = currentLocation.X - startLocation.X;
deltaX = (deltaX < 0) ? deltaX *-1 : deltaX;
if (DragSize == LayoutUtils.MaxSize) {
DragSize = SystemInformation.DragSize;
}
if (deltaX >= DragSize.Width) {
MovingToolStrip = true;
}
else {
int deltaY = currentLocation.Y - startLocation.Y;
deltaY = (deltaY < 0) ? deltaY *-1 : deltaY;
if (deltaY >= DragSize.Height) {
MovingToolStrip = true;
}
}
}
if (MovingToolStrip) {
if (leftMouseButtonDown) {
Point endLocation = TranslatePoint(new Point(mea.X, mea.Y), ToolStripPointType.ToolStripItemCoords, ToolStripPointType.ScreenCoords);
// protect against calling when the mouse hasnt really moved. moving the toolstrip/creating the feedback rect
// can cause extra mousemove events, we want to make sure we're not doing all this work
// for nothing.
if (endLocation != lastEndLocation) {
ToolStripPanelRow.ToolStripPanel.MoveControl(ParentInternal, /*startLocation,*/endLocation );
lastEndLocation = endLocation;
}
startLocation = endLocation;
}
else {
// sometimes we dont get mouseup in DT. Release now.
MovingToolStrip = false;
}
}
base.OnMouseMove(mea);
}
protected override void OnMouseEnter(System.EventArgs e) {
// only switch the cursor if we've got a rafting row.
if ((ParentInternal != null) && (ToolStripPanelRow != null) && (!ParentInternal.IsInDesignMode)) {
oldCursor = ParentInternal.Cursor;
SetCursor(ParentInternal, Cursors.SizeAll);
}
else {
oldCursor = null;
}
base.OnMouseEnter(e);
}
///
///
///
///
protected override void OnMouseLeave(System.EventArgs e) {
if (oldCursor != null && !ParentInternal.IsInDesignMode) {
SetCursor(ParentInternal,oldCursor);
}
if (!MovingToolStrip && LeftMouseButtonIsDown()) {
MovingToolStrip = true;
}
base.OnMouseLeave(e);
}
protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs mea) {
if (MovingToolStrip) {
Point endLocation = TranslatePoint(new Point(mea.X, mea.Y), ToolStripPointType.ToolStripItemCoords, ToolStripPointType.ScreenCoords);
ToolStripPanelRow.ToolStripPanel.MoveControl(ParentInternal, /*startLocation,*/endLocation );
}
if (!ParentInternal.IsInDesignMode) {
SetCursor(ParentInternal, oldCursor);
}
ToolStripPanel.ClearDragFeedback();
MovingToolStrip = false;
base.OnMouseUp(mea);
}
private static void SetCursor(Control control, Cursor cursor) {
IntSecurity.ModifyCursor.Assert();
control.Cursor = cursor;
// CodeAccessPermission.RevertAssert automatically called
}
internal class ToolStripGripAccessibleObject : ToolStripButtonAccessibleObject {
private string stockName;
public ToolStripGripAccessibleObject(ToolStripGrip owner) : base(owner){
}
public override string Name {
get {
string name = Owner.AccessibleName;
if (name != null) {
return name;
}
if (string.IsNullOrEmpty(stockName)) {
stockName = SR.GetString(SR.ToolStripGripAccessibleName);
}
return stockName;
}
set {
base.Name = value;
}
}
public override AccessibleRole Role {
get {
AccessibleRole role = Owner.AccessibleRole;
if (role != AccessibleRole.Default) {
return role;
}
return AccessibleRole.Grip;
}
}
}
}
}
// 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
- ZoomPercentageConverter.cs
- GroupStyle.cs
- CompensationToken.cs
- PeerInputChannelListener.cs
- EncoderParameters.cs
- XmlAttributeCache.cs
- DataControlPagerLinkButton.cs
- QilInvokeLateBound.cs
- BasicHttpSecurity.cs
- HttpApplicationFactory.cs
- _ConnectOverlappedAsyncResult.cs
- Membership.cs
- Positioning.cs
- Currency.cs
- SymLanguageType.cs
- DataGridViewCellStyleConverter.cs
- InputMethodStateChangeEventArgs.cs
- AttributeCollection.cs
- Source.cs
- ConfigurationException.cs
- BindingValueChangedEventArgs.cs
- StoreItemCollection.cs
- DispatcherHookEventArgs.cs
- sqlstateclientmanager.cs
- DateTimeHelper.cs
- AssemblyAttributesGoHere.cs
- SoapElementAttribute.cs
- CodeAccessSecurityEngine.cs
- TypeHelper.cs
- SharedPersonalizationStateInfo.cs
- HttpCapabilitiesSectionHandler.cs
- ToolStripSplitButton.cs
- XpsManager.cs
- NavigatingCancelEventArgs.cs
- HttpResponse.cs
- UIHelper.cs
- EmptyStringExpandableObjectConverter.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- SQLSingle.cs
- CollectionChangedEventManager.cs
- ContainerFilterService.cs
- OdbcRowUpdatingEvent.cs
- XmlSchemaSimpleContentRestriction.cs
- TimeZone.cs
- CompilerCollection.cs
- UserPreferenceChangingEventArgs.cs
- AutomationProperty.cs
- securitycriticaldataClass.cs
- XmlSchemaValidationException.cs
- Normalization.cs
- EastAsianLunisolarCalendar.cs
- Help.cs
- FileSystemEnumerable.cs
- EdmProperty.cs
- ControlEvent.cs
- DataBoundControlActionList.cs
- SymLanguageVendor.cs
- Opcode.cs
- ScriptReferenceBase.cs
- ItemsPresenter.cs
- ToolStripScrollButton.cs
- RewritingProcessor.cs
- WebPartConnectionsCloseVerb.cs
- EventOpcode.cs
- ListViewDataItem.cs
- ScrollableControl.cs
- StrokeCollection2.cs
- ReadOnlyAttribute.cs
- SystemInformation.cs
- ConditionedDesigner.cs
- SchemaElementLookUpTableEnumerator.cs
- StreamingContext.cs
- BindingValueChangedEventArgs.cs
- ListViewInsertedEventArgs.cs
- ZipArchive.cs
- SessionEndingEventArgs.cs
- BooleanAnimationBase.cs
- EntityDesignerUtils.cs
- CustomErrorsSectionWrapper.cs
- IPHostEntry.cs
- FloaterParaClient.cs
- propertytag.cs
- FontNamesConverter.cs
- PageAsyncTask.cs
- AppDomainEvidenceFactory.cs
- InternalsVisibleToAttribute.cs
- DateTimeConverter.cs
- ControlIdConverter.cs
- DataFormat.cs
- NamedPipeActivation.cs
- StatusBarItemAutomationPeer.cs
- DbProviderSpecificTypePropertyAttribute.cs
- XmlILConstructAnalyzer.cs
- NegotiateStream.cs
- SelectionChangedEventArgs.cs
- XmlMemberMapping.cs
- MD5.cs
- _SpnDictionary.cs
- HandlerFactoryWrapper.cs
- MsmqBindingBase.cs