Code:
                         / 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / Controls / Primitives / ToolBarOverflowPanel.cs / 1305600 / ToolBarOverflowPanel.cs
                        
                        
                            //---------------------------------------------------------------------------- 
//
// Copyright (C) Microsoft Corporation.  All rights reserved.
//
//--------------------------------------------------------------------------- 
using System.Collections.Generic; 
using System.Threading; 
using System.Windows;
using System.Windows.Controls; 
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Documents;
using System; 
using System.Diagnostics;
 
using MS.Internal; 
namespace System.Windows.Controls.Primitives 
{
    /// 
    /// ToolBarOverflowPanel
    ///   
    public class ToolBarOverflowPanel : Panel
    { 
        #region Properties 
        /// 
        /// WrapWidth Property 
        ///  
        public static readonly DependencyProperty WrapWidthProperty =
                    DependencyProperty.Register(
                                "WrapWidth", 
                                typeof(double),
                                typeof(ToolBarOverflowPanel), 
                                new FrameworkPropertyMetadata(Double.NaN, FrameworkPropertyMetadataOptions.AffectsMeasure), 
                                new ValidateValueCallback(IsWrapWidthValid));
 
        /// 
        /// WrapWidth Property
        ///  
        public double WrapWidth 
        {
            get { return (double)GetValue(WrapWidthProperty); } 
 
            set { SetValue(WrapWidthProperty, value); }
        } 
        private static bool IsWrapWidthValid(object value)
        {
            double v = (double)value; 
            return (DoubleUtil.IsNaN(v)) || (DoubleUtil.GreaterThanOrClose(v, 0d) && !Double.IsPositiveInfinity(v));
        } 
        #endregion Properties 
        #region Override methods 
        /// 
        /// Measure the content and store the desired size of the content
        ///  
        ///  
        ///  generatedItemsCollection = toolBarPanel.GeneratedItemsCollection; 
                int generatedItemsCount = (generatedItemsCollection != null) ? generatedItemsCollection.Count : 0;
                int childrenIndex = 0; 
                for (int i = 0; i < generatedItemsCount; i++)
                {
                    UIElement child = generatedItemsCollection[i];
                    if ((child != null) && ToolBar.GetIsOverflowItem(child) && !(child is Separator)) 
                    {
                        if (childrenIndex < childrenCount) 
                        { 
                            if (children[childrenIndex] != child)
                            { 
                                children.Insert(childrenIndex, child);
                                childrenCount++;
                            }
                        } 
                        else
                        { 
                            children.Add(child); 
                            childrenCount++;
                        } 
                        childrenIndex++;
                    }
                }
 
                Debug.Assert(childrenIndex == childrenCount, "ToolBarOverflowPanel.Children count mismatch after transferring children from GeneratedItemsCollection.");
            } 
 
            // Measure all children to determine if we need to increase desired wrapWidth
            for (int i = 0; i < childrenCount; i++) 
            {
                UIElement child = children[i] as UIElement;
                child.Measure(constraint); 
                Size childDesiredSize = child.DesiredSize; 
                if (DoubleUtil.GreaterThan(childDesiredSize.Width, _wrapWidth)) 
                {
                    _wrapWidth = childDesiredSize.Width; 
                }
            }
            // wrapWidth should not be bigger than constraint.Width 
            _wrapWidth = Math.Min(_wrapWidth, constraint.Width);
 
            for (int i = 0; i < children.Count; i++) 
            {
                UIElement child = children[i] as UIElement; 
                Size sz = child.DesiredSize;
                if (DoubleUtil.GreaterThan(curLineSize.Width + sz.Width, _wrapWidth)) //need to switch to another line
                { 
                    _panelSize.Width = Math.Max(curLineSize.Width, _panelSize.Width);
                    _panelSize.Height += curLineSize.Height; 
                    curLineSize = sz; 
                    if (DoubleUtil.GreaterThan(sz.Width, _wrapWidth)) //the element is wider then the constraint - give it a separate line 
                    {
                        _panelSize.Width = Math.Max(sz.Width, _panelSize.Width);
                        _panelSize.Height += sz.Height;
                        curLineSize = new Size(); 
                    }
                } 
                else //continue to accumulate a line 
                {
                    curLineSize.Width += sz.Width; 
                    curLineSize.Height = Math.Max(sz.Height, curLineSize.Height);
                }
            }
 
            //the last line size, if any should be added
            _panelSize.Width = Math.Max(curLineSize.Width, _panelSize.Width); 
            _panelSize.Height += curLineSize.Height; 
            return _panelSize; 
        }
        /// 
        /// Content arrangement. 
        ///  
        ///  
        ///  
        /// Creates a new UIElementCollection. Panel-derived class can create its own version of 
        /// UIElementCollection -derived class to add cached information to every child or to
        /// intercept any Add/Remove actions (for example, for incremental layout update) 
        ///  
        protected override UIElementCollection CreateUIElementCollection(FrameworkElement logicalParent)
        {
            // we ignore the Logical Parent (this) if we have ToolBar as our TemplatedParent 
            return new UIElementCollection(this, TemplatedParent == null ? logicalParent : null);
        } 
 
        private void arrangeLine(double y, double lineHeight, int start, int end)
        { 
            double x = 0;
            UIElementCollection children = this.Children;
            for (int i = start; i < end; i++)
            { 
                UIElement child = children[i];
                child.Arrange(new Rect(x, y, child.DesiredSize.Width, lineHeight)); 
                x += child.DesiredSize.Width; 
            }
        } 
        #endregion Override methods
        #region private implementation
 
        private ToolBar ToolBar
        { 
            get { return TemplatedParent as ToolBar; } 
        }
 
        private ToolBarPanel ToolBarPanel
        {
            get
            { 
                ToolBar tb = ToolBar;
                return tb == null ? null : tb.ToolBarPanel; 
            } 
        }
 
        #endregion private implementation
        #region private data
        private double _wrapWidth; // calculated in MeasureOverride and used in ArrangeOverride 
        private Size _panelSize;
        #endregion private data 
 
    }
 
}
// 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
- LogicalTreeHelper.cs
- ControlUtil.cs
- XNodeNavigator.cs
- ObjectComplexPropertyMapping.cs
- MetricEntry.cs
- QilParameter.cs
- ProtocolsConfigurationHandler.cs
- DataGridViewTopLeftHeaderCell.cs
- InkSerializer.cs
- SqlDataSourceDesigner.cs
- ConfigXmlText.cs
- ApplicationServiceManager.cs
- ControlUtil.cs
- UnsafeNativeMethodsPenimc.cs
- ThreadExceptionEvent.cs
- TransactionScopeDesigner.cs
- UseAttributeSetsAction.cs
- GenericParameterDataContract.cs
- TripleDESCryptoServiceProvider.cs
- SoundPlayerAction.cs
- LinkDescriptor.cs
- SqlCacheDependencyDatabase.cs
- EventArgs.cs
- TrustManagerMoreInformation.cs
- ContextStaticAttribute.cs
- DetailsViewRow.cs
- OrderPreservingMergeHelper.cs
- ByteStreamMessage.cs
- DrawingContextWalker.cs
- AsymmetricAlgorithm.cs
- XmlDataSourceNodeDescriptor.cs
- UsernameTokenFactoryCredential.cs
- CellIdBoolean.cs
- StringArrayConverter.cs
- SharedConnectionWorkflowTransactionService.cs
- TdsParser.cs
- WebPartManagerInternals.cs
- VectorCollectionValueSerializer.cs
- EncodingDataItem.cs
- GuidelineSet.cs
- SymbolDocumentGenerator.cs
- OneToOneMappingSerializer.cs
- RenderDataDrawingContext.cs
- FontStyle.cs
- VScrollProperties.cs
- EnumValAlphaComparer.cs
- AsyncDataRequest.cs
- FtpRequestCacheValidator.cs
- DataSourceXmlSubItemAttribute.cs
- EnvironmentPermission.cs
- StyleSelector.cs
- rsa.cs
- DecoderExceptionFallback.cs
- arabicshape.cs
- DynamicResourceExtensionConverter.cs
- VarRefManager.cs
- TableHeaderCell.cs
- SiteMapNodeCollection.cs
- UserPreferenceChangedEventArgs.cs
- Int64KeyFrameCollection.cs
- IFormattable.cs
- DocumentPage.cs
- NullableConverter.cs
- Debug.cs
- LambdaExpression.cs
- EncodedStreamFactory.cs
- NamedPermissionSet.cs
- PrincipalPermissionMode.cs
- DataFieldEditor.cs
- DtrList.cs
- DeclaredTypeElement.cs
- PlanCompiler.cs
- RenderingEventArgs.cs
- odbcmetadatacolumnnames.cs
- UrlPath.cs
- ModifierKeysValueSerializer.cs
- TargetException.cs
- XmlQueryStaticData.cs
- VirtualPath.cs
- DefaultObjectSerializer.cs
- NavigationProperty.cs
- ToolStripContainerDesigner.cs
- DataGridViewSelectedCellsAccessibleObject.cs
- XmlCharType.cs
- SystemInfo.cs
- SystemIPGlobalProperties.cs
- XmlUtf8RawTextWriter.cs
- FrameworkContentElement.cs
- ImageCodecInfo.cs
- CreateDataSourceDialog.cs
- BufferedReadStream.cs
- BamlBinaryReader.cs
- DragEventArgs.cs
- ColorTransform.cs
- MessagePropertyFilter.cs
- TextTreeUndoUnit.cs
- ContextMarshalException.cs
- ObjectAnimationBase.cs
- AsymmetricKeyExchangeFormatter.cs
- IdentityElement.cs