+
    Qi  c                   s8   R t RtRtRtRtRt^ RIHt ^ RIt]P                  ! RR	4       ^ R
I
Ht ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIHt ^RIH t  ^RI!H"t" ^RI#H$t$  ! R R4      t%R# )RUtilities for providing app/toolkit-specific information about objects and events.z$Id$z
$Revision$z$Date$z#Copyright (c) 2010 Joanmarie Diggs.ZLGPL)CallableNAtspiz2.0)r   )debug)focus_manager)input_event_manager)messages)object_properties)script_manager)settings)settings_manager)AXComponent)AXHypertext)AXObject)AXSelection)AXTable)AXText)AXUtilities)AXValuec                   s  a  ] tR t^:t o RtRtR tV 3R lR ltV 3R lR ltV 3R lR	 lt	V 3R
 lR lt
RV 3R lR lltV 3R lR ltV 3R lR ltRV 3R lR lltRV 3R lR lltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR  ltRV 3R! lR" lltRV 3R# lR$ lltV 3R% lR& ltV 3R' lR( ltV 3R) lR* ltV 3R+ lR, ltV 3R- lR. ltV 3R/ lR0 ltV 3R1 lR2 ltV 3R3 lR4 ltV 3R5 lR6 ltV 3R7 lR8 lt V 3R9 lR: lt!RV 3R; lR< llt"RV 3R= lR> llt#RV 3R? lR@ llt$V 3RA lRB lt%V 3RC lRD lt&RE t'V 3RF lRG lt(V 3RH lRI lt)V 3RJ lRK lt*V 3RL lRM lt+RV 3RN lRO llt,RV 3RP lRQ llt-].V 3RR lRS l4       t/RV 3RT lRU llt0RV 3RV lRW llt1RV 3RX lRY llt2RV 3RZ lR[ llt3RV 3R\ lR] llt4RV 3R^ lR_ llt5V 3R` lRa lt6V 3Rb lRc lt7RV 3Rd lRe llt8RV 3Rf lRg llt9RV 3Rh lRi llt:RV 3Rj lRk llt;V 3Rl lRm lt<V 3Rn lRo lt=V 3Rp lRq lt>RV 3Rr lRs llt?RV 3Rt lRu llt@RV 3Rv lRw lltARV 3Rx lRy lltBRV 3Rz lR{ lltCRV 3R| lR} lltDRV 3R~ lR lltERV 3R lR lltFRV 3R lR lltGV 3R lR ltHRV 3R lR lltIV 3R lR ltJV 3R lR ltKV 3R lR ltLV 3R lR ltMV 3R lR ltNV 3R lR ltOV 3R lR ltPV 3R lR ltQV 3R lR ltRRV 3R lR lltSV 3R lR ltTV 3R lR ltUV 3R lR ltVV 3R lR ltWV 3R lR ltXV 3R lR ltYRV 3R lR lltZRV 3R lR llt[Rt\V t]R# )	Utilitiesr    u   ﻿c                s     Wn         RV n        R # )NN)_script_caret_context)selfZscript   &&:/usr/lib/python3.14/site-packages/orca/script_utilities.py__init__ZUtilities.__init__?   s    
 )    c                :   < V ^8  d   QhRS[ P                  RS[/#    objreturnr   
AccessibleintZformat__classdict__   "r   __annotate__Utilities.__annotate__G   s!      e.. 3 r   c                s   \         P                  ! V\        P                  4      '       g   R# \         P                  ! V4      pRV9   d#   \        VP                  R^ 4      4      ^,
          # . pTpV'       d;   \        P                  ! V4      ;p'       d   V^ ,          pVP                  V4       KB  \        V4      ^,
          # )z2Returns the node level of the specified tree item.levelr   )
r   find_ancestorr   Zis_tree_or_tree_tableZget_attributes_dictr$   getget_is_node_child_ofappendlen)r   r    attrsnodesZnodetargetss   &&    r   
node_levelZUtilities.node_levelG   s     %%c;+L+LMMI,,S1euyy!,-11;#C#CD#III1:DLL5zA~r   c                ^   < V ^8  d   QhRS[ P                  RS[S[ P                  ,          /# r   r   r#   listr%   r'   r   r(   r)   Z   s,     $ $u// $D9I9I4J $r   c                s*   \         P                  ! V4      '       g   . # \        P                  ! V4      pVf   . # \         P                  ! V4      pR\        V4      RVR.p\        P                  ! \        P                  VR4       V'       d   V# \        P                  ! VRR7      w  rVV P                  V4      p\        V^,           \        P                  ! VRR7      4       Ft  p\        P                  ! W(V4      p	\         P                  ! V	4      p
V
'       g   K:  V
^ ,          pW8X  d   VP                  V	4       K\  V P                  V4      V8:  g   Kt   M	  R\        V4      RVR.p\        P                  ! \        P                  VR4       V# )zOGets all of the objects that have RELATION_NODE_CHILD_OF pointing to this cell.SCRIPT UTILITIES:zchild nodes forzvia node-parent-ofTF)Zprefer_attributezvia node-child-of)r   is_expandedr   	get_tableZget_is_node_parent_ofr/   r   print_tokens
LEVEL_INFOget_cell_coordinatesr3   rangeget_row_countZget_cell_atr-   r.   )r   r    tabler1   tokensrowZcolr*   icellr2   Znode_ofs   &&          r   child_nodesZUtilities.child_nodesZ   sL    &&s++I!!#&=I11#6%s5z3DcK_`5++VT:L
 //eL$sQw 5 5ee TUA&&u5D!66t<GajG~T")U2 V &s5z3DcK^_5++VT:r   c                sJ   < V ^8  d   QhRS[ P                  RS[S[,          /# r   )r   r#   r6   strr%   r'   r   r(   r)      s%     7 7e.>.> 749 7r   c                sj    V P                  V4      p\        \        \        P                  V4      4      # )z9Returns a list of strings containing the details for obj.)_details_for_objectr6   mapr   get_all_text)r   r    details   && r   details_content_for_objectZ$Utilities.details_content_for_object   s,     **3/C++W566r   c                r4   r   r5   r%   r'   r   r(   r)      s,      u'7'7 DAQAQ<R r   c                sJ   \         P                  ! V4      pV'       gX   \         P                  ! V4      '       d<   \         P                  ! V4      '       d    \	        \
        P                  ! V4      4      p. pV F%  pVP                  V P                  VR 4      4       K'  	  V# )z4Return a list of objects containing details for obj.c                 s8    \         P                  ! V 4      '       * # N)r   Zis_whitespace_or_emptyx   &r   <lambda>Z/Utilities._details_for_object.<locals>.<lambda>   s    f&C&CA&F"Fr   )	r   Zget_detailsZis_toggle_buttonr8   r6   r   Ziter_childrenZextend_find_all_descendants)r   r    rI   Ztext_objectsZdetail   &&   r   rF   ZUtilities._details_for_object   s     ))#.;77<<AXAXY\A]A]811#67GF : :F!H I  r   Nc                sz   < V ^8  d   QhRS[ P                  R,          RS[S[ P                  R,          ,          /# r   r    Nr!   r5   r%   r'   r   r(   r)      s:     # #$# 
e%	&#r   c                s^  a RR.pT;'       g$    \         P                  ! 4       P                  4       pV'       g+   Rp\        P                  ! \        P
                  VR4       V# V P                  V4      pVf-   RV.p\        P                  ! \        P
                  VR4       V# \        P                  P                  \        P                  P                  \        P                  P                  .o\        P                  ! V4      pVS9   d   WB^&   M\V\        P                  P                  \        P                  P                   39   d   WB^ &   V3R lp\        P"                  ! W4      V^&   RVRV^ ,          RV^,          .p\        P                  ! \        P
                  VR4       V# )	z;Returns the frame and (possibly) the dialog containing obj.Nz@SCRIPT UTILITIES: frame_and_dialog() called without valid objectTz5SCRIPT UTILITIES: could not find top-level object forc                 s6   < \         P                  ! V 4      S9   # rL   )r   get_role)rN   dialog_roles   &r   	is_dialogZ-Utilities.frame_and_dialog.<locals>.is_dialog   s    ((+|;;r   r7   zis in framez
and dialog)r   get_managerget_locus_of_focusr   print_messager;   top_level_objectr:   r   RoleDIALOGFILE_CHOOSERALERTr   rT   FRAMEWINDOWfind_ancestor_inclusive)	r   r    Zresultsmsg	top_levelr@   rolerW   rU   s	   &&      @r   frame_and_dialogZUtilities.frame_and_dialog   sU    ,EE]..0CCETC 0 0#t<N))#.	MsSFu//>N

))5::+B+BEJJDTDTU  +<"AJ

((%***;*;<<&
< "99#IGAJ%sM71:|U\]^U_`5++VT:r   c                r   r   r   r#   boolr%   r'   r   r(   r)      s!     - -1A1A -d -r   c                .    \         P                  ! V4      # )z<Returns true if we should grab focus when setting the caret.)r   is_focusabler   r    r   r   grab_focus_when_setting_caretZ'Utilities.grab_focus_when_setting_caret   s     '',,r   c                r   r   rg   r%   r'   r   r(   r)      s%     H HU-=-= H$ Hr   c                s    \         P                  ! V4      ;'       d'    V\        P                  ! 4       P	                  4       8g  # )z?Returns true if we should grab focus before routing the cursor.)r   is_combo_boxr   rX   rY   rk   r   r   grab_focus_before_routingZ#Utilities.grab_focus_before_routing   s>     '', H H}002EEGG	Hr   c                H   < V ^8  d   QhRS[ P                  R,          RS[/# rS   rg   r%   r'   r   r(   r)      s*     	P 	PU%5%5%< 	P 	Pr   c                s    Vf$   \         P                  ! 4       P                  4       p\        P                  ! V4      '       g   R# \
        P                  ! V\        P                  4      RJ# )z3Returns True if obj is in a find-in-page container.NF)r   rX   rY   r   Zis_entryr   r+   Zis_tool_barrk   r   r   in_find_containerZUtilities.in_find_container   sR     ;++-@@BC##C((%%c;+B+BC4OOr   c                ro   )r   _rootNr!   r   r#   rE   r%   r'   r   r(   r)      s&      E,<,<t,C s r   c                    R# )zKReturns a string description of the number of find-in-page results in root.  )r   rq   r   r   get_find_results_countZ Utilities.get_find_results_count   s     r   c                r   r   rg   r%   r'   r   r(   r)      s%     ` `U-- `$ `r   c                s   \         P                  ! V4      ;'       dc    \         P                  ! V4      '       * ;'       d@    \        P                  ! VR4      '       * ;'       d    \         P
                  ! V4      '       * # )z!Returns true if obj is an anchor.Zjump)r   is_linkrj   r   
has_actionZhas_role_from_ariark   r   r   	is_anchorZUtilities.is_anchor   sq     ""3' ` `0H0H0M,M ` `&&sF33` `<G<Z<Z[^<_8_	`r   c                sP   < V ^8  d   QhRS[ P                  RS[S[S[3,          /# r   )r   r#   tuplerh   rE   r%   r'   r   r(   r)      s*     &5 &5%*:*: &5uT3Y?O &5r   c                s.   \         P                  ! 4       P                  R4      '       gW   \         P                  ! 4       P                  R4      '       g-   \         P                  ! 4       P                  R4      '       g   R# \        P                  ! V4      '       g   R# \
        P                  ! V4      '       g   R# \        P                  ! V4      '       d   R	# \         P                  ! 4       P                  R4      '       d.   \        P                  ! V\        P                  4      '       d   R
# \         P                  ! 4       P                  R4      pV\        P                  8X  d   R# V\        P                  8X  d<   V P                  V4      \         P                  ! 4       P#                  4       8X  d   R# R# V\        P$                  8X  dD   \        P&                  ! V4      p\(        P                  ! 4       P+                  4       pW48X  d   R# R# R# )zJReturns a (is-update, reason) tuple if updates to obj should be presented.ZspeakProgressBarUpdatesZbrailleProgressBarUpdatesZbeepProgressBarUpdatesZignoreStatusBarProgressBarsZprogressBarVerbosity)FzUpdates not enabled)FzIs not progress bar)FzCould not obtain value)FzHas no size)FzIs status bar descendant)TzVerbosity is all)TzVerbosity is window)Fz%Top-level object is not active window)TzVerbosity is app)FzApp is not active app)TzNot handled by any other case)r
   rX   get_settingr   Zis_progress_barr   Zget_value_as_percentr   Zhas_no_sizer   r+   Zis_status_barr	   ZPROGRESS_BAR_ALLZPROGRESS_BAR_WINDOWr[   r   get_active_windowZPROGRESS_BAR_APPLICATIONget_applicationr   Zget_active_script_app)r   r    Z	verbosityappZ
active_apprR   r   is_progress_bar_updateZ Utilities.is_progress_bar_update   s     ++-99:STT#//1==>YZZ#//1==>VWW//**3////++C0022""3'''''')556STT%%c;+D+DEE88$002>>?UV	111++444$$S)]-F-F-H-Z-Z-\\22AA999--c2C'335KKMJ //1144r   c                r4   r   r5   r%   r'   r   r(   r)     s0     	C 	C%*:*: 	CtEDTDT?U 	Cr   c                s    \         P                  ! V4      '       g   . # \         P                  p\         P                  pV P                  WV4      # )zCReturns a list of all the accessible description list terms in obj.)r   is_description_listZis_description_termrQ   )r   r    _include_exclude   &&  r   description_list_termsZ Utilities.description_list_terms  sC     ..s33I2222))#BBr   c                r   r   rg   r%   r'   r   r(   r)     s%     P PE$4$4 P Pr   c                s    \         P                  ! V4      '       g   \         P                  ! V4      '       g   R# \        P                  ! V\         P
                  4      RJ# )z0Returns true if obj is a list inside a document.FN)r   Zis_listr   r   r+   is_documentrk   r   r   is_document_listZUtilities.is_document_list  sF     ##C((K,K,KC,P,P%%c;+B+BC4OOr   c                r   r   rg   r%   r'   r   r(   r)     s%     P PU%5%5 P$ Pr   c                s    \         P                  ! V4      '       g   R# \        P                  ! V\         P                  4      RJ# )z1Returns true if obj is a panel inside a document.FN)r   Zis_panelr   r+   r   rk   r   r   is_document_panelZUtilities.is_document_panel  s6     ##C((%%c;+B+BC4OOr   c                r   r   rg   r%   r'   r   r(   r)     s"     , ,u// ,SW ,r   c                ri   )z"Returns True if obj is a document.)r   r   )r   r    Z_exclude_document_frame   &&&r   r   ZUtilities.is_document  s    
 &&s++r   c                ro   rS   rg   r%   r'   r   r(   r)   %  s&     = =u'7'7$'> =$ =r   c                s    T;'       g$    \         P                  ! 4       P                  4       pV P                  V4      RJ# )zCReturns True if obj (or the locus of focus) is in document content.N)r   rX   rY   get_document_for_objectrk   r   r   in_document_contentZUtilities.in_document_content%  s9     EE]..0CCE++C0<<r   c                sB   < V ^8  d   QhRS[ P                  R,          /# r   r!   Nr   r#   r%   r'   r   r(   r)   +  s      !1!1D!8 r   c                s   \         P                  ! 4       P                  4       p\        \	        V P
                  \        P                  ! V4      4      4      p\        \	        \        P                  V4      4      p\        V4      ^8X  d;   RV^ ,          .p\        P                  ! \        P                  VR4       V^ ,          # V P                  \         P                  ! 4       P                  4       4      pRV.pV# )zReturns the active document.z/SCRIPT UTILITIES: Active document (via embeds):Tz7SCRIPT UTILITIES: Active document (via locus of focus):)r   rX   r|   r6   Zfilterr   r   Z
get_embeds
is_showingr/   r   r:   r;   !get_top_level_document_for_objectrY   )r   windowZ	documentsr@   documents   &    r   active_documentZUtilities.active_document+  s     **,>>@ 0 0+2H2H2PQR	 6 6	BC	y>QGSTVFu//>Q<99%%'::<>KXVr   c                r   r   rg   r%   r'   r   r(   r)   ;  s%     [ [)9)9 [d [r   c                s~    V P                  V4      ;'       d&    \        P                  ! WP                   4      '       * # )z,Returns true if obj is a top-level document.)r   r   r+   rk   r   r   is_top_level_documentZUtilities.is_top_level_document;  s1     $ZZX-C-CCIYIY-Z)ZZr   c                \   < V ^8  d   QhRS[ P                  RS[ P                  R,          /# r   r    r!   Nr   r%   r'   r   r(   r)   @  s1     Q QU5E5E Q%JZJZ]aJa Qr   c                B    \         P                  ! WP                  4      # )z.Returns the top-level document containing obj.)r   rb   r   rk   r   r   r   Z+Utilities.get_top_level_document_for_object@  s     //5O5OPPr   c                r   r   r   r%   r'   r   r(   r)   E  s1     G G5+;+; G@P@PSW@W Gr   c                r   )zIReturns the nearest document ancestor of obj, or obj if it is a document.)r   rb   r   rk   r   r   r   Z!Utilities.get_document_for_objectE  s     //5E5EFFr   c                s&   < V ^8  d   QhRS[ RS[/# )r   columnr!   )r$   rE   r%   r'   r   r(   r)   K  s      s s r   c                s    \        V4      # )z4Converts a column number to a string representation.)rE   )r   r   r   r   convert_column_to_stringZ"Utilities.convert_column_to_stringK  s     6{r   c                r   r   rg   r%   r'   r   r(   r)   P  s%     	P 	P%*:*: 	Pt 	Pr   c                s    \         P                  ! V4      '       g   R# V P                  V4      pVRJ;'       d    \         P                  ! V4      '       * # )zRReturns True if obj is a text document table (i.e. not a spreadsheet or GUI table)FN)r   is_tabler   is_document_spreadsheetr   r    ZdocrJ   r   is_text_document_tableZ Utilities.is_text_document_tableP  sH    
 ##C((**3/$OO{'J'J3'O#OOr   c                r   r   rg   r%   r'   r   r(   r)   [  s%     W W 0 0 WT Wr   c                sd    \         P                  ! V4      ;'       d    V P                  V4      RJ # )z#Returns True if obj is a GUI table.N)r   r   r   rk   r   r   is_gui_tableZUtilities.is_gui_table[  s.    
 ##C(VVT-I-I#-NRV-VVr   c                r   r   rg   r%   r'   r   r(   r)   b  s!     2 2(8(8 2T 2r   c                s   \         P                  ! V4      '       d   \        P                  ! V4      '       g   R# V P	                  V4      pVf   R# \         P
                  ! V4      '       d   R# \        P                  ! V4      R8  # )z+Returns True if obj is a spreadsheet table.FTi   )r   r   r   supports_tabler   r   r   r>   r   rJ   r   is_spreadsheet_tableZUtilities.is_spreadsheet_tableb  sj    
 $$S))h.E.Ec.J.J**3/;..s33$$S)E11r   c                r   r   rg   r%   r'   r   r(   r)   r  s%     T T)9)9 Td Tr   c                    \         P                  ! V4      '       g   R# \        P                  ! WP                  4      RJ# )z7Returns true if obj is a cell in a text document table.FN)r   is_table_cell_or_headerr   r+   r   rk   r   r   is_text_document_cellZUtilities.is_text_document_cellr  s4    
 22377%%c+F+FGtSSr   c                r   r   rg   r%   r'   r   r(   r)   {  s%     J Ju// JD Jr   c                r   )z-Returns true if obj is a cell in a GUI table.FN)r   r   r   r+   r   rk   r   r   is_gui_cellZUtilities.is_gui_cell{  s4    
 22377%%c+<+<=TIIr   c                r   r   rg   r%   r'   r   r(   r)     s%     R Ru'7'7 RD Rr   c                r   )z5Returns true if obj is a cell in a spreadsheet table.FN)r   r   r   r+   r   rk   r   r   is_spreadsheet_cellZUtilities.is_spreadsheet_cell  s4    
 22377%%c+D+DETQQr   c                b   < V ^8  d   QhRS[ P                  RS[ P                  R,          RS[/# r   rC   
prior_cellNr!   rg   r%   r'   r   r(   r)     s:     % %% $$t+% 
	%r   c                s    \         P                  ! V4      ^,          pVR8X  d   R# Vf*   \        P                  ! 4       P	                  4       w  rEW58g  # \         P                  ! V4      ^,          pW58g  # )z@Returns True if the column of cell has changed since prior_cell.Fr   r   r<   r   rX   Zget_last_cell_coordinates)r   rC   r   r   Z	_last_rowZlast_column   &&&   r   cell_column_changedZUtilities.cell_column_changed  sn     --d3A6R<%2%>%>%@%Z%Z%\"I $$ "66zB1EK$$r   c                r   r   rg   r%   r'   r   r(   r)     s:       $$t+ 
	r   c                s    \         P                  ! V4      ^ ,          pVR8X  d   R# Vf*   \        P                  ! 4       P	                  4       w  rEW48g  # \         P                  ! V4      ^ ,          pW48g  # )z=Returns True if the row of cell has changed since prior_cell.Fr   r   )r   rC   r   rA   Zlast_rowZ_last_columnr   r   cell_row_changedZUtilities.cell_row_changed  sl     **403"9%2%>%>%@%Z%Z%\"H  33J?BHr   c                r   )r   r    previous_objectNr!   rg   r%   r'   r   r(   r)     s?     X XX ))D0X 
	Xr   c                sV   \         P                  ! 4       P                  4       '       d   R# V P                  P	                  4       P                  4       '       d   R# V P                  W4      '       g   R# \        P                  ! V4      pVf   R# V P                  V4      '       g%   \        P                  ! 4       P                  R4      # V P                  V4      '       d%   \        P                  ! 4       P                  R4      # \        P                  ! 4       P                  R4      # )z9Returns True if we should present the full row in speech.FZreadFullRowInGUITableZreadFullRowInSpreadSheetZreadFullRowInDocumentTable)r   rX   Z
in_say_allr   Zget_table_navigatorZ'last_input_event_was_navigation_commandr   r   r9   r   r
   r{   r   )r   r    r   r?      &&& r   should_read_full_rowZUtilities.should_read_full_row  s     $$&1133<<++-UUWW$$S::!!#&=++E22#//1==>UVV$$U++#//1==>XYY++-99:VWWr   c                r   r   rr   r%   r'   r   r(   r)     s!        E,<,<    r   c           
     s&   \         P                  ! V4      '       g   R# . p\        P                  ! V4      pV'       d   VP	                  V4       V P                  V4      pV'       d   WB9  d   VP	                  V4       MLRP                  \        R V P                  VR^4      4      4      pV'       d   WR9  d   VP	                  V4       \        P                  ! V4      pV'       d   Wb9  d   VP	                  V4       RP                  V4      # )z@Returns a string containing the content of the notification obj.rt    c                 j    \         P                  ! V 4      ;'       g    \        P                  ! V 4      # rL   )r   rH   r   get_namerM   rO   r   rP   Z4Utilities.get_notification_content.<locals>.<lambda>  s&    F,?,?,B,Z,ZhFWFWXYFZ,Zr   F)
r   Zis_notificationr   r   r.   expand_eocsjoinrG   unrelated_labelsZget_description)r   r    r@   nametextlabelsZdescriptions   &&     r   get_notification_contentZ"Utilities.get_notification_content  s     **3//  %MM$$D&MM$XXc"Z"&"7"7UA"FH IF&.f%..s3;4MM+&xxr   c                r   r   rg   r%   r'   r   r(   r)     s!     ( (5++ ( (r   c                ri   )zReturns True if obj is a link.)r   rw   rk   r   r   rw   ZUtilities.is_link  s     ""3''r   c                s    V P                   P                  pR pV F  pVR8X  d   K   W$,          pK  	  TpV#   \        \        \        3 d      T# i ; ir   )r   r~   Z
IndexErrorZ	TypeErrorZAttributeError)r   ZpathstartrvZprR   r   _get_object_from_pathZUtilities._get_object_from_path  sf       ABw	  B	 	>:  	s   8AAc                r   r   r   r%   r'   r   r(   r)     s,      U%5%5 %:J:JT:Q r   c                s    \         P                  ! V4      '       d   R# \        P                  ! V4      '       g   V# \         P                  ! V4      '       d   V# R p\         P
                  ! W4      pVe   V# V# )z:Legacy table-cell code originally for managed descendants.Nc                 r   rL   )r   r   r   rH   rM   rO   r   predZ)Utilities.active_descendant.<locals>.pred
  s&    $$Q'AA6+>+>q+AAr   )r   Zis_deadr   is_table_cellr   find_descendant)r   r    r   childr   r   active_descendantZUtilities.active_descendant  sl    
 C  ((--JS!!J	B ((3L
r   c                sD   < V ^8  d   QhRS[ S[P                  ,          /# r   r!   )r6   r   r\   r%   r'   r   r(   r)     s      $uzz"2 r   c                s   \         P                  P                  \         P                  P                  \         P                  P                  \         P                  P
                  \         P                  P                  .pV# rL   )r   r\   r]   r^   r`   ra   r_   )r   Zroless   & r   _top_level_rolesZUtilities._top_level_roles  sQ    ""((!!""!!	#
 r   c                r   )r   r   r!   Nr   r%   r'   r   r(   r)     s-      53C3C HXHX[_H_ r   c                s  a \         P                  ! S4      pVf   R# \        \        P                  ! V4      4       F  p\        P
                  ! W#4      p\        P                  ! VV3R l4      e1   RVRS.p\        P                  ! \        P                  VR4       Vu # RVRS.p\        P                  ! \        P                  VR4       K  	  R# )z:A terrible, non-performant workaround for broken ancestry.Nc                 s   < V S8H  # rL   ru   )rN   r   rV   r   rP   Z9Utilities._find_window_witih_descendant.<locals>.<lambda>%  s	    !u*r   r7   ZcontainsTzdoes not contain)
r   r}   r=   r   get_child_countZ	get_childr   r   r:   r;   )r   r   r~   rB   r   r@   s   &f    r   _find_window_witih_descendantZ'Utilities._find_window_witih_descendant  s     ))%0;x//45A''/F''0DEQ-vz5I""5#3#3VTB)63EuMFu//> 6 r   c                r   r   rg   r%   r'   r   r(   r)   /  s%     V V(8(8 VT Vr   c                s    \         P                  ! V4      V P                  4       9   ;'       dF    \         P                  ! \         P                  ! V4      4      \        P
                  P                  8H  # rL   )r   rT   r   
get_parentr   r\   ZAPPLICATIONrk   r   r   _is_top_level_objectZUtilities._is_top_level_object/  sX      %)>)>)@@ V V!!("5"5c":;uzz?U?UU	Vr   c                sb   < V ^8  d   QhRS[ P                  RS[RS[ P                  R,          /# )r   r    use_fallback_searchr!   Nrg   r%   r'   r   r(   r)   3  s:       " 
		D	 	r   c                s(   \         P                  ! WP                  4      pRVRV.p\        P                  ! \        P
                  VR4       VfB   V'       d:   Rp\        P                  ! \        P
                  VR4       V P                  V4      pV# )z@Returns the top-level object (frame, dialog ...) containing obj.r7   zis top-level object for:TzISCRIPT UTILITIES: Attempting to find top-level object via fallback search)r   rb   r   r   r:   r;   rZ   r   )r   r    r   r   r@   rc   r   r   r[   ZUtilities.top_level_object3  s{     --c3L3LM%r+EsK5++VT::-]C 0 0#t<33C8B	r   c                ro   rS   rg   r%   r'   r   r(   r)   E  s+     L L%:J:JT:Q L]a Lr   c                s   T;'       g$    \         P                  ! 4       P                  4       pV P                  V4      pV'       g   R# \        P
                  ! VRR4       \        P                  ! V4      '       d   \        P                  ! V4      '       d   R# V\         P                  ! 4       P                  4       8H  # )zRReturns true if the top-level object for obj/locus-of-focus is active and current.Fz#Ensuring we have the correct state.)
r   rX   rY   r[   r   Zclear_cacher   Z	is_activeZ
is_defunctr|   )r   r    rd   rJ   r   &top_level_object_is_active_and_currentZ0Utilities.top_level_object_is_active_and_currentE  s     EE]..0CCE))#.	Y/TU$$Y//;3I3I)3T3TM557IIKKKr   c                sL   < V ^8  d   QhRS[ S[,          RS[ S[,          RS[/# )r   path1path2r!   )r6   r$   r%   r'   r   r(   r)   U  s*      tCy c s r   c                sX   W8X  d   ^ # \        \        V 4      \        V4      4      pV R.V,          ,           RV p VR.V,          ,           RV p\        \        \        V 4      \        V4      4      4       F0  pW,          W,          8  d   Ru # W,          W,          8  g   K/   ^# 	  ^ # )zMReturns -1, 0, or 1 to indicate if path1 is before, the same, or after path2.Nr   )maxr/   r=   min)r   r   ZsizerN   r   r   path_comparisonZUtilities.path_comparisonT  s     >3u:s5z*"$et,"$et,s3u:s5z23Ax%("	x%("	 4 r   c          	      s   < V ^8  d   QhRS[ P                  R,          RS[S[ P                  .S[3,          R,          RS[S[ P                  .S[3,          R,          RS[S[ P                  ,          /# )r   rootN
include_if
exclude_ifr!   )r   r#   r   rh   r6   r%   r'   r   r(   r)   i  s     K K%K e../56=K e../56=	K
 
e	Kr   c                s    Vf   . # \         P                  ! V4      '       d-   RV.p\        P                  ! \        P                  VR4       . # \
        P                  ! WV4      # )Nz7SCRIPUT UTILITIES: Returning 0 descendants for pre/codeT)r   Zis_coder   r:   r;   r   Zfind_all_descendants)r   r   r   r   r@      &&&& r   rQ   ZUtilities._find_all_descendantsi  s\     <I t$$OQUVFu//>I,,TzJJr   c          	      sx   < V ^8  d   QhRS[ P                  R,          RS[RS[RS[S[ P                  ,          /# )r   r   Nonly_showingminimum_wordsr!   )r   r#   rh   r$   r6   r%   r'   r   r(   r)   |  sU     EE EE%EE EE 	EE
 
e	EEr   c                sv  aaa V P                   P                  '       d.   V P                   P                  P                  V4      '       d   . # \        P                  P
                  \        P                  P                  .o\        P                  P                  \        P                  P                  \        P                  P                  \        P                  P                  \        P                  P                  \        P                  P                  \        P                  P                  \        P                  P                  \        P                  P                  \        P                  P                   \        P                  P"                  \        P                  P$                  \        P                  P&                  \        P                  P(                  \        P                  P*                  \        P                  P,                  \        P                  P.                  \        P                  P0                  \        P                  P2                  \        P                  P4                  \        P                  P6                  .o\8        P:                  ! V4      S9   d   . # VV3R lpVV3R lpV P=                  WV4      p\8        P>                  ! V4      p. pV F  p	\8        P>                  ! V	4      ;'       g    \@        PB                  ! V	4      p
V
'       d3   W\8        P>                  ! \8        PD                  ! V	4      4      39   d   Kq  \G        V
PI                  4       4      V8  d   K  VPK                  V
4      ^ 8  d   K  VPM                  V	4       K  	  \N        PP                  ! V4      # )z:Returns a list of labels in root that lack a relationship.c                 s   < V '       d   \         P                  ! V 4      S9   g   R # \        P                  ! V 4      '       g   R # S'       d   \        P                  ! V 4      '       g   R # R# )FT)r   rT   r   Zobject_is_unrelatedr   )rN   label_rolesr      &r   r   Z,Utilities.unrelated_labels.<locals>._include  sH    (++A.+=22155K$:$:1$=$=r   c                 s   < V '       d   \         P                  ! V 4      S9   d   R # S'       d   \        P                  ! V 4      '       g   R # R# )TF)r   rT   r   r   )rN   r   
skip_rolesr   r   r   Z,Utilities.unrelated_labels.<locals>._exclude  s4    ))!,
:K$:$:1$=$=r   ))r   Z
spellcheckZis_spell_check_windowr   r\   ZLABELZSTATICZ	COMBO_BOXZDOCUMENT_EMAILZDOCUMENT_FRAMEZDOCUMENT_PRESENTATIONZDOCUMENT_SPREADSHEETZDOCUMENT_TEXTZDOCUMENT_WEBr`   LIST_BOXLIST	LIST_ITEMZMENUZMENU_BARZPUSH_BUTTONZSCROLL_PANEZ
SPLIT_PANETABLEZTOGGLE_BUTTONTREE
TREE_TABLEra   r   rT   rQ   r   r   rH   r   r/   splitZfindr.   r   Zsort_objects_by_position)r   r   r   r   r   r   r   Z	root_nameZlabels_filteredZlabelr   r   r   s   &&f&       @@r   r   ZUtilities.unrelated_labels|  sS    <<"""t||'>'>'T'TUY'Z'ZIzz''):):;jj**jj//jj//jj66jj55jj..jj--jj&&jj))jjoojj**jjoojj))jj,,jj,,jj++jj&&jj..jjoojj++jj''))
, T"j0I		 ++DHE%%d+	 E$$U+IIv/B/B5/IDH,=,=h>Q>QRW>X,Y ZZ4::< =0~~d#q(""5)  33ODDr   c                   < V ^8  d   QhRS[ P                  RS[ P                  R,          RS[ P                  R,          /# r   r    restrict_toNr!   r   r%   r'   r   r(   r)     sE       %%, 
		D	 	r   c                T   Vf   V P                  V4      p\        P                  ! V4      pRVRVR.p\        P                  ! \        P
                  VR4       VeL   \        P                  ! W2R4      '       g/   RVRV.p\        P                  ! \        P
                  VR4       R# V# )z!Finds the object before this one.Nz%SCRIPT UTILITIES: Previous object foris.Tr7   is not a descendant of)r   r   Zget_previous_objectr   r:   r;   r   is_ancestorr   r    r   resultr@      &&&  r   find_previous_objectZUtilities.find_previous_object  s     @@EK00593fcR5++VT:"8+?+?UY+Z+Z)63K[YFu//>r   c                r   r   r   r%   r'   r   r(   r)     sE       %%, 
		D	 	r   c                r   )z Finds the object after this one.Nz!SCRIPT UTILITIES: Next object forr   r   Tr7   r   )r   r   Zget_next_objectr   r:   r;   r   r   r   r   r   find_next_objectZUtilities.find_next_object  s     @@EK,,S15sD&#N5++VT:"8+?+?UY+Z+Z)63K[YFu//>r   c                sF   < V ^8  d   QhRS[ P                  RS[RS[RS[/# r   r    start_offset
end_offsetr!   )r   r#   r$   rE   r%   r'   r   r(   r)     s9     ( (( ( 	(
 
(r   c           	     s   \         P                  ! WV4      pRV9  d   V# \        P                  P                  \        P                  P
                  \        P                  P                  \        P                  P                  \        P                  P                  \        P                  P                  \        P                  P                  \        P                  P                  .p\        V4      p\        V4       Fl  w  rxVR8X  g   K  \        P                  ! WV,           4      p	V P!                  V	4      p
V	'       d%   \"        P$                  ! V	4      V9   d
   V
R,          p
WV&   Kn  	  RP'                  V4      p
RVRV RV RV
 R2.p\(        P*                  ! \(        P,                  VR	4       RV
9   d+   R
p\(        P.                  ! \(        P,                  VR	4       R# V
# )zPExpands the current object replacing embedded object characters with their text.   ￼r   rt   z#SCRIPT UTILITIES: Expanded EOCs forzrange: Z:z: ''Tz'SCRIPT UTILITIES: Unable to expand EOCs)r   get_substringr   r\   ZHEADINGr   r   Z	PARAGRAPHZSECTIONr   
TABLE_CELL	TABLE_ROWr6   Z	enumerater   find_child_at_offsetr   r   rT   r   r   r:   r;   rZ   )r   r    r   r   r   Zblock_rolesZto_buildrB   charr   r   r@   rc      &&&&         r   r   ZUtilities.expand_eocs  sx    ##CzB4Kzz))jjoojj**jj**jj((jj&&jj++jj**, : *GAx#88,>NO))%0X..u5DcMF$ + "7<.*SBD5++VT:v;C 0 0#t<r   c          	      s   < V ^8  d   QhRS[ P                  RS[S[S[ P                  S[S[S[3,          ,          R,          RS[/# )r   r    contentsNr!   )r   r#   r6   rz   r$   rE   rh   r%   r'   r   r(   r)     sM       uU--sC<=>E 
	r   c                s    V'       g   R# \         P                  ! V4      '       g   R# V F+  w  r4rV\         P                  ! V4      pVf   K"  W9   g   K*   R# 	  R# )z9Returns True of obj is an error message for the contents.FT)r   Zget_is_error_forZget_error_message)r   r    r   ZaccZ_startZ_endZ_stringr2   s   &&&     r   is_error_for_contentsZUtilities.is_error_for_contents  sO     ++C00*2&C!33C8G"s~ +3
 r   c                r   r   eventr!   r   EventrE   r%   r'   r   r(   r)   (  s      %++ # r   c                s    VP                   # )zOTries to determine the real deleted text for the given event. Because app bugs.)any_datar   r   r   r   deleted_textZUtilities.deleted_text(  s     ~~r   c                r   r   r   r%   r'   r   r(   r)   -  s      5;; 3 r   c                s   VP                   '       d   VP                   # Rp\        P                  ! \        P                  VR4       \        P
                  ! VP                  4      '       d]   \        P                  ! VP                  4      pV'       d5   RVR.p\        P                  ! \        P                  VR4       VR,          # Rp\        P                  ! \        P                  VR4       R# )zPTries to determine the real inserted text for the given event. Because app bugs.z-SCRIPT UTILITIES: Broken text insertion eventTzHACK: Returning last char in 'r   z3FAIL: Unable to correct broken text insertion eventrt   r   )
r   r   rZ   r;   r   Zis_password_textsourcer   rH   r:   )r   r   rc   stringr@   rR   r   inserted_textZUtilities.inserted_text-  s     >>>>>!=E,,c48''55((6F:FCH""5#3#3VTBbz!CE,,c48r   c                sF   < V ^8  d   QhRS[ P                  R,          RR/# )r   r   Nr!   r   r%   r'   r   r(   r)   A  s*     ) )""T)) 
)r   c                s    RV n         R# )zClears the caret context.Nr   r   )r   r   r   r   clear_caret_contextZUtilities.clear_caret_contextA  s     )r   c                st   < V ^8  d   QhRS[ P                  R,          RS[RS[ P                  R,          RR/# )r   r    Noffsetr   r!   r"   r%   r'   r   r(   r)   J  sI     	, 	,$	, 	, ""T)		,
 
	,r   c                s    W3V n         R# )z4Sets the caret context in document to (obj, offset).Nr  )r   r    r  r   s   &&&&r   set_caret_contextZUtilities.set_caret_contextJ  s      #mr   c          
      s~   < V ^8  d   QhRS[ P                  R,          RS[RS[RS[S[ P                  S[3,          /# )r   r   Nget_replicantsearch_if_neededr!   )r   r#   rh   rz   r$   r%   r'   r   r(   r)   U  sN      ""T)  	
 
u$	%r   c                sL   V P                   w  rEVe.   RWE.p\        P                  ! \        P                  VR4       WE3# \        P
                  ! 4       P                  4       p\        P                  ! V4      pRWE.p\        P                  ! \        P                  VR4       WE3# )zAReturns an (obj, offset) tuple representing the current location.z0SCRIPT UTILITIES: Returning cached caret contextTz0SCRIPT UTILITIES: Returning focus + caret offset)	r   r   r:   r;   r   rX   rY   r   get_caret_offset)r   r   r  r  r    r  r@      &&&&   r   get_caret_contextZUtilities.get_caret_contextU  s     ))?H#VFu//>;'')<<>((-DcR5++VT:{r   c                sf   < V ^8  d   QhRS[ P                  RS[RS[ P                  R,          RR/# )r   r    r  r   Nr!   r"   r%   r'   r   r(   r)   i  sJ     N NN N ""T)	N
 
Nr   c           	     s   \         P                  ! 4       pVP                  RVR4       V P                  V4      '       d   \        P
                  ! V4       \        P                  ! V4       V P                  W4       VP                  W4       V P                  W4       \        ^ \        V\        P                  ! V4      ^,
          4      4      pV P                  P                  4       P!                  W4       R# )zESets the locus of focus to obj and sets the caret position to offset.NF)r   rX   set_locus_of_focusrl   r   Z
grab_focusr   Zclear_all_selected_textset_caret_offsetZset_last_cursor_positionr  r   r   get_character_countr   Zget_event_synthesizerZscroll_into_view)r   r    r  r   managerZ	scroll_to   &&&&  r   set_caret_positionZUtilities.set_caret_positioni  s      ++-""4e4--c22$
 	&&s+c* 	((5s+3vv'A'A#'F'JKL	**,==cMr   c                s>   < V ^8  d   QhRS[ P                  RS[RR/# )r   r    r  r!   Nr"   r%   r'   r   r(   r)     s/     - -- - 
	-r   c                s2    \         P                  ! W4       R# )z$Sets the caret offset via AtspiText.N)r   r  )r   r    r  r   r   r  ZUtilities.set_caret_offset  s     	,r   c                sx   < V ^8  d   QhRS[ P                  RS[RS[RS[S[S[S[S[S[S[3,          ,          /# r   r    r   endr!   r   r#   r$   r6   rz   rE   r%   r'   r   r(   r)     sN        	
 
eCc3+,	-r   c                s    . pV P                  WV4      pV FX  w  rgrW'8  d   K  W68:  d    V# \        W&4      p\        W74      p\        P                  ! WV4      p
VP                  WgWV	34       KZ  	  V# )zAReturns a list of (start, end, string, language, dialect) tuples.)-get_language_and_dialect_from_text_attributesr   r   r   r   r.   )r   r    r   r  r   all_substringsr   r   languagedialectr   s   &&&&       r   split_substring_by_languageZ%Utilities.split_substring_by_language  s     46KKCX[\;I7Lh"" 	 u3LS-J))#ZHFII|7KL <J 	r   c          
      s\   < V ^8  d   QhRS[ P                  RS[RS[RS[S[S[3,          /# r  r   r#   r$   rz   rE   r%   r'   r   r(   r)     sA         
sCx	r   c                sh    V P                  WV4      pV F  w  rVrxWR8:  g   K  Wc8  g   K  Wx3u # 	  R# )zReturns a (language, dialect) tuple. If multiple languages apply to
the substring, language and dialect will be empty strings. Callers must
do any preprocessing to avoid that condition.)rt   rt   )r  )	r   r    r   r  r  r   r   r  r  s	   &&&&     r   &get_language_and_dialect_for_substringZ0Utilities.get_language_and_dialect_for_substring  sB     KKCX[\;I7Lh$):(( <J r   c                st   < V ^8  d   QhRS[ P                  RS[RS[RS[S[S[S[S[S[3,          ,          /# r   r  r%   r'   r   r(   r)     sL        	
 
eCc3&'	(r   c                s4   . p\         P                  ! WV4      pR;rgV Fu  w  rp
V
P                  RR4      pRpRV9   d   VP                  R^4      w  rV'       d$   Wk8X  d   W|8X  d   VR,          ^ ,          WV3VR&   MVP	                  WW34       YrvKw  	  V# )zAReturns a list of (start, end, language, dialect) tuples for obj.rt   r  -r   )r   Zget_all_text_attributesr,   r   r.   )r   r    r   r   r   Zattribute_setZlast_languageZlast_dialectr   r  r0   r  r  r   r   r  Z7Utilities.get_language_and_dialect_from_text_attributes  s     /166s*U'))#0UyyR0HGh$,NN3$:!m/L4KBC7:2		5x9:*2< $1 	r   c                   < V ^8  d   QhRS[ P                  RS[RS[RS[S[S[ P                  S[S[S[3,          ,          /# r   r    r  	use_cacher!   r   r#   r$   rh   r6   rz   rE   r%   r'   r   r(   r)     R     	) 	)	) 	) 		)
 
eE$$c334	5	)r   c                >    \         P                  ! W4      w  rEpWWd3.# )zJReturns a list of (obj, start, end, string) tuples for the word at offset.)r   get_word_at_offsetr   r    r  r  r   r   r  r  r   get_word_contents_at_offsetZ%Utilities.get_word_contents_at_offset  s'     "44SASS'((r   c                   < V ^8  d   QhRS[ P                  R,          RS[RS[R,          RS[RS[S[S[ P                  S[S[S[3,          ,          /# r   r    Nr  layout_moder  r!   r  r%   r'   r   r(   r)     e     ! !$! ! D[	!
 ! 
eE$$c334	5!r   c                sN   Vf   V P                  4       w  rVR8X  d   \        P                  ! V4      p\        P                  ! W4      w  rVpV'       d   WWu3.# \        P                  ! W4      w  rp
V	'       g&   V P                  V^ 4      w  rV P                  W4      # V^ ^ R3.# )zIReturns a list of (obj, start, end, string) tuples for the previous line.rt   r   )r	  r   r  Zget_previous_lineget_line_at_offsetprevious_contextget_line_contents_at_offset)r   r    r  r&  r  r   r   r  
_this_lineZ
this_startZ	_this_endprev_objprev_offset   &&&&&        r   get_previous_line_contentsZ$Utilities.get_previous_line_contents  s     ;002KCR<,,S1F!33C@S+,,,2,E,Ec,R)
	$($9$9#q$A!H33HJJaB  r   c                s   < V ^8  d   QhRS[ P                  RS[RS[R,          RS[RS[S[S[ P                  S[S[S[3,          ,          /# )r   r    r  r&  Nr  r!   r  r%   r'   r   r(   r)     s`     
) 
)
) 
) D[	
)
 
) 
eE$$c334	5
)r   c                s>    \         P                  ! W4      w  rVpWWu3.# )zJReturns a list of (obj, start, end, string) tuples for the line at offset.)r   r(  )r   r    r  r&  r  r   r   r     &&&&&   r   r*  Z%Utilities.get_line_contents_at_offset  s'     "44SASS'((r   c                r$  r%  r  r%   r'   r   r(   r)      r'  r   c                sr   Vf   V P                  4       w  rVR8X  d   \        P                  ! V4      p\        P                  ! W4      w  rVpV'       d   WWu3.# \        P                  ! W4      w  rp
V
\        P
                  ! V4      8X  d%   V P                  W4      w  rV P                  W4      # V^ ^ R3.# )zEReturns a list of (obj, start, end, string) tuples for the next line.rt   r   )r	  r   r  Zget_next_liner(  r  next_contextr*  )r   r    r  r&  r  r   r   r  r+  Z_this_startZthis_endnext_objnext_offsetr.  r   get_next_line_contentsZ Utilities.get_next_line_contents   s     ;002KCR<,,S1F!//<S+,,,2,E,Ec,R)
v11#66$($5$5c$D!H33HJJaB  r   c                r  r  r  r%   r'   r   r(   r)     sR     	+ 	+	+ 	+ 		+
 
eE$$c334	5	+r   c                sN    \         P                  ! V4      pV^ \        V4      V3.# )zLReturns a list of (obj, start, end, string) tuples for the object at offset.)r   rH   r/   )r   r    r  r  r   r   r   get_object_contents_at_offsetZ'Utilities.get_object_contents_at_offset  s*     ""3'aTD)**r   c                r  r  r  r%   r'   r   r(   r)   %  r  r   c                r   )z7Returns the sentence contents for the specified offset.)r   Zget_sentence_at_offsetr"  r  r   get_sentence_contents_at_offsetZ)Utilities.get_sentence_contents_at_offset%  s'     "88ESS'((r   c                   < V ^8  d   QhRS[ P                  R,          RS[RS[RS[ P                  R,          RS[S[ P                  R,          S[3,          /# r   r    Nr  
skip_spacer   r!   r   r#   r$   rh   rz   r%   r'   r   r(   r)   0  sh      $  	
 %%, 
u$&+	,r   c                s   Vf   V P                  4       w  rV^,
          pV'       dd   \        P                  ! W4      ^ ,          pV'       d?   VP                  4       '       d)   V^,          p\        P                  ! W4      ^ ,          pKF  V^ 8  d   W3# V P	                  W4      ;p'       dW   Wq8w  d)   \        P
                  ! V4      '       g   V'       g   V^ 3# \        P
                  ! V4      pV P                  WxW44      # R# )zEReturns the previous viable/valid caret context given obj and offset.r   )r	  r   get_character_at_offsetisspacer   r  r)  )	r   r    r  r9  r   r-  r   r,  Zlengths	   &&&&&    r   r)  ZUtilities.previous_context0  s     ;002KCqj11#CAFD4<<>>q 55cGJ!##00BB8Bv'A'A('K'KT^{"//9F((:SSr   c                r7  r8  r:  r%   r'   r   r(   r)   N  sh      $  	
 %%, 
u$&+	,r   c                s
   Vf   V P                  4       w  rV^,           pV'       dd   \        P                  ! W4      ^ ,          pV'       d?   VP                  4       '       d)   V^,          p\        P                  ! W4      ^ ,          pKF  V\        P                  ! V4      8:  d   W3# V P                  W4      ;p'       dB   Wq8w  d)   \        P                  ! V4      '       g   V'       g   V^ 3# V P                  VRW44      # R# )zAReturns the next viable/valid caret context given obj and offset.r   r   )r	  r   r;  r<  r  r   r1  )r   r    r  r9  r   r3  r   r2  r0  r   r1  ZUtilities.next_contextN  s     ;002KCqj11#CAFD4<<>>q 55cGJ&44S99##,,S>>8>v'A'A('K'KT^{"$$Xr:KKr   c                sj   < V ^8  d   QhRS[ P                  RS[RS[S[ P                  S[3,          /# )r   r    r  r!   )r   r#   r$   rz   r%   r'   r   r(   r)   k  s9     
 
!1!1 
3 
5IYIY[^I^C_ 
r   c                s    \         P                  ! V4      '       d   W3# \         P                  ! V\         P                  4      pVe   V^ 3# W3# )zBReturns the first viable/valid caret context given obj and offset.)r   supports_textr   )r   r    r  Z
descendantr   r   first_contextZUtilities.first_contextk  sM     !!#&&;--c83I3IJ
!q= {r   c                s   < V ^8  d   QhRS[ S[S[P                  S[S[S[3,          ,          RS[RS[ S[S[P                  S[S[S[3,          ,          /# )r   r   infer_labelsr!   )r6   rz   r   r#   r$   rE   rh   r%   r'   r   r(   r)   w  s[      uU--sC<=>  
eE$$c334	5	r   c                s    V# )zPFilters contents for presentation, removing objects that should not be included.ru   )r   r   r?  r   r    filter_contents_for_presentationZ*Utilities.filter_contents_for_presentationw  s	     r   c                sd   < V ^8  d   QhRS[ P                  RS[S[ P                  S[3,          /# )r   r   r!   )r   r#   rz   r$   r%   r'   r   r(   r)     s1      !1!1 eE<L<Lc<Q6R r   c                sV    \        ^ \        P                  ! V4      ^,
          4      pW3# )z4Returns the last viable/valid caret context in root.)r   r   r  )r   r   r  rJ   r   last_contextZUtilities.last_context  s(     Q22481<=|r   c                r4   r   r5   r%   r'   r   r(   r)     s0     6 66 
e	6r   c                s`    V P                  V4      '       d   . # \        P                  ! V4      # )z+Returns a list of selected children in obj.)r   r   Zget_selected_childrenrk   r   r   selected_childrenZUtilities.selected_children  s+     $$S))I0055r   c                r   )r   _objr!   rg   r%   r'   r   r(   r)     s%       
r   c                rs   )z&Speaks the selected cell range in obj.Fru   )r   rC  r   r   speak_selected_cell_rangeZ#Utilities.speak_selected_cell_range  s     r   c                r   r   r   r%   r'   r   r(   r)     s0     !5 !5!5 
		D	 !5r   c                sH  a V'       g   R# \         P                  ! V4      '       g   \         P                  ! V4      '       d   R# \        P                  ! V4      '       d   V# \
        P                  P                  \
        P                  P                  .\
        P                  P                  \
        P                  P                  .\
        P                  P                  \
        P                  P                  .\
        P                  P                  \
        P                  P                  \
        P                  P                  .\
        P                  P                  \
        P                  P                   \
        P                  P                  .\
        P                  P"                  \
        P                  P                   \
        P                  P                  ./pVP%                  \        P&                  ! V4      4      oV3R lp\        P(                  ! W4      # )z(Returns the selection container for obj.Nc                 sz   < S'       d   \         P                  ! V 4      S9  d   R # \         P                  ! V 4      # F)r   rT   supports_selection)rN   matching_rolesrV   r   is_matchZ3Utilities.get_selection_container.<locals>.is_match  s,    ("3"3A"6n"L..q11r   )r   Zis_paragraphis_editabler   rF  r   r\   ZCANVASZLAYERED_PANEZICONr   r   	TREE_ITEMr   r   r   r   r   r,   rT   r+   )r   r    rolemaprH  rG  s   &&  @r   get_selection_containerZ!Utilities.get_selection_container  sK     ##C((K,C,CC,H,H&&s++J JJ

 7 78JJOOejj556JJ  5::#6#6"7JJ  5::??EJJ4I4I"JJJ!!EJJ$4$4ejj6K6K#LJJ  5::#3#3UZZ5J5J"K
 !X%6%6s%;<	2
 %%c44r   c                r   r   r"   r%   r'   r   r(   r)     s%     > >> 
>r   c                s6  aa \         P                  ! V4      '       g   ^ # \         P                  ! V4      '       d#   \        P                  ! V4      p\        ^ V4      # \        P                  P                  \        P                  P                  .\        P                  P                  \        P                  P                  ./o\         P                  ! V4      oSS9  d   \         P                  ! V4      # VV3R lp\        V P                  W4      4      # )z1Returns the number of selectable children in obj.c                 sT   < \         P                  ! V 4      SP                  S4      9   # rL   )r   rT   r,   )rN   re   rK  r   r   rH  Z2Utilities.selectable_child_count.<locals>.is_match  s"    $$Q'7;;t+<<<r   )r   rF  r   r   r>   r   r   r\   r   r   r   rJ  rT   r   r/   rQ   )r   r    ZrowsrH  re   rK  s   &&  @@r   selectable_child_countZ Utilities.selectable_child_count  s     **3//""3''((-Dq$< JJ%**"6"6!7JJOOejj223

   %w++C00	= 4--c<==r   c                r   r   r"   r%   r'   r   r(   r)     s%     
9 
9
9 

9r   c                s    \         P                  ! V4      '       d   \        P                  ! V4      # \        P
                  ! V4      # )z/Returns the number of selected children in obj.)r   r   r   Zget_selected_row_countr   get_selected_child_countrk   r   r   selected_child_countZUtilities.selected_child_count  s7     ""3''11#6633C88r   c                r   r   rg   r%   r'   r   r(   r)     %       
r   c                rs   )zKReturns true if obj is a clickable element (in the web sense of that word).Fru   rk   r   r   is_clickable_elementZUtilities.is_clickable_element       r   c                r   r   rg   r%   r'   r   r(   r)     rP  r   c                rs   )z>Returns true if obj has a longdesc (deprecated web attribute).Fru   rk   r   r   has_long_descZUtilities.has_long_desc  rR  r   c                r   r   rg   r%   r'   r   r(   r)     s)     I II 
Ir   c                s    \         P                  ! VR4      ;'       g&    \         P                  ! V\        P                  4      # )zMReturns true if obj has a toggle action that is meaningful. Because app bugs.Ztoggle)r   rx   r   ZACTION_TOGGLErk   r   r   has_meaningful_toggle_actionZ&Utilities.has_meaningful_toggle_action  s=     ""31 I I""3(9(G(GH	Ir   c          	      sh   < V ^8  d   QhRS[ P                  RS[R,          RS[S[S[S[3,          /# )r   r    r  Nr!   r  r%   r'   r   r(   r)     sC     V  V V  d
V  
sC}		V r   c           	     s   Vf   \         P                  ! V4      p\         P                  ! W4      w  r4p\        P                  ! 4       P                  4       w  rgWa8w  d   W4V3# \        P                  ! 4       pVP                  4       p	VP                  4       p
\         P                  ! Wg4      w  rpV P                  P                  P                  R4      R8X  d|   V	'       d   TpTpMV
'       d   TpTp\         P                  ! WV4      pVP                  RR4      pRV RV RV RV R	2	p\        P                  ! \        P                   VR
4       W4V3# V	'       dG   TpVR,          P#                  4       '       g'   VR,          P%                  4       '       g
   V^,          pM}V
'       dv   TpW;8w  d   Yu;8  d   V8:  d   M MTpV^ 8  dT   \         P                  ! W^,
          V4      pVP#                  4       '       g    VP%                  4       '       g
   V^,
          p\         P                  ! WV4      pRV9   dH   W;8X  dB   VP'                  R4      '       d   V^,          pM VP)                  R4      '       d
   V^,          p\         P                  ! WV4      pVP                  RR4      pRV RV RV RV R	2	p\        P                  ! \        P                   VR
4       W4V3# )zDReturns the word at offset, adjusted for native navigation commands.ZlastTextUnitSpokenwordZ
z\nz*SCRIPT UTILITIES: Adjusted word at offset z for ongoing word nav is 'z' (r  Z)Tz for new word nav is 'r   )r   r  r!  r   rX   Zget_penultimate_cursor_positionr   Z'last_event_was_previous_word_navigationZ#last_event_was_next_word_navigationr   point_of_referencer,   r   Zreplacer   rZ   r;   r<  Zisalnum
startswithendswith)r   r    r  rU  r   r  r,  r-  r  Zwas_previous_word_navZwas_next_word_navZ	prev_wordZ
prev_startZprev_endZdebug_stringrc   Z	last_chars   &&&              r   *get_word_at_offset_adjusted_for_navigationZ4Utilities.get_word_at_offset_adjusted_for_navigation  s    >,,S1F!44SAS - 9 9 ; [ [ ]?##%113 ' O O Q#GGI +1*C*CH*Z'	x<<**../CDN$!"#''C8D<<e4L<VH E >UG1SE4   0 0#t<## ! E
 H$$&&$r(*:*:*<*<q C  Z%DH%D"
 z"00qj&I	!))++y/@/@/B/B"QJE##C4 4<D-t$$
t$$q##C4||D%08 A~SqQ0 	 	E,,c48Cr   c                s   < V ^8  d   QhRR/# r   ru   r%   r'   r   r(   r)   Y  s     9 9t 9r   c                s    RV P                   P                  R&   RV P                   P                  R&   RV P                   P                  R&   R# )z;Clears the cached state for undo, redo, and paste commands.FundoredopasteN)r   rV  r   rO   r   %clear_cached_command_state_deprecatedZ/Utilities.clear_cached_command_state_deprecatedY  s@     38''/27''/38''0r   c                r   r   )r   r   rh   r%   r'   r   r(   r)   `  s#      {{ 
r   c                s   \         P                  ! 4       P                  4       '       d   V P                  P                  P                  R4      '       gC   V P                  P                  \        P                  4       RV P                  P                  R&   \        P                  ! VP                  4       R# \         P                  ! 4       P                  4       '       d   V P                  P                  P                  R4      '       gC   V P                  P                  \        P                  4       RV P                  P                  R&   \        P                  ! VP                  4       R# R# )z9Handles a text-changed event resulting from an undo/redo.rZ  Tr[  F)r   rX   last_event_was_undor   rV  r,   present_messager   UNDOr   update_cached_selected_textr   last_event_was_redoREDOr   r   r   handle_undo_text_eventZ Utilities.handle_undo_text_event`  s     **,@@BB<<2266v>>,,X]];:>//7..u||<**,@@BB<<2266v>>,,X]];:>//7..u||<r   c                    < V ^8  d   QhRS[ /# r   rh   r%   r'   r   r(   r)   v  s      4 r   c                sf   \         P                  ! 4       P                  4       '       dp   V P                  P                  P                  R4      '       gC   V P                  P                  \        P                  4       RV P                  P                  R&   R# \         P                  ! 4       P                  4       '       dp   V P                  P                  P                  R4      '       gC   V P                  P                  \        P                  4       RV P                  P                  R&   R# R# )z>Presents an undo/redo message when the locus of focus changes.rZ  Tr[  F)r   rX   r_  r   rV  r,   r`  r   ra  rc  rd  r]  rO   r   !handle_undo_locus_of_focus_changeZ+Utilities.handle_undo_locus_of_focus_changev  s     **,@@BB<<2266v>>,,X]];:>//7**,@@BB<<2266v>>,,X]];:>//7r   c                rf  r   rg  r%   r'   r   r(   r)     s     
 
D 
r   c                sT   \         P                  ! 4       P                  4       '       d   V P                  P                  P                  R4      '       gR   V P                  P                  \        P                  \        P                  4       RV P                  P                  R&   R# R# )z9Presents a paste message when the locus of focus changes.r\  TF)
r   rX   Zlast_event_was_paster   rV  r,   r`  r   ZCLIPBOARD_PASTED_FULLZCLIPBOARD_PASTED_BRIEFr]  rO   r   "handle_paste_locus_of_focus_changeZ,Utilities.handle_paste_locus_of_focus_change  su     **,AACC<<2266w??,,22H4S4SU;?//8r   c                r   r   rg   r%   r'   r   r(   r)     s%     3 33 
3r   c                sx   \         P                  ! V4      '       g   R# \        P                  ! V4      '       d   \        P                  ! V4      '       g   R# \        P
                  ! V4      '       g   \        P                  ! V4      '       d   R# \         P                  ! V4      pV\        P                  ! V4      8X  dc   \        P                  ! V^ 4      p\         P                  ! V4      V8w  d   R# RV R2p\        P                  ! \        P                  VR4       R# \        P                   ! V4      # )z.Returns True if all items in obj are selected.FzSCRIPT UTILITIES: All z! children believed to be selectedT)r   rF  r   Zis_expandabler8   rm   is_menur   r   rN  Zget_selected_childr   r   rZ   r;   r   Zall_cells_are_selected)r   r    Zchild_countr   rc   rR   r   all_items_selectedZUtilities.all_items_selected  s     **3//$$S))+2I2I#2N2N##C((K,?,?,D,D..s3+>>sCC  223:E""5)S0*;-7XYC 0 0#t<--c22r   c                r   r   rg   r%   r'   r   r(   r)     s%       
r   c                s   V P                   P                  P                  R4      pV P                  V4      pV'       d   V'       d   R# W0P                   P                  R&   \        P
                  ! 4       P                  4       '       dZ   V'       dR   V P                   P                  \        P                  4       \        P
                  ! 4       P                  RVR4       R# R# )z8Handles a change in a container that supports selection.ZallItemsSelectedTNF)r   rV  r,   rk  r   rX   last_event_was_select_allr`  r   ZCONTAINER_SELECTED_ALLr   r
  )r   r    Zall_already_selectedZall_currently_selectedr   r   !handle_container_selection_changeZ+Utilities.handle_container_selection_change  s      $||>>BBCUV!%!8!8!=$:>T''(:;**,FFHHMcLL(()H)HI%%'::4eLr   c                s@   < V ^8  d   QhRS[ P                  RS[RS[/# )r   r    speak_messager!   rg   r%   r'   r   r(   r)     s4     V VV V 
	Vr   c                sn	   \         P                  ! V4      '       g   R# \        P                  ! 4       P	                  4       '       d   R# \
        P                  ! V4      w  r4p\
        P                  ! V4       \
        P                  ! V4      w  rgp\        P                  ! 4       P                  4       '       d:   V'       d2   Wc8w  d*   V P                  P                  \        P                  4       R# \        P                  ! 4       P                  4       '       g<   V'       d4   V'       g,   V P                  P                  \        P                  4       R# . p	\        \!        WE4      4      p
\        \!        Wx4      4      pV
P#                  V4      '       g   R# V
'       dd   V'       d\   V
P%                  V4      '       gE   V	P'                  WE\        P(                  .4       V	P'                  Wx\        P*                  .4       EM\-        V
P/                  V4      4      pV'       g   R# V^ ,          VR,          ^,           rW8  do   V	P'                  W\        P*                  .4       VP1                  R4      '       d6   W]8X  d0   \2        P4                  ! W^,
          4      pV P7                  VR4       MgV	P'                  W\        P(                  .4       VP1                  R4      '       d0   \2        P4                  ! W^,
          4      pV P7                  VR4       T;'       d*    \8        P                  ! 4       P;                  R4      '       * pV	 EF^  w  ppp\
        P<                  ! VVV4      pVP1                  R4      pV'       d
   V^,          p\?        V4      R8  d   V'       d   V\        P*                  8X  d:   V P                  P                  \        P@                  ! \?        V4      4      4       MV P                  P                  \        PB                  ! \?        V4      4      4       MJV P                  PE                  VVV4       V'       d&   V'       g   V P                  P                  VRR7       V'       g   EK6  \2        P4                  ! VV4      pV P7                  W4       EKa  	  R# )z&Handles a change in the selected text.FTr   ZonlySpeakDisplayedTexti  )Z	interruptr   )#r   r=  r   rX   Zlast_event_was_cutr   Zget_cached_selected_textrb  rl  r   rn  r   ZDOCUMENT_SELECTED_ALLZlast_event_was_caret_selectionZSELECTION_REMOVEDZsetr=   ZunionZintersectionr.   ZTEXT_UNSELECTEDZTEXT_SELECTEDZsortedZsymmetric_differencerX  r   r   handle_text_selection_changer
   r{   r   r/   Zselected_character_countZunselected_character_countZ
say_phrase)r   r    rn  Z
old_stringZ	old_startZold_endZ
new_stringZ	new_startZnew_endZchangesZ	old_charsZ	new_charsZchangeZchange_startZ
change_endr   r   r  Zmessager   Zends_with_childs   &&&                  r   ro  Z&Utilities.handle_text_selection_change  s\    %%c****,??AA)/)H)H)M&
w**3/)/)H)H)M&
w**,FFHHZ'**8+I+IJ #..0OOQQ*LL&&x'A'ABi12	i12	y))9+A+A)+L+LNNI0H0HIJNNI0F0FGHI::9EFF'-ay&*q.*$(:P:PQR&&x00W5L (<<SA+NE55eUC(:R:RST&&x00 (<<SA+NE55eUC% Y Y$002>>?WXX 	#*E3))#uc:F$ooh7Oq6{T!mh444LL..x/P/PQTU[Q\/]^LL..x/R/RSVW]S^/_`''UC8 LL..w%.H#88cB11%G% $+( r   c                s|   < V ^8  d   QhRS[ P                  RS[ P                  RS[ P                  R,          RS[/# )r   	old_focus	new_focusr   Nr!   )r   r#   r   rh   r%   r'   r   r(   r)     sH     < <##< ##< {{T!	<
 
<r   c                s   RpVf2   VR,          p\         P                  ! \         P                  VR4       R# W8X  d2   VR,          p\         P                  ! \         P                  VR4       R# VP                  P	                  R4      '       d2   VR,          p\         P                  ! \         P                  VR4       R# \
        P                  ! V4      '       dj   \
        P                  ! V4      '       dN   \
        P                  ! V4      '       d2   VR,          p\         P                  ! \         P                  VR4       R# \
        P                  ! V4      '       gj   \
        P                  ! V4      '       g   \
        P                  ! V4      '       d2   VR	,          p\         P                  ! \         P                  VR4       R# \        P                  ! W!4      '       Ed	   \        P                  ! V4      ;p'       d~   V\        P                  ! V4      8X  d2   VR
,          p\         P                  ! \         P                  VR4       R# VR,          p\         P                  ! \         P                  VR4       R# \
        P                  ! V4      '       dP   \
        P                   ! V4      '       d   R# VR,          p\         P                  ! \         P                  VR4       R# R# \
        P"                  ! W4      '       g   \
        P"                  ! W!4      '       d2   VR,          p\         P                  ! \         P                  VR4       R# R# )zFReturns True if speech should be interrupted to present the new focus.z<SCRIPT UTILITIES: Not interrupting for locusOfFocus change: zevent is NoneTFz,old locusOfFocus is same as new locusOfFocusz object:active-descendant-changedz"event is active-descendant-changedzsuspected editable cellzsuspected menuitem state changez?old locusOfFocus is ancestor with same name as new locusOfFocusz@old locusOfFocus is ancestor of new locusOfFocus, and has a namezEold locusOfFocus is ancestor dialog or window of the new locusOfFocusz<new locusOfFocus and old locusOfFocus have controls relation)r   rZ   r;   ZtyperW  r   r   Zis_textrI  Zis_menu_relatedZis_check_menu_itemZis_radio_menu_itemr   r   r   Zis_dialog_or_windowrj  Zobject_is_controlled_by)r   rp  rq  r   rc   Zold_namer  r   *should_interrupt_for_locus_of_focus_changeZ4Utilities.should_interrupt_for_locus_of_focus_change  sl    M=?"C 0 0#t<!AAC 0 0#t<::  !CDD77C 0 0#t<$$Y//K4G4G	4R4R&&y11,,C 0 0#t<**955..y9911)<<44C 0 0#t<	55#,,Y77x7x00;;\\C''(8(8#tDYY##E$4$4c4@..y99&&y11^^##E$4$4c4@..yDD11)GGQQC 0 0#t<r   )r   r   rL   rE  )NN)NTi   )    r   )Nr   N)NFT)rs  T)Nr   NT)NT)T)Nr   FN)^Z__name__Z
__module__Z__qualname__Z__firstlineno____doc__ZZERO_WIDTH_NO_BREAK_SPACEr   r3   rD   rK   rF   rf   rl   rn   rp   rv   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   r   r   r   r   r   r[   r   Zstaticmethodr   rQ   r   r   r   r   r   r   r   r  r  r	  r  r  r  r  r  r#  r/  r*  r4  r5  r6  r)  r1  r>  r@  rA  rB  rD  rL  rM  rO  rQ  rS  rT  rY  r^  re  rh  ri  rk  rm  ro  rr  Z__static_attributes__Z__classdictcell__)r&   s   @r   r   r   :   s    \ () &$ $L7 7 # #J- -
H H	P 	P 
` `&5 &5P	C 	CP PP P, ,= =  [ [
Q Q
G G 
	P 	PW W2 2 T TJ JR R% %$ "X X8   2( (
$ .  &V V $L L  (K K&EE EEN ( &( (T ( 
 () )	, 	, (N N<- - ,   0	) 	)! !4
) 
)! !4	+ 	+	) 	) < :
 
  6 6 !5 !5F> >:
9 
9  I IV  V p9 9 , "
 
3 3< &V Vp< < <r   r   )&rt  Z__id__Z__version__Z__date__Z__copyright__Z__license__Ztypingr   ZgiZrequire_versionZgi.repositoryr   rt   r   r   r   r   r   r   r	   r
   Zax_componentr   Zax_hypertextr   Z	ax_objectr   Zax_selectionr   Zax_tabler   Zax_textr   Zax_utilitiesr   Zax_valuer   r   ru   r   r   <module>ru     sy   6 Y	5  	   7E "    !      % %  %   % ^ ^r   