
    ը	fgZ             
          d Z ddlZddlZ	 ddlmc mc m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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"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 dZ5i d e+d e6d            d e+d e6d            d e+d e6d            d e+d e6d             d! e+d" e6d#            d$ e+d% e6d&            d' e+d( e6d)            d* e+d+ e6d,            d- e+d. e6d/            d0 e+d1 e6d2            d3 e+d4 e6d5            d6 e+d7 e6d8            d9 e+d: e6d;            d< e+d= e6d>            d? e+d= e6d@            dA e+dB e6dC            dD e+dE e6dF       e6dG      H       e+dI e6dJ             e+dK e6dL             e+dM e6dN             e+dO e6dP            dQZ7 G dR dSe
jp                  ejr                        Z:y# e$ r ddl	mc mZ Y w xY w# e$ r
 ddlm
Z
 Y !w xY w)Ta  
@package lmgr.layertree

@brief Utility classes for map layer management.

Classes:
 - layertree::LayerTree

(C) 2007-2015 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 Michael Barton (Arizona State University)
@author Jachym Cepicky (Mendel University of Agriculture)
@author Martin Landa <landa.martin gmail.com>
    N)	treemixin)core)vector)utils)	globalvar)SqlQueryFrameSetOpacityDialogTextEntryDialog)GUIMap)GetLayerNameFromCmdltype2command)Debug)UserSettingsGetDisplayVectSettings)
haveVDigit)GWarningGError
RunCommand)MetaIcon)MapValidator)MenuGenBitmapButtonTextCtrlNewId)'LayerManagerGrassInterfaceForMapDisplay   	wmsImportzlayer-wms-addzImport data from WMS server)imglabellayerCmdzlayer-command-addzAdd command layerquitQuitlayerRasterrasterzAdd raster map layerlayerRgbrgbzAdd RGB map layerlayerHishiszAdd HIS map layerlayerShadedzshaded-reliefzAdd shaded relief map layerlayerRastarrowzaspect-arrowzAdd raster flow arrowslayerRastnumz	cell-catszAdd raster cell numberslayerVectorr   zAdd vector map layerlayerThememapzvector-thematicz*Add thematic (choropleth) vector map layerlayerThemechartzvector-chartzAdd thematic chart layer	layerGridzlayer-grid-addzAdd grid layerlayerGeodesiczshortest-distancezAdd geodesic line layer
layerRhumbzAdd rhumbline layerlayerLabelsr!   z
Add labelslayerRaster_3draster3dzAdd 3D raster map layerz:Note that 3D raster data are rendered only in 3D view mode)r    r!   descwmszAdd WMS layer.optionszSet optionsz
layer-editzEditing modezlayer-bottomzBackground vector map)layerWmslayerOptionslayerEdited
layerBgmapc                       e Zd ZdZej
                  ej                  ej                  ej                  z  ej                  z  ej                  z  ej                  z  ej                  z  df fd	Zd Zd Z ee      Zd ZdLdZdMd	Zd
 ZdNdZdNdZd Zd Zd ZdNd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 Z*d Z+d  Z,d! Z-d" Z.d# Z/d$ Z0d% Z1d& Z2d' Z3d( Z4dLd)Z5d* Z6d+ Z7d, Z8d- Z9d. Z:d/ Z;	 dOd0Z<d1 Z=	 	 	 	 	 	 	 	 	 dPd2Z>d3 Z?dQd4Z@d5 ZAd6 ZBd7 ZCd8 ZDd9 ZEd: ZFd; ZGd< ZHd= ZId> ZJdNd?ZKdRd@ZLdA ZMdLdBZNdC ZOdD ZPdE ZQdF ZRdG ZSdQdHZTdI ZUdJ ZVdK ZW xZXS )S	LayerTreezCreates layer tree structureNc                 J
   d|v r||d   z  }|d= |d   | _         |d= |d   | _        |d= || _        || _        t	               | _        d | _        d| _        i | _        i | _        d| _	        d| _
        d| _        d| _        d| _        d| _        	 |t        j                   z  }t$        j&                  rt)        t*        | Z  ||fd|i| nt)        t*        | Z  ||fd|i| | j/                  d	       | j1                  t3        j4                         j7                  t2        j8                               | j;                  d
       t<        j>                  dk7  r| jA                  d       | jC                          tE        ||       | _#         || jF                  |       | _$        | jK                  tM        d            | _        | jO                  | j
                  d       d| _(        t3        jR                  ddd      }	t2        jT                  jW                  t2        jX                  t2        jZ                  d      }
|	j]                  |
      | _/        t2        jT                  jW                  t2        j`                  t2        jZ                  d      }
|	j]                  |
      | _1        | je                  |	       | jg                  |	       | ji                  t2        jj                  | jl                         | ji                  t2        jn                  | jp                         | ji                  t2        jr                  | jt                         | ji                  t        jv                  | jx                         | ji                  t        jz                  | j|                         | ji                  t2        j~                  | j                         | ji                  t2        j                  | j                         | ji                  t2        j                  | j                         | ji                  t2        j                  | j                         | ji                  t2        j                  | j                         | ji                  t2        j                  | j                         | ji                  t2        j                  | j                         | ji                  t2        j                  | j                         | j                  j                  j                  | j                         y # t"        $ r Y w xY w)Nstylelmgrnotebookr   T FagwStyler?      darwin)	layertree
Map LayersNN   rL   rL   )mask)RrB   rC   _gifacetreepgr   root	groupnodeoptpagesaveitemfirstflagrerenderhitCheckbox
forceCheckcentreFromsOnParentCTTR_ALIGN_WINDOWSAttributeErrorr   hasAgwsuperr?   __init__SetNameSetBackgroundColourwxSystemSettings	GetColourSYS_COLOUR_WINDOWSetGradientStylesysplatformEnableSelectionGradient_setGradientr   _gifaceForDisplay
mapdisplayAddRoot_	SetPyDatabmpsize	ImageListArtProvider	GetBitmapART_FILE_OPEN	ART_OTHERAddfolder_open
ART_FOLDERfolder	_setIconsAssignImageListBindEVT_TREE_ITEM_ACTIVATEDOnActivateLayerEVT_TREE_SEL_CHANGEDOnChangeSelEVT_TREE_SEL_CHANGINGOnChangingSelEVT_TREE_ITEM_CHECKEDOnLayerCheckedEVT_TREE_ITEM_CHECKINGOnLayerCheckingEVT_TREE_DELETE_ITEMOnDeleteLayerEVT_TREE_ITEM_RIGHT_CLICKOnLayerContextMenuEVT_TREE_END_DRAG	OnEndDragEVT_TREE_END_LABEL_EDIT	OnRenamed
EVT_KEY_UPOnKeyUpEVT_KEY_DOWN	OnKeyDownEVT_IDLEOnIdle
EVT_MOTIONOnMotiongrassdbChangedconnectOnGrassDBChanged)selfparentgifacecreateNewMapDisplayidrA   ctstyletitlekwargsiltrart	__class__s              //usr/lib/grass83/gui/wxpython/lmgr/layertree.pyr_   zLayerTree.__init__]   s     fvg&Gw6N	6Nz*:5	
	  #' 	r***G )T+FBSSFS)T+FBPgPP[!  !2!2!4!>!>r?S?S!TU
 	a <<8#((. "IQU!V-d.D.DPTULL<1	tyy,/  \\"bu-(()9)92<<R66%=((hOffUmrR 		",,d.B.BC		"))4+;+;<		"**D,>,>?		"**D,?,?@		"++T-A-AB		"))4+=+=>		"..0G0GH		"&&7		",,dnn=		"--.		"//4>>2		"++t{{+		"--/##++D,A,ABe  		s   T 	T"!T"c                     i | _         dD ]^  }|t        d      d  j                         }t        |   j	                  | j
                        }|j                  |      | j                   |<   ` y )N)r%   r5   r'   r)   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r"   r:   r<   r=   layer)_iconlenlowerLMIconsrs   rp   rv   )r   r   iconNameiconKeyicons        r   rz   zLayerTree._setIcons   sd    

 	/H( s7|~.446G8$..t||<D"$&&,DJJw-	/    c                 (    | j                  dd      S )zGet selected layer.

        :return: None if no layer selected
        :return: first layer (GenericTreeItem instance) of all selected
        FmulticheckedOnlyGetSelectedLayerr   s    r   _getSelectedLayerzLayerTree._getSelectedLayer   s     $$5e$DDr   )fgetc                 $    | j                          y)zRecalculate layer context options button position

        Calculates all the positions of the visible items fix
        length from item to next non-toplevel window.
        N)CalculatePositionsr   s    r   _recalculateLayerButtonPositionz)LayerTree._recalculateLayerButtonPosition   s     	!r   c                 (    | j                  d|      S )zGet selected layers as a list.

        .. todo::
            somewhere we have checkedOnly default True and elsewhere False
        Tr   r   )r   r   s     r   GetSelectedLayerszLayerTree.GetSelectedLayers   s     $$4[$IIr   c                     g }| j                         }|D ])  }|r|s|j                         s|j                  |       + |r|S |r|d   S y)aB  Get selected layer from layer tree.

        :param bool multi: return multiple selection as a list
        :param bool checkedOnly: return only the checked layers

        :return: None or [] for multi == True if no layer selected
        :return: first layer (GenericTreeItem instance) of all selected or a list
        r   N)GetSelections	IsCheckedappend)r   r   r   retlayersr   s         r   r   zLayerTree.GetSelectedLayer   sY     ##% 	"E;5??3D

5!	" Jq6Mr   c                    | j                  |      r| j                  |      d   S | j                  |      | j                  k(  r| j	                  |      S | j	                  |      }|r|S | j	                  | j                  |            S )z6!Returns next item from tree (flattened expanded tree)r   )GetChildrenCountGetFirstChildGetItemParentrP   GetNextSibling)r   itemsiblings      r   GetNextItemzLayerTree.GetNextItem
  s       &%%d+A..d#tyy0&&t,, %%d+N""4#5#5d#;<<r   c                     |s!| j                  |d      j                         }| j                  || j                  |          y )Nmaplayerkey)GetLayerInfoGetTypeSetItemImager   )r   r   r   s      r   SetItemIconzLayerTree.SetItemIcon  s<    ((:(>FFHH$

8 45r   c                    |dk(  rM| j                  t        j                  ddd             | j                  t        j                  ddd             y|dk(  rM| j                  t        j                  ddd             | j                  t        j                  ddd             y| j                  t        j                  ddd             | j                  t        j                  ddd             y)zLSet gradient for items

        :param iType: bgmap, vdigit or None
        bgmapr   d      vdigitN)SetFirstGradientColourrb   ColourSetSecondGradientColour)r   iTypes     r   rj   zLayerTree._setGradient   s    
 G''		!S!(<=((1c1)=>h''		#q!(<=((31)=>''		#sC(@A((3S)ABr   c                 R    g }| j                         }|r| j                  ||      }|S )a  Returns a list of selected items.

        This method is copied from customtreecontrol and overridden because
        with some version wx (?) multiple selection doesn't work.
        Probably it is caused by another GetSelections method in treemixin.DragAndDrop?
        )GetRootItem	FillArray)r   arrayidRoots      r   r   zLayerTree.GetSelections/  s1     !!#NN651E r   c                     | j                   S )zGet map instancer   r   s    r   GetMapzLayerTree.GetMap?  s    xxr   c                     | j                   S )zGet associated MapFrame)rl   r   s    r   GetMapDisplayzLayerTree.GetMapDisplayC  s    r   c                     | j                  |      sy|r| j                  |      d   |   S | j                  |      d   S )zGet layer info.

        :param layer: GenericTreeItem instance
        :param key: cmd, type, ctrl, label, maplayer, propwin, vdigit, nviz
         (vdigit, nviz for map layers only)
        Nr   	GetPyData)r   r   r   s      r   r   zLayerTree.GetLayerInfoG  sC     ~~e$>>%(+C00~~e$Q''r   c                 6    | j                  |      d   }|||<   y)zSet layer info.

        :param layer: GenericTreeItem instance
        :param key: cmd, type, ctrl, label, maplayer, propwin, vdigit, nviz
         (vdigit, nviz for map layers only)
        :param value: value
        r   Nr   )r   r   r   valueinfos        r   SetLayerInfozLayerTree.SetLayerInfoT  s      ~~e$Q'S	r   c                 *    | j                  |      d   S )zGet layer command paramsrF   r   )r   r   s     r   GetLayerParamszLayerTree.GetLayerParams_  s    ~~e$Q''r   c                     | j                   rKd| _         | j                  j                         r*| j                  j                         j	                  d       |j                          y)zOnly re-order and re-render a composite map image from GRASS during
        idle time instead of multiple times during layer changing.
        FrenderN)rV   rl   IsAutoRenderedGetMapWindow	UpdateMapSkipr   events     r   r   zLayerTree.OnIdlec  sK     == "DM--/,,.888F

r   c                     |j                         }|t        j                  k(  r7| j                  r+| j	                         s| j                  j                  d       |j                          y)zKey pressedN)
GetKeyCoderb   
WXK_DELETErB   GetEditControlr   r   )r   r   r   s      r   r   zLayerTree.OnKeyUps  sH     "--DIId6I6I6KII##D)

r   c                 $    |j                          y)z;Skip event, otherwise causing error when layertree is emptyN)r   r   s     r   r   zLayerTree.OnKeyDown|  s    

r   c                     |j                         }| j                  |      }|rE| j                  |      s| j                  |dd       t	        j
                  | j                  |       yy)z2Contextual menu for item/layer when button pressedTFN)GetEventObjectFindItemByWindow
IsSelectedDoSelectItemrb   	CallAfterr   )r   r   buttonr   s       r   OnLayerContextMenuButtonz"LayerTree.OnLayerContextMenuButton  s^     %%'%%f-??5)!!%u5 LL00%8 r   c                 \6     j                   s|j                          y j                   j                   d      } j                   j                   d      t        j                  dd|z         t         d      s-t                _        dD ]  }t                j                  |<    t        j                         d	   }t                _        t         j                               }t        j                    j                   j                  d
   t#        d            }|j%                  t'        d      j)                   j*                                j                  j-                  |        j/                  t        j0                   j2                  j4                   j                  d
          |dk7  rp|dk(  rk j                  j7                   j                  d   t#        d              j/                  t        j0                   j8                   j                  d          |dkD  rt        j                    j                   j                  d   t#        d            } j                  j-                  |        j/                  t        j0                   j:                   j                  d          t        j                    j                   j                  d   t#        d            } j                  j-                  |        j/                  t        j0                   j:                   j                  d          d} j=                         }|D ]  }	 j                  |	d      |k7  sd} n |dvrI|dk(  rD j                  j?                          |dk(  sۉ j@                  jC                  d      st        j                    j                   j                  d   t#        d            }|j%                  t'        d      j)                   j*                                j                  j-                  |        j/                  t        j0                   jD                   j                  d          t        j                    j                   j                  d    t#        d!            }|j%                  t'        d"      j)                   j*                                j                  j-                  |        j/                  t        j0                   jF                   j                  d           |d#v r j@                  jC                  d      rk j                  j7                   j                  d$   t#        d%              j/                  t        j0                   jH                   j                  d$          |r|d&v r j                  j?                          t        j                    j                   j                  d'   t#        d(            }|j%                  t'        d)      j)                   j*                                j                  j-                  |        j/                  t        j0                   j@                  jJ                   j                  d'          |r||d*k(  rw|ru j                  j7                   j                  d+   t#        d,              j/                  t        j0                   j@                  jL                   j                  d+          t        j                    j                   j                  d-   t#        d.            }|j%                  t'        d-      j)                   j*                                j                  j-                  |        j/                  t        j0                   jN                   j                  d-          |r|d*k(  rt        |      dk(  rt        j                    j                   j                  d/   t#        d0            }|j%                  t'        d-      j)                   j*                                j                  j-                  |        j/                  t        j0                   jP                   j                  d/          |r|d1k(  r|dk(  r j                  j?                          t        j                    j                   j                  d2   t#        d3            }|j%                  t'        d4      j)                   j*                                j                  j-                  |        j/                  t        j0                   fd5 j                  d2          d6tR        jT                  vr) j                  jW                   j                  d2   d        j                  j7                   j                  d7   t#        d8              j/                  t        j0                   fd9 j                  d7          d:tR        jT                  vr) j                  jW                   j                  d7   d        j                  j7                   j                  d;   t#        d<              j/                  t        j0                   fd= j                  d;          d>tR        jT                  vr) j                  jW                   j                  d;   d       t        j                    j                   j                  d?   t#        d@            } j                  j-                  |        j/                  t        j0                   fdA j                  d?           j                   j                   d      jY                         }
|
|k7  rk j                  j7                   j                  dB   t#        dC              j/                  t        j0                   jZ                   j                  dB           j                  j?                           j                  j7                   j                  dD   t#        dE              j/                  t        j0                   j\                   j                  dD           j                  j7                   j                  dF   t#        dG              j/                  t        j0                   j2                  j^                   j                  dF          t        j                    j                   j                  dH   t#        dI            }|j%                  t'        dJ      j)                   j*                                j                  j-                  |        j/                  t        j0                   j2                  j`                   j                  dH           j@                  jc                  dK      }|r|je                         }nd} j                   j                   d      }	||	urrt        j                    j                   j                  dL   t#        dM            } j/                  t        j0                   jf                   j                  dL          nqt        j                    j                   j                  dL   t#        dN            } j/                  t        j0                   jh                   j                  dL          |j%                  t'        dL      j)                   j*                                j                  j-                  |        j                  j7                   j                  dO   t#        dP              j/                  t        j0                   jj                   j                  dO          |	jY                         |k7  rS j                  jW                   j                  dL   d        j                  jW                   j                  dO   d       nx|rv|je                         rf|je                         }||	u rR j                  jW                   j                  d
   d        j                  jW                   j                  dO   d       t        j                    j                   j                  dQ   t#        dR            }|j%                  t'        dS      j)                   j*                                j                  j-                  |        j/                  t        j0                   jl                   j                  dQ          	n^|r|r|d*k(  rˉ j                  j?                          |dk(  rt        j                    j                   j                  d2   t#        dT            }|j%                  t'        d4      j)                   j*                                j                  j-                  |        j/                  t        j0                   fdU j                  d2          t        j                    j                   j                  d?   t#        d@            } j                  j-                  |        j/                  t        j0                   fdV j                  d?           j                   j                   d      jY                         }
|
|k7  rk j                  j7                   j                  dB   t#        dC              j/                  t        j0                   jZ                   j                  dB           j                  j?                           j                  j7                   j                  dD   t#        dE              j/                  t        j0                   jn                   j                  dD          t        |      dWk  ru j                  j7                   j                  dF   t#        dG              j/                  t        j0                   j2                  jp                   j                  dF          t        j                    j                   j                  dX   t#        dY            }|j%                  t'        dZ      j)                   j*                                j                  j-                  |        j/                  t        j0                   jr                   j                  dX          t        j                    j                   j                  d[   t#        d\            }|j%                  t'        d]      j)                   j*                                j                  j-                  |        j/                  t        j0                   jt                   j                  d[          t        j                    j                   j                  d^   t#        d_            }|j%                  t'        d`      j)                   j*                                j                  j-                  |        j/                  t        j0                   jv                   j                  d^          |dk(  r	t        j                    j                   j                  da   t#        db            }|j%                  t'        dc      j)                   j*                                j                  j-                  |        j/                  t        j0                   jx                   j                  da          t        j                    j                   j                  dQ   t#        dR            }|j%                  t'        dS      j)                   j*                                j                  j-                  |        j/                  t        j0                   jl                   j                  dQ          n|r|dk(  r|dk(  rx j                  j?                           j                  j7                   j                  dD   t#        dE              j/                  t        j0                   jn                   j                  dD          t        j                    j                   j                  d[   t#        d\            }|j%                  t'        d`      j)                   j*                                j                  j-                  |        j/                  t        j0                   jt                   j                  d[          t        j                    j                   j                  dQ   t#        dR            }|j%                  t'        dS      j)                   j*                                j                  j-                  |        j/                  t        j0                   jl                   j                  dQ          nr|rp|ddk(  rk j                  j7                   j                  de   t#        df              j/                  t        j0                   jz                   j                  de           j}                   j                          j                  j                          y)gzContextual menu for item/layerNtyper   r      z%LayerTree.OnContextMenu: layertype=%spopupID)removerenameopacitynvizzoomregionalignexportattreditsave_wsr   topometanullzoom1colorcolorihistunivarprof
propertiessqlcopyreport	export-pgexport-attrpackcheckuncheckMAPSETr	  Remove)r   textzlayer-remove)r    )r   commandrF   r
  Renamer$  zCheck selected layersr%  zUncheck selected layersTF)groupr)  	raster_3d3dr  zChange opacity levelzlayer-opacityr  
Propertiesr9   r&   r   r,  r  z3D view properties)r&   r   r(   r,  r  zZoom to selected map(s)z
zoom-layerr&   r  z&Zoom to selected map(s) (ignore NULLs)r  z-Set computational region from selected map(s)r  z*Align computational region to selected mapr   r  zExport common formatszlayer-exportc                 b    j                   j                  ddj                         z  g      S )N	v.out.ogrinput=%scmdrB   	OnMenuCmdGetNamexmapLayerr   s    r   <lambda>z.LayerTree.OnLayerContextMenu.<locals>.<lambda>R  s1    $))--$j83C3C3E&EF .  r   r1  r!  zExport PostGISc                 b    j                   j                  ddj                         z  g      S )Nv.out.postgisr2  r3  r5  r8  s    r   r;  z.LayerTree.OnLayerContextMenu.<locals>.<lambda>]  s1    $))--(*x7G7G7I*IJ .  r   r=  r"  zExport attribute tablec                 b    j                   j                  ddj                         z  g      S )Nv.db.selectmap=%sr3  r5  r8  s    r   r;  z.LayerTree.OnLayerContextMenu.<locals>.<lambda>j  s1    $))--&83C3C3E(EF .  r   r?  r#  zCreate packc                 b    j                   j                  ddj                         z  g      S )Nzv.packr2  r3  r5  r8  s    r   r;  z.LayerTree.OnLayerContextMenu.<locals>.<lambda>x  s1    $))--!:0@0@0B#BC .  r   r  z!Make a copy in the current mapsetr  zSet color tabler  zSet color table interactivelyr  zShow attribute datatabler   r  zStart editingzStop editingr  zRebuild topologyr  Metadataz
layer-infoExportc                 b    j                   j                  ddj                         z  g      S )Nz
r.out.gdalr2  r3  r5  r8  s    r   r;  z.LayerTree.OnLayerContextMenu.<locals>.<lambda>  s1    dii11):8H8H8J+JK 2  r   c                 b    j                   j                  ddj                         z  g      S )Nzr.packr2  r3  r5  r8  s    r   r;  z.LayerTree.OnLayerContextMenu.<locals>.<lambda>  s1    dii11%zH4D4D4F'FG 2  r      r  	Histogramzlayer-raster-histogramr  zUnivariate raster statisticszraster-statsr   zReport raster statisticsstatsr  Profilezlayer-raster-profiler8   r  zSave web service layer)@layer_selectedr   r   r   msghasattrdictr  r   grassgisenvr   	popupMenur   r   rb   MenuItemrn   	SetBitmapr   rs   rp   
AppendItemr|   EVT_MENUrB   r   AppendOnRenameLayerOnCheckUncheckSelectedLayerr   AppendSeparatorrl   IsPaneShownOnPopupOpacityLevelOnPopupPropertiesOnNvizPropertiesOnZoomToMapOnZoomToRasterOnSetCompRegFromMapOnAlignCompRegToRasterr   grassCmdEnable	GetMapset	OnCopyMapOnVectorColorTableOnVectorRulesOnShowAttributeTable
GetToolbarGetLayerOnStartEditingOnStopEditing
OnTopology
OnMetadataOnRasterColorTableOnRasterRulesOnHistogramOnUnivariateStatsOnReportStats	OnProfileOnSaveWs	PopupMenuDestroy)r   r   ltyper   currentMapsetnumSelectedr   sameselectedr   lmapsetdigitToolbarvdigitLayerr:  s   `            @r   r   zLayerTree.OnLayerContextMenu  s   ""JJL!!$"5"56!B$$T%8%8j$I		!<uDEtY'6DL  ,@ %*GS!A ,F x0$,,./{{4>>dll8.D1X;WxN3==dllKL!!$'		"++tyy664<<;Q	RI+"2NN!!$,,x"8!H+FIIbkk4#5#5$,,x:PIQ?;;<<(./D
 NN%%d+II00<<(  
 ;;<<	*01D
 NN%%d+II00<<	*   ))+ 	E  F 3u<	
 ,,a..0,0K0KD0Q;;<<	256D
 NN _5??M NN--d3II00<<	2  
 {{NNt||L'A, xI6@@NO))$/		KK!7!7DLL<V      oo11$7NN))$,,v*>BV@WXIIT%:%:t||F?S   !II..0{{NN||F+45
 xL9CCDLLQR))$/		KK!<!<fAU  
 Uh.4NN))W-BC II66<<0   {{NN||H-JK
 xH5??MN))$/		KK!9!9dll8>T  
 Uh.3x=A3E;;<<0KLD
 NN8#9#C#CDLL#QRNN--d3II33<<0   Uh&;!+;NN**,;;<<)./D
 NN87AA$,,OPNN%%d+II <<)   )"4"44%%dll8&<eDNN!!$,,{";Q?O=PQII <<,   i&8&88%%dll;&?GNN!!]+Q/G-H II <<.   I$6$66%%dll=&A5I;;4<<#7a>ND NN%%d+II <<'   ''(;(;'LVVXG-'%%LL(!,O*P 		"++t~~$,,v:N	ONN**,NN!!$,,w"7;L9MNIIbkk4#:#:t||G?TIUNN!!X&*I(J IIbkk499#:#:t||H?UIV;;4<<#7a@U>VD NN80::4<<HINN%%d+IITYY;;V@T    ??55h?L*335"%%d&9&9z%JE%'{{NNt||F';!OBT 		"++t':':t||F?S	T{{NNt||F';!NBS 		"++t'9'9dll6>R	SNN8/99$,,GHNN%%d+ NN!!$,,v"6:L8MNIIbkk4??t||F7KIL  M1%%dll6&:EB%%dll6&:EB,"7"7"9*335%'NN))$,,x*@%HNN))$,,v*>F ;;4<<#7a
mD NN85??MNNN%%d+IIbkk4??t||F7KIL e 1NN**,a{{NNt||H'=AhK xN;EEdllST))$/		KK ||H-   {{NNt||F';!MBR ))$/		KK ||F+   ++''Z , )+  m+NN))V,a0S.T IIbkk4>>dll6>RIS..0NN!!$,,w"7;L9MNIIbkk4#:#:t||G?TIU8}q %%LL*A.M,N 		KK!8!8T\\(=S   ;;4<<#7anD NN56@@N NN%%d+IIbkk4#3#3V8LIM;;<<)56D
 NN87AA$,,OPNN%%d+IIbkk4#9#9dll8>TIU;;<<)12D
 NN80::4<<HINN%%d+IIbkk4#5#5$,,x:PIQa{{NNt||F';!I, !78BB4<<P ))$/		"++t~~$,,v:N	O{{NNt||F';!J- xL9CCDLLQR))$/		"++t4<<;O	Pu+a..0%%dll7&;Q?P=QR		KK!8!8T\\'=R   {{NN||H-9:
 xG4>>t||LM))$/		KK!7!7DLL<R   {{NNt||F';!J- xL9CCDLLQR))$/		"++t4<<;O	P u~NN!!$,,y"91=U;VWIIbkk4==T\\)5LIMt~~& r   c                     | j                  | j                  d      }ddlm}  || || j                        }|j                          |j                          y)zGShow dialog for saving web service layer into GRASS vector/raster layerr   r   r   )SaveWMSLayerDialog)r   r   r   N)r   rK  web_services.dialogsr  rk   CentreOnScreenShow)r   r   r:  r  dlgs        r   ru  zLayerTree.OnSaveWs\  sN    $$T%8%8j$I; x0F0F
 	
r   c                     | j                  | j                  d      }dd|j                         z  g}| j                  j	                  |       y)z'Rebuild topology of selected vector mapr   r   zv.buildr@  N)r   rK  r7  rN   RunCmd)r   r   r:  r4  s       r   rm  zLayerTree.OnTopologyg  sG    $$T%8%8j$I(X%5%5%778C r   c                 \    t        |       }|j                          |j                          y)z(Show SQL query window for PostGIS layersr   N)r   r  r  )r   r   r  s      r   
OnSqlQueryzLayerTree.OnSqlQuerym  s!    4(
r   c                 &   | j                  | j                  d      }| j                  | j                  d      }|dk(  rdg}n|dk(  rdg}n|dk(  rd	g}j                  d
|j                         z         | j                  j                  |       y)zkPrint metadata of raster/vector map layer

        .. todo::
            Dialog to modify metadata
        r   r   r  r&   zr.infor   zv.infor,  zr3.infor@  N)r   rK  r   r7  rN   r  )r   r   r:  mltyper4  s        r   rn  zLayerTree.OnMetadatas  s     $$T%8%8j$I""4#6#6F"CX*Cx*C{"+C

8h..001 	C r   c                    g }g }g }| j                         D ]  }| j                  |d      }| j                  |d      }|dk(  r |j                  |j                                N|dk(  r |j                  |j                                s|dk(  r |j                  |j                                |dk(  s|j                         j	                         D ]  }|j                  |         i }	|rdj                  |      |	d<   |rdj                  |      |	d<   |rdj                  |      |	d<   |	r*t        j                  d	d
ddg      rd|	d<   t        di |	 | j                  j                         j                  d       y)z;Set computational region from selected raster/vector map(s)r   r   r  r&   r   r,  r(   ,generalr  resAlignenabledr+  r   subkeyaflagsFr   Nzg.region)r   r   r   r7  
splitlinesjoinr   Getr   rN   r   r   )
r   r   rastvectrast3dr   r:  r  rnamer   s
             r   r`  zLayerTree.OnSetCompRegFromMap  sz   '') 	'E((J(?H&&u&&9F!H,,./8#H,,./;&h..015%--/::< 'EKK&'	' "xx~F8"xx~F8"%((6"2F;Xz96M #&w ,V, 	!!#--U-;r   c                 h   | j                         }t        |      dk7  s| j                  |d   d      dk7  ryd| j                  |d   d      j                         i}t	        j
                  d	d
ddg      rd|d<   t        di | | j                  j                         j                  d       y)z1Align computational region to selected raster maprF   r   r  r   r&   Nr  r   r  r  r  r  r  r  r  Fr   r  )
r   r   r   r7  r   r  r   rN   r   r   )r   r   r|  r   s       r   ra  z LayerTree.OnAlignCompRegToRaster  s    %%'x=A!2!28A;F!2!Kx!W4,,Xa[j,IQQST:y2I
 "F7O 	(( 	!!#--U-;r   c                 l   | j                  | j                  d      }|j                         s\t        j                  | t        d      t        d      t        j                  t        j                  z  t        j                  z         y| j                  j                  |j                         g       y)z&Plot profile of given raster map layerr   r   z'Unable to create profile of raster map.Errorr   messagecaptionrA   N)rasters)r   rK  r7  rb   
MessageBoxrn   OK
ICON_ERRORCENTRErl   rJ  )r   r   r:  s      r   rt  zLayerTree.OnProfile  s    $$T%8%8j$I!MMFG'
eebmm+bii7	 )9)9);(<=r   c                    g }g }| j                         D ]y  }| j                  |d      dk(  r1|j                  | j                  |d      j                                J|j                  | j                  |d      j                                { |r:t	        | | j
                        j                  dddj                  |      z  g       |r;t	        | | j
                        j                  d	ddj                  |      z  g       y
y
)z$Set color table for 2D/3D raster mapr  r   r,  r   )r   r   zr.colorsr@  r  z	r3.colorsN)r   r   r   r7  r   rN   ParseCommandr  r   r   raster2dr6   r   s        r   ro  zLayerTree.OnRasterColorTable  s    ++- 	TE  F 3{B 1 1%Z 1 H P P RS 1 1%Z 1 H P P RS		T tDLL1>>X(::; tDLL1>>h();;< r   c                     | j                  | j                  d      j                         }t        | | j                  | j
                        j                  dd|z  g       y)zSet color table for vector mapr   r   r   r   centreOnParentzv.colorsr@  N)r   rK  r7  r   rN   rY   r  )r   r   names      r   rf  zLayerTree.OnVectorColorTable  sR      !4!4* EMMOT=U=U	

,
HtO4
5r   c                 (   | j                         }| j                  |d      }| j                  |d      j                         }|dk(  rd}d}t        d      }nD|dk(  rd}d}t        d	      }n/|d
k(  rd
}d}t        d      }nt	        t        d      |z  |        yt        | t        d      |j                         z  t        d      |j                         |fz  |j                  d      d   t               d      }|j                         t        j                  k(  r!|j                         }	|j                          n|j                          yt        j                         d   }
|	t        j                   |      |
   v rt        j"                  | t        d      ||	fz  t        d      t        j$                  t        j&                  z  t        j(                  z        }|j                         t        j*                  k7  ry||d|	i}dt-        d#ddi|k7  rt	        t        d      |z  |        yd|	v r3|	j                  d      d   }||
k7  rt	        t        d      ||fz         y|	d|
z   z  }	| j/                  ||	d |z  d!|	z  g"       y)$z%Copy selected map into current mapsetr  r   r   r&   r  z
Raster mapr   r  z
Vector mapr,  r  z3D raster mapzUnsupported map type <%s>r  Nz0Enter name for the new %s in the current mapset:zMake a copy of %s <%s>@r   )i  )r   r  r  defaultValue	validatorsizer&  zJ%s <%s> already exists in the current mapset. Do you want to overwrite it?z
Overwrite?r  r  	overwriteTzUnable to make copy of <%s>rF   z?Unable to make copy of <%s>. Mapset <%s> is not current mapset.zd.%sr@  )lnamelcmd)zg.copy)r   r   r7  rn   r   r
   r   splitr   	ShowModalrb   ID_OKGetValuerw  rO  rP  list_groupedMessageDialogYES_NOYES_DEFAULTICON_QUESTIONID_YESr   AddLayer)r   r   r   rx  lnameSrcr   moduler!   r  lnameDstry  dlgOwr   	mapsetDsts                 r   re  zLayerTree.OnCopyMap  s   %%'!!%V!4$$U
$;CCEHCFlOEhCFlOEk!CFo&E101E9$G HIkkm./5;;=(2KK!,Q/"n
 ==?bhh&||~HKKMKKMx0u))#.}==$$3
 (#$ ,ii"..023C3CC
E  BII-(H56
>t>v>>123h>tL(? s+A.IM)WX+, C-''&(X:M(N 	 	
r   c                 :   g }| j                         D ]2  }|j                  | j                  |d      j                                4 |st	        | t        d             yddlm}  || | j                  |      }|j                          |j                          y)	z)Plot histogram for given raster map layerr   r   z?Unable to display histogram of raster map. No map name defined.r   r  Nr   )HistogramPlotFrame)r   r   
rasterList)r   r   r   r7  r   rn   wxplot.histogramr  rN   r  r  )r   r   r  r   r  wins         r   rq  zLayerTree.OnHistogram6  s    
++- 	REd//:/FNNPQ	R X  	8 
 	
r   c                    g }g }| j                         D ]y  }| j                  |d      dk(  r1|j                  | j                  |d      j                                J|j                  | j                  |d      j                                { |r/| j                  j                  dddj                  |      z  g       |r0| j                  j                  dddj                  |      z  g       y	y	)
z"Univariate 2D/3D raster statisticsr  r   r,  r   zr.univarr@  r  z	r3.univarNr   r   r   r7  rN   r  r  r  s        r   rr  zLayerTree.OnUnivariateStatsN  s    ++- 	TE  F 3{B 1 1%Z 1 H P P RS 1 1%Z 1 H P P RS		T LLX8J-J KLLLh(9K.K LM r   c                 &   g }| j                         D ]I  }| j                  |d      dk(  s|j                  | j                  |d      j                                K |r1| j                  j                  dddj                  |      z  dg       y	y	)
zPrint 2D statisticsr  r   r&   r   zr.reportr@  r  zunits=hectares,cells,percentNr  )r   r   r  r   s       r   rs  zLayerTree.OnReportStats^  s    ++- 	SE  F 3x?t00J0GOOQR	S LLsxx002 r   c                    | j                  | j                  d      }t        s[ddlm} | j
                  j                  d   j                  j                  t        d             t        t        d      |z  |        y	| j
                  j                  d
      s| j
                  j                  d
       n	 | j
                  j                  d
   j                  |       y	)z4Start editing vector map layer requested by the userr   r   r   )errorMsgmapz2D viewz3Unable to start wxGUI vector digitizer.
Details: %sr  Nr   )r   rK  r   r   r  rl   toolbarscomboSetValuern   r   ri  
AddToolbarStartEditing)r   r   r:  r  s       r   rk  zLayerTree.OnStartEditingo  s    $$T%8%8j$I'OO$$U+11::1Y<HKLxW ))(3OO&&x0  	  *77Ar   c                 r    | j                  d       |r$| j                  |d       | j                  |       y y )Nr   editedrj   r   RefreshLiner   	layerItems     r   r  zLayerTree.StartEditing  s6    (#Y1Y' r   c                 R    | j                   j                  d   j                          y)z)Stop editing the current vector map layerr   N)rl   r  OnExitr   s     r   rl  zLayerTree.OnStopEditing  s      *113r   c                 h    | j                          | j                  |       | j                  |       y Nr  r  s     r   StopEditingzLayerTree.StopEditing  s*    ##r   c                     	 | j                  d|      d   }|s$| j                  d       | j                  |d       n!| j                          | j                  |       | j	                  |       y # t        $ r Y y w xY w)Nr  r   r   )FindItemByData
IndexErrorrj   r   r  )r   mapNameunsetr  s       r   SetBgMapForEditingzLayerTree.SetBgMapForEditing  s}    	++FG<Q?I g&Y0Y'#  		s   A0 0	A<;A<c                 :    | j                  | j                         y)zPopup properties dialogN)PropertiesDialogrK  r   s     r   r\  zLayerTree.OnPopupProperties  s    d112r   c                 \     j                   j                  d      sy j                   j                  d      }|j                         }t         |t	        d      |j                         z        }|j                  j                   fd       |j                  j                   fd       |j                          |j                         t        j                  k(  r; j                   j                  |j                         	        j                          |j                          y)
zPopup opacity level indicatorctrlr   Nr   zSet opacity of <%s>)r  r   c                 >    j                  j                  |       S )Nr   r   )ChangeLayerOpacityrK  )r   r   s    r   r;  z/LayerTree.OnPopupOpacityLevel.<locals>.<lambda>  s"    $11)) 2  r   c                  $     j                         S r  )r   r   s   r   r;  z/LayerTree.OnPopupOpacityLevel.<locals>.<lambda>  s    )M)M)O r   r  )r   rK  
GetOpacityr	   rn   r7  applyOpacityr   CentreOnParentr  rb   r  r  r   rw  )r   r   r   current_opacityr  s   `    r   r[  zLayerTree.OnPopupOpacityLevel  s      !4!4& A$$T%8%8j$I"--/#)*X-=-=-??

 	  	
 	  !OP==?bhh&##$*=*=S^^EU#V002r   c                    | j                  |d      }| j                  j                  ||       |j                  |       | j	                  || j                  |             | j                         j                  d      r| j                         j                  d      j                         |k(  rTt        |dz        }| j                         j                         j                  j                         j                  |       d}| j                         j                  d      rd}| j                         j                         j                  d|       y	)
zChange opacity value of layer

        :param layer: layer for which to change (item in layertree)
        :param value: opacity value (float between 0 and 1)
        r   r   r      )alphaFT)r   renderVectorN)r   r   ChangeOpacity
SetOpacitySetItemText_getLayerNamer   ri  rj  int	GetWindowdigit
GetDisplayUpdateSettingsr   )r   r   r   r   r  r  s         r   r  zLayerTree.ChangeLayerOpacity  s'    $$U
$;x/E" 2 25 9:  ++H5""$//9BBDP$E **,22==?NN O 
 **84L&&(22| 	3 	
r   c                    t        j                  ddd      s%| j                  j                  j	                  d       | j                  | j                  d      }|dk(  r&| j                  j                  j                  d	       y|d
k(  r&| j                  j                  j                  d
       y|dk(  r&| j                  j                  j                  d       yy)zdNviz-related properties (raster/vector/volume)

        .. todo::
            vector/volume
        
appearancesingleWindowr  r  r  r  r   r&   surfacer   r,  volumeN)	r   r  rB   rC   SetSelectionByNamer   rK  r  SetPage)r   r   rx  s      r   r]  zLayerTree.OnNvizProperties  s     

 II11&9!!$"5"56!BHIINN""9-hIINN""8,k!IINN""8, "r   c                 z    | j                  | j                         | j                         j                  dd       y)zRename layerr  N)	EditLabelrK  r   SetSelectionr   s     r   rW  zLayerTree.OnRenameLayer  s-    t**+**2r2r   c                    |j                         s|j                          y| j                  }| j                  |d|j                                | j	                  || j                  |             |j                          y)zLayer renamedNr!   r   r   )GetLabelr   rK  r   r  r  )r   r   r   s      r   r   zLayerTree.OnRenamed  sc    ~~JJL""$G5>>3CDt11$78

r   c                    t        j                         }|d   |k(  r|d   |k(  sy|dvry|dv rd|vr|dz   |z   n|}	| j                  d|	      }
|
rt        |
      D ]  }|d	k(  r| j	                  |       |d
k(  s | j                  |d      }t        dt        |            D ]4  }|||   j                  d      d   v s||   j                  ||      ||<   6 | j                  |d|       | j                  |       | j                  |d      }|r| j                  |      j                  ||      }| j                  ||        yy|dk(  rug }
| j                  | j                        d   }|rh|j!                         rX| j                  |d      }|D ]  }d|z   |v s|
j#                  |        n | j%                  |      }|r|j!                         rXt        |
      D ]  }|d	k(  r| j	                  |       |d
k(  s | j                  |d      }t        dt        |            D ]4  }|||   j                  d      d   v s||   j                  ||      ||<   6 | j                  |d|       | j                  |       | j                  |      j                  d|z   d|z         }| j                  ||        yy)zHandler of giface.grassDbChanged signal, updates layers in tree.
        Covers cases when map or mapset is deleted or renamed.GISDBASELOCATION_NAMEN)deleter
  r/  r  r  r  r  r
  r4  r   rF   =r  r!   mapsetr   )rO  rP  r  reversedDeleter   ranger   r  replacer   ChangeLayerGetItemTextr  r   rP   IsOkr   r   )r   actionelementgrassdblocationr  r  newnamerP  r  itemsr   r4  ir!   newlabeleachs                    r   r   zLayerTree.OnGrassDBChanged  s   
 z"g-&2IX2U--77),C39v%SD''F$'?E$UO =D)D)8+"//%/@!&q#c(!3 FA"c!fll3&7&;;),QW)EAF ))$E)E((. $ 1 1$G 1 D$'+'7'7'='E'Ec7'SH ,,T8<= "  E%%dii03D499;''%'8 DV|t+T* ''- 499; ! 5X%KK%x'++De+<C"1c#h/ E!SV\\#%6r%::%(V^^FG%DCFE %%dS%A$$T*#//5==fcGm H $$T845 !r   c                     t         j                  }|j                         | j                  d   k(  rt         j                  }d| _        | j                         D ]  }| j                  ||        y)zCheck/uncheck selected layer(s)r%  TcheckedN)rb   CHK_CHECKEDGetIdr  CHK_UNCHECKEDrW   r   	CheckItem)r   r   r$  r   s       r   rX  z%LayerTree.OnCheckUncheckSelectedLayer=  s]    ;;=DLL33$$E'') 	1ENN5%N0	1r   c                 l   | j                   j                  j                          |r|	s| j                  | j                        d   }|rq|j                         ra| j                  |d      dk(  r'| j                  |d      j                         }||k(  ry| j                  |      }|r|j                         ra| j                         }|dur|r| j                  |d       t        j                  d	d
|z         |dk(  r;| j                         }|j                  t        j                   | j"                         n|dk(  r9d}t%        d      t'        | j(                        z   }| xj(                  dz  c_        nzt*        d   j-                  d      }t/        | t        j0                  |d      }|j3                  t%        d             | j                  t        j4                  | j6                  |       |
r`|dk(  r | j9                  | j                  dd|      }n|dkD  r| j;                  |      }|s| j                  }| j9                  |dd|      }n|rx|| j=                         k7  re|r,| j                  |d      dk(  r| j?                  |dd|      }nV| jA                  |      }| jC                  || jE                  |      dd|      }n| j?                  | j                  dd|      }|	|}|rdnd}nd}d}d| _#        |dk(  r!| jI                  | jJ                  d          n|dk(  ri| jI                  | jL                  tN        jP                         | jI                  || jR                  tN        jT                         | jW                  |       n|| jJ                  v rr| jI                  | jJ                  |          | jW                  |t*        d|d   jY                         z   |dd z      j[                         dt%        d      dz          n1| jI                  | jJ                  d          | jW                  ||       |dk7  r|rt]        |      dkD  r|}t_        |      \  }}nEg }|dk(  r<|r:|ja                  d       D ]&  }|jc                  te        j`                  |             ( d}|r|jg                         }nd}| ji                  ||||dd||dd!df       | jk                  ||"       | j                  | j                        d   }d}d}|r|j                         rt||k7  ro| j                  |d      r| j                  |d      }| j                  |      }|r| jl                  jo                  |      }nd}|r|j                         r||k7  ro| jl                  jq                  ||| j                  |d      ||d||#      }| js                  |d|$       t]        |      dk(  r| ju                  |d%       n#d| _;        n| ji                  |d|ddddd&df       |dur| j                  |d       |rU|dk(  r| jW                  ||       |S |dk(  r|jy                  |       |S | jW                  || j{                  ||             |S |dk(  r| j}                  d       |S )'a  Add new item to the layer tree, create corresponding MapLayer instance.
        Launch property dialog if needed (raster, vector, etc.)

        :param ltype: layer type (raster, vector, raster_3d, ...)
        :param lname: layer name
        :param lchecked: if True layer is checked
        :param lopacity: layer opacity level
        :param lcmd: command (given as a list)
        :param lgroup: index of group item (-1 for root) or None
        :param lvdigit: vector digitizer settings (eg. geometry attributes)
        :param lnviz: layer Nviz properties
        :param bool multiple: True to allow multiple map layers in layer tree
        :param bool loadWorkspace: True if called when loading workspace
        r   r  r   r   r   NF)select   z LayerTree().AddLayer(): ltype=%sr)  r+  zLayer group:rF   r;   rK      r3  r   bitmapr  Click to edit layer settingsr  rD   )parentIdr(  ct_typewnd)index)r   r(  r8  r9  )r7  inputr(  r8  r9  Tr4  r    z (double click to set properties)z               ;)r4  r  r  r!   r   r   r  propwinr)  )posrx  r)  r  activehiddenr  r   r  )show)r4  r  r  r!   r   r>  )?rN   workspaceChangedemitr   rP   r  r   r7  r   r   
SelectItemr   rL  _createCommandCtrlr|   rb   EVT_TEXT_ENTEROnCmdChangedrn   strrQ   r   rs   r   ID_ANY
SetToolTip
EVT_BUTTONr  rT  FindItemByIndexr   PrependItemr   
InsertItemGetPrevSiblingrX   r   r   ry   rZ   TreeItemIcon_Normalrw   TreeItemIcon_Expandedr  upperr  r   r   r  r   gutilsr,  ro   r.  r   GetLayerIndexr  r   r  rT   r  r  rW  )r   rx  r  lcheckedlopacityr  lgrouplvdigitlnvizmultipleloadWorkspacer   r  selectedLayerr  	grouptextbtnbmpr   r   r*  r   r4  foundcctrlIdprevItemprevMapLayerr?  r   s                                r   r  zLayerTree.AddLayerF  s   6 	%%**,%%dii03D499;$$Tv$6(B,,Tz,BJJLDu}''- 499; --/5 ]OOM%O8		!75ABI**,DIIb''):):;gD.)C,??INNaN^,66x@F"4BIIf8TDOOA<=>IIbmmT%B%BDI|!YYR (  "--F-;!YYFb!QUV$2B2B2D!D!))-V)DO !,,,2qd - E
 "//>F OO!'"11-@ !  , E ((		ASW(X G$T%FGF IeTZZ%67geT[["2H2HIeT%5%5r7O7OPUI.

"!!%E):;    %(..*: :U12Y FGPPR<=H !!%E):;  .GD	A1$7eI%%"[[- 4

6<<?34  NN  # % &!%$(") %#'	 & NN5'N2 ))$))4Q7HLCx}}8u3D$$X:$>#'#4#4X:#4#NL++H5((00>CC x}}8u3D xx(())()>  ) 	H e8D 3x1}%%e$%7"
NN  $ % $!%$(#' 
  5 OOE$O/   .  )#e$    (:(:5%(HI
  ""4(r   c                     | j                          | j                  t        d            | _        | j	                  | j                  d       y)zDelete all items in the treerI   rJ   N)DeleteAllItemsrm   rn   rP   ro   r   s    r   DeleteAllLayerszLayerTree.DeleteAllLayers4  s4    LL<1	tyy,/r   c                    | j                  |d      }d| j                  |      v rX| j                  |d      E| j                  |d      }|j                         r|j                          y|j                          y| j	                  |      }t        j                  dd|z         d}| j                  |d      rwt        | | j                  || j                        }|j                  | j                  |d      | j                  ||f	       | j                  |d|j                         
       n`| j                  |d      dk7  rJt        |   g}|dv r*t        j                   ddd      r$|j#                  d       n|dk(  r|t%               z  }|rCt        | | j                  | j                        }|j                  || j                  ||f	       yy)zLaunch the properties dialogr  r   r>  Nr1  z&LayerTree.PropertiesDialog(): ltype=%sr4  )r   r   rB  r  )	completedr  r)  )r&   r(   rasterLayeropaquer  r  z-nr   r  )r   IsShownSetFocusr  r   r   rL  r   rN   rY   r  
GetOptDatar   GetCmdr   r   r  r   r   )r   r   rB  rx  r  paramsr4  r  s           r   r  zLayerTree.PropertiesDialog;  s   !!%V!4**511!!%Y!7C ##Ey#9C{{}  
$$U+		!=EFU.||#77	F !!%U!3??E6:    efmmoFu&1Y> '(C))##'Xi JJt$("-//||#77F
 /OP r   c                 $   | j                   j                  j                          |j                         }| j	                  |d      dk(  r5| j                  |      r| j                  |       y| j                  |       y| j                  |       y)zpDouble click on the layer item.
        Launch property dialog, or expand/collapse group of items, etc.
        r  r   r+  N)	rN   rC  rD  GetItemr   
IsExpandedCollapseExpandr  )r   r   r   s      r   r~   zLayerTree.OnActivateLayerm  sy     	%%**,U/7:u%e$  E"e$r   c                    | j                   j                  j                          |j                         }	 |j                  j                  d       || j                  k7  r)t        j                  dd| j                  |      z         nd| _        | j                          	 | j                  |d      dk7  r,| j                  j                  | j                  |d             d| _        | j                         }|sd| _        | j                  j#                  |       | j$                  j'                  d	      r)| j$                  j(                  d	   j+                  d
       |j-                          y#  Y 'xY w#  Y xY w)z.Remove selected layer item from the layer treeTr1  z"LayerTree.OnDeleteLayer(): name=%sNr  r   r+  r   r   
updateTool)rN   rC  rD  rr  r  CloserP   r   rL  r  Unselectr   r   DeleteLayerrV   GetVisibleLayersrT   	SetLayersrl   ri  r  UpdateListOfLayersr   )r   r   r   nlayerss       r   r   zLayerTree.OnDeleteLayer}  sA   %%**,}}	OO!!$' 499II74;K;KD;QR DI 		  6 2g=$$T%6%6t%6%LM
 '')DJ7#??%%h/OO$$X.AATAR 	

G		s   E3 !AE; 3E8;E?c                     | j                   s| j                  rd| _        |j                          y|j                          y)zLayer checkbox is being checked.

        Continue only if mouse is above checkbox or layer was checked programmatically.
        FN)rW   rX   r   Vetor   s     r   r   zLayerTree.OnLayerChecking  s,    
 t#DOJJLJJLr   c                 z   |j                         }|j                         }| j                  j                  d      }| j                  s3| j                  |d      dk(  r| j                  |      \  }}|rd| _        | j                  ||       | j                  |d      }|r|rU|j                         |k7  rB|r| j                  j                  ||       | j                  j                  j                          | j                  |      }|rnl| j                  |d      }|rW|r|rS|j                         |k7  r@| j                  j                  ||       | j                  j                  j                          | j                  j!                  d      r8| j#                  |      &| j                  |d      }|y| j                  j%                  t'        d	      d
       | j                  j                  j                          |r
|j(                  dk(  r'| j                  j*                  j-                  |       nr|j(                  dk(  r'| j                  j*                  j/                  |       n<|j(                  dk(  r,t1        j2                  |j5                               }|d   |d   z   d
kD  r'| j                  j*                  j7                  |d       |d   |d   z   d
kD  r| j                  j*                  j7                  |d       n|j(                  dk(  r&| j                  j*                  j9                  |       ni|j(                  dk(  r&| j                  j*                  j;                  |       n4|j(                  dk(  r%| j                  j*                  j=                  |       | j                  j%                  dd
       d| _        | j                  jA                  | jC                                | j                  jE                         jG                  d      }	|	r|	jI                          yy)zEnable/disable data layerr   r  r   r+  Tr   r-  NzPlease wait, updating data...r   r&   r,  r   points	centroidsr  lines
boundariesFrD   vselect)%rr  r   rl   ri  rT   r   r   rX   r.  rj  r   ChangeLayerActiverN   rC  rD  r   rZ  r   SetStatusTextrn   r  	MapWindow
LoadRasterLoadRaster3dgvectorvector_info_topor7  
LoadVectorUnloadRasterUnloadRaster3dUnloadVectorrV   r}  r|  r   	GetDialogReset)
r   r   r   r*  r~  childcookier:  vInfor  s
             r   r   zLayerTree.OnLayerChecked  sa    }}.."11(;zz  6 2g= $ 2 24 8v&*DONN5'2#00J0GH'$)>)>)@H)L $ HH66xI55::< //6E   ,,Tz,B$$)>)>)@H)L HH..xALL11668 ??&&t,1E1Q((:(>HOO))!,K*LaPLL))..0==H,OO--88>]]k1OO--::4@]]h.#44X5E5E5GHEh%*<<A11<<T$<Og|)<<A11<<T%<P ==H,OO--::4@]]k1OO--<<TB]]h.OO--::4@OO))"a0 40023 ,,,,.88CMMO r   c                 X   |j                         j                         }| j                  | j                        d   }|rK|j	                         r;| j                  |d      |k(  rn$| j                  |      }|r|j	                         r;| j                  |       |j                          y)zChange command stringr   r  r   N)	r   r,  r   rP   r  r   r   r  r   )r   r   r  r   s       r   rH  zLayerTree.OnCmdChanged  s    ##%++- ""499-a0

  F 3t;$$U+E 

 	

r   c                     | j                  |j                               \  }}|t        j                  z  r|t        j                  z  sd| _        nd| _        |j                          y)zGMouse is moving.

        Detects if mouse points at checkbox.
        TFN)HitTestGetPositionrZ   TREE_HITTEST_ONITEMCHECKICONTREE_HITTEST_ONITEMLABELrW   r   )r   r   thisItemr  s       r   r   zLayerTree.OnMotion  sV    
 ,,u'8'8':;% B333B///#D$D

r   c                 |    | j                   r0| j                  |j                                |j                          yy)ziSelection is changing.

        If the user is clicking on checkbox, selection change is vetoed.
        N)rW   EnsureVisiblerr  r  r   s     r   r   zLayerTree.OnChangingSel   s1    
  u}}/JJL	 r   c                    | j                   |j                          y|j                         }| j                  j	                  d      }|r| j                  |d      }t        j                  dddd      }|j                         |k(  r| j                  d       nH|r%||j                         k(  r| j                  d       n!| j                          n| j                          | j                  |       | j                  |d      rL| j                  |d      j                  d	
      }t        |      dkD  r| j                  j                  |       | j                  |d      rt        j                  ddd      rg| j                  |d      }|j!                         dv rB| j                  j#                         }| j                  j$                  j'                  |g|       | j                  j)                  d      r1| j                   j+                         r| j                  | j                   d      j,                  }|dk(  rK| j                  j.                  j1                  d       | j                  j.                  j3                  d       n|dk(  rK| j                  j.                  j1                  d       | j                  j.                  j3                  d       nO|dk(  rJ| j                  j.                  j1                  d       | j                  j.                  j3                  d       | j4                  j7                         j9                  d      }	|	r|	j;                          yy)zSelection changed

        Preconditions:
            event.GetItem() is a valid layer;
            self.layer_selected is a valid layer
        Nr   r   r   r   r   internal)r+  r   r  settings_typeTstringr   r4  displayautoZoomingr  r  r&   r   r   r   r-  r&   r  r   r,  r	  r  )rK  r   rr  rl   ri  r   r   r  rj  rj   r7  r  ro  r   rB   r  r   r   r  	ZoomToMaprZ  r   r  r  
UpdatePager  rN   r   r  r  )
r   r   r   r~  r:  r   r4  r   r  r  s
             r   r   zLayerTree.OnChangeSel+  s    &JJL11(;((J(?H $$GG:E $$&(2!!(+ex'7'7'99!!'*!!# U
3##Ez#:AAANC3x!|		'', U.<3C3Cy4
 ((J(?H!%99779))33  "	 4  ??&&t,"",,.(()<)<*(MRR8#IINN--i8IINN**95X%IINN--h7IINN**84[(IINN--h7IINN**84 ,,,,.88CMMO r   c                    | j                          |j                         }| j                  |j                               d   | _        | j
                  j                  d      r%| j
                  j                  j                  d       | j                  |      r@| j                          || j                  |       | j                  || j                         y || j                  || j                         y y )NrF   r-  T)StopDraggingrr  r  GetPointrU   rl   rZ  r  UnloadDataLayersIsValidDropTargetUnselectAllrE  OnDrop	_dragItem)r   r   
dropTargets      r   r   zLayerTree.OnEndDrags  s    ]]_
LL!1215	??&&t,OO%%66t<!!*-%
+KK
DNN3KK
DNN3  r   c                    	 |}t        j                  dd| j                  |      z         | j                  ||      }| j	                  |d      dk(  rD| j                  |      \  }}|r.|r,| j                  |||       | j                  ||      \  }}|r,	 | j                  |       d| _	        | j                  j                  | j                                | j                  |       y #  Y y xY w# t        $ r Y Tw xY w)Nr  zLayerTree.OnDrop(): layer=%sr  r   r+  r  T)r   rL  r  RecreateItemr   r   GetNextChildr  r\   rV   r   r}  r|  rE  )r   r  dragItemoldnewItemr  r  s          r   r  zLayerTree.OnDrop  s   	C 			!3t7G7G7QRS ##Hj9 W&1W<"00:OUF%%eZ%H$($5$5c6$BME6 
	 KK
 40023 	 =	*  		s   C, C3 ,C03	C?>C?c           	      $   t        j                  dd| j                  |      z         | j                  |      }| j	                  |d      }| j                  |      }| j                  |d      dk(  r| j                         }	 |j                  | j                  |d      j                  d	             |j                  t        j                  | j                         | j                  |      }n| j                  |d
      rt        d   j                  d      }	t!        | t        j"                  |	d      }|j%                  t'        d             | j                  t        j(                  | j*                  |       | j                  |      }n| j                  |d      dk(  rd}d}||| j-                         k7  r|r|}
n|}
| j                  |
d      dk(  r*| j/                  |
|d|      }| j1                  |
       n| j3                  |
      }| j5                  || j7                  |
      |d|      }n| j8                  t        j:                  z  r"| j/                  | j<                  |d|      }n| j8                  t        j>                  z  sW| j8                  t        j@                  z  s:| j8                  t        jB                  z  s| j8                  t        jD                  z  r!| jG                  | j<                  |d|      }| jI                  | j                  |             r#| jK                  |d
|jM                                n| jK                  |d
d       d| _'        | jQ                  ||       |S #  Y xY w)z&Recreate item (needed for OnEndDrag())r  z"LayerTree.RecreateItem(): layer=%sr   r  r   r)  r   Tr  r  r;   rK   r2  r4  r6  r+  NrF   )r(  r8  r9  imagedatar  r)  ))r   rL  r  IsItemCheckedGetItemImager   rF  r  ro  r|   rb   rG  rH  r   r   rs   r   rJ  rK  rn   rL  r  r   rN  ru  r   rO  rP  rU   TREE_HITTEST_ABOVErP   TREE_HITTEST_BELOWTREE_HITTEST_NOWHERETREE_HITTEST_TOLEFTTREE_HITTEST_TORIGHTrT  ro   r   r,  rX   r.  )r   r  r  r   r*  r  r(  newctrlr  r_  	afteritemr  	newparents                r   r  zLayerTree.RecreateItem  sG   		!9D<L<LX<VVW $$X.!!(A.)X62i?--/G  %%hJ%?FFdFS
 LL**D,=,=>>>(+DxV4^,66x@F%dryyhWGq!?@AIIbmmT%B%BGL>>(+DxV4?GD !jD4D4D4F&F"	 '	    77B**D!TX +  I& !..y9	//''	2 *  yy2000**IID!TX +  R222II 7 77II 6 66II 7 77//IID!TX * 
 	wx 89g6Ig6>w0Qs   2N
 
Nc                 :   | j                  |d      }|s|S |s| j                  |d      }t        |j                         dz        }|s5| j                  |d      }t        ||j	                         d      \  }}|sy|dk  r|d	t        d
      |fz  z   dz   S |S )zIGet layer name string

        :param lname: optional layer name
        r   r   r!   r   r4  T)	layerTypefullyQualifiedNz (%s %dzopacity:z%))r   r   r  r   r   rn   )r   r   r  r:  r  dcmdr`  s          r   r  zLayerTree._getLayerName  s    
 $$Tz$:L%%d%8Eh))+c12$$Tu$5D. 0 0 24LE5 S=9*w'???$FFr   c                    |r| j                  |d|       | j                  |      }t        |      \  }}| j                  |d      }| j	                  ||       | j                          |r|s*|j                          t        | t        d      |z         y|r#| j                  || j                  |      |f       | j                  |d|       |r| j                  |       |r| j                  j                  d	      sq| j                  st        j                  d
dd      rM| j                  |d      }|j!                         dv r(| j                  j"                  j%                  |gd       d| _        |rj'                         s+d| _        | j+                  |d       |j-                  d       y| j                  j                  d	      r| j                  |d      }| j                  j"                  }	t/        |j1                               dkD  rY|j2                  dk(  r4|	j5                  |      r|	j7                  |       |	j9                  |       n|j2                  dk(  r4|	j5                  |      r|	j;                  |       |	j=                  |       n|j2                  dk(  r|	j5                  |      r|	j?                  |       tA        jB                  |jE                               }
|
d   |
d   z   dkD  r|	jG                  |d       |
d   |
d   z   dkD  r|	jG                  |d       t/        |	jH                  jK                  dd            }|dk  r|	jM                          yyyyy)zBProcess layer data (when changes in properties dialog are applied)r4  r  r   r   zMap <%s> not found.r  Nr>  r-  r  r  r  r  r  Fr  Tr   r&   r,  r   r  r  r  r  r  )r&   r,  r   )rx  r@  rG  )'r   r  r   r   r  r   Hider   rn   ro   r  rl   rZ  rT   r   r  r   r  r  IsActiverX   r.  	SetActiver   ro  r  IsLoadedr  r  r  r  r  r  r  r7  r  r   GetListOfLayers	ResetView)r   r  r   rp  r>  mapTextr  r`  r:  mapWinr  r  s               r   rn  zLayerTree.GetOptData  s5    ed;((/G06NGU((J(?HUG,002%a0E.F.PQ NN54#4#4U#;V"DE%Yg> U# ??..t4

###y  ,,U
,C##%)==OO--77$   %	 8  DJ $$&"&ud+""4( ,,T2,,U
,C22x()A-}}0!??51"//6))%0!+5!??51"11%8++E2!(2!??51"//6 ' 8 89I9I9K L!(OeK.@@AE"--eD-A!'NU<-@@AE"--eE-B "

22"CD 3 G
 {((* #9 . 3 r   c                 4   g }| j                   |S | j                  | j                         d   }|r| j                  |      |S d }|r-| j                  j	                  d      }|r|j                         }d}|rm|| j                  |      dz   z  }| j                  |d      }| j                  |d      }|r|dk7  r||ur|j                  |       | j                  |      }|rmt        j                  d	d
t        |      z         |j                          |S )Nr   r   rD   r  r  r   r   r+     z&LayerTree.GetVisibleLayers(): items=%s)rP   r   r   rl   ri  rj  r  r   r   r   r   rL  r  reverse)	r   skipDigitizedr   vislayerr  r~  itemListlTyper:  s	            r   r|  zLayerTree.GetVisibleLayerso  s   99M%%dii034>>(3;M??55h?L*335((2S88H%%hF%;E((z(BH')hk.Ih'''1H  			!=(ASTUr   c           	      Z   | j                  |d      }d}|dk(  r| j                  | j                  |d            }|j                         |j                         j                  d      }g }|D ]"  }|j	                  |j                  d             $ d}| j                  |      }	| j                  |       }
n|d	k7  r| j                  |      z| j                  |d
      }| j                  |d      j                         }| j                  |      }	| j                  |       }
t        |d      \  }}|s| j                  |      }| j                  j                  | j                  |d      ||	
      }| j                  |d|       | j                  j                  d      r+| j                  j                  d      j!                  d       | j                  j                  d      r| j#                         j%                  dt'        j(                         d         }| j                  j                  d      j+                  |       | j                  j                  d      j-                          | j                  j/                  | j1                                d| _        y)zChange layerr  r   Nr)  r  r=  r<        ?r+  r4  r   T)r  )r   rx  r)  r  r@  rA  r  r  r   rw  rdigitr&   r&  )rx  r  )r   FindWindowByIdr  r  r   r  	IsVisibler   r  r   r  r   r  r   rl   ri  r~  r   r  rO  rP  UpdateRasterLayersSelectDefaultr}  r|  rV   )r   r   r  	layerNamer  r4  cmdlistra  opacchkrA  r`  r   r  s                 r   r  zLayerTree.ChangeLayer  sh     6 2	9%%d&7&7&&7&IJC||~)lln**3/ 1ANN1773<01((.!^^D11W_~~d#/++De+<((:(>IIK((.!^^D11#6wt#T 	5 $ 0 0 6I88''##Dj#9 ( 
 	$Jh? ??%%h/OO&&x0CCtCT ??%%h/kkm33u||~h'? 4 G OO&&x0CCGLOO&&x0>>@40023 r   c                      y r   r   s     r   OnCloseWindowzLayerTree.OnCloseWindow  s    r   c                     | j                  | j                        d   }|dk(  r| j                  ||      S | j                  |||      S )zFind item based on key and value (see PyData[0]).

        If key is 'name', finds item(s) of given maplayer name.

        :return: item instance
        :return: None not found
        r   r  )r   rP   _LayerTree__FindSubItemByName_LayerTree__FindSubItemByData)r   r   r   r   s       r   r  zLayerTree.FindItemByData  sL     !!$)),Q/&=++D%88++D#u==r   c                     | j                  | j                        d   }d}|r@|j                         r0||k(  r|S | j                  |      }|dz  }|r|j                         r0y)zkFind item by index (starting at 0)

        :return: item instance
        :return: None not found
        r   rF   N)r   rP   r  r   )r   r:  r   r%  s       r   rM  zLayerTree.FindItemByIndex  sd     !!$)),Q/tyy{Ez##D)DFA tyy{ r   c                     | j                  | j                        d   }|rJ|j                         r:| j                  |      |k(  r|S | j	                  |      }|r|j                         r:y)zxFind item by window (button for context menu)

        :return: window instance
        :return: None not found
        r   N)r   rP   r  GetItemWindowr   )r   windowr   s      r   r   zLayerTree.FindItemByWindow  sb     !!$)),Q/tyy{!!$'61##D)D	 tyy{ r   c                    | j                  | j                        d   }|rm|j                         r\| j                  |d      }|r!||j                  k(  r| j                  ||       | j                  |      }|r|j                         rZyyyy)z"Enable/disable items in layer treer   r   r   N)r   rP   r  r   r  
EnableItemr   )r   r  enabler   r:  s        r   EnableItemTypezLayerTree.EnableItemType  sz    !!$)),Q/tyy{((:(>HDHMM1f-&&t,D tyy{d{dr   c                 &   |r|j                         r| j                  ||      }||k(  r|S | j                  |d      dk(  r+| j                  |      d   }| j                  |||      }|r|S | j	                  |      }|r|j                         ry)z!Support method for FindItemByDatar   r  r+  r   N)r  r   r   r  r   )r   r   r   r   	itemValuesubItemr`  s          r   __FindSubItemByDatazLayerTree.__FindSubItemByData	  s    tyy{))$C)8I	!  6 2g=,,T21500#uE L&&t,D tyy{ r   c                    g }|r|j                         r	 | j                  |d      }|r$||j                         k(  r|j	                  |       | j                  |d      dk(  r9| j                  |      d   }| j                  ||      }|r|j                  |       | j                  |      }|r|j                         r|r|S y# t        $ r Y yw xY w)z7Support method for FindItemByData for searching by namer   r   Nr  r+  r   )	r  r   KeyErrorr7  r   r   r  extendr   )r   r   r   r$  	itemLayerr  r`  s          r   __FindSubItemByNamezLayerTree.__FindSubItemByName	  s    tyy{ --d
-C	 Ui&7&7&99T"  6 2g=,,T21500%@LL'&&t,D tyy{ L  s   C 	CCc           	          d}t         j                  dv rd}t        | t        j                  dt        j
                  | j                         d   dz
  |ft        j                  t        j                  z        }|S )z&Creates text control for command layerr   )win32rG   (   rD   r   r   )r   r   r?  r  rA   )	rg   rh   r   rb   rJ  DefaultPositionGetSizeTE_PROCESS_ENTERTE_DONTWRAP)r   heightr  s      r   rF  zLayerTree._createCommandCtrl*	  sj    <<..Fyy"",,.#c)62%%6
 r   )F)FFr  )NNN)	NNr  NNNNTF)T)rD   )Y__name__
__module____qualname____doc__rb   rJ  SUNKEN_BORDERrZ   TR_HAS_BUTTONSTR_HAS_VARIABLE_ROW_HEIGHTTR_HIDE_ROOTTR_ROW_LINESTR_FULL_ROW_HIGHLIGHTTR_MULTIPLEr_   rz   r   propertyrK  r   r   r   r   r   rj   r   r   r   r   r   r   r   r   r   r  r   ru  rm  r  rn  r`  ra  rt  ro  rf  re  rq  rr  rs  rk  r  rl  r  r  r\  r[  r  r]  rW  r   r   rX  r  rg  r  r~   r   r   r   rH  r   r   r   r   r  r  r  rn  r|  r  r  r  rM  r   r  r  r  rF  __classcell__)r   s   @r   r?   r?   Z   s#   & 99!!

'
'(
// // 
"
"	#
 .. _CB/4E #45N"J.="6
C (	( 9M!^	!!(&<P<(>&6J
X0N "B.(4$
$36
:-(3

 RV65p1 l\00Qd% *X	IV "	FP4"!HWr2V+p@7r>"- ,r   r?   );r
  rg   rb   wx.lib.agw.customtreectrllibagwcustomtreectrlrZ   ImportErrorwx.lib.customtreectrlr   wx.lib.mixinsgrass.scriptr   rO  r   r  r   rT  r   gui_core.dialogsr   r	   r
   gui_core.formsr   core.renderr   
core.utilsr   r   
core.debugr   core.settingsr   r   vdigit.mainr   	core.gcmdr   r   r   
icons.iconr   gui_core.widgetsr   gui_core.wrapr   r   r   r   lmgr.gifacer   TREE_ITEM_HEIGHTrn   r   DragAndDropCustomTreeCtrlr?   r  r   r   <module>r+     s  $  	'**( ' * (  M M   9  > " 2 2  ) @ @ ?  "oQ7T5UV"0:M8NO" Hqy1" 82H0IJ	"
 U!,?*@A" U!,?*@A" 81%B#C" h>;S9TU" HA6O4PQ" 82H0IJ" XQ'S%T"  x!$>"?!"& .a8H6IJ'"( Xq)B'C)". (2!<Q:RS/"0 8q?1"2 h)*KL3"< U!,<*=>!M2BCAn4EF~Q7N5OPC"J]#	%%r'8'8 ]#E  '&&'
  (''(s"   H H0 H-,H-0H?>H?