Tiny programs (C, C++, C#, ...)
File detail
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();
}
}
}