//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;
#[cfg(feature = "objc2-core-foundation")]
use objc2_core_foundation::*;
use objc2_foundation::*;

use crate::*;

/// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsgridcellplacement?language=objc)
// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSGridCellPlacement(pub NSInteger);
impl NSGridCellPlacement {
    #[doc(alias = "NSGridCellPlacementInherited")]
    pub const Inherited: Self = Self(0);
    #[doc(alias = "NSGridCellPlacementNone")]
    pub const None: Self = Self(1);
    #[doc(alias = "NSGridCellPlacementLeading")]
    pub const Leading: Self = Self(2);
    #[doc(alias = "NSGridCellPlacementTop")]
    pub const Top: Self = Self(NSGridCellPlacement::Leading.0);
    #[doc(alias = "NSGridCellPlacementTrailing")]
    pub const Trailing: Self = Self(3);
    #[doc(alias = "NSGridCellPlacementBottom")]
    pub const Bottom: Self = Self(NSGridCellPlacement::Trailing.0);
    #[doc(alias = "NSGridCellPlacementCenter")]
    pub const Center: Self = Self(4);
    #[doc(alias = "NSGridCellPlacementFill")]
    pub const Fill: Self = Self(5);
}

unsafe impl Encode for NSGridCellPlacement {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for NSGridCellPlacement {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

/// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsgridrowalignment?language=objc)
// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSGridRowAlignment(pub NSInteger);
impl NSGridRowAlignment {
    #[doc(alias = "NSGridRowAlignmentInherited")]
    pub const Inherited: Self = Self(0);
    #[doc(alias = "NSGridRowAlignmentNone")]
    pub const None: Self = Self(1);
    #[doc(alias = "NSGridRowAlignmentFirstBaseline")]
    pub const FirstBaseline: Self = Self(2);
    #[doc(alias = "NSGridRowAlignmentLastBaseline")]
    pub const LastBaseline: Self = Self(3);
}

unsafe impl Encode for NSGridRowAlignment {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for NSGridRowAlignment {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsgridviewsizeforcontent?language=objc)
    #[cfg(feature = "objc2-core-foundation")]
    pub static NSGridViewSizeForContent: CGFloat;
}

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsgridview?language=objc)
    #[unsafe(super(NSView, NSResponder, NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(all(feature = "NSResponder", feature = "NSView"))]
    pub struct NSGridView;
);

#[cfg(all(
    feature = "NSAccessibilityProtocols",
    feature = "NSResponder",
    feature = "NSView"
))]
extern_conformance!(
    unsafe impl NSAccessibility for NSGridView {}
);

#[cfg(all(
    feature = "NSAccessibilityProtocols",
    feature = "NSResponder",
    feature = "NSView"
))]
extern_conformance!(
    unsafe impl NSAccessibilityElementProtocol for NSGridView {}
);

#[cfg(all(feature = "NSAnimation", feature = "NSResponder", feature = "NSView"))]
extern_conformance!(
    unsafe impl NSAnimatablePropertyContainer for NSGridView {}
);

#[cfg(all(feature = "NSAppearance", feature = "NSResponder", feature = "NSView"))]
extern_conformance!(
    unsafe impl NSAppearanceCustomization for NSGridView {}
);

#[cfg(all(feature = "NSResponder", feature = "NSView"))]
extern_conformance!(
    unsafe impl NSCoding for NSGridView {}
);

#[cfg(all(feature = "NSDragging", feature = "NSResponder", feature = "NSView"))]
extern_conformance!(
    unsafe impl NSDraggingDestination for NSGridView {}
);

#[cfg(all(feature = "NSResponder", feature = "NSView"))]
extern_conformance!(
    unsafe impl NSObjectProtocol for NSGridView {}
);

#[cfg(all(
    feature = "NSResponder",
    feature = "NSUserInterfaceItemIdentification",
    feature = "NSView"
))]
extern_conformance!(
    unsafe impl NSUserInterfaceItemIdentification for NSGridView {}
);

#[cfg(all(feature = "NSResponder", feature = "NSView"))]
impl NSGridView {
    extern_methods!(
        #[unsafe(method(initWithFrame:))]
        #[unsafe(method_family = init)]
        pub fn initWithFrame(this: Allocated<Self>, frame_rect: NSRect) -> Retained<Self>;

        /// # Safety
        ///
        /// `coder` possibly has further requirements.
        #[unsafe(method(initWithCoder:))]
        #[unsafe(method_family = init)]
        pub unsafe fn initWithCoder(
            this: Allocated<Self>,
            coder: &NSCoder,
        ) -> Option<Retained<Self>>;

        #[unsafe(method(gridViewWithNumberOfColumns:rows:))]
        #[unsafe(method_family = none)]
        pub fn gridViewWithNumberOfColumns_rows(
            column_count: NSInteger,
            row_count: NSInteger,
            mtm: MainThreadMarker,
        ) -> Retained<Self>;

        #[unsafe(method(gridViewWithViews:))]
        #[unsafe(method_family = none)]
        pub fn gridViewWithViews(
            rows: &NSArray<NSArray<NSView>>,
            mtm: MainThreadMarker,
        ) -> Retained<Self>;

        #[unsafe(method(numberOfRows))]
        #[unsafe(method_family = none)]
        pub fn numberOfRows(&self) -> NSInteger;

        #[unsafe(method(numberOfColumns))]
        #[unsafe(method_family = none)]
        pub fn numberOfColumns(&self) -> NSInteger;

        #[unsafe(method(rowAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn rowAtIndex(&self, index: NSInteger) -> Retained<NSGridRow>;

        #[unsafe(method(indexOfRow:))]
        #[unsafe(method_family = none)]
        pub fn indexOfRow(&self, row: &NSGridRow) -> NSInteger;

        #[unsafe(method(columnAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn columnAtIndex(&self, index: NSInteger) -> Retained<NSGridColumn>;

        #[unsafe(method(indexOfColumn:))]
        #[unsafe(method_family = none)]
        pub fn indexOfColumn(&self, column: &NSGridColumn) -> NSInteger;

        #[unsafe(method(cellAtColumnIndex:rowIndex:))]
        #[unsafe(method_family = none)]
        pub fn cellAtColumnIndex_rowIndex(
            &self,
            column_index: NSInteger,
            row_index: NSInteger,
        ) -> Retained<NSGridCell>;

        #[unsafe(method(cellForView:))]
        #[unsafe(method_family = none)]
        pub fn cellForView(&self, view: &NSView) -> Option<Retained<NSGridCell>>;

        #[unsafe(method(addRowWithViews:))]
        #[unsafe(method_family = none)]
        pub fn addRowWithViews(&self, views: &NSArray<NSView>) -> Retained<NSGridRow>;

        #[unsafe(method(insertRowAtIndex:withViews:))]
        #[unsafe(method_family = none)]
        pub fn insertRowAtIndex_withViews(
            &self,
            index: NSInteger,
            views: &NSArray<NSView>,
        ) -> Retained<NSGridRow>;

        #[unsafe(method(moveRowAtIndex:toIndex:))]
        #[unsafe(method_family = none)]
        pub fn moveRowAtIndex_toIndex(&self, from_index: NSInteger, to_index: NSInteger);

        #[unsafe(method(removeRowAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn removeRowAtIndex(&self, index: NSInteger);

        #[unsafe(method(addColumnWithViews:))]
        #[unsafe(method_family = none)]
        pub fn addColumnWithViews(&self, views: &NSArray<NSView>) -> Retained<NSGridColumn>;

        #[unsafe(method(insertColumnAtIndex:withViews:))]
        #[unsafe(method_family = none)]
        pub fn insertColumnAtIndex_withViews(
            &self,
            index: NSInteger,
            views: &NSArray<NSView>,
        ) -> Retained<NSGridColumn>;

        #[unsafe(method(moveColumnAtIndex:toIndex:))]
        #[unsafe(method_family = none)]
        pub fn moveColumnAtIndex_toIndex(&self, from_index: NSInteger, to_index: NSInteger);

        #[unsafe(method(removeColumnAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn removeColumnAtIndex(&self, index: NSInteger);

        #[unsafe(method(xPlacement))]
        #[unsafe(method_family = none)]
        pub fn xPlacement(&self) -> NSGridCellPlacement;

        /// Setter for [`xPlacement`][Self::xPlacement].
        #[unsafe(method(setXPlacement:))]
        #[unsafe(method_family = none)]
        pub fn setXPlacement(&self, x_placement: NSGridCellPlacement);

        #[unsafe(method(yPlacement))]
        #[unsafe(method_family = none)]
        pub fn yPlacement(&self) -> NSGridCellPlacement;

        /// Setter for [`yPlacement`][Self::yPlacement].
        #[unsafe(method(setYPlacement:))]
        #[unsafe(method_family = none)]
        pub fn setYPlacement(&self, y_placement: NSGridCellPlacement);

        #[unsafe(method(rowAlignment))]
        #[unsafe(method_family = none)]
        pub fn rowAlignment(&self) -> NSGridRowAlignment;

        /// Setter for [`rowAlignment`][Self::rowAlignment].
        #[unsafe(method(setRowAlignment:))]
        #[unsafe(method_family = none)]
        pub fn setRowAlignment(&self, row_alignment: NSGridRowAlignment);

        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(rowSpacing))]
        #[unsafe(method_family = none)]
        pub fn rowSpacing(&self) -> CGFloat;

        #[cfg(feature = "objc2-core-foundation")]
        /// Setter for [`rowSpacing`][Self::rowSpacing].
        #[unsafe(method(setRowSpacing:))]
        #[unsafe(method_family = none)]
        pub fn setRowSpacing(&self, row_spacing: CGFloat);

        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(columnSpacing))]
        #[unsafe(method_family = none)]
        pub fn columnSpacing(&self) -> CGFloat;

        #[cfg(feature = "objc2-core-foundation")]
        /// Setter for [`columnSpacing`][Self::columnSpacing].
        #[unsafe(method(setColumnSpacing:))]
        #[unsafe(method_family = none)]
        pub fn setColumnSpacing(&self, column_spacing: CGFloat);

        #[unsafe(method(mergeCellsInHorizontalRange:verticalRange:))]
        #[unsafe(method_family = none)]
        pub fn mergeCellsInHorizontalRange_verticalRange(&self, h_range: NSRange, v_range: NSRange);
    );
}

/// Methods declared on superclass `NSResponder`.
#[cfg(all(feature = "NSResponder", feature = "NSView"))]
impl NSGridView {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;
    );
}

/// Methods declared on superclass `NSObject`.
#[cfg(all(feature = "NSResponder", feature = "NSView"))]
impl NSGridView {
    extern_methods!(
        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new(mtm: MainThreadMarker) -> Retained<Self>;
    );
}

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsgridrow?language=objc)
    #[unsafe(super(NSObject))]
    #[thread_kind = MainThreadOnly]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSGridRow;
);

extern_conformance!(
    unsafe impl NSCoding for NSGridRow {}
);

extern_conformance!(
    unsafe impl NSObjectProtocol for NSGridRow {}
);

impl NSGridRow {
    extern_methods!(
        #[cfg(all(feature = "NSResponder", feature = "NSView"))]
        #[unsafe(method(gridView))]
        #[unsafe(method_family = none)]
        pub fn gridView(&self) -> Option<Retained<NSGridView>>;

        #[unsafe(method(numberOfCells))]
        #[unsafe(method_family = none)]
        pub fn numberOfCells(&self) -> NSInteger;

        #[unsafe(method(cellAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn cellAtIndex(&self, index: NSInteger) -> Retained<NSGridCell>;

        #[unsafe(method(yPlacement))]
        #[unsafe(method_family = none)]
        pub fn yPlacement(&self) -> NSGridCellPlacement;

        /// Setter for [`yPlacement`][Self::yPlacement].
        #[unsafe(method(setYPlacement:))]
        #[unsafe(method_family = none)]
        pub fn setYPlacement(&self, y_placement: NSGridCellPlacement);

        #[unsafe(method(rowAlignment))]
        #[unsafe(method_family = none)]
        pub fn rowAlignment(&self) -> NSGridRowAlignment;

        /// Setter for [`rowAlignment`][Self::rowAlignment].
        #[unsafe(method(setRowAlignment:))]
        #[unsafe(method_family = none)]
        pub fn setRowAlignment(&self, row_alignment: NSGridRowAlignment);

        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(height))]
        #[unsafe(method_family = none)]
        pub fn height(&self) -> CGFloat;

        #[cfg(feature = "objc2-core-foundation")]
        /// Setter for [`height`][Self::height].
        #[unsafe(method(setHeight:))]
        #[unsafe(method_family = none)]
        pub fn setHeight(&self, height: CGFloat);

        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(topPadding))]
        #[unsafe(method_family = none)]
        pub fn topPadding(&self) -> CGFloat;

        #[cfg(feature = "objc2-core-foundation")]
        /// Setter for [`topPadding`][Self::topPadding].
        #[unsafe(method(setTopPadding:))]
        #[unsafe(method_family = none)]
        pub fn setTopPadding(&self, top_padding: CGFloat);

        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(bottomPadding))]
        #[unsafe(method_family = none)]
        pub fn bottomPadding(&self) -> CGFloat;

        #[cfg(feature = "objc2-core-foundation")]
        /// Setter for [`bottomPadding`][Self::bottomPadding].
        #[unsafe(method(setBottomPadding:))]
        #[unsafe(method_family = none)]
        pub fn setBottomPadding(&self, bottom_padding: CGFloat);

        #[unsafe(method(isHidden))]
        #[unsafe(method_family = none)]
        pub fn isHidden(&self) -> bool;

        /// Setter for [`isHidden`][Self::isHidden].
        #[unsafe(method(setHidden:))]
        #[unsafe(method_family = none)]
        pub fn setHidden(&self, hidden: bool);

        #[unsafe(method(mergeCellsInRange:))]
        #[unsafe(method_family = none)]
        pub fn mergeCellsInRange(&self, range: NSRange);
    );
}

/// Methods declared on superclass `NSObject`.
impl NSGridRow {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new(mtm: MainThreadMarker) -> Retained<Self>;
    );
}

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsgridcolumn?language=objc)
    #[unsafe(super(NSObject))]
    #[thread_kind = MainThreadOnly]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSGridColumn;
);

extern_conformance!(
    unsafe impl NSCoding for NSGridColumn {}
);

extern_conformance!(
    unsafe impl NSObjectProtocol for NSGridColumn {}
);

impl NSGridColumn {
    extern_methods!(
        #[cfg(all(feature = "NSResponder", feature = "NSView"))]
        #[unsafe(method(gridView))]
        #[unsafe(method_family = none)]
        pub fn gridView(&self) -> Option<Retained<NSGridView>>;

        #[unsafe(method(numberOfCells))]
        #[unsafe(method_family = none)]
        pub fn numberOfCells(&self) -> NSInteger;

        #[unsafe(method(cellAtIndex:))]
        #[unsafe(method_family = none)]
        pub fn cellAtIndex(&self, index: NSInteger) -> Retained<NSGridCell>;

        #[unsafe(method(xPlacement))]
        #[unsafe(method_family = none)]
        pub fn xPlacement(&self) -> NSGridCellPlacement;

        /// Setter for [`xPlacement`][Self::xPlacement].
        #[unsafe(method(setXPlacement:))]
        #[unsafe(method_family = none)]
        pub fn setXPlacement(&self, x_placement: NSGridCellPlacement);

        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(width))]
        #[unsafe(method_family = none)]
        pub fn width(&self) -> CGFloat;

        #[cfg(feature = "objc2-core-foundation")]
        /// Setter for [`width`][Self::width].
        #[unsafe(method(setWidth:))]
        #[unsafe(method_family = none)]
        pub fn setWidth(&self, width: CGFloat);

        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(leadingPadding))]
        #[unsafe(method_family = none)]
        pub fn leadingPadding(&self) -> CGFloat;

        #[cfg(feature = "objc2-core-foundation")]
        /// Setter for [`leadingPadding`][Self::leadingPadding].
        #[unsafe(method(setLeadingPadding:))]
        #[unsafe(method_family = none)]
        pub fn setLeadingPadding(&self, leading_padding: CGFloat);

        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(trailingPadding))]
        #[unsafe(method_family = none)]
        pub fn trailingPadding(&self) -> CGFloat;

        #[cfg(feature = "objc2-core-foundation")]
        /// Setter for [`trailingPadding`][Self::trailingPadding].
        #[unsafe(method(setTrailingPadding:))]
        #[unsafe(method_family = none)]
        pub fn setTrailingPadding(&self, trailing_padding: CGFloat);

        #[unsafe(method(isHidden))]
        #[unsafe(method_family = none)]
        pub fn isHidden(&self) -> bool;

        /// Setter for [`isHidden`][Self::isHidden].
        #[unsafe(method(setHidden:))]
        #[unsafe(method_family = none)]
        pub fn setHidden(&self, hidden: bool);

        #[unsafe(method(mergeCellsInRange:))]
        #[unsafe(method_family = none)]
        pub fn mergeCellsInRange(&self, range: NSRange);
    );
}

/// Methods declared on superclass `NSObject`.
impl NSGridColumn {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new(mtm: MainThreadMarker) -> Retained<Self>;
    );
}

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsgridcell?language=objc)
    #[unsafe(super(NSObject))]
    #[thread_kind = MainThreadOnly]
    #[derive(Debug, PartialEq, Eq, Hash)]
    pub struct NSGridCell;
);

extern_conformance!(
    unsafe impl NSCoding for NSGridCell {}
);

extern_conformance!(
    unsafe impl NSObjectProtocol for NSGridCell {}
);

impl NSGridCell {
    extern_methods!(
        #[cfg(all(feature = "NSResponder", feature = "NSView"))]
        #[unsafe(method(contentView))]
        #[unsafe(method_family = none)]
        pub fn contentView(&self) -> Option<Retained<NSView>>;

        #[cfg(all(feature = "NSResponder", feature = "NSView"))]
        /// Setter for [`contentView`][Self::contentView].
        #[unsafe(method(setContentView:))]
        #[unsafe(method_family = none)]
        pub fn setContentView(&self, content_view: Option<&NSView>);

        #[cfg(all(feature = "NSResponder", feature = "NSView"))]
        #[unsafe(method(emptyContentView))]
        #[unsafe(method_family = none)]
        pub fn emptyContentView(mtm: MainThreadMarker) -> Retained<NSView>;

        #[unsafe(method(row))]
        #[unsafe(method_family = none)]
        pub fn row(&self) -> Option<Retained<NSGridRow>>;

        #[unsafe(method(column))]
        #[unsafe(method_family = none)]
        pub fn column(&self) -> Option<Retained<NSGridColumn>>;

        #[unsafe(method(xPlacement))]
        #[unsafe(method_family = none)]
        pub fn xPlacement(&self) -> NSGridCellPlacement;

        /// Setter for [`xPlacement`][Self::xPlacement].
        #[unsafe(method(setXPlacement:))]
        #[unsafe(method_family = none)]
        pub fn setXPlacement(&self, x_placement: NSGridCellPlacement);

        #[unsafe(method(yPlacement))]
        #[unsafe(method_family = none)]
        pub fn yPlacement(&self) -> NSGridCellPlacement;

        /// Setter for [`yPlacement`][Self::yPlacement].
        #[unsafe(method(setYPlacement:))]
        #[unsafe(method_family = none)]
        pub fn setYPlacement(&self, y_placement: NSGridCellPlacement);

        #[unsafe(method(rowAlignment))]
        #[unsafe(method_family = none)]
        pub fn rowAlignment(&self) -> NSGridRowAlignment;

        /// Setter for [`rowAlignment`][Self::rowAlignment].
        #[unsafe(method(setRowAlignment:))]
        #[unsafe(method_family = none)]
        pub fn setRowAlignment(&self, row_alignment: NSGridRowAlignment);

        #[cfg(feature = "NSLayoutConstraint")]
        #[unsafe(method(customPlacementConstraints))]
        #[unsafe(method_family = none)]
        pub fn customPlacementConstraints(&self) -> Retained<NSArray<NSLayoutConstraint>>;

        #[cfg(feature = "NSLayoutConstraint")]
        /// Setter for [`customPlacementConstraints`][Self::customPlacementConstraints].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setCustomPlacementConstraints:))]
        #[unsafe(method_family = none)]
        pub fn setCustomPlacementConstraints(
            &self,
            custom_placement_constraints: &NSArray<NSLayoutConstraint>,
        );
    );
}

/// Methods declared on superclass `NSObject`.
impl NSGridCell {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new(mtm: MainThreadMarker) -> Retained<Self>;
    );
}
