
    ը	f'I                     6   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
mZmZmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZmZm Z   G d dejB                        Z" G d d      Z# G d dejB                        Z$ G d de      Z%y)a   
@package modules.extensions

@brief GRASS Addons extensions management classes

Classes:
 - extensions::InstallExtensionWindow
 - extensions::ExtensionTreeModelBuilder
 - extensions::ManageExtensionWindow
 - extensions::CheckListExtension

(C) 2008-2016 by the GRASS Development Team

This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.

@author Martin Landa <landa.martin gmail.com>
@author Anna Petrasova <kratochanna gmail.com>
    N)task)	globalvar)GError
RunCommand
GExceptionGMessage)SetAddOnPath)gThread)	TreeModel
ModuleNode)	GListCtrl)	CTreeView)toolboxesOutdated)Button	StaticBoxMenuNewId
SearchCtrlc                       e Zd Zej                   ed      f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y)InstallExtensionWindowz+Fetch & install extension from GRASS Addonsc                 
    | _         | _        t                _        t	        j
                  j                   f|||d|  j                  t	        j                  t        j                  j                  t        j                  d      t        j                               t	        j                   t        j                          _        t%         j"                  t        j                   dt'        d      z         _        t+                _        t/         j"                   j,                  j1                                _        t5         j"                         _         j6                  j9                  t'        d              j6                  j;                  d	       t=                _        t%         j"                  t        j                   dt'        d
      z         _         tC        jD                  d      }g d}tF        jH                  dk(  r"|jK                  d       |jK                  d       |jM                         d   D ]  }|jO                  dd      }	|jO                  dd      }
|
s|jO                  dd      }
|	s|
s@|	|v rEt	        jP                   j"                  t        j                   |
       j                  |	<     jS                  d       _*        tW         j"                  t        jX                         _-        tW         j"                  t        j                   t'        d             _.         j\                  j_                  t'        d              j\                  ja                  d       tW         j"                  t        jb                         _2         jd                  j_                  t'        d              jZ                  jg                  t        jh                   fd        j\                  jg                  t        jh                   jj                          jd                  jg                  t        jh                   jl                          j6                  jg                  t        jn                   fd        j6                  jg                  t        jp                   fd        j2                  jr                  ju                   jv                          j2                  jx                  ju                   jz                          j2                  j|                  ju                   j~                         t	        j                   j                          j                          y )Nparentidtitle	grass.icor   r    %s z,List of extensions - double-click to installr   r   label)r   modelSearchTOptionsg.extension)lcgafthelpquietwin32diflagsname r    description   )numberz&Installz#Install selected add-ons GRASS toolFzShow g.extension manual pagec                 $    j                         S NCloseevtselfs    3/usr/lib/grass83/gui/wxpython/modules/extensions.py<lambda>z1InstallExtensionWindow.__init__.<locals>.<lambda>z       djjl     c                 B    j                  | j                               S r7   )Filter	GetStringr:   s    r=   r>   z1InstallExtensionWindow.__init__.<locals>.<lambda>~   s    $++cmmo2N r@   c                 &    j                  d      S )Nr2   )rB   r:   s    r=   r>   z1InstallExtensionWindow.__init__.<locals>.<lambda>   s    4;;r? r@   )Cr   _gifacedictoptionswxFrame__init__SetIconIconospathjoinr   ICONDIRBITMAP_TYPE_ICOPanelID_ANYpanelr   _treeBoxExtensionTreeModelBuildermodelBuilderr   GetModeltreer   searchSetDescriptiveTextShowCancelButtonr
   thread	optionBoxgtaskparse_interfacesysplatformappendget_optionsgetCheckBoxCreateStatusBar	statusbarr   ID_CLOSEbtnClose
btnInstall
SetToolTipEnableID_HELPbtnHelpBind
EVT_BUTTON	OnInstallOnHelpEVT_TEXTEVT_SEARCHCTRL_CANCEL_BTNselectionChangedconnectOnItemSelecteditemActivatedOnItemActivatedcontextMenuOnContextMenu	CallAfter_fetch_layout)r<   r   gifacer   r   kwargsr   ignoreFlagsr)   r1   descs   `          r=   rJ   zInstallExtensionWindow.__init__(   s    v
$Lv"ELVLGGBGGLL!2!2K@"BTBTU	
 XXTbii8

 !::yy1KLL
 67TZZt7H7H7Q7Q7ST	 ,&&q{3$$T*i"::"))6AiL3H
 $$]3E<<7"s#s#!!#G, 	A55$D55"%Duu]B/{"!#zzbiit"DLL	& --Q-7 djjR[[A 

ryy*V""1%J#KLu%TZZBJJ?"@ AB2==*BCR]]DNN;"--5&NO557RS		""**4+>+>?		''(<(<=		%%d&8&89
T[[!r@   c                    t        j                  t         j                        }|j                  | j                  dt         j
                  t         j                  z  d       t        j                  | j                  t         j                        }|j                  | j                  dt         j                  t         j
                  z  d       t        j                  | j                  t         j                        }| j                  j                         D ]"  }|j                  | j                  |   d       $ t        j                  t         j                        }|j                  | j                  d       |j                          |j                  | j                   dt         j"                  d       |j                  | j$                  d       |j                  |dt         j&                  t         j"                  z  t         j(                  z  t         j
                  z  d       |j                  |dt         j&                  t         j"                  z  t         j(                  z  t         j
                  z  d       |j                  |dt         j                  t         j
                  z  d       | j*                  j-                  |       |j/                  | j*                         | j1                          y)	Do layoutr      
proportionflagborderr4   r      N)rH   BoxSizerVERTICALAddr[   EXPANDALLStaticBoxSizerrV   
HORIZONTALrZ   r_   rG   keysrp   AddStretchSpacerrk   RIGHTrl   LEFTBOTTOMrT   SetSizerFitLayout)r<   sizer	treeSizeroptionSizerkeybtnSizers         r=   r   zInstallExtensionWindow._layout   s   BKK( 			$++!"))bff2DQ	O%%dllBMMB	diiABFFRYY4FqQ ''D<<$$& 	=COODLL-!O<	= ;;r}}-T\\a0!!#T]]qrxxJT__3 			288#bii/"));	 	 	
 			288#bii/"));	 	 	
 			(qrvv		/A!	L

E"		$**r@   c                    | j                   j                         }|rd|d   j                  vrt        t	        d      |        y |d   j                  d   }t               }| j                  j                         D ]W  }| j                  |   j                         s!t        |      dk(  r|j                  d|z         D|j                  d|z         Y dg|z   d	j                  |      gz   S )
Ncommandr   zExtension not definedr   r4   z-%sz--%sr$   zextension={})rZ   GetSelecteddatar   rU   listrG   r   	IsCheckedlenrd   format)r<   itemr1   r0   r   s        r=   _getCmdzInstallExtensionWindow._getCmd   s    yy$$&yQ41,-d;Aw||I&<<$$& 	/C||C **,s8q=LL-LL#.	/ &.*?*?*E)FFFr@   c                 $    | j                          y)"Fetch list of available extensionsN)r   r<   events     r=   OnFetchzInstallExtensionWindow.OnFetch   s    r@   c                 J    t        j                           j                  t        d      d       	  j                  j                   j                  j                  d fd       y# t        $ r1} j                          t        t        |       d       Y d}~yd}~ww xY w)	r   z8Fetching list of tools from GRASS-Addons (be patient)...r   r2   c                 $    j                         S r7   )
_fetchDone)r   r<   s    r=   r>   z/InstallExtensionWindow._fetch.<locals>.<lambda>   s    T__%6 r@   )callableurlondoneF)r   showTracebackN)rH   BeginBusyCursorSetStatusTextrU   r^   RunrX   Loadr   r   r   str)r<   errors   ` r=   r   zInstallExtensionWindow._fetch   s    
HI1	
	AKKOO**//6  
  	AOO3u:d%@@	As   5A( (	B"1'BB"c                    | j                   j                          t        | j                  j	                         j                  dd            }| j                  t        d      |z  d       t        j                          y )Nr   *r   valuez%d extensions loadedr   )
rZ   RefreshItemsr   rX   rY   SearchNodesr   rU   rH   EndBusyCursor)r<   nitemss     r=   r   z!InstallExtensionWindow._fetchDone   sc    		 T&&//1==)SV=WX134v=qA
r@   c                    | j                   j                         }|rK|j                  g d|      }| j                  j	                  |       | j                  j                          y | j                  j	                  |       y )Nr   keywordsr3   r   )rX   rY   FilteredrZ   SetModel	ExpandAll)r<   textr!   s      r=   rB   zInstallExtensionWindow.Filter   sg    !!**,NN:$ # E IIu%II!IIu%r@   c                 
   t        | d      s-t               | _        dD ]  }t               | j                  |<    |j                  }|r;d|v r5t               | _        | j                  j                  | j                  d   t        d             | j                  t        j                  | j                  | j                  d          | j                  j                          | j                  j                  | j                  d   t        d             | j                  t        j                  | j                  | j                  d          | j                  | j                         | j                  j!                          y y y )	NpopupID)installr+   r   r   Install)r   r+   zShow manual page)hasattrrF   r   r   r   r   	popupMenuAppendrU   rq   rH   EVT_MENUrs   AppendSeparator
OnItemHelp	PopupMenuDestroy)r<   noder   r   s       r=   r}   z$InstallExtensionWindow.OnContextMenu   s   tY'6DL* ,$)GS!, yyI%!VDNNN!!$,,y"91Y<HIIbkk4>>dll96MINNN**,NN!!$,,v"6:L8MNIIbkk4??t||F7KILNN4>>*NN""$ &4r@   c                 P    |j                   }|rd|v r| j                  d        y y y )Nr   )r   )r   rs   r<   r   r   s      r=   r{   z&InstallExtensionWindow.OnItemActivated  s*    yyI%NNN& &4r@   c                     | j                   j                         }| j                         }|r|j                  || j                         yy)zInstall selected extension)onDoneN)r   GetLogWindowr   RunCmdOnDone)r<   r   logcmds       r=   rs   z InstallExtensionWindow.OnInstall  s;    kk&&(llnJJs4;;J/ r@   c                     |j                   dk(  r@t        j                  d      st        d       t	        j
                          t                y y )Nr   GRASS_ADDON_BASEBASE)r   )
returncoderM   getenvr	   r   UpdateGRASSAddOnCommandsr   r   s     r=   r   zInstallExtensionWindow.OnDone  s<    q 99/0(..0 !r@   c                     | j                   j                         }|rd|d   j                  vry | j                  j	                  |d   j                  d   d       y )Nr   r   T)entryonline)rZ   r   r   rE   Help)r<   r   r   s      r=   r   z!InstallExtensionWindow.OnItemHelp  sM    yy$$&yQ4QY 7Er@   c                 <    | j                   j                  d       y )Nr$   )r   )rE   r   r   s     r=   rt   zInstallExtensionWindow.OnHelp  s    .r@   c                     |j                   }|.| j                  dd       | j                  j                  d       y| j                  |j	                  dd      d       | j                  j                  d       y)zItem selectedNr2   r   Fr3   T)r   r   rl   rn   rf   r   s      r=   ry   z%InstallExtensionWindow.OnItemSelected!  s_    yy<r1%OO""5)txxr:A>OO""4(r@   N)__name__
__module____qualname__rH   rS   rU   rJ   r   r   r   r   r   rB   r}   r{   rs   r   r   rt   ry    r@   r=   r   r   '   s`    
 99=>^@/bG&A 	&%$'
0 F/)r@   r   c                   0    e Zd ZdZd Zd Zd Zd ZddZy)	rW   z#Tree model of available extensions.c                     t               | _        t        t              | _        dD ]B  }| j                  j                  | j                  j                  |      }|| j                  |<   D y )N)displaydatabasegeneralimagerymisc
postscriptpaintrasterraster3DsitestemporalvectorwxGUIotherr   r    )rF   	mainNodesr   r   r!   
AppendNoderoot)r<   prefixr   s      r=   rJ   z"ExtensionTreeModelBuilder.__init__/  sY    z*

 	*F  ::((

v(ND%)DNN6"#	*r@   c                     | j                   S r7   )r!   )r<   s    r=   rY   z"ExtensionTreeModelBuilder.GetModelE  s    zzr@   c                     | j                   j                         D ]7  }t        |j                        D ]  }| j                  j                  |        9 y)z3Remove modules from tree keeping the main structureN)r  valuesreversedchildrenr!   
RemoveNode)r<   r   childs      r=   
_emptyTreez$ExtensionTreeModelBuilder._emptyTreeH  sH    NN))+ 	-D!$--0 -

%%e,-	-r@   c                 :    ddddddddd	d
ddddd}||v r||   S |S )Nr   r   r   r   r   r   r   r   r   r   r   r  r  r  )r.   dbr'   r/   mpsprr3sr*   vrH   r2   r   )r<   r&   r1   s      r=   _expandPrefixz'ExtensionTreeModelBuilder._expandPrefixN  sJ    
" 97Nr@   c                 ~   | j                          |rd}nd}t        ddd||d      \  }}}|dk7  rt        t        d      |z        d}|j	                         D ]  }|r	 |j                  d	d
      \  }	}
|	dk(  r[	 |
j                  dd
      \  }}| j                  | j                  |         }| j                  j                  ||
      }d|
i|_        |||
|j                  |	<   	 |j                         j                  dd
      \  }}| j                  |      |k(  rd}|dz   |z   }| j                  | j                  |         }| j                  j                  ||      }|ddd|_         y# t        $ r d}	|}
Y w xY w# t        $ r d}|
}Y w xY w# t        $ r d}|j                         }Y w xY w)zLoad list of extensionsr'   r%   r$   T)readgetErrorMsgr   r0   r,   r   zUnable to load extensions. %sN=r4   r1   .r2   r  r   r   )r  r   r   rU   
splitlinessplit
ValueErrorr  r  r!   r  r   strip)r<   r   fullr0   retcoderetmsgcurrentNodeliner   r   r  r1   mainNodemodules                  r=   r   zExtensionTreeModelBuilder.Loade  s   EE&$CuTX
c a<Q>?#EFFNN$ $	D!!%C!3JC
 &=%',{{3':  $~~d.@.@.HIH"&**"7"7xu"7"UK(15'9K$".05((-(#'::<#5#5c1#=LFD
 %%f-7F#,>>$*<*<V*DE"jj33863R% "#%$ A$	 " ! C E! & %!#$% " (F::<D(s6   "E6=F
+#F6FF
FFF<;F<N)T)	r   r   r   __doc__rJ   rY   r  r  r   r   r@   r=   rW   rW   ,  s    -*,-.3r@   rW   c                   P    e Zd Zej                   ed      fdZd Zd Zd Z	d Z
y)ManageExtensionWindowz(Manage installed GRASS Addons extensionsc                     | _         t        j                  j                   f|||d|  j	                  t        j
                  t        j                  j                  t        j                  d      t        j                               t        j                   t        j                         _        t         j                  t        j                  dt!        d      z         _        t%         j                         _        t)         j                  t        j*                  t!        d             _         j,                  j/                  t!        d	             t)         j                  t        j0                  t!        d
             _         j2                  j/                  t!        d             t)         j                  t        j4                         _         j,                  j9                  t        j:                   j<                          j2                  j9                  t        j:                   j>                          j6                  j9                  t        j:                   fd        jA                          y )Nr   r   r   r   zList of installed extensionsr   r   	Uninstallz$Uninstall selected Addons extensions	Reinstallz$Reinstall selected Addons extensionsc                 $    j                         S r7   r8   r:   s    r=   r>   z0ManageExtensionWindow.__init__.<locals>.<lambda>  r?   r@   )!r   rH   rI   rJ   rK   rL   rM   rN   rO   r   rP   rQ   rR   rS   rT   r   rU   extBoxCheckListExtensionextListr   	ID_REMOVEbtnUninstallrm   
ID_REFRESH	btnUpdaterj   rk   rq   rr   OnUninstallOnUpdater   )r<   r   r   r   r   s   `    r=   rJ   zManageExtensionWindow.__init__  s    
$Lv"ELVLGGBGGLL!2!2K@"BTBTU	
 XXTbii8
::yy1;<<
 *< #::",,an
 	$$Q'M%NO::"--q~
 	!!!$J"KLdjjR[[Ar}}d.>.>?BMM4==92==*BCr@   c                    t        j                  t         j                        }t        j                  | j                  t         j
                        }|j                  | j                  dt         j                  t         j                  z  d       t        j                  t         j
                        }|j                  | j                  dt         j                  d       |j                  | j                  dt         j                  d       |j                  | j                  d       |j                  |dt         j                  t         j                  z  d       |j                  |dt         j                  t         j                  z  d       | j                  j!                  |       |j#                  | j                         | j%                          y)r   r4   r   r   r   r   r   N)rH   r   r   r   r3  r   r   r5  r   r   rk   r   r9  r7  ALIGN_RIGHTrT   r   r   r   )r<   r   extSizerr   s       r=   r   zManageExtensionWindow._layout  s!   BKK($$T[["--@T\\abffryy6HQRS;;r}}-T]]qrxxJT^^KT&&15		(qrvv		/A!	L		(qr~~/Fq	Q

E"		$**r@   c                 n    | j                   j                         }|st        t        d      |        g S |S )Nz*No extension selected. Operation canceled.r   )r5  GetExtensionsr   rU   )r<   eLists     r=   _getSelectedExtensionsz,ManageExtensionWindow._getSelectedExtensions  s2    **,QFGPTUIr@   c           	         | j                         }|sy|D ]  }t        d| dd|d      j                         }t        |      dkD  r|dd }|j	                  d       t        j                  | t        d      t        j                  j                  |      |d	z  t        d
      t
        j                  t
        j                  z  t
        j                  z        }|j                         t
        j                  k(  st        dd| d|d        | j                   j#                          t%        j&                  |       t)                y)zUninstall selected extensionsNr$   Tremove)r   r  r,   	extension	operation
   z...zYList of files to be removed:
%(files)s

Do you want really to remove <%(ext)s> extension?)filesextzRemove extension)r   messagecaptionstyler)   )r0   r   r,   rE  rF  )rB  r   r   r   rd   rH   MessageDialogrU   rM   lineseprO   YES_NO
NO_DEFAULTICON_QUESTION	ShowModalID_YESr5  LoadDatar   r   r   )r<   r   rA  rI  rH  dlgs         r=   r:  z!ManageExtensionWindow.OnUninstall  s,   ++- 	C" jl  5zBcr
U#""H JJOOE23?	@
 ,-ii"--/"2B2BB	C }}"))+!!&1	B 	 	**51r@   c                     | j                         }|sy| j                  j                         }|D ]  }|j                  dd|z  dg        y)zUpdate selected extensionsNr$   zextension=%szoperation=add)rB  r   r   r   )r<   r   rA  r   rI  s        r=   r;  zManageExtensionWindow.OnUpdate  sQ    ++-kk&&( 	OCJJ~';_MN	Or@   N)r   r   r   rH   rS   rU   rJ   r   rB  r:  r;  r   r@   r=   r.  r.    s0     99:;	(T(+Z	Or@   r.  c                   "    e Zd ZdZd Zd Zd Zy)r4  zList of mapset/owner/groupc                     t        j                  | |       | j                  dt        d             | j	                          y )Nr   	Extension)r   rJ   InsertColumnrU   rT  )r<   r   s     r=   rJ   zCheckListExtension.__init__  s1    4( 	!Q{^,r@   c                     | j                          t        dd| dd      j                         D ]%  }|s| j                  | j	                         |       ' y)zLoad data into listr$   Tr(   )r,   r   r  r0   N)DeleteAllItemsr   r   
InsertItemGetItemCount)r<   rI  s     r=   rT  zCheckListExtension.LoadData%  sP    dS

*,	:C  1 1 3S9		:r@   c                     t               }t        | j                               D ]9  }| j                  |      s| j	                  |      }|s)|j                  |       ; |S )z!Get extensions to be un-installed)r   ranger^  IsItemCheckedGetItemTextrd   )r<   r5  r/   r1   s       r=   r@  z CheckListExtension.GetExtensions.  sZ    &t((*+ 	)A!!!$''*NN4(		) r@   N)r   r   r   r,  rJ   rT  r@  r   r@   r=   r4  r4    s    $:	r@   r4  )&r,  rM   rb   rH   grass.scriptr   r`   corer   	core.gcmdr   r   r   r   
core.utilsr	   core.gthreadr
   core.menutreer   r   gui_core.widgetsr   gui_core.treeviewr   core.toolboxesr   gui_core.wrapr   r   r   r   r   rI   r   rW   r.  r4  r   r@   r=   <module>rm     sz   ( 
 
 	 &  > > #   / & ' , D DB)RXX B)Jl l^}OBHH }O@ r@   