1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
using System;
using System.Collections.Generic;
using System.ComponentModel;
using AppKit;
using CoreGraphics;
using Foundation;
using Xamarin.PropertyEditing.Drawing;
using Xamarin.PropertyEditing.ViewModels;
namespace Xamarin.PropertyEditing.Mac
{
internal class ResourceDataSource : NSOutlineViewDataSource
{
public ResourceDataSource (ResourceSelectorViewModel viewModel) : base ()
{
this.vm = viewModel;
}
public override nint GetChildrenCount (NSOutlineView outlineView, NSObject item)
{
if (this.vm?.Resources == null)
return 0;
if (this.vm.Resources?.Count () == 0)
return 0;
return this.vm.Resources.Count ();
}
public override NSObject GetChild (NSOutlineView outlineView, nint childIndex, NSObject item)
{
object element;
element = (this.vm.Resources.ElementAt ((int)childIndex));
return GetFacade (element);
}
public override bool ItemExpandable (NSOutlineView outlineView, NSObject item)
{
return false;
}
public NSObject GetFacade (object element)
{
NSObject facade;
if (!this.groupFacades.TryGetValue (element, out facade)) {
this.groupFacades [element] = facade = new NSObjectFacade (element);
}
return facade;
}
public bool TryGetFacade (object element, out NSObject facade)
{
return this.groupFacades.TryGetValue (element, out facade);
}
private readonly ResourceSelectorViewModel vm;
private readonly Dictionary<object, NSObject> groupFacades = new Dictionary<object, NSObject> ();
}
internal class ResourceBrushPropertyViewDelegate : ResourceOutlineViewDelegate
{
public BrushPropertyViewModel ViewModel {
get;
set;
}
public override void SelectionDidChange (NSNotification notification)
{
var view = notification.Object as ResourceOutlineView;
var source = view.DataSource as ResourceDataSource;
var facade = view.ItemAtRow (view.SelectedRow);
var resource = (facade as NSObjectFacade)?.Target as Resource;
ViewModel.Resource = resource;
}
}
internal class ResourceOutlineViewDelegate : NSOutlineViewDelegate
{
public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item)
{
var facade = item as NSObjectFacade;
var resource = facade?.Target as Resource;
switch (tableColumn.Identifier) {
case "Preview":
switch (resource) {
case Resource<CommonSolidBrush> solid:
return new CommonBrushView {
Brush = solid.Value,
Frame = new CGRect (0, 0, 30, 10)
};
case Resource<CommonGradientBrush> gradient:
return new CommonBrushView {
Brush = gradient.Value,
Frame = new CGRect (0, 0, 30, 10)
};
}
return new NSView ();
case "Label":
default:
return new NSTextField () {
StringValue = resource.Name,
Bordered = false,
Editable = false,
Selectable = false,
ControlSize = NSControlSize.Small,
Font = NSFont.FromFontName (PropertyEditorControl.DefaultFontName, PropertyEditorControl.DefaultPropertyLabelFontSize),
BackgroundColor = NSColor.Clear
};
}
}
}
internal class ResourceOutlineView : NSOutlineView
{
public ResourceOutlineView ()
{
Initialize ();
}
// Called when created from unmanaged code
public ResourceOutlineView (IntPtr handle) : base (handle)
{
}
// Called when created directly from a XIB file
[Export ("initWithCoder:")]
public ResourceOutlineView (NSCoder coder) : base (coder)
{
}
public void Initialize ()
{
var nameColumn = new NSTableColumn ("Label") {
Title = "Name"
};
AddColumn (nameColumn);
var previewColumn = new NSTableColumn ("Preview") {
Title = "Preview"
};
AddColumn (previewColumn);
}
private ResourceSelectorViewModel viewModel;
public ResourceSelectorViewModel ViewModel {
get => this.viewModel;
set {
this.viewModel = value;
DataSource = new ResourceDataSource (viewModel);
}
}
}
internal class ResourceBrushViewController : NotifyingViewController<BrushPropertyViewModel>
{
private ResourceOutlineView resourceSelector;
private ResourceBrushPropertyViewDelegate viewDelegate;
public ResourceBrushViewController ()
{
PreferredContentSize = new CGSize (430, 230);
viewDelegate = new ResourceBrushPropertyViewDelegate ();
}
private Resource resource;
public override void OnPropertyChanged (object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName) {
case nameof (BrushPropertyViewModel.Resource):
if (resource == ViewModel.Resource)
return;
resource = ViewModel?.Resource;
UpdateSelection ();
break;
case nameof (BrushPropertyViewModel.Solid):
if (resourceSelector != null)
resourceSelector.ViewModel = ViewModel?.ResourceSelector;
break;
case nameof (BrushPropertyViewModel.Value):
break;
}
}
private void UpdateSelection ()
{
if (resourceSelector == null)
return;
var source = resourceSelector.DataSource as ResourceDataSource;
if (source == null || ViewModel == null)
return;
nint index = -1;
if (ViewModel.Resource != null && source.TryGetFacade (ViewModel?.Resource, out var facade)) {
index = resourceSelector.RowForItem (facade);
}
if (index < 0)
resourceSelector.DeselectAll (null);
else
resourceSelector.SelectRow (index, false);
}
public override void OnViewModelChanged (BrushPropertyViewModel oldModel)
{
base.OnViewModelChanged (oldModel);
if (resourceSelector != null) {
viewDelegate.ViewModel = ViewModel;
resourceSelector.ViewModel = ViewModel?.ResourceSelector;
}
}
public new ResourceOutlineView View {
get => base.View as ResourceOutlineView;
set => base.View = (value as ResourceOutlineView);
}
public override void LoadView ()
{
viewDelegate.ViewModel = ViewModel;
View = resourceSelector = new ResourceOutlineView {
Delegate = viewDelegate
};
if (ViewModel != null) {
resourceSelector.ViewModel = ViewModel?.ResourceSelector;
}
}
}
}
|