Ejemplo n.º 1
0
        // 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);
        }