Subversion Repositories SoapBoxCore

Rev

Rev 7 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7 Rev 17
Line 1... Line 1...
1
//Copyright (c) 2007-2009, Adolfo Marinucci
1
//Copyright (c) 2007-2010, Adolfo Marinucci
2
//All rights reserved.
2
//All rights reserved.
3
 
3
 
4
//Redistribution and use in source and binary forms, with or without modification, 
4
//Redistribution and use in source and binary forms, with or without modification, 
5
//are permitted provided that the following conditions are met:
5
//are permitted provided that the following conditions are met:
6
//
6
//
Line 143... Line 143...
143
 
143
 
144
        public static readonly DependencyProperty EffectiveSizeProperty =
144
        public static readonly DependencyProperty EffectiveSizeProperty =
145
            DependencyProperty.RegisterAttached("EffectiveSize", typeof(Size), typeof(ResizingPanel), new FrameworkPropertyMetadata(new Size()));
145
            DependencyProperty.RegisterAttached("EffectiveSize", typeof(Size), typeof(ResizingPanel), new FrameworkPropertyMetadata(new Size()));
146
 
146
 
147
 
147
 
148
        List<ResizingPanelSplitter> _splitterList = new List<ResizingPanelSplitter>();
148
        List<Resizer> _splitterList = new List<Resizer>();
149
 
149
 
150
        /// <summary>
150
        /// <summary>
151
        /// Correct sizes of children if all of them are set to absolutes
151
        /// Correct sizes of children if all of them are set to absolutes
152
        /// </summary>
152
        /// </summary>
153
        void CorrectSizes()
153
        void CorrectSizes()
154
        {
154
        {
155
            IEnumerable<FrameworkElement> children = Children.OfType<FrameworkElement>().Where<FrameworkElement>(c => !(c is ResizingPanelSplitter));
155
            IEnumerable<FrameworkElement> children = Children.OfType<FrameworkElement>().Where<FrameworkElement>(c => !(c is Resizer));
156
 
156
 
157
            if (children.All<FrameworkElement>(c => c.IsAbsolute()))
157
            if (children.All<FrameworkElement>(c => c.IsAbsolute()))
158
            {
158
            {
159
                double totSum = children.Sum<FrameworkElement>(f => f.GetAbsoluteValue());
159
                double totSum = children.Sum<FrameworkElement>(f => f.GetAbsoluteValue());
160
                foreach (var c in children)
160
                foreach (var c in children)
Line 170... Line 170...
170
        /// <summary>
170
        /// <summary>
171
        /// Helper funcs which correct elements size of a resizing panel
171
        /// Helper funcs which correct elements size of a resizing panel
172
        /// </summary>
172
        /// </summary>
173
        internal void AdjustPanelSizes()
173
        internal void AdjustPanelSizes()
174
        {
174
        {
175
            IEnumerable<FrameworkElement> children = Children.OfType<FrameworkElement>().Where<FrameworkElement>(c => !(c is ResizingPanelSplitter));
175
            IEnumerable<FrameworkElement> children = Children.OfType<FrameworkElement>().Where<FrameworkElement>(c => !(c is Resizer));
176
 
176
 
177
            if (!this.IsLogicalChildContained<DocumentPane>())
177
            if (!this.IsLogicalChildContained<DocumentPane>())
178
            {
178
            {
179
                //if no document pane is contained in this panel
179
                //if no document pane is contained in this panel
180
                //adjust elements so that any child will get a proportional star size
180
                //adjust elements so that any child will get a proportional star size
Line 200... Line 200...
200
        /// </summary>
200
        /// </summary>
201
        /// <param name="availableSize"></param>
201
        /// <param name="availableSize"></param>
202
        /// <returns></returns>
202
        /// <returns></returns>
203
        protected override Size MeasureOverride(Size availableSize)
203
        protected override Size MeasureOverride(Size availableSize)
204
        {
204
        {
-
 
205
            //Debug.WriteLine("ResizingPanel.MeasureOverride()");
-
 
206
 
205
            SetupSplitters();
207
            SetupSplitters();
206
 
208
 
207
            CorrectSizes();
209
            CorrectSizes();
208
 
210
 
209
            //Compute the list of visible children
211
            //Compute the list of visible children
Line 220... Line 222...
220
 
222
 
221
                    if (i == VisualChildrenCount - 1 &&
223
                    if (i == VisualChildrenCount - 1 &&
222
                        i > 0)
224
                        i > 0)
223
                    {
225
                    {
224
                        child = GetVisualChild(i - 1) as FrameworkElement;
226
                        child = GetVisualChild(i - 1) as FrameworkElement;
225
                        Debug.Assert(child is ResizingPanelSplitter);
227
                        Debug.Assert(child is Resizer);
226
 
228
 
227
                        child.Measure(Size.Empty);
229
                        child.Measure(Size.Empty);
228
 
230
 
229
                        if (visibleChildren.Count > 0)
231
                        if (visibleChildren.Count > 0)
230
                        {
232
                        {
231
                            Debug.Assert(visibleChildren[visibleChildren.Count - 1] is ResizingPanelSplitter);
233
                            Debug.Assert(visibleChildren[visibleChildren.Count - 1] is Resizer);
232
                            visibleChildren[visibleChildren.Count - 1].Measure(Size.Empty);
234
                            visibleChildren[visibleChildren.Count - 1].Measure(Size.Empty);
233
                            visibleChildren.RemoveAt(visibleChildren.Count - 1);
235
                            visibleChildren.RemoveAt(visibleChildren.Count - 1);
234
                        }
236
                        }
235
                    }
237
                    }
236
                    else if (i < VisualChildrenCount - 1)
238
                    else if (i < VisualChildrenCount - 1)
237
                    {
239
                    {
238
                        i++;
240
                        i++;
239
                        child = GetVisualChild(i) as FrameworkElement;
241
                        child = GetVisualChild(i) as FrameworkElement;
240
                        Debug.Assert(child is ResizingPanelSplitter);
242
                        Debug.Assert(child is Resizer);
241
                        child.Measure(Size.Empty);
243
                        child.Measure(Size.Empty);
242
                    }
244
                    }
243
 
245
 
244
                    continue;
246
                    continue;
245
                }
247
                }
Line 250... Line 252...
250
 
252
 
251
            //with no children no space needed
253
            //with no children no space needed
252
            if (visibleChildren.Count == 0)
254
            if (visibleChildren.Count == 0)
253
                return new Size();
255
                return new Size();
254
 
256
 
-
 
257
            NormalizeStarLength(visibleChildren);
-
 
258
 
255
            Debug.Assert(!(visibleChildren.Last<FrameworkElement>() is ResizingPanelSplitter));
259
            Debug.Assert(!(visibleChildren.Last<FrameworkElement>() is Resizer));
256
 
260
 
257
            if (availableSize.Width == double.PositiveInfinity &&
261
            if (availableSize.Width == double.PositiveInfinity &&
258
                Orientation == Orientation.Horizontal)
262
                Orientation == Orientation.Horizontal)
259
            {
263
            {
260
                Size newAvailSize = new Size();
264
                Size newAvailSize = new Size();
Line 279... Line 283...
279
                }
283
                }
280
                availableSize = newAvailSize;
284
                availableSize = newAvailSize;
281
            }
285
            }
282
 
286
 
283
            var splitters = from FrameworkElement child in visibleChildren
287
            var splitters = from FrameworkElement child in visibleChildren
284
                            where child is ResizingPanelSplitter
288
                            where child is Resizer
285
                            select child;
289
                            select child;
286
            var childStars = from FrameworkElement child in visibleChildren
290
            var childStars = from FrameworkElement child in visibleChildren
287
                             where (!(child is ResizingPanelSplitter)) && child.IsStar()
291
                             where (!(child is Resizer)) && child.IsStar()
288
                             select child;
292
                             select child;
289
 
293
 
290
            var childAbsolutes = from FrameworkElement child in visibleChildren
294
            var childAbsolutes = from FrameworkElement child in visibleChildren
291
                                 where (!(child is ResizingPanelSplitter)) && child.IsAbsolute()
295
                                 where (!(child is Resizer)) && child.IsAbsolute()
292
                                 select child;
296
                                 select child;
293
 
297
 
294
            var childAutoSizes = from FrameworkElement child in visibleChildren
298
            var childAutoSizes = from FrameworkElement child in visibleChildren
295
                                 where (!(child is ResizingPanelSplitter)) && child.IsAuto()
299
                                 where (!(child is Resizer)) && child.IsAuto()
296
                                 select child;
300
                                 select child;
297
 
301
 
298
            //calculate the size of the splitters
302
            //calculate the size of the splitters
299
            Size splitterSize = new Size();
303
            Size splitterSize = new Size();
300
            foreach (ResizingPanelSplitter splitter in splitters)
304
            foreach (Resizer splitter in splitters)
301
            {
305
            {
302
                splitterSize.Width += splitter.MinWidth;
306
                splitterSize.Width += splitter.MinWidth;
303
                splitterSize.Height += splitter.MinHeight;
307
                splitterSize.Height += splitter.MinHeight;
304
            }
308
            }
305
 
309
 
Line 353... Line 357...
353
                {
357
                {
354
                    double delta = (minimumPrefferedSize.Width - availableSize.Width) / childAbsolutes.Count<FrameworkElement>();
358
                    double delta = (minimumPrefferedSize.Width - availableSize.Width) / childAbsolutes.Count<FrameworkElement>();
355
 
359
 
356
                    foreach (FrameworkElement child in visibleChildren)
360
                    foreach (FrameworkElement child in visibleChildren)
357
                    {
361
                    {
358
                        if (child is ResizingPanelSplitter)
362
                        if (child is Resizer)
359
                        {
363
                        {
360
                            child.Measure(new Size(child.MinWidth, availableSize.Height));
364
                            child.Measure(new Size(child.MinWidth, availableSize.Height));
361
                            maxHeight = Math.Max(child.DesiredSize.Height, maxHeight);
365
                            maxHeight = Math.Max(child.DesiredSize.Height, maxHeight);
362
                            offset += child.MinWidth;
366
                            offset += child.MinWidth;
363
                        }
367
                        }
Line 384... Line 388...
384
                        childAbsolutes.Sum<FrameworkElement>(a => a.GetAbsoluteValue()) -
388
                        childAbsolutes.Sum<FrameworkElement>(a => a.GetAbsoluteValue()) -
385
                        childAutoSizes.Sum<FrameworkElement>(a => a.DesiredSize.Width);
389
                        childAutoSizes.Sum<FrameworkElement>(a => a.DesiredSize.Width);
386
 
390
 
387
                    foreach (FrameworkElement child in visibleChildren)
391
                    foreach (FrameworkElement child in visibleChildren)
388
                    {
392
                    {
389
                        if (child is ResizingPanelSplitter)
393
                        if (child is Resizer)
390
                        {
394
                        {
391
                            child.Measure(new Size(child.MinWidth, availableSize.Height));
395
                            child.Measure(new Size(child.MinWidth, availableSize.Height));
392
                            maxHeight = Math.Max(child.DesiredSize.Height, maxHeight);
396
                            maxHeight = Math.Max(child.DesiredSize.Height, maxHeight);
393
                            offset += child.MinWidth;
397
                            offset += child.MinWidth;
394
                        }
398
                        }
Line 438... Line 442...
438
                {
442
                {
439
                    double delta = (minimumPrefferedSize.Height - availableSize.Height) / childAbsolutes.Count<FrameworkElement>();
443
                    double delta = (minimumPrefferedSize.Height - availableSize.Height) / childAbsolutes.Count<FrameworkElement>();
440
 
444
 
441
                    foreach (FrameworkElement child in visibleChildren)
445
                    foreach (FrameworkElement child in visibleChildren)
442
                    {
446
                    {
443
                        if (child is ResizingPanelSplitter)
447
                        if (child is Resizer)
444
                        {
448
                        {
445
                            child.Measure(new Size(availableSize.Width, child.MinHeight));
449
                            child.Measure(new Size(availableSize.Width, child.MinHeight));
446
                            maxWidth = Math.Max(child.DesiredSize.Width, maxWidth);
450
                            maxWidth = Math.Max(child.DesiredSize.Width, maxWidth);
447
                            offset += child.MinHeight;
451
                            offset += child.MinHeight;
448
                        }
452
                        }
Line 469... Line 473...
469
                        childAbsolutes.Sum<FrameworkElement>(a => a.GetAbsoluteValue()) -
473
                        childAbsolutes.Sum<FrameworkElement>(a => a.GetAbsoluteValue()) -
470
                        childAutoSizes.Sum<FrameworkElement>(a => a.DesiredSize.Height);
474
                        childAutoSizes.Sum<FrameworkElement>(a => a.DesiredSize.Height);
471
 
475
 
472
                    foreach (FrameworkElement child in visibleChildren)
476
                    foreach (FrameworkElement child in visibleChildren)
473
                    {
477
                    {
474
                        if (child is ResizingPanelSplitter)
478
                        if (child is Resizer)
475
                        {
479
                        {
476
                            child.Measure(new Size(availableSize.Width, child.MinHeight));
480
                            child.Measure(new Size(availableSize.Width, child.MinHeight));
477
                            maxWidth = Math.Max(child.DesiredSize.Width, maxWidth);
481
                            maxWidth = Math.Max(child.DesiredSize.Width, maxWidth);
478
                            offset += child.MinWidth;
482
                            offset += child.MinWidth;
479
                        }
483
                        }
Line 502... Line 506...
502
                return new Size(maxWidth, offset);
506
                return new Size(maxWidth, offset);
503
 
507
 
504
                #endregion
508
                #endregion
505
 
509
 
506
            }
510
            }
-
 
511
        }
-
 
512
 
-
 
513
        private void NormalizeStarLength(IEnumerable<FrameworkElement> visibleChildren)
-
 
514
        {
-
 
515
            var childrenWithStarLength = visibleChildren.Where(c => c is IDockableControl && c.IsStar());
-
 
516
            int childrenWithStartLengthCount = childrenWithStarLength.Count();
-
 
517
 
-
 
518
            if (childrenWithStartLengthCount == 0)
-
 
519
                return;
-
 
520
 
-
 
521
            if (childrenWithStartLengthCount == 1)
-
 
522
            {
-
 
523
                ResizingPanel.SetResizeWidth(childrenWithStarLength.First(), new GridLength(1.0, GridUnitType.Star));
-
 
524
                return;
-
 
525
            }
-
 
526
 
-
 
527
            double sumStars = childrenWithStarLength.Sum(c => c.GetStarValue());
-
 
528
 
-
 
529
            if (sumStars == 0)
-
 
530
            {
-
 
531
                //problem!?! try to fix...
-
 
532
                childrenWithStarLength.ForEach(c =>
-
 
533
                    {
-
 
534
                        ResizingPanel.SetResizeWidth(c, new GridLength(1.0 / childrenWithStartLengthCount, GridUnitType.Star));
-
 
535
                    });
-
 
536
            }
-
 
537
            else
-
 
538
            {
-
 
539
                childrenWithStarLength.ForEach(c =>
-
 
540
                {
-
 
541
                    ResizingPanel.SetResizeWidth(c, new GridLength(1.0 * c.GetStarValue() / sumStars, GridUnitType.Star));
-
 
542
                });                
-
 
543
            }
-
 
544
           
507
        }
545
        }
508
 
546
 
509
        Size[] _childrenFinalSizes = null;
547
        Size[] _childrenFinalSizes = null;
510
 
548
 
511
        /// <summary>
549
        /// <summary>
Line 513... Line 551...
513
        /// </summary>
551
        /// </summary>
514
        /// <param name="finalSize"></param>
552
        /// <param name="finalSize"></param>
515
        /// <returns></returns>
553
        /// <returns></returns>
516
        protected override Size ArrangeOverride(Size finalSize)
554
        protected override Size ArrangeOverride(Size finalSize)
517
        {
555
        {
-
 
556
            //Debug.WriteLine("ResizingPanel.ArrangeOverride()");
-
 
557
 
518
            //Compute the list of visible children
558
            //Compute the list of visible children
519
            List<FrameworkElement> visibleChildren = new List<FrameworkElement>();
559
            List<FrameworkElement> visibleChildren = new List<FrameworkElement>();
520
            for (int i = 0; i < VisualChildrenCount; i++)
560
            for (int i = 0; i < VisualChildrenCount; i++)
521
            {
561
            {
522
                FrameworkElement child = GetVisualChild(i) as FrameworkElement;
562
                FrameworkElement child = GetVisualChild(i) as FrameworkElement;
Line 529... Line 569...
529
 
569
 
530
                    if (i == VisualChildrenCount - 1 &&
570
                    if (i == VisualChildrenCount - 1 &&
531
                        i > 0)
571
                        i > 0)
532
                    {
572
                    {
533
                        child = GetVisualChild(i - 1) as FrameworkElement;
573
                        child = GetVisualChild(i - 1) as FrameworkElement;
534
                        Debug.Assert(child is ResizingPanelSplitter);
574
                        Debug.Assert(child is Resizer);
535
 
575
 
536
                        child.Arrange(new Rect());
576
                        child.Arrange(new Rect());
537
 
577
 
538
                        if (visibleChildren.Count > 0)
578
                        if (visibleChildren.Count > 0)
539
                        {
579
                        {
540
                            Debug.Assert(visibleChildren[visibleChildren.Count - 1] is ResizingPanelSplitter);
580
                            Debug.Assert(visibleChildren[visibleChildren.Count - 1] is Resizer);
541
                            visibleChildren[visibleChildren.Count - 1].Arrange(new Rect());
581
                            visibleChildren[visibleChildren.Count - 1].Arrange(new Rect());
542
                            visibleChildren.RemoveAt(visibleChildren.Count - 1);
582
                            visibleChildren.RemoveAt(visibleChildren.Count - 1);
543
                        }
583
                        }
544
 
584
 
545
                    }
585
                    }
546
                    else if (i < VisualChildrenCount - 1)
586
                    else if (i < VisualChildrenCount - 1)
547
                    {
587
                    {
548
                        i++;
588
                        i++;
549
                        child = GetVisualChild(i) as FrameworkElement;
589
                        child = GetVisualChild(i) as FrameworkElement;
550
                        child.Arrange(new Rect());
590
                        child.Arrange(new Rect());
551
                        Debug.Assert(child is ResizingPanelSplitter);
591
                        Debug.Assert(child is Resizer);
552
                    }
592
                    }
553
 
593
 
554
                    continue;
594
                    continue;
555
                }
595
                }
556
 
596
 
Line 562... Line 602...
562
            {
602
            {
563
                _childrenFinalSizes = new Size[] { };
603
                _childrenFinalSizes = new Size[] { };
564
                return new Size();
604
                return new Size();
565
            }
605
            }
566
 
606
 
567
            Debug.Assert(!(visibleChildren.Last<FrameworkElement>() is ResizingPanelSplitter));
607
            Debug.Assert(!(visibleChildren.Last<FrameworkElement>() is Resizer));
568
               
608
               
569
 
609
 
570
            _childrenFinalSizes = new Size[visibleChildren.Count];
610
            _childrenFinalSizes = new Size[visibleChildren.Count];
571
 
611
 
572
            var splitters = from FrameworkElement child in visibleChildren
612
            var splitters = from FrameworkElement child in visibleChildren
573
                            where child is ResizingPanelSplitter
613
                            where child is Resizer
574
                            select child;
614
                            select child;
575
            var childStars = from FrameworkElement child in visibleChildren
615
            var childStars = from FrameworkElement child in visibleChildren
576
                             where (!(child is ResizingPanelSplitter)) && child.IsStar()
616
                             where (!(child is Resizer)) && child.IsStar()
577
                             select child;
617
                             select child;
578
 
618
 
579
            var childAbsolutes = from FrameworkElement child in visibleChildren
619
            var childAbsolutes = from FrameworkElement child in visibleChildren
580
                                 where (!(child is ResizingPanelSplitter)) && child.IsAbsolute()
620
                                 where (!(child is Resizer)) && child.IsAbsolute()
581
                                 select child;
621
                                 select child;
582
 
622
 
583
            var childAutoSizes = from FrameworkElement child in visibleChildren
623
            var childAutoSizes = from FrameworkElement child in visibleChildren
584
                                 where (!(child is ResizingPanelSplitter)) && child.IsAuto()
624
                                 where (!(child is Resizer)) && child.IsAuto()
585
                                 select child;
625
                                 select child;
586
 
626
 
587
            //calculate the size of the splitters
627
            //calculate the size of the splitters
588
            Size splitterSize = new Size();
628
            Size splitterSize = new Size();
589
            foreach (ResizingPanelSplitter splitter in splitters)
629
            foreach (Resizer splitter in splitters)
590
            {
630
            {
591
                splitterSize.Width += splitter.MinWidth;
631
                splitterSize.Width += splitter.MinWidth;
592
                splitterSize.Height += splitter.MinHeight;
632
                splitterSize.Height += splitter.MinHeight;
593
            }
633
            }
594
 
634
 
Line 640... Line 680...
640
                {
680
                {
641
                    double delta = (minimumPrefferedSize.Width - finalSize.Width) / childAbsolutes.Count<FrameworkElement>();
681
                    double delta = (minimumPrefferedSize.Width - finalSize.Width) / childAbsolutes.Count<FrameworkElement>();
642
 
682
 
643
                    foreach (FrameworkElement child in visibleChildren)
683
                    foreach (FrameworkElement child in visibleChildren)
644
                    {
684
                    {
645
                        if (child is ResizingPanelSplitter)
685
                        if (child is Resizer)
646
                            _childrenFinalSizes[iChild++] = new Size(child.MinWidth, finalSize.Height);
686
                            _childrenFinalSizes[iChild++] = new Size(child.MinWidth, finalSize.Height);
647
                        else if (child.IsAbsolute())
687
                        else if (child.IsAbsolute())
648
                            _childrenFinalSizes[iChild++] = new Size(Math.Max(child.GetAbsoluteValue() - delta, 0.0), finalSize.Height);
688
                            _childrenFinalSizes[iChild++] = new Size(Math.Max(child.GetAbsoluteValue() - delta, 0.0), finalSize.Height);
649
                        else
689
                        else
650
                            _childrenFinalSizes[iChild++] = new Size(child.MinWidth, finalSize.Height);
690
                            _childrenFinalSizes[iChild++] = new Size(child.MinWidth, finalSize.Height);
Line 659... Line 699...
659
                        childAbsolutes.Sum<FrameworkElement>(a => a.GetAbsoluteValue()) -
699
                        childAbsolutes.Sum<FrameworkElement>(a => a.GetAbsoluteValue()) -
660
                        childAutoSizes.Sum<FrameworkElement>(a => a.DesiredSize.Width);
700
                        childAutoSizes.Sum<FrameworkElement>(a => a.DesiredSize.Width);
661
 
701
 
662
                    foreach (FrameworkElement child in visibleChildren)
702
                    foreach (FrameworkElement child in visibleChildren)
663
                    {
703
                    {
664
                        if (child is ResizingPanelSplitter)
704
                        if (child is Resizer)
665
                            _childrenFinalSizes[iChild++] = new Size(child.MinWidth, finalSize.Height);
705
                            _childrenFinalSizes[iChild++] = new Size(child.MinWidth, finalSize.Height);
666
                        else if (child.IsAbsolute())
706
                        else if (child.IsAbsolute())
667
                            _childrenFinalSizes[iChild++] = new Size(child.GetAbsoluteValue(), finalSize.Height);
707
                            _childrenFinalSizes[iChild++] = new Size(child.GetAbsoluteValue(), finalSize.Height);
668
                        else if (child.IsStar())
708
                        else if (child.IsStar())
669
                            _childrenFinalSizes[iChild++] = new Size(child.GetStarValue() / starsSum * starsFinalWidth, finalSize.Height);
709
                            _childrenFinalSizes[iChild++] = new Size(child.GetStarValue() / starsSum * starsFinalWidth, finalSize.Height);
Line 703... Line 743...
703
                {
743
                {
704
                    double delta = (minimumPrefferedSize.Height - finalSize.Height) / childAbsolutes.Count<FrameworkElement>();
744
                    double delta = (minimumPrefferedSize.Height - finalSize.Height) / childAbsolutes.Count<FrameworkElement>();
705
 
745
 
706
                    foreach (FrameworkElement child in visibleChildren)
746
                    foreach (FrameworkElement child in visibleChildren)
707
                    {
747
                    {
708
                        if (child is ResizingPanelSplitter)
748
                        if (child is Resizer)
709
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, child.MinHeight);
749
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, child.MinHeight);
710
                        else if (child.IsAbsolute())
750
                        else if (child.IsAbsolute())
711
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, Math.Max(child.GetAbsoluteValue() - delta, 0.0));
751
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, Math.Max(child.GetAbsoluteValue() - delta, 0.0));
712
                        else
752
                        else
713
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, child.MinHeight);
753
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, child.MinHeight);
Line 722... Line 762...
722
                        childAbsolutes.Sum<FrameworkElement>(a => a.GetAbsoluteValue()) -
762
                        childAbsolutes.Sum<FrameworkElement>(a => a.GetAbsoluteValue()) -
723
                        childAutoSizes.Sum<FrameworkElement>(a => a.DesiredSize.Height);
763
                        childAutoSizes.Sum<FrameworkElement>(a => a.DesiredSize.Height);
724
 
764
 
725
                    foreach (FrameworkElement child in visibleChildren)
765
                    foreach (FrameworkElement child in visibleChildren)
726
                    {
766
                    {
727
                        if (child is ResizingPanelSplitter)
767
                        if (child is Resizer)
728
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, child.MinHeight);
768
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, child.MinHeight);
729
                        else if (child.IsAbsolute())
769
                        else if (child.IsAbsolute())
730
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, child.GetAbsoluteValue());
770
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, child.GetAbsoluteValue());
731
                        else if (child.IsStar())
771
                        else if (child.IsStar())
732
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, child.GetStarValue() / starsSum * starsFinalHeight);
772
                            _childrenFinalSizes[iChild++] = new Size(finalSize.Width, child.GetStarValue() / starsSum * starsFinalHeight);
Line 753... Line 793...
753
 
793
 
754
        }
794
        }
755
 
795
 
756
        bool setupSplitters = false;
796
        bool setupSplitters = false;
757
        bool splitterListIsDirty = false;
797
        bool splitterListIsDirty = false;
758
 
798
 
759
        void SetupSplitters()
799
        void SetupSplitters()
760
        {
800
        {
761
            if (!splitterListIsDirty)
801
            if (!splitterListIsDirty)
762
                return;
802
                return;
763
 
803
 
Line 766... Line 806...
766
 
806
 
767
            setupSplitters = true;
807
            setupSplitters = true;
768
 
808
 
769
            while (_splitterList.Count > 0)
809
            while (_splitterList.Count > 0)
770
            {
810
            {
771
                ResizingPanelSplitter splitter = _splitterList[0];
811
                Resizer splitter = _splitterList[0];
772
                splitter.DragStarted -= new DragStartedEventHandler(splitter_DragStarted);
812
                splitter.DragStarted -= new DragStartedEventHandler(splitter_DragStarted);
773
                splitter.DragDelta -= new DragDeltaEventHandler(splitter_DragDelta);
813
                splitter.DragDelta -= new DragDeltaEventHandler(splitter_DragDelta);
774
                splitter.DragCompleted -= new DragCompletedEventHandler(splitter_DragCompleted);
814
                splitter.DragCompleted -= new DragCompletedEventHandler(splitter_DragCompleted);
775
                _splitterList.Remove(splitter);
815
                _splitterList.Remove(splitter);
776
                Children.Remove(splitter);
816
                Children.Remove(splitter);
Line 781... Line 821...
781
 
821
 
782
            while (i < Children.Count - 1)
822
            while (i < Children.Count - 1)
783
            {
823
            {
784
                if (j == _splitterList.Count)
824
                if (j == _splitterList.Count)
785
                {
825
                {
786
                    ResizingPanelSplitter splitter = new ResizingPanelSplitter();
826
                    Resizer splitter = new Resizer();
-
 
827
                    splitter.Cursor =  this.Orientation == Orientation.Horizontal ? Cursors.SizeWE : Cursors.SizeNS;
787
                    _splitterList.Add(splitter);
828
                    _splitterList.Add(splitter);
788
                    splitter.DragStarted += new DragStartedEventHandler(splitter_DragStarted);
829
                    splitter.DragStarted += new DragStartedEventHandler(splitter_DragStarted);
789
                    splitter.DragDelta += new DragDeltaEventHandler(splitter_DragDelta);
830
                    splitter.DragDelta += new DragDeltaEventHandler(splitter_DragDelta);
790
                    splitter.DragCompleted += new DragCompletedEventHandler(splitter_DragCompleted);
831
                    splitter.DragCompleted += new DragCompletedEventHandler(splitter_DragCompleted);
791
                    Children.Insert(i + 1, splitter);
832
                    Children.Insert(i + 1, splitter);
Line 795... Line 836...
795
                j++;
836
                j++;
796
            }
837
            }
797
 
838
 
798
            for (j = 0; j < _splitterList.Count; j++)
839
            for (j = 0; j < _splitterList.Count; j++)
799
            {
840
            {
800
                _splitterList[j].Width = (Orientation == Orientation.Horizontal) ? 4 : double.NaN;
841
                _splitterList[j].Width = (Orientation == Orientation.Horizontal) ? 6 : double.NaN;
801
                _splitterList[j].Height = (Orientation == Orientation.Vertical) ? 4 : double.NaN;
842
                _splitterList[j].Height = (Orientation == Orientation.Vertical) ? 6 : double.NaN;
802
            }
843
            }
803
 
844
 
804
#if DEBUG
845
#if DEBUG
805
            Debug.Assert(_splitterList.Count == Children.Count / 2);
846
            Debug.Assert(_splitterList.Count == Children.Count / 2);
806
            i = 0;
847
            i = 0;
807
            while (Children.Count > 0)
848
            while (Children.Count > 0)
808
            {
849
            {
809
                Debug.Assert(Children[i] != null);
850
                Debug.Assert(Children[i] != null);
810
                Debug.Assert(!(Children[i] is ResizingPanelSplitter));
851
                Debug.Assert(!(Children[i] is Resizer));
811
                i++;
852
                i++;
812
                if (i >= Children.Count)
853
                if (i >= Children.Count)
813
                    break;
854
                    break;
814
 
855
 
815
                Debug.Assert((Children[i] is ResizingPanelSplitter));
856
                Debug.Assert((Children[i] is Resizer));
816
                i++;
857
                i++;
817
 
858
 
818
            }
859
            }
819
#endif
860
#endif
820
            splitterListIsDirty = false;
861
            splitterListIsDirty = false;
Line 826... Line 867...
826
            base.OnVisualChildrenChanged(visualAdded, visualRemoved);
867
            base.OnVisualChildrenChanged(visualAdded, visualRemoved);
827
 
868
 
828
            splitterListIsDirty = true;
869
            splitterListIsDirty = true;
829
        }
870
        }
830
 
871
 
831
        void splitter_DragCompleted(object sender, DragCompletedEventArgs e)
-
 
832
        {
-
 
833
            Cursor = Cursors.Arrow;
-
 
834
        }
-
 
835
 
872
 
836
        /// <summary>
873
        /// <summary>
837
        /// This method is called by a splitter when it is dragged
874
        /// This method is called by a splitter when it is dragged
838
        /// </summary>
875
        /// </summary>
839
        /// <param name="splitter">Dragged splitter</param>
876
        /// <param name="splitter">Dragged splitter</param>
840
        /// <param name="delta"></param>
877
        /// <param name="delta"></param>
841
        void splitter_DragDelta(object sender, DragDeltaEventArgs e)
878
        void splitter_DragDelta(object sender, DragDeltaEventArgs e)
842
        {
879
        {
-
 
880
            Resizer splitter = sender as Resizer;
-
 
881
 
-
 
882
            if (Orientation == System.Windows.Controls.Orientation.Horizontal)
-
 
883
            {
-
 
884
                Canvas.SetLeft(_resizerGhost, _initialStartPoint.X + e.HorizontalChange);
-
 
885
            }
-
 
886
            else
-
 
887
            {
-
 
888
                Canvas.SetTop(_resizerGhost, _initialStartPoint.Y + e.VerticalChange);
-
 
889
            }
-
 
890
 
-
 
891
 
843
            ResizingPanelSplitter splitter = e.Source as ResizingPanelSplitter;
892
            //ResizingPanelSplitter splitter = e.Source as ResizingPanelSplitter;
-
 
893
            //int i = 0;
-
 
894
 
-
 
895
            ////Compute the list of visible children
-
 
896
            //List<FrameworkElement> visibleChildren = new List<FrameworkElement>();
-
 
897
            //for (i = 0; i < VisualChildrenCount; i++)
-
 
898
            //{
-
 
899
            //    FrameworkElement child = GetVisualChild(i) as FrameworkElement;
-
 
900
 
-
 
901
            //    IDockableControl dockableControl = child as IDockableControl;
-
 
902
            //    if (dockableControl != null &&
-
 
903
            //        !dockableControl.IsDocked)
-
 
904
            //    {
-
 
905
            //        if (i == VisualChildrenCount - 1 &&
-
 
906
            //            i > 0)
-
 
907
            //        {
-
 
908
            //            //remove the last splitter added
-
 
909
            //            if (visibleChildren.Count > 0 &&
-
 
910
            //                visibleChildren.Last<FrameworkElement>() is ResizingPanelSplitter)
-
 
911
            //                visibleChildren.RemoveAt(visibleChildren.Count - 1);
-
 
912
            //        }
-
 
913
            //        else if (i < VisualChildrenCount - 1)
-
 
914
            //        {
-
 
915
            //            //discard the next splitter
-
 
916
            //            i++;
-
 
917
            //        }
-
 
918
 
-
 
919
            //        continue;
-
 
920
            //    }
-
 
921
 
-
 
922
            //    visibleChildren.Add(child);
-
 
923
            //}
-
 
924
 
-
 
925
            //if (visibleChildren.Count == 0)
-
 
926
            //    return;
-
 
927
 
-
 
928
            //if (visibleChildren.Last<FrameworkElement>() is ResizingPanelSplitter)
-
 
929
            //    visibleChildren.RemoveAt(visibleChildren.Count - 1);
-
 
930
 
-
 
931
            //Size[] currentSizes = new Size[visibleChildren.Count];
-
 
932
            //double delta = Orientation == Orientation.Horizontal ? e.HorizontalChange : e.VerticalChange;
-
 
933
 
-
 
934
            //if (_childrenFinalSizes == null)
-
 
935
            //    return;
-
 
936
 
-
 
937
            //_childrenFinalSizes.CopyTo(currentSizes, 0);
-
 
938
 
-
 
939
            //int iSplitter = visibleChildren.IndexOf(splitter);
-
 
940
 
-
 
941
            //Debug.Assert(iSplitter > -1);
-
 
942
 
-
 
943
            //List<FrameworkElement> prevChildren = new List<FrameworkElement>();
-
 
944
            //for (i = iSplitter - 1; i >= 0; i--)
-
 
945
            //{
-
 
946
            //    FrameworkElement child = visibleChildren[i] as FrameworkElement;
-
 
947
            //    if (child is ResizingPanelSplitter)
-
 
948
            //        continue;
-
 
949
            //    if (child.IsAbsolute() || child.IsAuto())
-
 
950
            //    {
-
 
951
            //        if (prevChildren.Count == 0)
-
 
952
            //        {
-
 
953
            //            prevChildren.Add(child);
-
 
954
            //        }
-
 
955
            //        break;
-
 
956
            //    }
-
 
957
            //    if (child.IsStar())
-
 
958
            //    {
-
 
959
            //        prevChildren.Add(child);
-
 
960
            //    }
-
 
961
            //}
-
 
962
 
-
 
963
            //List<FrameworkElement> nextChildren = new List<FrameworkElement>();
-
 
964
 
-
 
965
            //for (i = iSplitter + 1; i < visibleChildren.Count; i++)
-
 
966
            //{
-
 
967
            //    FrameworkElement child = visibleChildren[i] as FrameworkElement;
-
 
968
            //    if (child is ResizingPanelSplitter)
-
 
969
            //        continue;
-
 
970
            //    if (child.IsAbsolute() || child.IsAuto())
-
 
971
            //    {
-
 
972
            //        if (nextChildren.Count == 0)
-
 
973
            //            nextChildren.Add(child);
-
 
974
            //        break;
-
 
975
            //    }
-
 
976
            //    if (child.IsStar())
-
 
977
            //    {
-
 
978
            //        nextChildren.Add(child);
-
 
979
            //    }
-
 
980
            //}
-
 
981
 
-
 
982
 
-
 
983
            //double prevMinSize = prevChildren.Sum<FrameworkElement>(c => Orientation == Orientation.Horizontal ? c.MinWidth : c.MinHeight);
-
 
984
            //double nextMinSize = nextChildren.Sum<FrameworkElement>(c => Orientation == Orientation.Horizontal ? c.MinWidth : c.MinHeight);
-
 
985
            //double prevMaxSize = prevChildren.Sum<FrameworkElement>(c => Orientation == Orientation.Horizontal ? c.MaxWidth : c.MaxHeight);
-
 
986
            //double nextMaxSize = nextChildren.Sum<FrameworkElement>(c => Orientation == Orientation.Horizontal ? c.MaxWidth : c.MaxHeight);
-
 
987
 
-
 
988
            //double prevSize = prevChildren.Sum<FrameworkElement>(c => Orientation == Orientation.Horizontal ? currentSizes[visibleChildren.IndexOf(c)].Width : currentSizes[visibleChildren.IndexOf(c)].Height);
-
 
989
            //double nextSize = nextChildren.Sum<FrameworkElement>(c => Orientation == Orientation.Horizontal ? currentSizes[visibleChildren.IndexOf(c)].Width : currentSizes[visibleChildren.IndexOf(c)].Height);
-
 
990
 
-
 
991
            //if (prevSize + delta < prevMinSize)
-
 
992
            //    delta = prevMinSize - prevSize;
-
 
993
            //if (nextSize - delta < nextMinSize)
-
 
994
            //    delta = -(nextMinSize - nextSize);
-
 
995
 
-
 
996
            //double remDelta = delta * 2;
-
 
997
 
-
 
998
            //while (!HelperFunc.AreClose(delta, 0.0))
-
 
999
            //{
-
 
1000
            //    int prevChildrenCountWithNoMinLen =
-
 
1001
            //        prevChildren.Count<FrameworkElement>(c => delta > 0 ? true : (Orientation == Orientation.Horizontal ? currentSizes[visibleChildren.IndexOf(c)].Width > c.MinWidth : currentSizes[visibleChildren.IndexOf(c)].Height > c.MinHeight));
-
 
1002
            //    int nextChildrenCountWithNoMinLen =
-
 
1003
            //        nextChildren.Count<FrameworkElement>(c => delta < 0 ? true : (Orientation == Orientation.Horizontal ? currentSizes[visibleChildren.IndexOf(c)].Width > c.MinWidth : currentSizes[visibleChildren.IndexOf(c)].Height > c.MinHeight));
-
 
1004
               
-
 
1005
            //    delta = remDelta / 2.0;
-
 
1006
 
-
 
1007
            //    for (i = 0; i < currentSizes.Length; i++)
-
 
1008
            //    {
-
 
1009
            //        FrameworkElement child = visibleChildren[i] as FrameworkElement;
-
 
1010
            //        if (child is ResizingPanelSplitter)
-
 
1011
            //            continue;
-
 
1012
 
-
 
1013
            //        if (Orientation == Orientation.Horizontal)
-
 
1014
            //        {
-
 
1015
            //            if (prevChildren.Contains(child) && prevChildrenCountWithNoMinLen > 0)
-
 
1016
            //            {
-
 
1017
            //                double s = delta / prevChildrenCountWithNoMinLen;
-
 
1018
            //                if (currentSizes[i].Width + s < child.MinWidth)
-
 
1019
            //                    s = child.MinWidth - currentSizes[i].Width;
-
 
1020
                           
-
 
1021
            //                currentSizes[i].Width += s;
-
 
1022
            //                remDelta -= s;
-
 
1023
            //            }
-
 
1024
            //            if (nextChildren.Contains(child) && nextChildrenCountWithNoMinLen > 0)
-
 
1025
            //            {
-
 
1026
            //                double s = delta / nextChildrenCountWithNoMinLen;
-
 
1027
            //                if (currentSizes[i].Width - s < child.MinWidth)
-
 
1028
            //                    s = currentSizes[i].Width - child.MinWidth;
-
 
1029
 
-
 
1030
            //                currentSizes[i].Width -= s;
-
 
1031
            //                remDelta -= s;
-
 
1032
            //            }
-
 
1033
            //        }
-
 
1034
            //        else
-
 
1035
            //        {
-
 
1036
            //            if (prevChildren.Contains(child) && prevChildrenCountWithNoMinLen > 0)
-
 
1037
            //            {
-
 
1038
            //                double s = delta / prevChildrenCountWithNoMinLen;
-
 
1039
            //                if (currentSizes[i].Height + s < child.MinHeight)
-
 
1040
            //                    s = child.MinHeight - currentSizes[i].Height;
-
 
1041
 
-
 
1042
            //                currentSizes[i].Height += s;
-
 
1043
            //                remDelta -= s;
-
 
1044
            //            }
-
 
1045
            //            if (nextChildren.Contains(child) && nextChildrenCountWithNoMinLen > 0)
-
 
1046
            //            {
-
 
1047
            //                double s = delta / nextChildrenCountWithNoMinLen;
-
 
1048
            //                if (currentSizes[i].Height - s < child.MinHeight)
-
 
1049
            //                    s = currentSizes[i].Height - child.MinHeight;
-
 
1050
 
-
 
1051
            //                currentSizes[i].Height -= s;
-
 
1052
            //                remDelta -= s;
-
 
1053
            //            }
-
 
1054
            //        }
-
 
1055
            //    }
-
 
1056
            //}
-
 
1057
 
-
 
1058
            //Debug.Assert(HelperFunc.AreClose(delta, 0.0));
-
 
1059
 
-
 
1060
            //double totalStartsSum = 0.0;
-
 
1061
            //double totalSizeForStarts = 0.0;
-
 
1062
 
-
 
1063
            //for (i = 0; i < visibleChildren.Count; i++)
-
 
1064
            //{ 
-
 
1065
            //    FrameworkElement child = visibleChildren[i] as FrameworkElement;
-
 
1066
            //    if (child is ResizingPanelSplitter)
-
 
1067
            //        continue;
-
 
1068
            //    if (child.IsStar())
-
 
1069
            //    {
-
 
1070
            //        totalStartsSum += child.GetStarValue();
-
 
1071
            //        totalSizeForStarts += Orientation == Orientation.Horizontal ? currentSizes[i].Width : currentSizes[i].Height;
-
 
1072
            //    }
-
 
1073
            //}
-
 
1074
               
-
 
1075
 
-
 
1076
            //double starsScaleFactor = totalStartsSum / totalSizeForStarts;
-
 
1077
 
-
 
1078
            //for (i = 0; i < currentSizes.Length; i++)
-
 
1079
            //{
-
 
1080
            //    FrameworkElement child = visibleChildren[i] as FrameworkElement;
-
 
1081
 
-
 
1082
            //    if (child is ResizingPanelSplitter)
-
 
1083
            //        continue;
-
 
1084
 
-
 
1085
            //    if (child.IsStar())
-
 
1086
            //    {
-
 
1087
            //        if (Orientation == Orientation.Horizontal)
-
 
1088
            //        {
-
 
1089
            //            SetResizeWidth(child,
-
 
1090
            //                new GridLength(HelperFunc.MultiplyCheckNaN(currentSizes[i].Width, starsScaleFactor), GridUnitType.Star));
-
 
1091
            //        }
-
 
1092
            //        else
-
 
1093
            //        {
-
 
1094
            //            SetResizeHeight(child,
-
 
1095
            //                new GridLength(HelperFunc.MultiplyCheckNaN(currentSizes[i].Height, starsScaleFactor), GridUnitType.Star));
-
 
1096
            //        }
-
 
1097
            //    }
-
 
1098
            //    else if (child.IsAbsolute())
-
 
1099
            //    {
-
 
1100
            //        if (Orientation == Orientation.Horizontal)
-
 
1101
            //        {
-
 
1102
            //            SetResizeWidth(child,
-
 
1103
            //                new GridLength(currentSizes[i].Width, GridUnitType.Pixel));
-
 
1104
            //        }
-
 
1105
            //        else
-
 
1106
            //        {
-
 
1107
            //            SetResizeHeight(child,
-
 
1108
            //                new GridLength(currentSizes[i].Height, GridUnitType.Pixel)); 
-
 
1109
            //        }
-
 
1110
            //    }
-
 
1111
            //}
-
 
1112
 
-
 
1113
            //InvalidateMeasure();
-
 
1114
        }
-
 
1115
 
-
 
1116
        void splitter_DragStarted(object sender, DragStartedEventArgs e)
-
 
1117
        {
-
 
1118
            var resizer = sender as Resizer;
-
 
1119
            ShowResizerOverlayWindow(resizer);
-
 
1120
        }
-
 
1121
 
-
 
1122
        void splitter_DragCompleted(object sender, DragCompletedEventArgs e)
-
 
1123
        {
-
 
1124
            HideResizerOverlayWindow();
-
 
1125
 
-
 
1126
            Resizer splitter = e.Source as Resizer;
844
            int i = 0;
1127
            int i = 0;
845
 
1128
 
846
            //Compute the list of visible children
1129
            //Compute the list of visible children
847
            List<FrameworkElement> visibleChildren = new List<FrameworkElement>();
1130
            List<FrameworkElement> visibleChildren = new List<FrameworkElement>();
848
            for (i = 0; i < VisualChildrenCount; i++)
1131
            for (i = 0; i < VisualChildrenCount; i++)
Line 856... Line 1139...
856
                    if (i == VisualChildrenCount - 1 &&
1139
                    if (i == VisualChildrenCount - 1 &&
857
                        i > 0)
1140
                        i > 0)
858
                    {
1141
                    {
859
                        //remove the last splitter added
1142
                        //remove the last splitter added
860
                        if (visibleChildren.Count > 0 &&
1143
                        if (visibleChildren.Count > 0 &&
861
                            visibleChildren.Last<FrameworkElement>() is ResizingPanelSplitter)
1144
                            visibleChildren.Last<FrameworkElement>() is Resizer)
862
                            visibleChildren.RemoveAt(visibleChildren.Count - 1);
1145
                            visibleChildren.RemoveAt(visibleChildren.Count - 1);
863
                    }
1146
                    }
864
                    else if (i < VisualChildrenCount - 1)
1147
                    else if (i < VisualChildrenCount - 1)
865
                    {
1148
                    {
866
                        //discard the next splitter
1149
                        //discard the next splitter
Line 874... Line 1157...
874
            }
1157
            }
875
 
1158
 
876
            if (visibleChildren.Count == 0)
1159
            if (visibleChildren.Count == 0)
877
                return;
1160
                return;
878
 
1161
 
879
            if (visibleChildren.Last<FrameworkElement>() is ResizingPanelSplitter)
1162
            if (visibleChildren.Last<FrameworkElement>() is Resizer)
880
                visibleChildren.RemoveAt(visibleChildren.Count - 1);
1163
                visibleChildren.RemoveAt(visibleChildren.Count - 1);
881
 
1164
 
882
            Size[] currentSizes = new Size[visibleChildren.Count];
1165
            Size[] currentSizes = new Size[visibleChildren.Count];
883
            double delta = Orientation == Orientation.Horizontal ? e.HorizontalChange : e.VerticalChange;
1166
            double delta = Orientation == Orientation.Horizontal ? e.HorizontalChange : e.VerticalChange;
884
 
1167
 
Line 893... Line 1176...
893
 
1176
 
894
            List<FrameworkElement> prevChildren = new List<FrameworkElement>();
1177
            List<FrameworkElement> prevChildren = new List<FrameworkElement>();
895
            for (i = iSplitter - 1; i >= 0; i--)
1178
            for (i = iSplitter - 1; i >= 0; i--)
896
            {
1179
            {
897
                FrameworkElement child = visibleChildren[i] as FrameworkElement;
1180
                FrameworkElement child = visibleChildren[i] as FrameworkElement;
898
                if (child is ResizingPanelSplitter)
1181
                if (child is Resizer)
899
                    continue;
1182
                    continue;
900
                if (child.IsAbsolute() || child.IsAuto())
1183
                if (child.IsAbsolute() || child.IsAuto())
901
                {
1184
                {
902
                    if (prevChildren.Count == 0)
1185
                    if (prevChildren.Count == 0)
903
                    {
1186
                    {
Line 914... Line 1197...
914
            List<FrameworkElement> nextChildren = new List<FrameworkElement>();
1197
            List<FrameworkElement> nextChildren = new List<FrameworkElement>();
915
 
1198
 
916
            for (i = iSplitter + 1; i < visibleChildren.Count; i++)
1199
            for (i = iSplitter + 1; i < visibleChildren.Count; i++)
917
            {
1200
            {
918
                FrameworkElement child = visibleChildren[i] as FrameworkElement;
1201
                FrameworkElement child = visibleChildren[i] as FrameworkElement;
919
                if (child is ResizingPanelSplitter)
1202
                if (child is Resizer)
920
                    continue;
1203
                    continue;
921
                if (child.IsAbsolute() || child.IsAuto())
1204
                if (child.IsAbsolute() || child.IsAuto())
922
                {
1205
                {
923
                    if (nextChildren.Count == 0)
1206
                    if (nextChildren.Count == 0)
924
                        nextChildren.Add(child);
1207
                        nextChildren.Add(child);
Line 950... Line 1233...
950
            {
1233
            {
951
                int prevChildrenCountWithNoMinLen =
1234
                int prevChildrenCountWithNoMinLen =
952
                    prevChildren.Count<FrameworkElement>(c => delta > 0 ? true : (Orientation == Orientation.Horizontal ? currentSizes[visibleChildren.IndexOf(c)].Width > c.MinWidth : currentSizes[visibleChildren.IndexOf(c)].Height > c.MinHeight));
1235
                    prevChildren.Count<FrameworkElement>(c => delta > 0 ? true : (Orientation == Orientation.Horizontal ? currentSizes[visibleChildren.IndexOf(c)].Width > c.MinWidth : currentSizes[visibleChildren.IndexOf(c)].Height > c.MinHeight));
953
                int nextChildrenCountWithNoMinLen =
1236
                int nextChildrenCountWithNoMinLen =
954
                    nextChildren.Count<FrameworkElement>(c => delta < 0 ? true : (Orientation == Orientation.Horizontal ? currentSizes[visibleChildren.IndexOf(c)].Width > c.MinWidth : currentSizes[visibleChildren.IndexOf(c)].Height > c.MinHeight));
1237
                    nextChildren.Count<FrameworkElement>(c => delta < 0 ? true : (Orientation == Orientation.Horizontal ? currentSizes[visibleChildren.IndexOf(c)].Width > c.MinWidth : currentSizes[visibleChildren.IndexOf(c)].Height > c.MinHeight));
955
               
1238
 
956
                delta = remDelta / 2.0;
1239
                delta = remDelta / 2.0;
957
 
1240
 
958
                for (i = 0; i < currentSizes.Length; i++)
1241
                for (i = 0; i < currentSizes.Length; i++)
959
                {
1242
                {
960
                    FrameworkElement child = visibleChildren[i] as FrameworkElement;
1243
                    FrameworkElement child = visibleChildren[i] as FrameworkElement;
961
                    if (child is ResizingPanelSplitter)
1244
                    if (child is Resizer)
962
                        continue;
1245
                        continue;
963
 
1246
 
964
                    if (Orientation == Orientation.Horizontal)
1247
                    if (Orientation == Orientation.Horizontal)
965
                    {
1248
                    {
966
                        if (prevChildren.Contains(child) && prevChildrenCountWithNoMinLen > 0)
1249
                        if (prevChildren.Contains(child) && prevChildrenCountWithNoMinLen > 0)
967
                        {
1250
                        {
968
                            double s = delta / prevChildrenCountWithNoMinLen;
1251
                            double s = delta / prevChildrenCountWithNoMinLen;
969
                            if (currentSizes[i].Width + s < child.MinWidth)
1252
                            if (currentSizes[i].Width + s < child.MinWidth)
970
                                s = child.MinWidth - currentSizes[i].Width;
1253
                                s = child.MinWidth - currentSizes[i].Width;
971
                           
1254
 
972
                            currentSizes[i].Width += s;
1255
                            currentSizes[i].Width += s;
973
                            remDelta -= s;
1256
                            remDelta -= s;
974
                        }
1257
                        }
975
                        if (nextChildren.Contains(child) && nextChildrenCountWithNoMinLen > 0)
1258
                        if (nextChildren.Contains(child) && nextChildrenCountWithNoMinLen > 0)
976
                        {
1259
                        {
Line 1010... Line 1293...
1010
 
1293
 
1011
            double totalStartsSum = 0.0;
1294
            double totalStartsSum = 0.0;
1012
            double totalSizeForStarts = 0.0;
1295
            double totalSizeForStarts = 0.0;
1013
 
1296
 
1014
            for (i = 0; i < visibleChildren.Count; i++)
1297
            for (i = 0; i < visibleChildren.Count; i++)
1015
            {
1298
            {
1016
                FrameworkElement child = visibleChildren[i] as FrameworkElement;
1299
                FrameworkElement child = visibleChildren[i] as FrameworkElement;
1017
                if (child is ResizingPanelSplitter)
1300
                if (child is Resizer)
1018
                    continue;
1301
                    continue;
1019
                if (child.IsStar())
1302
                if (child.IsStar())
1020
                {
1303
                {
1021
                    totalStartsSum += child.GetStarValue();
1304
                    totalStartsSum += child.GetStarValue();
1022
                    totalSizeForStarts += Orientation == Orientation.Horizontal ? currentSizes[i].Width : currentSizes[i].Height;
1305
                    totalSizeForStarts += Orientation == Orientation.Horizontal ? currentSizes[i].Width : currentSizes[i].Height;
1023
                }
1306
                }
1024
            }
1307
            }
1025
               
-
 
1026
 
1308
 
1027
            double starsScaleFactor = totalStartsSum / totalSizeForStarts;
1309
            double starsScaleFactor = totalStartsSum / totalSizeForStarts;
1028
 
1310
 
1029
            for (i = 0; i < currentSizes.Length; i++)
1311
            for (i = 0; i < currentSizes.Length; i++)
1030
            {
1312
            {
1031
                FrameworkElement child = visibleChildren[i] as FrameworkElement;
1313
                FrameworkElement child = visibleChildren[i] as FrameworkElement;
1032
 
1314
 
1033
                if (child is ResizingPanelSplitter)
1315
                if (child is Resizer)
1034
                    continue;
1316
                    continue;
1035
 
1317
 
1036
                if (child.IsStar())
1318
                if (child.IsStar())
1037
                {
1319
                {
1038
                    if (Orientation == Orientation.Horizontal)
1320
                    if (Orientation == Orientation.Horizontal)
Line 1054... Line 1336...
1054
                            new GridLength(currentSizes[i].Width, GridUnitType.Pixel));
1336
                            new GridLength(currentSizes[i].Width, GridUnitType.Pixel));
1055
                    }
1337
                    }
1056
                    else
1338
                    else
1057
                    {
1339
                    {
1058
                        SetResizeHeight(child,
1340
                        SetResizeHeight(child,
1059
                            new GridLength(currentSizes[i].Height, GridUnitType.Pixel));
1341
                            new GridLength(currentSizes[i].Height, GridUnitType.Pixel));
1060
                    }
1342
                    }
1061
                }
1343
                }
1062
            }
1344
            }
1063
 
1345
 
1064
            InvalidateMeasure();
1346
            InvalidateMeasure();
1065
           
1347
        }
1066
            //ResizingPanelSplitter splitter = e.Source as ResizingPanelSplitter;
-
 
1067
            //int iSplitter = Children.IndexOf(splitter);
-
 
1068
 
1348
 
1069
            //UIElement childPrev = null;
1349
        Border _resizerGhost = null;
1070
            //UIElement childNext = null;
1350
        Window _resizerWindowHost = null;
-
 
1351
        Vector _initialStartPoint;
1071
 
1352
 
1072
            ////int posInc = ResizingDirection == ResizingDirection.Direct ? 2 : -2;
1353
        void ShowResizerOverlayWindow(Resizer splitter)
1073
            //int posInc = 2;// FlowDirection == FlowDirection.LeftToRight ? 2 : -2;
-
 
1074
            //int negInc = -posInc;
1354
        {
1075
            //int i = iSplitter;
1355
            Point ptTopLeftScreen = this.PointToScreen(new Point());
1076
 
1356
 
1077
            //while (i >= 0 ||
-
 
1078
            //    i < Children.Count - 1)
1357
            _resizerGhost = new Border()
1079
            //{
1358
            {
1080
            //    if (NextChildIsVisible(i))
1359
                Background = Brushes.Black,
1081
            //    {
-
 
1082
            //        //childNext = Children[ResizingDirection == ResizingDirection.Direct ? i + 1 : i - 1];
-
 
1083
            //        childNext = Children[i + 1];//FlowDirection == FlowDirection.LeftToRight ? i + 1 : i - 1];
-
 
1084
            //        break;
1360
                Opacity = 0.7
1085
            //    }
1361
            };
1086
 
1362
 
-
 
1363
            if (Orientation == System.Windows.Controls.Orientation.Horizontal)
-
 
1364
            {
1087
            //    i += posInc;
1365
                _resizerGhost.Width = 5.0;
-
 
1366
                _resizerGhost.Height = ActualHeight;
-
 
1367
            }
-
 
1368
            else
-
 
1369
            {
-
 
1370
                _resizerGhost.Height = 5.0;
-
 
1371
                _resizerGhost.Width = ActualWidth;
1088
            //}
1372
            }
1089
 
1373
 
1090
            //i = iSplitter;
1374
            _initialStartPoint = splitter.PointToScreen(new Point()) - this.PointToScreen(new Point());
1091
 
1375
 
-
 
1376
            if (Orientation == System.Windows.Controls.Orientation.Horizontal)
1092
            //while (i >= 0 ||
1377
            {
1093
            //        i < Children.Count - 1)
1378
                Canvas.SetLeft(_resizerGhost, _initialStartPoint.X);
1094
            //{
1379
            }
1095
            //    if (PrevChildIsVisible(i))
1380
            else
1096
            //    {
1381
            {
1097
            //        //childPrev = Children[ResizingDirection == ResizingDirection.Direct ? i - 1 : i + 1];
1382
                Canvas.SetTop(_resizerGhost, _initialStartPoint.Y);
1098
            //        childPrev = Children[i - 1];//FlowDirection == FlowDirection.LeftToRight ? i - 1 : i + 1]; 
-
 
1099
            //        break;
-
 
1100
            //    }
1383
            }
1101
 
1384
 
-
 
1385
            Canvas panelHostResizer = new Canvas()
1102
            //    i -= posInc;
1386
            {
-
 
1387
                HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch,
-
 
1388
                VerticalAlignment = System.Windows.VerticalAlignment.Stretch
1103
            //}
1389
            };
1104
 
1390
 
1105
            //Size resExtPrev = new Size((double)childPrev.GetValue(ResizeWidthProperty), (double)childPrev.GetValue(ResizeHeightProperty));
1391
            panelHostResizer.Children.Add(_resizerGhost);
1106
            //Size resExtNext = new Size((double)childNext.GetValue(ResizeWidthProperty), (double)childNext.GetValue(ResizeHeightProperty));
-
 
1107
 
1392
 
-
 
1393
            _resizerWindowHost = new Window()
-
 
1394
            {
-
 
1395
                ResizeMode = ResizeMode.NoResize,
-
 
1396
                WindowStyle = System.Windows.WindowStyle.None,
-
 
1397
                ShowInTaskbar = false,
-
 
1398
                AllowsTransparency = true,
-
 
1399
                Background = null,
-
 
1400
                Width = ActualWidth,
-
 
1401
                Height = ActualHeight,
-
 
1402
                Left = ptTopLeftScreen.X,
-
 
1403
                Top = ptTopLeftScreen.Y,
-
 
1404
                ShowActivated = false,
-
 
1405
                Owner = Window.GetWindow(this),
-
 
1406
                Content = panelHostResizer
-
 
1407
            };
1108
 
1408
 
1109
            //#region Orientation == Horizontal
-
 
1110
            //if (Orientation == Orientation.Horizontal)
-
 
1111
            //{
-
 
1112
            //    double delta = e.HorizontalChange;
-
 
1113
 
-
 
1114
            //    if (!double.IsPositiveInfinity(resExtPrev.Width) &&
-
 
1115
            //        (resExtPrev.Width + delta < 0))
-
 
1116
            //        delta = -resExtPrev.Width;
-
 
1117
 
-
 
1118
            //    if (!double.IsPositiveInfinity(resExtNext.Width) &&
-
 
1119
            //        resExtNext.Width - delta < 0)
-
 
1120
            //        delta = resExtNext.Width;
-
 
1121
 
-
 
1122
 
-
 
1123
            //    if (!double.IsPositiveInfinity(resExtPrev.Width))
-
 
1124
            //        childPrev.SetValue(ResizeWidthProperty, resExtPrev.Width + delta);
-
 
1125
            //    if (!double.IsPositiveInfinity(resExtNext.Width))
-
 
1126
            //        childNext.SetValue(ResizeWidthProperty, resExtNext.Width - delta);
-
 
1127
            //}
-
 
1128
            //#endregion
-
 
1129
            //#region Orientation == Vertical
1409
            _resizerWindowHost.Show();
1130
            //else //if (Orientation == Orientation.Vertical)
-
 
1131
            //{
-
 
1132
            //    double delta = e.VerticalChange;
-
 
1133
 
-
 
1134
            //    if (!double.IsPositiveInfinity(resExtPrev.Height) &&
-
 
1135
            //        (resExtPrev.Height + delta < 0))
-
 
1136
            //        delta = -resExtPrev.Height;
-
 
1137
 
-
 
1138
            //    if (!double.IsPositiveInfinity(resExtNext.Height) &&
-
 
1139
            //        resExtNext.Height - delta < 0)
-
 
1140
            //        delta = resExtNext.Height;
-
 
1141
 
-
 
1142
 
-
 
1143
            //    if (!double.IsPositiveInfinity(resExtPrev.Height))
-
 
1144
            //        childPrev.SetValue(ResizeHeightProperty, resExtPrev.Height + delta);
-
 
1145
 
-
 
1146
            //    if (!double.IsPositiveInfinity(resExtNext.Height))
-
 
1147
            //        childNext.SetValue(ResizeHeightProperty, resExtNext.Height - delta);
-
 
1148
            //}
-
 
1149
            //#endregion
-
 
1150
 
-
 
1151
        }
1410
        }
1152
 
1411
 
1153
        void splitter_DragStarted(object sender, DragStartedEventArgs e)
1412
        void HideResizerOverlayWindow()
1154
        {
1413
        {
-
 
1414
            if (_resizerWindowHost != null)
-
 
1415
            {
1155
            Cursor = Orientation == Orientation.Horizontal ? Cursors.SizeWE : Cursors.SizeNS;
1416
                _resizerWindowHost.Close();
-
 
1417
                _resizerWindowHost = null;
-
 
1418
            }
1156
        }
1419
        }
1157
 
1420
 
1158
        #region IDockableControl Membri di
1421
        #region IDockableControl Membri di
1159
 
1422
 
1160
        public bool IsDocked
1423
        public bool IsDocked
Line 1251... Line 1514...
1251
 
1514
 
1252
            Children.Insert(
1515
            Children.Insert(
1253
                next ? childRelativeIndex + 1 : childRelativeIndex, childToInsert);
1516
                next ? childRelativeIndex + 1 : childRelativeIndex, childToInsert);
1254
 
1517
 
1255
            SetupSplitters();
1518
            SetupSplitters();
-
 
1519
 
-
 
1520
            InvalidateMeasure();
1256
        }
1521
        }
-
 
1522
 
-
 
1523
       
1257
 
1524
 
1258
 
1525
 
1259
    }
1526
    }
1260
 
1527
 
1261
 
1528