use super::{IKeyModifiersEventArgs, InputElement, KeyModifiers, NavigationMethod};
use crate::interactivity::{RoutedEvent, RoutedEventArgs};
use crate::{ferro_routed_event_args, Ref};
use std::cell::{Cell, RefCell};
use std::rc::Rc;
#[derive(Clone)]
pub struct FocusChangingEventArgs {
base: RoutedEventArgs,
new_focused_element: Rc<RefCell<Option<Ref<InputElement>>>>,
canceled: Rc<Cell<bool>>,
pub(crate) can_cancel_or_redirect_focus: bool,
pub old_focused_element: Option<Ref<InputElement>>,
pub navigation_method: NavigationMethod,
pub key_modifiers: KeyModifiers,
}
ferro_routed_event_args!(FocusChangingEventArgs: RoutedEventArgs);
impl FocusChangingEventArgs {
pub fn new<T: ?Sized>(routed_event: &RoutedEvent<T>) -> Self {
Self {
base: RoutedEventArgs::with_event(routed_event),
new_focused_element: Rc::new(RefCell::new(None)),
canceled: Rc::new(Cell::new(false)),
can_cancel_or_redirect_focus: false,
old_focused_element: None,
navigation_method: NavigationMethod::Unspecified,
key_modifiers: KeyModifiers::NONE,
}
}
pub fn new_focused_element(&self) -> Option<Ref<InputElement>> {
self.new_focused_element.borrow().clone()
}
pub(crate) fn set_new_focused_element(&self, value: Option<Ref<InputElement>>) {
let old = self.new_focused_element.replace(value);
drop(old);
}
pub fn canceled(&self) -> bool {
self.canceled.get()
}
pub fn try_cancel(&self) -> bool {
self.canceled.set(self.can_cancel_or_redirect_focus);
self.canceled.get()
}
pub fn try_set_new_focused_element(&self, input_element: Option<&Ref<InputElement>>) -> bool {
if self.can_cancel_or_redirect_focus {
self.set_new_focused_element(input_element.cloned());
}
input_element == self.new_focused_element.borrow().as_ref()
}
}
impl IKeyModifiersEventArgs for FocusChangingEventArgs {
fn key_modifiers(&self) -> KeyModifiers {
self.key_modifiers
}
}