// // // // // $Revision$ // using System; using System.Windows.Input; namespace ICSharpCode.WpfDesign.Designer.Services { // See IToolService for description. sealed class DefaultToolService : IToolService { PointerTool _pointerTool; ITool _currentTool; IDesignPanel _designPanel; public DefaultToolService(DesignContext context) { _currentTool = _pointerTool = new PointerTool(); context.Services.RunWhenAvailable( delegate(IDesignPanel designPanel) { _designPanel = designPanel; _currentTool.Activate(designPanel); }); } public ITool PointerTool { get { return _pointerTool; } } public ITool CurrentTool { get { return _currentTool; } set { if (value == null) throw new ArgumentNullException("value"); if (_currentTool == value) return; _currentTool.Deactivate(_designPanel); _currentTool = value; _currentTool.Activate(_designPanel); } } } sealed class PointerTool : ITool { public Cursor Cursor { get { return null; } } public void Activate(IDesignPanel designPanel) { designPanel.MouseDown += OnMouseDown; } public void Deactivate(IDesignPanel designPanel) { designPanel.MouseDown -= OnMouseDown; } void OnMouseDown(object sender, MouseButtonEventArgs e) { if (e.ChangedButton == MouseButton.Left && MouseGestureBase.IsOnlyButtonPressed(e, MouseButton.Left)) { e.Handled = true; new SelectionGesture().Start((IDesignPanel)sender, e); } } } abstract class MouseGestureBase { /// /// Checks if is the only button that is currently pressed. /// internal static bool IsOnlyButtonPressed(MouseEventArgs e, MouseButton button) { return e.LeftButton == (button == MouseButton.Left ? MouseButtonState.Pressed : MouseButtonState.Released) && e.MiddleButton == (button == MouseButton.Middle ? MouseButtonState.Pressed : MouseButtonState.Released) && e.RightButton == (button == MouseButton.Right ? MouseButtonState.Pressed : MouseButtonState.Released) && e.XButton1 == (button == MouseButton.XButton1 ? MouseButtonState.Pressed : MouseButtonState.Released) && e.XButton2 == (button == MouseButton.XButton2 ? MouseButtonState.Pressed : MouseButtonState.Released); } protected IDesignPanel designPanel; protected ServiceContainer services; bool isStarted; public void Start(IDesignPanel designPanel, MouseButtonEventArgs e) { this.designPanel = designPanel; this.services = designPanel.Context.Services; isStarted = true; designPanel.IsAdornerLayerHitTestVisible = false; RegisterEvents(); if (designPanel.CaptureMouse()) { OnStarted(e); } else { Stop(); } } void RegisterEvents() { designPanel.LostMouseCapture += OnLostMouseCapture; designPanel.MouseDown += OnMouseDown; designPanel.MouseMove += OnMouseMove; designPanel.MouseUp += OnMouseUp; } void UnRegisterEvents() { designPanel.LostMouseCapture -= OnLostMouseCapture; designPanel.MouseDown -= OnMouseDown; designPanel.MouseMove -= OnMouseMove; designPanel.MouseUp -= OnMouseUp; } protected virtual void OnLostMouseCapture(object sender, MouseEventArgs e) { Stop(); } protected virtual void OnMouseDown(object sender, MouseButtonEventArgs e) { } protected virtual void OnMouseMove(object sender, MouseEventArgs e) { } protected virtual void OnMouseUp(object sender, MouseButtonEventArgs e) { Stop(); } protected void Stop() { if (!isStarted) return; isStarted = false; designPanel.ReleaseMouseCapture(); UnRegisterEvents(); designPanel.IsAdornerLayerHitTestVisible = true; OnStopped(); } protected virtual void OnStarted(MouseButtonEventArgs e) {} protected virtual void OnStopped() {} } sealed class SelectionGesture : MouseGestureBase { protected override void OnStarted(MouseButtonEventArgs e) { base.OnStarted(e); DesignPanelHitTestResult result = designPanel.HitTest(e, false, true); if (result.ModelHit != null) { services.Selection.SetSelectedComponents(new DesignItem[] { result.ModelHit }, SelectionTypes.Auto); } } protected override void OnStopped() { //designPanel.cur base.OnStopped(); } } }