blob: 759581889d8d4e2bfc5c83e596e33127137cb814 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import <Cocoa/Cocoa.h>
#import "flutter/shell/platform/darwin/macos/framework/Source/FlutterPlatformNodeDelegateMac.h"
#include "flutter/third_party/accessibility/ax/platform/ax_platform_node_base.h"
@class FlutterTextField;
@class FlutterTextInputPlugin;
namespace flutter {
//------------------------------------------------------------------------------
/// The ax platform node for a text field.
class FlutterTextPlatformNode : public ui::AXPlatformNodeBase {
public:
//---------------------------------------------------------------------------
/// @brief Creates a FlutterTextPlatformNode that uses a
/// FlutterTextField as its NativeViewAccessible.
/// @param[in] delegate The delegate that provides accessibility
/// data.
/// @param[in] view_controller The view_controller that is used for querying
/// the information about FlutterView and
/// FlutterTextInputPlugin.
explicit FlutterTextPlatformNode(FlutterPlatformNodeDelegate* delegate,
__weak FlutterViewController* view_controller);
~FlutterTextPlatformNode() override;
//------------------------------------------------------------------------------
/// @brief Gets the frame of this platform node relative to the view of
/// FlutterViewController. This is used by the FlutterTextField to get its
/// frame rect because the FlutterTextField is a subview of the
/// FlutterViewController.view.
NSRect GetFrame();
// |ui::AXPlatformNodeBase|
gfx::NativeViewAccessible GetNativeViewAccessible() override;
private:
FlutterTextField* appkit_text_field_;
__weak FlutterViewController* view_controller_;
//------------------------------------------------------------------------------
/// @brief Ensures the FlutterTextField is attached to the FlutterView. This
/// method returns true if the text field is succesfully attached. If
/// this method returns false, that means the FlutterTextField could not
/// be attached to the FlutterView. This can happen when the FlutterEngine
/// does not have a FlutterViewController or the FlutterView is not loaded
/// yet.
bool EnsureAttachedToView();
//------------------------------------------------------------------------------
/// @brief Detaches the FlutterTextField from the FlutterView if it is not
/// already detached.
void EnsureDetachedFromView();
};
} // namespace flutter
/**
* An NSTextField implementation that represents the NativeViewAccessible for the
* FlutterTextPlatformNode
*
* The NSAccessibility protocol does not provide full support for text editing. This
* appkit text field is used to get around this problem. The FlutterTextPlatformNode
* creates a hidden FlutterTextField, since VoiceOver only provides text editing
* announcements for NSTextField subclasses.
*
* All of the text editing events in this native text field are redirected to the
* FlutterTextInputPlugin.
*/
@interface FlutterTextField : NSTextField
/**
* Initializes a FlutterTextField that uses the FlutterTextInputPlugin as its field editor.
* The text field redirects all of the text editing events to the FlutterTextInputPlugin.
*/
- (instancetype)initWithPlatformNode:(flutter::FlutterTextPlatformNode*)node
fieldEditor:(FlutterTextInputPlugin*)plugin;
/**
* Updates the string value and the selection of this text field.
*
* Calling this method is necessary for macOS to get notified about string and selection
* changes.
*/
- (void)updateString:(NSString*)string withSelection:(NSRange)selection;
@end