From 5ef1e5c30dfc61645804aaff3abbd9060179d95c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 26 May 2017 11:16:31 +0300 Subject: [PATCH] [PE] Added spell check + changing document language. Moved LanguageDialog to Common. --- apps/common/main/lib/view/LanguageDialog.js | 143 ++++++++++++++++++ .../main/resources/img/controls/flags.png | Bin 0 -> 4660 bytes .../main/resources/img/controls/flags@2x.png | Bin 0 -> 11129 bytes .../main/resources/less/asc-mixins.less | 16 ++ .../main/resources/less/language-dialog.less | 67 ++++++++ .../main/app/controller/Statusbar.js | 8 +- .../main/app/template/StatusBar.template | 2 +- .../documenteditor/main/app/view/Statusbar.js | 101 +------------ apps/documenteditor/main/locale/en.json | 9 +- .../main/resources/less/app.less | 1 + .../main/resources/less/statusbar.less | 80 +--------- .../main/app/controller/LeftMenu.js | 3 + .../main/app/controller/Main.js | 35 +++++ .../main/app/controller/Statusbar.js | 67 +++++++- .../main/app/template/StatusBar.template | 10 ++ .../main/app/view/FileMenuPanels.js | 17 ++- .../main/app/view/Statusbar.js | 117 +++++++++++++- apps/presentationeditor/main/locale/en.json | 8 + .../main/resources/less/app.less | 1 + .../main/resources/less/statusbar.less | 54 ++++++- 20 files changed, 547 insertions(+), 192 deletions(-) create mode 100644 apps/common/main/lib/view/LanguageDialog.js create mode 100644 apps/common/main/resources/img/controls/flags.png create mode 100644 apps/common/main/resources/img/controls/flags@2x.png create mode 100644 apps/common/main/resources/less/language-dialog.less diff --git a/apps/common/main/lib/view/LanguageDialog.js b/apps/common/main/lib/view/LanguageDialog.js new file mode 100644 index 000000000..613f90ede --- /dev/null +++ b/apps/common/main/lib/view/LanguageDialog.js @@ -0,0 +1,143 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, + * EU, LV-1021. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +/** + * LanguageDialog.js + * + * Created by Julia Radzhabova on 04/25/2017 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + +if (Common === undefined) + var Common = {}; + +define([ + 'common/main/lib/component/Window' +], function () { 'use strict'; + + Common.Views.LanguageDialog = Common.UI.Window.extend(_.extend({ + + options: { + header: false, + width: 350, + cls: 'modal-dlg' + }, + + template: '
' + + '
' + + '' + + '
' + + '
' + + '
' + + '
' + + '', + + initialize : function(options) { + _.extend(this.options, options || {}, { + label: this.labelSelect, + btns: {ok: this.btnOk, cancel: this.btnCancel} + }); + this.options.tpl = _.template(this.template)(this.options); + + Common.UI.Window.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.UI.Window.prototype.render.call(this); + + var $window = this.getChild(); + $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); + + this.cmbLanguage = new Common.UI.ComboBox({ + el: $window.find('#id-document-language'), + cls: 'input-group-nr', + menuStyle: 'min-width: 318px; max-height: 300px;', + editable: false, + template: _.template([ + '', + '', + '', + '', + '', + '' + ].join('')), + data: this.options.languages + }); + + if (this.cmbLanguage.scroller) this.cmbLanguage.scroller.update({alwaysVisibleY: true}); + this.cmbLanguage.on('selected', _.bind(this.onLangSelect, this)); + this.cmbLanguage.setValue(Common.util.LanguageInfo.getLocalLanguageName(this.options.current)[0]); + this.onLangSelect(this.cmbLanguage, this.cmbLanguage.getSelectedRecord()); + }, + + close: function(suppressevent) { + var $window = this.getChild(); + if (!$window.find('.combobox.open').length) { + Common.UI.Window.prototype.close.call(this, arguments); + } + }, + + onBtnClick: function(event) { + if (this.options.handler) { + this.options.handler.call(this, event.currentTarget.attributes['result'].value, this.cmbLanguage.getValue()); + } + + this.close(); + }, + + onLangSelect: function(cmb, rec, e) { + var icon = cmb.$el.find('.input-lang-icon'), + plang = icon.attr('lang'); + + if (plang) icon.removeClass(plang); + icon.addClass(rec.value).attr('lang',rec.value); + }, + + labelSelect : 'Select document language', + btnCancel : 'Cancel', + btnOk : 'Ok' + }, Common.Views.LanguageDialog || {})) +}); \ No newline at end of file diff --git a/apps/common/main/resources/img/controls/flags.png b/apps/common/main/resources/img/controls/flags.png new file mode 100644 index 0000000000000000000000000000000000000000..f446f06397fdaaecd6053dbf26e752a9f47a2ef0 GIT binary patch literal 4660 zcmV-463gw0P)9wM~5h*0%?G;2J|lhbeak(A|m1i(}aqF(n^(|tecv)jhY3(a~Eh# zsRZof1YofGWbzt-i1ZyqgfKzM2qw~Oer z`}s@iiU8t^kU-)rZ!$m<2N1qWFaQCGUnSUh z^ypDt2iB=&{5viIMM{!d%1>!bS^lC30NOwQ{F5j@km&wIsQ!7FWy4YdF!*=x-XT0Z z90LXnfFbkn@W8%(`>YRu_V(>tI6FJz=B-#1ydLx6x%vp!S-`F8o$|rZqi=$F5JosZK-p0Na|BA>2e*&25A3uc@yLayi z*0&#m<5EtXPFV_GHqFsAZGEh%;f&ZTSD`X4ZVP;@V!G)28Nk(;XXw#m5_zK3n*o8} zjBCIe08GD1=&5HALNd!$LPYfg>kH`{TW4MA{Q%AAWlpOp03CO9{7hYTbinSzH7Mrw z_E7-7Ejd~(y&q%hKglfw(0gY)oCxAR zS;sc(1{k-uDV~Lwh3}Bw@=g-)i6)Qe$u{<}PJsCb>LWIyG^Y$YbeM(FzwXA_b9eFV z*&8%zv52F=Huk{+xv$v(M6bgNzycKjgH=EMu|5az{PBJ32B5qROrf>wPh*moGuzmQ zeXS8dS;Vd61^W{hE*CJxJnPuTKGqGOY@?@D+vsWaHkuRw)CbufOCMzXkASS>Dv_8< z+vGR3)IqcSMG2n+qW%mbWA{ah)YFD#qcSVN^U2eZy6a-KO!7|#NRcNTsS3qv5`C2b zey-66<2Ib66abR~5Pnm@TmY_h+>oX7JSBMMlNLbXj?=Mh#Uc2wKaQ+&@OeAUPFesO zL|@T0ApXMB_8bLpJ+HkM(f7XrkPILq1|cBvtHhSHxgnyI4W|fc^w%YYL;zgPSWuG` zfHYlpYLWsl_ZtT-`i}xcXD@=Mvlb%u>UBIGKNYvCG)!6mPiHQ``zKFvqiprKx=e-e zBw!Z7k_N#0hmY`d&f@s;v&E}Gd%k+3MF2!^!(Rlr)4U6wui1qAeLeL8B=(!X`lrz2 zC(0C3%OU`lTg1`wBKDtxn@$aq5P*JJ93UA$L<~Ye;#Uc=0K_kIf|p6r*YCxz(*oCd z%LCkPSQ0l&7S{%lHZ2rmK2ZRkPAiLt!%J%eNReq+@U26=05SbaF>v`*{|RqS zR$!iWrU9f&7bhDVD8{@}Z*c%+>cmD>1m0HyMTpx~N|**<+$;~Enm!7E^7NAy!0W?t zQ->hWmzHClWu}nmHfYG7Q$}B2a1mP^K)=MdQ7Z?~Bo%;wtl%mk_`=Z-jqLTx)GrA` zQ)d&BB>Ku1gH6%3qOMH-nwCMlNtZ{HbODk9(sr+iKjt{XcfKR;_>@JoTS*+ZD`;5& z(Klz+0E4GGz<+^b+z1pbfOEBrAljv*W&gU3=xdW|0I%r|V5%5{yx~>avH<2BfzdPL z01g~D9S?BFubhPe%(w>J0vzzu&`O^KdCjv_(g8@7xUgO~c$%N{2rSN75}R_^Vqr@+ocS{ft=r52O}VksSaCnu-zw{PDrR=s-lDNI>rz1%*F{nP+$+j-+?$R&&@-VPh(z?S7Hja_~V zKLcPL+t|m;zAfm}w!IIe$kpY5Gu1VTzDgi+kgg*~j%?StbLZX+R(|^Kj*gBi<(;FoJb3V+ptG~{ZvgT!_;&5uO=Ze5>)GD2Wy=K?1K6@<3)(pp zL-krU(6fFS1O^6}3?TpZ)6cD1wQ?LZXpl35ZqcHJs|>Y5PTg5{b#?8>cJ{N}6cSj( z+qP{h*Rf;ASq!#&_wN38@7}d_c6OdBr*a5A`v*~UKM z5m)I0`kHMU1@Hrdl!Kl#eE4vWu3fv1?9->uOgSCl<>lqhdbYEl8lX*EZyXQ5f)OP? zZlgPWKi@`Kr);C_8yR{T^fep6hv3qMhK5%0^zf7cO0bQ6R?S@c@hTx~ zUh^QL)oJr$d%6OeL|@6ZfD@{g8-tNv%Spr(taB^ifK0Z|Us7BkGlDdUzRS|u;CKc* zO`@+fp=up$Xxb6MhputH;b`wZ*x0xo0{z30z2xXmL{pco0l?@%q6tCr?uVwn)WrRVx3fD)+;Su(K5NtkWy{3IlMy``g#U>=}O& zfGHYRU&cCfw&pEWC-njpznLECawG7>uc+eG%Zs zJ>2Xz78j*jxHD`9fpE3Dt3CkXk5v=^O)@lvqHDS{Xo`8I-tqvngaUjuz6HM8&_|Q# z`>&1w%_;#zl;{AW#vnv=`t)f;M@MTCeT9FIOiFAM9m1SFe383vV7&I_%ZQ5+DNNF_ z{V8x#k`SdeK=1)&=_Y4B+f&rUqcEPPM^ie%DG)SY` zQ^1>8yb3yqD7&;@)MlGhm{>M{Y|VhWNDAT20IV>I`)!5T0&~O-qpI6*81n__WFaYsIMTUkm2nI-DYnfcA=~o5P`no9Q zTnLKU%Xw*iZPf60!j`hR@G?zW_WuNccKgL!blmV^G=KY}%Q7Na?ZzMcfXd^2ku+ciD+07w=dtz-{QUEhnO2U)uw9YYl?rxsjuS z-diu=(VKUcn?h7gUrwPqpHHE6bvT9CM?HlIa0hzq#rZHC$SqN*G<;nA+Q>aM9P2K| zr~&i`fB0||Qs*9TR4KE%D*#_!#C6ieE#d{AE@DF?@F?aUHcs}TaP-`HIIO)yfOz%V zc?Ac8LSnd$Y6@Nr5VwtXirYpj#BHOx0Nh3+xQ)*Eu#HZM+eZ2Sa5A*dzmyddUw(;S z_Q?=qlruw?>pXmRkS$ua?@h|=!(fuKc?cb3^bHRWzr<73)Dw91;bZrelUw2`p4gUb z%6(jm=zH*oY&iB~c1@zMFo5X$`+I)KihC(?YZ84I1?@l4SM|O1O1B?<4FVi; zY=S==JEKQy7aXY4%whm@^V%WEwlvOkE`TG2OH=r&`Sg!!HciR1O)dHw{$OkBq9gDv z+ycK-K)_^R>J(t{e2b1i)UWc%+%qqty|d{8P{siysV^ky_s`U=k~c8!7hvqq=;`3C zw-0^ujopkQ%cC@jz6|2grc}5+H6xzvN@+fTtT`rOVCkW7k(E7HfJFhW`)9%5qqF1Y zv`i*Xp`gO06o3JcBo9rZZ+@R0C>U@=ljtkFjV5(VwxuP?VngW)nnYiXU-I!|#)tAv z_M~+308doVt2D!2m&(s$l#0me@7AGPX}_gdt5Y?1C5Wo`}hs3$dq883)MHXe@GeU5>nU1F$XlA~qj6&phkCDEg)>*9EDo4@EV{ zKG^PB0THWe;TQ*;BC`zg{7 zFxq_%9v3eK?A!{R48zMxP6+5U#x#JOJysw?^M%ORVj=Sh9)U>g}83^}yc1Hxg!#T3{R?l3!(J%A`s3jRzP$3D=_UAY{l;+`D=U z%LA7s7{I>65_nhfK$Tp*;E>A&1IqSA3)dBv1yB~@&CRQ@t%)rzhMvR$_j5f1DnG5t4()AH1Cc3cBNQn93Zh@7GV(Yv*k1tq~!rb-}ed5 zmKUdT%MP@uTGl!LoVad!&E-QAty?!~?MTKC`H9#b(LaIXgq8?O!8C>~0UDU^>%Y-TL0ti*P#ac=K|8Z&CDS zw#1%JGg@$ydGMg`D!G2to;}Q0`&rg1J`?IGI^PElRmsGp0GnwdMd@eVN;6BsjfsUA zjF()o)57`msC-Y{pyRInM>Wx`)^IrV=AkcaFhCKhZ{a;5O8x_%LV-MhO)qu_1g3pO zDl93kjt4#gQh^0?AmL|#EwFd!ZgL6*&)+|i@wyQ2{K%XF8 zzX@hvbvsCoNw-Z)p2$N$cnHG8j*)O(qlyRr#gP6_jC{yr$Osq!D~1s5fG*++)Q6-6 z025kZ$Vl})eL^KjnS+ko>BAN>Lj0RH;xJCJDoPiZuYybw|1F9kATA?MMTIL!9y1Q2 zQj02DK02JvXN_&*(uNXt+>KjP{0&TfrVydnS~f2Q9g@D3qC-TUE{7jr@i6@Hge^0{ z&e>Asd$P#aI6rV6l|9h0FLE{E5HW$;fCP4oFHS;DF*=TMYuu_W?;v| znj$P2F2ov6%9kkwBn8(+9(n+T83XZHA!IB7nab5hZ-gZ-LjalV7Am$4xA*_VFfsp2 zf`C2&uw6hPxB%Yg|INt(j&-MFA%*OUc`PBkeN(39^GlJFeiN6YNgxUH{R-Y9@F0n! zukR#5rHyr3dI1Yi?KaaN0JiIG(q^^z*}Im?jivxI6gui^tK08U^f?=RNCYs4ikB&qincUedV@6QbVo$&Fc}V^%4M7k7W`^2UJG7)ZC8%kf#N<%5CP2l9xp0hEup z0RM8QEfC@KIHQCT^81EE?WR8WziL%9;0t!h`Hu{#3dFjCAdipq`Rg$Q`{iOd;b^|y=DFMXrAlkn zS+HH?=6)_{do0i8DrF_L?$gX!fdcKwK94u}YQH(s5U~*)PrM6%{o(pX&qACeVRn>9|FT+IH%( zQ_BRKTU1j`XqU+0<;|O#bFp*Jxf~m37}h#r#*%P*l^G#sTPWrS>oVw-Yfu+vTiq=M zeaLz<9#mYK^BAg38gcjr+S|WRJm%e2Z&Z8Ka99gCi^@B)i?|DG|HArlNP)4?Ej zKzORb?(i}f)1Gl{Njdt*<38?3Wykm;#bDl&2u`uYhGFO~fPh}RrTn7+pR#JCcl|ZT zZNBosk>5WaC>x{vI4b~8`1r!p+1bFO^NPPq#9Q zT-EW<-#IBMzK2`A=8u!UBr{poU#C>-Nel;7cOu`+_6Jpph-X11Of(>~Pq0-7yxT z{e~iY*wf?#Y7+p(niJ@8dzI!9YXU9@mbIn_I77vu7AMu#3Aqr!%<5el%Fvx9DWS=K zQQ_P#1ZET(QM%2%JSouqU9ZMn-f$rC$Ahd(H<_+*AS~Pxvh)_~EhQ2AoGeSUa3XvL zs*&{?%4K@kuw`W#Swmu$Ee`(8TTN1}?mUL@-i<0QN)50jg5XgcwnR=O=K~fM?@9ac zAdBJL+2#z!mnE>OZ%^H-fA~?~2Nkn{g4x}b!5H?K@1 z1AlWJ$Yy8%f$?E;1mjoh8!=B^kEP;47rFeeluGtcoyqZOw+^Qp86(|NlBuonorE7- zeYwePoUD``v5%GZlmACp`f!`WeMdJ&vq9{3S~}jMuJ?4`-|2knKScp34QSqR#lJgO zjj z4sDLUVEr)<5#Pz@N||3bP(_r7~{Zgp?%Y@Yzk0 zf+P5lI3R~59ag2n&c8%QSc5>fnOM*v#yjyd00yMuyn*+5#HRWz>wqu1k?!p{b^8m( z1m0&9{QooX|D{_hMETf{N52aLeKNvK{=THC6j)vy2Nfa$hrSk0GI79#Qi44_Ca~XO zluUl`f64p3D5TtAzcA#*|L|xU3;Ui5@qHW=2Y^Uu`*ujGv3xddTppKQF<(95%=}mo zSxZ(iGWZibAkmn4O^QZbtabjQywZ8L6ZSuH3i0u!jLYk7v|4yt{Rtc$b>};;HDZG= zsDM6?ICR&!Jzu#D=@c}~Vp;}K6>MPmw;2rz88c1tmzLzh3#7dT$K)y`rO8VDVymTa zHlP<&(g8!!uiv)q2p|8V?(YrQ29m*JT?b6O92Ob4JUX3Gj3FR*=>Y@@pOUj%h|}W% z_j|TETGIXuB^EJ!$Sz#9%_W*~Dx&DNNF)fa183S7zCVNetAo-sdSzS)8*Hp7*UtZu zu>W-+nTox?oU|{Kcmvp^Gllx8pFQCOo$P7;%hGQ%w*TY|PuQ_Qz7(hH)DCeNstd4v z#3?ugQ=5Vefli$W3;`A-bb4G!sR%in3k!qz;R-QO{l@$ixGzxX-ByZ#^pel!U ze5KAdLkxznfy3_;(BO=AOj2<;La*uNpfp@#rvs3=>=Ega3Hnjd=4cD$d(b%fEM`8a(m%Ftfq; zLicf1P6@+|SC4`V{0UL`r?lClq{Hh}^AA_@L-$H|xb??EJiTM}J|-aESIzGp3Xi>4 zZu&dJ%rnj_DzW=R$n%YJw$MwfbT>A#@EaN#;C=&V551{w0yDClE7w!9(R__ezJ-M; z&;RYNu-NNag&DAB>MDIVk;EYQjY9>G);9PY>DjPAstorsciTsXI->uOOvyK*au za%8sqbdUa9E1PqRiLK|SeC+NAC7m&63Sapj=${dR8|jFd#9~=|OP(SkBMXA|`50#3 z>}=*gBa(yHR2vV-kpCCSKbXXe3LYIdn8!11enGY7bj9>*>DR(r;*@~h7<4}nan9o$5suv zfH`r(I&pudMLAtkpFF$Y;2eK+Tx-^BB_jN?lB_%h>?rj*WJ64z&N?PE(~^LeUA6Bq6y;@X&5~s6gCfz(H>&1C7(ifyT z@oac$eI&rB_}RPP&leiI&|WrGeB{L{{D)edrjq&`24Ek>pO}mKS3+}y@yiNKvg3E7 zQ6(Xl<0!Joxx+)vzYCVIQ5Tm1`Ru*Qy1E(f73AaCk}XP*9wPbtsSuiB0EMQ+px4;e z7g|FTHTNjnraO}6(V_h<0g>e*yQpiA*ovg1%PxJb0_hmbE7Hovo4r*#@1J}X)$ZVr zhpOeIEmt5vt=ff#s5kjBEe6_9-2@3vH_|(rBIMO3y-OJ%Fg3cr`q;FAujt84R2G=1 z(oi!J&V~du9Lvy&5znn*DO#c~FZW>ly>W#G9Qb4#{McFCg^ZvLn(RY5%DB^(ALo=q zsEdKQEm+Qv8h9}2RZ)UdxR1`nUB5U<@lXKNr`3k|>W`j-$r^5Pg}PMR&1@}{pGG)n zw$KxEqm}RRmUEb_yFOU=G*AMf<7q4fgE9H=MtQQ0NvcD|l%gT!z!a>F5xBt+t3h0- z61>R8#>8~=4`hQPW5o_3wMMmxrL!x_`(y0lER>_^wkPODaqwL{OY<~`c{%j1D#){{ zf&+n;wiIY`AWMLT_{w7!24xrL*M6Iw3N$-cI@q>THvf%g5s?R?Ugt#Yvg7=|SG88$ zxQ467q67onDr33C#WXa9Fs=5whC>N||ERpdYp0S8MLM(YHXG-1Cb!)A1~46^20zYo zB6mTFmsiJEui@76oKxO9K_#cgT4u&@lCCUc4+^~7K5IU2^aQe-Q+DX?t?z>c}*wFQ)s-hgJpzKUg>Kr56X z@fu0He{5&5qGu}b=?Vee-#`tp((#qXJF@4zaqwbblDdW=M{6NT-Y7xGPE&=)WF@5} zofzckQN|=cbXk=1AU`z0U*^5|rhPd)=xk=JtxZJ4Xh`;7?t-+y*~PPn63#y@YcjKXflzuKEFB_&(090AOzlquEapqTy^*O;6=R{?U%EYrAlpo- z^M`g9y~43R=wP(l$X9${2~Q#JtTq#jVuRDccnxpKNBw(-O2;vpR1rF+1vj(majApx zlVzjuH$zkrr=Xv$op=|lwO)%eZo@R(BPP)1``I?B(3+d5%=)vno6%=mhUH)Lt@sCA z!SdPF8<9Gj*W36a|L6|V9ZK@oBLkRj&4?av)PbH@~hrY z;M5pQ;-N%!;vq(H{J-x=e1|yQ-}pJdvHsZwbKzXiG&r`OcbRhBv88(7gDb)KbK;^p z6=3`um#xH~Bts?1X?jFN((&)zlZ1eJr>CA^{G-9ZxVe?mw zG;2JM;;1stS%``p=sE>cL$360NJc1~-LDi$IAiO2FdyZIe-|<;Vnb~$Cx_IqB)n*k zv=ufiD7z|;Yj=8_)MGFDe@)CsYh6$-D1N<`D*Eu9fkJH^WH=!B?hK=gFOzcJ0X@fm zSgN^wivF;728h(&;(hHU3mhS-InK>G9-{V8U_7-P8W?qL(Ww)B+MK{J(barZ_99^p z{|-j}MLiGz#?#0}41)cWAIpn^u-y4XkO*v=r#C?7qOyC884Z;>i5tJK&RaoL_rm^S z=wNpaKn@RA)F@ZOTwyjDI`eo5U&j9C!Ra1hd7%KG>TffV;}>Nx{O7&mw^SKkjpjRO zabn)@v~e-Km54r{A#leCC zfI}mp(n5HzMS~FXioPqS(Rl`oAc+*_?c&4rpZ_6?p9b^^pNQK(%&3P?ae)nifk3jj zcTXe*1FRy6APeW=K~DOBHW1`XHv(Ib8>MuST&X}eLe2knNpghGsoxeRw1m~F+uyu& zQWgqMKIojB+5RGISPb{UX>G-7)e#l0!ui6B5*Y#S3fy&n$$HCZKYMuU7lyvyMDU1aFkL=xyVY$3>f$M0 zE3MBQplUsJ!Z!yF0cTBiu6fWube!Rk(7`t@AThfkE;!=n$nIMi=58~qQ#=rO|5wz! zbwCvP|X1p)W*~oZUyhrlR!q+k}d?-nsmn?vJW*FfAXJ@?Ta?gtmAVp?;~b@k!b$k))r)K?7!4oj(Ygj> zzSvePw`KA5KGN3<`RjmNoX9n_neoha%@#Pl-7)*urUSxO>(Yi$%EMkR1YJP?e3qQQ zT1drFA5N5rxFd)N^L9sZqBJixQ~yLd*ms=f4{Wd!HGiUkHbbu&ujuG3?!cVmfB}a_ zJqS0&s|t}fsTWe=qI`BJRb;MA`*2`cXpGq-UP!B}Hc`5=dNLEf*l4GW3(Ov+A9Y$l zzt{{GbYWumCg|xTemTa96`_-68A-Yd+No=`)Q;?u^Ot?7#cFmysXkZHLYQf~94MrB zCAl~|W3sKY=?UWZ)E!Arig?pr(ug*tDzLCwe|2KI?SOgV{1Y8am|S$YFy*$D3vGrW zgGMJRm5?^0!SIuetbNlZb|a=USQ~d_VqUqq-kAEXI4nikpMX(cB7dAgg&mTDJL%!W z8k%x2>F)F3UqdQ2Hi~<-7*edD%mTTKIPh^n|Dj2Nd;bv+OMgB^2gf(M_jQfNgeGmbO^~>yu}crr*A5 zR*VcA42ja zg_I9uQ0$Qw4f1eH+4l@v<{Uv#wtVyZR}I(j?-mmiVNoJX%sl0c&AaHrtMcXBa>j3^ z-$oYm8zmx4v)CRmduU8sMV2N6Bp*2hf3;l1n#4cfOZ41t+D*@LX^2Oj1mnHH8OwO} zv42K^mYF>7FD=oLA{HRv3Ueu=#uv`Tm`6vIX$v^r<9vzcl>4g_bbc;`g4gvPZ5kZLlt-7Ige1T zM?DQhAAAnYTI)?bN!KAKN^0UHMwjG`^R+?xmwfC$yJQ(4cyV05_mk9nv?Bh-epFY5?N`92+ug7)6Ycd1N zqLR|w9OVf~gDX`j<_M#z zvvv?2rDuLp8UfO}_#T``OqSA>TtvS8N>4-oW(fHU z2P|@M=I*yiT#@utQeI^}t*}nz!FKN<4yOXncXi8$M9VRb7qDLrCKla8m>48>#o6TC-ZHFM>8_ky1E2~|nYg-@sivaB`)_GY73-6B;(n&% z%R9boW5VU#nI!7eLSAK~q@pNaf_6ewACqIWtK^Zf`Mr4`ONeRqSs81IQ6 z$6-~aT~oe;q6!SN+5M4cvreWD5J+lAnOt!{cj5A^F97m zM)QJ95vk5tzVr_J0xbbVqVnEA+4Ww$PsXl~+p8s}K_tb1GJDTs1{p=T^EV5OSLNWo zOy49-&gJc?)@E+kt)UUy>lzHJlBiT#vFn$cGD0S-9BTS%U%J=Cu8@LsXa7g=eSA>_ z-#$a7irb9P?#nfH5Zt-Mm}7s>3+lP=2Z%B35qBdy*xk%zvO_sBd+ACAs+bDj{{&PD z51C7@B~Q7jE>zv9Z{nUbuAGgks;FSH@d5_AQF@Q5Ow_ltM zCHw|{q(bAe!RsTD!%c}N%>~%!Dg<1d`ND1Ci0z>Eyu6H4LiTH-n!y?^vsdZS@b6C}uop2y*T#zxz@I9LNpzLH$3q(; z2rT1Y`U8KhL|b%80yJ_Cw05Ppq1(rwDyu2CDw~m%y5a-+BlG7sBw2p4e5o>46MP`} zNNX_vVQ4{-{j+9uBa>M0yrOWw4~pq79`nbkV6;+Z12t0}k0|^kTuw9J>zOt#_GfxP zb$S|`&?JP8^h;+cN(rwse4aYl5u-JFxxiZ{mv>s1#d?k>37UASgDk6tPCbiA1-(AA- zwsvhwhV>fOc0|}BF?mNu=DbhuSAk6J3CExgdr{Gv>bA!$PpLnr7Ny?or5X zT$nP#fjK+A*AZ7^qxqv>i-`3uEOFyy#;wdn~pR3x7Rmn641t7+Ut%=#i?me3?D?OZ~m z7@ef;M-23)7oBX~d`Gx};4PN+u#cGOn|lf$pns->T~Ws)f5q_>22F;$v+vABJ@{r2 zc}#~paaCc{{dWRq*H||)*C-En=g+%7ZKmy~)lfAqHPo3&u&6}ub4evHY*uNUo1fe3 zFAyP#~&D$Tnp$IWBNXPOQx3O%H{ z))|#~sGTJc?oRg5S{1v7k(#89TtjRemd9`J z=0aqtA>m0vWt`ht$5nyfA4>VS5@jy`>AN#5X_w|bUA9!?c^ru=l z*6MnTs-RlLk0Q3@6g35EvxO+Bvp4BW+Z(SI?w}!Ro75Yo?Btfcg{H|)ghm5y7TXA&sx65aFgFB zR%4-TnkKLEvwfVnWvg#a$|pLX*_TQJ8nBuBJ+NladB4&!^dDncdPKEKQ%7~WD&Rkb zfZXTJ`=(Nlt4IEXX>q_#-K_rLy-f|%DouUvSR`l+j#8lnQmHg{%5+aO{o$+}cl28@ zZN>L4e*;xB&(Ti0&g&O2!1&!~T9U5UmQxIc9Px){O_QS`yW%$1Bd*lP%wnaveHyql zH~D&C;;#l}iH$T##ds-IC)+`UFR8Gu4z&=3t2yehlL^A1SG<|oo9JZI`YpQ^-zq(F zuj@w5&@k2#lrgN8c~Ls>CB#HoIB{F9^6v&f_TmIQUuaA9QJO%tvWK844ZRGZ<30ae zjfwKS5_@BoTJilP1MaF9#?igj*a~yu48>Tj8yhVB#bL@Kr34fNqXflKc6Wn3@1S*b zQa+J9-od{2lx}3X3}B=Z>EU?6#r&oeIlEN8qkf_T{Hg=UXkhg_zF2lcp+nK%x{l!i z9)iul(7$2m%`*z{8PoKEXh{63K~hLpa-q9rLX@mtL@^maaCA(W{k*7Ya%Ir&KbUe11kQw@(WG$MO8>Ngv=J9V%ApR)NfVpjY z2id8>?xE|rX)0A_=CfsJvK_1U|Jx}E3t2~Di>aAh`bVZQif}dB%5vzH zsteSQ`za#-e$f8ILu`g_Ya8m_VOE`Fg$d~4!}4ZvIia{FqHkx>B}}dsx`mvy@g~K| zu7zLQ`!M&=9PHT$^Dcpvv4M8vQFLQ`kFRK-eQQ4dpjN_n*EYfmb}*uhBG~+lSlNPWY*%|5WRt}bK<>9| zEM8{P4wq3!AA53d%jBI`L?3_cpEFR9KE8UW(8(|u^iFDk7&v8-JQ)6r@AIOiUCrwn z2Qz_fuvLaKx+u!b6_vTsN>RysT?{8n?b z;Yo|y2B^4xetxS>4q^=IgVDIcN!so>T>Xu%vhw#QBLf{wJPU<{g7fLyYBg+G^M5zB zYJdEN-8?vuw6^}G{;Mw<7ou@G;2wDxGZ@L*gnAggvmDn%N5+2;GnhYVAVZk?{1yNR z4q!g~vP$sN6xef@o zrPsd}0>&F{4;;X{pvTBA(*fPflV>=GLAW#*17p&LU4GW9GT>)wxxHG1iW>3J-Z7V+ zmgeWdSk1`dcxhL)giEt(rFspNJBK9{OIp3!YWyL-lSk`08OyTswrPkhztwX5;`P}u z7+6>N*2VcHmp+t$VYlH5a@rMQumT=g*mDn?$iC>b7A7R4Kp&oEG#zHP$Pk2a>L<*!B8hVC=`I5X-hbNY4D zHkiX<>-_AM?f5*R02fP-DjPTm~y{I+_>_s7tW1E|CUtd7drHFdu&GX zdW{bS<2R&fGt|6=ENDIvGxP371yoY`c)$iAnUc&OIHaCZaCzcf#kbr=<vBX6X}0MYPu?h)3yKgc;0*uuca^Uc5#koliDnVG#_hyuf+*ZnK+A?QCy`nGl>`*Md$YkgFu> zs`8B9zW&m;6-)5bK_6cre_VN12ChGxLv4n43Vk1lq+DDM{w5ZT@q>@(-%yT2c>+q; zVGwPOI*zKioV$@RBGNu&0U<9UEyr>Zip^wmW(dE4^gaP3b+5j9kAB2!OYtp%dc-y0 z>WM6Ga@|13-^|WG<{ZA$G3bJFq74y=vTq>T%k3QfNj~UdDrgusXOGSIUoUcCtl&li z>9H9};?qp?jeS}z&h)kFHsHKU2nTU}CI+xzCxFeO7*Y|d3ilsJY(Hd^9atEN+!Y#8 zzr~|K@V0^?X25TZT%nb>OstkwMALI=Lg@;{>eEKtXldP{^;x08PgpBpWkCo}z;_I< zbBu05kUOJ+^i&&6hCxkYdgGbc&{tSjf=p|GP2E8LzVJ+S=@ngR12pZ5wlwBS@%K~= z`Re<>xTh57b%{!v<9OK3Uq&KX*mSw?+h04G@M~_@-7bnKt8nbwJ^mcePPYW0go91N zG6a$j<6%wCl*3rLwZTE|+Bv(p9htw`?;Usd`s?shPFsS^o$!oW!cJ5Ic$^Ly%Lq6S zCK6-3#2JR}!m1)GY=FzRYGgHb<~7+(T_yCh6QJvsNw$iG=7L~8oJwZk^#gE)v#ICm zGc^hXJk^*a@PYrpVs#*rXmL+w15;s_6)g8_ZLws5a=&p;wKsw)XP4K$nX za$kn^4d1w5Kmk%Jx~Xo4dE5s}wV<<15f&_^)LRejf?w7Nnw@eu0>b&`q0T&$0pDod z_Xz_fhEd7zGh2YZ-*YHk^Ce`j13~r1_&TGD67T6Q)|aG7 z^1Md{3I7GN@u#_3T)YCKOk3c02V`@#5P)++Oim8`0$s0L(M1%NWnW-Kz zrPqV999M!BUvyVotk^GhOY&1 zvuq-{{a!!#*3EOO30WGU%r)vXUOSV!uq|uuYuesug`$F;IA5>WMpR+ZB#Y?@I+v@# zY$CA_TFRB)PYB6_U}-D2sFCPD*1Ri88v0A74~T9oT?JVA^oQ=4Mz|C!GRJ_oBodm0 z#Q=oeRby}V<+Q+q%-W8^`fU1Tkzc>%K*Wh@9g37orHq%C;#W4k%?q~Idl3Z-++~T< z>>n=pGL&$$n|4CYh&g8R>4)CV)YL>VLk?mI-nXtVrDutb++qD;!-)>g%7(*P=tA#m z#>WFohn_ftNuYpmCAP?KI8o}ywv?K*esM4zl;Kh#mf|JinsFK$mQQRpm^^aLK}2lo zwS?phY)^|?eMOjQgYhYUmF1=;Qph=C?I%99*l$CK*ik9*GAVYP@as&RVSm|0uOUT! zoM5Oxg{VrHqW_^{zutn_-2>ySE1yRAmK6sra0`htEsom!I41~8Ps}ATo@Sl7Tm0oL zL)jikT39!|Myl)^i=gQN|Bh>dkK{v~_$N^RzCNspd2AE%oEDT{^Gamn#dNe6XQT|z zve(q9sS=V3!>-87Lh5eTiw(5La j9_@Dr{h!wVh
+
+ + + +
diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index e6b61a70a..99d9f8f65 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -111,6 +111,10 @@ define([ template: _.template([ '', + '', + '', + '', + '','', '', '', '', @@ -159,6 +163,11 @@ define([ render: function() { $(this.el).html(this.template({scope: this})); + this.chSpell = new Common.UI.CheckBox({ + el: $('#fms-chb-spell-check'), + labelText: this.strSpellCheckMode + }); + this.chInputMode = new Common.UI.CheckBox({ el: $('#fms-chb-input-mode'), labelText: this.strInputMode @@ -279,6 +288,9 @@ define([ var value = Common.localStorage.getItem("pe-settings-inputmode"); this.chInputMode.setValue(value!==null && parseInt(value) == 1); + value = Common.localStorage.getItem("pe-settings-spellcheck"); + this.chSpell.setValue(value===null || parseInt(value) == 1); + value = Common.localStorage.getItem("pe-settings-zoom"); value = (value!==null) ? parseInt(value) : (this.mode.customization && this.mode.customization.zoom ? parseInt(this.mode.customization.zoom) : -1); var item = this.cmbZoom.store.findWhere({value: value}); @@ -317,6 +329,7 @@ define([ }, applySettings: function() { + Common.localStorage.setItem("pe-settings-spellcheck", this.chSpell.isChecked() ? 1 : 0); Common.localStorage.setItem("pe-settings-inputmode", this.chInputMode.isChecked() ? 1 : 0); Common.localStorage.setItem("pe-settings-zoom", this.cmbZoom.getValue()); /** coauthoring begin **/ @@ -366,7 +379,9 @@ define([ txtInch: 'Inch', txtFitWidth: 'Fit to Width', textForceSave: 'Save to Server', - strForcesave: 'Always save to server (otherwise save to server on document close)' + strForcesave: 'Always save to server (otherwise save to server on document close)', + txtSpellCheck: 'Spell Checking', + strSpellCheckMode: 'Turn on spell checking option' }, PE.Views.FileMenuPanels.Settings || {})); PE.Views.FileMenuPanels.RecentFiles = Common.UI.BaseView.extend({ diff --git a/apps/presentationeditor/main/app/view/Statusbar.js b/apps/presentationeditor/main/app/view/Statusbar.js index 0350076d5..3e295333e 100644 --- a/apps/presentationeditor/main/app/view/Statusbar.js +++ b/apps/presentationeditor/main/app/view/Statusbar.js @@ -66,6 +66,19 @@ define([ Common.Utils.String.format(this.pageIndexText, model.get('current'), model.get('count')) ); } + function _clickLanguage(menu, item, state) { + var $parent = menu.$el.parent(); + + $parent.find('#status-label-lang').text(item.caption); + $parent.find('.dropdown-toggle > .icon-lang-flag') + .removeClass(this.langMenu.prevTip) + .addClass(item.value.tip); + + this.langMenu.prevTip = item.value.tip; + + this.fireEvent('langchanged', [this, item.value.code, item.caption]); + } + PE.Views.Statusbar = Backbone.View.extend(_.extend({ el: '#statusbar', template: _.template(template), @@ -271,6 +284,62 @@ define([ hintAnchor: 'top' }); + this.btnDocLanguage = new Common.UI.Button({ + el: $('#btn-doc-lang',this.el), + hint: this.tipSetDocLang, + hintAnchor: 'top', + disabled: true + }); + + this.btnSetSpelling = new Common.UI.Button({ + el: $('#btn-doc-spell',this.el), + enableToggle: true, + hint: this.tipSetSpelling, + hintAnchor: 'top' + }); + + var panelLang = $('.cnt-lang',this.el); + this.langMenu = new Common.UI.Menu({ + style: 'margin-top:-5px;', + maxHeight: 300, + itemTemplate: _.template([ + '', + '', + '<%= caption %>', + '' + ].join('')), + menuAlign: 'bl-tl' + }); + + this.btnLanguage = new Common.UI.Button({ + el: panelLang, + hint: this.tipSetLang, + hintAnchor: 'top-left', + disabled: true + }); + this.btnLanguage.cmpEl.on({ + 'show.bs.dropdown': function () { + _.defer(function(){ + me.btnLanguage.cmpEl.find('ul').focus(); + }, 100); + }, + 'hide.bs.dropdown': function () { + _.defer(function(){ + me.api.asc_enableKeyEvents(true); + }, 100); + }, + 'click': function (e) { + if (me.btnLanguage.isDisabled()) { + return false; + } + } + }); + + this.langMenu.render(panelLang); + this.langMenu.cmpEl.attr({tabindex: -1}); + this.langMenu.prevTip = 'en'; + this.langMenu.on('item:click', _.bind(_clickLanguage,this)); + return this; }, @@ -375,6 +444,49 @@ define([ $('#status-label-action').text(''); }, + reloadLanguages: function(array) { + this.langMenu.removeAll(); + _.each(array, function(item) { + this.langMenu.addItem({ + iconCls : item['tip'], + caption : item['title'], + value : {tip: item['tip'], code: item['code']}, + checkable : true, + checked : this.langMenu.saved == item.title, + toggleGroup : 'language' + }); + }, this); + + this.langMenu.doLayout(); + if (this.langMenu.items.length>0) { + this.btnLanguage.setDisabled(false); + this.btnDocLanguage.setDisabled(false); + } + }, + + setLanguage: function(info) { + if (this.langMenu.prevTip != info.tip && info.code !== undefined) { + var $parent = $(this.langMenu.el.parentNode, this.$el); + $parent.find('.dropdown-toggle > .icon-lang-flag') + .removeClass(this.langMenu.prevTip) + .addClass(info.tip); + + this.langMenu.prevTip = info.tip; + + $parent.find('#status-label-lang').text(info.title); + + var index = $parent.find('ul li a:contains("'+info.title+'")').parent().index(); + index < 0 ? this.langMenu.saved = info.title : + this.langMenu.items[index-1].setChecked(true); + } + }, + + SetDisabled: function(disable) { + var langs = this.langMenu.items.length>0; + this.btnLanguage.setDisabled(disable || !langs); + this.btnDocLanguage.setDisabled(disable || !langs); + }, + pageIndexText : 'Slide {0} of {1}', goToPageText : 'Go to Slide', tipUsers : 'Document is currently being edited by several users.', @@ -389,7 +501,10 @@ define([ tipPreview : 'Start Slideshow', tipAccessRights : 'Manage document access rights', tipViewUsers : 'View users and manage document access rights', - txAccessRights : 'Change access rights' + txAccessRights : 'Change access rights', + tipSetLang : 'Set Text Language', + tipSetDocLang : 'Set Document Language', + tipSetSpelling : 'Spell checking' }, PE.Views.Statusbar || {})); } ); \ No newline at end of file diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index c123204d5..454b37ae7 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -94,6 +94,9 @@ "Common.Views.InsertTableDialog.txtMinText": "The minimum value for this field is {0}.", "Common.Views.InsertTableDialog.txtRows": "Number of Rows", "Common.Views.InsertTableDialog.txtTitle": "Table Size", + "Common.Views.LanguageDialog.btnCancel": "Cancel", + "Common.Views.LanguageDialog.btnOk": "Ok", + "Common.Views.LanguageDialog.labelSelect": "Select document language", "Common.Views.OpenDialog.cancelButtonText": "Cancel", "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtEncoding": "Encoding ", @@ -821,6 +824,8 @@ "PE.Views.FileMenuPanels.Settings.txtInput": "Alternate Input", "PE.Views.FileMenuPanels.Settings.txtLast": "View Last", "PE.Views.FileMenuPanels.Settings.txtPt": "Point", + "PE.Views.FileMenuPanels.Settings.txtSpellCheck": "Spell Checking", + "PE.Views.FileMenuPanels.Settings.strSpellCheckMode": "Turn on spell checking option", "PE.Views.HyperlinkSettingsDialog.cancelButtonText": "Cancel", "PE.Views.HyperlinkSettingsDialog.okButtonText": "OK", "PE.Views.HyperlinkSettingsDialog.strDisplay": "Display", @@ -1105,6 +1110,9 @@ "PE.Views.Statusbar.tipZoomIn": "Zoom In", "PE.Views.Statusbar.tipZoomOut": "Zoom Out", "PE.Views.Statusbar.txAccessRights": "Change access rights", + "PE.Views.Statusbar.tipSetLang": "Set Text Language", + "PE.Views.Statusbar.tipSetDocLang": "Set Document Language", + "PE.Views.Statusbar.tipSetSpelling": "Spell checking", "PE.Views.Statusbar.txtPageNumInvalid": "Invalid slide number", "PE.Views.TableSettings.deleteColumnText": "Delete Column", "PE.Views.TableSettings.deleteRowText": "Delete Row", diff --git a/apps/presentationeditor/main/resources/less/app.less b/apps/presentationeditor/main/resources/less/app.less index 89589a777..54446155e 100644 --- a/apps/presentationeditor/main/resources/less/app.less +++ b/apps/presentationeditor/main/resources/less/app.less @@ -111,6 +111,7 @@ @import "../../../../common/main/resources/less/common.less"; @import "../../../../common/main/resources/less/opendialog.less"; @import "../../../../common/main/resources/less/plugins.less"; +@import "../../../../common/main/resources/less/language-dialog.less"; // App // -------------------------------------------------- diff --git a/apps/presentationeditor/main/resources/less/statusbar.less b/apps/presentationeditor/main/resources/less/statusbar.less index ce9f2f15a..e22026c35 100644 --- a/apps/presentationeditor/main/resources/less/statusbar.less +++ b/apps/presentationeditor/main/resources/less/statusbar.less @@ -56,6 +56,16 @@ .btn-tpl(-1220px); } + #btn-doc-lang { + .btn-tpl(-160px); + margin-right: 9px; + } + + #btn-doc-spell { + .btn-tpl(-160px); + margin-right: 5px; + } + #status-btn-preview { .btn-tpl(-160px); } @@ -78,6 +88,49 @@ } } + .cnt-lang { + display: inline-block; + cursor: pointer; + color: #000; + margin-left: 6px; + + .dropdown-toggle > .icon-lang-flag { + position: relative; + top: 3px; + margin-left: 3px; + margin-right: 2px; + display: inline-block; + } + + .caret.up { + background-position: @arrow-up-small-offset-x @arrow-up-small-offset-y; + + border: none; + width: 7px; + height: 7px; + } + + label { + cursor: pointer; + } + + .dropdown-menu { + li .lang-item-icon { + display: inline-block; + vertical-align: text-bottom; + margin: 1px 5px 0 2px; + } + } + + &.disabled { + cursor: default; + label, .icon-lang-flag { + cursor: default; + opacity: 0.4; + } + } + } + .cnt-zoom { display: inline-block; @@ -165,4 +218,3 @@ } } } -