private void ComponentBox_ItemSelected(object sender, ComponentBoxItemModel model) { if (!IsComponentBoxOpen) { return; } // Close Opened Box CloseComponentBox(); // Create Component FrameworkElement visual = AddNewComponent(model, this.PointFromScreen(componentBoxPosition)); IRenderer targetRenderer = visual.GetRenderer(); // * Logic Binding * PBinder outputBinder = null; PBinder inputBinder = null; // Component -> Component if (componentBox.TargetObject is BindRequest request) { var host = request.Source.Binder.Host as PBinderHost; IRenderer renderer = host.GetRenderer(); IBinderHost targetHost = targetRenderer.ProvideValue(); PBinder sourceBinder = request.Source.Binder; PBinder targetBinder = targetHost.GetConnectableBinders(sourceBinder).FirstOrDefault() as PBinder; if (sourceBinder == null || targetBinder == null) { // 연결 실패 return; } BinderHelper.GetPairObject( ref outputBinder, ref inputBinder, (sourceBinder, sourceBinder.BindOption), (targetBinder, targetBinder.BindOption)); } // Layout -> Component if (componentBox.TargetObject is PObject pObj) { IRenderer renderer = pObj.GetRenderer(); outputBinder = renderer.ProvideValue()[BindOptions.Output].FirstOrDefault() as PBinder; inputBinder = targetRenderer.ProvideValue()[BindOptions.Input].FirstOrDefault() as PBinder; } if (outputBinder == null || inputBinder == null) { // 연결 실패 return; } ConnectComponent( outputBinder.GetView <BindThumb>(), inputBinder.GetView <BindThumb>()); }
public BindThumb(PBinder binder) : this() { this.DataContext = binder; this.BindOption = binder.BindOption; this.Binder.Binded += Binder_Binded; }
// Trigger In / Out Thumb private void AddTriggerThumb(PBinder binder) { var thumb = new BindThumb(binder); if (binder.BindOption == BindOptions.Input) { InputThumbs.Add(thumb); } else { OutputThumbs.Add(thumb); } AddThumbCore(thumb); }
protected virtual void ConnectExpressions(IEnumerable <BindExpression> expressions) { foreach (var expression in expressions) { PBinder output = Model.Project.GetComponentBinder(expression.Output); PBinder input = Model.Project.GetComponentBinder(expression.Input); var inputRenderer = ResolveRenderer(input); var outputRenderer = ResolveRenderer(output); if (outputRenderer.Element.IsVisible && inputRenderer.Element.IsVisible) { Connect(); } else { if (!outputRenderer.Element.IsVisible) { outputRenderer.ElementAttached += Renderer_ElementAttached; } if (!inputRenderer.Element.IsVisible) { inputRenderer.ElementAttached += Renderer_ElementAttached; } } void Renderer_ElementAttached(object sender, EventArgs e) { if (outputRenderer.Element.IsVisible && inputRenderer.Element.IsVisible) { outputRenderer.ElementAttached -= Renderer_ElementAttached; inputRenderer.ElementAttached -= Renderer_ElementAttached; Connect(); } } void Connect() { BindThumb outputThumb = output.GetView <BindThumb>(); BindThumb inputThumb = input.GetView <BindThumb>(); ConnectComponent(outputThumb, inputThumb); } } }
internal void InitializeProject() { foreach (PContentPage screen in Model.Project.Screens) { // Load Renderer LoadScreenRenderer(screen); DispatcherEx.WaitFor(DispatcherPriority.Loaded); // 모든 트리 탐색 foreach (var node in screen.FindContentChildrens <PObject, PObject>()) { // Load Renderer LoadElementRenderer(node.Parent, node.Child); } } // 로직 foreach (PComponent component in Model.Project.Components) { LoadComponentRenderer(component); } // 연결 정보 foreach (var expression in Model.Project.GetBindExpressions()) { PBinder output = Model.Project.GetComponentBinder(expression.Output); PBinder input = Model.Project.GetComponentBinder(expression.Input); var outputRenderer = (output.Host as PBinderHost).GetRenderer(); outputRenderer.ElementAttached += Attached; void Attached(object sender, EventArgs e) { outputRenderer.ElementAttached -= Attached; BindThumb outputThumb = output.GetView <BindThumb>(); BindThumb inputThumb = input.GetView <BindThumb>(); ConnectComponent(outputThumb, inputThumb); } } }
//string CreateLambda() internal static void ProcessBinderValue(DXMapper <CSharpCodeMapAttribute> mapper, IndentStringBuilder sourceBuilder, DXToken token, PBinder binder) { string valueLine = null; // 직접 입력 if (binder.IsDirectValue) { object value = binder.DirectValue; if (value is string vStr) { Match match = Regex.Match(vStr, "(?<=^\")(\\d+\\.\\d+|\\d+)(?=\"$)"); if (match.Success) { valueLine = vStr; } else if (double.TryParse(vStr, out double r)) { valueLine = r.ToString(); } else if (vStr == "\"\"") { valueLine = vStr; } } if (valueLine == null) { valueLine = mapper.MappingProvider.GetValueLine(value, true); } } // 연결됨 else if (binder.Items.Count == 1) { var paramOutputHost = binder.Items[0].Host; var attr = paramOutputHost.GetAttribute <CSharpCodeMapAttribute>(); if (paramOutputHost is PTrigger) { valueLine = "sender"; } else { valueLine = mapper.Build(paramOutputHost, attr.MappingCode).Source; } } else { // Error } if (valueLine != null) { int idx = sourceBuilder.IndexOf(token.OriginalSource); // 토큰 부분 제거 sourceBuilder.Replace(token.OriginalSource, ""); sourceBuilder.Insert(idx, valueLine); } }
private string BuildBinder(BuildStackTrace trace, DXMappingResult result, PBinder binder) { // 직접 입력 값 if (binder.IsDirectValue) { object value = binder.DirectValue; if (value is string vStr) { Match match = Regex.Match(vStr, "(?<=^\")(\\d+\\.\\d+|\\d+)(?=\"$)"); if (match.Success) { return(vStr); } else if (double.TryParse(vStr, out double v)) { return(v.ToString()); } else if (vStr == "\"\"") { return(vStr); } } return(MappingProvider.GetValueLine(value, true)); } // 연결된 파라미터가 없음 if (binder.Items.Count == 0) { return(null); } // 연결된 파라미터의 부모 (컴포넌트) var previousHost = binder.Items[0].Host as PBinderHost; string mappingCode = previousHost.GetAttribute <TAttribute>().MappingCode; if (binder.HasAttribute <TAttribute>()) { mappingCode = binder.GetAttribute <TAttribute>().MappingCode; } // 코드 매핑 var r = buildImpl(trace, previousHost, mappingCode); string valueLine = r.Source; foreach (var token in r.Errors) { result.AddErrorToken(token); } foreach (var token in r.Resolved) { result.AddResolvedToken(token); } // 대입 값인 경우 대상 속성에 따라 캐스팅이 필요함 if ((binder as PParameterBinder).Host is PSetter setter) { if (setter.ValueBinder.Equals(binder)) { Type valueType = previousHost.GetType(); if (previousHost is PFunction prevFunc) { valueType = prevFunc.FunctionInfo.ReturnType; } if (previousHost is PGetter prevGetter) { valueType = prevGetter.Property.PropertyType; } if (previousHost is PLayoutBinderHost prevLayout) { valueType = prevLayout.LogicalParent.GetType(); } if (previousHost is PSelector prevSelector) { valueType = prevSelector.TargetVisual.GetType(); } if (setter.Property == null && previousHost is PStructure structure) { if (structure.Fields.Count > 0) { var builder = new StringBuilder(); var attr = typeof(PDataField).GetAttribute <TAttribute>(); PDataField[] fields = structure.Fields .Where(f => f.ValueBinder.Items.Count > 0) .OrderBy(f => f.ValueBinder.Items[0].Host is PFunction ? 1 : 0) .ToArray(); for (int i = 0; i < fields.Length; i++) { if (fields[i].ValueBinder.Items.Count == 0) { continue; } var fieldResult = buildImpl(trace, fields[i], attr.MappingCode); if (builder.Length > 0) { builder.Append(", "); } builder.Append(fieldResult.Source); } return(builder.ToString()); } return(""); } if (setter.Property.PropertyType != valueType || setter.Property.Name == "Source") { // on wpf if (setter.Property.Name == "Source") { return(this.MappingProvider.Casting(typeof(ImageSource), valueLine)); } // casting return(this.MappingProvider.Casting(setter.Property.PropertyType, valueLine)); } } } return(valueLine); }
public string BuildBinder(PBinder binder) { // 직접 입력 값 if (binder.IsDirectValue) { return(this.MappingProvider.GetValueLine(binder.DirectValue, true)); } // 연결된 파라미터가 없음 if (binder.Items.Count == 0) { return(null); } // 연결된 파라미터의 부모 (컴포넌트) var previousHost = binder.Items[0].Host as PBinderHost; string mappingCode = previousHost.GetAttribute <TAttribute>().MappingCode; if (binder.HasAttribute <TAttribute>()) { mappingCode = binder.GetAttribute <TAttribute>().MappingCode; } // 코드 매핑 var r = this.Build(previousHost, mappingCode); string valueLine = r.Source; // 대입 값인 경우 대상 속성에 따라 캐스팅이 필요함 if ((binder as PParameterBinder).Host is PSetter setter) { if (setter.ValueBinder.Equals(binder)) { Type valueType = previousHost.GetType(); if (previousHost is PFunction prevFunc) { valueType = prevFunc.FunctionInfo.ReturnType; } if (previousHost is PGetter prevGetter) { valueType = prevGetter.Property.PropertyType; } if (previousHost is PLayoutBinderHost prevLayout) { valueType = prevLayout.LogicalParent.GetType(); } if (previousHost is PSelector prevSelector) { valueType = prevSelector.TargetVisual.GetType(); } if (setter.Property.PropertyType != valueType) { // casting return(this.MappingProvider.Casting(setter.Property.PropertyType, valueLine)); } } } return(valueLine); }
private IRenderer ResolveRenderer(PBinder binder) { return((binder.GetBinderHost() as PBinderHost).GetRenderer()); }