// the table is looking for this method, picks it up automagically public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) { var facade = (NSObjectFacade)item; var vm = facade.Target as PropertyViewModel; var group = facade.Target as IGroupingList <string, EditorViewModel>; string cellIdentifier = (group == null) ? vm.GetType().Name : group.Key; // Let's make the columns look pretty if (!goldenRatioApplied) { int middleColumnWidth = 5; nfloat rightColumnWidth = (outlineView.Frame.Width - middleColumnWidth) / 1.618f; nfloat leftColumnWidth = outlineView.Frame.Width - rightColumnWidth - middleColumnWidth; outlineView.TableColumns()[0].Width = leftColumnWidth; outlineView.TableColumns()[1].Width = rightColumnWidth; goldenRatioApplied = true; } // Setup view based on the column switch (tableColumn.Identifier) { case PropertyEditorPanel.PropertyListColId: var view = (UnfocusableTextField)outlineView.MakeView("label", this); if (view == null) { view = new UnfocusableTextField { Identifier = "label", Alignment = NSTextAlignment.Right, }; } view.StringValue = ((group == null) ? vm.Property.Name + ":" : group.Key) ?? String.Empty; // Set tooltips only for truncated strings var stringWidth = view.AttributedStringValue.Size.Width + 30; if (stringWidth > tableColumn.Width) { view.ToolTip = vm.Property.Name; } return(view); case PropertyEditorPanel.PropertyEditorColId: if (vm == null) { return(null); } var editor = (PropertyEditorControl)outlineView.MakeView(cellIdentifier + "edits", this); if (editor == null) { editor = GetEditor(vm, outlineView); // If still null we have no editor yet. if (editor == null) { return(new NSView()); } } // we must reset these every time, as the view may have been reused editor.TableRow = outlineView.RowForItem(item); // Force a row update due to new height, but only when we are non-default if (editor.TriggerRowChange) { outlineView.NoteHeightOfRowsWithIndexesChanged(new NSIndexSet(editor.TableRow)); } return(editor); } throw new Exception("Unknown column identifier: " + tableColumn.Identifier); }
public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) { GetVMGroupCellItendifiterFromFacade(item, out EditorViewModel evm, out PanelGroupViewModel group, out var cellIdentifier); if (group != null) { var categoryContainer = (CategoryContainerControl)outlineView.MakeView(CategoryIdentifier, this); if (categoryContainer == null) { categoryContainer = new CategoryContainerControl(this.hostResources, outlineView) { Identifier = CategoryIdentifier, TableView = outlineView, }; } ((UnfocusableTextField)categoryContainer.Subviews[1]).StringValue = group.Category; if (this.dataSource.DataContext.GetIsExpanded(group.Category)) { SynchronizationContext.Current.Post(s => { outlineView.ExpandItem(item); }, null); } return(categoryContainer); } NSView editorOrContainer = null; if (this.firstCache.TryGetValue(cellIdentifier, out IEditorView editor)) { this.firstCache.Remove(cellIdentifier); editorOrContainer = (editor.NativeView is PropertyEditorControl) ? new EditorContainer(this.hostResources, editor) { Identifier = cellIdentifier } : editor.NativeView; } else { editorOrContainer = GetEditor(cellIdentifier, evm, outlineView); editor = ((editorOrContainer as EditorContainer)?.EditorView) ?? editorOrContainer as IEditorView; } if (editorOrContainer is EditorContainer ec) { ec.ViewModel = evm; ec.Label = evm.Name; #if DEBUG // Currently only used to highlight which controls haven't been implemented if (editor == null) { ec.LabelTextColor = NSColor.Red; } #endif } if (editor != null) { var ovm = evm as ObjectPropertyViewModel; if (ovm != null && editorOrContainer is EditorContainer container) { if (container.LeftEdgeView == null) { if (ovm.CanDelve) { container.LeftEdgeView = outlineView.MakeView("NSOutlineViewDisclosureButtonKey", outlineView); } } else if (!ovm.CanDelve) { container.LeftEdgeView = null; } } else if (!(editorOrContainer is EditorContainer)) { editor.ViewModel = evm; } bool openObjectRow = ovm != null && outlineView.IsItemExpanded(item); if (!openObjectRow) { var parent = outlineView.GetParent(item); openObjectRow = (parent != null && ((NSObjectFacade)parent).Target is ObjectPropertyViewModel); } SetRowValueBackground(editorOrContainer, openObjectRow); // Force a row update due to new height, but only when we are non-default if (editor.IsDynamicallySized) { nint index = outlineView.RowForItem(item); outlineView.NoteHeightOfRowsWithIndexesChanged(new NSIndexSet(index)); } } else if (editorOrContainer is PanelHeaderEditorControl header) { header.ViewModel = this.dataSource.DataContext; } return(editorOrContainer); }