//! 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::*;
#[cfg(feature = "objc2-quartz-core")]
#[cfg(not(target_os = "watchos"))]
use objc2_quartz_core::*;

use crate::*;

/// [Apple's documentation](https://developer.apple.com/documentation/uikit/uicollectionviewcelldragstate?language=objc)
// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UICollectionViewCellDragState(pub NSInteger);
impl UICollectionViewCellDragState {
    #[doc(alias = "UICollectionViewCellDragStateNone")]
    pub const None: Self = Self(0);
    #[doc(alias = "UICollectionViewCellDragStateLifting")]
    pub const Lifting: Self = Self(1);
    #[doc(alias = "UICollectionViewCellDragStateDragging")]
    pub const Dragging: Self = Self(2);
}

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

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

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/uikit/uicollectionreusableview?language=objc)
    #[unsafe(super(UIView, UIResponder, NSObject))]
    #[thread_kind = MainThreadOnly]
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(all(feature = "UIResponder", feature = "UIView"))]
    pub struct UICollectionReusableView;
);

#[cfg(all(
    feature = "UIResponder",
    feature = "UIView",
    feature = "objc2-quartz-core"
))]
#[cfg(not(target_os = "watchos"))]
extern_conformance!(
    unsafe impl CALayerDelegate for UICollectionReusableView {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl NSCoding for UICollectionReusableView {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl NSObjectProtocol for UICollectionReusableView {}
);

#[cfg(all(feature = "UIAppearance", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIAppearance for UICollectionReusableView {}
);

#[cfg(all(feature = "UIAppearance", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIAppearanceContainer for UICollectionReusableView {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UICoordinateSpace for UICollectionReusableView {}
);

#[cfg(all(
    feature = "UIDynamicBehavior",
    feature = "UIResponder",
    feature = "UIView"
))]
extern_conformance!(
    unsafe impl UIDynamicItem for UICollectionReusableView {}
);

#[cfg(all(feature = "UIFocus", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIFocusEnvironment for UICollectionReusableView {}
);

#[cfg(all(feature = "UIFocus", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIFocusItem for UICollectionReusableView {}
);

#[cfg(all(feature = "UIFocus", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIFocusItemContainer for UICollectionReusableView {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIResponderStandardEditActions for UICollectionReusableView {}
);

#[cfg(all(
    feature = "UIResponder",
    feature = "UITraitCollection",
    feature = "UIView"
))]
extern_conformance!(
    unsafe impl UITraitEnvironment for UICollectionReusableView {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
impl UICollectionReusableView {
    extern_methods!(
        #[unsafe(method(reuseIdentifier))]
        #[unsafe(method_family = none)]
        pub fn reuseIdentifier(&self) -> Option<Retained<NSString>>;

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

        #[cfg(feature = "UICollectionViewLayout")]
        #[unsafe(method(applyLayoutAttributes:))]
        #[unsafe(method_family = none)]
        pub fn applyLayoutAttributes(&self, layout_attributes: &UICollectionViewLayoutAttributes);

        #[cfg(feature = "UICollectionViewLayout")]
        #[unsafe(method(willTransitionFromLayout:toLayout:))]
        #[unsafe(method_family = none)]
        pub fn willTransitionFromLayout_toLayout(
            &self,
            old_layout: &UICollectionViewLayout,
            new_layout: &UICollectionViewLayout,
        );

        #[cfg(feature = "UICollectionViewLayout")]
        #[unsafe(method(didTransitionFromLayout:toLayout:))]
        #[unsafe(method_family = none)]
        pub fn didTransitionFromLayout_toLayout(
            &self,
            old_layout: &UICollectionViewLayout,
            new_layout: &UICollectionViewLayout,
        );

        #[cfg(feature = "UICollectionViewLayout")]
        #[unsafe(method(preferredLayoutAttributesFittingAttributes:))]
        #[unsafe(method_family = none)]
        pub fn preferredLayoutAttributesFittingAttributes(
            &self,
            layout_attributes: &UICollectionViewLayoutAttributes,
        ) -> Retained<UICollectionViewLayoutAttributes>;
    );
}

/// Methods declared on superclass `UIView`.
#[cfg(all(feature = "UIResponder", feature = "UIView"))]
impl UICollectionReusableView {
    extern_methods!(
        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(initWithFrame:))]
        #[unsafe(method_family = init)]
        pub fn initWithFrame(this: Allocated<Self>, frame: CGRect) -> 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(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;
    );
}

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

/// [Apple's documentation](https://developer.apple.com/documentation/uikit/uicollectionviewcellconfigurationupdatehandler?language=objc)
#[cfg(all(
    feature = "UICellConfigurationState",
    feature = "UIResponder",
    feature = "UIView",
    feature = "UIViewConfigurationState",
    feature = "block2"
))]
pub type UICollectionViewCellConfigurationUpdateHandler =
    *mut block2::DynBlock<dyn Fn(NonNull<UICollectionViewCell>, NonNull<UICellConfigurationState>)>;

extern_class!(
    /// [Apple's documentation](https://developer.apple.com/documentation/uikit/uicollectionviewcell?language=objc)
    #[unsafe(super(UICollectionReusableView, UIView, UIResponder, NSObject))]
    #[thread_kind = MainThreadOnly]
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(all(feature = "UIResponder", feature = "UIView"))]
    pub struct UICollectionViewCell;
);

#[cfg(all(
    feature = "UIResponder",
    feature = "UIView",
    feature = "objc2-quartz-core"
))]
#[cfg(not(target_os = "watchos"))]
extern_conformance!(
    unsafe impl CALayerDelegate for UICollectionViewCell {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl NSCoding for UICollectionViewCell {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl NSObjectProtocol for UICollectionViewCell {}
);

#[cfg(all(feature = "UIAppearance", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIAppearance for UICollectionViewCell {}
);

#[cfg(all(feature = "UIAppearance", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIAppearanceContainer for UICollectionViewCell {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UICoordinateSpace for UICollectionViewCell {}
);

#[cfg(all(
    feature = "UIDynamicBehavior",
    feature = "UIResponder",
    feature = "UIView"
))]
extern_conformance!(
    unsafe impl UIDynamicItem for UICollectionViewCell {}
);

#[cfg(all(feature = "UIFocus", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIFocusEnvironment for UICollectionViewCell {}
);

#[cfg(all(feature = "UIFocus", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIFocusItem for UICollectionViewCell {}
);

#[cfg(all(feature = "UIFocus", feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIFocusItemContainer for UICollectionViewCell {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
extern_conformance!(
    unsafe impl UIResponderStandardEditActions for UICollectionViewCell {}
);

#[cfg(all(
    feature = "UIResponder",
    feature = "UITraitCollection",
    feature = "UIView"
))]
extern_conformance!(
    unsafe impl UITraitEnvironment for UICollectionViewCell {}
);

#[cfg(all(feature = "UIResponder", feature = "UIView"))]
impl UICollectionViewCell {
    extern_methods!(
        #[cfg(all(
            feature = "UICellConfigurationState",
            feature = "UIViewConfigurationState"
        ))]
        /// Returns the current configuration state for the cell.
        /// To add your own custom state(s), override the getter and call super to obtain an instance with the
        /// system properties set, then set your own custom states as desired.
        #[unsafe(method(configurationState))]
        #[unsafe(method_family = none)]
        pub fn configurationState(&self) -> Retained<UICellConfigurationState>;

        /// Requests the cell update its configuration for its current state. This method is called automatically
        /// when the cell's `configurationState` may have changed, as well as in other circumstances where an
        /// update may be required. Multiple requests may be coalesced into a single update at the appropriate time.
        #[unsafe(method(setNeedsUpdateConfiguration))]
        #[unsafe(method_family = none)]
        pub fn setNeedsUpdateConfiguration(&self);

        #[cfg(all(
            feature = "UICellConfigurationState",
            feature = "UIViewConfigurationState"
        ))]
        /// Subclasses should override this method and update the cell's configuration using the state provided.
        /// This method should not be called directly, use `setNeedsUpdateConfiguration` to request an update.
        #[unsafe(method(updateConfigurationUsingState:))]
        #[unsafe(method_family = none)]
        pub fn updateConfigurationUsingState(&self, state: &UICellConfigurationState);

        #[cfg(all(
            feature = "UICellConfigurationState",
            feature = "UIViewConfigurationState",
            feature = "block2"
        ))]
        /// Optional block-based alternative to overriding `-updateConfigurationUsingState:` in a subclass. This handler
        /// is called after `-updateConfigurationUsingState:`. Setting a new handler triggers `setNeedsUpdateConfiguration`.
        ///
        /// # Safety
        ///
        /// - The returned block's argument 1 must be a valid pointer.
        /// - The returned block's argument 2 must be a valid pointer.
        #[unsafe(method(configurationUpdateHandler))]
        #[unsafe(method_family = none)]
        pub unsafe fn configurationUpdateHandler(
            &self,
        ) -> UICollectionViewCellConfigurationUpdateHandler;

        #[cfg(all(
            feature = "UICellConfigurationState",
            feature = "UIViewConfigurationState",
            feature = "block2"
        ))]
        /// Setter for [`configurationUpdateHandler`][Self::configurationUpdateHandler].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        ///
        /// # Safety
        ///
        /// `configuration_update_handler` must be a valid pointer or null.
        #[unsafe(method(setConfigurationUpdateHandler:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setConfigurationUpdateHandler(
            &self,
            configuration_update_handler: UICollectionViewCellConfigurationUpdateHandler,
        );

        #[cfg(feature = "UIContentConfiguration")]
        /// Setting a content configuration replaces the existing contentView of the cell with a new content view instance from the configuration,
        /// or directly applies the configuration to the existing content view if the configuration is compatible with the existing content view type.
        /// The default value is nil. After a configuration has been set, setting this property to nil will replace the current content view with a new content view.
        #[unsafe(method(contentConfiguration))]
        #[unsafe(method_family = none)]
        pub fn contentConfiguration(
            &self,
        ) -> Option<Retained<ProtocolObject<dyn UIContentConfiguration>>>;

        #[cfg(feature = "UIContentConfiguration")]
        /// Setter for [`contentConfiguration`][Self::contentConfiguration].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setContentConfiguration:))]
        #[unsafe(method_family = none)]
        pub fn setContentConfiguration(
            &self,
            content_configuration: Option<&ProtocolObject<dyn UIContentConfiguration>>,
        );

        /// When YES, the cell will automatically call -updatedConfigurationForState: on its `contentConfiguration` when the cell's
        /// configuration state changes, and apply the updated configuration back to the cell. The default value is YES.
        #[unsafe(method(automaticallyUpdatesContentConfiguration))]
        #[unsafe(method_family = none)]
        pub fn automaticallyUpdatesContentConfiguration(&self) -> bool;

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

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

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

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

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

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

        #[unsafe(method(dragStateDidChange:))]
        #[unsafe(method_family = none)]
        pub fn dragStateDidChange(&self, drag_state: UICollectionViewCellDragState);

        #[cfg(feature = "UIBackgroundConfiguration")]
        /// Returns a default background configuration for the cell's style.
        /// This background configuration represents the default appearance that the cell will use.
        #[unsafe(method(defaultBackgroundConfiguration))]
        #[unsafe(method_family = none)]
        pub fn defaultBackgroundConfiguration(&self) -> Retained<UIBackgroundConfiguration>;

        #[cfg(feature = "UIBackgroundConfiguration")]
        /// Setting a background configuration supersedes the cell's backgroundView and selectedBackgroundView. The default value is nil.
        #[unsafe(method(backgroundConfiguration))]
        #[unsafe(method_family = none)]
        pub fn backgroundConfiguration(&self) -> Option<Retained<UIBackgroundConfiguration>>;

        #[cfg(feature = "UIBackgroundConfiguration")]
        /// Setter for [`backgroundConfiguration`][Self::backgroundConfiguration].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setBackgroundConfiguration:))]
        #[unsafe(method_family = none)]
        pub fn setBackgroundConfiguration(
            &self,
            background_configuration: Option<&UIBackgroundConfiguration>,
        );

        /// When YES, the cell will automatically call -updatedConfigurationForState: on its `backgroundConfiguration` when the cell's
        /// configuration state changes, and apply the updated configuration back to the cell. The default value is YES.
        #[unsafe(method(automaticallyUpdatesBackgroundConfiguration))]
        #[unsafe(method_family = none)]
        pub fn automaticallyUpdatesBackgroundConfiguration(&self) -> bool;

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

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

        /// Setter for [`backgroundView`][Self::backgroundView].
        #[unsafe(method(setBackgroundView:))]
        #[unsafe(method_family = none)]
        pub fn setBackgroundView(&self, background_view: Option<&UIView>);

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

        /// Setter for [`selectedBackgroundView`][Self::selectedBackgroundView].
        #[unsafe(method(setSelectedBackgroundView:))]
        #[unsafe(method_family = none)]
        pub fn setSelectedBackgroundView(&self, selected_background_view: Option<&UIView>);
    );
}

/// Methods declared on superclass `UIView`.
#[cfg(all(feature = "UIResponder", feature = "UIView"))]
impl UICollectionViewCell {
    extern_methods!(
        #[cfg(feature = "objc2-core-foundation")]
        #[unsafe(method(initWithFrame:))]
        #[unsafe(method_family = init)]
        pub fn initWithFrame(this: Allocated<Self>, frame: CGRect) -> 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(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;
    );
}

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