
    ucI                         d Z ddlZ	 ddlmc mZ ddlm	Z	m
Z
mZmZmZ ddlmZmZ ddlmZ ddlmZ  G d de      Zy# e$ r ddlmc mZ Y >w xY w)	z CLass to edit XDG Menus     N)Menu	MenuEntryLayout	SeparatorXMLMenuBuilder)xdg_config_dirsxdg_data_dirs)ParsingError)setRootModec                      e Zd Zd(dZd(dZd Zd)dZd*dZd+dZd+dZ	d+d	Z
d+d
Zd+dZd,dZd-dZd Zd Zd Zd Zd Zd Zd Zd Zd Z	 d Zd Zd Zd Zd.dZd Zd Zd/dZd Z d  Z!d! Z"d+d"Z#d+d#Z$d$ Z%d% Z&d& Z'd' Z(y)0
MenuEditorNc                     d | _         d | _        d | _        t               | _        | j                  |||       g | _        y N)menufilenametreer   parserparse	filenamesselfr   r   roots       0/usr/lib/python3/dist-packages/xdg/MenuEditor.py__init__zMenuEditor.__init__   s:    		$&

44(     c                 J   |rt        d       t        |t              r|| _        nB|r!| j                  j                  |      | _        n| j                  j                         | _        |r| j                  j                  | _        nk|r|| _        nat        j                  j                  t        d   dt        j                  j                  | j                  j                        d         | _        	 t        j
                  | j                        | _        | j'                  | j                         y # t        $ rI t        j                   d| j                  j                  z        }t        j"                  |      | _        Y mt$        $ r t%        d| j                        w xY w)NTr   menus   z
<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN" "http://standards.freedesktop.org/menu-spec/menu-1.0.dtd">
    <Menu>
        <Name>Applications</Name>
        <MergeFile type="parent">%s</MergeFile>
    </Menu>
zNot a valid .menu file)r   
isinstancer   r   r   r   Filenamer   ospathjoinr   splitetreer   IOError
fromstringElementTreer
   $_MenuEditor__remove_whitespace_nodesr   s       r   r   zMenuEditor.parse$   s>   dD!DI))$/DI))+DI II..DM$DMGGLL);WbggmmTXT]T]TfTfFghiFjkDM	HDMM2DI 	&&tyy1  	0## % ii% D ))$/DI 	H7GG	Hs   2$D2 2AF"F"c                 Z    | j                  | j                         | j                          y r   )_MenuEditor__saveEntriesr   _MenuEditor__saveMenur   s    r   savezMenuEditor.saveG   s    499%r   c
           	          t        | j                  |d            }
| j                  |
||||||      }
| j                  ||
||	       | j                  j                          |
S )N.desktop)r   _MenuEditor__getFileNameeditMenuEntry_MenuEditor__addEntryr   sort)r   parentnamecommandgenericnamecommenticonterminalafterbefore	menuentrys              r   createMenuEntryzMenuEditor.createMenuEntryK   s]    d00zBC	&&y$WgW[]ef		5&9		r   c                    t               }||_        |j                  dz   |_        |j                  |_        |j                  |_        | j                  |||||      }| j                  ||||       | j                  j                          |S )Nr   )	r   ParentDepthDefaultLayoutr   editMenur3   r   r4   )	r   r5   r6   r8   r9   r:   r<   r=   r   s	            r   
createMenuzMenuEditor.createMenuU   sv    v\\A%
**#11}}T4gtDeV4		r   c                 x    t        |      }| j                  ||||       | j                  j                          |S r   )r   r3   r   r4   )r   r5   r<   r=   	separators        r   createSeparatorzMenuEditor.createSeparatore   s2    f%		5&9		r   c                     | j                  ||||       | j                  ||||       | j                  j                          |S r   _MenuEditor__deleteEntryr3   r   r4   r   r>   	oldparent	newparentr<   r=   s         r   moveMenuEntryzMenuEditor.moveMenuEntryn   s<    9i?	9eV<		r   c           	         | j                  ||||       | j                  ||||       | j                  | j                  j                        }|j                  d      |j                  d      k7  r| j                  |t        j                  j                  |j                  d      |j                        t        j                  j                  |j                  d      |j                               | j                  j                          |S )NT)rK   r3   _MenuEditor__getXmlMenur   NamegetPath_MenuEditor__addXmlMover!   r"   r#   r4   )r   r   rM   rN   r<   r=   	root_menus          r   moveMenuzMenuEditor.moveMenuv   s    9dE6:	47%%diinn5	T"i&7&7&==ii6G6G6Mtyy)Y[][b[b[g[ghqhyhyz~h  BF  BK  BK  \L  M		r   c                     | j                  ||||       | j                  ||||       | j                  j                          |S r   rJ   )r   rG   r5   r<   r=   s        r   moveSeparatorzMenuEditor.moveSeparator   s<    69eV<	5&9		r   c                 b    | j                  ||||       | j                  j                          |S r   )r3   r   r4   rL   s         r   copyMenuEntryzMenuEditor.copyMenuEntry   s(    	9eV<		r   c
                 N   |j                   }
|r7|
j                  d      s|
j                  d|       |
j                  d|d       |r7|
j                  d      s|
j                  d|       |
j                  d|d       |r7|
j                  d      s|
j                  d|       |
j                  d|d       |r|
j                  d|       |r|
j                  d|       |r|
j                  dd	       n|s|
j                  dd
       |du r|
j                  dd	       n|du r|
j                  dd
       |	du r|
j                  dd	       n|	du r|
j                  dd
       |j                          t	        |j
                        dkD  r| j                  j                          |S )NrR   TlocaleCommentGenericNameExecIconTerminaltruefalse	NoDisplayFHiddenr   )DesktopEntryhasKeysetupdateAttributeslenParentsr   r4   )r   r>   r6   r8   r9   r7   r:   r;   	nodisplayhidden	deskentrys              r   r2   zMenuEditor.editMenuEntry   sm   **	##F+fd+MM&$tM4##I.i1MM)WTM:##M2m[9MM-TMBMM&'*MM&$'MM*f-MM*g.MM+v.%MM+w/T>MM(F+u_MM(G,""$y  !A%IINNr   c                    t        |j                  t              r|j                  j                  dk(  rj| j	                  |j                  dd            }| j                  |d|j                  dz          |j                  j                  |j                  dz          nt        |j                  t              s|s|j                  }| j                  |d      j                  dd      }	|j                  s|	j                  dd      |_        | j	                  |j                  dd            }| j                  |d|	       t        |	      |_        |j                  j                  }
|r7|
j                  d      s|
j                  d|       |
j                  d|d       |r7|
j                  d      s|
j                  d|       |
j                  d|d       |r7|
j                  d	      s|
j                  d	|       |
j                  d	|d       |r|
j                  d
|       |du r|
j                  dd       n|du r|
j                  dd       |du r|
j                  dd       n|du r|
j                  dd       |j                  j                          t        |j                  t               r| j"                  j%                          |S )N
.directoryT	Directory/ rR   r\   r_   r^   ra   re   rc   Frd   rf   )r   rr   r   r    rQ   rS   _MenuEditor__addXmlTextElementrR   setAttributesr1   replacerg   rh   ri   rj   rA   r   r   r4   )r   r   r6   r8   r9   r:   rm   rn   xml_menur   ro   s              r   rD   zMenuEditor.editMenu   s:   dnni0T^^5L5LP\5\((dD)ABH$$X{DII<TUNN((\)ABDNNI6yy))$=EEc2NH99$,,\2>	((dD)ABH$$X{HE&x0DNNN//	##F+fd+MM&$tM4##M2m[9MM-TMB##I.i1MM)WTM:MM&$'MM+v.%MM+w/T>MM(F+u_MM(G,'')dkk4(IINNr   c                 *    | j                  |d       y NT)rm   r2   r   r>   s     r   hideMenuEntryzMenuEditor.hideMenuEntry   s    95r   c                 ,    | j                  |dd       y )NFrm   rn   r{   r|   s     r   unhideMenuEntryzMenuEditor.unhideMenuEntry   s    9eDr   c                 *    | j                  |d       y rz   )rD   r   r   s     r   hideMenuzMenuEditor.hideMenu   s    dd+r   c                     | j                  |dd       | j                  |j                  dd      d      }|j                  d      }|j                  d      }||z   D ]  }|j	                  |        y )NFr   TDeleted
NotDeleted)rD   rQ   rS   findallremove)r   r   rx   deletednot_deletednodes         r   
unhideMenuzMenuEditor.unhideMenu   sq    deE:$$T\\$%=uE""9-&&|4k) 	"DOOD!	"r   c                     | j                  |      dk(  rb| j                  |j                  j                         |j                  D ]  }| j                  ||        | j                  j                          |S )Ndelete)	getAction_MenuEditor__deleteFilerg   r   rl   rK   r   r4   )r   r>   r5   s      r   deleteMenuEntryzMenuEditor.deleteMenuEntry   sf    >>)$0i44==>#++ 6""6956IINNr   c                 
   | j                  |      dk(  r| j                  |j                  j                         g |j                  _        |j
                  D ]  }|j                  j                  |      }|j                  |j                  |<   |j                  j                  |      }|j                  |j                  |<   |j                  j
                  j                  |        | j                  j                          |S Nrevert)r   r   rg   r   Originalrl   EntriesindexMenuEntriesappendr   r4   )r   r>   r5   r   s       r   revertMenuEntryzMenuEditor.revertMenuEntry  s    >>)$0i44==>)+I&#++ :,,Y7(1(:(:u%**00;,5,>,>""5)""**11&9: IINNr   c                 ~   | j                  |      dk(  r| j                  |j                  j                  j                         | j                  |j                  |       | j                  |j                  dd            }| j                  |      }|j                  |       | j                  j                          |S )Nr   T)r   r   rr   rg   r   rK   rA   rQ   rS   _MenuEditor__get_parent_noder   r   r4   )r   r   rx   r5   s       r   
deleteMenuzMenuEditor.deleteMenu  s    >>$8+dnn99BBCt{{D1((dD)ABH++H5FMM(#IINNr   c                     | j                  |      dk(  rd| j                  |j                  j                  j                         |j                  j
                  |_        | j                  j                          |S r   )r   r   rr   rg   r   r   r   r4   r   s     r   
revertMenuzMenuEditor.revertMenu  sU    >>$8+dnn99BBC!^^44DNIINNr   c                 v    | j                  |j                  |d       | j                  j                          |S )NT)r<   )rK   rA   r   r4   )r   rG   s     r   deleteSeparatorzMenuEditor.deleteSeparator%  s1    9++YdC		r   c                    t        |t              rt        |j                  t              sy|j                  j	                         dk(  ry|j                  j	                         dk(  r/t        |j                        t        |j                        z   dk(  ryyt        |t              r)|j	                         dk(  ry|j	                         dk(  ryyy)NnoneBothr   Userr   r   )r   r   rr   r   getTyperk   Submenusr   )r   entrys     r   r   zMenuEditor.getAction-  s    eT"eooy9((*f4((*f4ENN#c%*;*;&<<:    y)}}&(F*r   c                 <   |s| j                   }t        |j                  t              r|j                  j	                          |j                  d      D ]E  }t        |t              r|j	                          $t        |t              s5| j                  |       G y )NT)rn   )r   r   rr   r   r.   
getEntriesr   r+   )r   r   r   s      r   __saveEntrieszMenuEditor.__saveEntriesB  sq    99Ddnni0NN!__D_1 	*E%+

E4(""5)		*r   c                 V   t         j                  j                  t         j                  j                  | j                              s<t        j
                  t         j                  j                  | j                               | j                  j                  | j                  d       y )Nzutf-8)encoding)r!   r"   isdirdirnamer   makedirsr   writer-   s    r   
__saveMenuzMenuEditor.__saveMenuM  sX    ww}}RWW__T]];<KK67		8r   c                 R   d}	 |dk(  r||z   }n|dz   t        |      z   |z   }|dk(  rd}n|dk(  rd}|| j                  vrct        j                  j	                  t        j                  j                  t        d   |            s| j                  j                  |       	 |S |dz  })Nr   r   -r0   applicationsrq   zdesktop-directories)strr   r!   r"   isfiler#   r	   r   )r   r6   	extensionpostfixr   dirs         r   __getFileNamezMenuEditor.__getFileNameR  s    !|)+#:G4y@J&$l*+t~~-bggnn]1-sH=7 %%h/  1 r   c                 d   |s| j                   }d|v r|j                  dd      \  }}n|}d}d }|j                  d      D ]>  }|j                  d      }|j                  |k(  r|r| j                  |||      }n|}|s> n |s-|r+| j                  ||      }|r| j                  |||      }|S |}|S )Nrs   r   rt   r   rR   )r   r$   r   findtextrQ   _MenuEditor__addXmlMenuElement)r   r"   createelementr6   foundr   	name_nodes           r   __getXmlMenuzMenuEditor.__getXmlMenug  s     iiG$;::c1-LT4DDOOF+ 	D		&)I~~% --dFDAE E	 ++GT:D))$=  r   c                 l    t        j                  d|      }t        j                  d|      }||_        |S )Nr   rR   r%   
SubElementr   )r   r   r6   	menu_noder   s        r   __addXmlMenuElementzMenuEditor.__addXmlMenuElement  s3    $$VW5	$$VY7		r   c                 @    t        j                  ||      }||_        |S r   r   )r   r   r6   r   r   s        r   __addXmlTextElementzMenuEditor.__addXmlTextElement  s     g.	r   c                 "   |j                  d      }|j                  d      }||z   }|D ]9  }|d   j                  dk(  s|d   j                  |k(  s)|j                  |       ; t	        j
                  ||      }| j                  |d|       |S )NIncludeExcluder   r    )r   tagr   r   r%   r   ru   )	r   r   r   type_includesexcludesrulesruler   s	            r   __addXmlFilenamezMenuEditor.__addXmlFilename  s    ??9-??9-8# 	%DAw{{j(T!W\\X-Et$	% w/  z8<r   c                 ~    t        j                  d|      }| j                  |d|       | j                  |d|       |S )NMoveOldNew)r%   r   ru   )r   r   oldnewr   s        r   __addXmlMovezMenuEditor.__addXmlMove  s=    0  uc2  uc2r   c                    |j                  d      D ]  }|j                  |        t        j                  d|      }|j                  D ]  }|d   dk(  rt        j                  d|      }"|d   dk(  r| j                  |d|d         }A|d   dk(  r| j                  |d|d         }`|d   dk(  sit        j                  d|      }|d   |j                  d<    |S )	Nr   r   r   r    r   MenunameMergetype)r   r   r%   r   orderru   attrib)r   r   layoutr   r   childs         r   __addXmlLayoutzMenuEditor.__addXmlLayout  s    OOH- 	!DNN4 	! '2\\ 		0EQx;&((d;qZ'00z58LqZ'00z58LqW$(($7',QxV$		0 r   c                    t               }g |_        |j                   j                  |_        |j                   j                  |_        |j                   j                  |_        |j                   j
                  |_        |j                   j                  |_        |j                  j                  ddg       |j                  D ]{  }t        |t              r|j                  |j                         /t        |t              r|j                  |j                         [t        |t               sl|j#                          } |j                  j                  ddg       ||_         |S )Nr   r   files)r   r   
show_emptyinlineinline_headerinline_aliasinline_limitr   r   r   r   parseMenunamerR   r   parseFilenameDesktopFileIDr   parseSeparator)r   r5   r   r   s       r   __addLayoutzMenuEditor.__addLayout  s   "MM44,,%}}::$mm88$mm88Wg./^^ 	(E%&$$UZZ0E9-$$U%8%89E9-%%'	( 	Wg./r   c                    |s|r[|r|j                   j                  |      dz   }n|r|j                   j                  |      }|j                   j                  |       n|j                   j                  |       | j	                  |j                  dd            }t        |t              rT|j                  j                  |       |j                  j                  |       | j                  ||j                  d       n!t        |t              r|j                  |       |s|r.| j                  |       | j                  ||j                          y y )Nr   Tr   )r   r   insertr   rQ   rS   r   r   r   rl   _MenuEditor__addXmlFilenamer   r   
addSubmenu_MenuEditor__addLayout_MenuEditor__addXmlLayoutr   )r   r5   r   r<   r=   r   
xml_parents          r   
__addEntryzMenuEditor.__addEntry  s   F,,U3a7,,V4NN!!%/NN!!%(&&v~~dD'AB
eY'%%e,MM  (!!*e.A.A9Mt$e$FV$
FMM: r   c                    |j                   j                  |       | j                  |j                  dd            }t	        |t
              rT|j                  j                  |       |j                  j                  |       | j                  ||j                  d       n+t	        |t              r|j                  j                  |       |s|r.| j                  |       | j                  ||j                         y y )NTr   )r   r   rQ   rS   r   r   rl   r   r   r   r   r   r   r   r   )r   r5   r   r<   r=   r   s         r   __deleteEntryzMenuEditor.__deleteEntry  s    e$&&v~~dD'AB
eY'MM  (%%e,!!*e.A.A9Mt$OO""5)FV$
FMM: r   c                     	 t        j                  |       	 | j                  j                  |       y # t        $ r Y (w xY w# t        $ r Y y w xY wr   )r!   r   OSErrorr   
ValueError)r   r   s     r   __deleteFilezMenuEditor.__deleteFile  sQ    	IIh	NN!!(+  		  		s   4 A 	A A 	AAc                     |D ]e  }|j                   j                         }|sd|_         |j                  j                         }|sd|_        t        |      sU| j	                  |       g y )Nrt   )r   striptailrk   $_MenuEditor__remove_whilespace_nodes)r   r   r   r   r  s        r   __remove_whitespace_nodesz$MenuEditor.__remove_whitespace_nodes	  s^     	6E::##%D
::##%D
5z..u5	6r   c                 D    | j                         D ]  \  }}||u s|c S  y r   )_MenuEditor__iter_parent)r   r   r5   r   s       r   __get_parent_nodezMenuEditor.__get_parent_node  s*    !//1 	MFE}	r   c              #   d   K   | j                   j                         D ]  }|D ]  }||f 
  y wr   )r   getiterator)r   r5   r   s      r   __iter_parentzMenuEditor.__iter_parent  s;     ii++- 	$F $em#$	$s   .0)NNF)NNNNNNN)NNNNN)NN)NNNNNNNN)NNNNNN)TN)r   ))__name__
__module____qualname__r   r   r.   r?   rE   rH   rO   rV   rX   rZ   r2   rD   r}   r   r   r   r   r   r   r   r   r   r+   r,   r1   rQ   r   ru   r   rT   r   r   r3   rK   r   r)   r   r   r   r   r   r      s    !2F 
(T1f6E," *	*9
*@
,&.;.; 	6$r   r   )__doc__r!   xml.etree.cElementTreer%   cElementTreeImportErrorxml.etree.ElementTreer(   xdg.Menur   r   r   r   r   xdg.BaseDirectoryr   r	   xdg.Exceptionsr
   
xdg.Configr   objectr   r  r   r   <module>r     sM     	*** H G < ' "E$ E$'  *))*s   	? AA