//#define UIELEMENT using System; using System.IO; using System.Windows; using System.Windows.Input; using System.Windows.Media; using System.Diagnostics; using System.Globalization; using System.Windows.Controls; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using agree; namespace agree.Wpf.Util { using Math = System.Math; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public class TfsVisualHost : #if UIELEMENT UIElement #else FrameworkElement #endif { public readonly TfsControl owner; public TdeConstraint viz; List<Visual> visuals = new List<Visual>(); public IDictionary<Edge,ReentrancyFinder.Entry> dict_corefs; public Tfs tfs_highlight; public TfsVisualHost(TfsControl owner, Tfs e) { visuals = new List<Visual>(); this.owner = owner; this.Focusable = true; this.IsHitTestVisible = true; this.Visibility = Visibility.Visible; this.tfs_highlight = owner._TfsEdgeHighlight; this.dict_corefs = e.Reentrancies; viz = new TdeConstraint(this, e.Edge); this.AddVisualTfs(viz); // viz.Render(); } public void AddVisualTfs(Visual tfs_viz) { #if UIELEMENT #else this.AddLogicalChild(tfs_viz); this.AddVisualChild(tfs_viz); #endif visuals.Insert(0, tfs_viz); } protected override Visual GetVisualChild(int index) { return visuals[index]; } protected override int VisualChildrenCount { get { return visuals.Count; } } public TdeConstraint FindVisualForEdge(Edge e) { return visuals.OfType<TdeConstraint>().First(v => v.Edge.Equals(e)); } IEnumerable<Visual> VisualChildren { get { for (int i=0; i < VisualChildrenCount; i++) yield return GetVisualChild(i); } } #if UIELEMENT /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// Size of this element is based on its single visual content /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// protected override Size MeasureCore(Size availableSize) { return viz.Rectangle.Size; } #else protected override Size MeasureOverride(Size availableSize) { //using (DrawingContext dc = viz.RenderOpen()) //return viz.Render(dc); return viz.m_size; // return viz.Rectangle.Size; } #endif protected void mbeh(Object o, MouseButtonEventArgs e) { Debug.WriteLine("mbeh {0} {1} {2} {3} {4}", o, e.RoutedEvent, e.Source, e.OriginalSource, e.GetPosition(this)); //base.OnMouseLeftButtonDown(e); } protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { Debug.WriteLine("TfsVisualHost.omlbd {0} {1} {2}", e.Source, e.OriginalSource, e.GetPosition(this)); //base.OnMouseLeftButtonDown(e); } protected override void OnMouseMove(MouseEventArgs e) { var htr = VisualTreeHelper.HitTest(this, e.GetPosition(this)); TdeConstraint tdec = htr.VisualHit as TdeConstraint; if (tdec != null) Debug.WriteLine("TfsVisualHost.omm {0}", htr.VisualHit); else Debug.WriteLine("TfsVisualHost.omm {0} {1}", tdec.Edge, htr.VisualHit); base.OnMouseMove(e); } #if false protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters) { Debug.WriteLine("TfsVisualHost.htc {0} IsEnabled:{1} IsVisible:{2} Visibility:{3} Focusable:{4} IsFocused:{5}", hitTestParameters.HitPoint, IsEnabled, IsVisible, Visibility, Focusable, IsFocused); return base.HitTestCore(hitTestParameters); } #endif }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// Provides a font and stuff for TfsHost /// This is not combined with the UIElement derived class because WPF seems to crash when I add my own /// Visual-derived objects to a Control-derived object, but it's ok with a (single) UIElement-derived /// object. /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public class TfsControl : Control { public bool f_brackets = true; public bool f_marks = true; public Tfs _TfsEdge { get { return (Tfs)GetValue(TfsEdgeProperty); } set { SetValue(TfsEdgeProperty, value); } } public Tfs _TfsEdgeHighlight { get { return (Tfs)GetValue(TfsEdgeHighlightProperty); } set { SetValue(TfsEdgeHighlightProperty, value); } } public TfsVisualHost host; public static readonly DependencyProperty TfsEdgeProperty; public static readonly DependencyProperty TfsEdgeHighlightProperty; static TfsControl() { { FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata( default(Tfs), FrameworkPropertyMetadataOptions.None, (dobj, e) => { TfsControl tfsc = (TfsControl)dobj; Tfs te = (Tfs)e.NewValue; tfsc.host = new TfsVisualHost(tfsc, te); FocusManager.SetFocusedElement(tfsc, tfsc.host); }); TfsEdgeProperty = DependencyProperty.Register("_TfsEdge", typeof(Tfs), typeof(TfsControl), metadata); } { FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata( default(Tfs), FrameworkPropertyMetadataOptions.None, null); TfsEdgeHighlightProperty = DependencyProperty.Register("_TfsEdgeHighlight", typeof(Tfs), typeof(TfsControl), metadata); } } public TfsControl() { this.Focusable = true; this.IsHitTestVisible = true; this.Visibility = Visibility.Visible; //this.SnapsToDevicePixels = true; this.FontFamily = new FontFamily("Arial"); this.FontSize = 13; } protected override System.Collections.IEnumerator LogicalChildren { get { yield return host; } } protected override int VisualChildrenCount { get { return 1; } } protected override Visual GetVisualChild(int index) { return host; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public void Print(PrintDialog pd) { TdeConstraint tdec = new TdeConstraint(this.host, _TfsEdge.Edge); Size sz = tdec.m_size; Debug.WriteLine("tfs size={0},{1}", sz.Width, sz.Height); Size page = new Size(pd.PrintableAreaWidth - 72, pd.PrintableAreaHeight - 72); Debug.WriteLine("page size={0},{1}", page.Width, page.Height); double scale = Math.Max(page.Width / sz.Width, page.Height / sz.Height); scale = Math.Min(scale, 1.0); scale = Math.Max(scale, 0.45); Transform trx = new ScaleTransform(scale, scale); Debug.WriteLine("scaling={0}", scale); tdec.Transform = trx; sz = new Size(sz.Width * scale, sz.Height * scale); if (sz.Height < page.Height) { using (DrawingContext dc = tdec.RenderOpen()) { tdec.Offset = new Vector(36, 36); //dc.PushClip(new RectangleGeometry(new Rect(36, 36, page.Width, page.Height))); //dc.PushTransform(new TranslateTransform(36 + (page.Width / 2 - sz.Width / 2), 36 + (page.Height / 2 - sz.Height / 2))); // dc.PushTransform(trx); dc.DrawDrawing(tdec.Drawing); // dc.Pop(); //dc.Pop(); //dc.Pop(); } pd.PrintVisual(tdec, "Grammar composer"); } else { for (double top=0; top < sz.Height; top += page.Height) { tdec.Offset = new Vector(36, -top + 36); using (DrawingContext dc = tdec.RenderOpen()) { // dc.PushClip(new RectangleGeometry(new Rect(36, 36, page.Width, page.Height))); // dc.PushTransform(new TranslateTransform(0, -top)); // dc.PushTransform(new TranslateTransform(36, 36)); // dc.PushTransform(trx); dc.DrawDrawing(tdec.Drawing); // dc.Pop(); // dc.Pop(); // dc.Pop(); // dc.Pop(); } Debug.WriteLine("printing top={0}", top); pd.PrintVisual(tdec, "Grammar composer"); } } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Typeface _typeface = null; public Typeface TypeFace { get { if (_typeface == null) _typeface = new Typeface(FontFamily, FontStyle, FontWeight, FontStretch); return _typeface; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// protected override void OnRender(DrawingContext dc) { if (Background != null) { dc.DrawRectangle(Background, null, new Rect(new Point(host.viz.Offset.X,host.viz.Offset.Y),host.viz.m_size)); } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public Size ContentSize { get { return host.viz.m_size;// Rectangle.Size; } } protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { Debug.WriteLine("TfsControl.omlbd {0} {1} {2}", e.Source, e.OriginalSource, e.GetPosition(this)); //base.OnMouseLeftButtonDown(e); } #if false protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters) { Debug.WriteLine("TfsControl.htc {0}", hitTestParameters.HitPoint); return base.HitTestCore(hitTestParameters); } #endif }; }