Česky
Kamil Dudka

Tiny programs (C, C++, C#, ...)

File detail

Name:DownloadAnimatedSplitContainer.cs [Download]
Location: tiny > MW5 > proj2 > proj2 > UserControls
Size:3.6 KB
Last modification:2007-08-29 17:43

Source code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
 
namespace proj2.UserControls
{
    public partial class AnimatedSplitContainer : SplitContainer
    {
        public event EventHandler Panel1CollapseChanged;
        public event EventHandler AnimatedChanged;
        private bool bAnimated = true;
        private Timer animationTimer = new Timer();
        private int nSteps = 15;
        private bool bHiding;
        private int posSaved;
        private int posStep;
        private int minSizeSaved;
        public AnimatedSplitContainer()
        {
            animationTimer.Interval = 50;
            animationTimer.Tick += new EventHandler(animationStep);
            bHiding = base.Panel1Collapsed;
            posSaved = base.SplitterDistance;
            posStep = posSaved / nSteps;
        }
 
        [DefaultValue(true)]
        public bool Animated
        {
            get { return bAnimated; }
            set {
                bool tmp = bAnimated;
                bAnimated = value;
                if (
                        AnimatedChanged != null &&
                        tmp != bAnimated)
                    AnimatedChanged(this, EventArgs.Empty);
            }
        }
 
        [DefaultValue(15)]
        public int StepCount
        {
            get { return nSteps; }
            set { nSteps = value; }
        }
 
        [DefaultValue(50)]
        public int Interval
        {
            get { return animationTimer.Interval; }
            set { animationTimer.Interval = value; }
        }
 
        public new bool Panel1Collapsed
        {
            get { return bHiding; }
            set
            {
                if (value == base.Panel1Collapsed)
                    return;
                bHiding = value;
                animate();
                if (Panel1CollapseChanged != null)
                    Panel1CollapseChanged(this, EventArgs.Empty);
            }
        }
        private void animate()
        {
            posSaved = base.SplitterDistance;
            minSizeSaved = base.Panel1MinSize;
            if (bAnimated && base.Visible)
                animationStart();
            else
                animationComplete();
        }
        private void animationStart()
        {
            Panel1.SuspendLayout();
            Panel2.Controls[0].Hide();
            base.Panel1MinSize = 0;
            posStep = posSaved / nSteps;
            if (!bHiding)
                base.SplitterDistance = posStep;
            base.Panel1Collapsed = false;
            animationTimer.Start();
        }
        private void animationStep(Object sender, EventArgs e)
        {
            this.SuspendLayout();
            int tmp = base.SplitterDistance;
            if (base.SplitterDistance < posStep)
                animationComplete();
            else
            {
                if (bHiding)
                    base.SplitterDistance -= posStep;
                else
                    base.SplitterDistance += posStep;
 
                if (base.SplitterDistance == tmp || base.SplitterDistance > posSaved)
                    animationComplete();
            }
            this.ResumeLayout();
        }
        private void animationComplete()
        {
            animationTimer.Stop();
            base.Panel1Collapsed = bHiding;
            base.SplitterDistance = posSaved;
            base.Panel1MinSize = minSizeSaved;
            Panel1.ResumeLayout();
            Panel2.Controls[0].Show();
        }
    }
}