openhardwaremonitor/GUI/SplitContainerAdv.cs

124 lines
3.4 KiB
C#

/*
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
Copyright (C) 2009-2010 Michael Möller <mmoeller@openhardwaremonitor.org>
*/
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace OpenHardwareMonitor.GUI {
public class SplitContainerAdv : SplitContainer {
private int delta = 0;
private Border3DStyle border3DStyle = Border3DStyle.Raised;
private Color color = SystemColors.Control;
public SplitContainerAdv()
: base() {
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.ContainerControl, true);
UpdateStyles();
}
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
Graphics g = e.Graphics;
Rectangle r = SplitterRectangle;
using (SolidBrush brush = new SolidBrush(color))
g.FillRectangle(brush, r);
ControlPaint.DrawBorder3D(g, r, border3DStyle);
}
protected override void OnKeyDown(KeyEventArgs e) {
if (!base.IsSplitterFixed) {
if (e.KeyData == Keys.Right || e.KeyData == Keys.Down) {
SplitterDistance += SplitterIncrement;
} else if (e.KeyData == Keys.Left || e.KeyData == Keys.Up) {
SplitterDistance -= SplitterIncrement;
}
Invalidate();
}
}
protected override void OnMouseDown(MouseEventArgs e) {
if (Orientation == Orientation.Vertical) {
delta = this.SplitterDistance - e.X;
Cursor.Current = Cursors.VSplit;
} else {
delta = this.SplitterDistance - e.Y;
Cursor.Current = Cursors.HSplit;
}
base.IsSplitterFixed = true;
}
protected override void OnMouseMove(MouseEventArgs e) {
if (base.IsSplitterFixed) {
if (e.Button == MouseButtons.Left) {
if (Orientation == Orientation.Vertical) {
if (e.X > 0 && e.X < Width) {
SplitterDistance = e.X + delta < 0 ? 0 : e.X + delta;
}
} else {
if (e.Y > 0 && e.Y < Height) {
SplitterDistance = e.Y + delta < 0 ? 0 : e.Y + delta;
}
}
} else {
base.IsSplitterFixed = false;
}
Invalidate();
} else {
if (SplitterRectangle.Contains(e.Location)) {
Cursor = Orientation == Orientation.Vertical ?
Cursors.VSplit : Cursors.HSplit;
}
}
}
protected override void OnMouseLeave(EventArgs e) {
base.OnMouseLeave(e);
Cursor = Cursors.Default;
}
protected override void OnMouseUp(MouseEventArgs e) {
delta = 0;
base.IsSplitterFixed = false;
Cursor.Current = Cursors.Default;
}
public Border3DStyle Border3DStyle {
get { return border3DStyle; }
set {
border3DStyle = value;
Invalidate(false);
}
}
public Color Color {
get { return color; }
set {
color = value;
Invalidate(false);
}
}
public new bool IsSplitterFixed {
get {
return false;
}
}
}
}