
,]c           @   s  d  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 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 m Z m Z m Z d d l m Z m Z m Z y d d l  m! Z! Wn! e" k
 rd d l# m! Z! n Xd d	 l$ 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/ m0 Z0 m1 Z1 m2 Z2 d d l3 m4 Z5 d d l6 m7 Z7 m8 Z8 m9 Z9 m: Z: d d l; m< Z< e= e> e% j? e% j@ f ZA eB e% jC e% jD f ZE d d d d d d g ZF d ZG d ZH d ZI d ZJ d ZK d ZL d ZM d ZN d ZO e	 jP ZQ d  ZR d! ZS d" ZT d#   ZU d$   ZV d% e f d&     YZW d' e f d(     YZX d) e f d*     YZY d+ e f d,     YZZ d- e[ d.  Z\ d/   Z] e^ d0 k re]   n  d	 S(1   s  
Pandas DataFrame Editor Dialog.

DataFrameModel is based on the class ArrayModel from array editor
and the class DataFrameModel from the pandas project.
Present in pandas.sandbox.qtpandas in v0.13.1.

Originally based on pandas/sandbox/qtpandas.py of the
`pandas project <https://github.com/pandas-dev/pandas>`_.
The current version is qtpandas/models/DataFrameModel.py of the
`QtPandas project <https://github.com/draperjames/qtpandas>`_.
i(   t   API(   t   from_qvariantt   to_qvariant(   t   QAbstractTableModelt   QModelIndext   Qtt   Signalt   Slot(   t   QColort   QCursor(   t   QApplicationt	   QCheckBoxt   QDialogt   QGridLayoutt   QHBoxLayoutt   QInputDialogt	   QLineEditt   QMenut   QMessageBoxt   QPushButtont
   QTableViewt   QHeaderView(   t	   DataFramet   DatetimeIndext   Series(   t   OutOfBoundsDatetimeN(   t   _(   t   DEFAULT_SMALL_DELTA(   t   get_fontt   config_shortcut(   t   iot   is_text_stringt   is_type_text_stringt   PY2t   to_text_string(   t   icon_manager(   t   add_actionst   create_actiont
   keybindingt   qapplication(   t   get_idx_rectt   falset   ft   0s   0.s   0.0t    s   %.6gg    Ag     j@i<   gQ?gQ?gffffff?g      ?g333333?g?g?g333333?c         C   s   |  j    t k r d }  n  |  S(   sb   
    Used to convert bool intrance to false since any string in bool('')
    will return True
    t    (   t   lowert   _bool_false(   t   value(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   bool_false_checkM   s    	c         C   sM   g  |  D] } | d k	 r | ^ q } t |   \ } } t |  t |  f S(   s&   Returns the global maximum and minimumN(   t   Nonet   zipt   maxt   min(   t   col_valst   indext   xt   col_vals_without_Nonet   max_colt   min_col(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt
   global_maxW   s    %t   DataFrameModelc           B   s  e  Z d  Z d Z d Z e d d  Z d   Z d   Z	 d   Z
 d   Z d   Z e j d	  Z d
   Z d   Z d   Z e j d  Z e j d  Z d   Z e j d d  Z d   Z e   d  Z e e d  Z e e d  Z e   d  Z d   Z  RS(   s    DataFrame Table Modeli  i(   c         C   ss  t  j |   | |  _ | |  _ | j j   |  _ | j j   |  _ | |  _	 d  |  _ g  |  _ |  j j d |  _ |  j j d |  _ |  j |  j } d  |  _ | t k  r |  j   t |  _ t |  _ |  j d  n t |  _ t |  _ |  j d  | t k r|  j |  _ |  j |  _ nT |  j t k r9|  j |  _ n |  j |  _ |  j t k rc|  j |  _ n |  j |  _ d  S(   Ni    i   (   R   t   __init__t   dialogt   dfR7   t   tolistt   df_indext   columnst	   df_headert   _formatR2   t   complex_intrant   display_error_idxst   shapet
   total_rowst
   total_colst   max_min_colt
   LARGE_SIZEt   max_min_col_updatet   Truet   colum_avg_enabledt   bgcolor_enabledt	   colum_avgt   Falset   ROWS_TO_LOADt   rows_loadedt   COLS_TO_LOADt   cols_loadedt   LARGE_NROWSt
   LARGE_COLS(   t   selft	   dataFramet   formatt   parentt   size(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR>   d   s:    						
				c         C   s  |  j  j d d k r d Sg  |  _ x |  j  j   D] \ } } | j t t k r | j t k r | j d t  } | j	 d t  } n0 | j
   j d t  } | j
   j	 d t  } | | k r | | g } q | | d g } n d } |  j j |  q3 Wd S(   s)  
        Determines the maximum and minimum number in each column.
        
        The result is a list whose k-th entry is [vmax, vmin], where vmax and
        vmin denote the maximum and minimum of the k-th column (ignoring NaN). 
        This list is stored in self.max_min_col.
        
        If the k-th column has a non-numerical dtype, then the k-th entry
        is set to None. If the dtype is complex, then compute the maximum and
        minimum of the absolute values. If vmax equals vmin, then vmin is 
        decreased by one.
        i    Nt   skipnai   (   R@   RH   RK   t	   iteritemst   dtypet   REAL_NUMBER_TYPESt   COMPLEX_NUMBER_TYPESR4   RN   R5   t   absR2   t   append(   RY   t   dummyt   colt   vmaxt   vmint   max_min(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyRM      s    	c         C   s   |  j  S(   s   Return current format(   RE   (   RY   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt
   get_format   s    c         C   s   | |  _  |  j   d S(   s   Change display formatN(   RE   t   reset(   RY   R[   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt
   set_format   s    	c         C   s   | d k |  _  |  j   d S(   s   Toggle backgroundcolori    N(   RP   Rk   (   RY   t   state(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   bgcolor   s    c         C   s>   | d k |  _  |  j  r' d   |  _ n	 t |  _ |  j   d S(   s   Toggle backgroundcolori    c         S   s   |  | S(   N(    (   R6   R7   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   <lambda>   R-   N(   RO   t
   return_maxR<   Rk   (   RY   Rm   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyRQ      s
    		c         C   s   | t  j k r t   S| t  j k r | d k r5 d S| d k r t r |  j d } y t | d d } Wn" t |  s t |  } q n Xt |  St |  j | d  r t |  j | d  St t |  j | d   Sn t   Sd S(   s   Set header datai    t   Indexi   t   encodings	   utf-8-sigN(   R   t   DisplayRoleR   t
   HorizontalR!   RD   R"   R    (   RY   t   sectiont   orientationt   rolet   header(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt
   headerData   s"    
c   	      C   sM  | j    } | d k r5 t t  } | j t  | S|  j sB d S|  j | j   | d  } |  j | d d k r t t  } t
 |  r | j t  qI| j t  n t | t  r t } n t } |  j |  j | d  \ } } t t | | |  | | } t t |   } | d k r1d } n  t j | t t t  } | S(   s#   Background color depending on valuei    Ni   (   t   columnR   t   BACKGROUND_NONNUMBER_COLORt	   setAlphaFt   BACKGROUND_INDEX_ALPHARP   t	   get_valuet   rowRK   R2   R   t   BACKGROUND_STRING_ALPHAt   BACKGROUND_MISC_ALPHAt
   isinstanceRb   Rc   t   floatRp   t   BACKGROUND_NUMBER_MINHUEt   BACKGROUND_NUMBER_HUERANGEt   fromHsvFt   BACKGROUND_NUMBER_SATURATIONt   BACKGROUND_NUMBER_VALUEt   BACKGROUND_NUMBER_ALPHA(	   RY   R7   Rz   t   colorR0   t
   color_funcRg   Rh   t   hue(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   get_bgcolor   s2    			c         C   sz   y |  j  j | | f } WnY t k
 rY |  j  j d d  | f j t  j | } n |  j  j | | f } n X| S(   s"   Returns the value of the DataFrameN(   R@   t   iatR   t   iloct   astypet   str(   RY   R   Rz   R0   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR~     s    /c         C   s   |  j  j j   |  _ d S(   s   "Update the DataFrame indexN(   R@   R7   RA   RB   (   RY   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   update_df_index  s    c         C   s  | j    s t   S| t j k s1 | t j k r3| j   } | j   } | d k r |  j | } t |  rr | St t	 |   Sq|  j
 | | d  } t | t  r y t |  j |  SWq0t t f k
 r t t |  SXqt |  r | Sy t t	 |   SWqt k
 r/|  j j |  d SXno | t j k rUt |  j |   S| t j k rwt t d t   S| t j k r| |  j k rt d  Sn  t   S(   s   Cell contenti    i   u   Display Error!t   font_size_deltasW   It is not possible to display this value because
an error ocurred while trying to do it(   t   isValidR   R   Rs   t   EditRoleRz   R   RB   R    R"   R~   R   R   RE   t
   ValueErrort	   TypeErrort   DEFAULT_FORMATt	   ExceptionRG   Rd   t   BackgroundColorRoleR   t   FontRoleR   R   t   ToolTipRoleR   (   RY   R7   Rw   Rz   R   t   df_idxR0   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   data  s>    c      	   C   s  |  j  d k	 rL |  j  j d d  j | d rL t j |  j d d  t Sn  y1| t j	 k } | d k rYy7 |  j
 j d |  j
 j | d d | d t d	 d
  Wn t k
 r |  j
 j d |  j
 j | d d | d t d	 d
  ne t k
 r} t j |  j d d t |   n3 t k
 rK} t j |  j d d t |   n X|  j   n# |  j
 j d t d |  |  j   Wn4 t k
 r} t j |  j d d t |   t SX|  j   t S(   s   Overriding sort methodt   axisi    i   t   ErrorsD   TypeError error: no ordering relation is defined for complex numberst   byt	   ascendingt   inplacet   kindt	   mergesortRC   s   ValueError: %ss   SystemError: %ss   TypeError error: %sN(   RF   R2   t   anyR   R   t   criticalR?   RR   R   t   AscendingOrderR@   t   sort_valuesRC   RN   t   AttributeErrort   sortR   R"   t   SystemErrorR   t
   sort_indexR   R   Rk   (   RY   Rz   t   orderR   t   e(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR   E  s>       

c         C   s@   | j    d k r  t j t j BSt j t j |  |  t j B S(   s	   Set flagsi    (   Rz   R   t   ItemIsEnabledt   ItemIsSelectablet	   ItemFlagsR   t   flagst   ItemIsEditable(   RY   R7   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR   m  s    c         C   s  | j    } | j   } | |  j k r+ t S| d k	 r yf |  j | d t j } t | t	  } | t
 k r| t |  } n  | |  |  j j | | d f <Wqt k
 r | d  |  j j | | d f <qXn t | t	  } |  j | | d  } t | t
 t j f  r t |  } n  t
 t j f t }	 t | |	  sNt |  ry' | j |  |  j j | | d f <Wqt t f k
 r}
 t j |  j d t	 t |
  j  d t	 |
   t SXn, t j |  j d d j t |  j   t S|  j   |  j j | |  t  S(   s   Cell content changeRw   i   R+   R   s   : s&   Editing dtype {0!s} not yet supported.N(!   Rz   R   RG   RR   R2   R   R   Rs   R   R   t   boolR1   R@   R   R   R~   R   t   npt   bool_Ra   R   t	   __class__t   OverflowErrorR   R   R?   t   typet   __name__R[   RM   t   dataChangedt   emitRN   (   RY   R7   R0   Rw   t   change_typeRz   R   t   valt   current_valuet   supported_typesR   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   setDatat  sB    $''$
c         C   s   |  j  S(   s   Return data(   R@   (   RY   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   get_data  s    c         C   s=   y$ |  j  |  j k r |  j  S|  j SWn t k
 r8 d SXd S(   s   DataFrame row numberi    N(   RI   RT   R   (   RY   R7   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   rowCount  s    c         C   sJ   | r# |  j  |  j k r t St Sn  | rF |  j |  j k r? t St Sn  d  S(   N(   RI   RT   RN   RR   RJ   RV   (   RY   t   rowsRC   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   can_fetch_more  s    c         C   s   |  j  d |  rt |  j |  j } t | |  j  } |  j t   |  j |  j | d  |  j | 7_ |  j   n  |  j  d |  r |  j |  j	 } t | |  j
  } |  j t   |  j	 |  j	 | d  |  j	 | 7_	 |  j   n  d  S(   NR   i   RC   (   R   RI   RT   R5   RS   t   beginInsertRowsR   t   endInsertRowsRJ   RV   RU   t   beginInsertColumnst   endInsertColumns(   RY   R   RC   t   remindert   items_to_fetch(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt
   fetch_more  s    c         C   sa   yH t  |  j j  d k r d S|  j |  j k r< |  j d S|  j d SWn t k
 r\ d SXd S(   s   DataFrame column numberi   i   i    N(   t   lenR@   RH   RJ   RV   R   (   RY   R7   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   columnCount  s    c         C   s   |  j    |  j   d  S(   N(   t   beginResetModelt   endResetModel(   RY   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyRk     s    
N(!   R   t
   __module__t   __doc__RS   RU   R   R2   R>   RM   Rj   Rl   Rn   RQ   R   Rs   Ry   R   R~   R   R   R   R   R   R   R   R   R   R   RR   R   R   R   Rk   (    (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR=   ^   s.   (	 					"			0(	'	t   FrozenTableViewc           B   s    e  Z d  Z d   Z d   Z RS(   s   This class implements a table with its first column frozen
    For more information please see:
    https://doc.qt.io/qt-5/qtwidgets-itemviews-frozencolumn-example.htmlc         C   s6  t  j |  |  | |  _ |  j | j    |  j t j  |  j   j	   y |  j
   j t j  Wn |  j
   j t j  n X| j   j |   |  j | j    x3 t d | j   j    D] } |  j | t  q W|  j d | j d   |  j t j  |  j t j  |  j   |  j d  d S(   s   Constructor.i   i    N(   R   R>   R\   t   setModelt   modelt   setFocusPolicyR   t   NoFocust   verticalHeadert   hidet   horizontalHeadert   setSectionResizeModeR   t   Fixedt   setResizeModet   viewportt
   stackUndert   setSelectionModelt   selectionModelt   rangeR   t   setColumnHiddenRN   t   setColumnWidtht   columnWidtht   setHorizontalScrollBarPolicyt   ScrollBarAlwaysOfft   setVerticalScrollBarPolicyt   showt   setVerticalScrollMode(   RY   R\   Rf   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR>     s$    	"
c         C   sm   |  j  |  j j   j   |  j j   |  j j   |  j j d  |  j j   j   |  j j   j    d S(   sO   Update the frozen column size when an update occurs
        in its parent tablei    N(	   t   setGeometryR\   R   t   widtht
   frameWidthR   R   t   heightR   (   RY   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   update_geometry  s    (   R   R   R   R>   R   (    (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR     s   	t   DataFrameViewc           B   s   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z e	 e	 d  Z
 d   Z d	   Z d
   Z d   Z e   d    Z RS(   s   Data Frame view classc            sj  t  j   |    j |  t      _   j j     j d    j d    j   j	 j
   j    j   j	 j
   j    j j   j j
   j   j  d  g   _   j     _   j j j
   j    j     _ t   j d d d d d     j   j j
   f d      j   j j
   f d      j   j j
   j j   j  d  S(	   Ni   t   contextt   variable_explorert   namet   copyR\   c            s     j  |  d t S(   NRC   (   t   load_more_dataRN   (   R   (   RY   (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyRo     R-   c            s     j  |  d t S(   NR   (   R   RN   (   R   (   RY   (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyRo      R-   (   R   R>   R   R   t   frozen_table_viewR   t   setHorizontalScrollModeR   R   t   sectionResizedt   connectt   update_section_widthR   t   update_section_heightt   verticalScrollBart   valueChangedt   setValueR2   t   sort_oldt   header_classt   sectionClickedt   sortByColumnt
   setup_menut   menuR   R   t   horizontalScrollBar(   RY   R\   R   (    (   RY   sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR>     s,    c         C   s3   | d k r/ |  j  j d |  |  j  j   n  d S(   ss   Update the horizontal width of the frozen column when a
        change takes place in the first column of the tablei    N(   R   R   R   (   RY   t   logical_indext   old_sizet   new_size(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR   $  s    c         C   s   |  j  j | |  d S(   sc   Update the vertical width of the frozen column when a
        change takes place on any of the rowsN(   R   t   setRowHeight(   RY   R  R  R	  (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR   +  s    c         C   s!   t  j |  |  |  j j   d S(   s   Update the frozen column dimensions.

        Updates takes place when the enclosing window of this 
        table reports a dimension change
        N(   R   t   resizeEventR   R   (   RY   t   event(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR  0  s    c         C   s   t  j |  | |  } |  j j d  |  j j d  } |  j |  j   j   } |  j oj | j   d k } | o| | | k  } | | k r |  j	   j
   | | } |  j	   j |  n  | S(   s   Update the table position.

        Updates the position along with the frozen column
        when the cursor (selector) changes its position
        i    i   (   R   t
   moveCursorR   R   t
   visualRectt   topLeftR8   t   MoveLeftRz   R  R0   R   (   RY   t   cursor_actiont	   modifierst   currentt	   col_widtht	   topleft_xt   overflowt	   new_value(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR  9  s    c         C   s,   | j    d k r( t j |  | |  n  d S(   s  Scroll the table.

        It is necessary to ensure that the item at index is visible.
        The view will try to position the item according to the
        given hint. This method does not takes effect only if
        the frozen column is scrolled.
        i   N(   Rz   R   t   scrollTo(   RY   R7   t   hint(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR  N  s    c         C   sr   | r7 | |  j    j   k r7 |  j   j d |  n  | rn | |  j   j   k rn |  j   j d |  n  d  S(   NR   RC   (   R   t   maximumR   R   R  (   RY   R0   R   RC   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR   Y  s    c         C   s   |  j  d g k r% |  j j t  n  |  j j   } |  j   j | |  s t |  j   d k rt |  j j t	  n! |  j j
 |  j  d |  j  d  d S| |  j j   g |  _  d S(   s    Implement a Column sort i   i    i   N(   R   R2   R  t   setSortIndicatorShownRN   t   sortIndicatorOrderR   R   R   RR   t   setSortIndicator(   RY   R7   t
   sort_order(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR  _  s    c         C   s$   |  j  j | j    | j   d S(   s   Reimplement Qt methodN(   R  t   popupt	   globalPost   accept(   RY   R  (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   contextMenuEventm  s    c            s(  t    t d  d t d  d t j d  d   j d t j } t d  t f t d  t	 f t d	  t
 f t d
  t f t d  t f f } | g } xl | D]d \ } } t d k s |   f d  } n |   f d  } | t    | d | d t j g 7} q Wt    } t | |  | S(   s   Setup context menut   Copyt   shortcutt   icont   editcopyt	   triggeredR   s   To bools
   To complexs   To ints   To floats   To strt   pysidec            s     j  |  S(   N(   R   (   t   _checkedt   func(   RY   (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyRo     R-   c            s     j  |   S(   N(   R   (   R*  (   RY   (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyRo     R-   (   R%   R   R&   t   imaR%  R   R   t   WidgetShortcutR   t   complext   intR   R"   R    R   R$   (   RY   t   copy_actiont	   functionst   types_in_menuR   R*  t   slotR  (    (   RY   sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR  r  s&    		c         C   sE   |  j    } |  j   } g  | D] } | j | d d | ^ q d S(   s&   A function that changes types of cellsR-   R   N(   R   t   selectedIndexesR   (   RY   R*  R   t
   index_listt   i(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR     s    c         C   s  |  j    s d St |  j     \ } } } } t } } | d k rS d } t } n  |  j   j } | d k r d j t t | j	 j
   t | | d    } n | d k s | d k r | j d | k r t } n  | j t | | d  t | d |  f }	 t j   }
 |	 j |
 d d d | d | t sD|
 j   } n |
 j   j d	  } |
 j   t j   } | j |  d S(
   s   Copy text to clipboardNi    i   s   
t   seps   	R7   Rx   s   utf-8(   R3  R(   RR   RN   R   R@   t   joint   mapR   R7   RA   t   sliceRH   R   R   t   StringIOt   to_csvR!   t   getvaluet   decodet   closeR
   t	   clipboardt   setText(   RY   t   row_mint   row_maxt   col_mint   col_maxR7   Rx   R@   t   contentst   objt   outputR?  (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR     s,    
	+	-
(   R   R   R   R>   R   R   R  R  R  RR   R   R  R"  R  R   R   R   (    (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR     s   											t   DataFrameEditorc           B   sq   e  Z d  Z e e e  Z d	 d  Z d d  Z	 e
 e e  d    Z d   Z d   Z d   Z d   Z RS(
   s   
    Dialog for displaying and editing DataFrame and related objects.

    Signals
    -------
    sig_option_changed(str, object): Raised if an option is changed.
       Arguments are name of option and its new value.
    c         C   s6   t  j |  |  |  j t j  t |  _ d  |  _ d  S(   N(	   R   R>   t   setAttributeR   t   WA_DeleteOnCloseRR   t	   is_seriesR2   t   layout(   RY   R\   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR>     s    	R-   c         C   sS  t    |  _ |  j |  j  |  j t j d   | rU t |  d | j j } n t	 d  | j j } t
 | t  r t |  _ | j   } n t
 | t  r t |  } n  |  j |  |  j d d  t | d |  |  _ |  j j j |  j  t |  |  j  |  _ |  j j |  j  |  j |  j  |  j d d  |  j t j  t   } t  t	 d	   } | j |  | j! j |  j"  t  t	 d
   } | j |  | j! j |  j#  t$ t	 d   } | j% |  j j&  | j' |  j j&  | j( j |  j)  | j |  t$ t	 d   |  _* |  j* j% |  j j+  |  j* j' |  j o\|  j j&  |  j* j( j |  j j,  | j |  j*  | j-   t  t	 d   |  _. |  j. j/ t  |  j. j! j |  j0  | j |  j.  t  t	 d   |  _1 |  j1 j2 t  |  j1 j3 t  |  j1 j! j |  j4  | j |  j1  |  j j5 | d d  t S(   s   
        Setup DataFrameEditor:
        return False if data is not supported, True otherwise.
        Supported types for data are DataFrame, Series and DatetimeIndex.
        t   arredits    - %ss	   %s editoriX  i  R\   i  i,  t   Formatt   Resizes   Background colors   Column min/maxs   Save and Closet   Closei   i    (6   R   RL  t	   setLayoutt   setWindowIconR+  R%  R"   R   R   R   R   R   RN   RK  t   to_frameR   R   t   setWindowTitlet   resizeR=   t	   dataModelR   R   t   save_and_close_enableR   t	   dataTablet	   addWidgett   setMinimumSizet   setWindowFlagsR   t   WindowR   R   t   clickedt   change_formatt   resize_to_contentsR   t
   setCheckedRP   t
   setEnabledt   stateChangedt   change_bgcolor_enablet   bgcolor_globalRO   RQ   t
   addStretcht   btn_save_and_closet   setDisabledR!  t	   btn_closet   setAutoDefaultt
   setDefaultt   rejectt	   addLayout(   RY   R   t   titlet
   btn_layoutt   btnRn   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   setup_and_check  sd    		
c         C   s4   |  j  j t  |  j  j t  |  j  j t  d S(   sA   Handle the data change event to enable the save and close button.N(   Rf  Ra  RN   Ri  Rj  (   RY   t   top_leftt   bottom_right(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyRW  
  s    c         C   s4   |  j  j |  |  j j |  j o, | d k  d S(   sV   
        This is implementet so column min/max is only active when bgcolor is
        i    N(   RV  Rn   Rd  Ra  RK  (   RY   Rm   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyRc    s    c         C   s   t  j |  t d  t d  t j |  j j    \ } } | r t |  } y | d Wn6 t d  j |  } t	 j
 |  t d  |  d SX| j d  s t d  j |  } t	 j
 |  t d  |  d S|  j j |  |  j j d	 |  n  d S(
   s   
        Ask user for display format for floats and use it.

        This function also checks whether the format is valid and emits
        `sig_option_changed`.
        RN  s   Float formattingg?s   Format ({}) is incorrectR   Nt   %s!   Format ({}) should start with '%'t   dataframe_format(   R   t   getTextR   R   t   NormalRV  Rj   R   R[   R   R   t
   startswithRl   t   sig_option_changedR   (   RY   R[   t   validt   msg(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR^    s$    	c         C   s7   |  j  j   } |  j r/ | j d d  d f S| Sd S(   s1   Return modified Dataframe -- this is *not* a copyNi    (   RV  R   RK  R   (   RY   R@   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR~   2  s    	c         C   sQ   t  j t t j   |  j j   |  j j d t	  |  j j   t  j
   d  S(   NRC   (   R
   t   setOverrideCursorR	   R   t
   WaitCursorRX  t   resizeColumnsToContentsRV  R   RN   t   restoreOverrideCursor(   RY   (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR_  <  s
    N(   R   R   R   R   R   t   objectRx  R2   R>   Rp  R   R   RW  Rc  R^  R~   R_  (    (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyRH    s   
G			
R-   c         C   s^   t    } t d |  } | j |  d | rA | j   | j   Sd d l } | j d  d S(   s   Test subroutineR\   Rm  iNi   (   R'   RH  Rp  t   exec_R~   t   syst   exit(   R   Rm  R\   t   appt   dlgR  (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt	   test_editG  s    	

c          C   s|  d d l  m }  d d l m } m } t t d g d  d g d d	 g d
 d g d d g t j j	 d d  d g d d g d d g g d d d |  |  |  d d d g d |  d g } t
 |  } | | |  t t d g d |  d g d d } t
 | j d  } | | |  t t j j	 d d   } t
 |  } | | |  t t j d  d d } t
 |  } | | |  d S(!   s   DataFrame editor testi(   t   nan(   t   assert_frame_equalt   assert_series_equalR   i   y              ?R-  t   testt   stringg(\?R   R.  i   s   Unkown types   Large valueid   s   áéít   unicodeR7   t   at   bt   cs   Test global maxt   dRC   t   TypeR   i    i i
   Ny      ?      ?(   t   numpyR  t   pandas.util.testingR  R  R   RN   R   t   randomt   randR  R   R   t   arange(   R  R  R  t   df1t   outt   resultt   series(    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyR  T  s2    						$t   __main__(_   R   t   qtpyR    t   qtpy.compatR   R   t   qtpy.QtCoreR   R   R   R   R   t
   qtpy.QtGuiR   R	   t   qtpy.QtWidgetsR
   R   R   R   R   R   R   R   R   R   R   R   t   pandasR   R   R   t   pandas._libs.tslibR   t   ImportErrort   pandas.tslibR  R   t   spyder.config.baseR   t   spyder.config.fontsR   t   spyder.config.guiR   R   t   spyder.py3compatR   R   R    R!   R"   t   spyder.utilsR#   R+  t   spyder.utils.qthelpersR$   R%   R&   R'   t+   spyder.widgets.variableexplorer.arrayeditorR(   R   R.  t   int64t   int32Ra   R-  t	   complex64t
   complex128Rb   R/   R   RL   RW   RX   R   R   R   R   R   t	   lightGrayR{   R}   R   R   R1   R<   R=   R   R   RH  R2   R  R  R   (    (    (    sN   lib/python2.7/site-packages/spyder/widgets/variableexplorer/dataframeeditor.pyt   <module>   sZ   (R("		
	 (	"