@@ -539,9 +539,16 @@ impl PlatformNode {
539539 {
540540 self . node
541541 . map ( |node| f ( ResolvedPlatformNode :: new ( node, self . hwnd ) ) )
542- . unwrap_or_else ( || Err ( Error :: new ( HRESULT ( UIA_E_ELEMENTNOTAVAILABLE ) , "" . into ( ) ) ) )
542+ . unwrap_or_else ( || {
543+ Err ( Error :: new (
544+ HRESULT ( UIA_E_ELEMENTNOTAVAILABLE as i32 ) ,
545+ "" . into ( ) ,
546+ ) )
547+ } )
543548 }
549+ }
544550
551+ impl IRawElementProviderSimple_Impl for PlatformNode {
545552 fn ProviderOptions ( & self ) -> Result < ProviderOptions > {
546553 // We don't currently have to resolve the node to implement this.
547554 // But we might have to in the future. So to avoid leaking
@@ -552,7 +559,7 @@ impl PlatformNode {
552559 self . resolve ( |resolved| Ok ( resolved. provider_options ( ) ) )
553560 }
554561
555- fn GetPatternProvider ( & mut self , pattern_id : i32 ) -> Result < IUnknown > {
562+ fn GetPatternProvider ( & self , pattern_id : i32 ) -> Result < IUnknown > {
556563 let provider = self . resolve ( |resolved| Ok ( resolved. pattern_provider ( pattern_id) ) ) ?;
557564 provider. map_or_else ( || Err ( Error :: OK ) , Ok )
558565 }
@@ -567,7 +574,9 @@ impl PlatformNode {
567574 fn HostRawElementProvider ( & self ) -> Result < IRawElementProviderSimple > {
568575 self . resolve ( |resolved| resolved. host_provider ( ) )
569576 }
577+ }
570578
579+ impl IRawElementProviderFragment_Impl for PlatformNode {
571580 fn Navigate ( & self , direction : NavigateDirection ) -> Result < IRawElementProviderFragment > {
572581 self . resolve ( |resolved| match resolved. navigate ( direction) {
573582 Some ( result) => Ok ( result. downgrade ( ) . into ( ) ) ,
@@ -598,14 +607,14 @@ impl PlatformNode {
598607 } )
599608 }
600609
601- fn FragmentRoot ( & mut self ) -> Result < IRawElementProviderFragmentRoot > {
610+ fn FragmentRoot ( & self ) -> Result < IRawElementProviderFragmentRoot > {
602611 enum FragmentRootResult {
603- This ,
612+ This ( PlatformNode ) ,
604613 Other ( PlatformNode ) ,
605614 }
606615 let result = self . resolve ( |resolved| {
607616 if resolved. node . is_root ( ) {
608- Ok ( FragmentRootResult :: This )
617+ Ok ( FragmentRootResult :: This ( resolved . downgrade ( ) ) )
609618 } else {
610619 let root = resolved. node . tree_reader . root ( ) ;
611620 Ok ( FragmentRootResult :: Other (
@@ -614,11 +623,13 @@ impl PlatformNode {
614623 }
615624 } ) ?;
616625 match result {
617- FragmentRootResult :: This => Ok ( self . into ( ) ) ,
626+ FragmentRootResult :: This ( node ) => Ok ( node . into ( ) ) ,
618627 FragmentRootResult :: Other ( node) => Ok ( node. into ( ) ) ,
619628 }
620629 }
630+ }
621631
632+ impl IRawElementProviderFragmentRoot_Impl for PlatformNode {
622633 fn ElementProviderFromPoint ( & self , x : f64 , y : f64 ) -> Result < IRawElementProviderFragment > {
623634 self . resolve ( |resolved| {
624635 let point = Point :: new ( x, y) ;
@@ -707,12 +718,6 @@ macro_rules! patterns {
707718 } ) *
708719 }
709720 }
710- $( #[ allow( non_snake_case) ]
711- impl paste! { [ < $base_pattern_id Provider >] } {
712- $( fn $base_property_id( & self ) -> Result <$com_type> {
713- self . 0 . resolve( |resolved| Ok ( resolved. $getter( ) . into( ) ) )
714- } ) *
715- } ) *
716721 } ;
717722}
718723
@@ -764,17 +769,22 @@ patterns! {
764769}
765770
766771#[ allow( non_snake_case) ]
767- impl ToggleProvider {
772+ impl IToggleProvider_Impl for ToggleProvider {
768773 fn Toggle ( & self ) -> Result < ( ) > {
769774 self . 0 . resolve ( |resolved| {
770775 resolved. toggle ( ) ;
771776 Ok ( ( ) )
772777 } )
773778 }
779+
780+ fn ToggleState ( & self ) -> Result < ToggleState > {
781+ self . 0
782+ . resolve ( |resolved| Ok ( resolved. toggle_state ( ) . into ( ) ) )
783+ }
774784}
775785
776786#[ allow( non_snake_case) ]
777- impl InvokeProvider {
787+ impl IInvokeProvider_Impl for InvokeProvider {
778788 fn Invoke ( & self ) -> Result < ( ) > {
779789 self . 0 . resolve ( |resolved| {
780790 resolved. invoke ( ) ;
@@ -784,8 +794,8 @@ impl InvokeProvider {
784794}
785795
786796#[ allow( non_snake_case) ]
787- impl ValueProvider {
788- fn SetValue ( & self , value : PWSTR ) -> Result < ( ) > {
797+ impl IValueProvider_Impl for ValueProvider {
798+ fn SetValue ( & self , value : & PCWSTR ) -> Result < ( ) > {
789799 self . 0 . resolve ( |resolved| {
790800 // Based on BSTR::as_wide in windows-rs
791801 let value_as_wide = if value. 0 . is_null ( ) {
@@ -799,20 +809,59 @@ impl ValueProvider {
799809 Ok ( ( ) )
800810 } )
801811 }
812+
813+ fn Value ( & self ) -> Result < BSTR > {
814+ self . 0 . resolve ( |resolved| Ok ( resolved. value ( ) . into ( ) ) )
815+ }
816+
817+ fn IsReadOnly ( & self ) -> Result < BOOL > {
818+ self . 0
819+ . resolve ( |resolved| Ok ( resolved. is_read_only ( ) . into ( ) ) )
820+ }
802821}
803822
804823#[ allow( non_snake_case) ]
805- impl RangeValueProvider {
824+ impl IRangeValueProvider_Impl for RangeValueProvider {
806825 fn SetValue ( & self , value : f64 ) -> Result < ( ) > {
807826 self . 0 . resolve ( |resolved| {
808827 resolved. set_numeric_value ( value) ;
809828 Ok ( ( ) )
810829 } )
811830 }
831+
832+ fn Value ( & self ) -> Result < f64 > {
833+ self . 0
834+ . resolve ( |resolved| Ok ( resolved. numeric_value ( ) . into ( ) ) )
835+ }
836+
837+ fn IsReadOnly ( & self ) -> Result < BOOL > {
838+ self . 0
839+ . resolve ( |resolved| Ok ( resolved. is_read_only ( ) . into ( ) ) )
840+ }
841+
842+ fn Maximum ( & self ) -> Result < f64 > {
843+ self . 0
844+ . resolve ( |resolved| Ok ( resolved. max_numeric_value ( ) . into ( ) ) )
845+ }
846+
847+ fn Minimum ( & self ) -> Result < f64 > {
848+ self . 0
849+ . resolve ( |resolved| Ok ( resolved. min_numeric_value ( ) . into ( ) ) )
850+ }
851+
852+ fn LargeChange ( & self ) -> Result < f64 > {
853+ self . 0
854+ . resolve ( |resolved| Ok ( resolved. numeric_value_jump ( ) . into ( ) ) )
855+ }
856+
857+ fn SmallChange ( & self ) -> Result < f64 > {
858+ self . 0
859+ . resolve ( |resolved| Ok ( resolved. numeric_value_step ( ) . into ( ) ) )
860+ }
812861}
813862
814863#[ allow( non_snake_case) ]
815- impl SelectionItemProvider {
864+ impl ISelectionItemProvider_Impl for SelectionItemProvider {
816865 fn Select ( & self ) -> Result < ( ) > {
817866 self . 0 . resolve ( |resolved| {
818867 resolved. select ( ) ;
@@ -834,6 +883,10 @@ impl SelectionItemProvider {
834883 } )
835884 }
836885
886+ fn IsSelected ( & self ) -> Result < BOOL > {
887+ self . 0 . resolve ( |resolved| Ok ( resolved. is_selected ( ) . into ( ) ) )
888+ }
889+
837890 fn SelectionContainer ( & self ) -> Result < IRawElementProviderSimple > {
838891 self . 0 . resolve ( |_resolved| {
839892 // TODO: implement when we work on list boxes (#23)
0 commit comments