diff --git a/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs b/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs index e221c5b..6c20d59 100644 --- a/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs +++ b/src/SheetMe.Designer/ViewModels/Inspector/InspectorViewModel.cs @@ -922,7 +922,9 @@ public sealed class InspectorViewModel : ViewModelBase PropEditorKind.DataActionTag => new TagPickerRowViewModel(def.Label, "액션 태그 선택 — 더블클릭/버튼 액션(EN_DataActionTyp)", LegacyTagCatalog.DataActionTags, LegacyTagUsageCatalog.SuggestFor(def.Key, controlType)) { IsActionTag = true }, - PropEditorKind.SqlQuery => new QueryRowViewModel(def.Label), + // 컨트롤 이름을 넘긴다 — 안 넘기면 인스펙터로 연 편집기에서만 《컨트롤명》 칩이 사라져 + // 같은 창이 진입 경로에 따라 능력이 달라진다 + PropEditorKind.SqlQuery => new QueryRowViewModel(def.Label) { ControlNamesOf = ControlNames }, PropEditorKind.Mask => new MaskRowViewModel(def.Label), // 배선 대상 목록은 '지금 이 서식'의 데이터소스다 — 런타임도 같은 서식 안에서만 이름을 찾는다 PropEditorKind.DataTableField => new DataTableFieldRowViewModel(def.Label, DataTableNames), @@ -953,6 +955,37 @@ public sealed class InspectorViewModel : ViewModelBase /// 레거시 편집기는 열려 있는 모든 디자인 서피스를 훑어 다른 서식의 데이터소스까지 섞어 보여 주고, /// 그걸 고르면 런타임에 조용히 실패한다(bzMDataTableField.vb:18-63). 우리는 현재 문서로 한정한다. /// + /// + /// 이 서식의 모든 컨트롤 이름 — 쿼리 편집기의 《컨트롤명》 치환 후보다. + /// + /// 데이터소스 아이콘에서 편집기를 열면 이 목록이 넘어가는데 인스펙터의 쿼리 행에서는 + /// 안 넘어가서, 같은 창이 진입 경로에 따라 능력이 달랐다. + /// + private IReadOnlyList ControlNames() + { + var names = new List(); + void Visit(SheetMe.Core.Models.ControlElement element) + { + if (element.Id.Length > 0) + { + names.Add(element.Id); + } + foreach (var child in element.Children) + { + Visit(child); + } + } + foreach (var page in designer.Document.Pages) + { + foreach (var control in page.Controls) + { + Visit(control); + } + } + names.Sort(StringComparer.Ordinal); + return names; + } + private IReadOnlyList DataTableNames() { var names = new List(); diff --git a/src/SheetMe.Designer/ViewModels/Inspector/PropertyRows.cs b/src/SheetMe.Designer/ViewModels/Inspector/PropertyRows.cs index 23c91e9..f8df160 100644 --- a/src/SheetMe.Designer/ViewModels/Inspector/PropertyRows.cs +++ b/src/SheetMe.Designer/ViewModels/Inspector/PropertyRows.cs @@ -782,9 +782,20 @@ public sealed class QueryRowViewModel : PropertyRowViewModel protected override void OnValueApplied() => OnPropertyChanged(nameof(Summary)); + /// + /// 이 서식의 컨트롤 이름 — 편집기의 《컨트롤명》 치환 후보가 된다. + /// + /// 안 넘기면 같은 창이 진입 경로에 따라 능력이 달라진다 — + /// 데이터소스 아이콘에서 열면 컨트롤 변수 칩이 나오는데 + /// 인스펙터의 쿼리 행에서 열면 그 칩이 통째로 사라졌다. + /// 목록은 문서마다 다르므로 카탈로그가 아니라 호출부가 준다. + /// + public Func>? ControlNamesOf { get; init; } + private void OnEdit() { - var dialog = new Views.QueryEditorWindow(Label, ValueText) + var dialog = new Views.QueryEditorWindow(Label, ValueText, + showVariables: true, controlNames: ControlNamesOf?.Invoke()) { Owner = System.Windows.Application.Current.MainWindow, }; diff --git a/src/SheetMe.Designer/Views/QueryEditorWindow.xaml b/src/SheetMe.Designer/Views/QueryEditorWindow.xaml index 9ef8c4e..ec3657f 100644 --- a/src/SheetMe.Designer/Views/QueryEditorWindow.xaml +++ b/src/SheetMe.Designer/Views/QueryEditorWindow.xaml @@ -323,9 +323,33 @@