private void ZoomView(PointF newScale, AdaptableControl adaptableControl) { Point clientPoint = adaptableControl.PointToClient(Cursor.Position); if (!adaptableControl.ClientRectangle.Contains(clientPoint)) { clientPoint = new Point(adaptableControl.Width / 2, adaptableControl.Height / 2); // use control center } var transformAdapter = adaptableControl.As <ITransformAdapter>(); Point anchorPoint = GdiUtil.InverseTransform(transformAdapter.Transform, clientPoint); PointF scale = transformAdapter.ConstrainScale(newScale); var translation = new PointF( (transformAdapter.Scale.X - scale.X) * anchorPoint.X + transformAdapter.Translation.X, (transformAdapter.Scale.Y - scale.Y) * anchorPoint.Y + transformAdapter.Translation.Y); transformAdapter.SetTransform(scale.X, scale.Y, translation.X, translation.Y); }
private void control_DoubleClick(object sender, EventArgs e) { AdaptableControl d2dHoverControl = (AdaptableControl)sender; Point clientPoint = d2dHoverControl.PointToClient(Control.MousePosition); D2dGraphAdapter <Module, Connection, ICircuitPin> graphAdapter = d2dHoverControl.As <D2dGraphAdapter <Module, Connection, ICircuitPin> >(); GraphHitRecord <Module, Connection, ICircuitPin> hitRecord = graphAdapter.Pick(clientPoint); Group subGraph = null; var subGraphReference = hitRecord.Node.As <GroupReference>(); if (subGraphReference != null) { var templatingContext = m_contextRegistry.GetMostRecentContext <TemplatingContext>(); if (templatingContext != null && templatingContext.IsExternalTemplate(subGraphReference.Template)) { return; // templates should only be editable in the document that owns the template } DialogResult checkResult = DialogResult.No; //direct editing if (checkResult == DialogResult.No) { subGraph = subGraphReference.Group.As <Group>(); var graphValidator = subGraphReference.DomNode.GetRoot().Cast <CircuitValidator>(); graphValidator.UpdateTemplateInfo(subGraph); } } else { subGraph = hitRecord.Node.As <Group>(); } if (subGraph != null) { var viewingContext = subGraph.Cast <ViewingContext>(); if (viewingContext.Control != null) { // sub-graph is already open, just show control m_controlHostService.Show(viewingContext.Control); } else { // create new circuit editing control for sub-circuit AdaptableControl subCircuitControl = CreateCircuitControl(subGraph.DomNode); viewingContext.Control = subCircuitControl; // use group’s hierarchy as control name string name = string.Empty; bool first = true; foreach (var domNode in subGraph.DomNode.GetPath()) { if (domNode.Is <Group>()) { if (first) { name = domNode.Cast <Group>().Name; first = false; } else { name += "/" + domNode.Cast <Group>().Name; } } } string description = name; var editingContext = subGraph.DomNode.Cast <CircuitEditingContext>(); editingContext.GetLocalBound = GetLocalBound; editingContext.GetWorldOffset = GetWorldOffset; editingContext.GetTitleHeight = GetTitleHeight; editingContext.GetLabelHeight = GetLabelHeight; editingContext.GetSubContentOffset = GetSubContentOffset; subCircuitControl.Context = editingContext; editingContext.SchemaLoader = m_schemaLoader; // schema needed for cut and paste between applications ControlInfo controlInfo = new ControlInfo(name, description, StandardControlGroup.Center); //controlInfo.Docking = new ControlInfo.DockingInfo() // smart docking behavior //{ // GroupTag = subGraph.DomNode.Lineage.AsIEnumerable<Group>().Last(),// use the top-level parent group // Order = subGraph.Level //}; m_circuitControlRegistry.RegisterControl(subGraph.DomNode, subCircuitControl, controlInfo, this); var enumerableContext = subGraph.DomNode.Cast <CircuitEditingContext>().Cast <IEnumerableContext>(); var items = (enumerableContext != null) ? enumerableContext.Items : null; subCircuitControl.As <IViewingContext>().Frame(items); } } }
private void ZoomView(PointF newScale, AdaptableControl adaptableControl) { Point clientPoint = adaptableControl.PointToClient(Cursor.Position); if (!adaptableControl.ClientRectangle.Contains(clientPoint)) clientPoint = new Point(adaptableControl.Width/2, adaptableControl.Height/2); // use control center var transformAdapter = adaptableControl.As<ITransformAdapter>(); Point anchorPoint = GdiUtil.InverseTransform(transformAdapter.Transform, clientPoint); PointF scale = transformAdapter.ConstrainScale(newScale); var translation = new PointF( (transformAdapter.Scale.X - scale.X) * anchorPoint.X + transformAdapter.Translation.X, (transformAdapter.Scale.Y - scale.Y) * anchorPoint.Y + transformAdapter.Translation.Y); transformAdapter.SetTransform(scale.X, scale.Y, translation.X, translation.Y); }