3
[                 @   sn  d dl mZmZ d dlZejdd 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Zejdde d dlZd dlZd dl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" ddl#m#Z# e$d\Z%Z&Z'Z(ddl)m*Z* G dd dZ+G dd dej,Z-G dd deZ.dS )    )absolute_importprint_functionNGtkz3.0)GLib)r   )Gdk)GObject)Gio)PangoignorezAccessed deprecated property)gettext)ngettext   )humanize_size)AlertWatcher)UpdateSystemGroup)InternalDialog)NotEnoughFreeSpaceError)ChangelogViewer)UnitySupport   )NetworkManagerHelperc               @   s   e Zd Zdd ZdS )
UpdateDatac             C   s   |r|ng | _ || _|| _d S )N)groupsgroupitem)selfr   r   r    r   @/usr/lib/python3/dist-packages/UpdateManager/UpdatesAvailable.py__init__T   s    zUpdateData.__init__N)__name__
__module____qualname__r   r   r   r   r   r   S   s   r   c               @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )CellAreaPackagea  This CellArea lays our package cells side by side, without allocating
       width for a cell if it isn't present (like icons for header labels).
       We assume that the last cell should be expanded to fill remaining space,
       and other cells have a fixed width.
    Fc             C   s"   t jj|  || _d | _i | _d S )N)r   CellAreaBoxr   indent_toplevelcolumncached_cell_size)r   r$   r   r   r   r   a   s    zCellAreaPackage.__init__c                s&  g   fdd}| j |d  i }xht D ]\\}}	t|	tjrR|	jd}
|
d k}nd}|||< | r*|| jkr*|	j|\}}|| j|< q*W |j }|j }| jd}| j	|}|j
|j }| j }tjj|j }d}||_d|_
t d }x0t D ]"\}}	||k}| jj|d}|j
dkrD|dkrD| j|j
| 7  _|dkr|d  rj| jrj|d7 }|dkrtd|d }|| }|dkr|}n|d	kr|d }n|| }| j|| 7  _|rt|||j }|| s|| |_
d}nd|_
|| }||	|j |j rd S qW d S )
Nc                s    j |  d S )N)append)celldata)cellsr   r   gatherk   s    z0CellAreaPackage.do_foreach_alloc.<locals>.gathergiconFspacingr   r         )foreach	enumerate
isinstancer   CellRendererPixbufget_propertyr&   Zget_preferred_widthcopyget_cell_startwidthxZget_current_path_stringZTreePathZnew_from_stringZ	get_depthlengetr$   max)r   contextwidgetZcell_area_inZ
bg_area_incallbackr+   Zcell_is_hiddenZcell_numberr(   r,   Z	hide_cellZmin_sizeZnatural_size	cell_areaZbg_arear-   
cell_startZorig_endZcur_pathZdepthZextra_cell_widthZlast_cell_numberZis_last_cellZ	cell_sizeindentZindent_sizeZindent_extrar   )r*   r   do_foreach_allocg   sd    










z CellAreaPackage.do_foreach_allocc             C   s8   | j |}|j|j | |_||_tjj| |||||S )N)r6   r7   r8   r   r#   do_event)r   r<   r=   eventr?   flagsr@   r   r   r   rC      s
    
zCellAreaPackage.do_eventc             C   s   | j s
dS tj }|jt |jd| |j }|jd| |j }| j j | | }| js|jd| | j	d}||j  d | }|S d S )Nr   zhorizontal-separatorzgrid-line-widthzexpander-sizer-   r   )
r%   r   ZValueZinitintZstyle_get_propertyget_intZget_x_offsetr$   r4   )r   r=   valZh_sepZ
line_widthr@   r-   r   r   r   r6      s    

zCellAreaPackage.get_cell_startN)F)r   r    r!   __doc__r   rB   rC   r6   r   r   r   r   r"   Z   s
   
Jr"   c               @   sR  e Zd ZdZdTd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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,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+dS )UUpdatesAvailablez/usr/share/app-install/iconsNFc                sf  t j | | _|j _|j _| _| _| _tj	j
 jd} j|d  j j d _d _d  _tjjd _tjj  _ jj j t d _ j   jtj jj  _! jt"d j# _$ j$ _%t&  _' j'j(   j)j* j'  j'j+ }|j,dt-j.j/d	 tj0t1t2j3t1t4 _5 j6j7d   j8j9 j: tj;j< tj= }|j>d
d |j>dd |j>dtj;j? |j>dd tj@d |}|jAtjBjC |jDd  j6jE| |jF| jG tHd _Itj@jJ jI}	|	 jI_K|	jLt"d |	j>dd |	jMd  j6jE|	 tjN }
|
j>dd |
jOd jP |	jQ|
d |	jR|
dtS |	jF|
 jT tj= }|j>dd |j>dtj;j? |	jQ|d |	jF| jU tjV }|j>dd |j>dt-jWjX |	jQ|d |	jF| jY tjV }|j>d
d |j>dd |j>dd |j>dd, tj@t"d|tZd}|jAtjBj[  j6jE|  j6j\d  j6j]d  j6j^tj_j`  j6jad  j6jb|	  j6jctd  j6jOd je  jjfd  _g jjfd! _h jijj jjfd"  jijOd# jk  jijOd$ jl  jmjOd$ jn tjjd% _o jojOd& fd'd(  jp  tq  _r jrjOd) js  jrjOd* jt  jrjOd+ ju d S )-Nzgtkbuilder/UpdateManager.uipane_updates_availabler   Tzcom.ubuntu.update-manager)parentzInstall Now
versiontag)ZweightZxpadr   Zypadr.   z
stock-sizezfollow-state   FzInstall or remover-   ZtoggledactiveZ	ellipsize   Zxalignr   Zscaleg      ?g333333?ZDownload)textzbutton-press-eventzshow-versionszsummary-before-namezshow-detailsactivateznotify::expandedzcom.ubuntu.update-notifierzchanged::auto-launchc                s    j  S )N)update_close_button)sp)r   r   r   <lambda>_  s    z+UpdatesAvailable.__init__.<locals>.<lambda>znetwork-alertzbattery-alertznetwork-3g-alertg?)vr   r   window_mainZdatadircachecustom_headercustom_descneed_rebootospathjoinZ_load_uiZset_content_widgetrK   dl_size	connectedZsleep_cookier   ZSettingsnewsettingsr   Z	IconThemeZget_default	app_iconsZappend_search_pathAPP_INSTALL_ICONS_PATHr   unityZadd_settings_buttonZ
add_buttonSTOCK_CANCELclosebutton_close_on_button_install_clickedbutton_installZfocus_buttonr   textview_changesshowZscrolledwindow_changesadd
get_bufferZ
create_tagr	   ZWeightZBOLDZ	TreeStorestrr   ZTYPE_PYOBJECTboolstoretreeview_update	set_modelZimage_restartZset_from_giconget_restart_iconZIconSizeZBUTTONr3   set_propertyZMENUZTreeViewColumnZ
set_sizingZTreeViewColumnSizingZFIXEDZset_fixed_widthZappend_columnZset_cell_data_funcrestart_icon_renderer_data_funcr"   pkg_cell_areaZnew_with_arear%   Z	set_titleZ
set_expandZCellRendererToggleconnecton_update_toggledZ
pack_startZadd_attributeLIST_TOGGLE_ACTIVEpkg_toggle_renderer_data_funcpkg_icon_renderer_data_funcZCellRendererTextZEllipsizeModeZENDpkg_label_renderer_data_func	LIST_SIZEZAUTOSIZEZset_headers_visibleZset_headers_clickableZset_directionZTextDirectionZLTRZset_fixed_height_modeZset_expander_columnZset_search_column	LIST_NAMEon_treeview_button_pressget_booleanZshow_versionsZsummary_before_nameexpander_detailsZset_expandedpre_activate_detailsactivate_detailsexpander_descactivate_descZnotifier_settingsrS   r   alert_watcher_on_network_alert_on_battery_alert_on_network_3g_alert)r   rW   headerZdescr[   Zcontent_ui_pathchanges_bufferZrestart_icon_rendererZrestart_columnZ
pkg_columnZpkg_toggle_rendererZpkg_icon_rendererZpkg_label_rendererZsize_rendererZsize_columnr   )r   r   r      s    








zUpdatesAvailable.__init__c             C   s   t j|  | j  d S )N)r   stop_save_state)r   r   r   r   r   i  s    
zUpdatesAvailable.stopc             C   s.   t j|  | j| jj | jj  | j  d S )N)r   startset_update_listrW   update_listr   Zcheck_alert_state_restore_state)r   r   r   r   r   m  s    

zUpdatesAvailable.startc             C   s   t jjd}|dkS )Nz#APT::Periodic::Update-Package-Listsr   )apt_pkgconfigZfind_i)r   Zupdate_daysr   r   r   is_auto_updates  s    zUpdatesAvailable.is_auto_updatec             C   s\   | j  r2| jjtd | jjd | jjd n&| jjtj | jjd | jjd d S )Nz_Remind Me LaterFT)r   rh   Z	set_labelri   Zset_use_stockZset_use_underliner   rf   )r   r   r   r   rS   x  s    z$UpdatesAvailable.update_close_buttonc             C   s   | j d  | j  d S )N)select_all_upgradesrj   )r   menuZmenuitemr)   r   r   r   install_all_updates  s    
z$UpdatesAvailable.install_all_updatesc             C   s,   |d ks|j d krdS |j jjd}|dkS )NFzRestart-Requiredsystem)	candidaterecordr:   )r   pkgZrestart_conditionr   r   r   pkg_requires_restart  s    z%UpdatesAvailable.pkg_requires_restartc             C   s   dddg}t jj|S )Nzview-refresh-symboliczsystem-restartzsystem-reboot)r   
ThemedIconZnew_from_names)r   Zrestart_icon_namesr   r   r   ru     s    z!UpdatesAvailable.get_restart_iconc             C   s   |j |t}|j|}d}|jr8|jjr8| j|jj}n<|jrt| jj|stx(|jj	D ]}	|	jrT| j|	jrTd}P qTW |r| j
 }
nd }
|jd|
 d S )NFTr,   )	get_valueLIST_UPDATE_DATAget_pathr   r   r   r   rs   Zrow_expandeditemsru   rv   )r   cell_layoutrenderermodeliter	user_datar)   r]   requires_restartZ
group_itemr,   r   r   r   rw     s     


z0UpdatesAvailable.restart_icon_renderer_data_funcc             C   s   |j |t}d}d}|jr2|jjj| jjk}d}np|jrHd}|jj }nZ|j	rd}d}d }	xF|j	D ]<}
x0|
j
D ]&}|j }|	d k	r|	|krd}P |}	qnW |rbP qbW |jd| |jd| d S )NFTactivatableinconsistent)r   r   r   r   namelist	held_backr   Zselection_is_inconsistentr   r   is_selectedrv   )r   r   r   r   r   r   r)   r   r   Zsaw_installr   r   Zthis_installr   r   r   r|     s0    z.UpdatesAvailable.pkg_toggle_renderer_data_funcc             C   sJ   |j |t}d }|jr&| j|jj}n|jr:| j|jj}|jd| d S )Nr,   )r   r   r   get_app_install_iconiconr   rv   )r   r   r   r   r   r   r)   r,   r   r   r   r}     s    z,UpdatesAvailable.pkg_icon_renderer_data_funcc             C   sP   t |tjs|S | jj|j dtjj}|dk	rHtj	j
tjj|j S |S dS )zAny application icon is coming from app-install-data's desktop
           files, which refer to icons from app-install-data's icon directory.
           So we look them up here.   N)r2   r   r   rc   Zchoose_iconZ	get_namesr   ZIconLookupFlagsZ
FORCE_SIZEZFileIconra   ZFileZnew_for_pathget_filename)r   r   infor   r   r   r     s    
z%UpdatesAvailable.get_app_install_iconc       	      C   sN   |j |t}tj|j |t}|jr*|}n|jr6|}nd| }|jd| d S )Nz	<b>%s</b>markup)r   r   r   Zmarkup_escape_textr   r   r   rv   )	r   r   r   r   r   r   r)   r   r   r   r   r   r~     s    z-UpdatesAvailable.pkg_label_renderer_data_funcc             C   s   |j d |jd}t|dkr.|j | d S xv|D ]n}|j }tjdtj| |}tjd|}	|r|jd}
td|
 }|j	||d q4|	rq4|j
||d  q4W d S )N 
r   z^%s \((.*)\)(.*)\;.*$z^.*--.*<.*@.*>.*$zVersion %s: 
rM   )set_textsplitr9   Zget_end_iterrematchescaper   ri   Zinsert_with_tags_by_nameinsert)r   r   rQ   r   srcpkglineslineZend_iterZversion_matchZauthor_matchversionZversion_textr   r   r   set_changes_buffer  s$    




z#UpdatesAvailable.set_changes_bufferc             C   s*  |j  d }|d krd S |j }|j|}|j|t}|j}|d krb|jd k	rb|jjd k	rb|jj}|d ks|jd ks|jj	d ks|jj	j
d kr| jj }|jd | jj }|jd | jjd d S |jj	j
}	| jjd tjdtj}
|
jd|	}	tjdtj}
|
jd|	}	tjd	tj}
|
jd
|	}	| jj }|j|	 |jj}|d krTd S | jj }|| jjkr| jj| }| j| j	j}| j|||| n | js|jtd n| jj rtj }|j   tj!| jj"||fd}|j#  |jdtd  |j$d}|j%|}t&j'dd}| jj(|| |j)  |j*ddd |}x4|j+ rzt,j-d xt&j. rtt&j/  q^W qHW |j0  |j1|r|j2| |j  d }|d krd S ||krd S d}| j| j	j}|| jj3kr|| jj3| 7 }|| jjkr|| jj| 7 }|r&| j|||| d S )Nr   r   FTz^(\s|\t)*(\*|0|-)z
*z\n z\s\s+r   zKNo network connection detected, you can not download changelog information.)targetargsz%s
zDownloading list of changes...r   z
gtk-cancel)ZstockZclickedc             S   s   |j  S )N)release)wlockr   r   r   rV   S  s    zDUpdatesAvailable.on_treeview_update_cursor_changed.<locals>.<lambda>g{Gz?)4Z
get_cursor	get_modelget_iterr   r   r   r   	core_itemr   r   Zdescriptionrl   ro   r   Ztextview_descrnotebook_detailsset_sensitiver   compile	MULTILINEsubr   rX   Zall_changesZsource_namer   r`   ri   r   get_expanded	threadingZLockacquireZThreadZget_news_and_changelogr   Zget_iter_at_lineZcreate_child_anchorr   ZButtonZadd_child_at_anchorrm   ry   lockedtimeZsleepevents_pendingmain_iterationhideZhandler_is_connectedZ
disconnectZall_news)r   r=   r]   r   r   r)   r   r   Zdesc_bufferZ	long_descrU   r   Zchangesr   r   Zchangelog_threadZanchorbuttonidZnow_pathr   r   r   !on_treeview_update_cursor_changed  s    















z2UpdatesAvailable.on_treeview_update_cursor_changedc             C   s   |j tjjkr|jdkrtj  | _}tjj	t
d}|jd| j |j| | jj}|dkrj|jdd tjj	t
d}|jd| j |j| |j  |jddddd|j|j |j  d	S dS )
zW
        Show a context menu if a right click was performed on an update entry
        r/   z_Deselect AllrR   r   Z	sensitiveFzSelect _AllNT)typer   Z	EventTypeZBUTTON_PRESSr   r   ZMenur   ZMenuItemZnew_with_mnemonicri   ry   select_none_upgradesr'   rX   install_countrv   r   Zshow_allZpopup_for_devicer   rm   )r   r=   rD   r   Zitem_select_noneZnum_updatesZitem_select_allr   r   r   r   n  s     

z)UpdatesAvailable.on_treeview_button_pressc             C   sN   | j j }x>|D ]6}|j|jt}|jdk	s6|jdk	r|j|jt| qW dS )z< small helper that will set/unset the group headers
        N)	rs   r   r   r   r   r   r   	set_valuer{   )r   Znew_selection_valuer   rowr)   r   r   r   _toggle_group_headers  s    


z&UpdatesAvailable._toggle_group_headersc             C   s>   | j d | jj  | jd | jj  | j  | j d dS )z$
        Select all updates
        TFN)setBusyrX   ZsaveDistUpgrader   rs   
queue_drawupdates_changed)r   r=   r   r   r   r     s    



z$UpdatesAvailable.select_all_upgradesc             C   s>   | j d | jj  | jd | jj  | j  | j d dS )z%
        Select none updates
        TFN)r   rX   clearr   rs   r   r   )r   r=   r   r   r   r     s    



z%UpdatesAvailable.select_none_upgradesc             C   s^   | j j dkrdS |r4| j j jtjjtjj n| j j jd xtj	 rXtj
  qFW dS )z Show a watch cursor if the app is busy for more than 0.3 sec.
        Furthermore provide a loop to handle user interface events N)rW   Z
get_windowZ
set_cursorr   ZCursorra   Z
CursorTypeZWATCHr   r   r   )r   flagr   r   r   r     s    

zUpdatesAvailable.setBusyc             C   s   dd }| j j|d  d S )Nc             S   s`   | j |t}d}|jr"|jj }n,|jr4|jj }n|jrNtdd |jD }| j|t	| d S )NFc             S   s   g | ]}|j  qS r   )packages_are_selected).0gr   r   r   
<listcomp>  s    zOUpdatesAvailable._mark_selected_updates.<locals>.foreach_cb.<locals>.<listcomp>)
r   r   r   r   r   r   r   anyr   r{   )r   r]   r   r)   rO   r   r   r   
foreach_cb  s    z;UpdatesAvailable._mark_selected_updates.<locals>.foreach_cb)rr   r0   )r   r   r   r   r   _mark_selected_updates  s    
z'UpdatesAvailable._mark_selected_updatesc                s0   d  fdd}j j|d  jj  d S )NFc                sb   | j |t}| j |t}|s d S d }|jr4|jj}n|jrL|jjrL|jjj}|r^j|r^d d S )NT)r   r   r{   r   r   r   r   r   )r   r]   r   r)   rO   r   )r   r   r   r   r     s    

z@UpdatesAvailable._check_for_required_restart.<locals>.foreach_cb)rr   r0   hbox_restartZset_visible)r   r   r   )r   r   r   _check_for_required_restart  s    z,UpdatesAvailable._check_for_required_restartc             C   sL  | j j| jj y| jj}| jj| _d}| jdkrjtdt| j }| jjd | j jd | j	j
d nZ|dkrtdd|}| j jd | j	j
d n td}| j jd | j	j
d | jjd | jj| | jj  | jj  W n` tk
rF } zBtd	|  | jjtd
 | jjd | jj  | jj  W Y d d }~X nX d S )Nr   r   z%s will be downloaded.Tz'The update has already been downloaded.z)The updates have already been downloaded.z There are no updates to install.Fz-required_download could not be calculated: %szUnknown download size.)rk   r   rX   r   Zrequired_downloadr_   ri   r   Zimage_downsizere   set_install_menuitem_visibler   Zlabel_downsizer   Zhbox_downsizerm   vbox_alertsSystemErrorprintZ
set_markup)r   Z
inst_countZdownload_strer   r   r   _refresh_updates_count  s>    



z'UpdatesAvailable._refresh_updates_countc             C   s   | j   | j  | j  d S )N)r   r   r   )r   r   r   r   r     s    z UpdatesAvailable.updates_changedc             C   s   | j   d}d}| jdk	r | j}| jdk	r2| j}nb| jjdrr| jjj}| jjj}t	d||f }| jj
dd n"t	d}| jj  r| jrt	d}| jjd | jjd | j| | j| dS )zmactivate or disable widgets and show dialog texts corresponding to
           the number of available updatesNz	first-runzYUpdated software has been issued since %s %s was released. Do you want to install it now?FzOUpdated software is available for this computer. Do you want to install it now?zIThe computer also needs to restart to finish installing previous updates.T)r   rY   rZ   rb   r   rW   Zmeta_releaseZflavor_nameZcurrent_dist_versionri   set_booleanr   Zget_visibler[   r   r   rs   Z
set_headerZset_desc)r   Ztext_headerZ	text_descZflavorr   r   r   r   update_count  s*    






zUpdatesAvailable.update_countc             C   s   | j j }|r| j  d S )N)r   r   r   )r   expanderexpandedr   r   r   r   (  s    
z%UpdatesAvailable.pre_activate_detailsc             C   s4   | j j }| jjd| |r(| j| j | j  d S )Nzshow-details)r   r   rb   r   r   rs   r   )r   r   r)   r   r   r   r   r   -  s
    
z!UpdatesAvailable.activate_detailsc             C   s   | j j }| j j| d S )N)r   r   Zset_vexpand)r   r   r)   r   r   r   r   r   4  s    
zUpdatesAvailable.activate_descc             C   s  | j jd td}td}td}td}td}td}td}y| jj  W nd tk
r } ztjjd	}	d}
x|j	D ]}|
dkr|
d
7 }
|j
|	kr|
||j|j
|j|j
|f 7 }
q|j
dkr|
||j|j
|j|j
|f 7 }
q|j
dkr|
||j|j
|j|j
|f 7 }
q|j
dkrB|
||j|j
|j|j
|f 7 }
q|j
dkr|
||j|j
|j|j
|f 7 }
qW | jjd||
 d S d }~X n. tk
r } ztjd W Y d d }~X nX | jj  d S )NFzNot enough free disk spacezxThe upgrade needs a total of %s free space on disk '%s'. Please free at least an additional %s of disk space on '%s'. %szIRemove temporary packages of former installations using 'sudo apt clean'.zYou can remove old kernels using 'sudo apt autoremove', and you could also set COMPRESS=xz in /etc/initramfs-tools/initramfs.conf to reduce the size of your initramfs.z^Empty your trash and remove temporary packages of former installations using 'sudo apt clean'.z!Reboot to clean up files in /tmp.r   zDir::Cache::archivesr   z/boot/z/tmpz/usrzfree space check failed)re   r   ri   rX   ZcheckFreeSpacer   r   r   Zfind_dirZfree_space_required_listdirZ
size_totalZsize_neededrW   Zstart_errorr   loggingZ	exceptionZstart_install)r   Zerr_sumZerr_msgZremedy_archivedirZremedy_bootZremedy_rootZ
remedy_tmpZ
remedy_usrr   Z
archivedirZerr_longZreqr   r   r   rj   8  sR    


z*UpdatesAvailable.on_button_install_clickedc             C   s   |t jkr>| jjtd | j  | jj  | jj  d| _	nl|t j
ksR|t jkrx| j  | jj  d| _	| j| j n2d| _	| jjtd | j  | jj  | jj  d S )NzConnecting...FTzAYou may not be able to check for updates or download new updates.)r   ZNM_STATE_CONNECTING_LISTZlabel_offliner   ri   r   Zhbox_offlinerm   r   r`   ZNM_STATE_CONNECTED_LISTZNM_STATE_UNKNOWNr   r   rs   )r   watcherstater   r   r   r   q  s"    






z"UpdatesAvailable._on_network_alertc             C   s(   |r| j j  | jj  n
| j j  d S )N)Zhbox_batteryrm   r   r   )r   r   Z
on_batteryr   r   r   r     s    
z"UpdatesAvailable._on_battery_alertc             C   sL   |r| j j  | jj  n.|r4| jj  | j j  n| jj  | j j  d S )N)Zhbox_roamingrm   Z
hbox_on_3gr   )r   r   Zon_3gZ
is_roamingr   r   r   r     s    


z%UpdatesAvailable._on_network_3g_alertc             C   s`   | j j|}| j j|t}|jr8| jdd |jD  n$|jrN| j|jj n| j|jg dS )z- a toggle button in the listview was toggled c             S   s   g | ]}|j D ]}|qqS r   )r   )r   r   r   r   r   r   r     s    z6UpdatesAvailable.on_update_toggled.<locals>.<listcomp>N)	rr   r   r   r   r   toggle_from_itemsr   r   r   )r   r   r]   r   r)   r   r   r   rz     s    z"UpdatesAvailable.on_update_toggledc             G   s   | j d| dS )zj
        If an update row was activated (by pressing space), toggle the
        install check box
        N)rz   )r   Ztreeviewr]   r%   r   r   r   r    on_treeview_update_row_activated  s    z1UpdatesAvailable.on_treeview_update_row_activatedc             C   s   | j d tj| jj}tdd |D }xb|D ]Z}y@|rF|jj  n,|jj| j	j
krr|jsh|jj  n
|jj  W q0 tk
r   Y q0X q0W | jjjrtj| jj}|j  | j  | jj  ~| j d d S )NTc             S   s   g | ]}|j  qS r   )r   )r   r   r   r   r   r     s    z6UpdatesAvailable.toggle_from_items.<locals>.<listcomp>F)r   r   ZActionGrouprX   Z	_depcacher   r   Z	mark_keepr   r   r   Z	to_removeZmark_installZmark_deleter   Zbroken_countZProblemResolverZresolve_by_keepr   rs   r   )r   r   ZactiongroupZkeep_packagesr   ZFixr   r   r   r     s(    




z"UpdatesAvailable.toggle_from_itemsc             C   s8   | j j r4| jj \}}| jjd| | jjd| dS )z' save the state  (window-size for now) zwindow-widthzwindow-heightN)r   r   rW   Zget_sizerb   Zset_int)r   r   hr   r   r   r     s    
zUpdatesAvailable._save_statec             C   sD   | j jd}| j jd}| jj }|r6| jj|| n
| jj  dS )z) restore the state (window-size for now) zwindow-widthzwindow-heightF)rb   rG   r   r   rW   Zbegin_user_resizableZend_user_resizable)r   r   r  r   r   r   r   r     s    

zUpdatesAvailable._restore_statec             C   sD   d}x|D ]}||j   }q
W |t|d d t|dg}| jjd |S )Nr   T)get_total_sizer   r   rr   r'   )r   r   r   Z
total_sizer   Z
header_rowr   r   r   _add_header  s    

zUpdatesAvailable._add_headerc          	   C   s   x|D ]}|j sqd }t|t r:t|j dkr:|j d }|jtd ||t|j dg}| jj	d |}|rlqxB|j D ]8}|jtd d |tt
|jjdddg}| jj	|| qtW qW d S )Nr   r   Tsize)r   r2   r   r9   r   r   r   r  rr   r'   getattrr   r   )r   r   r   Zgroup_is_itemZ	group_rowZ
group_iterr   Zitem_rowr   r   r   _add_groups  s(    




zUpdatesAvailable._add_groupsc             C   sV  || _ | jd | jjd  | jj  d| _| jj  | j j	r`| j
td| j j	 | j| j j	 | j j	r| j jr| j
td| j j n$| j jr| j jr| j
td| j j | j jr| j| j j | j jr| j
td| j j | j| j j | jj| j t| j j	pt| j j| j_| j  | j  | jd xtj rHtj  q2W | j  dS )NTr   zSecurity updateszOther updatesZUpdatesz#Unused kernel updates to be removedF)r   r   rs   rt   rr   r   r_   Zscrolledwindow_updaterm   Zsecurity_groupsr  ri   r  Zupdate_groupsZkernel_autoremove_groupsrq   rx   r$   rS   r   r   r   r   r   )r   r   r   r   r   r     s<    




z UpdatesAvailable.set_update_list)NNF),r   r    r!   rd   r   r   r   r   rS   r   r   ru   rw   r|   r}   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rj   r   r   r   rz   r   r   r   r   r  r  r   r   r   r   r   rJ      sV    
 
c
)$9"rJ   )/Z
__future__r   r   ZgiZrequire_versionZgi.repositoryr   r   r   r   r   r	   warningsfilterwarningsDeprecationWarningr   r\   r   r   r   r   r   ri   r   Z
Core.utilsr   ZCore.AlertWatcherr   ZCore.UpdateListr   ZDialogsr   ZDistUpgrade.DistUpgradeCacher   r   r   ranger   r   r   r{   Z	Core.roamr   r   r#   r"   rJ   r   r   r   r   <module>    s>   u