//! 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/nsruleeditorpredicatepartkey?language=objc)
// NS_TYPED_ENUM
pub type NSRuleEditorPredicatePartKey = NSString;

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditorpredicateleftexpression?language=objc)
    pub static NSRuleEditorPredicateLeftExpression: &'static NSRuleEditorPredicatePartKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditorpredicaterightexpression?language=objc)
    pub static NSRuleEditorPredicateRightExpression: &'static NSRuleEditorPredicatePartKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditorpredicatecomparisonmodifier?language=objc)
    pub static NSRuleEditorPredicateComparisonModifier: &'static NSRuleEditorPredicatePartKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditorpredicateoptions?language=objc)
    pub static NSRuleEditorPredicateOptions: &'static NSRuleEditorPredicatePartKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditorpredicateoperatortype?language=objc)
    pub static NSRuleEditorPredicateOperatorType: &'static NSRuleEditorPredicatePartKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditorpredicatecustomselector?language=objc)
    pub static NSRuleEditorPredicateCustomSelector: &'static NSRuleEditorPredicatePartKey;
}

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditorpredicatecompoundtype?language=objc)
    pub static NSRuleEditorPredicateCompoundType: &'static NSRuleEditorPredicatePartKey;
}

/// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditornestingmode?language=objc)
// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSRuleEditorNestingMode(pub NSUInteger);
impl NSRuleEditorNestingMode {
    #[doc(alias = "NSRuleEditorNestingModeSingle")]
    pub const Single: Self = Self(0);
    #[doc(alias = "NSRuleEditorNestingModeList")]
    pub const List: Self = Self(1);
    #[doc(alias = "NSRuleEditorNestingModeCompound")]
    pub const Compound: Self = Self(2);
    #[doc(alias = "NSRuleEditorNestingModeSimple")]
    pub const Simple: Self = Self(3);
}

unsafe impl Encode for NSRuleEditorNestingMode {
    const ENCODING: Encoding = NSUInteger::ENCODING;
}

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

/// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditorrowtype?language=objc)
// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct NSRuleEditorRowType(pub NSUInteger);
impl NSRuleEditorRowType {
    #[doc(alias = "NSRuleEditorRowTypeSimple")]
    pub const Simple: Self = Self(0);
    #[doc(alias = "NSRuleEditorRowTypeCompound")]
    pub const Compound: Self = Self(1);
}

unsafe impl Encode for NSRuleEditorRowType {
    const ENCODING: Encoding = NSUInteger::ENCODING;
}

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

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

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

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

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

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

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

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

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

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

#[cfg(all(feature = "NSControl", feature = "NSResponder", feature = "NSView"))]
impl NSRuleEditor {
    extern_methods!(
        #[unsafe(method(delegate))]
        #[unsafe(method_family = none)]
        pub fn delegate(&self) -> Option<Retained<ProtocolObject<dyn NSRuleEditorDelegate>>>;

        /// Setter for [`delegate`][Self::delegate].
        ///
        /// This is a [weak property][objc2::topics::weak_property].
        #[unsafe(method(setDelegate:))]
        #[unsafe(method_family = none)]
        pub fn setDelegate(&self, delegate: Option<&ProtocolObject<dyn NSRuleEditorDelegate>>);

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

        /// Setter for [`formattingStringsFilename`][Self::formattingStringsFilename].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setFormattingStringsFilename:))]
        #[unsafe(method_family = none)]
        pub fn setFormattingStringsFilename(&self, formatting_strings_filename: Option<&NSString>);

        #[unsafe(method(formattingDictionary))]
        #[unsafe(method_family = none)]
        pub fn formattingDictionary(&self) -> Option<Retained<NSDictionary<NSString, NSString>>>;

        /// Setter for [`formattingDictionary`][Self::formattingDictionary].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setFormattingDictionary:))]
        #[unsafe(method_family = none)]
        pub fn setFormattingDictionary(
            &self,
            formatting_dictionary: Option<&NSDictionary<NSString, NSString>>,
        );

        #[unsafe(method(reloadCriteria))]
        #[unsafe(method_family = none)]
        pub fn reloadCriteria(&self);

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

        /// Setter for [`nestingMode`][Self::nestingMode].
        #[unsafe(method(setNestingMode:))]
        #[unsafe(method_family = none)]
        pub fn setNestingMode(&self, nesting_mode: NSRuleEditorNestingMode);

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

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

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

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

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

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

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

        #[unsafe(method(reloadPredicate))]
        #[unsafe(method_family = none)]
        pub fn reloadPredicate(&self);

        #[unsafe(method(predicateForRow:))]
        #[unsafe(method_family = none)]
        pub fn predicateForRow(&self, row: NSInteger) -> Option<Retained<NSPredicate>>;

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

        #[unsafe(method(subrowIndexesForRow:))]
        #[unsafe(method_family = none)]
        pub fn subrowIndexesForRow(&self, row_index: NSInteger) -> Retained<NSIndexSet>;

        #[unsafe(method(criteriaForRow:))]
        #[unsafe(method_family = none)]
        pub fn criteriaForRow(&self, row: NSInteger) -> Retained<NSArray>;

        #[unsafe(method(displayValuesForRow:))]
        #[unsafe(method_family = none)]
        pub fn displayValuesForRow(&self, row: NSInteger) -> Retained<NSArray>;

        /// # Safety
        ///
        /// `display_value` should be of the correct type.
        #[unsafe(method(rowForDisplayValue:))]
        #[unsafe(method_family = none)]
        pub unsafe fn rowForDisplayValue(&self, display_value: &AnyObject) -> NSInteger;

        #[unsafe(method(rowTypeForRow:))]
        #[unsafe(method_family = none)]
        pub fn rowTypeForRow(&self, row_index: NSInteger) -> NSRuleEditorRowType;

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

        /// # Safety
        ///
        /// `sender` should be of the correct type.
        #[unsafe(method(addRow:))]
        #[unsafe(method_family = none)]
        pub unsafe fn addRow(&self, sender: Option<&AnyObject>);

        #[unsafe(method(insertRowAtIndex:withType:asSubrowOfRow:animate:))]
        #[unsafe(method_family = none)]
        pub fn insertRowAtIndex_withType_asSubrowOfRow_animate(
            &self,
            row_index: NSInteger,
            row_type: NSRuleEditorRowType,
            parent_row: NSInteger,
            should_animate: bool,
        );

        /// # Safety
        ///
        /// - `criteria` generic should be of the correct type.
        /// - `values` generic should be of the correct type.
        #[unsafe(method(setCriteria:andDisplayValues:forRowAtIndex:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setCriteria_andDisplayValues_forRowAtIndex(
            &self,
            criteria: &NSArray,
            values: &NSArray,
            row_index: NSInteger,
        );

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

        #[unsafe(method(removeRowsAtIndexes:includeSubrows:))]
        #[unsafe(method_family = none)]
        pub fn removeRowsAtIndexes_includeSubrows(
            &self,
            row_indexes: &NSIndexSet,
            include_subrows: bool,
        );

        #[unsafe(method(selectedRowIndexes))]
        #[unsafe(method_family = none)]
        pub fn selectedRowIndexes(&self) -> Retained<NSIndexSet>;

        #[unsafe(method(selectRowIndexes:byExtendingSelection:))]
        #[unsafe(method_family = none)]
        pub fn selectRowIndexes_byExtendingSelection(&self, indexes: &NSIndexSet, extend: bool);

        /// # Safety
        ///
        /// This is not retained internally, you must ensure the object is still alive.
        #[unsafe(method(rowClass))]
        #[unsafe(method_family = none)]
        pub unsafe fn rowClass(&self) -> &'static AnyClass;

        /// Setter for [`rowClass`][Self::rowClass].
        ///
        /// # Safety
        ///
        /// - `row_class` probably has further requirements.
        /// - This is unretained, you must ensure the object is kept alive while in use.
        #[unsafe(method(setRowClass:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setRowClass(&self, row_class: &AnyClass);

        #[unsafe(method(rowTypeKeyPath))]
        #[unsafe(method_family = none)]
        pub fn rowTypeKeyPath(&self) -> Retained<NSString>;

        /// Setter for [`rowTypeKeyPath`][Self::rowTypeKeyPath].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setRowTypeKeyPath:))]
        #[unsafe(method_family = none)]
        pub fn setRowTypeKeyPath(&self, row_type_key_path: &NSString);

        #[unsafe(method(subrowsKeyPath))]
        #[unsafe(method_family = none)]
        pub fn subrowsKeyPath(&self) -> Retained<NSString>;

        /// Setter for [`subrowsKeyPath`][Self::subrowsKeyPath].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setSubrowsKeyPath:))]
        #[unsafe(method_family = none)]
        pub fn setSubrowsKeyPath(&self, subrows_key_path: &NSString);

        #[unsafe(method(criteriaKeyPath))]
        #[unsafe(method_family = none)]
        pub fn criteriaKeyPath(&self) -> Retained<NSString>;

        /// Setter for [`criteriaKeyPath`][Self::criteriaKeyPath].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setCriteriaKeyPath:))]
        #[unsafe(method_family = none)]
        pub fn setCriteriaKeyPath(&self, criteria_key_path: &NSString);

        #[unsafe(method(displayValuesKeyPath))]
        #[unsafe(method_family = none)]
        pub fn displayValuesKeyPath(&self) -> Retained<NSString>;

        /// Setter for [`displayValuesKeyPath`][Self::displayValuesKeyPath].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setDisplayValuesKeyPath:))]
        #[unsafe(method_family = none)]
        pub fn setDisplayValuesKeyPath(&self, display_values_key_path: &NSString);
    );
}

/// Methods declared on superclass `NSControl`.
#[cfg(all(feature = "NSControl", feature = "NSResponder", feature = "NSView"))]
impl NSRuleEditor {
    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>>;
    );
}

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

extern_protocol!(
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditordelegate?language=objc)
    pub unsafe trait NSRuleEditorDelegate: NSObjectProtocol + MainThreadOnly {
        #[cfg(all(feature = "NSControl", feature = "NSResponder", feature = "NSView"))]
        /// # Safety
        ///
        /// `criterion` should be of the correct type.
        #[unsafe(method(ruleEditor:numberOfChildrenForCriterion:withRowType:))]
        #[unsafe(method_family = none)]
        unsafe fn ruleEditor_numberOfChildrenForCriterion_withRowType(
            &self,
            editor: &NSRuleEditor,
            criterion: Option<&AnyObject>,
            row_type: NSRuleEditorRowType,
        ) -> NSInteger;

        #[cfg(all(feature = "NSControl", feature = "NSResponder", feature = "NSView"))]
        /// # Safety
        ///
        /// `criterion` should be of the correct type.
        #[unsafe(method(ruleEditor:child:forCriterion:withRowType:))]
        #[unsafe(method_family = none)]
        unsafe fn ruleEditor_child_forCriterion_withRowType(
            &self,
            editor: &NSRuleEditor,
            index: NSInteger,
            criterion: Option<&AnyObject>,
            row_type: NSRuleEditorRowType,
        ) -> Retained<AnyObject>;

        #[cfg(all(feature = "NSControl", feature = "NSResponder", feature = "NSView"))]
        /// # Safety
        ///
        /// `criterion` should be of the correct type.
        #[unsafe(method(ruleEditor:displayValueForCriterion:inRow:))]
        #[unsafe(method_family = none)]
        unsafe fn ruleEditor_displayValueForCriterion_inRow(
            &self,
            editor: &NSRuleEditor,
            criterion: &AnyObject,
            row: NSInteger,
        ) -> Retained<AnyObject>;

        #[cfg(all(feature = "NSControl", feature = "NSResponder", feature = "NSView"))]
        /// # Safety
        ///
        /// - `criterion` should be of the correct type.
        /// - `value` should be of the correct type.
        #[optional]
        #[unsafe(method(ruleEditor:predicatePartsForCriterion:withDisplayValue:inRow:))]
        #[unsafe(method_family = none)]
        unsafe fn ruleEditor_predicatePartsForCriterion_withDisplayValue_inRow(
            &self,
            editor: &NSRuleEditor,
            criterion: &AnyObject,
            value: &AnyObject,
            row: NSInteger,
        ) -> Option<Retained<NSDictionary<NSRuleEditorPredicatePartKey, AnyObject>>>;

        #[optional]
        #[unsafe(method(ruleEditorRowsDidChange:))]
        #[unsafe(method_family = none)]
        fn ruleEditorRowsDidChange(&self, notification: &NSNotification);
    }
);

extern "C" {
    /// [Apple's documentation](https://developer.apple.com/documentation/appkit/nsruleeditorrowsdidchangenotification?language=objc)
    pub static NSRuleEditorRowsDidChangeNotification: &'static NSNotificationName;
}
