[jitsi-dev] [patch] Fixed order of assigning emoticons to the emoticon panel


#1

Hi all,

Enclosed is a patch that fixes the assignment order of emoticons. You may have noticed that emoticons (as numbered by the ) are added to the GUI panel in a strange order by default: this is due to some incorrect logic that works out in the end thanks to modulo arithmetic. As a result, this patch makes the grid in the SmileySelectorBox go from

/--|--|--|--|--\ /--|--|--|--|--\

01|17|13|09|05| |01|02|03|04|05|
--|--|--|--|--| |--|--|--|--|--|
06|02|18|14|10| |06|07|08|09|10|
--|--|--|--|--| to |--|--|--|--|--|
11|07|03|19|15| |11|12|13|14|15|
--|--|--|--|--| |--|--|--|--|--|
16|12|08|04|20| |16|17|18|19|20|

\--|--|--|--|--/ \--|--|--|--|--/

While this strays close to the "trivial stuff that doesn't matter" territory, it's

* Easier to follow refactored code for the future.
* More flexible, allowing for different numbers of emoticons besides 20 to scale well without requiring some kind of diagonal pattern.
* Less error prone for those of us in the "fortunate" position of editing emoticons based on company requests in custom builds.

The "binary" changes in the patch are simple renames of the resources to match this new scheme (I worked to maintain the existing ordering). Not sure why git didn't pick this up.

The commit is available at
https://github.com/tobypinder/jitsi/commit/d0d2292ab7c84d21acdd509048ea2141ebc42135

for easier review.

Comments and corrections to both patch and process are welcome: I'm new to the Jitsi codebase and OSS dev in general.

···

---------------------------------
Toby Pinder | Software Developer
E. toby.pinder@smithelectric.com
W. www.smithelectric.com

---
.../impl/gui/common/smileys/default/smiley12.gif | Bin 2252 -> 1603 bytes
.../impl/gui/common/smileys/default/smiley13.gif | Bin 1717 -> 1558 bytes
.../impl/gui/common/smileys/default/smiley14.gif | Bin 1580 -> 1802 bytes
.../impl/gui/common/smileys/default/smiley17.gif | Bin 1459 -> 2252 bytes
.../impl/gui/common/smileys/default/smiley18.gif | Bin 2422 -> 1547 bytes
.../impl/gui/common/smileys/default/smiley19.gif | Bin 1802 -> 1473 bytes
.../impl/gui/common/smileys/default/smiley2.gif | Bin 2809 -> 1459 bytes
.../impl/gui/common/smileys/default/smiley3.gif | Bin 1558 -> 1717 bytes
.../impl/gui/common/smileys/default/smiley4.gif | Bin 1473 -> 1489 bytes
.../impl/gui/common/smileys/default/smiley7.gif | Bin 1603 -> 2809 bytes
.../impl/gui/common/smileys/default/smiley8.gif | Bin 1547 -> 2422 bytes
.../impl/gui/common/smileys/default/smiley9.gif | Bin 1489 -> 1580 bytes
.../impl/gui/main/chat/SmileysSelectorBox.java | 10 ++--
.../impl/replacement/smiley/Resources.java | 64 ++++++++++-----------
14 files changed, 37 insertions(+), 37 deletions(-)
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley12.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley2.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley3.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley4.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley7.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley8.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley9.gif

diff --git a/resources/images/impl/gui/common/smileys/default/smiley12.gif b/resources/images/impl/gui/common/smileys/default/smiley12.gif
old mode 100755
new mode 100644
index 577229c9d93c67c02f153b45ab1fa30c1d250239..7802d426c6964fbbda8a29ade09202d86eb3bcbf
GIT binary patch
delta 576

jc$lZ&-P6s&GEtI2is6VL!+#Js^ZyJG&HO(Th|>P2rTsTHJ_8g5f|)aCf(Q_u

zmIg#=#>U1#4GcsB#sA!Xt|7tBjsdPldIrpl3=Es+GqN)Am>ZZHnVK4#8kkyGOy0n3
z0245Q3P?_7Wr@`^b1}9waJF={urM+(voJKYFt9MTaB?*@w=^<!bTv0sQYbD7N=>s$
znLLqMc=J4#EXI041|5*&K;C0uJ)oe_mvqVI#bc9{*J}JK&M*F`<Vm0AwL7$DPR4N|
zCfS{H*QYu$cH7^aw58#T(2g4++A%u>wyZdRMYvB&;67(V$JDcn4H8%@9Ev*=WQ~sa

`WT>goYgKJ-)~&KvskG>}H!s)YYA!3VWMRm#$e2~H$KKLf$-hvUjcr+B<19ut

zcBU95o?azpMkOXzc6OGG<to;P820Wv!OmRSaoE_EWfdDM^V}dOYnzA&o(z+E-FwE5
zw--EmvcgB*>*ZS&MFz#6EUa7%Kwoh%a53;RZ~}cLlc3V~L}E(DD!1he)+8x#@b<7R
z*X6Q0eS5QvPAm&T2Rl%Q09c1CP{$Gp4yTn}D;BI#wK`C;cHT<alfUfF>~ioIVFK$&
if!V>wzyY*F7^ovfWy%W=fy|TJ3UnsF{&Px^!5RQU>9^bf

delta 1212
zcmX@ib4IY<-P6s&GEtI2k>OcA!-Y$ifByXS!QI#`I*noREry9ZcJAK$=g%K&J4Y`s
zpTCc;K7R7_<Ht`24<9u#G3)H^{rc^jt(%Wqa7;^E$HvXu+;eIy8t14gsl2z)VVHAz
z)|~lESFUDQ{l?nH?$_p7RW<c{_8!R2EpRUDK7IDQuC~sx6Q}B@&77^%zU<$d$3GUg
zJ2|;doII_lxXi~lfMMaaKPR`k7Pj2Hb^FArGfgdRv2h7grp@S|IAz{~MGPyR*48y{
z-?=+6In}0adT4kg!?Fh+DMgV{F%0uAtX;n`E<VZ4&Exi+dnU~b+!J!mtnAcP)jsD2
zFw8i@F#XV58I?D0-`>0b;D7y}U-ut8eE;FYwd*&}oxgbg!lk@|qStTUynFw_$uI2H

u{p=}-A|9}6ud++|1Z96p8G``Pk+;`y6sx|9-`zQVX``5p7kxOO&x(%C4%PT*B

z`Qnz}IA`8MGjq%DbLtl^Ub<x2%0Fj!)i*YO?a0#AGkEdhrGcSwYFb8mMmB5TrqBq1
z=)X5lGOT;AEU)k%3^wM9Gx0b%8Jn59x)>Rlx>!!0z+?auFoX(7PJYT1t7+)$YGLf`

SSbMWMF1tXlP*o<T^UJxtSXoxVV~IC@B<|1f`}~rA#hl65d?LoW)pQ&!EEq1fb|<

zVE^Ax*VJ6csI11%+tS_BVkKLfkXx%=m&M-OYv{?$Y9V7#>sedNp(xEWvnjvUqQ=6J
zMbySk%pkJ1%xq<^Q!R6(xJS*Aqcx7A;#!7A-4RktJPf>#U6o8v6OwKc$jKFVXO%f(
zr^oX6>Je6sItJZZ`+CP3J9T>xL3dFD^>tTSYgIj5794xx&LY8D6H;9Iq+=qJo4^+b
zg@f(_f;L7wPAEGyF?WgTq&!GaWLjzGJg>p=P>VyO@?xu&85^3oyT!zRl|%#|IMgcH
zBy&SBaZ*RGW)I(#1rwNsB&@1fp1!(#_&_6r>IH@f6*b3RX63e+AN2~RootSVQEzrM
zmQ0+cX!>8rQbOqkTd!m0iWQ%fnL8G6*1q~-SQvI;x=fUWuc1H_2ZtluuNNPbpKn~C
zRO^u=>3D)oQ?Gf?7sH3gyJnnokYiC;GKHzdG2)kv25<WMRjix-K1oQl4sNzf&!4d4
zkVj*?fo5DuqRX=LkF{zW_-@rNUea0mnkjBW-b9zK1uWtsKOGw#9k^KQPH7Z0E1pvj
zsIB0Zx_rDbPD3t0Wd32^=V6YFJQF2Zs~sO6XSDoccu<LZg+rGp_X?(i?6q$`+*0xv
zaO9GZ4{1E9;Fq&NQSP4UBNq<!sZNLa${WNzc~`$>b>i1t_QO$RFDKJA7S1L0JC3$n
z3Kg~Th;TF}Pw-Hinarrbp!k!8m5TwGGT0dS8F&~tfhohK!P2j;rPZGyMwc%}Ik2_P
zwN#Z&gj;~UpPij?M*qBdTylw;`mz1hUcReVG3mExNHA$~)unRfNfg!v$Z5>yDxQC+
z5o~Y@iou@jt__w^K$C;n6kTdnqLo|g%xY_6%pCX```J}R1p4RAUw~xxnl)I>u4`nl
F1^}Dw^2-1K

diff --git a/resources/images/impl/gui/common/smileys/default/smiley13.gif b/resources/images/impl/gui/common/smileys/default/smiley13.gif
index 0e017cfd36256fa999459bee51c492d6333b97ae..5fd4d78fd26b6cf3dab16c7fbaa065cff3d4e4cf 100644
GIT binary patch
delta 413
zcmdnWJB`Q4-P6s&GEss-g5iiD!+#Js^ZyJG&HO(Th|>P20g>^4W8*Vt&di(%L^IPS
zN-483fWby>O(q^QClgB(M*|B3Qzyg82}}ks0duH;<mRnR%uMxy3_2h^Ad47S7b__A
zbu!P@c%qa1de-w<XSmnwP&uVyF=39*otFn+_xc=Me5%9wnar7cnO7QIYP(%OinoY}
zYPcIlH?#QKX>U8hqqm3i*wqtf&-H5kj@{w4i;0Pag*ix@-;IftorAqa*PhotN0*tE
zjh(emIbX-yf{Cqu8Y`229E0C{rd4|O0hwvl%a<wTZz#@R=cP5-Vu!84?!AV&np%7Z
zw)v<YP23Zhs_CZ4p!k!8m5TxBa83qp26iB3U{y&l5jdjYa;Q<^xFd(QkfN*9T{c09
zT<Zmkf*!c(NcDR>S}ef?)|dj)$N|*G$-o2DXrP;*(${CKmb_}!L4`ew8_s-Il<V-|
fcbliwIxkCX!ApS_j>a?*(HTus5)33-85pbq;lzwk

delta 591
zcmbQnvz1rM-P6s&GEsy<ieWP+!~g&P&zw0k6NqM>nK{u&d1J0P6OXB>v4yjvfti7+
zlkwyUOa?q|&IXQ#hL%P^0VAM*<mRVL%uMy13_1)z05XYzWrn~B&((X4C0aPx7!z|&
zBzDYQT9_;~iBVL+ji*C<ujCaEL7n~-wHXRI&U{7&!sjL|n0un&fknUQf=m~OqiieV
zW=vw@Qop2^$j~FY!M-m>?~X%$nA+ro>~!yP8zFTu2M*R6siwe4l_IqOrdY|!s`C0k
zQ)fGQXA7aaInCWI3l$QTmNv7_?_RiqfpzU1CRyK=%|+Aa#O@MgQ2fcl%EbV5EhEsi
z!f@9%J9b>~I^)`YF?DupWr~5)K@kNv?h>^c$;s}5%hmQWajtHf$jGFB_H@ObQXcl6
zq8-eYE{hK|xa|C)A$c$SkxKmx_B{@bRu2>J1s!O$oUAmlC9LYO^@YNsWT8CPO0fp9
z8u@%hH>NbbvhtF4qju>TT87OzGb|e#=c&fXE|O+rZC<d<xPf)`GA2pSHL>|6YtnXX
zT?TQj2*S0Jz_6Vxa6*zvb=eI|PBXTqh9_#Qia!J$8tN6_aL!_D?E29*)4}3aBcsQo
zhYTDBkJpL6{$nHWteU)MqC<zX>Pg2etp`$@JY^cqlUUZb3d?$(`0BtCyYb|4o%60H
z64mz78b&tyN(!u|BCKYq26CMh8bPTQ^^?UW*H7<aV45;Jc8W&!Z0{utWmY&XonvOa
QGS*_+O1-rVf((q-0EoiOlK=n!

diff --git a/resources/images/impl/gui/common/smileys/default/smiley14.gif b/resources/images/impl/gui/common/smileys/default/smiley14.gif
index 19e6ec41b7be0dded31172ae4f6ec49ef3e23777..17d6f3519242005d65e77d089ef64ca3b9e1ef32 100644
GIT binary patch
delta 666
zcmZ3()5T}!?&)S>nJCF1#c)KJ;Xe?ZIrIO_%>OfiDD8h*+J9qXkieNUGl6L4%(OHA
z(|}|e5TzN<JYzgjL3X3ICKHdjlbN}zsgtRJsgv2{1SSKRfC*GUa`RRuMy7fZ24Myr
z1|R_0$H4kZL7~s#kwuV}CD+ScUAyLG+}f9-dsih$*`lGV-T6kG2D^cUk=L|EGnzR+
ztjt<6rT=S@nMCi2jlV=@o>E%;_+VNxV^?O>!3oR(Z*5Y_*;i$HYjZPjSMq2(1v(1x
za<;T-c82uiursjdv<pr0so<|y&Z(ZAq0DHj%|C4hulDR16;{^eJqbyiLW1S9RhZbA
zZLPerR6A5y*jSku8JRaRw5w+%D>JdOU1tdu)b&#~tkFBI>=mlvVp?Xg*1Ay7%0<P{
z{Ovm<9*!SB3Uxep8yGRPvm|}eO^{(N>@swmU~p8Vg(E&t^H4w{2ZQ2ImU>oj0Prv{
zGjKDA0|TJ+fr(<DO6Q9VGaq5!u2(iDZ+lYLIxpSKz<s6JaH5IO0g=K>3uGDEL*6m2
z=u+4u68wlkA#80&ONi>s9UKiSPNfxGea)b>DB$>#Oc&>99Z!*R4X*l7E^`eI16y?s
z2J=pa9u4)jm>Pq&MkS8U{Q9VzocRlc6+v!+IE4%76kY}~pi?>@sQ5W__GmonnAGfX
zS@JONWtT}z%<sP}=!?<&p&{lfaD3HP2Aw`(w>+gxl{xzsi8$nn@HaGvF$H*asX7>*
zthJO&FcdvFH#B!*MC_7DKVnri9CTHTG%Rhxn}i!Uc=Zh09W|7!gg7;<xKz26stx((
f2wA8!Ehu3~nKy;Yk*~3vYt5`~Lo011MFwjCClupP

delta 460
zcmeC;Tf?K^?&)S>nJCF1!?2l?;s5{tXU?3N2}Co2Xl5D^O|+BUm@Cf2V`<^&=ImnN
zYGCT*IC%n-0ZhOJDj>P}DH9`8Jr@HfgAM}_fJ|gy*(q>Bv(->T*?GnHmTj>S*J?vL
z=Y#~XX)M^7kx)0okY$6o$aH~4>YNjcjvVYdemcO&#i2n|cb&?%tTWA;QW`94uT0o8
zN!{&A_NIxphPRm8Z@4aCk)O3>-`n?Zo$I1wW#sj;H8|KAVq;iRGVOAia_jvWWK+^L
z8;!z+C+PJAnw5n~vm~z23l^VUG2c(zW>Ngoo~g5Cw<!k8>g|Y`qs!iJ-pnemG%I@H

;%bmK>-vvr?>T$~b@Xj)owE;!hS<uy<G)cz}=}=p82k4}l&>jWd}YoGeK>3`_zC

zzURsZE){)vN;IQ4Y{AOZif}*001f9wJqE2xAB~c>`nh;AG*9eebAFXpvB0eRfq?=O
zy19HnbL|CAcxrPTQxI9B=;ol{*2=&l&=%s6pyjs5SS>AGtVDamQuUJ_CXXT#W;L-I
ZI!}$7y&zDigKc%2W8r6!e?Yfd0{|@<oZtWe

diff --git a/resources/images/impl/gui/common/smileys/default/smiley17.gif b/resources/images/impl/gui/common/smileys/default/smiley17.gif
index e0b9a3f548c5741f7702d3e265a5a8a4939f5ab5..577229c9d93c67c02f153b45ab1fa30c1d250239 100644
GIT binary patch
delta 1162
zcmdnYeMYd}-P6s&GEtI2k>OcA!-Y$ifByXS!QI#`I*noREry9ZcJAK$=g%K&J4Y`s
zpTCc;K7R7_<Ht`24<9u#G3)H^{rc^jt(%Wqa7;^E$HvXu+;eIy8t14gsl2z)VVHAz
z)|~lESFUDQ{l?nH?$_p7RW<c{_8!R2EpRUDK7IDQuC~sx6Q}B@&77^%zU<$d$3GUg
zJ2|;doII_lxXi~lfMMaaKPR`k7Pj2Hb^FArGfgdRv2h7grp@S|IAz{~MGPyR*48y{
z-?=+6In}0adT4kg!?Fh+DMgV{F%0uAtX;n`E<VZ4&Exi+dnU~b+!J!mtnAcP)jsD2
zFw8i@F#XV58I?D0-`>0b;D7y}U-ut8eE;FYwd*&}oxgbg!lk@|qStTUynFw_$uI2H

u{p=}-A|9}6ud++|1Z96p8G``Pk+;`y6sx|9-`zQVX``5p7kxOO&x(%C4%PT*B

z`Qnz}IA`8MGjq%DbLtl^Ub<x2%0Fj!)i*YO?a0#AGkEdhrGcSwYFb8mMmB5TrqBq1
z=)X5lGOT;AEU)k%3^v+|Gx0b%8Jn59x)>Rlx>!z5U^0LS7(xXkH*aNPW~#4e&|v@q
zP~<VN|8J;kYOZ5cR^#Vw>F#N<lC4e1t<|o}V(;xW^kinWkTIzBtgYoxl;)Y)lwWI6
zW8ugmYU3tm5LsJhwzAi$mN`<~qvpub8b?uaEkmR32&p9=2HwZ6N~Wg?NjC}P<chnq
z${exNV|je_2rEY&gKn*Ty<?4?y1j>>yQqQsx~r_Usva&2jy-W_kzlO}DK34|F_Fnl
z;ERL8L3aT`8>1a3l%1NGyF_(T9waC-t+aEV*Wh@l#i3Dou~o~A4NctLV&cC_B7zSb
zYL#q~xgnT1siRl3hi}S)3CuzgR#hxdUtK<YppilK0z-s~nqx1sa$C%gdIi%?Hb=v#
zH#-_jCQef{{jXywq4a{S*D-U&iciYS9Sb;XU;QvF47)I0CQ8EBP@su}!;$URix0}r
zH!e`B^~jNQJi(@^*SzP8;ltxyGtN24u_!E=!qnmz@ykYoH+}so)=ht(BqUk~H`}G>
zPuOwDqp{sUGp;1jW!d@1TD1*)x9S%!=`4NC6t^L7qD$8T7IBfEj*X5ET&#7cGzyv(
z&nXDhR&YyQKHeCoAr~Mr|1j_KFh@q7iIS|<jt`GBT7EG+sKmX(p-Yr|1=B(H+BY9=
zDftUHa!JUCG@exO%UPf(chB^Z3y1ntr^9^Z4dR}>tKYIZ@oO&o;V80~lj#}@=aTvz
zN82rhiduO@I2w~Dc&N=xW>jEM{K>+~#Q;nhYz+JiJPe$`l;P4~=~vg%>dz3P%NL^@
z*jndWs>&w9Ex_K-&dxZaf8IPUxkOF<*#2rS-&L!a^jkC}m^8WSQn~UZ3hM&oH0E;^
z&p*@%HaG>vU{7|}2Foa*$-!)jF10Gr%B^)~wY4#34*ZP$?5ZLH{qyE8Kr(yH8mwm5
IH8NNO085<Y!2kdN

delta 363

jxS8A5-P6s&GEtI2ieWPk!+#Js^ZyJG&HO(z?SER@nKNf*0@2KwX+V^gW^8N>

zRKWlPn>m3>nRtxMTuj_t3=IuTot!6cU^ajW7(fLiH?y)ZGu87j=z#QrtYTnUCvbw3
zCrDermFMr2#!Ro3x*Q&gOT;(L{@vTPrq7IF`78Ez$>yb(H%FKW_plc_*1F8*d!|s>
z<|VTF$b^f!PMrN~iXT?GrZu=NEiBYG%2SKIIK%w@8<{J9W#KYfY>6Tkw(YIe9UYPp
z@=PqOlUSIW0&BR<7?~$eVx4NIQPj<tGlM~bt6M>5WvSt+Xh&g#sP>|gEvD_(T3d?Q
zoy3%vxgJ(mU)vpUeA5PDcHb@qK?cR2EUa7%P(Ls-FarI+G{F@toB|SNXAl5VEI?tw
Yf+?QQL>R72*t{e5hG&u`haiJB0D2vGj{pDw

diff --git a/resources/images/impl/gui/common/smileys/default/smiley18.gif b/resources/images/impl/gui/common/smileys/default/smiley18.gif
index 016be2b17ecbb0982f5270c2de16962e82c0b4df..15957341f8c8725dc556e441da9162a41f800618 100644
GIT binary patch
delta 499
zcmew+)Xih%?&)S>nJCF1$*`H9;XeqR`F{q8X8xZEL}~xifXMj2vGJKRXJ*a>qM2!F
zK$K=|Y`nRPQHqJ%#Msf$$=TG*z|?H=dS*iy-xR`^n#{@)t7+z9Y-!+Z>1ttNWMF1t
zXlP+zVQk^#YHDt2Wa{W@ZmOhEToRO;W|cB|BD3)3c`O->^;``63_1)z0CE`v%XWbi
zoR_jB*1J^u_bOZ6xKSW?v`0F%(_5>RPdPksvYt{Ev(4<)$BU1|bccC3a{hGKC8?<?
z7}zr}?2>w5Lg6|Yb`>jM5237CPZGRNh>PSuvu^FPIKE>w`;3V(oH3#i_4b;atrbFy
zjO{Ik60*$f^{h<7OsvczHZpTXm^c<KUNl`;F+W3=g@ui6n*6G|`2HY&gRL!r!me#b
zowc$iTOw_ZTvMBxxK1>0RKB3IQ~YAsPGK?CBeH@Fia%Lc!Jc7d;9%fo-~)Qb@WV>?
z)oa%+jTZNHU{#sN(W16I>W~(Te}RJ5CA%Y5F~*O?!?hX@rtetEv|(z|O08Ngh%qUk
zFhMqEDbN`0MlP$|yJ@ZAnez@Ai##v3VY$SYn=AdP`9f;rpN<AihLpKXEb~?_Tw$Uq
H$Y2cs(u}A`

delta 1380
zcmZ>NYdF&j00!{CZP>CMn@Kn;%+Z!h?IPwf>|$sxvxq!ma*3Wg$rMNZH*Jft>5y`|
zI6}(l;gQQxBDbQ;l!S7vbYnT^K|;Cibm}=D&-?BD`g>mma=}3C<-?&lMVSB=z_=Kg
zocv2OHS%Th9hd93w6whT_ThNNnc+;~>guXyValFrUsG3ag||!+9=X$TZ*914qOr=>
z+GclHc<$-5vJ81=^9{|?d{>yivy;op(`yZlx6@C^*7`0d>_0FxJi_M(&(F`#&VIU7
za=EU)p|Yyx-TQIzTGyGV=vY<P<80-rqbX_A&%4u(iC&JquBfOS8GTuH^;)kmTJ!PE
zWXH>b&aBe1t5c(@-!2sPKO4wDdyc_i&W`rod!Qm(Z9bKIdae8XjfTbp2NP3Lk3H?{
zFTYlKp>B_}e!ucmUTj?aaZ!3zbuF9C@$&NV^XF+^HHYtsWQv*WLy5v|c3VGx{t^?r
zFH*3V=0KaCnR)qYOq4De7#tQvMF;TsL-{hzL{CU)*xF!~8{PeObDL(YxwZZ7{Mhr_
zKT1BSUp(sWS+0)IO!j5S6)Uaa_=H-m{;<3-H{ajB(0zScbt^bH<nM_$&jtnu+8QV%
z@_c7ePj6peKkE6!v##Nh5lb_3jYd=BYzonHpfcHPCWAuS&d!g7kpJuC@7*-N9<pZ(
zg~Ft;NsbgJ5{2YIBa>+)8kNOhayX6@65G>}hBp@`^JC+jWAYggY@I(eUQ28Uhyh#R
zYyRCD&|ORyNu;uq8JY5|Y=u%z)iDy}WNM|N4@XDr&zGS0B$*(zwKqo;id>Rx*2k?+
zMwCm;Q5Ym<H>^gq9c%`Xd&_^u`!&;%;KsCkQ!^0C5IXaExlVA!4mzK}HBO;pQZN|0
z&n@{cyP%v0E#hf9h#kz>X&ug-UTWFpni=Lt93ArF!Qm{uAbWFfo=T5}=aZtm6J;eh
zEYYA)5dYXTXPIbRS_~<3%RA}tC{WNFf?;`*Y!imMPFUdhZS^>yc$32Iqi?oHS*!=w
z(!wAM0iE?xcoK_vF@dER024m9-2&T%I&T<MAXbMKS5yww#bdQ0fW;zA`<sW>R}W*r
z{HurNn}^W`5dtSuD5XXSvIys%b5;Zq=^sEtHpBH33S^KCx-R|{h?W3{C{-M?*}BC`
z?|Kfv0h^G4Hx-6WcR<fpiJjTqChJyK<83~l-W23o0LLOhI%+pZ4CVR}2z>Czol3ZE
z6X%I)gbNZZ6pkR@FlAb`6bP5v;fW0;2QSqo;B^Ak47{Wrq)!1etTvU*PT$ObMhcZm
zl{zMB51#anPOd(k2lT?OFsvA<zQV<+j696}=l61cOq_p|Bhl4lMtIHu4@wNzFO;I7
zrCeP&Uu+tefMU@8Tugol`@I<FZZhY=f}cQNKpHCr>@hj_*8)?V$BX;vCohJ;yuDL5
zv`fj1P(gJrI!<uK<Nv|FA4o<v($ZICBD8cN?*0@?o+OEyXrBlXXxZZ~iga{i9UP8{
z_c=tAOOK)=4SbH*N{*O;Enq-sBet~#V_9yxaaRi+)8e-kmThId4m7h4f;vNkp?m^O
zZWn;`-RR86(2?Erbr|O#GD1-FAOf;;<%#cGDO#!SGl#cI!L+%oq*$Ju;7v4VHv~W-
zjBUwn4b;PLjL;Gz*u$qa(Rz%dPHg)vPMGtTY%LdRT+gw1P&^g0g#M|+t6PeN1?E=2
z+egMr1Z-N=+yI(khZpeT&v4<4ou}t+SyBmE3C2g}KB#6pf|+_n?^niNqY+4|MTM)U
ktdw<sliLnk2q06n6OLakT=%*p1C21&iSM~$g9cpw0rfLZpa1{>

diff --git a/resources/images/impl/gui/common/smileys/default/smiley19.gif b/resources/images/impl/gui/common/smileys/default/smiley19.gif
index 17d6f3519242005d65e77d089ef64ca3b9e1ef32..c5a256fda40c6572f69fd6a3583eb91fc4847ff1 100644
GIT binary patch
delta 376
zcmeC;JIHP2?&)S>nJCF1$*`G^;Xe?ZIrIO_%>OfiDD8im@qc6EGiT1s1frQU)6#$_
z&Da=-jDZR_W=S#e7?>EjS{OST7?@gEPM*MI02Q!wg9=D)e#*qiRL{l0$DqRi1R#qT
zShfnB(3~8VyS8M-e^2GUluwoJH+?y-t%<*7P@r>d@(I~F)BhO7Xf&S4@R@qQNieHI
zO6^JKp=Lj!?v-K<Gj+0NUuG1GvRrRIMK9edW$z;Ms3&K4Y5HcW^0BK(*jWfk8N@0^
zM>(49R*5jOurM*oOV$gO$TPCCv9U5`c}Vm!FwdUNA}68kD91Ew&OBkwqL@rM#_cQg
zLzEZEFElG`63UyJq#|t)8rG?DR`QUco(k86C>y=K!h#HnKUrAeUSVWl1bT((f-6`!
t1>{2x23`hE1~#Cugn)-5*ThLPa=T<?%o%tU-C3TR@ijXLhO;nO0{|Otci#X2

delta 728
zcmX@e-Nje$?&)S>nJCF1#c)KJ;Xe?ZIrIO_%>OfiDD8h*+J9qXkieNUGl6L4%(OHA
z(|}|e5TzN<JYx(bje*D*sE>gNp!lEL&ow02*)hP?NY8+ok%3{OKPwZDxs#c>tErQz
zfvJ<(<OC)In1BgXKyvd|CPt=u5e8uf9gr;`*D|oaQc&n~cw`ZzWy$q&SJ$q28MpSO
z=-yQcQnqO5YInX7r@?MuVdOP!(Trx!4=b~lOzHnxWG2yjV&gB7nWvN%KR%e2%-EF~
zb#MZ6z+0P?a`si3-rC#@+?71qPJxa>yqqm<nw=p%IqVGVIqgD|d@A_sm2;|RXDBn;
zYV%K<!K*zxMunAic~3$Tr;uRzY!xOpW?L(-EY%Jb7B*HUMn>jM4DIR}$;wQuY}Z*r
z1$F(D4QupHD|>}%xR{n%thFxGvvN@}G=KZfh==3Hk3t>K-3CSs?JP;3bQ5G)3%d**
zCm0+RY2k<u)I1cB$iblalck;&8~{8F%naNN;=lkXePE*4r_%W%!^}t6x9gRS$=jaP
zwa!a7GjLyNHk@c8bU>u=(gInA_K<gsE4mami3C4lPzYPw(GsFMa|cJmic@I?S6?$I
zEebfkB-6z?TE|nQT!X7Vl*?R$!@yQugTcI$p+`f#EvCkxtx<`iGrvA6CujZwVMUNz
zAWq=|I)#@(4Cs{32P%FJojn?lIwm!HT$Vh{d)Z|Y6Z88o3;JU8erSlf3LIaxl|iRZ
z*ey>fQ)SM+MIsKlBK!@_VN3yDU8)X-Cu=R`5)4HT&JE3-7!kW<(vMhG4F_EnBMnQN
z@Fw8~4qiQjc1H~*D<Mt|D=t+orD{XIIYJgHO$$mGQszzJa^!35=2|nW+t5l|Ns+-C
E00*7y761SM

diff --git a/resources/images/impl/gui/common/smileys/default/smiley2.gif b/resources/images/impl/gui/common/smileys/default/smiley2.gif
old mode 100755
new mode 100644
index fb15009918fb2137b6c67d0610e0a08a97ecdc08..e0b9a3f548c5741f7702d3e265a5a8a4939f5ab5
GIT binary patch
delta 363
zcmew<x|!S7-P6s&GEtI2ieWPk!+#Js^ZyJG&HO(z?SER@nKNf*0@2KwX+V^gW^8N>
zRKWlPn>m3>nRtxMTuj_t3=IuTot!6cU^ajW7(fLiH?y)ZGu87j=z#QrtYTnUCvbw3
zCrDermFMr2#!Ro3x*Q&gOT;(L{@vTPrq7IF`78Ez$>yb(H%FKW_plc_*1F8*d!|s>
z<|VTF$b^f!PMrN~iXT?GrZu=NEiBYG%2SKIIK%w@8<{J9W#KYfY>6Tkw(YIe9UYPp
z@=PqOlUSIW0&BR<7?~$eVx4NIQPj<tGlM~bt6M>5WvSt+Xh&g#sP>|gEvD_(T3d?Q
zoy3%vxgJ(mU)vpUeA5PDcHb@qK?cR2EUa7%P(Ls-FarI+G{F@toB|SNXAl5VEI?tw
Yf+?QQL>R72*t{e5hG&u`haiJB0Kb%YzyJUM

delta 1723
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
GAnbpGe*pym

diff --git a/resources/images/impl/gui/common/smileys/default/smiley3.gif b/resources/images/impl/gui/common/smileys/default/smiley3.gif
old mode 100755
new mode 100644
index 5fd4d78fd26b6cf3dab16c7fbaa065cff3d4e4cf..0e017cfd36256fa999459bee51c492d6333b97ae
GIT binary patch
delta 591
zcmbQnvz1rM-P6s&GEsy<ieWP+!~g&P&zw0k6NqM>nK{u&d1J0P6OXB>v4yjvfti7+
zlkwyUOa?q|&IXQ#hL%P^0VAM*<mRVL%uMy13_1)z05XYzWrn~B&((X4C0aPx7!z|&
zBzDYQT9_;~iBVL+ji*C<ujCaEL7n~-wHXRI&U{7&!sjL|n0un&fknUQf=m~OqiieV
zW=vw@Qop2^$j~FY!M-m>?~X%$nA+ro>~!yP8zFTu2M*R6siwe4l_IqOrdY|!s`C0k
zQ)fGQXA7aaInCWI3l$QTmNv7_?_RiqfpzU1CRyK=%|+Aa#O@MgQ2fcl%EbV5EhEsi
z!f@9%J9b>~I^)`YF?DupWr~5)K@kNv?h>^c$;s}5%hmQWajtHf$jGFB_H@ObQXcl6
zq8-eYE{hK|xa|C)A$c$SkxKmx_B{@bRu2>J1s!O$oUAmlC9LYO^@YNsWT8CPO0fp9
z8u@%hH>NbbvhtF4qju>TT87OzGb|e#=c&fXE|O+rZC<d<xPf)`GA2pSHL>|6YtnXX
zT?TQj2*S0Jz_6Vxa6*zvb=eI|PBXTqh9_#Qia!J$8tN6_aL!_D?E29*)4}3aBcsQo
zhYTDBkJpL6{$nHWteU)MqC<zX>Pg2etp`$@JY^cqlUUZb3d?$(`0BtCyYb|4o%60H
z64mz78b&tyN(!u|BCKYq26CMh8bPTQ^^?UW*H7<aV45;Jc8W&!Z0{utWmY&XonvOa
QGS*_+O1-rVf((q-0EoiOlK=n!

delta 413
zcmdnWJB`Q4-P6s&GEss-g5iiD!+#Js^ZyJG&HO(Th|>P20g>^4W8*Vt&di(%L^IPS
zN-483fWby>O(q^QClgB(M*|B3Qzyg82}}ks0duH;<mRnR%uMxy3_2h^Ad47S7b__A
zbu!P@c%qa1de-w<XSmnwP&uVyF=39*otFn+_xc=Me5%9wnar7cnO7QIYP(%OinoY}
zYPcIlH?#QKX>U8hqqm3i*wqtf&-H5kj@{w4i;0Pag*ix@-;IftorAqa*PhotN0*tE
zjh(emIbX-yf{Cqu8Y`229E0C{rd4|O0hwvl%a<wTZz#@R=cP5-Vu!84?!AV&np%7Z
zw)v<YP23Zhs_CZ4p!k!8m5TxBa83qp26iB3U{y&l5jdjYa;Q<^xFd(QkfN*9T{c09
zT<Zmkf*!c(NcDR>S}ef?)|dj)$N|*G$-o2DXrP;*(${CKmb_}!L4`ew8_s-Il<V-|
fcbliwIxkCX!ApS_j>a?*(HTus5)33-85pbq;lzwk

diff --git a/resources/images/impl/gui/common/smileys/default/smiley4.gif b/resources/images/impl/gui/common/smileys/default/smiley4.gif
old mode 100755
new mode 100644
index c5a256fda40c6572f69fd6a3583eb91fc4847ff1..3fe042a7c6094f84d0a9745350e0f52e1fc9595d
GIT binary patch
delta 440
zcmX@eeUaPB-P6s&GEss-ieWP^!+#(+bLRh<ng3^|{ZBLgZ)|+#%$b=$G!uwsrU6k}
znz6AlP!$6M!$vD9CLT8vLvv>%V-o{YGqcGFOa?FkW2k`S<gHAxnr1G>mIlt2t`-(X
z24)t9h86}E#uiSlrskGLrjD-Wrb-IMB|)iaRw<JmnM5}GGiNf^^D^iF?O*^ojDcmP
zzzNS@Q<LnOV!t0u%86t$@+?~Nz(Y%6ljQwP2Q@4!%f8B5b)8iGnNTsKQ<MFJN~R~D
zGn<54rmgGxO%_#ldY28OQaf~}vb32caqK?Wd2>VVG0k(oWX~^nZ|;{T!rIc>##+PR
zBgEL=#w3#F+a%1~SI^4qWT{rg)W$NQ#xp^Rkx_b%*OGFR+8Q^<wJAdJ#Zqh*n^&oG
z@7-EpRib{_rI1bb@UH6PS}KAJia%Lcxfr0%XJlXmI-hBSD?*r!ft7)efeR>XQm`?#
zfwgmEORn3!u-IviGbbHO3^s~un;npnE3I3$?tP^L%QU7$1pyWoW~YS(fqL`(n^c(?
FtO0O7kxl>r

delta 424
zcmcb}eURJA-P6s&GEtI2l3_C+!+#(+bLRh<ng3@3QQH4B<NwCSXU?3N2}CnzrlkQ<
znz1nu83Pq=w31@tF)%T5wJ>%xFfg^SoSeX902Q!wg9=Da-pUlKY3K}8<m~EXWMX7s
zW?^V(VF2VhI=Q)-8yUE`np-F-6qf|0rdg#-c4QLX?8ltNSkK3x!vF*zhcU2h6*!?e
zIVyK;$%_A;%6%!HD&24Ta$H*zf6Jgi=i1~GvU8^YF^bV>Jdxou^?s9JR)v(>lg>lU
zenQ<V#TsVnWX-<JC>CY8-h7H)x>d^FMdndY&hFCm%~a)MSCO!@5Rx*8Rg8}IX3(q>
zVPs)pVw9H@Dyf%eWMyMxWy<o9=w)D@J)1>NLfcV}Y1W*1!kR@fnR1NVSLlZ*FOpwq
zR@fwzH#JE`+8{KnQ{}AWAwxYCt_x8%dV7Th85DoAuyQd#y~4=A2=ofm1y`_e3P_lP
oftP`kfek1uA>iT2HF466+%6dza|T6sZkDHJe9aDm;VcZ+09-zVG5`Po

diff --git a/resources/images/impl/gui/common/smileys/default/smiley7.gif b/resources/images/impl/gui/common/smileys/default/smiley7.gif
old mode 100755
new mode 100644
index 7802d426c6964fbbda8a29ade09202d86eb3bcbf..fb15009918fb2137b6c67d0610e0a08a97ecdc08
GIT binary patch
delta 1773
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
B4-WtU

delta 576
zcmew<dYGr)-P6s&GEtI2is6VL!+#Js^ZyJG&HO(Th|>P2rTsTHJ_8g5f|)aCf(Q_u
zmIg#=#>U1#4GcsB#sA!Xt|7tBjsdPldIrpl3=Es+GqN)Am>ZZHnVK4#8kkyGOy0n3
z0245Q3P?_7Wr@`^b1}9waJF={urM+(voJKYFt9MTaB?*@w=^<!bTv0sQYbD7N=>s$
znLLqMc=J4#EXI041|5*&K;C0uJ)oe_mvqVI#bc9{*J}JK&M*F`<Vm0AwL7$DPR4N|
zCfS{H*QYu$cH7^aw58#T(2g4++A%u>wyZdRMYvB&;67(V$JDcn4H8%@9Ev*=WQ~sa

`WT>goYgKJ-)~&KvskG>}H!s)YYA!3VWMRm#$e2~H$KKLf$-hvUjcr+B<19ut

zcBU95o?azpMkOXzc6OGG<to;P820Wv!OmRSaoE_EWfdDM^V}dOYnzA&o(z+E-FwE5
zw--EmvcgB*>*ZS&MFz#6EUa7%Kwoh%a53;RZ~}cLlc3V~L}E(DD!1he)+8x#@b<7R
z*X6Q0eS5QvPAm&T2Rl%Q09c1CP{$Gp4yTn}D;BI#wK`C;cHT<alfUfF>~ioIVFK$&
if!V>wzyY*F7^ovfWy%W=fy|TJ3UnsF{&Px^!5RRuCAbX$

diff --git a/resources/images/impl/gui/common/smileys/default/smiley8.gif b/resources/images/impl/gui/common/smileys/default/smiley8.gif
old mode 100755
new mode 100644
index 15957341f8c8725dc556e441da9162a41f800618..016be2b17ecbb0982f5270c2de16962e82c0b4df
GIT binary patch
delta 1380
zcmZ>NYdF&j00!{CZP>CMn@Kn;%+Z!h?IPwf>|$sxvxq!ma*3Wg$rMNZH*Jft>5y`|
zI6}(l;gQQxBDbQ;l!S7vbYnT^K|;Cibm}=D&-?BD`g>mma=}3C<-?&lMVSB=z_=Kg
zocv2OHS%Th9hd93w6whT_ThNNnc+;~>guXyValFrUsG3ag||!+9=X$TZ*914qOr=>
z+GclHc<$-5vJ81=^9{|?d{>yivy;op(`yZlx6@C^*7`0d>_0FxJi_M(&(F`#&VIU7
za=EU)p|Yyx-TQIzTGyGV=vY<P<80-rqbX_A&%4u(iC&JquBfOS8GTuH^;)kmTJ!PE
zWXH>b&aBe1t5c(@-!2sPKO4wDdyc_i&W`rod!Qm(Z9bKIdae8XjfTbp2NP3Lk3H?{
zFTYlKp>B_}e!ucmUTj?aaZ!3zbuF9C@$&NV^XF+^HHYtsWQv*WLy5v|c3VGx{t^?r
zFH*3V=0KaCnR)qYOq4De7#tQvMF;TsL-{hzL{CU)*xF!~8{PeObDL(YxwZZ7{Mhr_
zKT1BSUp(sWS+0)IO!j5S6)Uaa_=H-m{;<3-H{ajB(0zScbt^bH<nM_$&jtnu+8QV%
z@_c7ePj6peKkE6!v##Nh5lb_3jYd=BYzonHpfcHPCWAuS&d!g7kpJuC@7*-N9<pZ(
zg~Ft;NsbgJ5{2YIBa>+)8kNOhayX6@65G>}hBp@`^JC+jWAYggY@I(eUQ28Uhyh#R
zYyRCD&|ORyNu;uq8JY5|Y=u%z)iDy}WNM|N4@XDr&zGS0B$*(zwKqo;id>Rx*2k?+
zMwCm;Q5Ym<H>^gq9c%`Xd&_^u`!&;%;KsCkQ!^0C5IXaExlVA!4mzK}HBO;pQZN|0
z&n@{cyP%v0E#hf9h#kz>X&ug-UTWFpni=Lt93ArF!Qm{uAbWFfo=T5}=aZtm6J;eh
zEYYA)5dYXTXPIbRS_~<3%RA}tC{WNFf?;`*Y!imMPFUdhZS^>yc$32Iqi?oHS*!=w
z(!wAM0iE?xcoK_vF@dER024m9-2&T%I&T<MAXbMKS5yww#bdQ0fW;zA`<sW>R}W*r
z{HurNn}^W`5dtSuD5XXSvIys%b5;Zq=^sEtHpBH33S^KCx-R|{h?W3{C{-M?*}BC`
z?|Kfv0h^G4Hx-6WcR<fpiJjTqChJyK<83~l-W23o0LLOhI%+pZ4CVR}2z>Czol3ZE
z6X%I)gbNZZ6pkR@FlAb`6bP5v;fW0;2QSqo;B^Ak47{Wrq)!1etTvU*PT$ObMhcZm
zl{zMB51#anPOd(k2lT?OFsvA<zQV<+j696}=l61cOq_p|Bhl4lMtIHu4@wNzFO;I7
zrCeP&Uu+tefMU@8Tugol`@I<FZZhY=f}cQNKpHCr>@hj_*8)?V$BX;vCohJ;yuDL5
zv`fj1P(gJrI!<uK<Nv|FA4o<v($ZICBD8cN?*0@?o+OEyXrBlXXxZZ~iga{i9UP8{
z_c=tAOOK)=4SbH*N{*O;Enq-sBet~#V_9yxaaRi+)8e-kmThId4m7h4f;vNkp?m^O
zZWn;`-RR86(2?Erbr|O#GD1-FAOf;;<%#cGDO#!SGl#cI!L+%oq*$Ju;7v4VHv~W-
zjBUwn4b;PLjL;Gz*u$qa(Rz%dPHg)vPMGtTY%LdRT+gw1P&^g0g#M|+t6PeN1?E=2
z+egMr1Z-N=+yI(khZpeT&v4<4ou}t+SyBmE3C2g}KB#6pf|+_n?^niNqY+4|MTM)U
ktdw<sliLnk2q06n6OLakT=%*p1C21&iSM~$g9cpw0rfLZpa1{>

delta 499
zcmew+)Xih%?&)S>nJCF1$*`H9;XeqR`F{q8X8xZEL}~xifXMj2vGJKRXJ*a>qM2!F
zK$K=|Y`nRPQHqJ%#Msf$$=TG*z|?H=dS*iy-xR`^n#{@)t7+z9Y-!+Z>1ttNWMF1t
zXlP+zVQk^#YHDt2Wa{W@ZmOhEToRO;W|cB|BD3)3c`O->^;``63_1)z0CE`v%XWbi
zoR_jB*1J^u_bOZ6xKSW?v`0F%(_5>RPdPksvYt{Ev(4<)$BU1|bccC3a{hGKC8?<?
z7}zr}?2>w5Lg6|Yb`>jM5237CPZGRNh>PSuvu^FPIKE>w`;3V(oH3#i_4b;atrbFy
zjO{Ik60*$f^{h<7OsvczHZpTXm^c<KUNl`;F+W3=g@ui6n*6G|`2HY&gRL!r!me#b
zowc$iTOw_ZTvMBxxK1>0RKB3IQ~YAsPGK?CBeH@Fia%Lc!Jc7d;9%fo-~)Qb@WV>?
z)oa%+jTZNHU{#sN(W16I>W~(Te}RJ5CA%Y5F~*O?!?hX@rtetEv|(z|O08Ngh%qUk
zFhMqEDbN`0MlP$|yJ@ZAnez@Ai##v3VY$SYn=AdP`9f;rpN<AihLpKXEb~?_Tw$Uq
H$Y2cs(u}A`

diff --git a/resources/images/impl/gui/common/smileys/default/smiley9.gif b/resources/images/impl/gui/common/smileys/default/smiley9.gif
old mode 100755
new mode 100644
index 3fe042a7c6094f84d0a9745350e0f52e1fc9595d..19e6ec41b7be0dded31172ae4f6ec49ef3e23777
GIT binary patch
delta 528
zcmcb}y@to!-P6s&GEtI2hG8=&!~g&P&zw0k6NqL4(aba;N=q{~1|nmi6ay02XfDgd
zV`<^&=ImnNYGCT*I5~mI04Cr96_A{~l_^%!(Am|(*xA*|$i&FN%)-#n!T`v1baHbu
zH!^T>HMdYwC@u*~O|wdw?8qd%*^fDkv7VDb2V@t>RSYaU1x{$T8fqvzulU}wEjHp>
zZAj;wkN`G~1sgLG>Sh?SY!DZjF0e?Qb7IkvgI&i@2N=0HG>Gc1Q`wevrdd-;gJtcN
z3411~yIslNG||@Z7IXUz*99!{vzF|8`~IzSU39FByk52j2RlP-3`<I;T`p6uKSRB2
zO1fsFQMm8~y`Dg`vM_0u#1(qM;<GE}`-$5uieK6@b++s_#b8;z9Wirs+563#S>=^x
zMK7Fvtm)8_19fIrid9V+=WpK85M)sN$->IT0Q3$k0}l}L1HI!U;33fCsBtE<gOepG
zhk;4p!1rAFz@?%OPl;yqhAmi`8tzx77@*<2sK=mH>7!B7RzDX{hUSS~Y|gLJDi)Y^
zKQK^WLN}KWXs*4$2~TZ~V+tZ`6x|#Y+*%n}1lmG8613d*7^|hFi<M|^SgL-~!{kv!
d!mK7%L+7bcvlj#kb+D~&b1eKU@(<`%YXG6rt&9Kw

delta 421
zcmZ3(bCFx#-P6s&GEss-ieWP^!+#(+bLRh<ng3^|{ZBLgZ)`kKK!n8@D7w*HmWjvB
z#L(Q?$k@cd)XZ#h0+Rtuz!)kZIe9BntfrZZv892trK^R7k%5_op`nF=g|UT`tEsuA
zk*TArxv7#uaY;~WnpMhVM<(ITe#}{n^}Gx^3_t*K1p~`UffJs+rY6}l#eP4SloQEh
z<XN=jfrpmDCdvDo4r*9dmVK4A>N=_VGofNerzZOcl}t}QXEq79Ok3CWn=GpA^e!7l
zrFQ5{Woa`@;@Ew#^X7)!W18oF$(~>E-rO%wgteu$jkSisM~Jb#jY%ZUw@H|}ub!3J
z$x^L~sf}eqjc0-sBct>juO;OswKZ;zYg2^ci>25sHm_3W-n+HHszm*;OCg)=;a%0o
zwNwNd6o0a?axp-i&&a?CbUxDtSA;Md11kd`0~b)(q+nxe18e8TmRz@cVX@O3XHGhn
q7;F^RHaj3CS6a7h-TO)hmT63h3IZ%F%uWjn0`=zmH>ol)SOWk6{)R~a

diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/SmileysSelectorBox.java b/src/net/java/sip/communicator/impl/gui/main/chat/SmileysSelectorBox.java
index 59e8ea0..55b2966 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/SmileysSelectorBox.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/SmileysSelectorBox.java
@@ -103,7 +103,7 @@ public void setChat(ChatPanel chatPanel)
      */
     private Dimension calculateGridDimensions(int itemsCount)
     {
- int gridRowCount = (int) Math.round(Math.sqrt(itemsCount));
+ int gridColCount = (int) Math.ceil(Math.sqrt(itemsCount));

         /*
          * FIXME The original code was "(int)Math.ceil(itemsCount/gridRowCount)".
@@ -111,8 +111,8 @@ private Dimension calculateGridDimensions(int itemsCount)
          * integers and, consequently, itemsCount/gridRowCount gives an integer.
          * Was the intention to have the division produce a real number?
          */
- int gridColCount = itemsCount / gridRowCount;
-
+ int gridRowCount = itemsCount / gridColCount;
+
         return new Dimension(gridColCount, gridRowCount);
     }

@@ -303,10 +303,10 @@ public void popupMenuWillBecomeVisible(PopupMenuEvent e)

             smileyItem.addActionListener(this);
             smileyItem.addMouseListener(this);
-
+
             gridBagConstraints.anchor = GridBagConstraints.EAST;
             gridBagConstraints.gridx = smileyIndex % gridColCount;
- gridBagConstraints.gridy = smileyIndex % gridRowCount;
+ gridBagConstraints.gridy = (int)(Math.floor(smileyIndex / gridColCount)) % gridRowCount;

             popupMenu.add(smileyItem, gridBagConstraints);

diff --git a/src/net/java/sip/communicator/impl/replacement/smiley/Resources.java b/src/net/java/sip/communicator/impl/replacement/smiley/Resources.java
index a52bca8..26fc8b4 100644
--- a/src/net/java/sip/communicator/impl/replacement/smiley/Resources.java
+++ b/src/net/java/sip/communicator/impl/replacement/smiley/Resources.java
@@ -37,62 +37,62 @@
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY1",
             new String[] {":((", ":-((", ":((", ":(", ":-(", "(sad)"},
             "Sad"));
-
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY2",
- new String[] {"(angel)" }, "Angel"));
-
+ new String[] {"(angry)"}, "Angry"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY3",
- new String[] {":-*", ":*", "(kiss)"}, "Kiss"));
-
+ new String[] {"(n)", "(N)" }, "No"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY4",
- new String[] {":-0", "(shocked)"}, "Shocked"));
-
+ new String[] {":-))", ":))", ";-))", ";))", "(lol)", ":-D", ":D",
+ ";-D", ";D"}, "Laughing"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY5",
             new String[] { ";-((", ";((", ";-(", ";(", ":'(", ":'-(",
                             ":~-(", ":~(", "(upset)" }, "Upset"));
-
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY6",
- new String[] {"&lt;3", "(L)" , "(l)", "(H)", "(h)"}, "In love"));
-
+ new String[] {"&lt;3", "(L)" , "(l)", "(H)", "(h)"}, "In love"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY7",
- new String[] {"(blush)"}, "Blushing"));
-
+ new String[] {"(angel)" }, "Angel"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY8",
- new String[] {":-P", ":P", ":-p", ":p" }, "Tongue out"));
-
+ new String[] {"(bomb)"}, "Exploding"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY9",
- new String[] {":-))", ":))", ";-))", ";))", "(lol)", ":-D", ":D",
- ";-D", ";D"}, "Laughing"));
-
+ new String[] {"(chuckle)" }, "Chuckle"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY10",
- new String[] {"(y)", "(Y)", "(ok)"}, "Ok"));
+ new String[] {"(y)", "(Y)", "(ok)"}, "Ok"));

         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY11",
             new String[] {";-)", ";)", ":-)", ":)"}, "Smile"));
-
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY12",
- new String[] {"(sick)"}, "Sick"));
-
+ new String[] {"(blush)"}, "Blushing"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY13",
- new String[] {"(n)", "(N)" }, "No"));
-
+ new String[] {":-*", ":*", "(kiss)"}, "Kiss"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY14",
- new String[] {"(chuckle)" }, "Chuckle"));
+ new String[] {"(search)"}, "Searching"));

         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY15",
- new String[] {"(wave)" }, "Waving"));
-
+ new String[] {"(wave)" }, "Waving"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY16",
- new String[] {"(clap)"}, "Clapping"));
-
+ new String[] {"(clap)"}, "Clapping"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY17",
- new String[] {"(angry)"}, "Angry"));
-
+ new String[] {"(sick)"}, "Sick"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY18",
- new String[] {"(bomb)"}, "Exploding"));
+ new String[] {":-P", ":P", ":-p", ":p" }, "Tongue out"));

         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY19",
- new String[] {"(search)"}, "Searching"));
+ new String[] {":-0", "(shocked)"}, "Shocked"));

         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY20",
             new String[] {"(oops)"}, "Oops"));
--
1.8.4


#2

Hi all,

During my time developing a custom skinned Jitsi I have a need to hide various features from the user through provisioning (mostly so we can make sure they work correctly with our setup). Enclosed is a patch that disables the "conference call" functionality from both the tools menu and the in-call "add users to upgrade to a conference" menu. This allows us to hide this functionality as SDES based encryption does not seem to be compatible with multiple users like this.

It introduces two new .properties options:

* net.java.sip.communicator.impl.gui.main.call.HIDE_CONFERENCE_BUTTON
    This option hides the "upgrade to conference by adding users" button that is normally available during a call.

* net.java.sip.communicator.impl.gui.main.menus.CONFERENCE_CALL_MENU_ITEM_DISABLED
    This option disables the creation of a conference from scratch, using the "Tools->Create A Conference call..." option.

I considered consolidating the two into one specific option, and I leave that up for discussion. I personally feel that a call "upgrade" is distinct from a conference starting from scratch.

I have enumerated a few potential issues in this patch that might need discussion before merging:

* The addition of several "if not null" blocks across the affected classes. This is how similar functionality has been achieved by other elements in the same classes, but it may be at the point where it can be tidied up.

* My unfamiliarity with the codebase could mean there are additional potential NullPointerExceptions that I missed. I thoroughly tested calls using XMPP, but other protocols may introduce things I missed. This did seem to me to be a moot point due to the way Jitsi separates views and interfaces from actual implementations, but I am necessarily timid with my first contributions to this codebase!

* From a design perspective it may be decided that such granular configuration is unnecessary.

The commit is available at
https://github.com/smithev/smithchat-jitsi/commit/c891bf71b074ee6040d39e4409e6c3eb7330dc24
for easier review.

I am going to continue adding .properties options to hide UI elements like Call Holding, Screen Recording and Video in my fork, but will create .patches and post them here for possible integration if deemed useful.

As I have mentioned on my prior patch, comments and corrections to both patch and process are welcome: I'm new to the Jitsi codebase and OSS dev in general.

PS: If anyone wants to look at SDES-based Conference Calling, I'd be happy to help test and provide stacktraces/logs as needed. It's not something we need right now (and it's too low level for me to take a stab at it) but it'd be cool to get a feature parity with ZRTP so there's no need to hide such things.

Many thanks,

···

---------------------------------
Toby Pinder | Software Developer
E. toby.pinder@smithelectric.com
W. www.smithelectric.com

---
.../communicator/impl/gui/main/call/CallPanel.java | 51 +++++++++++++++-------
.../impl/gui/main/menus/ToolsMenu.java | 44 +++++++++++++------
2 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
index e7dfe9e..05faa0c 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
@@ -111,6 +111,12 @@
      */
     private static final String HIDE_CALL_INFO_BUTON_PROP
         = "net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_INFO_BUTTON";
+
+ /**
+ * Property to disable the conference "add to call" button.
+ */
+ private static final String HIDE_CONFERENCE_BUTON_PROP
+ = "net.java.sip.communicator.impl.gui.main.call.HIDE_CONFERENCE_BUTTON";

     /**
      * Property to disable the record button.
@@ -870,8 +876,9 @@ private void doUpdateSettingsPanelInEventDispatchThread(
                 allCallsConnected = false;
             }
         }
-
- conferenceButton.setEnabled(telephonyConferencing);
+
+ if(conferenceButton != null)
+ conferenceButton.setEnabled(telephonyConferencing);
         transferCallButton.setEnabled(advancedTelephony);
         transferCallButton.setVisible(!callConference.isConferenceFocus());

@@ -1255,7 +1262,8 @@ public int getMinimumButtonWidth()
     private void initButtonIndexes()
     {
         dialButton.setIndex(0);
- conferenceButton.setIndex(1);
+ if (conferenceButton != null)
+ conferenceButton.setIndex(1);
         holdButton.setIndex(2);
         if (recordButton != null)
             recordButton.setIndex(3);
@@ -1364,12 +1372,18 @@ private void initializeUserInterfaceHierarchy()
                     CHAT_BUTTON,
                     GuiActivator.getResources().getI18NString(
                             "service.gui.CHAT"));
- conferenceButton
- = new CallToolBarButton(
- ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON),
- CONFERENCE_BUTTON,
- GuiActivator.getResources().getI18NString(
- "service.gui.CREATE_CONFERENCE_CALL"));
+ if(!GuiActivator.getConfigurationService().getBoolean(
+ HIDE_CONFERENCE_BUTON_PROP,
+ false))
+ {
+ conferenceButton
+ = new CallToolBarButton(
+ ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON),
+ CONFERENCE_BUTTON,
+ GuiActivator.getResources().getI18NString(
+ "service.gui.CREATE_CONFERENCE_CALL"));
+ }
+
         desktopSharingButton = new DesktopSharingButton(aCall);
         dialButton
             = new CallToolBarButton(
@@ -1430,14 +1444,16 @@ private void initializeUserInterfaceHierarchy()
         initButtonIndexes();

         chatButton.addActionListener(this);
- conferenceButton.addActionListener(this);
+ if (conferenceButton != null)
+ conferenceButton.addActionListener(this);
         dialButton.addActionListener(this);
         if (infoButton != null)
             infoButton.addActionListener(this);
         mergeButton.addActionListener(this);

         settingsPanel.add(chatButton);
- settingsPanel.add(conferenceButton);
+ if (conferenceButton != null)
+ settingsPanel.add(conferenceButton);
         settingsPanel.add(desktopSharingButton);
         settingsPanel.add(dialButton);
         settingsPanel.add(fullScreenButton);
@@ -1546,11 +1562,14 @@ public void loadSkin()
                 ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
         dialButton.setIconImage(
                 ImageLoader.getImage(ImageLoader.DIAL_BUTTON));
-
- conferenceButton.setBackgroundImage(
- ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
- conferenceButton.setIconImage(
- ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON));
+
+ if (conferenceButton != null)
+ {
+ conferenceButton.setBackgroundImage(
+ ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
+ conferenceButton.setIconImage(
+ ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON));
+ }

         if (hangupButton != null)
             hangupButton.setBackgroundImage(
diff --git a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
index 308a2d9..87a9b6f 100644
--- a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
@@ -68,7 +68,13 @@
      */
     private static final String AUTO_ANSWER_MENU_DISABLED_PROP =
         "net.java.sip.communicator.impl.gui.main.menus.AUTO_ANSWER_MENU_DISABLED";
-
+
+ /**
+ * Property to disable conference initialization.
+ */
+ private static final String CONFERENCE_CALL_DISABLED_PROP =
+ "net.java.sip.communicator.impl.gui.main.menus.CONFERENCE_CALL_MENU_ITEM_DISABLED";
+
    /**
     * Conference call menu item.
     */
@@ -358,15 +364,24 @@ private void registerMenuItems()
         }

         ResourceManagementService r = GuiActivator.getResources();
-
- conferenceMenuItem
- = new JMenuItem(
- r.getI18NString("service.gui.CREATE_CONFERENCE_CALL"));
- conferenceMenuItem.setMnemonic(
- r.getI18nMnemonic("service.gui.CREATE_CONFERENCE_CALL"));
- conferenceMenuItem.setName("conference");
- conferenceMenuItem.addActionListener(this);
- add(conferenceMenuItem);
+
+
+ Boolean showConferenceMenuItemProp
+ = cfg.getBoolean(
+ CONFERENCE_CALL_DISABLED_PROP,
+ false);
+
+ if(!showConferenceMenuItemProp.booleanValue())
+ {
+ conferenceMenuItem
+ = new JMenuItem(
+ r.getI18NString("service.gui.CREATE_CONFERENCE_CALL"));
+ conferenceMenuItem.setMnemonic(
+ r.getI18nMnemonic("service.gui.CREATE_CONFERENCE_CALL"));
+ conferenceMenuItem.setName("conference");
+ conferenceMenuItem.addActionListener(this);
+ add(conferenceMenuItem);
+ }

         // Add a service listener in order to be notified when a new protocol
         // provider is added or removed and the list should be refreshed.
@@ -715,9 +730,12 @@ private void registerConfigMenuItemNonMacOSX()
     public void loadSkin()
     {
         ResourceManagementService r = GuiActivator.getResources();
-
- conferenceMenuItem.setIcon(
- r.getImage("service.gui.icons.CONFERENCE_CALL"));
+
+ if(conferenceMenuItem != null)
+ {
+ conferenceMenuItem.setIcon(
+ r.getImage("service.gui.icons.CONFERENCE_CALL"));
+ }
         if (configMenuItem != null)
         {
             configMenuItem.setIcon(
--
1.8.4


#3

I have not seen such a nice commit message in a while :slight_smile:

- --
Yannik V�lker

···

Am 28.10.2013 11:32, schrieb Toby Pinder:

Hi all,

Enclosed is a patch that fixes the assignment order of emoticons.
You may have noticed that emoticons (as numbered by the ) are added
to the GUI panel in a strange order by default: this is due to some
incorrect logic that works out in the end thanks to modulo
arithmetic. As a result, this patch makes the grid in the
SmileySelectorBox go from

/--|--|--|--|--\ /--|--|--|--|--\ |01|17|13|09|05|
>01|02|03|04|05| |--|--|--|--|--| |--|--|--|--|--|
>06|02|18|14|10| |06|07|08|09|10| |--|--|--|--|--|
to |--|--|--|--|--| |11|07|03|19|15|
>11|12|13|14|15| |--|--|--|--|--| |--|--|--|--|--|
>16|12|08|04|20| |16|17|18|19|20| \--|--|--|--|--/
\--|--|--|--|--/

While this strays close to the "trivial stuff that doesn't matter"
territory, it's

* Easier to follow refactored code for the future. * More flexible,
allowing for different numbers of emoticons besides 20 to scale
well without requiring some kind of diagonal pattern. * Less error
prone for those of us in the "fortunate" position of editing
emoticons based on company requests in custom builds.

The "binary" changes in the patch are simple renames of the
resources to match this new scheme (I worked to maintain the
existing ordering). Not sure why git didn't pick this up.

The commit is available at
https://github.com/tobypinder/jitsi/commit/d0d2292ab7c84d21acdd509048ea2141ebc42135

for easier review.

Comments and corrections to both patch and process are welcome: I'm
new to the Jitsi codebase and OSS dev in general.


#4

Hi Toby,

Your patch was very neat! Thanks!

It's now committed and ack-ed on our contributors page.

Cheers,
Yana

···

On Mon, Oct 28, 2013 at 11:32 AM, Toby Pinder <Toby.Pinder@smithelectric.com> wrote:

Hi all,

Enclosed is a patch that fixes the assignment order of emoticons. You may have noticed that emoticons (as numbered by the ) are added to the GUI panel in a strange order by default: this is due to some incorrect logic that works out in the end thanks to modulo arithmetic. As a result, this patch makes the grid in the SmileySelectorBox go from

/--|--|--|--|--\ /--|--|--|--|--\
>01|17|13|09|05| |01|02|03|04|05|
>--|--|--|--|--| |--|--|--|--|--|
>06|02|18|14|10| |06|07|08|09|10|
>--|--|--|--|--| to |--|--|--|--|--|
>11|07|03|19|15| |11|12|13|14|15|
>--|--|--|--|--| |--|--|--|--|--|
>16|12|08|04|20| |16|17|18|19|20|
\--|--|--|--|--/ \--|--|--|--|--/

While this strays close to the "trivial stuff that doesn't matter" territory, it's

* Easier to follow refactored code for the future.
* More flexible, allowing for different numbers of emoticons besides 20 to scale well without requiring some kind of diagonal pattern.
* Less error prone for those of us in the "fortunate" position of editing emoticons based on company requests in custom builds.

The "binary" changes in the patch are simple renames of the resources to match this new scheme (I worked to maintain the existing ordering). Not sure why git didn't pick this up.

The commit is available at
https://github.com/tobypinder/jitsi/commit/d0d2292ab7c84d21acdd509048ea2141ebc42135

for easier review.

Comments and corrections to both patch and process are welcome: I'm new to the Jitsi codebase and OSS dev in general.

---------------------------------
Toby Pinder | Software Developer
E. toby.pinder@smithelectric.com
W. www.smithelectric.com

---
.../impl/gui/common/smileys/default/smiley12.gif | Bin 2252 -> 1603 bytes
.../impl/gui/common/smileys/default/smiley13.gif | Bin 1717 -> 1558 bytes
.../impl/gui/common/smileys/default/smiley14.gif | Bin 1580 -> 1802 bytes
.../impl/gui/common/smileys/default/smiley17.gif | Bin 1459 -> 2252 bytes
.../impl/gui/common/smileys/default/smiley18.gif | Bin 2422 -> 1547 bytes
.../impl/gui/common/smileys/default/smiley19.gif | Bin 1802 -> 1473 bytes
.../impl/gui/common/smileys/default/smiley2.gif | Bin 2809 -> 1459 bytes
.../impl/gui/common/smileys/default/smiley3.gif | Bin 1558 -> 1717 bytes
.../impl/gui/common/smileys/default/smiley4.gif | Bin 1473 -> 1489 bytes
.../impl/gui/common/smileys/default/smiley7.gif | Bin 1603 -> 2809 bytes
.../impl/gui/common/smileys/default/smiley8.gif | Bin 1547 -> 2422 bytes
.../impl/gui/common/smileys/default/smiley9.gif | Bin 1489 -> 1580 bytes
.../impl/gui/main/chat/SmileysSelectorBox.java | 10 ++--
.../impl/replacement/smiley/Resources.java | 64 ++++++++++-----------
14 files changed, 37 insertions(+), 37 deletions(-)
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley12.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley2.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley3.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley4.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley7.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley8.gif
mode change 100755 => 100644 resources/images/impl/gui/common/smileys/default/smiley9.gif

diff --git a/resources/images/impl/gui/common/smileys/default/smiley12.gif b/resources/images/impl/gui/common/smileys/default/smiley12.gif
old mode 100755
new mode 100644
index 577229c9d93c67c02f153b45ab1fa30c1d250239..7802d426c6964fbbda8a29ade09202d86eb3bcbf
GIT binary patch
delta 576
>jc$lZ&-P6s&GEtI2is6VL!+#Js^ZyJG&HO(Th|>P2rTsTHJ_8g5f|)aCf(Q_u
zmIg#=#>U1#4GcsB#sA!Xt|7tBjsdPldIrpl3=Es+GqN)Am>ZZHnVK4#8kkyGOy0n3
z0245Q3P?_7Wr@`^b1}9waJF={urM+(voJKYFt9MTaB?*@w=^<!bTv0sQYbD7N=>s$
znLLqMc=J4#EXI041|5*&K;C0uJ)oe_mvqVI#bc9{*J}JK&M*F`<Vm0AwL7$DPR4N|
zCfS{H*QYu$cH7^aw58#T(2g4++A%u>wyZdRMYvB&;67(V$JDcn4H8%@9Ev*=WQ~sa
>`WT>goYgKJ-)~&KvskG>}H!s)YYA!3VWMRm#$e2~H$KKLf$-hvUjcr+B<19ut
zcBU95o?azpMkOXzc6OGG<to;P820Wv!OmRSaoE_EWfdDM^V}dOYnzA&o(z+E-FwE5
zw--EmvcgB*>*ZS&MFz#6EUa7%Kwoh%a53;RZ~}cLlc3V~L}E(DD!1he)+8x#@b<7R
z*X6Q0eS5QvPAm&T2Rl%Q09c1CP{$Gp4yTn}D;BI#wK`C;cHT<alfUfF>~ioIVFK$&
if!V>wzyY*F7^ovfWy%W=fy|TJ3UnsF{&Px^!5RQU>9^bf

delta 1212
zcmX@ib4IY<-P6s&GEtI2k>OcA!-Y$ifByXS!QI#`I*noREry9ZcJAK$=g%K&J4Y`s
zpTCc;K7R7_<Ht`24<9u#G3)H^{rc^jt(%Wqa7;^E$HvXu+;eIy8t14gsl2z)VVHAz
z)|~lESFUDQ{l?nH?$_p7RW<c{_8!R2EpRUDK7IDQuC~sx6Q}B@&77^%zU<$d$3GUg
zJ2|;doII_lxXi~lfMMaaKPR`k7Pj2Hb^FArGfgdRv2h7grp@S|IAz{~MGPyR*48y{
z-?=+6In}0adT4kg!?Fh+DMgV{F%0uAtX;n`E<VZ4&Exi+dnU~b+!J!mtnAcP)jsD2
zFw8i@F#XV58I?D0-`>0b;D7y}U-ut8eE;FYwd*&}oxgbg!lk@|qStTUynFw_$uI2H
>>u{p=}-A|9}6ud++|1Z96p8G``Pk+;`y6sx|9-`zQVX``5p7kxOO&x(%C4%PT*B
z`Qnz}IA`8MGjq%DbLtl^Ub<x2%0Fj!)i*YO?a0#AGkEdhrGcSwYFb8mMmB5TrqBq1
z=)X5lGOT;AEU)k%3^wM9Gx0b%8Jn59x)>Rlx>!!0z+?auFoX(7PJYT1t7+)$YGLf`
>SSbMWMF1tXlP*o<T^UJxtSXoxVV~IC@B<|1f`}~rA#hl65d?LoW)pQ&!EEq1fb|<
zVE^Ax*VJ6csI11%+tS_BVkKLfkXx%=m&M-OYv{?$Y9V7#>sedNp(xEWvnjvUqQ=6J
zMbySk%pkJ1%xq<^Q!R6(xJS*Aqcx7A;#!7A-4RktJPf>#U6o8v6OwKc$jKFVXO%f(
zr^oX6>Je6sItJZZ`+CP3J9T>xL3dFD^>tTSYgIj5794xx&LY8D6H;9Iq+=qJo4^+b
zg@f(_f;L7wPAEGyF?WgTq&!GaWLjzGJg>p=P>VyO@?xu&85^3oyT!zRl|%#|IMgcH
zBy&SBaZ*RGW)I(#1rwNsB&@1fp1!(#_&_6r>IH@f6*b3RX63e+AN2~RootSVQEzrM
zmQ0+cX!>8rQbOqkTd!m0iWQ%fnL8G6*1q~-SQvI;x=fUWuc1H_2ZtluuNNPbpKn~C
zRO^u=>3D)oQ?Gf?7sH3gyJnnokYiC;GKHzdG2)kv25<WMRjix-K1oQl4sNzf&!4d4
zkVj*?fo5DuqRX=LkF{zW_-@rNUea0mnkjBW-b9zK1uWtsKOGw#9k^KQPH7Z0E1pvj
zsIB0Zx_rDbPD3t0Wd32^=V6YFJQF2Zs~sO6XSDoccu<LZg+rGp_X?(i?6q$`+*0xv
zaO9GZ4{1E9;Fq&NQSP4UBNq<!sZNLa${WNzc~`$>b>i1t_QO$RFDKJA7S1L0JC3$n
z3Kg~Th;TF}Pw-Hinarrbp!k!8m5TwGGT0dS8F&~tfhohK!P2j;rPZGyMwc%}Ik2_P
zwN#Z&gj;~UpPij?M*qBdTylw;`mz1hUcReVG3mExNHA$~)unRfNfg!v$Z5>yDxQC+
z5o~Y@iou@jt__w^K$C;n6kTdnqLo|g%xY_6%pCX```J}R1p4RAUw~xxnl)I>u4`nl
F1^}Dw^2-1K

diff --git a/resources/images/impl/gui/common/smileys/default/smiley13.gif b/resources/images/impl/gui/common/smileys/default/smiley13.gif
index 0e017cfd36256fa999459bee51c492d6333b97ae..5fd4d78fd26b6cf3dab16c7fbaa065cff3d4e4cf 100644
GIT binary patch
delta 413
zcmdnWJB`Q4-P6s&GEss-g5iiD!+#Js^ZyJG&HO(Th|>P20g>^4W8*Vt&di(%L^IPS
zN-483fWby>O(q^QClgB(M*|B3Qzyg82}}ks0duH;<mRnR%uMxy3_2h^Ad47S7b__A
zbu!P@c%qa1de-w<XSmnwP&uVyF=39*otFn+_xc=Me5%9wnar7cnO7QIYP(%OinoY}
zYPcIlH?#QKX>U8hqqm3i*wqtf&-H5kj@{w4i;0Pag*ix@-;IftorAqa*PhotN0*tE
zjh(emIbX-yf{Cqu8Y`229E0C{rd4|O0hwvl%a<wTZz#@R=cP5-Vu!84?!AV&np%7Z
zw)v<YP23Zhs_CZ4p!k!8m5TxBa83qp26iB3U{y&l5jdjYa;Q<^xFd(QkfN*9T{c09
zT<Zmkf*!c(NcDR>S}ef?)|dj)$N|*G$-o2DXrP;*(${CKmb_}!L4`ew8_s-Il<V-|
fcbliwIxkCX!ApS_j>a?*(HTus5)33-85pbq;lzwk

delta 591
zcmbQnvz1rM-P6s&GEsy<ieWP+!~g&P&zw0k6NqM>nK{u&d1J0P6OXB>v4yjvfti7+
zlkwyUOa?q|&IXQ#hL%P^0VAM*<mRVL%uMy13_1)z05XYzWrn~B&((X4C0aPx7!z|&
zBzDYQT9_;~iBVL+ji*C<ujCaEL7n~-wHXRI&U{7&!sjL|n0un&fknUQf=m~OqiieV
zW=vw@Qop2^$j~FY!M-m>?~X%$nA+ro>~!yP8zFTu2M*R6siwe4l_IqOrdY|!s`C0k
zQ)fGQXA7aaInCWI3l$QTmNv7_?_RiqfpzU1CRyK=%|+Aa#O@MgQ2fcl%EbV5EhEsi
z!f@9%J9b>~I^)`YF?DupWr~5)K@kNv?h>^c$;s}5%hmQWajtHf$jGFB_H@ObQXcl6
zq8-eYE{hK|xa|C)A$c$SkxKmx_B{@bRu2>J1s!O$oUAmlC9LYO^@YNsWT8CPO0fp9
z8u@%hH>NbbvhtF4qju>TT87OzGb|e#=c&fXE|O+rZC<d<xPf)`GA2pSHL>|6YtnXX
zT?TQj2*S0Jz_6Vxa6*zvb=eI|PBXTqh9_#Qia!J$8tN6_aL!_D?E29*)4}3aBcsQo
zhYTDBkJpL6{$nHWteU)MqC<zX>Pg2etp`$@JY^cqlUUZb3d?$(`0BtCyYb|4o%60H
z64mz78b&tyN(!u|BCKYq26CMh8bPTQ^^?UW*H7<aV45;Jc8W&!Z0{utWmY&XonvOa
QGS*_+O1-rVf((q-0EoiOlK=n!

diff --git a/resources/images/impl/gui/common/smileys/default/smiley14.gif b/resources/images/impl/gui/common/smileys/default/smiley14.gif
index 19e6ec41b7be0dded31172ae4f6ec49ef3e23777..17d6f3519242005d65e77d089ef64ca3b9e1ef32 100644
GIT binary patch
delta 666
zcmZ3()5T}!?&)S>nJCF1#c)KJ;Xe?ZIrIO_%>OfiDD8h*+J9qXkieNUGl6L4%(OHA
z(|}|e5TzN<JYzgjL3X3ICKHdjlbN}zsgtRJsgv2{1SSKRfC*GUa`RRuMy7fZ24Myr
z1|R_0$H4kZL7~s#kwuV}CD+ScUAyLG+}f9-dsih$*`lGV-T6kG2D^cUk=L|EGnzR+
ztjt<6rT=S@nMCi2jlV=@o>E%;_+VNxV^?O>!3oR(Z*5Y_*;i$HYjZPjSMq2(1v(1x
za<;T-c82uiursjdv<pr0so<|y&Z(ZAq0DHj%|C4hulDR16;{^eJqbyiLW1S9RhZbA
zZLPerR6A5y*jSku8JRaRw5w+%D>JdOU1tdu)b&#~tkFBI>=mlvVp?Xg*1Ay7%0<P{
z{Ovm<9*!SB3Uxep8yGRPvm|}eO^{(N>@swmU~p8Vg(E&t^H4w{2ZQ2ImU>oj0Prv{
zGjKDA0|TJ+fr(<DO6Q9VGaq5!u2(iDZ+lYLIxpSKz<s6JaH5IO0g=K>3uGDEL*6m2
z=u+4u68wlkA#80&ONi>s9UKiSPNfxGea)b>DB$>#Oc&>99Z!*R4X*l7E^`eI16y?s
z2J=pa9u4)jm>Pq&MkS8U{Q9VzocRlc6+v!+IE4%76kY}~pi?>@sQ5W__GmonnAGfX
zS@JONWtT}z%<sP}=!?<&p&{lfaD3HP2Aw`(w>+gxl{xzsi8$nn@HaGvF$H*asX7>*
zthJO&FcdvFH#B!*MC_7DKVnri9CTHTG%Rhxn}i!Uc=Zh09W|7!gg7;<xKz26stx((
f2wA8!Ehu3~nKy;Yk*~3vYt5`~Lo011MFwjCClupP

delta 460
zcmeC;Tf?K^?&)S>nJCF1!?2l?;s5{tXU?3N2}Co2Xl5D^O|+BUm@Cf2V`<^&=ImnN
zYGCT*IC%n-0ZhOJDj>P}DH9`8Jr@HfgAM}_fJ|gy*(q>Bv(->T*?GnHmTj>S*J?vL
z=Y#~XX)M^7kx)0okY$6o$aH~4>YNjcjvVYdemcO&#i2n|cb&?%tTWA;QW`94uT0o8
zN!{&A_NIxphPRm8Z@4aCk)O3>-`n?Zo$I1wW#sj;H8|KAVq;iRGVOAia_jvWWK+^L
z8;!z+C+PJAnw5n~vm~z23l^VUG2c(zW>Ngoo~g5Cw<!k8>g|Y`qs!iJ-pnemG%I@H
>>;%bmK>-vvr?>T$~b@Xj)owE;!hS<uy<G)cz}=}=p82k4}l&>jWd}YoGeK>3`_zC
zzURsZE){)vN;IQ4Y{AOZif}*001f9wJqE2xAB~c>`nh;AG*9eebAFXpvB0eRfq?=O
zy19HnbL|CAcxrPTQxI9B=;ol{*2=&l&=%s6pyjs5SS>AGtVDamQuUJ_CXXT#W;L-I
ZI!}$7y&zDigKc%2W8r6!e?Yfd0{|@<oZtWe

diff --git a/resources/images/impl/gui/common/smileys/default/smiley17.gif b/resources/images/impl/gui/common/smileys/default/smiley17.gif
index e0b9a3f548c5741f7702d3e265a5a8a4939f5ab5..577229c9d93c67c02f153b45ab1fa30c1d250239 100644
GIT binary patch
delta 1162
zcmdnYeMYd}-P6s&GEtI2k>OcA!-Y$ifByXS!QI#`I*noREry9ZcJAK$=g%K&J4Y`s
zpTCc;K7R7_<Ht`24<9u#G3)H^{rc^jt(%Wqa7;^E$HvXu+;eIy8t14gsl2z)VVHAz
z)|~lESFUDQ{l?nH?$_p7RW<c{_8!R2EpRUDK7IDQuC~sx6Q}B@&77^%zU<$d$3GUg
zJ2|;doII_lxXi~lfMMaaKPR`k7Pj2Hb^FArGfgdRv2h7grp@S|IAz{~MGPyR*48y{
z-?=+6In}0adT4kg!?Fh+DMgV{F%0uAtX;n`E<VZ4&Exi+dnU~b+!J!mtnAcP)jsD2
zFw8i@F#XV58I?D0-`>0b;D7y}U-ut8eE;FYwd*&}oxgbg!lk@|qStTUynFw_$uI2H
>>u{p=}-A|9}6ud++|1Z96p8G``Pk+;`y6sx|9-`zQVX``5p7kxOO&x(%C4%PT*B
z`Qnz}IA`8MGjq%DbLtl^Ub<x2%0Fj!)i*YO?a0#AGkEdhrGcSwYFb8mMmB5TrqBq1
z=)X5lGOT;AEU)k%3^v+|Gx0b%8Jn59x)>Rlx>!z5U^0LS7(xXkH*aNPW~#4e&|v@q
zP~<VN|8J;kYOZ5cR^#Vw>F#N<lC4e1t<|o}V(;xW^kinWkTIzBtgYoxl;)Y)lwWI6
zW8ugmYU3tm5LsJhwzAi$mN`<~qvpub8b?uaEkmR32&p9=2HwZ6N~Wg?NjC}P<chnq
z${exNV|je_2rEY&gKn*Ty<?4?y1j>>yQqQsx~r_Usva&2jy-W_kzlO}DK34|F_Fnl
z;ERL8L3aT`8>1a3l%1NGyF_(T9waC-t+aEV*Wh@l#i3Dou~o~A4NctLV&cC_B7zSb
zYL#q~xgnT1siRl3hi}S)3CuzgR#hxdUtK<YppilK0z-s~nqx1sa$C%gdIi%?Hb=v#
zH#-_jCQef{{jXywq4a{S*D-U&iciYS9Sb;XU;QvF47)I0CQ8EBP@su}!;$URix0}r
zH!e`B^~jNQJi(@^*SzP8;ltxyGtN24u_!E=!qnmz@ykYoH+}so)=ht(BqUk~H`}G>
zPuOwDqp{sUGp;1jW!d@1TD1*)x9S%!=`4NC6t^L7qD$8T7IBfEj*X5ET&#7cGzyv(
z&nXDhR&YyQKHeCoAr~Mr|1j_KFh@q7iIS|<jt`GBT7EG+sKmX(p-Yr|1=B(H+BY9=
zDftUHa!JUCG@exO%UPf(chB^Z3y1ntr^9^Z4dR}>tKYIZ@oO&o;V80~lj#}@=aTvz
zN82rhiduO@I2w~Dc&N=xW>jEM{K>+~#Q;nhYz+JiJPe$`l;P4~=~vg%>dz3P%NL^@
z*jndWs>&w9Ex_K-&dxZaf8IPUxkOF<*#2rS-&L!a^jkC}m^8WSQn~UZ3hM&oH0E;^
z&p*@%HaG>vU{7|}2Foa*$-!)jF10Gr%B^)~wY4#34*ZP$?5ZLH{qyE8Kr(yH8mwm5
IH8NNO085<Y!2kdN

delta 363
>jxS8A5-P6s&GEtI2ieWPk!+#Js^ZyJG&HO(z?SER@nKNf*0@2KwX+V^gW^8N>
zRKWlPn>m3>nRtxMTuj_t3=IuTot!6cU^ajW7(fLiH?y)ZGu87j=z#QrtYTnUCvbw3
zCrDermFMr2#!Ro3x*Q&gOT;(L{@vTPrq7IF`78Ez$>yb(H%FKW_plc_*1F8*d!|s>
z<|VTF$b^f!PMrN~iXT?GrZu=NEiBYG%2SKIIK%w@8<{J9W#KYfY>6Tkw(YIe9UYPp
z@=PqOlUSIW0&BR<7?~$eVx4NIQPj<tGlM~bt6M>5WvSt+Xh&g#sP>|gEvD_(T3d?Q
zoy3%vxgJ(mU)vpUeA5PDcHb@qK?cR2EUa7%P(Ls-FarI+G{F@toB|SNXAl5VEI?tw
Yf+?QQL>R72*t{e5hG&u`haiJB0D2vGj{pDw

diff --git a/resources/images/impl/gui/common/smileys/default/smiley18.gif b/resources/images/impl/gui/common/smileys/default/smiley18.gif
index 016be2b17ecbb0982f5270c2de16962e82c0b4df..15957341f8c8725dc556e441da9162a41f800618 100644
GIT binary patch
delta 499
zcmew+)Xih%?&)S>nJCF1$*`H9;XeqR`F{q8X8xZEL}~xifXMj2vGJKRXJ*a>qM2!F
zK$K=|Y`nRPQHqJ%#Msf$$=TG*z|?H=dS*iy-xR`^n#{@)t7+z9Y-!+Z>1ttNWMF1t
zXlP+zVQk^#YHDt2Wa{W@ZmOhEToRO;W|cB|BD3)3c`O->^;``63_1)z0CE`v%XWbi
zoR_jB*1J^u_bOZ6xKSW?v`0F%(_5>RPdPksvYt{Ev(4<)$BU1|bccC3a{hGKC8?<?
z7}zr}?2>w5Lg6|Yb`>jM5237CPZGRNh>PSuvu^FPIKE>w`;3V(oH3#i_4b;atrbFy
zjO{Ik60*$f^{h<7OsvczHZpTXm^c<KUNl`;F+W3=g@ui6n*6G|`2HY&gRL!r!me#b
zowc$iTOw_ZTvMBxxK1>0RKB3IQ~YAsPGK?CBeH@Fia%Lc!Jc7d;9%fo-~)Qb@WV>?
z)oa%+jTZNHU{#sN(W16I>W~(Te}RJ5CA%Y5F~*O?!?hX@rtetEv|(z|O08Ngh%qUk
zFhMqEDbN`0MlP$|yJ@ZAnez@Ai##v3VY$SYn=AdP`9f;rpN<AihLpKXEb~?_Tw$Uq
H$Y2cs(u}A`

delta 1380
zcmZ>NYdF&j00!{CZP>CMn@Kn;%+Z!h?IPwf>|$sxvxq!ma*3Wg$rMNZH*Jft>5y`|
zI6}(l;gQQxBDbQ;l!S7vbYnT^K|;Cibm}=D&-?BD`g>mma=}3C<-?&lMVSB=z_=Kg
zocv2OHS%Th9hd93w6whT_ThNNnc+;~>guXyValFrUsG3ag||!+9=X$TZ*914qOr=>
z+GclHc<$-5vJ81=^9{|?d{>yivy;op(`yZlx6@C^*7`0d>_0FxJi_M(&(F`#&VIU7
za=EU)p|Yyx-TQIzTGyGV=vY<P<80-rqbX_A&%4u(iC&JquBfOS8GTuH^;)kmTJ!PE
zWXH>b&aBe1t5c(@-!2sPKO4wDdyc_i&W`rod!Qm(Z9bKIdae8XjfTbp2NP3Lk3H?{
zFTYlKp>B_}e!ucmUTj?aaZ!3zbuF9C@$&NV^XF+^HHYtsWQv*WLy5v|c3VGx{t^?r
zFH*3V=0KaCnR)qYOq4De7#tQvMF;TsL-{hzL{CU)*xF!~8{PeObDL(YxwZZ7{Mhr_
zKT1BSUp(sWS+0)IO!j5S6)Uaa_=H-m{;<3-H{ajB(0zScbt^bH<nM_$&jtnu+8QV%
z@_c7ePj6peKkE6!v##Nh5lb_3jYd=BYzonHpfcHPCWAuS&d!g7kpJuC@7*-N9<pZ(
zg~Ft;NsbgJ5{2YIBa>+)8kNOhayX6@65G>}hBp@`^JC+jWAYggY@I(eUQ28Uhyh#R
zYyRCD&|ORyNu;uq8JY5|Y=u%z)iDy}WNM|N4@XDr&zGS0B$*(zwKqo;id>Rx*2k?+
zMwCm;Q5Ym<H>^gq9c%`Xd&_^u`!&;%;KsCkQ!^0C5IXaExlVA!4mzK}HBO;pQZN|0
z&n@{cyP%v0E#hf9h#kz>X&ug-UTWFpni=Lt93ArF!Qm{uAbWFfo=T5}=aZtm6J;eh
zEYYA)5dYXTXPIbRS_~<3%RA}tC{WNFf?;`*Y!imMPFUdhZS^>yc$32Iqi?oHS*!=w
z(!wAM0iE?xcoK_vF@dER024m9-2&T%I&T<MAXbMKS5yww#bdQ0fW;zA`<sW>R}W*r
z{HurNn}^W`5dtSuD5XXSvIys%b5;Zq=^sEtHpBH33S^KCx-R|{h?W3{C{-M?*}BC`
z?|Kfv0h^G4Hx-6WcR<fpiJjTqChJyK<83~l-W23o0LLOhI%+pZ4CVR}2z>Czol3ZE
z6X%I)gbNZZ6pkR@FlAb`6bP5v;fW0;2QSqo;B^Ak47{Wrq)!1etTvU*PT$ObMhcZm
zl{zMB51#anPOd(k2lT?OFsvA<zQV<+j696}=l61cOq_p|Bhl4lMtIHu4@wNzFO;I7
zrCeP&Uu+tefMU@8Tugol`@I<FZZhY=f}cQNKpHCr>@hj_*8)?V$BX;vCohJ;yuDL5
zv`fj1P(gJrI!<uK<Nv|FA4o<v($ZICBD8cN?*0@?o+OEyXrBlXXxZZ~iga{i9UP8{
z_c=tAOOK)=4SbH*N{*O;Enq-sBet~#V_9yxaaRi+)8e-kmThId4m7h4f;vNkp?m^O
zZWn;`-RR86(2?Erbr|O#GD1-FAOf;;<%#cGDO#!SGl#cI!L+%oq*$Ju;7v4VHv~W-
zjBUwn4b;PLjL;Gz*u$qa(Rz%dPHg)vPMGtTY%LdRT+gw1P&^g0g#M|+t6PeN1?E=2
z+egMr1Z-N=+yI(khZpeT&v4<4ou}t+SyBmE3C2g}KB#6pf|+_n?^niNqY+4|MTM)U
ktdw<sliLnk2q06n6OLakT=%*p1C21&iSM~$g9cpw0rfLZpa1{>

diff --git a/resources/images/impl/gui/common/smileys/default/smiley19.gif b/resources/images/impl/gui/common/smileys/default/smiley19.gif
index 17d6f3519242005d65e77d089ef64ca3b9e1ef32..c5a256fda40c6572f69fd6a3583eb91fc4847ff1 100644
GIT binary patch
delta 376
zcmeC;JIHP2?&)S>nJCF1$*`G^;Xe?ZIrIO_%>OfiDD8im@qc6EGiT1s1frQU)6#$_
z&Da=-jDZR_W=S#e7?>EjS{OST7?@gEPM*MI02Q!wg9=D)e#*qiRL{l0$DqRi1R#qT
zShfnB(3~8VyS8M-e^2GUluwoJH+?y-t%<*7P@r>d@(I~F)BhO7Xf&S4@R@qQNieHI
zO6^JKp=Lj!?v-K<Gj+0NUuG1GvRrRIMK9edW$z;Ms3&K4Y5HcW^0BK(*jWfk8N@0^
zM>(49R*5jOurM*oOV$gO$TPCCv9U5`c}Vm!FwdUNA}68kD91Ew&OBkwqL@rM#_cQg
zLzEZEFElG`63UyJq#|t)8rG?DR`QUco(k86C>y=K!h#HnKUrAeUSVWl1bT((f-6`!
t1>{2x23`hE1~#Cugn)-5*ThLPa=T<?%o%tU-C3TR@ijXLhO;nO0{|Otci#X2

delta 728
zcmX@e-Nje$?&)S>nJCF1#c)KJ;Xe?ZIrIO_%>OfiDD8h*+J9qXkieNUGl6L4%(OHA
z(|}|e5TzN<JYx(bje*D*sE>gNp!lEL&ow02*)hP?NY8+ok%3{OKPwZDxs#c>tErQz
zfvJ<(<OC)In1BgXKyvd|CPt=u5e8uf9gr;`*D|oaQc&n~cw`ZzWy$q&SJ$q28MpSO
z=-yQcQnqO5YInX7r@?MuVdOP!(Trx!4=b~lOzHnxWG2yjV&gB7nWvN%KR%e2%-EF~
zb#MZ6z+0P?a`si3-rC#@+?71qPJxa>yqqm<nw=p%IqVGVIqgD|d@A_sm2;|RXDBn;
zYV%K<!K*zxMunAic~3$Tr;uRzY!xOpW?L(-EY%Jb7B*HUMn>jM4DIR}$;wQuY}Z*r
z1$F(D4QupHD|>}%xR{n%thFxGvvN@}G=KZfh==3Hk3t>K-3CSs?JP;3bQ5G)3%d**
zCm0+RY2k<u)I1cB$iblalck;&8~{8F%naNN;=lkXePE*4r_%W%!^}t6x9gRS$=jaP
zwa!a7GjLyNHk@c8bU>u=(gInA_K<gsE4mami3C4lPzYPw(GsFMa|cJmic@I?S6?$I
zEebfkB-6z?TE|nQT!X7Vl*?R$!@yQugTcI$p+`f#EvCkxtx<`iGrvA6CujZwVMUNz
zAWq=|I)#@(4Cs{32P%FJojn?lIwm!HT$Vh{d)Z|Y6Z88o3;JU8erSlf3LIaxl|iRZ
z*ey>fQ)SM+MIsKlBK!@_VN3yDU8)X-Cu=R`5)4HT&JE3-7!kW<(vMhG4F_EnBMnQN
z@Fw8~4qiQjc1H~*D<Mt|D=t+orD{XIIYJgHO$$mGQszzJa^!35=2|nW+t5l|Ns+-C
E00*7y761SM

diff --git a/resources/images/impl/gui/common/smileys/default/smiley2.gif b/resources/images/impl/gui/common/smileys/default/smiley2.gif
old mode 100755
new mode 100644
index fb15009918fb2137b6c67d0610e0a08a97ecdc08..e0b9a3f548c5741f7702d3e265a5a8a4939f5ab5
GIT binary patch
delta 363
zcmew<x|!S7-P6s&GEtI2ieWPk!+#Js^ZyJG&HO(z?SER@nKNf*0@2KwX+V^gW^8N>
zRKWlPn>m3>nRtxMTuj_t3=IuTot!6cU^ajW7(fLiH?y)ZGu87j=z#QrtYTnUCvbw3
zCrDermFMr2#!Ro3x*Q&gOT;(L{@vTPrq7IF`78Ez$>yb(H%FKW_plc_*1F8*d!|s>
z<|VTF$b^f!PMrN~iXT?GrZu=NEiBYG%2SKIIK%w@8<{J9W#KYfY>6Tkw(YIe9UYPp
z@=PqOlUSIW0&BR<7?~$eVx4NIQPj<tGlM~bt6M>5WvSt+Xh&g#sP>|gEvD_(T3d?Q
zoy3%vxgJ(mU)vpUeA5PDcHb@qK?cR2EUa7%P(Ls-FarI+G{F@toB|SNXAl5VEI?tw
Yf+?QQL>R72*t{e5hG&u`haiJB0Kb%YzyJUM

delta 1723
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
GAnbpGe*pym

diff --git a/resources/images/impl/gui/common/smileys/default/smiley3.gif b/resources/images/impl/gui/common/smileys/default/smiley3.gif
old mode 100755
new mode 100644
index 5fd4d78fd26b6cf3dab16c7fbaa065cff3d4e4cf..0e017cfd36256fa999459bee51c492d6333b97ae
GIT binary patch
delta 591
zcmbQnvz1rM-P6s&GEsy<ieWP+!~g&P&zw0k6NqM>nK{u&d1J0P6OXB>v4yjvfti7+
zlkwyUOa?q|&IXQ#hL%P^0VAM*<mRVL%uMy13_1)z05XYzWrn~B&((X4C0aPx7!z|&
zBzDYQT9_;~iBVL+ji*C<ujCaEL7n~-wHXRI&U{7&!sjL|n0un&fknUQf=m~OqiieV
zW=vw@Qop2^$j~FY!M-m>?~X%$nA+ro>~!yP8zFTu2M*R6siwe4l_IqOrdY|!s`C0k
zQ)fGQXA7aaInCWI3l$QTmNv7_?_RiqfpzU1CRyK=%|+Aa#O@MgQ2fcl%EbV5EhEsi
z!f@9%J9b>~I^)`YF?DupWr~5)K@kNv?h>^c$;s}5%hmQWajtHf$jGFB_H@ObQXcl6
zq8-eYE{hK|xa|C)A$c$SkxKmx_B{@bRu2>J1s!O$oUAmlC9LYO^@YNsWT8CPO0fp9
z8u@%hH>NbbvhtF4qju>TT87OzGb|e#=c&fXE|O+rZC<d<xPf)`GA2pSHL>|6YtnXX
zT?TQj2*S0Jz_6Vxa6*zvb=eI|PBXTqh9_#Qia!J$8tN6_aL!_D?E29*)4}3aBcsQo
zhYTDBkJpL6{$nHWteU)MqC<zX>Pg2etp`$@JY^cqlUUZb3d?$(`0BtCyYb|4o%60H
z64mz78b&tyN(!u|BCKYq26CMh8bPTQ^^?UW*H7<aV45;Jc8W&!Z0{utWmY&XonvOa
QGS*_+O1-rVf((q-0EoiOlK=n!

delta 413
zcmdnWJB`Q4-P6s&GEss-g5iiD!+#Js^ZyJG&HO(Th|>P20g>^4W8*Vt&di(%L^IPS
zN-483fWby>O(q^QClgB(M*|B3Qzyg82}}ks0duH;<mRnR%uMxy3_2h^Ad47S7b__A
zbu!P@c%qa1de-w<XSmnwP&uVyF=39*otFn+_xc=Me5%9wnar7cnO7QIYP(%OinoY}
zYPcIlH?#QKX>U8hqqm3i*wqtf&-H5kj@{w4i;0Pag*ix@-;IftorAqa*PhotN0*tE
zjh(emIbX-yf{Cqu8Y`229E0C{rd4|O0hwvl%a<wTZz#@R=cP5-Vu!84?!AV&np%7Z
zw)v<YP23Zhs_CZ4p!k!8m5TxBa83qp26iB3U{y&l5jdjYa;Q<^xFd(QkfN*9T{c09
zT<Zmkf*!c(NcDR>S}ef?)|dj)$N|*G$-o2DXrP;*(${CKmb_}!L4`ew8_s-Il<V-|
fcbliwIxkCX!ApS_j>a?*(HTus5)33-85pbq;lzwk

diff --git a/resources/images/impl/gui/common/smileys/default/smiley4.gif b/resources/images/impl/gui/common/smileys/default/smiley4.gif
old mode 100755
new mode 100644
index c5a256fda40c6572f69fd6a3583eb91fc4847ff1..3fe042a7c6094f84d0a9745350e0f52e1fc9595d
GIT binary patch
delta 440
zcmX@eeUaPB-P6s&GEss-ieWP^!+#(+bLRh<ng3^|{ZBLgZ)|+#%$b=$G!uwsrU6k}
znz6AlP!$6M!$vD9CLT8vLvv>%V-o{YGqcGFOa?FkW2k`S<gHAxnr1G>mIlt2t`-(X
z24)t9h86}E#uiSlrskGLrjD-Wrb-IMB|)iaRw<JmnM5}GGiNf^^D^iF?O*^ojDcmP
zzzNS@Q<LnOV!t0u%86t$@+?~Nz(Y%6ljQwP2Q@4!%f8B5b)8iGnNTsKQ<MFJN~R~D
zGn<54rmgGxO%_#ldY28OQaf~}vb32caqK?Wd2>VVG0k(oWX~^nZ|;{T!rIc>##+PR
zBgEL=#w3#F+a%1~SI^4qWT{rg)W$NQ#xp^Rkx_b%*OGFR+8Q^<wJAdJ#Zqh*n^&oG
z@7-EpRib{_rI1bb@UH6PS}KAJia%Lcxfr0%XJlXmI-hBSD?*r!ft7)efeR>XQm`?#
zfwgmEORn3!u-IviGbbHO3^s~un;npnE3I3$?tP^L%QU7$1pyWoW~YS(fqL`(n^c(?
FtO0O7kxl>r

delta 424
zcmcb}eURJA-P6s&GEtI2l3_C+!+#(+bLRh<ng3@3QQH4B<NwCSXU?3N2}CnzrlkQ<
znz1nu83Pq=w31@tF)%T5wJ>%xFfg^SoSeX902Q!wg9=Da-pUlKY3K}8<m~EXWMX7s
zW?^V(VF2VhI=Q)-8yUE`np-F-6qf|0rdg#-c4QLX?8ltNSkK3x!vF*zhcU2h6*!?e
zIVyK;$%_A;%6%!HD&24Ta$H*zf6Jgi=i1~GvU8^YF^bV>Jdxou^?s9JR)v(>lg>lU
zenQ<V#TsVnWX-<JC>CY8-h7H)x>d^FMdndY&hFCm%~a)MSCO!@5Rx*8Rg8}IX3(q>
zVPs)pVw9H@Dyf%eWMyMxWy<o9=w)D@J)1>NLfcV}Y1W*1!kR@fnR1NVSLlZ*FOpwq
zR@fwzH#JE`+8{KnQ{}AWAwxYCt_x8%dV7Th85DoAuyQd#y~4=A2=ofm1y`_e3P_lP
oftP`kfek1uA>iT2HF466+%6dza|T6sZkDHJe9aDm;VcZ+09-zVG5`Po

diff --git a/resources/images/impl/gui/common/smileys/default/smiley7.gif b/resources/images/impl/gui/common/smileys/default/smiley7.gif
old mode 100755
new mode 100644
index 7802d426c6964fbbda8a29ade09202d86eb3bcbf..fb15009918fb2137b6c67d0610e0a08a97ecdc08
GIT binary patch
delta 1773
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
B4-WtU

delta 576
zcmew<dYGr)-P6s&GEtI2is6VL!+#Js^ZyJG&HO(Th|>P2rTsTHJ_8g5f|)aCf(Q_u
zmIg#=#>U1#4GcsB#sA!Xt|7tBjsdPldIrpl3=Es+GqN)Am>ZZHnVK4#8kkyGOy0n3
z0245Q3P?_7Wr@`^b1}9waJF={urM+(voJKYFt9MTaB?*@w=^<!bTv0sQYbD7N=>s$
znLLqMc=J4#EXI041|5*&K;C0uJ)oe_mvqVI#bc9{*J}JK&M*F`<Vm0AwL7$DPR4N|
zCfS{H*QYu$cH7^aw58#T(2g4++A%u>wyZdRMYvB&;67(V$JDcn4H8%@9Ev*=WQ~sa
>`WT>goYgKJ-)~&KvskG>}H!s)YYA!3VWMRm#$e2~H$KKLf$-hvUjcr+B<19ut
zcBU95o?azpMkOXzc6OGG<to;P820Wv!OmRSaoE_EWfdDM^V}dOYnzA&o(z+E-FwE5
zw--EmvcgB*>*ZS&MFz#6EUa7%Kwoh%a53;RZ~}cLlc3V~L}E(DD!1he)+8x#@b<7R
z*X6Q0eS5QvPAm&T2Rl%Q09c1CP{$Gp4yTn}D;BI#wK`C;cHT<alfUfF>~ioIVFK$&
if!V>wzyY*F7^ovfWy%W=fy|TJ3UnsF{&Px^!5RRuCAbX$

diff --git a/resources/images/impl/gui/common/smileys/default/smiley8.gif b/resources/images/impl/gui/common/smileys/default/smiley8.gif
old mode 100755
new mode 100644
index 15957341f8c8725dc556e441da9162a41f800618..016be2b17ecbb0982f5270c2de16962e82c0b4df
GIT binary patch
delta 1380
zcmZ>NYdF&j00!{CZP>CMn@Kn;%+Z!h?IPwf>|$sxvxq!ma*3Wg$rMNZH*Jft>5y`|
zI6}(l;gQQxBDbQ;l!S7vbYnT^K|;Cibm}=D&-?BD`g>mma=}3C<-?&lMVSB=z_=Kg
zocv2OHS%Th9hd93w6whT_ThNNnc+;~>guXyValFrUsG3ag||!+9=X$TZ*914qOr=>
z+GclHc<$-5vJ81=^9{|?d{>yivy;op(`yZlx6@C^*7`0d>_0FxJi_M(&(F`#&VIU7
za=EU)p|Yyx-TQIzTGyGV=vY<P<80-rqbX_A&%4u(iC&JquBfOS8GTuH^;)kmTJ!PE
zWXH>b&aBe1t5c(@-!2sPKO4wDdyc_i&W`rod!Qm(Z9bKIdae8XjfTbp2NP3Lk3H?{
zFTYlKp>B_}e!ucmUTj?aaZ!3zbuF9C@$&NV^XF+^HHYtsWQv*WLy5v|c3VGx{t^?r
zFH*3V=0KaCnR)qYOq4De7#tQvMF;TsL-{hzL{CU)*xF!~8{PeObDL(YxwZZ7{Mhr_
zKT1BSUp(sWS+0)IO!j5S6)Uaa_=H-m{;<3-H{ajB(0zScbt^bH<nM_$&jtnu+8QV%
z@_c7ePj6peKkE6!v##Nh5lb_3jYd=BYzonHpfcHPCWAuS&d!g7kpJuC@7*-N9<pZ(
zg~Ft;NsbgJ5{2YIBa>+)8kNOhayX6@65G>}hBp@`^JC+jWAYggY@I(eUQ28Uhyh#R
zYyRCD&|ORyNu;uq8JY5|Y=u%z)iDy}WNM|N4@XDr&zGS0B$*(zwKqo;id>Rx*2k?+
zMwCm;Q5Ym<H>^gq9c%`Xd&_^u`!&;%;KsCkQ!^0C5IXaExlVA!4mzK}HBO;pQZN|0
z&n@{cyP%v0E#hf9h#kz>X&ug-UTWFpni=Lt93ArF!Qm{uAbWFfo=T5}=aZtm6J;eh
zEYYA)5dYXTXPIbRS_~<3%RA}tC{WNFf?;`*Y!imMPFUdhZS^>yc$32Iqi?oHS*!=w
z(!wAM0iE?xcoK_vF@dER024m9-2&T%I&T<MAXbMKS5yww#bdQ0fW;zA`<sW>R}W*r
z{HurNn}^W`5dtSuD5XXSvIys%b5;Zq=^sEtHpBH33S^KCx-R|{h?W3{C{-M?*}BC`
z?|Kfv0h^G4Hx-6WcR<fpiJjTqChJyK<83~l-W23o0LLOhI%+pZ4CVR}2z>Czol3ZE
z6X%I)gbNZZ6pkR@FlAb`6bP5v;fW0;2QSqo;B^Ak47{Wrq)!1etTvU*PT$ObMhcZm
zl{zMB51#anPOd(k2lT?OFsvA<zQV<+j696}=l61cOq_p|Bhl4lMtIHu4@wNzFO;I7
zrCeP&Uu+tefMU@8Tugol`@I<FZZhY=f}cQNKpHCr>@hj_*8)?V$BX;vCohJ;yuDL5
zv`fj1P(gJrI!<uK<Nv|FA4o<v($ZICBD8cN?*0@?o+OEyXrBlXXxZZ~iga{i9UP8{
z_c=tAOOK)=4SbH*N{*O;Enq-sBet~#V_9yxaaRi+)8e-kmThId4m7h4f;vNkp?m^O
zZWn;`-RR86(2?Erbr|O#GD1-FAOf;;<%#cGDO#!SGl#cI!L+%oq*$Ju;7v4VHv~W-
zjBUwn4b;PLjL;Gz*u$qa(Rz%dPHg)vPMGtTY%LdRT+gw1P&^g0g#M|+t6PeN1?E=2
z+egMr1Z-N=+yI(khZpeT&v4<4ou}t+SyBmE3C2g}KB#6pf|+_n?^niNqY+4|MTM)U
ktdw<sliLnk2q06n6OLakT=%*p1C21&iSM~$g9cpw0rfLZpa1{>

delta 499
zcmew+)Xih%?&)S>nJCF1$*`H9;XeqR`F{q8X8xZEL}~xifXMj2vGJKRXJ*a>qM2!F
zK$K=|Y`nRPQHqJ%#Msf$$=TG*z|?H=dS*iy-xR`^n#{@)t7+z9Y-!+Z>1ttNWMF1t
zXlP+zVQk^#YHDt2Wa{W@ZmOhEToRO;W|cB|BD3)3c`O->^;``63_1)z0CE`v%XWbi
zoR_jB*1J^u_bOZ6xKSW?v`0F%(_5>RPdPksvYt{Ev(4<)$BU1|bccC3a{hGKC8?<?
z7}zr}?2>w5Lg6|Yb`>jM5237CPZGRNh>PSuvu^FPIKE>w`;3V(oH3#i_4b;atrbFy
zjO{Ik60*$f^{h<7OsvczHZpTXm^c<KUNl`;F+W3=g@ui6n*6G|`2HY&gRL!r!me#b
zowc$iTOw_ZTvMBxxK1>0RKB3IQ~YAsPGK?CBeH@Fia%Lc!Jc7d;9%fo-~)Qb@WV>?
z)oa%+jTZNHU{#sN(W16I>W~(Te}RJ5CA%Y5F~*O?!?hX@rtetEv|(z|O08Ngh%qUk
zFhMqEDbN`0MlP$|yJ@ZAnez@Ai##v3VY$SYn=AdP`9f;rpN<AihLpKXEb~?_Tw$Uq
H$Y2cs(u}A`

diff --git a/resources/images/impl/gui/common/smileys/default/smiley9.gif b/resources/images/impl/gui/common/smileys/default/smiley9.gif
old mode 100755
new mode 100644
index 3fe042a7c6094f84d0a9745350e0f52e1fc9595d..19e6ec41b7be0dded31172ae4f6ec49ef3e23777
GIT binary patch
delta 528
zcmcb}y@to!-P6s&GEtI2hG8=&!~g&P&zw0k6NqL4(aba;N=q{~1|nmi6ay02XfDgd
zV`<^&=ImnNYGCT*I5~mI04Cr96_A{~l_^%!(Am|(*xA*|$i&FN%)-#n!T`v1baHbu
zH!^T>HMdYwC@u*~O|wdw?8qd%*^fDkv7VDb2V@t>RSYaU1x{$T8fqvzulU}wEjHp>
zZAj;wkN`G~1sgLG>Sh?SY!DZjF0e?Qb7IkvgI&i@2N=0HG>Gc1Q`wevrdd-;gJtcN
z3411~yIslNG||@Z7IXUz*99!{vzF|8`~IzSU39FByk52j2RlP-3`<I;T`p6uKSRB2
zO1fsFQMm8~y`Dg`vM_0u#1(qM;<GE}`-$5uieK6@b++s_#b8;z9Wirs+563#S>=^x
zMK7Fvtm)8_19fIrid9V+=WpK85M)sN$->IT0Q3$k0}l}L1HI!U;33fCsBtE<gOepG
zhk;4p!1rAFz@?%OPl;yqhAmi`8tzx77@*<2sK=mH>7!B7RzDX{hUSS~Y|gLJDi)Y^
zKQK^WLN}KWXs*4$2~TZ~V+tZ`6x|#Y+*%n}1lmG8613d*7^|hFi<M|^SgL-~!{kv!
d!mK7%L+7bcvlj#kb+D~&b1eKU@(<`%YXG6rt&9Kw

delta 421
zcmZ3(bCFx#-P6s&GEss-ieWP^!+#(+bLRh<ng3^|{ZBLgZ)`kKK!n8@D7w*HmWjvB
z#L(Q?$k@cd)XZ#h0+Rtuz!)kZIe9BntfrZZv892trK^R7k%5_op`nF=g|UT`tEsuA
zk*TArxv7#uaY;~WnpMhVM<(ITe#}{n^}Gx^3_t*K1p~`UffJs+rY6}l#eP4SloQEh
z<XN=jfrpmDCdvDo4r*9dmVK4A>N=_VGofNerzZOcl}t}QXEq79Ok3CWn=GpA^e!7l
zrFQ5{Woa`@;@Ew#^X7)!W18oF$(~>E-rO%wgteu$jkSisM~Jb#jY%ZUw@H|}ub!3J
z$x^L~sf}eqjc0-sBct>juO;OswKZ;zYg2^ci>25sHm_3W-n+HHszm*;OCg)=;a%0o
zwNwNd6o0a?axp-i&&a?CbUxDtSA;Md11kd`0~b)(q+nxe18e8TmRz@cVX@O3XHGhn
q7;F^RHaj3CS6a7h-TO)hmT63h3IZ%F%uWjn0`=zmH>ol)SOWk6{)R~a

diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/SmileysSelectorBox.java b/src/net/java/sip/communicator/impl/gui/main/chat/SmileysSelectorBox.java
index 59e8ea0..55b2966 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/SmileysSelectorBox.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/SmileysSelectorBox.java
@@ -103,7 +103,7 @@ public void setChat(ChatPanel chatPanel)
      */
     private Dimension calculateGridDimensions(int itemsCount)
     {
- int gridRowCount = (int) Math.round(Math.sqrt(itemsCount));
+ int gridColCount = (int) Math.ceil(Math.sqrt(itemsCount));

         /*
          * FIXME The original code was "(int)Math.ceil(itemsCount/gridRowCount)".
@@ -111,8 +111,8 @@ private Dimension calculateGridDimensions(int itemsCount)
          * integers and, consequently, itemsCount/gridRowCount gives an integer.
          * Was the intention to have the division produce a real number?
          */
- int gridColCount = itemsCount / gridRowCount;
-
+ int gridRowCount = itemsCount / gridColCount;
+
         return new Dimension(gridColCount, gridRowCount);
     }

@@ -303,10 +303,10 @@ public void popupMenuWillBecomeVisible(PopupMenuEvent e)

             smileyItem.addActionListener(this);
             smileyItem.addMouseListener(this);
-
+
             gridBagConstraints.anchor = GridBagConstraints.EAST;
             gridBagConstraints.gridx = smileyIndex % gridColCount;
- gridBagConstraints.gridy = smileyIndex % gridRowCount;
+ gridBagConstraints.gridy = (int)(Math.floor(smileyIndex / gridColCount)) % gridRowCount;

             popupMenu.add(smileyItem, gridBagConstraints);

diff --git a/src/net/java/sip/communicator/impl/replacement/smiley/Resources.java b/src/net/java/sip/communicator/impl/replacement/smiley/Resources.java
index a52bca8..26fc8b4 100644
--- a/src/net/java/sip/communicator/impl/replacement/smiley/Resources.java
+++ b/src/net/java/sip/communicator/impl/replacement/smiley/Resources.java
@@ -37,62 +37,62 @@
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY1",
             new String[] {":((", ":-((", ":((", ":(", ":-(", "(sad)"},
             "Sad"));
-
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY2",
- new String[] {"(angel)" }, "Angel"));
-
+ new String[] {"(angry)"}, "Angry"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY3",
- new String[] {":-*", ":*", "(kiss)"}, "Kiss"));
-
+ new String[] {"(n)", "(N)" }, "No"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY4",
- new String[] {":-0", "(shocked)"}, "Shocked"));
-
+ new String[] {":-))", ":))", ";-))", ";))", "(lol)", ":-D", ":D",
+ ";-D", ";D"}, "Laughing"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY5",
             new String[] { ";-((", ";((", ";-(", ";(", ":'(", ":'-(",
                             ":~-(", ":~(", "(upset)" }, "Upset"));
-
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY6",
- new String[] {"&lt;3", "(L)" , "(l)", "(H)", "(h)"}, "In love"));
-
+ new String[] {"&lt;3", "(L)" , "(l)", "(H)", "(h)"}, "In love"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY7",
- new String[] {"(blush)"}, "Blushing"));
-
+ new String[] {"(angel)" }, "Angel"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY8",
- new String[] {":-P", ":P", ":-p", ":p" }, "Tongue out"));
-
+ new String[] {"(bomb)"}, "Exploding"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY9",
- new String[] {":-))", ":))", ";-))", ";))", "(lol)", ":-D", ":D",
- ";-D", ";D"}, "Laughing"));
-
+ new String[] {"(chuckle)" }, "Chuckle"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY10",
- new String[] {"(y)", "(Y)", "(ok)"}, "Ok"));
+ new String[] {"(y)", "(Y)", "(ok)"}, "Ok"));

         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY11",
             new String[] {";-)", ";)", ":-)", ":)"}, "Smile"));
-
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY12",
- new String[] {"(sick)"}, "Sick"));
-
+ new String[] {"(blush)"}, "Blushing"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY13",
- new String[] {"(n)", "(N)" }, "No"));
-
+ new String[] {":-*", ":*", "(kiss)"}, "Kiss"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY14",
- new String[] {"(chuckle)" }, "Chuckle"));
+ new String[] {"(search)"}, "Searching"));

         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY15",
- new String[] {"(wave)" }, "Waving"));
-
+ new String[] {"(wave)" }, "Waving"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY16",
- new String[] {"(clap)"}, "Clapping"));
-
+ new String[] {"(clap)"}, "Clapping"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY17",
- new String[] {"(angry)"}, "Angry"));
-
+ new String[] {"(sick)"}, "Sick"));
+
         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY18",
- new String[] {"(bomb)"}, "Exploding"));
+ new String[] {":-P", ":P", ":-p", ":p" }, "Tongue out"));

         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY19",
- new String[] {"(search)"}, "Searching"));
+ new String[] {":-0", "(shocked)"}, "Shocked"));

         defaultSmileyList.add(new SmileyImpl("service.gui.smileys.SMILEY20",
             new String[] {"(oops)"}, "Oops"));
--
1.8.4

_______________________________________________
dev mailing list
dev@jitsi.org
Unsubscribe instructions and other list options:
http://lists.jitsi.org/mailman/listinfo/dev


#5

Hi all,

I am continuing to add more .properties options to hide various elements and features of the UI.

In-Call Dial Button -
    Property: net.java.sip.communicator.impl.gui.main.call.HIDE_DIAL_BUTTON
    Patch: dial.a7ed38.patch
    Github: https://github.com/smithev/smithchat-jitsi/commit/a7ed38c584fc7a5e92d8bd9bde41c6394b2375c7

In-Call Merge Button -
    Property: net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_MERGE_BUTTON
    Patch: merge.d7ca81.patch
    Github: https://github.com/smithev/smithchat-jitsi/commit/d7ca8165c10a8dab832412347246a8f3bad75f8e

In-Call Transfer Button -
    Property: net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_TRANSFER_BUTTON
    Patch: transfer.9114ea.patch
    Github: https://github.com/smithev/smithchat-jitsi/commit/9114ea923760b51b9391807bcfae3addcc07a2d2

In-Call Hold Button -
    Property: net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_HOLD_BUTTON
    Patch: hold.77c2de.patch
    Github: https://github.com/smithev/smithchat-jitsi/commit/77c2defb369bd5427c3bb569f2d084486137f00f

These changes are mostly necessitated by features having apparent issues with various parts of the SDES support, which I'll be detailing on this list at a later date so that they can be added to the bug tracker. We're also trying to simplify the tool to increase adoption from Skype/Webex, then "add" features later.

If there is interest in getting these patches accepted, I will provide similar .properties fields for optional hiding of the other buttons in the UI across the board, and work at tidying up the vast amount of "if" statements in the class's methods.

These changes can be viewed as an atomic unit of this is preferred: I wasn't sure which would be the best option.

Visual: https://github.com/smithev/smithchat-jitsi/compare/c891bf71b074ee6040d39e4409e6c3eb7330dc24...77c2defb369bd5427c3bb569f2d084486137f00f
Diff: https://github.com/smithev/smithchat-jitsi/compare/c891bf71b074ee6040d39e4409e6c3eb7330dc24...77c2defb369bd5427c3bb569f2d084486137f00f.diff

I'm happy to update the provisioning wiki documentation with details of these configuration options should the patches be accepted.

Many thanks,
Toby Pinder | Software Developer
Smith Electric Vehicles

dial.a7ed38.patch (4.1 KB)

merge.d7ca81.patch (4.94 KB)

hold.77c2de.patch (6.14 KB)

transfer.9114ea.patch (3.5 KB)


#6

Hi Toby,

Thanks! This is now committed and ack-ed.

(more inline)

Hi all,

During my time developing a custom skinned Jitsi I have a need to hide various features from the user through provisioning (mostly so we can make sure they work correctly with our setup). Enclosed is a patch that disables the "conference call" functionality from both the tools menu and the in-call "add users to upgrade to a conference" menu. This allows us to hide this functionality as SDES based encryption does not seem to be compatible with multiple users like this.

It introduces two new .properties options:

* net.java.sip.communicator.impl.gui.main.call.HIDE_CONFERENCE_BUTTON
   This option hides the "upgrade to conference by adding users" button that is normally available during a call.

* net.java.sip.communicator.impl.gui.main.menus.CONFERENCE_CALL_MENU_ITEM_DISABLED
   This option disables the creation of a conference from scratch, using the "Tools->Create A Conference call..." option.

I considered consolidating the two into one specific option, and I leave that up for discussion. I personally feel that a call "upgrade" is distinct from a conference starting from scratch.

I liked the separation and committed your patch without any modifications.

I have enumerated a few potential issues in this patch that might need discussion before merging:

* The addition of several "if not null" blocks across the affected classes. This is how similar functionality has been achieved by other elements in the same classes, but it may be at the point where it can be tidied up.

* My unfamiliarity with the codebase could mean there are additional potential NullPointerExceptions that I missed. I thoroughly tested calls using XMPP, but other protocols may introduce things I missed. This did seem to me to be a moot point due to the way Jitsi separates views and interfaces from actual implementations, but I am necessarily timid with my first contributions to this codebase!

Agree that this approach could be bug friendly. We don't have the time of refactoring this piece of code right now, but if you have a suggestion/patch with another approach (taking into account all existing properties in CallPanel of course) we're willing to review and apply it.

* From a design perspective it may be decided that such granular configuration is unnecessary.

The commit is available at
https://github.com/smithev/smithchat-jitsi/commit/c891bf71b074ee6040d39e4409e6c3eb7330dc24
for easier review.

I am going to continue adding .properties options to hide UI elements like Call Holding, Screen Recording and Video in my fork, but will create .patches and post them here for possible integration if deemed useful.

Great.

As I have mentioned on my prior patch, comments and corrections to both patch and process are welcome: I'm new to the Jitsi codebase and OSS dev in general.

You're doing really good, your patches are very clean.

Thanks!
Yana

···

On 28 Oct 2013, at 18:06, Toby Pinder <Toby.Pinder@smithelectric.com> wrote:

PS: If anyone wants to look at SDES-based Conference Calling, I'd be happy to help test and provide stacktraces/logs as needed. It's not something we need right now (and it's too low level for me to take a stab at it) but it'd be cool to get a feature parity with ZRTP so there's no need to hide such things.

Many thanks,
---------------------------------
Toby Pinder | Software Developer
E. toby.pinder@smithelectric.com
W. www.smithelectric.com

---
.../communicator/impl/gui/main/call/CallPanel.java | 51 +++++++++++++++-------
.../impl/gui/main/menus/ToolsMenu.java | 44 +++++++++++++------
2 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
index e7dfe9e..05faa0c 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
@@ -111,6 +111,12 @@
     */
    private static final String HIDE_CALL_INFO_BUTON_PROP
        = "net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_INFO_BUTTON";
+
+ /**
+ * Property to disable the conference "add to call" button.
+ */
+ private static final String HIDE_CONFERENCE_BUTON_PROP
+ = "net.java.sip.communicator.impl.gui.main.call.HIDE_CONFERENCE_BUTTON";

    /**
     * Property to disable the record button.
@@ -870,8 +876,9 @@ private void doUpdateSettingsPanelInEventDispatchThread(
                allCallsConnected = false;
            }
        }
-
- conferenceButton.setEnabled(telephonyConferencing);
+
+ if(conferenceButton != null)
+ conferenceButton.setEnabled(telephonyConferencing);
        transferCallButton.setEnabled(advancedTelephony);
        transferCallButton.setVisible(!callConference.isConferenceFocus());

@@ -1255,7 +1262,8 @@ public int getMinimumButtonWidth()
    private void initButtonIndexes()
    {
        dialButton.setIndex(0);
- conferenceButton.setIndex(1);
+ if (conferenceButton != null)
+ conferenceButton.setIndex(1);
        holdButton.setIndex(2);
        if (recordButton != null)
            recordButton.setIndex(3);
@@ -1364,12 +1372,18 @@ private void initializeUserInterfaceHierarchy()
                    CHAT_BUTTON,
                    GuiActivator.getResources().getI18NString(
                            "service.gui.CHAT"));
- conferenceButton
- = new CallToolBarButton(
- ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON),
- CONFERENCE_BUTTON,
- GuiActivator.getResources().getI18NString(
- "service.gui.CREATE_CONFERENCE_CALL"));
+ if(!GuiActivator.getConfigurationService().getBoolean(
+ HIDE_CONFERENCE_BUTON_PROP,
+ false))
+ {
+ conferenceButton
+ = new CallToolBarButton(
+ ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON),
+ CONFERENCE_BUTTON,
+ GuiActivator.getResources().getI18NString(
+ "service.gui.CREATE_CONFERENCE_CALL"));
+ }
+
        desktopSharingButton = new DesktopSharingButton(aCall);
        dialButton
            = new CallToolBarButton(
@@ -1430,14 +1444,16 @@ private void initializeUserInterfaceHierarchy()
        initButtonIndexes();

        chatButton.addActionListener(this);
- conferenceButton.addActionListener(this);
+ if (conferenceButton != null)
+ conferenceButton.addActionListener(this);
        dialButton.addActionListener(this);
        if (infoButton != null)
            infoButton.addActionListener(this);
        mergeButton.addActionListener(this);

        settingsPanel.add(chatButton);
- settingsPanel.add(conferenceButton);
+ if (conferenceButton != null)
+ settingsPanel.add(conferenceButton);
        settingsPanel.add(desktopSharingButton);
        settingsPanel.add(dialButton);
        settingsPanel.add(fullScreenButton);
@@ -1546,11 +1562,14 @@ public void loadSkin()
                ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
        dialButton.setIconImage(
                ImageLoader.getImage(ImageLoader.DIAL_BUTTON));
-
- conferenceButton.setBackgroundImage(
- ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
- conferenceButton.setIconImage(
- ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON));
+
+ if (conferenceButton != null)
+ {
+ conferenceButton.setBackgroundImage(
+ ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
+ conferenceButton.setIconImage(
+ ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON));
+ }

        if (hangupButton != null)
            hangupButton.setBackgroundImage(
diff --git a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
index 308a2d9..87a9b6f 100644
--- a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
@@ -68,7 +68,13 @@
     */
    private static final String AUTO_ANSWER_MENU_DISABLED_PROP =
        "net.java.sip.communicator.impl.gui.main.menus.AUTO_ANSWER_MENU_DISABLED";
-
+
+ /**
+ * Property to disable conference initialization.
+ */
+ private static final String CONFERENCE_CALL_DISABLED_PROP =
+ "net.java.sip.communicator.impl.gui.main.menus.CONFERENCE_CALL_MENU_ITEM_DISABLED";
+
   /**
    * Conference call menu item.
    */
@@ -358,15 +364,24 @@ private void registerMenuItems()
        }

        ResourceManagementService r = GuiActivator.getResources();
-
- conferenceMenuItem
- = new JMenuItem(
- r.getI18NString("service.gui.CREATE_CONFERENCE_CALL"));
- conferenceMenuItem.setMnemonic(
- r.getI18nMnemonic("service.gui.CREATE_CONFERENCE_CALL"));
- conferenceMenuItem.setName("conference");
- conferenceMenuItem.addActionListener(this);
- add(conferenceMenuItem);
+
+
+ Boolean showConferenceMenuItemProp
+ = cfg.getBoolean(
+ CONFERENCE_CALL_DISABLED_PROP,
+ false);
+
+ if(!showConferenceMenuItemProp.booleanValue())
+ {
+ conferenceMenuItem
+ = new JMenuItem(
+ r.getI18NString("service.gui.CREATE_CONFERENCE_CALL"));
+ conferenceMenuItem.setMnemonic(
+ r.getI18nMnemonic("service.gui.CREATE_CONFERENCE_CALL"));
+ conferenceMenuItem.setName("conference");
+ conferenceMenuItem.addActionListener(this);
+ add(conferenceMenuItem);
+ }

        // Add a service listener in order to be notified when a new protocol
        // provider is added or removed and the list should be refreshed.
@@ -715,9 +730,12 @@ private void registerConfigMenuItemNonMacOSX()
    public void loadSkin()
    {
        ResourceManagementService r = GuiActivator.getResources();
-
- conferenceMenuItem.setIcon(
- r.getImage("service.gui.icons.CONFERENCE_CALL"));
+
+ if(conferenceMenuItem != null)
+ {
+ conferenceMenuItem.setIcon(
+ r.getImage("service.gui.icons.CONFERENCE_CALL"));
+ }
        if (configMenuItem != null)
        {
            configMenuItem.setIcon(
--
1.8.4

_______________________________________________
dev mailing list
dev@jitsi.org
Unsubscribe instructions and other list options:
http://lists.jitsi.org/mailman/listinfo/dev


#7

Great to hear. We've productionised it (and the other UI hiding patches) without any known issues. Is there demand for similar hiding functionality for Video and Desktop Sharing? My company don't need that but I'd be happy to provide a patch for this too (and try to clean up some of the if logic while I'm at it since by that point nearly every line has an if() around it!)

Many thanks,
Toby Pinder | Software Developer
Smith Electric Vehicles

Hi Toby,

Thanks! This is now committed and ack-ed.

(more inline)

Hi all,

During my time developing a custom skinned Jitsi I have a need to hide various features from the user through provisioning (mostly so we can make sure they work correctly with our setup). Enclosed is a patch that disables the "conference call" functionality from both the tools menu and the in-call "add users to upgrade to a conference" menu. This allows us to hide this functionality as SDES based encryption does not seem to be compatible with multiple users like this.

It introduces two new .properties options:

* net.java.sip.communicator.impl.gui.main.call.HIDE_CONFERENCE_BUTTON
   This option hides the "upgrade to conference by adding users" button that is normally available during a call.

* net.java.sip.communicator.impl.gui.main.menus.CONFERENCE_CALL_MENU_ITEM_DISABLED
   This option disables the creation of a conference from scratch, using the "Tools->Create A Conference call..." option.

I considered consolidating the two into one specific option, and I leave that up for discussion. I personally feel that a call "upgrade" is distinct from a conference starting from scratch.

I liked the separation and committed your patch without any modifications.

I have enumerated a few potential issues in this patch that might need discussion before merging:

* The addition of several "if not null" blocks across the affected classes. This is how similar functionality has been achieved by other elements in the same classes, but it may be at the point where it can be tidied up.

* My unfamiliarity with the codebase could mean there are additional potential NullPointerExceptions that I missed. I thoroughly tested calls using XMPP, but other protocols may introduce things I missed. This did seem to me to be a moot point due to the way Jitsi separates views and interfaces from actual implementations, but I am necessarily timid with my first contributions to this codebase!

Agree that this approach could be bug friendly. We don't have the time of refactoring this piece of code right now, but if you have a suggestion/patch with another approach (taking into account all existing properties in CallPanel of course) we're willing to review and apply it.

* From a design perspective it may be decided that such granular configuration is unnecessary.

The commit is available at
https://github.com/smithev/smithchat-jitsi/commit/c891bf71b074ee6040d39e4409e6c3eb7330dc24
for easier review.

I am going to continue adding .properties options to hide UI elements like Call Holding, Screen Recording and Video in my fork, but will create .patches and post them here for possible integration if deemed useful.

Great.

As I have mentioned on my prior patch, comments and corrections to both patch and process are welcome: I'm new to the Jitsi codebase and OSS dev in general.

You're doing really good, your patches are very clean.

Thanks!
Yana

···

On 30/10/13 13:55, Yana Stamcheva wrote:
On 28 Oct 2013, at 18:06, Toby Pinder <Toby.Pinder@smithelectric.com><mailto:Toby.Pinder@smithelectric.com> wrote:

PS: If anyone wants to look at SDES-based Conference Calling, I'd be happy to help test and provide stacktraces/logs as needed. It's not something we need right now (and it's too low level for me to take a stab at it) but it'd be cool to get a feature parity with ZRTP so there's no need to hide such things.

Many thanks,
---------------------------------
Toby Pinder | Software Developer
E. toby.pinder@smithelectric.com<mailto:toby.pinder@smithelectric.com>
W. www.smithelectric.com<http://www.smithelectric.com>

---
.../communicator/impl/gui/main/call/CallPanel.java | 51 +++++++++++++++-------
.../impl/gui/main/menus/ToolsMenu.java | 44 +++++++++++++------
2 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
index e7dfe9e..05faa0c 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
@@ -111,6 +111,12 @@
     */
    private static final String HIDE_CALL_INFO_BUTON_PROP
        = "net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_INFO_BUTTON";
+
+ /**
+ * Property to disable the conference "add to call" button.
+ */
+ private static final String HIDE_CONFERENCE_BUTON_PROP
+ = "net.java.sip.communicator.impl.gui.main.call.HIDE_CONFERENCE_BUTTON";

    /**
     * Property to disable the record button.
@@ -870,8 +876,9 @@ private void doUpdateSettingsPanelInEventDispatchThread(
                allCallsConnected = false;
            }
        }
-
- conferenceButton.setEnabled(telephonyConferencing);
+
+ if(conferenceButton != null)
+ conferenceButton.setEnabled(telephonyConferencing);
        transferCallButton.setEnabled(advancedTelephony);
        transferCallButton.setVisible(!callConference.isConferenceFocus());

@@ -1255,7 +1262,8 @@ public int getMinimumButtonWidth()
    private void initButtonIndexes()
    {
        dialButton.setIndex(0);
- conferenceButton.setIndex(1);
+ if (conferenceButton != null)
+ conferenceButton.setIndex(1);
        holdButton.setIndex(2);
        if (recordButton != null)
            recordButton.setIndex(3);
@@ -1364,12 +1372,18 @@ private void initializeUserInterfaceHierarchy()
                    CHAT_BUTTON,
                    GuiActivator.getResources().getI18NString(
                            "service.gui.CHAT"));
- conferenceButton
- = new CallToolBarButton(
- ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON),
- CONFERENCE_BUTTON,
- GuiActivator.getResources().getI18NString(
- "service.gui.CREATE_CONFERENCE_CALL"));
+ if(!GuiActivator.getConfigurationService().getBoolean(
+ HIDE_CONFERENCE_BUTON_PROP,
+ false))
+ {
+ conferenceButton
+ = new CallToolBarButton(
+ ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON),
+ CONFERENCE_BUTTON,
+ GuiActivator.getResources().getI18NString(
+ "service.gui.CREATE_CONFERENCE_CALL"));
+ }
+
        desktopSharingButton = new DesktopSharingButton(aCall);
        dialButton
            = new CallToolBarButton(
@@ -1430,14 +1444,16 @@ private void initializeUserInterfaceHierarchy()
        initButtonIndexes();

        chatButton.addActionListener(this);
- conferenceButton.addActionListener(this);
+ if (conferenceButton != null)
+ conferenceButton.addActionListener(this);
        dialButton.addActionListener(this);
        if (infoButton != null)
            infoButton.addActionListener(this);
        mergeButton.addActionListener(this);

        settingsPanel.add(chatButton);
- settingsPanel.add(conferenceButton);
+ if (conferenceButton != null)
+ settingsPanel.add(conferenceButton);
        settingsPanel.add(desktopSharingButton);
        settingsPanel.add(dialButton);
        settingsPanel.add(fullScreenButton);
@@ -1546,11 +1562,14 @@ public void loadSkin()
                ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
        dialButton.setIconImage(
                ImageLoader.getImage(ImageLoader.DIAL_BUTTON));
-
- conferenceButton.setBackgroundImage(
- ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
- conferenceButton.setIconImage(
- ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON));
+
+ if (conferenceButton != null)
+ {
+ conferenceButton.setBackgroundImage(
+ ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
+ conferenceButton.setIconImage(
+ ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON));
+ }

        if (hangupButton != null)
            hangupButton.setBackgroundImage(
diff --git a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
index 308a2d9..87a9b6f 100644
--- a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
@@ -68,7 +68,13 @@
     */
    private static final String AUTO_ANSWER_MENU_DISABLED_PROP =
        "net.java.sip.communicator.impl.gui.main.menus.AUTO_ANSWER_MENU_DISABLED";
-
+
+ /**
+ * Property to disable conference initialization.
+ */
+ private static final String CONFERENCE_CALL_DISABLED_PROP =
+ "net.java.sip.communicator.impl.gui.main.menus.CONFERENCE_CALL_MENU_ITEM_DISABLED";
+
   /**
    * Conference call menu item.
    */
@@ -358,15 +364,24 @@ private void registerMenuItems()
        }

        ResourceManagementService r = GuiActivator.getResources();
-
- conferenceMenuItem
- = new JMenuItem(
- r.getI18NString("service.gui.CREATE_CONFERENCE_CALL"));
- conferenceMenuItem.setMnemonic(
- r.getI18nMnemonic("service.gui.CREATE_CONFERENCE_CALL"));
- conferenceMenuItem.setName("conference");
- conferenceMenuItem.addActionListener(this);
- add(conferenceMenuItem);
+
+
+ Boolean showConferenceMenuItemProp
+ = cfg.getBoolean(
+ CONFERENCE_CALL_DISABLED_PROP,
+ false);
+
+ if(!showConferenceMenuItemProp.booleanValue())
+ {
+ conferenceMenuItem
+ = new JMenuItem(
+ r.getI18NString("service.gui.CREATE_CONFERENCE_CALL"));
+ conferenceMenuItem.setMnemonic(
+ r.getI18nMnemonic("service.gui.CREATE_CONFERENCE_CALL"));
+ conferenceMenuItem.setName("conference");
+ conferenceMenuItem.addActionListener(this);
+ add(conferenceMenuItem);
+ }

        // Add a service listener in order to be notified when a new protocol
        // provider is added or removed and the list should be refreshed.
@@ -715,9 +730,12 @@ private void registerConfigMenuItemNonMacOSX()
    public void loadSkin()
    {
        ResourceManagementService r = GuiActivator.getResources();
-
- conferenceMenuItem.setIcon(
- r.getImage("service.gui.icons.CONFERENCE_CALL"));
+
+ if(conferenceMenuItem != null)
+ {
+ conferenceMenuItem.setIcon(
+ r.getImage("service.gui.icons.CONFERENCE_CALL"));
+ }
        if (configMenuItem != null)
        {
            configMenuItem.setIcon(
--
1.8.4

_______________________________________________
dev mailing list
dev@jitsi.org<mailto:dev@jitsi.org>
Unsubscribe instructions and other list options:
http://lists.jitsi.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
dev@jitsi.org<mailto:dev@jitsi.org>
Unsubscribe instructions and other list options:
http://lists.jitsi.org/mailman/listinfo/dev

--
Toby Pinder | Telemetry Software Engineer

Switchboard +44 (0)845 077 9077

E. toby.pinder@smithelectric.com<mailto:ross.cooney@smithelectric.com>
W. www.smithelectric.com<http://www.smithelectric.com/>

[cid:part6.07020203.00090601@smithelectric.com]

This email and any attachments thereto may contain private, confidential, and privileged material for the sole use of the intended recipient. Any review, copying, or distribution of this email (or any attachments thereto) by others is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently delete the original and any copies of this email and any attachments thereto.


#8

Hello again,

It turns out my company *does* want this functionality (they want to hide everything except calls and chat for now).

I have attached more atomic patches that allows .properties to disable each remaining button in the call UI.

* Video
   * https://github.com/smithev/smithchat-jitsi/commit/678491f86c51cb8d3dcd5e1660b70f3a9483e184
   * video.patch

* Desktop Sharing
   * https://github.com/smithev/smithchat-jitsi/commit/8472d3532688f292f92cba0bf51b60099d601d4d
   * desktop.patch

* Full Screen Toggle
   * https://github.com/smithev/smithchat-jitsi/commit/86e73bd04ba88fe7d177092a728179f4b0e7b962
   * fullscreen.patch

* Show/Hide Local Video
   * https://github.com/smithev/smithchat-jitsi/commit/2555e56e8769f77d0f0b35c17623697903ac9f64
   * togglevideo.patch

In addition to these, I have a patch which will only work if all my "call UI hiding" patches are applied (including those in prior emails to this list), that tidies up some of the logic by using a helper function.

   * https://github.com/smithev/smithchat-jitsi/commit/ce2c2c86c36067bd1651852c5733f67440559d03
   * tidy.patch

I hope these are useful to the Jitsi community: do however bear in mind that these will only have an effect on the in-call user interface - the "disable video" .properties option will only prevent someone from "upgrading" a call to a video call, and not from starting one in the first place. I have attached a screenshot to demonstrate the reduced UI when these features are all disabled.

Many thanks,
Toby Pinder | Software Developer
Smith Electric Vehicles

desktop.patch (3.79 KB)

fullscreen.patch (3.04 KB)

tidy.patch (5.74 KB)

togglevideo.patch (4.15 KB)

video.patch (4.63 KB)

···

------
From: dev-bounces@jitsi.org [mailto:dev-bounces@jitsi.org] On Behalf Of Toby Pinder
Sent: 30 October 2013 15:36
To: dev@jitsi.org
Subject: Re: [jitsi-dev] [patch] .properties option to disable conference calls from UI

Great to hear. We've productionised it (and the other UI hiding patches) without any known issues. Is there demand for similar hiding functionality for Video and Desktop Sharing? My company don't need that but I'd be happy to provide a patch for this too (and try to clean up some of the if logic while I'm at it since by that point nearly every line has an if() around it!)

Many thanks,
Toby Pinder | Software Developer
Smith Electric Vehicles

On 30/10/13 13:55, Yana Stamcheva wrote:
Hi Toby,

Thanks! This is now committed and ack-ed.

(more inline)

On 28 Oct 2013, at 18:06, Toby Pinder <Toby.Pinder@smithelectric.com> wrote:

Hi all,

During my time developing a custom skinned Jitsi I have a need to hide various features from the user through provisioning (mostly so we can make sure they work correctly with our setup). Enclosed is a patch that disables the "conference call" functionality from both the tools menu and the in-call "add users to upgrade to a conference" menu. This allows us to hide this functionality as SDES based encryption does not seem to be compatible with multiple users like this.

It introduces two new .properties options:

* net.java.sip.communicator.impl.gui.main.call.HIDE_CONFERENCE_BUTTON
   This option hides the "upgrade to conference by adding users" button that is normally available during a call.

* net.java.sip.communicator.impl.gui.main.menus.CONFERENCE_CALL_MENU_ITEM_DISABLED
   This option disables the creation of a conference from scratch, using the "Tools->Create A Conference call..." option.

I considered consolidating the two into one specific option, and I leave that up for discussion. I personally feel that a call "upgrade" is distinct from a conference starting from scratch.

I liked the separation and committed your patch without any modifications.

I have enumerated a few potential issues in this patch that might need discussion before merging:

* The addition of several "if not null" blocks across the affected classes. This is how similar functionality has been achieved by other elements in the same classes, but it may be at the point where it can be tidied up.

* My unfamiliarity with the codebase could mean there are additional potential NullPointerExceptions that I missed. I thoroughly tested calls using XMPP, but other protocols may introduce things I missed. This did seem to me to be a moot point due to the way Jitsi separates views and interfaces from actual implementations, but I am necessarily timid with my first contributions to this codebase!

Agree that this approach could be bug friendly. We don't have the time of refactoring this piece of code right now, but if you have a suggestion/patch with another approach (taking into account all existing properties in CallPanel of course) we're willing to review and apply it.

* From a design perspective it may be decided that such granular configuration is unnecessary.

The commit is available at
https://github.com/smithev/smithchat-jitsi/commit/c891bf71b074ee6040d39e4409e6c3eb7330dc24
for easier review.

I am going to continue adding .properties options to hide UI elements like Call Holding, Screen Recording and Video in my fork, but will create .patches and post them here for possible integration if deemed useful.

Great.

As I have mentioned on my prior patch, comments and corrections to both patch and process are welcome: I'm new to the Jitsi codebase and OSS dev in general.

You're doing really good, your patches are very clean.

Thanks!
Yana

PS: If anyone wants to look at SDES-based Conference Calling, I'd be happy to help test and provide stacktraces/logs as needed. It's not something we need right now (and it's too low level for me to take a stab at it) but it'd be cool to get a feature parity with ZRTP so there's no need to hide such things.

Many thanks,
---------------------------------
Toby Pinder | Software Developer
E. toby.pinder@smithelectric.com
W. www.smithelectric.com

---
.../communicator/impl/gui/main/call/CallPanel.java | 51 +++++++++++++++-------
.../impl/gui/main/menus/ToolsMenu.java | 44 +++++++++++++------
2 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
index e7dfe9e..05faa0c 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
@@ -111,6 +111,12 @@
     */
    private static final String HIDE_CALL_INFO_BUTON_PROP
        = "net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_INFO_BUTTON";
+
+ /**
+ * Property to disable the conference "add to call" button.
+ */
+ private static final String HIDE_CONFERENCE_BUTON_PROP
+ = "net.java.sip.communicator.impl.gui.main.call.HIDE_CONFERENCE_BUTTON";

    /**
     * Property to disable the record button.
@@ -870,8 +876,9 @@ private void doUpdateSettingsPanelInEventDispatchThread(
                allCallsConnected = false;
            }
        }
-
- conferenceButton.setEnabled(telephonyConferencing);
+
+ if(conferenceButton != null)
+ conferenceButton.setEnabled(telephonyConferencing);
        transferCallButton.setEnabled(advancedTelephony);
        transferCallButton.setVisible(!callConference.isConferenceFocus());

@@ -1255,7 +1262,8 @@ public int getMinimumButtonWidth()
    private void initButtonIndexes()
    {
        dialButton.setIndex(0);
- conferenceButton.setIndex(1);
+ if (conferenceButton != null)
+ conferenceButton.setIndex(1);
        holdButton.setIndex(2);
        if (recordButton != null)
            recordButton.setIndex(3);
@@ -1364,12 +1372,18 @@ private void initializeUserInterfaceHierarchy()
                    CHAT_BUTTON,
                    GuiActivator.getResources().getI18NString(
                            "service.gui.CHAT"));
- conferenceButton
- = new CallToolBarButton(
- ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON),
- CONFERENCE_BUTTON,
- GuiActivator.getResources().getI18NString(
- "service.gui.CREATE_CONFERENCE_CALL"));
+ if(!GuiActivator.getConfigurationService().getBoolean(
+ HIDE_CONFERENCE_BUTON_PROP,
+ false))
+ {
+ conferenceButton
+ = new CallToolBarButton(
+ ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON),
+ CONFERENCE_BUTTON,
+ GuiActivator.getResources().getI18NString(
+ "service.gui.CREATE_CONFERENCE_CALL"));
+ }
+
        desktopSharingButton = new DesktopSharingButton(aCall);
        dialButton
            = new CallToolBarButton(
@@ -1430,14 +1444,16 @@ private void initializeUserInterfaceHierarchy()
        initButtonIndexes();

        chatButton.addActionListener(this);
- conferenceButton.addActionListener(this);
+ if (conferenceButton != null)
+ conferenceButton.addActionListener(this);
        dialButton.addActionListener(this);
        if (infoButton != null)
            infoButton.addActionListener(this);
        mergeButton.addActionListener(this);

        settingsPanel.add(chatButton);
- settingsPanel.add(conferenceButton);
+ if (conferenceButton != null)
+ settingsPanel.add(conferenceButton);
        settingsPanel.add(desktopSharingButton);
        settingsPanel.add(dialButton);
        settingsPanel.add(fullScreenButton);
@@ -1546,11 +1562,14 @@ public void loadSkin()
                ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
        dialButton.setIconImage(
                ImageLoader.getImage(ImageLoader.DIAL_BUTTON));
-
- conferenceButton.setBackgroundImage(
- ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
- conferenceButton.setIconImage(
- ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON));
+
+ if (conferenceButton != null)
+ {
+ conferenceButton.setBackgroundImage(
+ ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
+ conferenceButton.setIconImage(
+ ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON));
+ }

        if (hangupButton != null)
            hangupButton.setBackgroundImage(
diff --git a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
index 308a2d9..87a9b6f 100644
--- a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
@@ -68,7 +68,13 @@
     */
    private static final String AUTO_ANSWER_MENU_DISABLED_PROP =
        "net.java.sip.communicator.impl.gui.main.menus.AUTO_ANSWER_MENU_DISABLED";
-
+
+ /**
+ * Property to disable conference initialization.
+ */
+ private static final String CONFERENCE_CALL_DISABLED_PROP =
+ "net.java.sip.communicator.impl.gui.main.menus.CONFERENCE_CALL_MENU_ITEM_DISABLED";
+
   /**
    * Conference call menu item.
    */
@@ -358,15 +364,24 @@ private void registerMenuItems()
        }

        ResourceManagementService r = GuiActivator.getResources();
-
- conferenceMenuItem
- = new JMenuItem(
- r.getI18NString("service.gui.CREATE_CONFERENCE_CALL"));
- conferenceMenuItem.setMnemonic(
- r.getI18nMnemonic("service.gui.CREATE_CONFERENCE_CALL"));
- conferenceMenuItem.setName("conference");
- conferenceMenuItem.addActionListener(this);
- add(conferenceMenuItem);
+
+
+ Boolean showConferenceMenuItemProp
+ = cfg.getBoolean(
+ CONFERENCE_CALL_DISABLED_PROP,
+ false);
+
+ if(!showConferenceMenuItemProp.booleanValue())
+ {
+ conferenceMenuItem
+ = new JMenuItem(
+ r.getI18NString("service.gui.CREATE_CONFERENCE_CALL"));
+ conferenceMenuItem.setMnemonic(
+ r.getI18nMnemonic("service.gui.CREATE_CONFERENCE_CALL"));
+ conferenceMenuItem.setName("conference");
+ conferenceMenuItem.addActionListener(this);
+ add(conferenceMenuItem);
+ }

        // Add a service listener in order to be notified when a new protocol
        // provider is added or removed and the list should be refreshed.
@@ -715,9 +730,12 @@ private void registerConfigMenuItemNonMacOSX()
    public void loadSkin()
    {
        ResourceManagementService r = GuiActivator.getResources();
-
- conferenceMenuItem.setIcon(
- r.getImage("service.gui.icons.CONFERENCE_CALL"));
+
+ if(conferenceMenuItem != null)
+ {
+ conferenceMenuItem.setIcon(
+ r.getImage("service.gui.icons.CONFERENCE_CALL"));
+ }
        if (configMenuItem != null)
        {
            configMenuItem.setIcon(
--
1.8.4

_______________________________________________
dev mailing list
dev@jitsi.org
Unsubscribe instructions and other list options:
http://lists.jitsi.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
dev@jitsi.org
Unsubscribe instructions and other list options:
http://lists.jitsi.org/mailman/listinfo/dev

--
Toby Pinder | Telemetry Software Engineer

Switchboard +44 (0)845 077 9077

E. toby.pinder@smithelectric.com
W. www.smithelectric.com

This email and any attachments thereto may contain private, confidential, and privileged material for the sole use of the intended recipient. Any review, copying, or distribution of this email (or any attachments thereto) by others is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently delete the original and any copies of this email and any attachments thereto.


#9

Hi Toby,

These are now committed and ack-ed. Thanks!

Cheers,
Yana

···

On 29 Oct 2013, at 12:19, Toby Pinder <Toby.Pinder@smithelectric.com> wrote:

Hi all,

I am continuing to add more .properties options to hide various elements and features of the UI.

In-Call Dial Button -
   Property: net.java.sip.communicator.impl.gui.main.call.HIDE_DIAL_BUTTON
   Patch: dial.a7ed38.patch
   Github: https://github.com/smithev/smithchat-jitsi/commit/a7ed38c584fc7a5e92d8bd9bde41c6394b2375c7

In-Call Merge Button -
   Property: net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_MERGE_BUTTON
   Patch: merge.d7ca81.patch
   Github: https://github.com/smithev/smithchat-jitsi/commit/d7ca8165c10a8dab832412347246a8f3bad75f8e

In-Call Transfer Button -
   Property: net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_TRANSFER_BUTTON
   Patch: transfer.9114ea.patch
   Github: https://github.com/smithev/smithchat-jitsi/commit/9114ea923760b51b9391807bcfae3addcc07a2d2

In-Call Hold Button -
   Property: net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_HOLD_BUTTON
   Patch: hold.77c2de.patch
   Github: https://github.com/smithev/smithchat-jitsi/commit/77c2defb369bd5427c3bb569f2d084486137f00f

These changes are mostly necessitated by features having apparent issues with various parts of the SDES support, which I'll be detailing on this list at a later date so that they can be added to the bug tracker. We're also trying to simplify the tool to increase adoption from Skype/Webex, then "add" features later.

If there is interest in getting these patches accepted, I will provide similar .properties fields for optional hiding of the other buttons in the UI across the board, and work at tidying up the vast amount of "if" statements in the class's methods.

These changes can be viewed as an atomic unit of this is preferred: I wasn't sure which would be the best option.

Visual: https://github.com/smithev/smithchat-jitsi/compare/c891bf71b074ee6040d39e4409e6c3eb7330dc24...77c2defb369bd5427c3bb569f2d084486137f00f
Diff: https://github.com/smithev/smithchat-jitsi/compare/c891bf71b074ee6040d39e4409e6c3eb7330dc24...77c2defb369bd5427c3bb569f2d084486137f00f.diff

I'm happy to update the provisioning wiki documentation with details of these configuration options should the patches be accepted.

Many thanks,
Toby Pinder | Software Developer
Smith Electric Vehicles
<dial.a7ed38.patch><merge.d7ca81.patch><hold.77c2de.patch><transfer.9114ea.patch>_______________________________________________
dev mailing list
dev@jitsi.org
Unsubscribe instructions and other list options:
http://lists.jitsi.org/mailman/listinfo/dev


#10

Hey Toby,

Committed and ack-ed (commit 9b94292).

Thanks!
Yana

···

On 31 Oct 2013, at 17:32, Toby Pinder <Toby.Pinder@smithelectric.com> wrote:

Hello again,

It turns out my company *does* want this functionality (they want to hide everything except calls and chat for now).

I have attached more atomic patches that allows .properties to disable each remaining button in the call UI.

* Video
  * https://github.com/smithev/smithchat-jitsi/commit/678491f86c51cb8d3dcd5e1660b70f3a9483e184
  * video.patch

* Desktop Sharing
  * https://github.com/smithev/smithchat-jitsi/commit/8472d3532688f292f92cba0bf51b60099d601d4d
  * desktop.patch

* Full Screen Toggle
  * https://github.com/smithev/smithchat-jitsi/commit/86e73bd04ba88fe7d177092a728179f4b0e7b962
  * fullscreen.patch

* Show/Hide Local Video
  * https://github.com/smithev/smithchat-jitsi/commit/2555e56e8769f77d0f0b35c17623697903ac9f64
  * togglevideo.patch

In addition to these, I have a patch which will only work if all my "call UI hiding" patches are applied (including those in prior emails to this list), that tidies up some of the logic by using a helper function.

  * https://github.com/smithev/smithchat-jitsi/commit/ce2c2c86c36067bd1651852c5733f67440559d03
  * tidy.patch

I hope these are useful to the Jitsi community: do however bear in mind that these will only have an effect on the in-call user interface - the "disable video" .properties option will only prevent someone from "upgrading" a call to a video call, and not from starting one in the first place. I have attached a screenshot to demonstrate the reduced UI when these features are all disabled.

Many thanks,
Toby Pinder | Software Developer
Smith Electric Vehicles

------
From: dev-bounces@jitsi.org [mailto:dev-bounces@jitsi.org] On Behalf Of Toby Pinder
Sent: 30 October 2013 15:36
To: dev@jitsi.org
Subject: Re: [jitsi-dev] [patch] .properties option to disable conference calls from UI

Great to hear. We've productionised it (and the other UI hiding patches) without any known issues. Is there demand for similar hiding functionality for Video and Desktop Sharing? My company don't need that but I'd be happy to provide a patch for this too (and try to clean up some of the if logic while I'm at it since by that point nearly every line has an if() around it!)

Many thanks,
Toby Pinder | Software Developer
Smith Electric Vehicles

On 30/10/13 13:55, Yana Stamcheva wrote:
Hi Toby,

Thanks! This is now committed and ack-ed.

(more inline)

On 28 Oct 2013, at 18:06, Toby Pinder <Toby.Pinder@smithelectric.com> wrote:

Hi all,

During my time developing a custom skinned Jitsi I have a need to hide various features from the user through provisioning (mostly so we can make sure they work correctly with our setup). Enclosed is a patch that disables the "conference call" functionality from both the tools menu and the in-call "add users to upgrade to a conference" menu. This allows us to hide this functionality as SDES based encryption does not seem to be compatible with multiple users like this.

It introduces two new .properties options:

* net.java.sip.communicator.impl.gui.main.call.HIDE_CONFERENCE_BUTTON
  This option hides the "upgrade to conference by adding users" button that is normally available during a call.

* net.java.sip.communicator.impl.gui.main.menus.CONFERENCE_CALL_MENU_ITEM_DISABLED
  This option disables the creation of a conference from scratch, using the "Tools->Create A Conference call..." option.

I considered consolidating the two into one specific option, and I leave that up for discussion. I personally feel that a call "upgrade" is distinct from a conference starting from scratch.

I liked the separation and committed your patch without any modifications.

I have enumerated a few potential issues in this patch that might need discussion before merging:

* The addition of several "if not null" blocks across the affected classes. This is how similar functionality has been achieved by other elements in the same classes, but it may be at the point where it can be tidied up.

* My unfamiliarity with the codebase could mean there are additional potential NullPointerExceptions that I missed. I thoroughly tested calls using XMPP, but other protocols may introduce things I missed. This did seem to me to be a moot point due to the way Jitsi separates views and interfaces from actual implementations, but I am necessarily timid with my first contributions to this codebase!

Agree that this approach could be bug friendly. We don't have the time of refactoring this piece of code right now, but if you have a suggestion/patch with another approach (taking into account all existing properties in CallPanel of course) we're willing to review and apply it.

* From a design perspective it may be decided that such granular configuration is unnecessary.

The commit is available at
https://github.com/smithev/smithchat-jitsi/commit/c891bf71b074ee6040d39e4409e6c3eb7330dc24
for easier review.

I am going to continue adding .properties options to hide UI elements like Call Holding, Screen Recording and Video in my fork, but will create .patches and post them here for possible integration if deemed useful.

Great.

As I have mentioned on my prior patch, comments and corrections to both patch and process are welcome: I'm new to the Jitsi codebase and OSS dev in general.

You're doing really good, your patches are very clean.

Thanks!
Yana

PS: If anyone wants to look at SDES-based Conference Calling, I'd be happy to help test and provide stacktraces/logs as needed. It's not something we need right now (and it's too low level for me to take a stab at it) but it'd be cool to get a feature parity with ZRTP so there's no need to hide such things.

Many thanks,
---------------------------------
Toby Pinder | Software Developer
E. toby.pinder@smithelectric.com
W. www.smithelectric.com

---
.../communicator/impl/gui/main/call/CallPanel.java | 51 +++++++++++++++-------
.../impl/gui/main/menus/ToolsMenu.java | 44 +++++++++++++------
2 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
index e7dfe9e..05faa0c 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
@@ -111,6 +111,12 @@
    */
   private static final String HIDE_CALL_INFO_BUTON_PROP
       = "net.java.sip.communicator.impl.gui.main.call.HIDE_CALL_INFO_BUTTON";
+
+ /**
+ * Property to disable the conference "add to call" button.
+ */
+ private static final String HIDE_CONFERENCE_BUTON_PROP
+ = "net.java.sip.communicator.impl.gui.main.call.HIDE_CONFERENCE_BUTTON";

   /**
    * Property to disable the record button.
@@ -870,8 +876,9 @@ private void doUpdateSettingsPanelInEventDispatchThread(
               allCallsConnected = false;
           }
       }
-
- conferenceButton.setEnabled(telephonyConferencing);
+
+ if(conferenceButton != null)
+ conferenceButton.setEnabled(telephonyConferencing);
       transferCallButton.setEnabled(advancedTelephony);
       transferCallButton.setVisible(!callConference.isConferenceFocus());

@@ -1255,7 +1262,8 @@ public int getMinimumButtonWidth()
   private void initButtonIndexes()
   {
       dialButton.setIndex(0);
- conferenceButton.setIndex(1);
+ if (conferenceButton != null)
+ conferenceButton.setIndex(1);
       holdButton.setIndex(2);
       if (recordButton != null)
           recordButton.setIndex(3);
@@ -1364,12 +1372,18 @@ private void initializeUserInterfaceHierarchy()
                   CHAT_BUTTON,
                   GuiActivator.getResources().getI18NString(
                           "service.gui.CHAT"));
- conferenceButton
- = new CallToolBarButton(
- ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON),
- CONFERENCE_BUTTON,
- GuiActivator.getResources().getI18NString(
- "service.gui.CREATE_CONFERENCE_CALL"));
+ if(!GuiActivator.getConfigurationService().getBoolean(
+ HIDE_CONFERENCE_BUTON_PROP,
+ false))
+ {
+ conferenceButton
+ = new CallToolBarButton(
+ ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON),
+ CONFERENCE_BUTTON,
+ GuiActivator.getResources().getI18NString(
+ "service.gui.CREATE_CONFERENCE_CALL"));
+ }
+
       desktopSharingButton = new DesktopSharingButton(aCall);
       dialButton
           = new CallToolBarButton(
@@ -1430,14 +1444,16 @@ private void initializeUserInterfaceHierarchy()
       initButtonIndexes();

       chatButton.addActionListener(this);
- conferenceButton.addActionListener(this);
+ if (conferenceButton != null)
+ conferenceButton.addActionListener(this);
       dialButton.addActionListener(this);
       if (infoButton != null)
           infoButton.addActionListener(this);
       mergeButton.addActionListener(this);

       settingsPanel.add(chatButton);
- settingsPanel.add(conferenceButton);
+ if (conferenceButton != null)
+ settingsPanel.add(conferenceButton);
       settingsPanel.add(desktopSharingButton);
       settingsPanel.add(dialButton);
       settingsPanel.add(fullScreenButton);
@@ -1546,11 +1562,14 @@ public void loadSkin()
               ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
       dialButton.setIconImage(
               ImageLoader.getImage(ImageLoader.DIAL_BUTTON));
-
- conferenceButton.setBackgroundImage(
- ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
- conferenceButton.setIconImage(
- ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON));
+
+ if (conferenceButton != null)
+ {
+ conferenceButton.setBackgroundImage(
+ ImageLoader.getImage(ImageLoader.CALL_SETTING_BUTTON_BG));
+ conferenceButton.setIconImage(
+ ImageLoader.getImage(ImageLoader.ADD_TO_CALL_BUTTON));
+ }

       if (hangupButton != null)
           hangupButton.setBackgroundImage(
diff --git a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
index 308a2d9..87a9b6f 100644
--- a/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
+++ b/src/net/java/sip/communicator/impl/gui/main/menus/ToolsMenu.java
@@ -68,7 +68,13 @@
    */
   private static final String AUTO_ANSWER_MENU_DISABLED_PROP =
       "net.java.sip.communicator.impl.gui.main.menus.AUTO_ANSWER_MENU_DISABLED";
-
+
+ /**
+ * Property to disable conference initialization.
+ */
+ private static final String CONFERENCE_CALL_DISABLED_PROP =
+ "net.java.sip.communicator.impl.gui.main.menus.CONFERENCE_CALL_MENU_ITEM_DISABLED";
+
  /**
   * Conference call menu item.
   */
@@ -358,15 +364,24 @@ private void registerMenuItems()
       }

       ResourceManagementService r = GuiActivator.getResources();
-
- conferenceMenuItem
- = new JMenuItem(
- r.getI18NString("service.gui.CREATE_CONFERENCE_CALL"));
- conferenceMenuItem.setMnemonic(
- r.getI18nMnemonic("service.gui.CREATE_CONFERENCE_CALL"));
- conferenceMenuItem.setName("conference");
- conferenceMenuItem.addActionListener(this);
- add(conferenceMenuItem);
+
+
+ Boolean showConferenceMenuItemProp
+ = cfg.getBoolean(
+ CONFERENCE_CALL_DISABLED_PROP,
+ false);
+
+ if(!showConferenceMenuItemProp.booleanValue())
+ {
+ conferenceMenuItem
+ = new JMenuItem(
+ r.getI18NString("service.gui.CREATE_CONFERENCE_CALL"));
+ conferenceMenuItem.setMnemonic(
+ r.getI18nMnemonic("service.gui.CREATE_CONFERENCE_CALL"));
+ conferenceMenuItem.setName("conference");
+ conferenceMenuItem.addActionListener(this);
+ add(conferenceMenuItem);
+ }

       // Add a service listener in order to be notified when a new protocol
       // provider is added or removed and the list should be refreshed.
@@ -715,9 +730,12 @@ private void registerConfigMenuItemNonMacOSX()
   public void loadSkin()
   {
       ResourceManagementService r = GuiActivator.getResources();
-
- conferenceMenuItem.setIcon(
- r.getImage("service.gui.icons.CONFERENCE_CALL"));
+
+ if(conferenceMenuItem != null)
+ {
+ conferenceMenuItem.setIcon(
+ r.getImage("service.gui.icons.CONFERENCE_CALL"));
+ }
       if (configMenuItem != null)
       {
           configMenuItem.setIcon(
--
1.8.4

_______________________________________________
dev mailing list
dev@jitsi.org
Unsubscribe instructions and other list options:
http://lists.jitsi.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
dev@jitsi.org
Unsubscribe instructions and other list options:
http://lists.jitsi.org/mailman/listinfo/dev

--
Toby Pinder | Telemetry Software Engineer

Switchboard +44 (0)845 077 9077

E. toby.pinder@smithelectric.com
W. www.smithelectric.com

This email and any attachments thereto may contain private, confidential, and privileged material for the sole use of the intended recipient. Any review, copying, or distribution of this email (or any attachments thereto) by others is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently delete the original and any copies of this email and any attachments thereto.
<desktop.patch><fullscreen.patch><tidy.patch><togglevideo.patch><video.patch><jitsi_buttons_removed.png>_______________________________________________
dev mailing list
dev@jitsi.org
Unsubscribe instructions and other list options:
http://lists.jitsi.org/mailman/listinfo/dev