#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

133 lines
3.3 KiB

// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
using System.Reflection;
using System.Resources;
using System.Windows;
using System.Windows.Input;
using ICSharpCode.SharpDevelop.Widgets;
namespace ICSharpCode.WpfDesign.Designer.Controls
{
public class ZoomControl : ZoomScrollViewer
{
static ZoomControl()
{
PanToolCursor = GetCursor("Images/PanToolCursor.cur");
PanToolCursorMouseDown = GetCursor("Images/PanToolCursorMouseDown.cur");
DefaultStyleKeyProperty.OverrideMetadata(typeof(ZoomControl), new FrameworkPropertyMetadata(typeof(ZoomControl)));
}
public object AdditionalControls
{
get { return (object)GetValue(AdditionalControlsProperty); }
set { SetValue(AdditionalControlsProperty, value); }
}
public static readonly DependencyProperty AdditionalControlsProperty =
DependencyProperty.Register("AdditionalControls", typeof(object), typeof(ZoomControl), new PropertyMetadata(null));
internal static Cursor GetCursor(string path)
{
var a = Assembly.GetExecutingAssembly();
var m = new ResourceManager(a.GetName().Name + ".g", a);
using (Stream s = m.GetStream(path.ToLowerInvariant())) {
return new Cursor(s);
}
}
static Cursor PanToolCursor;
static Cursor PanToolCursorMouseDown;
double startHorizontalOffset;
double startVericalOffset;
Point startPoint;
bool isMouseDown;
bool pan;
protected override void OnKeyDown(KeyEventArgs e)
{
if (!pan && e.Key == Key.Space) {
pan = true;
Mouse.UpdateCursor();
}
base.OnKeyDown(e);
}
protected override void OnKeyUp(KeyEventArgs e)
{
if (e.Key == Key.Space) {
pan = false;
Mouse.UpdateCursor();
}
base.OnKeyUp(e);
}
protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
{
if (pan && !e.Handled) {
if (Mouse.Capture(this)) {
isMouseDown = true;
e.Handled = true;
startPoint = e.GetPosition(this);
PanStart();
Mouse.UpdateCursor();
}
}
base.OnPreviewMouseDown(e);
}
protected override void OnPreviewMouseMove(MouseEventArgs e)
{
if (isMouseDown) {
var endPoint = e.GetPosition(this);
PanContinue(endPoint - startPoint);
}
base.OnPreviewMouseMove(e);
}
protected override void OnPreviewMouseUp(MouseButtonEventArgs e)
{
if (isMouseDown) {
isMouseDown = false;
ReleaseMouseCapture();
Mouse.UpdateCursor();
}
base.OnPreviewMouseUp(e);
}
protected override void OnLostMouseCapture(MouseEventArgs e)
{
if (isMouseDown) {
isMouseDown = false;
ReleaseMouseCapture();
Mouse.UpdateCursor();
}
base.OnLostMouseCapture(e);
}
protected override void OnQueryCursor(QueryCursorEventArgs e)
{
base.OnQueryCursor(e);
if (!e.Handled && (pan || isMouseDown)) {
e.Handled = true;
e.Cursor = isMouseDown ? PanToolCursorMouseDown : PanToolCursor;
}
}
void PanStart()
{
startHorizontalOffset = this.HorizontalOffset;
startVericalOffset = this.VerticalOffset;
}
void PanContinue(Vector delta)
{
this.ScrollToHorizontalOffset(startHorizontalOffset - delta.X / this.CurrentZoom);
this.ScrollToVerticalOffset(startVericalOffset - delta.Y / this.CurrentZoom);
}
}
}