B pG@sNdZddlZddlZddlZddlmZddlmZd\ZZ Z ddZ dd Z d d Z ee e e e e iZed e d e d iZee e dZede d e diZddZGdddZGdddZGdddZGdddeZGdddeZGdddeZdd Zd!d"Zd#d$Zd%d&ZddlZGd'd(d(Zd)d*Z d+d,Z!e"d-krJe!dS).z( SS1 -- a spreadsheet-like application. N)expat)escape)LEFTCENTERRIGHTcCs ||S)N)ljust)xnr 3/opt/alt/python37/lib64/python3.7/Tools/demo/ss1.pyrsrcCs ||S)N)center)rr r r r r sr cCs ||S)N)rjust)rr r r r r sr leftright)rr rwecCs&d}x|D]}|dk r ||7}q W|S)Nrr )seqZtotalrr r r sums   rc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-S).SheetcCsi|_t|j|jtd|_dS)N)cellcellsr)rdict cellvaluemulticellvaluerns)selfr r r __init__%s zSheet.__init__cCs*|||}t|dr"||jS|SdS)Nrecalc)getcellhasattrrr)rryrr r r r-s   zSheet.cellvaluecCsn||kr||}}||kr$||}}g}x@t||dD].}x(t||dD]}||||qLWq8W|S)N)rangeappendr)rx1y1x2y2rr rr r r r4s  zSheet.multicellvaluecCs|j||fS)N)rget)rrr r r r r?sz Sheet.getcellcCs4|dkr|dkstt|ts"t||j||f<dS)Nr)AssertionError isinstanceBaseCellr)rrr rr r r setcellBsz Sheet.setcellcCs*y|j||f=Wntk r$YnXdS)N)rKeyError)rrr r r r clearcellGszSheet.clearcellcCs&x |||||D] }|j|=qWdS)N) selectcellsr)rr$r%r&r'Zxyr r r clearcellsMszSheet.clearcellscCs|d|tj|dS)Nr)r0sysmaxsize)rr%r'r r r clearrowsQszSheet.clearrowscCs||d|tjdS)Nr)r0r1r2)rr$r&r r r clearcolumnsTszSheet.clearcolumnscs>krkr$fdd|jDS)NcsHg|]@\}}|kr krnq|kr8krnq||fqSr r ).0rr )r$r&r%r'r r \sz%Sheet.selectcells..)r)rr$r%r&r'r )r$r&r%r'r r/Ws   zSheet.selectcellsc Cs|dkr|dkrdS||kr&||}}||kr8||}}||dkrP||dksTti}x|jD]\}} |j|| f} t| dr| ||||||} ||kr|krnn(|| kr|krnn||7}| |7} | ||| f<q`W||_dS)Nrrenumber)r)rrr7) rr$r%r&r'dxdynewrr rr r r movecells_s"   0zSheet.movecellscCs(|dks t|d|tjtjd|dS)Nr)r)r;r1r2)rr r r r r insertrowsrs zSheet.insertrowsc CsF||kr||}}||||d|dtjtjd||ddS)Nrr!)r3r;r1r2)rr%r'r r r deleterowsvs  zSheet.deleterowscCs(|dks t||dtjtj|ddS)Nr)r)r;r1r2)rrr r r r insertcolumns|s zSheet.insertcolumnscCsF||kr||}}|||||ddtjtj||dddS)Nr!r)r0r;r1r2)rr$r&r r r deletecolumnss  zSheet.deletecolumnscCs8d}}x&|jD]\}}t||}t||}qW||fS)Nr)rmax)rmaxxmaxyrr r r r getsizes  z Sheet.getsizecCs*x$|jD]}t|dr |q WdS)Nreset)rvaluesrrD)rrr r r rDs z Sheet.resetcCs6|x(|jD]}t|dr||jqWdS)Nr)rDrrErrr)rrr r r rs z Sheet.recalccCsB|\}}|d|d}}dg|}i}xDtd|D]6}t|tf||df<\}} t||t|||<q8WxDtd|D]6} t| tf|d| f<\}} t|dt||d<q~Wx|jD]\\}} } |dks| dkrqt | dr| |j t | dr6| \}} t |ts t| tttfksTtnt| }t | trPt} nt} || f||| f<t||t|||<qWd} x0t|D]$}| r| d7} | d||7} qWxt|D]|} d} xVt|D]J}||| fpdtf\}} t| |||}| r| d7} | |7} qWt| | dkrt| qWdS) Nr!rrformat+-|)rCr" colnum2namerr@lenstrritemsrrrrFr*r)rrr( align2actionprint)rrArBwidthZheightZcolwidthZfullrtext alignmentr rsepliner r r displaysR        z Sheet.displaycCsjdg}xN|jD]@\\}}}t|dr2|}n dt|}|d|||fqW|dd|S)Nz xmlz%sz% %s z )rrNrrWrr#join)routrr rZcellxmlr r r rWs    z Sheet.xmlc CsH|}t|ddd(}|||r:|ds:|dWdQRXdS)Nrzutf-8)encodingrX)rWopenwriteendswith)rfilenamerRfr r r saves  z Sheet.savec Cs(t|d}t||WdQRXdS)Nrb)r\ SheetParser parsefile)rr_r`r r r loads z Sheet.loadN)__name__ __module__ __qualname__rrrrr,r.r0r3r4r/r;r<r=r>r?rCrDrrVrWrarer r r r r#s, 2 rc@seZdZddZddZddZddZd d Zd d Zd dZ e Z ddZ e Z ddZ ddZddZddZddZddZdS)rccCs ||_dS)N)sheet)rrir r r rszSheetParser.__init__cCs.t}|j|_|j|_|j|_||dS)N) rZ ParserCreate startelementZStartElementHandler endelementZEndElementHandlerdataZCharacterDataHandlerZ ParseFile)rr`parserr r r rds zSheetParser.parsefilecCs&t|d|d}|r||g|_dS)NZstart_)getattrtexts)rtagattrsmethodr r r rjszSheetParser.startelementcCs|j|dS)N)ror#)rrRr r r rlszSheetParser.datacCs(t|d|d}|r$|d|jdS)NZend_rG)rnrYro)rrprrr r r rkszSheetParser.endelementcCs$t|d|_t|d|_dS)Nrowcol)intr(r r)rrqr r r start_cellszSheetParser.start_cellcCs"|d|_t|d|_dS)NrFZalign)r(fmt xml2alignrS)rrqr r r start_values zSheetParser.start_valuec Cs2yt||_Wnttfk r,d|_YnXdS)N)ruvalue TypeError ValueError)rrRr r r end_intszSheetParser.end_intc Cs2yt||_Wnttfk r,d|_YnXdS)N)floatrzr{r|)rrRr r r end_double szSheetParser.end_doublec Cs2yt||_Wnttfk r,d|_YnXdS)N)complexrzr{r|)rrRr r r end_complexszSheetParser.end_complexcCs ||_dS)N)rz)rrRr r r end_stringszSheetParser.end_stringcCs`t|jtr|j|_nFt|jtr@t|j|jp0d|jp8t|_nt |j|jpNd|jpVt |_dS)Nz%s) r*rzr+rrM StringCellrwrSr NumericCellr)rrRr r r end_values   zSheetParser.end_valuecCst||jp d|jpt|_dS)Nz%s) FormulaCellrwrSrr)rrRr r r end_formula(szSheetParser.end_formulacCs|j|j|j|jdS)N)rir,rr r)rrRr r r end_cell-szSheetParser.end_cellN)rfrgrhrrdrjrlrkrvryZ start_formular}Zend_longrrrrrrr r r r rcs  rcc@seZdZdZdS)r+N)rfrgrhrr r r r r+0s r+c@sJeZdZdefddZddZddZdd Zd d Zd d Z ddZ dS)rz%scCs<t|tttfst|tttfks&t||_||_ ||_ dS)N) r*rur~rr)rrrrzrwrS)rrzrwrSr r r r>s zNumericCell.__init__cCs|jS)N)rz)rrr r r rEszNumericCell.recalccCs2y|j|j}Wnt|j}YnX||jfS)N)rwrzrMrS)rrRr r r rFHs zNumericCell.formatcCs.t|dt|jj}dt|j|j|fS)NZ_xml_z(%s)rntyperzrf align2xmlrSrw)rrrr r r rWOs zNumericCell.xmlcCs2d|jkrdkr$nn d|jSd|jSdS)Nilz %sz%s)rz)rr r r _xml_intVs zNumericCell._xml_intcCs d|jS)Nz%r)rz)rr r r _xml_float\szNumericCell._xml_floatcCs d|jS)Nz%r)rz)rr r r _xml_complex_szNumericCell._xml_complexN) rfrgrhrrrrFrWrrrr r r r r<src@s2eZdZdefddZddZddZdd Zd S) rz%scCs6t|tst|tttfks t||_||_||_dS)N) r*rMr)rrrrRrwrS)rrRrwrSr r r rds zStringCell.__init__cCs|jS)N)rR)rrr r r rkszStringCell.recalccCs |j|jfS)N)rRrS)rr r r rFnszStringCell.formatcCs d}|t|j|jt|jfS)Nz9%s)rrSrwrrR)rsr r r rWqs zStringCell.xmlN)rfrgrhrrrrFrWr r r r rbsrc@sBeZdZdefddZddZddZdd Zd d Zd d Z dS)rz%scCs<|tttfkst||_t|j|_||_||_| dS)N) rrrr)formula translate translatedrwrSrD)rrrwrSr r r rzs  zFormulaCell.__init__cCs d|_dS)N)rz)rr r r rDszFormulaCell.resetcCsZ|jdkrTyt|j||_Wn6td}t|drD|j|_n t||_YnX|jS)Nrrf)rzevalrr1exc_inforrfrM)rrexcr r r rs    zFormulaCell.recalccCs2y|j|j}Wnt|j}YnX||jfS)N)rwrzrMrS)rrRr r r rFs zFormulaCell.formatcCsdt|j|jt|jfS)Nz,%s)rrSrwrr)rr r r rWszFormulaCell.xmlcCsg}xtd|jD]}td|} | dk r| \} } t| } t| } || kr\|krnn*|| krt|krnnt| || |}||qWt d ||j |j S)Nz(\w+)z^([A-Z]+)([1-9][0-9]*)$rG) resplitrmatchgroups colname2numrucellnamer#rrYrwrS)rr$r%r&r'r8r9rZpartmZsxZsyrr r r r r7s  0zFormulaCell.renumberN) rfrgrhrrrDrrFrWr7r r r r rxs  rc Csg}xtd|D]t}td|}|dkr6||q|\}}}}t|}|dkrdd||f}nt|}d||||f}||qWd|S)zTranslate a formula containing fancy cell names to valid Python code. Examples: B4 -> cell(2, 4) B4:Z100 -> cells(2, 4, 26, 100) z(\w+(?::\w+)?)z2^([A-Z]+)([1-9][0-9]*)(?::([A-Z]+)([1-9][0-9]*))?$Nz cell(%s, %s)zcells(%s, %s, %s, %s)rG)rrrr#rrrY) rrZrrr$r%r&r'rr r r rs  rcCs|dks tt|t|S)zETranslate a cell coordinate to a fancy cell name (e.g. (1, 1)->'A1').r)r)rKrM)rr r r r rs rcCsT|}d}xB|D]:}d|kr*dks0nt|dt|tdd}qW|S)zCTranslate a column name to number (e.g. 'A'->1, 'Z'->26, 'AA'->27).rAZr!)upperr)ord)rr cr r r rs   rcCsD|dks td}x.|r>t|dd\}}t|td|}qW|S)z6Translate a column number to name (e.g. 1->'A', etc.).rrGr!rr)r)divmodchrr)r rrr r r rKs  rKc@seZdZdZd6ddZddZd d Zd d Zd dZddZ ddZ ddZ ddZ ddZ ddZddZeZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5S)7SheetGUIa7Beginnings of a GUI for a spreadsheet. TO DO: - clear multiple cells - Insert, clear, remove rows or columns - Show new contents while typing - Scroll bars - Grow grid when window is grown - Proper menus - Undo, redo - Cut, copy and paste - Formatting and alignment sheet1.xml cCsz||_t|_tj|r&|j||j\}}t||}t||}t |_ |j d|jt j |j ddd|_ t |j |_t j|j d|jd|_t |j |_|jjddd d |j jd d |jjd d |jjd ddd |jd|j|jd|j|jd|j|jd|j|jd|j|jd|j|||d|_d|_| dd|!dS)zlConstructor. Load the sheet from the filename argument. Set up the Tk widget tree. zSpreadsheet: %sZA1)Z helveticaZbold)rRZfontZSave)rRZcommandZbottomr!Zboth)sideexpandZfillr)rrrzzzz zzN)"r_rriospathisfilererCr@TkrootZwm_titleLabelbeaconZEntryentryZButtonraZ savebuttonZFramecellgridZpackbind return_eventshift_return_event tab_eventshift_tab_event delete_event escape_eventmakegrid currentxycornerxy setcurrentsync)rr_rowscolumnsrArBr r r rs<           zSheetGUI.__init__cCsT|j|jkr,|jdk r,|jj|j|jn|jj|j||jdddS)Nrendbreak)rrrir0r.rrdelete)reventr r r rs zSheetGUI.delete_eventcCs|j\}}|||dS)N)r load_entry)rrrr r r r r!s zSheetGUI.escape_eventcCsl|j||}|dkrd}n"t|tr2d|j}n |\}}|jdd|jd||j dddS)NrG=rr) rirr*rrrFrrinsertZselection_range)rrr rrRrSr r r r%s   zSheetGUI.load_entrycCs||_||_i|_tj|jdd}|jdddd|d|jxt d|dD]}|jj |dd tj|jt |dd }|j|dd d||j|df<||_ d|_ |d|j|d |j|d |j|d|jqPWxt d|dD]|}tj|jt|dd }|jd|d d||jd|f<d|_ ||_ |d|j|d |j|d |j|d|jqWxt d|dD]}xt d|dD]|}tj|jdddd}|j||dd||j||f<||_ ||_ |d|j|d |j|d |j|d|jqWqWdS)zHelper to create the grid of GUI cells. The edge (x==0 or y==0) is filled with labels; the rest is real cells. Zraised)reliefrZNSWE)columnrsZstickyzr!@)Zminsize)rRrZWEz zzZsunkenwhiteZblack)rbgZfgN)rr gridcellsrrrZgrid_configurer selectallr"Zgrid_columnconfigurerK _SheetGUI__x _SheetGUI__y selectcolumn extendcolumnrM selectrow extendrowpressmotionrelease)rrrrrr r r r r1sN  zSheetGUI.makegridcCs |dd|tjtjdS)Nr!)r setcornerr1r2)rrr r r rcs zSheetGUI.selectallcCs,||\}}||d||tjdS)Nr!)whichxyrrr1r2)rrrr r r r rgs zSheetGUI.selectcolumncCs:||\}}|dkr6||jdd||tjdS)Nrr!)rrrrr1r2)rrrr r r r rlszSheetGUI.extendcolumncCs,||\}}|d||tj|dS)Nr!)rrrr1r2)rrrr r r r rrs zSheetGUI.selectrowcCs:||\}}|dkr6|d|jd|tj|dS)Nrr!)rrrrr1r2)rrrr r r r rwszSheetGUI.extendrowcCs.||\}}|dkr*|dkr*|||dS)Nr)rr)rrrr r r r r}szSheetGUI.presscCs.||\}}|dkr*|dkr*|||dS)Nr)rr)rrrr r r r rszSheetGUI.motioncCsL|j|j|j}|dk rHt|tjrHy |j|jfSt k rFYnXdS)N)rr) rZwinfo_containingZx_rootZy_rootr*rrrrAttributeError)rrrr r r rs zSheetGUI.whichxycCs|j|jdS)N)rirar_)rr r r rasz SheetGUI.savecCsr|jdk r||t|||jd<||||j||f|_d|_|j |j}|dk rnd|d<dS)zMake (x, y) the current cell.NrRyellowr) r change_cell clearfocusrrrrZ focus_setrrr()rrr gridcellr r r rs    zSheetGUI.setcurrentc Cs|jdks|j||fkr(|||dS|||f|_|j\}}|jpN|j\}}||krf||}}||krx||}}xR|jD]D\\}}}||kr|krnq||kr|krnqd|d<qW|j|j}|dk rd|d<|||||dS)NZ lightBluerr)rrrrrrNr( setbeacon) rrr r$r%r&r'rrr r r rs$     0 zSheetGUI.setcornercCs||krdkr8nn ||kr.tjkr8nnd}n||fdtjfkrj||kr\d|}qd||f}n^||fdtjfkr||krdt|}qdt|t|f}n t|j}t|j}d||f}||jd<dS)Nr!:z%dz%d:%dz%sz%s:%srR)r1r2rKrrrr)rr$r%r&r'nameZname1Zname2r r r rs2    zSheetGUI.setbeaconcCs|jdk r|j\}}|jp|j\}}||kr6||}}||krH||}}xR|jD]D\\}}}||krt|krTnqT||kr|krTnqTd|d<qTWdS)Nrr)rrrrN)rr$r%r&r'rr rr r r rs    0zSheetGUI.clearfocuscCs&||j\}}|||ddS)zCallback for the Return key.r!r)rrr)rrrr r r r rs zSheetGUI.return_eventcCs,||j\}}||td|ddS)z0Callback for the Return key with Shift modifier.r!r)rrrr@)rrrr r r r rs zSheetGUI.shift_return_eventcCs&||j\}}||d|dS)zCallback for the Tab key.r!r)rrr)rrrr r r r rs zSheetGUI.tab_eventcCs,||j\}}|td|d|dS)z-Callback for the Tab key with Shift modifier.r!r)rrrr@)rrrr r r r rs zSheetGUI.shift_tab_eventc Cs|j\}}|j}d}|dr4t|dd}nFxDtttfD]6}y ||}Wntt fk rjw@Yq@Xt |}Pq@W|dkr|rt |}|dkr|j ||n|j ||||dS)z+Set the current cell from the entry widget.Nrr!)rrr( startswithrrur~rr{r|rrrir.r,r)rrr rRrclsrzr r r rs$     zSheetGUI.change_cellcCs|jx|jD]x\\}}}|dks|dkr4q|j||}|dkrTd|d<qt|drl|\}}nt|t}}||d<t ||d<qWdS)z(Fill the GUI cells from the sheet cells.rNrGrRrFZanchor) rirrrNrrrFrMr align2anchor)rrr rrrRrSr r r r s   z SheetGUI.syncN)rrr)rfrgrh__doc__rrrrrrrrrrrrrrrarrrrrrrrrrr r r r rs4 -  2  rcCst}xtddD]r}xltddD]^}|dkr8t|}n:|dkrJt|}n(t|d}td|}d||f}t|}||||q"WqW||ddS)zBasic non-gui self-test.r! z%s*%sz sheet1.xmlN)rr"rrrr,rVra)arr rZc1Zc2rr r r test_basics     rcCs4tjddrtjd}nd}t|}|jdS)z GUI test.r!Nz sheet1.xml)r1argvrrZmainloop)r_gr r r test_gui2s  r__main__)#rrrr1Z xml.parsersrZxml.sax.saxutilsrrrrrr r rOrrxrrrrcr+rrrrrrrKZtkinterrrrrrfr r r r sB    ?O &3  D