
    g
f/                         d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZ  G d d      Zy)z:Provides the default implementation for bookmarks in Orca.    N   )cmdnames)debug)keybindings)input_event)messages)settings_manager)
AXDocument)AXObjectc                       e Zd ZdZd ZddZddZd Zd Zd Z	d Z
dd
Zd Zd Zd Zd Zd ZddZddZd Zd Zd Zd ZddZy	)	Bookmarksz&Represents a default bookmark handler.c                     || _         i | _        g | _        g | _        | j	                          d | _        | j                  d      | _        t        j                         | _
        y )NT)_script
_bookmarks_saveObservers_loadObservers_loadBookmarks_currentbookmarkindexget_handlers	_handlersr   KeyBindings	_bindings)selfscripts     0/usr/lib/python3/dist-packages/orca/bookmarks.py__init__zBookmarks.__init__&   sV      %)"**40$002    c                     |rCd}t        j                  t         j                  |d       | j                          | j                  S | j                  j                         r| j                          | j                  S )z!Returns the bookmark keybindings.zBOOKMARKS: Refreshing bindings.T)r   printMessage
LEVEL_INFO_setup_bindingsr   isEmpty)r   refresh
is_desktopmsgs       r   get_bindingszBookmarks.get_bindings0   sd     3Cu//d;  " ~~ ^^##%  "~~r   c                     |r7d}t        j                  t         j                  |d       | j                          | j                  S )zReturns the bookmark handlers.zBOOKMARKS: Refreshing handlers.T)r   r   r    _setup_handlersr   )r   r#   r%   s      r   r   zBookmarks.get_handlers<   s:     3Cu//d;  "~~r   c                    i | _         t        j                  | j                  t        j
                        | j                   d<   t        j                  | j                  t        j                        | j                   d<   t        j                  | j                  t        j                        | j                   d<   t        j                  | j                  t        j                        | j                   d<   t        j                  | j                  t        j                        | j                   d<   d}t        j                  t        j                   |d       y)	z*Sets up the bookmark input event handlers.goToPrevBookmarkgoToNextBookmarkgoToBookmarkaddBookmarksaveBookmarkszBOOKMARKS: Handlers set up.TN)r   r   InputEventHandlerr*   r   BOOKMARK_GO_TO_PREVIOUSr+   BOOKMARK_GO_TO_NEXTr,   BOOKMARK_GO_TOr-   BOOKMARK_ADDr.   BOOKMARK_SAVEr   r   r    )r   r%   s     r   r(   zBookmarks._setup_handlersF   s     ))%%002 	)* ))%%,,. 	)* ))!!'') 	~& ))  %%' 	}% ))""&&( 	'
 ,5++S$7r   c                    t        j                         | _        | j                  j                  t        j                  dt         j
                  t         j                  | j                  j                  d                   | j                  j                  t        j                  dt         j
                  t         j                  | j                  j                  d                   | j                  j                  t        j                  dt         j
                  t         j                  | j                  j                  d                   t        d      D ]  }| j                  j                  t        j                  t        |dz         t         j
                  t         j                  | j                  j                  d                   | j                  j                  t        j                  t        |dz         t         j
                  t         j                  | j                  j                  d                    d	}t        j                  t        j                  |d
       y)z"Sets up the bookmark key bindings.br+   r*   r.      r   r,   r-   zBOOKMARKS: Bindings set up.TN)r   r   r   add
KeyBindingdefaultModifierMaskORCA_MODIFIER_MASKr   getORCA_SHIFT_MODIFIER_MASKORCA_ALT_MODIFIER_MASKrangestrr   r   r    )r   ir%   s      r   r!   zBookmarks._setup_bindingsg   s    %002""//..""#56	8	9 	""//44""#56	8	9 	""//22""?3	5	6 q 	8ANN&&AJ3322NN&&~6	89 NN&&AJ3366NN&&}5	78	8 ,5++S$7r   c                 :    | j                   j                  |       y N)r   appendr   observers     r   addSaveObserverzBookmarks.addSaveObserver       ""8,r   c                 :    | j                   j                  |       y rC   )r   rD   rE   s     r   addLoadObserverzBookmarks.addLoadObserver   rH   r   Nc                    |xs |j                   }	 | j                  j                         }| j                  |   }|j	                  |d   |d   |d   |d          || j                  |<   | j                  j                  j                  ||       || _        y# t
        $ r, | j                  j                  t        j                         Y yw xY w)z2 Go to the bookmark indexed by inputEvent.hw_code linezonewordcharN)hw_coder   getFlatReviewContextr   
setCurrentKeyErrorpresentMessager   BOOKMARK_NOT_FOUNDflatReviewPresenterpresent_itemr   )r   r   
inputEventindexcontextcontext_infos         r   r,   zBookmarks.goToBookmark   s     +++	ll779G??51L|F3\&5I ,V 4l66JL%1DOOE"
 	((55fjI &+"  	LL''(C(CD	s   AB 2CCc                     | j                   j                         }| j                  |      | j                  |j                  <   | j                   j                  t        j                         y)z9 Add an in-page accessible object bookmark for this key. N)r   rQ   _contextToBookmarkr   rP   rT   r   BOOKMARK_ENTERED)r   r   rX   rZ   s       r   r-   zBookmarks.addBookmark   sK    ,,335.2.E.Eg.N
**+##H$=$=>r   c                 .   	 | j                  | j                         | j                  j                  t        j
                         | j                  D ]	  } |         y# t        $ r, | j                  j                  t        j                         Y Mw xY w)z% Save the bookmarks for this script. N)	saveBookmarksToDiskr   r   rT   r   BOOKMARKS_SAVEDIOErrorBOOKMARKS_SAVED_FAILUREr   )r   r   rX   os       r   r.   zBookmarks.saveBookmarks   sy    	J$$T__5LL''(@(@A
 $$ 	AC		  	JLL''(H(HI	Js   AA 2BBc                    t        | j                  j                               }t        |      dk(  r*| j                  j                  t        j                         yt        |      dk(  s| j                  | j                  d|d          y	 |j                  | j                        }| j                  d||dz             y# t        t        t        f$ r | j                  d|d          Y yw xY w)zu Go to the next bookmark location.  If no bookmark has yet to be
        selected, the first bookmark will be used.  r   Nr   rY   sortedr   keyslenr   rT   r   BOOKMARKS_NOT_FOUNDr   r,   rY   
ValueErrorrS   
IndexErrorr   r   rX   hwkeysrY   s        r   r+   zBookmarks.goToNextBookmark   s    
 ,,./ v;!LL''(D(DE[A!;!;!Cd&)4	5LL!;!;<Ed&q/:Hj1 	5d&)4	5   4C *C0/C0c                    t        | j                  j                               }t        |      dk(  r*| j                  j                  t        j                         y t        |      dk(  s| j                  | j                  d |d          y 	 |j                  | j                        }| j                  d ||dz
            y # t        t        t        f$ r | j                  d |d          Y y w xY w)Nr   r   rf   rg   rn   s        r   r*   zBookmarks.goToPrevBookmark   s    ,,./ v;!LL''(D(DE[A!;!;!Cd&)4	5LL!;!;<Ed&q/:Hj1 	5d&)4	5rp   c                 f    | j                         xs i | _        | j                  D ]	  } |         y)z# Load this scripts saved bookmarks.N)readBookmarksFromDiskr   r   )r   rd   s     r   r   zBookmarks._loadBookmarks   s3    446<" $$ 	AC	r   c                    |xs( | j                   j                  j                  d      d   }t        j                         j                         }|syt        j                  j                  |d      }	 t        t        j                  j                  || d      d      }t        j                  |j                        }|j                          |S # t        t        t         f$ r Y yw xY w)zc Read saved bookmarks from disk.  Currently an unpickled object
        that represents a bookmark  r   N	bookmarks.pklr)r   namesplitr	   
getManagergetPrefsDirospathjoinopenpickleloadbuffercloserb   EOFErrorOSError)r   filenameorcaDirorcaBookmarksDir	inputFilerv   s         r   rs   zBookmarks.readBookmarksFromDisk   s     >t||0066s;A>"--/;;=77<<=	bggll,<#*D)+,/1II$4$45IOO7+ 		s   3AC C('C(c                 ,   |xs( | j                   j                  j                  d      d   }t        j                         j                         }t        j                  j                  |d      }	 t        j                  |       t        t        j                  j                  || d      dt        j                        }t        j                  ||j                          |j#                          y# t        $ r t        j                  |       Y w xY w)zN Write bookmarks to disk.  bookmarksObj must be a pickleable 
        object. ru   r   rv   rw   wN)r   ry   rz   r	   r{   r|   r}   r~   r   statr   mkdirr   O_CREATr   dumpr   r   )r   bookmarksObjr   r   r   outputs         r   r`   zBookmarks.saveBookmarksToDisk  s     >t||0066s;A>"--/;;=77<<=	'GG$% rww||%5j%'(+RZZ9L&--0  	'HH%&	's   0C2 2DDc                     i }|j                   |d<   |j                  |d<   |j                  |d<   |j                  |d<   |S )z6Converts a flat_review.Context object into a bookmark.rM   rO   rN   rL   )	zoneIndex	charIndex	wordIndex	lineIndex)r   rZ   r[   s      r   r]   zBookmarks._contextToBookmark  sM    &00V&00V&00V&00Vr   c                 z    | j                   j                         }|j                  |d   |d   |d   |d          |S )z6Converts a bookmark into a flat_review.Context object.rL   rM   rN   rO   )r   rQ   rR   )r   bookmarkrZ   s      r   _bookmarkToContextzBookmarks._bookmarkToContext  sD    ,,3358F+Xf-=#F+Xf-=	?r   c                     t        j                  | j                  j                  j	                               }|r3t
        j                  j                  |      }dj                  |dd       S y)zpReturns the URI key for a given page as a URI stripped of
        parameters?query#fragment as seen in urlparse. r      N)	r
   get_urir   	utilitiesdocumentFrameurllibparseurlparser   )r   uri
parsed_uris      r   	getURIKeyzBookmarks.getURIKey&  sV       !7!7!E!E!GH..s3J77:a?++r   c                     | j                   j                  j                         }|D ]  }t        j                  ||      }|r |S  |S )zPReturn the object with the given path (relative to the
        document frame). )r   r   r   r   	get_child)r   r~   	returnobjchildnumbers       r   	pathToObjzBookmarks.pathToObj0  sQ     LL**88:	 	K **9kBI	
 r   c                    |s'| j                   j                  j                         \  }}|sg S | j                   j                  j                  |      rg S g }|j	                  t        j                  |             t        j                  |      }|rs| j                   j                  j                  |      r|j                          |S |j	                  t        j                  |             t        j                  |      }|rsg S )zGiven an object, return it's path from the root accessible.  If obj
        is not provided, the current caret context is used. )	r   r   getCaretContext
isDocumentrD   r   get_index_in_parent
get_parentreverse)r   	start_objcharacterOffsetr~   ps        r   
_objToPathzBookmarks._objToPath;  s     +/<<+A+A+Q+Q+S(YI<<!!,,Y7IH00;<	*||%%003KK44Q78##A&A  	r   )FT)FrC   )__name__
__module____qualname____doc__r   r&   r   r(   r!   rG   rJ   r,   r-   r.   r+   r*   r   rs   r`   r]   r   r   r   r    r   r   r   r   $   sk    03
8B*8X--+(?
505*$ 	r   r   )r   r   r}   urllib.parser   r   r   r   r   r   r   r	   ax_documentr
   	ax_objectr   r   r   r   r   <module>r      s8   ( A  	        # m mr   