
    ը	fZ                        d Z ddlZddlZddlZddlmZmZ ddlZddl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mZmZmZmZmZmZmZmZ ej6                  j8                  d	k\  reZ G d
 deee	e      Z G d dej@                        Z!y)aJ  
@package vnet.widgets

@brief Base class for list of points.

Classes:
 - widgets::PointsList
 - widgets::EditItem

(C) 2012 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 Original author Michael Barton
@author Original version improved by Martin Landa <landa.martin gmail.com>
@author Rewritten by Markus Metz redesign georectfier -> GCP Manage
@author Stepan Turek <stepan.turek seznam.cz> (Created PointsList from GCPList) (GSoC 2012, mentor: Martin Landa)
    N)copydeepcopy)ColumnSorterMixinListCtrlAutoWidthMixin)	globalvar)GError)FloatValidatorIntegerValidator)	BitmapFromImageButtonComboBoxListCtrlPanel	StaticBox
StaticTextTextCtrlCheckListCtrlMixin   c                   R   e Zd Zej                  ej
                  ej                  ej                  ej                  z  ej                  z  ej                  z  fdZd Zd Zd Zd Zd Zd Zd Zd	 Zd
 Zd ZddgfdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#y)
PointsListc                 N   t        j                  | |||||       t        j                  |        t        j                  |        |j	                  ddt        d      ddg       || _        ddddd| _        g | _        | j                          i | _
        | j                  t        j                  | j                         | j                  t        j                  | j                          | j                  t        j"                  | j$                         t        j&                  | _        d| _        | j-                  t        j.                        | _        t3        | j5                               }t3        | j7                               }| j0                  j9                  |      | _        | j0                  j9                  |      | _        g | _        | jA                         }	tC        j                  | |	       dg|	z  | _"        g | _#        | jI                          | jK                  dd	       y
)a  Creates list for points.

        PointsList class was created from GCPList class in GCP manager. It is possible
        to be shared by GCP and VNET front end.

        Important parameters:
        :param cols: is list containing list items. which represents columns.
                This columns will be added in order as they are in list.
                Class will add as first column "use" with number of point and checkbox.
                Structure of list item must be this:
               -1. item: column name
               -2. item: column label
               -3. item: If column is editable by user, it must contain convert function to convert
                         inserted string to it's type for sorting. Use None for not editable
                         columns. Values for insertion can be in list. This allows insert
                         just values in the list.
               -4. item: Default value for column cell. Value should be given in it's  type
                         in order to sorting would work properly. If 3. item is list, it must be index
                         of some item in the list.

        Example of cols parameter:
                 column name, column label, convert function, default val
        @code
         cols =   [
                   ['E', _('source E'), float, 0.0],
                   ['N', _('source N'), float, 0.0],
                   ['E', _('target E'), float, 0.0],
                   ['N', _('target N'), float, 0.0],
                   ['F_Err', _('Forward error'), None, 0],
                   ['B_Err', _(Backward error'), None, 0]
                   ['type', _('type'), [_(""), _("Start point"), _("End point")], 0] # Select from 3 choices ("Start point", "End point"),
                                                                                     # Choice with index 0 ("") is default.
                  ]
        @endcode
        r   useF      r   )colNamecolLabelcolEditableitemDefaultValue2   N)&r   __init__r   r   insert_colsData	dataTypes	CheckList_createCols
hiddenColsBindwxEVT_LIST_ITEM_SELECTEDOnItemSelectedEVT_LIST_ITEM_ACTIVATEDOnItemActivatedEVT_LIST_COL_CLICK
OnColClick	NOT_FOUNDselectedselectedkeyGetImageListIMAGE_LIST_SMALLilr   getSmallUpArrowImagegetSmallDnArrowImageAddsm_dnsm_upitemDataMapGetColumnCountr   _colSortFlagselIdxsResizeColumnsSetColumnWidth)
selfparentcolsidpossizestyleSmallUpArrowSmallDnArrowncolss
             -/usr/lib/grass83/gui/wxpython/vnet/widgets.pyr!   zPointsList.__init__3   s   Z 	$Cu= 	##D)''- 	Aqx23 !	
 		"++T-@-@A		",,d.B.BC		"''9 ##B$7$78 't'@'@'BC&t'@'@'BCWW[[.
WW[[.
 ##%""4/ C%K Ar"    c                 >   	 t	        j
                         }|j                  t        j                  t        j                  z  t        j                  z         |j                  d       t        j                  rt        j                  |_        nt        j                  |_        t        | j                        D ]c  }| j                  d   }|j!                  |d   |          t        j                  r| j                  |d   |       O| j#                  |d   |       e y)zCreates columns in listr   r   r   r   N)	enumerater$   r%   InsertColumnr*   ListItemSetMaskLIST_MASK_TEXTLIST_MASK_IMAGELIST_MASK_FORMATSetImager   wxPythonPhoenixLIST_FORMAT_LEFTFormatm_formatSetTextInsertColumnInfo)rB   coliLabelinfos       rL   r'   zPointsList._createCols   s     ;;=DLL**R-?-??"BUBUUVMM"(( 11 " 3 3 / 8
3SVF^,,,%%c!fd3))#a&$78rM   c                    | j                   d   }| j                   d   }g }g }| j                  D ]q  }t        ||         j                  dk(  r/|j	                  ||   ||             |j	                  ||          M|j	                  ||          |j	                  d       s | j
                  j	                  |       t        j                  | j                        D ]  }|d   |   }t        |d   |         j                  dk(  r2|d   j	                  |d   |   |          |d   j	                  |       [|d   j	                  |       |d   j	                  d        | j                         | _
        | j                  dz   |d	<   | j                  j	                  t        |             | j                  t        t        t         |                   | j                         dz
  | _        | j%                  | j"                  | j                         | j'                  | j"                  t(        j*                  t(        j*                         | j-                          | j"                  S )
z+Appends an item to list with default valuesr   r   listr   r$   r<   r?   r   r   )r%   r$   type__name__appendr?   six
itervaluesr(   GetItemCountr3   r<   r   Appendra   mapstrr2   SetItemDataSetItemStater*   LIST_STATE_SELECTEDr@   )rB   iDefValiColEditemDataitemIndexesr]   hColdefVals           rL   AddItemzPointsList.AddItem   s   ..!34.== 	'CCK ))V3FCL 9:""3w<0G-""2&	' 	K(NN4??3 	+D*%g.FD$V,-66&@]#**4
+;F+CF+KLY&&v.]#**62Y&&r*	+  ,,.&&*X/DS(+,-))+a/(8(89$--)?)?AWAWX}}rM   c                     | j                  |      }|dk  ry| j                  d   }| j                  |   |   dk7  r| j                  |   |   S | j                  |   |   S )z@Get value in cell of list using key (same regardless of sorting)r   Nr   r   )_getColumnNumr%   r?   r<   rB   keyr   colNumro   s        rL   GetCellValuezPointsList.GetCellValue   sj    ##G,A:.<<V$*<<$V,,$V,,rM   c                 f    | j                  |      }| j                  d   }| j                  |   |   S )zGet selected index in cell of list using key (same regardless of sorting)

        :return: number of chosen value, if column has values to choose
        :return: -1 if column does not has values to choose
        r   )rv   r%   r?   rw   s        rL   GetCellSelIdxzPointsList.GetCellSelIdx   s6     ##G,.||C ((rM   c                    | j                  |      }| j                  |      }| j                  d   }t        | j                  |   |         j
                  dk(  r(| j                  |   |   |   }|| j                  |   |<   n|}d| j                  |   |<   || j                  |   |<   t        |t              st        |      }| j                  |||       y)z<Changes value in list using key (same regardless of sorting)r   ra   r   N)rv   GetItemDatar%   rb   r$   rc   r?   r<   
isinstance
basestringrj   SetItem)rB   indexr   cellDatary   rx   ro   cellVals           rL   EditCellIndexzPointsList.EditCellIndex   s    ##G,u%.f%f-.776AmmF+F3H=G(0DLLf%G(*DLLf%(/f%':.'lGUFG,rM   c                    | j                  |      }| j                  d   }t        | j                  |   |         j                  dk(  r(| j                  |   |   |   }|| j
                  |   |<   n|}d| j
                  |   |<   || j                  |   |<   | j                  |      }|dk7  r/t        |t              st        |      }| j                  |||       yy)z:Changes value in list using index (changes during sorting)r   ra   r   N)rv   r%   rb   r$   rc   r?   r<   
_findIndexr   r   rj   r   )rB   rx   r   r   ry   ro   r   r   s           rL   EditCellKeyzPointsList.EditCellKey  s    ##G,.f%f-.776AmmF+F3H=G(0DLLf%G(*DLLf%(/f%$B;gz2g,LL0 rM   c                     d}	 | j                  |t        j                        }|| j                  |      k(  r|S |dk(  r	 y>)zFind index for keyr   )GetNextItemr*   LIST_NEXT_BELOWr~   )rB   rx   r   s      rL   r   zPointsList._findIndex  sL    $$UB,>,>?Ed&&u--{ rM   c                 h    | j                  |      }| j                  d   }|| j                  |   |<   y)zMChange 3. item in constructor parameter cols (see the class constructor hint)r   N)rv   r%   r$   )rB   r   colTypery   ro   s        rL   ChangeColEditablezPointsList.ChangeColEditable   s3    ##G,.(/ff%rM   c           	      T   | j                   t        j                  k(  ry| j                  | j                         }t	        j
                  | | j                          | j                  |= | j                  j                  |       t        j                  | j                        D ]*  }|d   j                  |       |d   j                  |       , t        |t        | j                              D ]Z  }| j                  d|dz         }|| j                  |   d<   | j                  |dt!        |dz                | j#                  ||       \ | j%                         dkD  r| j                   | j%                         k  r!| j                  | j                         | _        n8| j%                         dz
  | _         | j                  | j                         | _        | j)                  | j                   t        j*                  t        j*                         yt        j                  | _         d| _        y)zDelete selected item in listNr<   r?   r   r   r   )r2   r*   r1   r~   r   
DeleteItemr<   r?   popre   rf   r(   rangelenFindItemr   rj   rk   rg   r3   rl   rm   )rB   rx   rr   newkeyr   s        rL   r   zPointsList.DeleteItem&  s   ==BLL(t}}-D$--0S! NN4??3 	%D##C(O$	%
 CT%5%5!67 	,FMM"fqj1E*0DV$Q'LL3vz?3UF+		, "}}t0022#'#3#3DMM#B  $ 1 1 3a 7#'#3#3DMM#B r55r7M7M LLDM!DrM   c                    | j                   t        j                  k(  ry| j                   }| j                  d   }| j                  d   }d}| j                  D ]`  }|dk(  r|dz  }t        ||         j                  dk(  r| j                  ||||   ||             n| j                  ||||          |dz  }b | j                  |d       y)zISet all values to default in selected item of points list and uncheck it.Nr   r   r   r   ra   F)	r2   r*   r1   r%   r$   rb   rc   EditCell	CheckItem)rB   eventr   rn   ro   ir]   s          rL   	ClearItemzPointsList.ClearItemL  s    ==BLL(..!34.== 	CAvQCK ))V3eQFCL(ABeQG5FA	 	ue$rM   Z   x   c                    t        | j                               D ][  }| j                  |t        j                         |dkD  s)| j                  |      ||dkD     k  sD| j                  |||dkD            ] | j                          y)zResize columnsr      N)r   r=   rA   r*   LIST_AUTOSIZEGetColumnWidthSendSizeEvent)rB   minWidthr   s      rL   r@   zPointsList.ResizeColumnsa  s|    t**,- 	8A2#3#341u,,Q/(1q5/A##AxA7		8 	rM   c                     | j                   S )zGet index of selected item.)r2   rB   s    rL   GetSelectedzPointsList.GetSelectedk  s    }}rM   c                 2    | j                   | j                  fS N)r:   r;   r   s    rL   GetSortImageszPointsList.GetSortImagesp  s    

DJJ''rM   c                     | S r    r   s    rL   GetListCtrlzPointsList.GetListCtrlt  s    rM   c           	      J   g }|j                         }| j                  |      }d}| j                  d   }t        | j                        D ]I  }|d   |   s|j                  |d   | j                  ||d         j                         |d   |   g       K |sy| j                  ||      }|j                         t        j                  k(  r|j                         }	t        |	      dk(  rt        | t        d             nd}
|	D ]k  }|d   ||
   d   k7  rV|d   }t!        |d   t"              st%        |d         }| j'                  ||d   |       |d   | j(                  |   |d   <   d	}|
dz  }
m |j+                         | j,                  |<   |j/                          ||fS )
zBWhen item is double clicked, open editor to edit editable columns.Fr   r   r   N)datapointNoz+Invalid value inserted. Operation canceled.)rC   messageT)GetIndexr~   r%   rO   r$   rd   GetItemGetTextCreateEditDialog	ShowModalr*   ID_OK	GetValuesr   r   r#   r   r   rj   r   r<   GetSelectionIndexesr?   Destroy)rB   r   r   r   rx   changedro   r]   dlg
editedDatar   
editedCellvalues                rL   r.   zPointsList.OnItemActivatedw  s    u%.T]]+ 	C1vf~AUCF3;;=Av	 ##s#;==?bhh&J:!#KL
 ", J!!}Q
2 *1)*Q-D$'
1$6EUJqM5A?I!}((-jm<"&FA %($;$;$=S!|rM   c                 <    t        | t        j                  ||      S )zHelper function
        It is possible to define in child derived class
        and adapt created dialog (e. g. it's title...)
        )rC   rE   r   r   )EditItemr*   ID_ANY)rB   r   r   s      rL   r   zPointsList.CreateEditDialog  s     t		gNNrM   c                     | j                  d| j                        | _        | j                  | j                  t        j
                  t        j
                         |j                          y)z!ListCtrl forgets selected item...r   N)r   r3   r2   rl   r*   rm   SkiprB   r   s     rL   r0   zPointsList.OnColClick  sE    b$*:*:;$--)?)?AWAWX

rM   c                     | j                   |j                         k7  r5|j                         | _         | j                  | j                         | _        |j	                          y)z@Updates class attributes holding information about selected itemN)r2   r   r~   r3   r   r   s     rL   r,   zPointsList.OnItemSelected  sC    ==ENN,,!NN,DM#//>D

rM   c                     t        t        j                  j                  t        j
                  d      d      }	 t        j                  |      }|j                          |S # |j                          w xY w)z-Get arrow up symbol for indication of sortingzsmall_up_arrow.pngrb	openospathjoinr   IMGDIRr*   ImagecloserB   streamimgs      rL   r7   zPointsList.getSmallUpArrowImage  sR    bggll9#3#35IJDQ	((6"CLLN
 LLN   A! !A3c                     t        t        j                  j                  t        j
                  d      d      }	 t        j                  |      }|j                          |S # |j                          w xY w)z/Get arrow down symbol for indication of sortingzsmall_down_arrow.pngr   r   r   s      rL   r8   zPointsList.getSmallDnArrowImage  sR    bggll9#3#35KLdS	((6"CLLN
 LLNr   c                 V    t        | j                        D ]  \  }}||d   k(  s|c S  y)zGet position of column among showed columns

        :param colName: name of column
        :type colName: str
        :return: index of columns or -1 if col was not found
        r   r   )rO   r$   )rB   r   iColr]   s       rL   rv   zPointsList._getColumnNum  s6     #4==1 	ID##a& 	 rM   c                 B   | j                  |      }|dk(  ry| j                  |      }| j                  |       i | j                  |<   || j                  |   d<   g }g }| j                  D ]"  }|j                  |j                  |             $ | j                  D ]"  }|j                  |j                  |             $ || j                  |   d<   || j                  |   d<   | j                  j                  |      | j                  |   d<   | j                          y)zHide column (hidden columns are not editable)

        :param colName: name of column
        :type colName: str
        :return: True - if column was hidden
        :return: False - if position is not valid or column is not showed
        r   FwxColr<   r?   r$   T)
rv   	GetColumnDeleteColumnr(   r<   rd   r   r?   r$   r@   )rB   r   ry   	hiddenCol
hiddenMapshiddenSelIdxsitems          rL   
HideColumnzPointsList.HideColumn  s    ##G,R<NN6*	&!#% ,5 )
$$ 	0Ddhhv./	0LL 	3D  &!12	3 3= /.; +/3}}/@/@/H ,rM   c                    |dk  r|| j                   j                         k\  ry|| j                  v r| j                  |   }t        | j                        D ]   }|d   j                  ||d   |d             " t        | j                        D ]   }|d   j                  ||d   |d             " | j                  j                  ||d          | j                  ||d          | j                          | j                  |= yy)	a/  Show column

        :param colName: name of column
        :type colName: str
        :param pos: zero based index of position among showed columns (including added 'use' column)

        :return: True if column was shown
        :return: False if position is not valid or column is not hidden
        r   Fr   r<   r?   r$   r   T)
rB   r=   r(   rO   r<   r"   r?   r$   InsertColumnItemr@   )rB   r   rF   r]   r   s        rL   
ShowColumnzPointsList.ShowColumn  s     7sdii6688doo%//'*C!$"2"23 AQsC$6tAw$?@A!$,,/ =QsC	N47$;<= MM  c*o6!!#s7|4 (rM   c                 .    | j                  |      dk(  ryy)zIs column shown

        :param colName: name of column
        :type colName: str

        :return: True - if is shown
        :return: False - if is not shown
        r   FT)rv   )rB   r   s     rL   IsShownzPointsList.IsShown  s     g&",rM   N)$rc   
__module____qualname__r*   r   DefaultPositionDefaultSize	LC_REPORTSUNKEN_BORDER	LC_HRULESLC_SINGLE_SELr!   r'   rt   rz   r|   r   r   r   r   r   r   r@   r   r   r   r.   r   r0   r,   r7   r8   rv   r   r   r   r   rM   rL   r   r   0   s     99^^llR---<r?O?OOb#H82&P-)-$1(	0$"L%* ')#Y 
(-^O>:rM   r   c                   \    e Zd Zdej                   ed      ej                  fdZd Zd Z	y)r   z	Point No.z
Edit pointc                    t         j                  j                  | ||t        |      |       || _        t        |       }t        j                  t         j                        }	t        |t         j                  dt        |      dt        |dz         d      }
t        j                  |
t         j                        }t        j                  dd      }g | _        t        |      | _        d}d}d}| j                  D ]  }t!        |d	         j"                  d
k(  rI| j                  j%                  t'        |t         j                  |d	   t         j(                  d             n|d	   t*        k(  rt-               }n|d	   t.        k(  rt1               }nd}|r7| j                  j%                  t3        |t         j                  |d             ny| j                  j%                  t3        |t         j                  d             |d   }t5        |d   t6              st        |d         }| j                  |   j9                  |       t;        |t         j                  t        |j=                  |d         j?                               dz         }|jA                  |t         jB                  ||f       |dz  }|jA                  | j                  |   ||f       |dz  dk(  rd}|dz  }n|dz  }|dz  } |jA                  |dt         jD                  t         jF                  z  d       |	jA                  |dt         jD                  t         jF                  z  d       tI        |t         jJ                        | _&        tI        |t         jN                        | _(        | jP                  jS                          t        jT                         }|jW                  | jL                         |jW                  | jP                         |jY                          |	jA                  |dt         jZ                  t         jF                  z  d       |j]                  |	       |	j_                  |        y)z%Dialog for editing item cells in list)titlerH   )rC    r   )rC   rE   label   )vgaphgapr   r   ra   )n   r   )rC   rE   choicesrH   rG   N)   r   )rC   rE   	validatorrG   )rC   rE   rG   :)flagrF   )rF   r   )
proportionr   border)0r*   Dialogr!   r#   rC   r   BoxSizerVERTICALr   r   rj   StaticBoxSizerGridBagSizerfieldsr   r   rb   rc   rd   r   CB_READONLYfloatr	   intr
   r   r   r   SetValuer   r   r   r9   ALIGN_CENTER_VERTICALEXPANDALLr   	ID_CANCEL	btnCancelr   btnOk
SetDefaultStdDialogButtonSizer	AddButtonRealizeALIGN_RIGHTSetSizerFit)rB   rC   r   r   itemCaprE   r   rH   panelsizerboxboxSizer	gridSizerr]   rowiFieldcellr   r   r   btnSizers                        rL   r!   zEditItem.__init__)  so    			41U85IT"BKK(RYY1W:s7UV;GW.X
 $$S"++6 OO3	TN	II 9	DDG}%%/""$99 $Q nn& 7e# . 0I!W^ 0 2I $IKK&& #(!yy&/!*	 KK&& ")))L !GE%d1gz: #DGKK'00799((a199;<sBE MM%b&>&>S#JMO1HCMM$++f-C:M>Qw!|qqaKFs9	v 	Y1299rvv3EaP		(qryy266/A!	L
  r||4E288,


**,4>>*4::&		(qr~~/Fq	Qu		$rM   c                 
   d}| j                   D ]T  }| j                  |   j                         }t        |d         j                  dk(  r||d<   n	  |d   |      |d<   |dz  }V | j                   S # t
        $ r g cY c S w xY w)z#Return list of values (as strings).r   r   ra   r   )r   r  GetValuerb   rc   
ValueError)rB   r  r  r   s       rL   r   zEditItem.GetValues  s     II 
	DKK'002EDG}%%/Q%d1genDG aKF
	 yy	 " Is   A22BBc                    d}g }| j                   j                  D ]f  }t        |d         j                  dk(  r-|j	                  | j
                  |   j                                n|j	                  d       |d   sb|dz  }h |S )zSReturn indexes of selected values (works just for choice
        columns).
        r   r   ra   r   r   )rC   r$   rb   rc   rd   r  GetSelection)rB   r  rq   r  s       rL   r   zEditItem.GetSelectionIndexes  s     KK(( 	DDG}%%/""4;;v#6#C#C#EF""2&Aw!	 rM   N)
rc   r   r   r*   r   r#   DEFAULT_DIALOG_STYLEr!   r   r   r   rM   rL   r   r   (  s/     99o%%n`$rM   r   )"__doc__r   sysre   r   r   r*   wx.lib.mixins.listctrlr   r   corer   	core.gcmdr   gui_core.widgetsr	   r
   gui_core.wrapr   r   r   r   r   r   r   r   r   version_infomajorrj   r   r   r   r   r   rM   rL   <module>r-     s|   ( 
 
 
  	 L   =
 
 
 QJu "8:KupQryy QrM   