1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
|
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.Workflow.ComponentModel.Design
{
using System;
using System.Collections.Generic;
using System.Text;
using System.Workflow.ComponentModel.Design;
using System.ComponentModel.Design;
using System.Drawing;
using System.ServiceModel;
// <summary>
// Helper class for visuaulizing the highlighted activity group
// </summary>
class ActivityDesignerHighlighter : IServiceProvider
{
private IDesignerGlyphProviderService glyphProviderService;
private HighlightGlyphProvider highlightProvider = null;
private ActivityDesigner owner;
private WorkflowView workflowView;
public ActivityDesignerHighlighter(ActivityDesigner owner)
{
this.owner = owner;
}
public object GetService(Type serviceType)
{
if (serviceType == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("serviceType");
}
if (owner.Activity != null && owner.Activity.Site != null)
{
return owner.Activity.Site.GetService(serviceType);
}
else
{
return null;
}
}
public void Highlight(List<ActivityDesigner> highlightedDesigners)
{
if (highlightedDesigners == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("hightlightedDesigners");
}
glyphProviderService = this.GetService(typeof(IDesignerGlyphProviderService)) as IDesignerGlyphProviderService;
workflowView = GetService(typeof(WorkflowView)) as WorkflowView;
RemoveCurrentHighlight();
IDesignerHost designerHost = this.GetService(typeof(IDesignerHost)) as IDesignerHost;
DesignerHighlighterMesageFilter messageFilter = new DesignerHighlighterMesageFilter();
highlightProvider = new HighlightGlyphProvider(designerHost.GetDesigner(designerHost.RootComponent) as ActivityDesigner, highlightedDesigners);
glyphProviderService.AddGlyphProvider(highlightProvider);
highlightProvider.MessageFilter = messageFilter;
messageFilter.MouseDown += new EventHandler<System.Windows.Forms.MouseEventArgs>(messageFilter_MouseDown);
messageFilter.KeyDown += new EventHandler<System.Windows.Forms.KeyEventArgs>(messageFilter_KeyDown);
workflowView.AddDesignerMessageFilter(messageFilter);
workflowView.FitToScreenSize();
}
public void RemoveCurrentHighlight()
{
HighlightGlyphProvider currentHightlightGlyhProvider = null;
foreach (IDesignerGlyphProvider glyphProvider in glyphProviderService.GlyphProviders)
{
if (glyphProvider is HighlightGlyphProvider)
{
currentHightlightGlyhProvider = (HighlightGlyphProvider) glyphProvider;
break;
}
}
if (currentHightlightGlyhProvider != null)
{
//remove associated designerMessageFilter before removing currentGlyphProvider.
workflowView.RemoveDesignerMessageFilter(currentHightlightGlyhProvider.MessageFilter);
glyphProviderService.RemoveGlyphProvider(currentHightlightGlyhProvider);
}
}
void messageFilter_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
glyphProviderService.RemoveGlyphProvider(highlightProvider);
if (workflowView != null)
{
workflowView.RemoveDesignerMessageFilter(sender as WorkflowDesignerMessageFilter);
Point scrollPosition = workflowView.ClientPointToLogical(owner.Location);
workflowView.FitToWorkflowSize();
// try to center the owner designer int the the workflowview
Size viewSize = workflowView.ClientSizeToLogical(workflowView.ViewPortSize);
if (scrollPosition.Y > viewSize.Height / 2)
{
scrollPosition.Y -= viewSize.Height / 2;
}
if (scrollPosition.X > viewSize.Width / 2)
{
scrollPosition.X -= viewSize.Width / 2;
}
workflowView.ScrollPosition = scrollPosition;
}
}
void messageFilter_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
glyphProviderService.RemoveGlyphProvider(highlightProvider);
if (workflowView != null)
{
workflowView.RemoveDesignerMessageFilter(sender as WorkflowDesignerMessageFilter);
Point scrollPosition = workflowView.ClientPointToLogical(e.Location);
workflowView.FitToWorkflowSize();
// try to center the clicked portion of the workflow in the workflowview
Size viewSize = workflowView.ClientSizeToLogical(workflowView.ViewPortSize);
if (scrollPosition.Y > viewSize.Height / 2)
{
scrollPosition.Y -= viewSize.Height / 2;
}
if (scrollPosition.X > viewSize.Width / 2)
{
scrollPosition.X -= viewSize.Width / 2;
}
workflowView.ScrollPosition = scrollPosition;
}
}
// this is the message filter inserted in the workflowview to escape back to the normal view
// from the highlighted view. since glyphs cant take mouse events, this is the only way to
// detect mouseclicks when in highlighted view.
internal sealed class DesignerHighlighterMesageFilter : WorkflowDesignerMessageFilter
{
public event EventHandler<System.Windows.Forms.KeyEventArgs> KeyDown;
public event EventHandler<System.Windows.Forms.MouseEventArgs> MouseDown;
protected override bool OnKeyDown(System.Windows.Forms.KeyEventArgs eventArgs)
{
if (KeyDown != null)
{
KeyDown(this, eventArgs);
}
// let event pass down to others. we dont want to mark it as handled
return false;
}
protected override bool OnMouseDown(System.Windows.Forms.MouseEventArgs eventArgs)
{
if (MouseDown != null)
{
MouseDown(this, eventArgs);
}
// let event pass down to others. we dont want to mark it as handled
return false;
}
}
internal sealed class HighlightGlyphProvider : IDesignerGlyphProvider
{
private List<ActivityDesigner> highlightedDesigners;
private DesignerHighlighterMesageFilter messageFilter;
private ActivityDesigner rootDesigner;
public HighlightGlyphProvider(ActivityDesigner rootDesigner, List<ActivityDesigner> highlightedDesigners)
{
this.RootDesigner = rootDesigner;
this.HighlightedDesigners = highlightedDesigners;
}
public List<ActivityDesigner> HighlightedDesigners
{
get { return highlightedDesigners; }
set { highlightedDesigners = value; }
}
public DesignerHighlighterMesageFilter MessageFilter
{
get { return messageFilter; }
set { messageFilter = value; }
}
public ActivityDesigner RootDesigner
{
get { return rootDesigner; }
set { rootDesigner = value; }
}
public ActivityDesignerGlyphCollection GetGlyphs(ActivityDesigner activityDesigner)
{
if (activityDesigner == null)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("activityDesigner");
}
if (!activityDesigner.IsRootDesigner)
{
return null;
}
ActivityDesignerGlyphCollection glyphs = new ActivityDesignerGlyphCollection();
glyphs.Add(new HighlightOverlayGlyph(activityDesigner.Bounds, HighlightedDesigners));
return glyphs;
}
}
}
}
|