first commit
This commit is contained in:
99
ICSharpCode.TextEditor/Project/Src/Util/TipSplitter.cs
Normal file
99
ICSharpCode.TextEditor/Project/Src/Util/TipSplitter.cs
Normal file
@@ -0,0 +1,99 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="none" email=""/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
|
||||
namespace ICSharpCode.TextEditor.Util
|
||||
{
|
||||
class TipSplitter: TipSection
|
||||
{
|
||||
bool isHorizontal;
|
||||
float [] offsets;
|
||||
TipSection[] tipSections;
|
||||
|
||||
public TipSplitter(Graphics graphics, bool horizontal, params TipSection[] sections): base(graphics)
|
||||
{
|
||||
Debug.Assert(sections != null);
|
||||
|
||||
isHorizontal = horizontal;
|
||||
offsets = new float[sections.Length];
|
||||
tipSections = (TipSection[])sections.Clone();
|
||||
}
|
||||
|
||||
public override void Draw(PointF location)
|
||||
{
|
||||
if (isHorizontal) {
|
||||
for (int i = 0; i < tipSections.Length; i ++) {
|
||||
tipSections[i].Draw
|
||||
(new PointF(location.X + offsets[i], location.Y));
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < tipSections.Length; i ++) {
|
||||
tipSections[i].Draw
|
||||
(new PointF(location.X, location.Y + offsets[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnMaximumSizeChanged()
|
||||
{
|
||||
base.OnMaximumSizeChanged();
|
||||
|
||||
float currentDim = 0;
|
||||
float otherDim = 0;
|
||||
SizeF availableArea = MaximumSize;
|
||||
|
||||
for (int i = 0; i < tipSections.Length; i ++) {
|
||||
TipSection section = (TipSection)tipSections[i];
|
||||
|
||||
section.SetMaximumSize(availableArea);
|
||||
|
||||
SizeF requiredArea = section.GetRequiredSize();
|
||||
offsets[i] = currentDim;
|
||||
|
||||
// It's best to start on pixel borders, so this will
|
||||
// round up to the nearest pixel. Otherwise there are
|
||||
// weird cutoff artifacts.
|
||||
float pixelsUsed;
|
||||
|
||||
if (isHorizontal) {
|
||||
pixelsUsed = (float)Math.Ceiling(requiredArea.Width);
|
||||
currentDim += pixelsUsed;
|
||||
|
||||
availableArea.Width = Math.Max
|
||||
(0, availableArea.Width - pixelsUsed);
|
||||
|
||||
otherDim = Math.Max(otherDim, requiredArea.Height);
|
||||
} else {
|
||||
pixelsUsed = (float)Math.Ceiling(requiredArea.Height);
|
||||
currentDim += pixelsUsed;
|
||||
|
||||
availableArea.Height = Math.Max
|
||||
(0, availableArea.Height - pixelsUsed);
|
||||
|
||||
otherDim = Math.Max(otherDim, requiredArea.Width);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (TipSection section in tipSections) {
|
||||
if (isHorizontal) {
|
||||
section.SetAllocatedSize(new SizeF(section.GetRequiredSize().Width, otherDim));
|
||||
} else {
|
||||
section.SetAllocatedSize(new SizeF(otherDim, section.GetRequiredSize().Height));
|
||||
}
|
||||
}
|
||||
|
||||
if (isHorizontal) {
|
||||
SetRequiredSize(new SizeF(currentDim, otherDim));
|
||||
} else {
|
||||
SetRequiredSize(new SizeF(otherDim, currentDim));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user