/*
 * Copyright (C) 2014 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#if PLATFORM(IOS_FAMILY)

#import <UIKit/UIAlertController.h>
#import <UIKit/UIPopoverController.h>

typedef NS_ENUM(NSInteger, WKActionSheetPresentationStyle) {
    WKActionSheetPresentAtTouchLocation,
    WKActionSheetPresentAtElementRect,
    WKActionSheetPresentAtClosestIndicatorRect
};

@protocol WKActionSheetDelegate;
@class WKContentView;

@interface WKActionSheet : UIAlertController

@property (nonatomic, assign) id <WKActionSheetDelegate> sheetDelegate;
@property (nonatomic) UIPopoverArrowDirection arrowDirections;
- (void)doneWithSheet:(BOOL)dismiss;
- (BOOL)presentSheet:(WKActionSheetPresentationStyle)style;
- (BOOL)presentSheetFromRect:(CGRect)presentationRect;
- (void)updateSheetPosition;
@end

@protocol WKActionSheetDelegate
@required
- (UIView *)hostViewForSheet;
- (CGRect)initialPresentationRectInHostViewForSheet;
- (CGRect)presentationRectForIndicatedElement;
- (CGRect)presentationRectForElementUsingClosestIndicatedRect;
- (CGRect)presentationRectInHostViewForSheet;
- (void)updatePositionInformation;
@end

#endif // PLATFORM(IOS_FAMILY)
