public TeXCommentAdornment( IWpfTextView textView, TeXCommentTag tag, LineSpan lineSpan, double lastLineWidthWithoutStartWhiteSpaces, TeXCommentAdornmentState initialState, Action <Span> refreshTags, Action <bool> setIsInEditModeForAllAdornmentsInDocument, Action <TeXCommentTag, string> addAttribute, IRenderingManager renderingManager, IVsSettings vsSettings) { ExtensionSettings.Instance.CustomZoomChanged += CustomZoomChanged; textView.Caret.PositionChanged += Caret_PositionChanged; this.DataTag = tag; this.refreshTags = refreshTags; this.setIsInEditModeForAllAdornmentsInDocument = setIsInEditModeForAllAdornmentsInDocument; this.addAttribute = addAttribute; this.textView = textView; this.lastLineWidthWithoutStartWhiteSpaces = lastLineWidthWithoutStartWhiteSpaces; this.renderingManager = renderingManager; VsSettings = vsSettings; ResourcesManager = ResourcesManager.GetOrCreate(textView); LineSpan = lineSpan; InitializeComponent(); previewAdorner = new PreviewAdorner(this, ResourcesManager, vsSettings); Loaded += (s, e) => { if (previewAdorner.Parent == null) { previewAdorner.OffsetX = -this.lastLineWidthWithoutStartWhiteSpaces; //'this' is important because of lambda closure System.Windows.Documents.AdornerLayer.GetAdornerLayer(this).Add(previewAdorner); } }; //for correctly working binding NameScope.SetNameScope(btnShow.ContextMenu, NameScope.GetNameScope(this)); NameScope.SetNameScope(btnEdit.ContextMenu, NameScope.GetNameScope(this)); NameScope.SetNameScope((ToolTip)imgError.ToolTip, NameScope.GetNameScope(this)); CurrentState = initialState; }
public PreviewAdorner(UIElement adornedElement, IResourcesManager resourcesManager, IVsSettings vsSettings) : base(adornedElement) { //content var panel = new StackPanel() { Orientation = Orientation.Vertical, Margin = new Thickness(6, 6, 8, 8), UseLayoutRounding = true, SnapsToDevicePixels = true }; var image = new Image() { SnapsToDevicePixels = true, UseLayoutRounding = true }; RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.NearestNeighbor); image.SetBinding(Image.SourceProperty, new Binding(nameof(TeXCommentAdornment.RenderedImage)) { Source = adornedElement }); image.SetBinding(Image.WidthProperty, new Binding(nameof(TeXCommentAdornment.RenderedImageWidth)) { Source = adornedElement }); image.SetBinding(Image.HeightProperty, new Binding(nameof(TeXCommentAdornment.RenderedImageHeight)) { Source = adornedElement }); //var style = new Style(typeof(Image)); //var grayscaleTrigger = new DataTrigger() //{ // Binding = new Binding(nameof(TeXCommentAdornment.CurrentState)) { Source = adornedElement }, // Value = TeXCommentAdornmentState.EditingAndRenderingPreview //}; //grayscaleTrigger.Setters.Add(new Setter(Image.EffectProperty, graycaleEffect)); //style.Triggers.Add(grayscaleTrigger); //image.Style = style; var textBlock = new TextBlock() { Text = "Preview:", Margin = new Thickness(0, 0, 0, 2) }; textBlock.SetBinding(TextBlock.ForegroundProperty, new Binding(nameof(IResourcesManager.ForegroundUI)) { Source = resourcesManager }); panel.Children.Add(textBlock); panel.Children.Add(image); var border = new Border() { BorderThickness = new Thickness(1), Child = panel }; border.SetBinding(Border.BorderBrushProperty, new Binding(nameof(IResourcesManager.ForegroundUI)) { Source = resourcesManager }); border.SetBinding(Border.BackgroundProperty, new Binding(nameof(IVsSettings.CommentsBackground)) { Source = vsSettings }); Child = border; //visibility setup var style = new Style(typeof(PreviewAdorner)); style.Setters.Add(new Setter(VisibilityProperty, Visibility.Collapsed)); var visibilityTrigger = new MultiDataTrigger(); visibilityTrigger.Conditions.Add(new Condition(new Binding(nameof(TeXCommentAdornment.CurrentState)) { Source = adornedElement }, TeXCommentAdornmentState.EditingWithPreview)); visibilityTrigger.Conditions.Add(new Condition(new Binding(nameof(TeXCommentAdornment.IsCaretInsideTeXBlock)) { Source = adornedElement }, true)); visibilityTrigger.Setters.Add(new Setter(VisibilityProperty, Visibility.Visible)); style.Triggers.Add(visibilityTrigger); visibilityTrigger = new MultiDataTrigger(); visibilityTrigger.Conditions.Add(new Condition(new Binding(nameof(TeXCommentAdornment.CurrentState)) { Source = adornedElement }, TeXCommentAdornmentState.EditingAndRenderingPreview)); visibilityTrigger.Conditions.Add(new Condition(new Binding(nameof(TeXCommentAdornment.IsCaretInsideTeXBlock)) { Source = adornedElement }, true)); visibilityTrigger.Setters.Add(new Setter(VisibilityProperty, Visibility.Visible)); style.Triggers.Add(visibilityTrigger); Style = style; }