Welcome to mirror list, hosted at ThFree Co, Russian Federation.

PropertyTableDataSource.cs « Xamarin.PropertyEditing.Mac - github.com/xamarin/Xamarin.PropertyEditing.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 1a312e0f0bc9eed161acfd8514ef1b54f10ce717 (plain)
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using AppKit;
using Foundation;
using Xamarin.PropertyEditing.ViewModels;

namespace Xamarin.PropertyEditing.Mac
{
	internal class PropertyTableDataSource
		: NSOutlineViewDataSource
	{
		bool Filtering => !string.IsNullOrEmpty (this.vm.FilterText);

		internal PropertyTableDataSource (PanelViewModel panelVm)
		{
			if (panelVm == null)
				throw new ArgumentNullException (nameof (panelVm));

			this.vm = panelVm;
		}

		public PanelViewModel DataContext => this.vm;

		public bool ShowHeader
		{
			get;
			set;
		} = true;

		public override nint GetChildrenCount (NSOutlineView outlineView, NSObject item)
		{
			if (this.vm.ArrangedEditors.Count == 0)
				return 0;

			var facade = (NSObjectFacade)item;
			if (facade?.Target is ObjectPropertyViewModel ovm)
				return ovm.ValueModel.Properties.Count;
				
			int headerCount = (ShowHeader && !Filtering) ? 1 : 0;

			if (this.vm.ArrangeMode == PropertyArrangeMode.Name)
				return this.vm.ArrangedEditors[0].Editors.Count + headerCount;
			else {
				if (item == null)
					return this.vm.ArrangedEditors.Count + headerCount;
				else {
					var group = (PanelGroupViewModel)((NSObjectFacade)item).Target;
					return group.Editors.Count + group.UncommonEditors.Count;
				}
			}
		}

		public override NSObject GetChild (NSOutlineView outlineView, nint childIndex, NSObject item)
		{
			object element;

			var f = ((NSObjectFacade)item);
			// We only want the Header to appear at the top of both Category and Name Modes, which means item is null in both.
			if (childIndex == 0 && item == null && !Filtering && ShowHeader)
				element = null;
			else if (f?.Target is ObjectPropertyViewModel ovm) {
				element = ovm.ValueModel.Properties[(int)childIndex];
			} else {
				int headerCount = (ShowHeader && !Filtering) ? 1 : 0;
				if (this.vm.ArrangeMode == PropertyArrangeMode.Name)
					element = this.vm.ArrangedEditors[0].Editors[(int)childIndex - headerCount];
				else {
					if (item == null)
						element = this.vm.ArrangedEditors[(int)childIndex - headerCount];
					else {
						var group = (PanelGroupViewModel)f.Target;
						var list = group.Editors;
						if (childIndex >= list.Count) {
							childIndex -= list.Count;
							list = group.UncommonEditors;
						}

						element = list[(int)childIndex];
					}
				}
			}

			return GetFacade (element);
		}

		public override bool ItemExpandable (NSOutlineView outlineView, NSObject item)
		{
			var f = (NSObjectFacade)item;
			if (f.Target is ObjectPropertyViewModel ovm) {
				PropertyChangedEventHandler changed = null;
				changed = (o, e) => {
					if (e.PropertyName != nameof (ObjectPropertyViewModel.CanDelve))
						return;

					ovm.PropertyChanged -= changed;
					outlineView.ReloadItem (item);
				};
				ovm.PropertyChanged += changed;

				return ovm.CanDelve;
			}

			if (this.vm.ArrangeMode == PropertyArrangeMode.Name)
				return false;

			return f.Target is PanelGroupViewModel;
		}

		public NSObjectFacade GetFacade (object element)
		{
			NSObjectFacade facade;
			if (element is PanelGroupViewModel) {
				if (!this.groupFacades.TryGetValue (element, out facade)) {
					this.groupFacades[element] = facade = new NSObjectFacade (element);
				}
			} else
				facade = new NSObjectFacade (element);

			return facade;
		}

		public bool TryGetFacade (object element, out NSObjectFacade facade)
		{
			return this.groupFacades.TryGetValue (element, out facade);
		}

		private readonly PanelViewModel vm;
		private readonly Dictionary<object, NSObjectFacade> groupFacades = new Dictionary<object, NSObjectFacade> ();
	}
}