From 94ee4e2f2e8e93552dde615d834cfc1f07ebed9d Mon Sep 17 00:00:00 2001 From: Yana Stamcheva Date: Fri, 2 Sep 2011 09:47:07 +0000 Subject: [PATCH] Adds a general dial pad in the contact list. --- resources/images/images.properties | 28 + .../gui/buttons/contactListDialButton.png | Bin 0 -> 1309 bytes .../buttons/contactListDialButtonPressed.png | Bin 0 -> 1464 bytes .../impl/gui/buttons/dialPadCallButtonBg.png | Bin 0 -> 1198 bytes .../buttons/dialPadCallButtonBgRollover.png | Bin 0 -> 1216 bytes resources/images/impl/gui/buttons/diezMac.png | Bin 0 -> 1313 bytes .../impl/gui/buttons/diezMacRollover.png | Bin 0 -> 1328 bytes .../images/impl/gui/buttons/eightMac.png | Bin 0 -> 1732 bytes .../impl/gui/buttons/eightMacRollover.png | Bin 0 -> 1761 bytes resources/images/impl/gui/buttons/fiveMac.png | Bin 0 -> 1548 bytes .../impl/gui/buttons/fiveMacRollover.png | Bin 0 -> 1591 bytes resources/images/impl/gui/buttons/fourMac.png | Bin 0 -> 1588 bytes .../impl/gui/buttons/fourMacRollover.png | Bin 0 -> 1626 bytes resources/images/impl/gui/buttons/nineMac.png | Bin 0 -> 1877 bytes .../impl/gui/buttons/nineMacRollover.png | Bin 0 -> 1895 bytes resources/images/impl/gui/buttons/oneMac.png | Bin 0 -> 1228 bytes .../impl/gui/buttons/oneMacRollover.png | Bin 0 -> 1244 bytes .../images/impl/gui/buttons/sevenMac.png | Bin 0 -> 1784 bytes .../impl/gui/buttons/sevenMacRollover.png | Bin 0 -> 1797 bytes resources/images/impl/gui/buttons/sixMac.png | Bin 0 -> 1805 bytes .../impl/gui/buttons/sixMacRollover.png | Bin 0 -> 1844 bytes .../impl/gui/buttons/src/dialNumbers.svg | 1080 ++++++++++++++++- resources/images/impl/gui/buttons/starMac.png | Bin 0 -> 1384 bytes .../impl/gui/buttons/starMacRollover.png | Bin 0 -> 1383 bytes .../images/impl/gui/buttons/threeMac.png | Bin 0 -> 1680 bytes .../impl/gui/buttons/threeMacRollover.png | Bin 0 -> 1683 bytes resources/images/impl/gui/buttons/twoMac.png | Bin 0 -> 1706 bytes .../impl/gui/buttons/twoMacRollover.png | Bin 0 -> 1716 bytes resources/images/impl/gui/buttons/zeroMac.png | Bin 0 -> 1451 bytes .../impl/gui/buttons/zeroMacRollover.png | Bin 0 -> 1479 bytes resources/languages/resources.properties | 2 +- .../impl/gui/main/DialPadButton.java | 62 + .../impl/gui/main/DialPadFieldUI.java | 93 ++ .../impl/gui/main/GeneralDialPadDialog.java | 320 +++++ .../impl/gui/main/GeneralDialPanel.java | 244 ++++ .../communicator/impl/gui/main/MainFrame.java | 3 +- .../gui/main/call/CallInterfaceListener.java | 21 + .../impl/gui/main/call/CallManager.java | 33 +- .../main/call/ChooseCallAccountPopupMenu.java | 28 + .../impl/gui/main/call/DTMFHandler.java | 140 ++- .../gui/main/contactlist/SearchFieldUI.java | 2 +- .../impl/gui/utils/ImageLoader.java | 168 +++ .../util/swing/SIPCommDialog.java | 13 +- .../util/swing/plaf/SIPCommTextFieldUI.java | 46 +- 44 files changed, 2243 insertions(+), 40 deletions(-) create mode 100644 resources/images/impl/gui/buttons/contactListDialButton.png create mode 100644 resources/images/impl/gui/buttons/contactListDialButtonPressed.png create mode 100644 resources/images/impl/gui/buttons/dialPadCallButtonBg.png create mode 100644 resources/images/impl/gui/buttons/dialPadCallButtonBgRollover.png create mode 100644 resources/images/impl/gui/buttons/diezMac.png create mode 100644 resources/images/impl/gui/buttons/diezMacRollover.png create mode 100644 resources/images/impl/gui/buttons/eightMac.png create mode 100644 resources/images/impl/gui/buttons/eightMacRollover.png create mode 100644 resources/images/impl/gui/buttons/fiveMac.png create mode 100644 resources/images/impl/gui/buttons/fiveMacRollover.png create mode 100644 resources/images/impl/gui/buttons/fourMac.png create mode 100644 resources/images/impl/gui/buttons/fourMacRollover.png create mode 100644 resources/images/impl/gui/buttons/nineMac.png create mode 100644 resources/images/impl/gui/buttons/nineMacRollover.png create mode 100644 resources/images/impl/gui/buttons/oneMac.png create mode 100644 resources/images/impl/gui/buttons/oneMacRollover.png create mode 100644 resources/images/impl/gui/buttons/sevenMac.png create mode 100644 resources/images/impl/gui/buttons/sevenMacRollover.png create mode 100644 resources/images/impl/gui/buttons/sixMac.png create mode 100644 resources/images/impl/gui/buttons/sixMacRollover.png create mode 100644 resources/images/impl/gui/buttons/starMac.png create mode 100644 resources/images/impl/gui/buttons/starMacRollover.png create mode 100644 resources/images/impl/gui/buttons/threeMac.png create mode 100644 resources/images/impl/gui/buttons/threeMacRollover.png create mode 100644 resources/images/impl/gui/buttons/twoMac.png create mode 100644 resources/images/impl/gui/buttons/twoMacRollover.png create mode 100644 resources/images/impl/gui/buttons/zeroMac.png create mode 100644 resources/images/impl/gui/buttons/zeroMacRollover.png create mode 100644 src/net/java/sip/communicator/impl/gui/main/DialPadButton.java create mode 100644 src/net/java/sip/communicator/impl/gui/main/DialPadFieldUI.java create mode 100644 src/net/java/sip/communicator/impl/gui/main/GeneralDialPadDialog.java create mode 100755 src/net/java/sip/communicator/impl/gui/main/GeneralDialPanel.java create mode 100644 src/net/java/sip/communicator/impl/gui/main/call/CallInterfaceListener.java diff --git a/resources/images/images.properties b/resources/images/images.properties index eaafc174c..8005fa51c 100644 --- a/resources/images/images.properties +++ b/resources/images/images.properties @@ -154,6 +154,30 @@ service.gui.buttons.NINE_DIAL_BUTTON=resources/images/impl/gui/buttons/nine.png service.gui.buttons.STAR_DIAL_BUTTON=resources/images/impl/gui/buttons/star.png service.gui.buttons.ZERO_DIAL_BUTTON=resources/images/impl/gui/buttons/zero.png service.gui.buttons.DIEZ_DIAL_BUTTON=resources/images/impl/gui/buttons/diez.png +service.gui.buttons.ONE_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/oneMac.png +service.gui.buttons.TWO_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/twoMac.png +service.gui.buttons.THREE_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/threeMac.png +service.gui.buttons.FOUR_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/fourMac.png +service.gui.buttons.FIVE_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/fiveMac.png +service.gui.buttons.SIX_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/sixMac.png +service.gui.buttons.SEVEN_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/sevenMac.png +service.gui.buttons.EIGHT_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/eightMac.png +service.gui.buttons.NINE_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/nineMac.png +service.gui.buttons.STAR_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/starMac.png +service.gui.buttons.ZERO_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/zeroMac.png +service.gui.buttons.DIEZ_DIAL_BUTTON_MAC=resources/images/impl/gui/buttons/diezMac.png +service.gui.buttons.ONE_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/oneMacRollover.png +service.gui.buttons.TWO_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/twoMacRollover.png +service.gui.buttons.THREE_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/threeMacRollover.png +service.gui.buttons.FOUR_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/fourMacRollover.png +service.gui.buttons.FIVE_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/fiveMacRollover.png +service.gui.buttons.SIX_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/sixMacRollover.png +service.gui.buttons.SEVEN_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/sevenMacRollover.png +service.gui.buttons.EIGHT_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/eightMacRollover.png +service.gui.buttons.NINE_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/nineMacRollover.png +service.gui.buttons.STAR_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/starMacRollover.png +service.gui.buttons.ZERO_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/zeroMacRollover.png +service.gui.buttons.DIEZ_DIAL_BUTTON_MAC_ROLLOVER=resources/images/impl/gui/buttons/diezMacRollover.png service.gui.buttons.CALL_PANEL_MINIMIZE_BUTTON=resources/images/impl/gui/buttons/callPanelMinimizeButton.png service.gui.buttons.CALL_PANEL_RESTORE_BUTTON=resources/images/impl/gui/buttons/callPanelRestoreButton.png service.gui.buttons.CALL_PANEL_MINIMIZE_ROLLOVER_BUTTON=resources/images/impl/gui/buttons/callPanelMinimizeButtonRollover.png @@ -218,6 +242,10 @@ service.gui.buttons.TRANSPARENT_WINDOW_BUTTON=resources/images/impl/gui/buttons/ service.gui.buttons.HD_VIDEO_BUTTON=resources/images/impl/gui/buttons/hdVideo.png service.gui.buttons.SD_VIDEO_BUTTON=resources/images/impl/gui/buttons/sdVideo.png service.gui.buttons.LO_VIDEO_BUTTON=resources/images/impl/gui/buttons/loVideo.png +service.gui.buttons.CONTACT_LIST_DIAL_BUTTON=resources/images/impl/gui/buttons/contactListDialButton.png +service.gui.buttons.CONTACT_LIST_DIAL_BUTTON_PRESSED=resources/images/impl/gui/buttons/contactListDialButtonPressed.png +service.gui.buttons.DIAL_PAD_CALL_BUTTON_BG=resources/images/impl/gui/buttons/dialPadCallButtonBg.png +service.gui.buttons.DIAL_PAD_CALL_BUTTON_ROLLOVER_BG=resources/images/impl/gui/buttons/dialPadCallButtonBgRollover.png # Sound level icons service.gui.soundlevel.SOUND_LEVEL_ACTIVE=resources/images/impl/gui/common/soundlevel/soundActive.png diff --git a/resources/images/impl/gui/buttons/contactListDialButton.png b/resources/images/impl/gui/buttons/contactListDialButton.png new file mode 100644 index 0000000000000000000000000000000000000000..50bd8e085018b51ce34f537cb867f97704ad55bb GIT binary patch literal 1309 zcmV+&1>*XNP)W%Kuk8RO$@Ff*=x0=fu>Ph=4e`WfEKml zY41?DyM0($7&~BJw*9_6&;4GWdtUy}g9w5EVzAro3IKQ;!?2Smik<|3qbQ0>M9Bca zaU2f-zi}M5$g=Dr0Q~6ndS8ff5wXy=wzf75!#=I8tzAEU{P^?w`ucUF(MabD%pepB zmHPdDbubt#Us_sHvn)F>KR-WTFw}0hmth$8c~w=Feq?0iCzVQ-EEbdx@pxQ5G&J;9 zG#Y)vvg`+5uQ&0xP`llJ7{jpp-QC?wJv}|YiWw!7Nz~`_y|%EhVA$H)QdU-0ZZTOH=C0wjYuD=M=H}i>rBWpT z0A{m!>FU+1vm%C_p-|{`006mM{$gNYV5+I9DVEKN$K&$e-rkPAy}c6>0BE#YtzofE z({S;JvKIGTUl8#ba!_L1wnZ1cDvh6Cez-PD_1@% z;h zAqWDk*XuW*K7EQtqfx4^t}Z5%$$EEe*3JhK3Q>|Ou>U>N3ox7&RmK@dUgYP)>-@&gn_l>|Yob#-+e zoH=vGWH1;aJkLMT>2$x8mX@Z)0$nbb$?bMqSe9+b^!>k=csBmi=SnvI&4=0VE$whI Td$IWe00000NkvXXu0mjfT-|Bs literal 0 HcmV?d00001 diff --git a/resources/images/impl/gui/buttons/contactListDialButtonPressed.png b/resources/images/impl/gui/buttons/contactListDialButtonPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5754f78aee9f96716156b78350ce48b8006f98 GIT binary patch literal 1464 zcmV;p1xNacP)r?zJ>%&D;qWkSe`yx?&YAO_x#ygFugh^9R8p{Kz|AO)Y7&h}oW>}jjhqqAC~;9r zzz6}Q8xJGIA%qqv6=oS@V}$ZCM#=b(Ute0SU~zE~+kQYGVE)FJT+zlwQ6Bi};`_!fXz1NfG>^<5c17F` zVGpC52AZbf?Afyjhr`e`4TKN?fa5rDxi*3_O%uz@%b1#)!owvo_amRrc>er3=H}*LnkE8)0QT?S z4_(($UtfMzRzn^nO*M;OWv)9(P$KbK%hL9Wf`5Fov5TpB=S0yf`CJZ4wciesri2%dWj3y z?@atrLnThTo4j0Q!gfb;ppRBP6PDwZAj0TxdsA{~huz;bVA!ITc0Kn+zC^+ZHX0s3k z0mH+?Fimq;9(QUzp9g0wNI7Q!szVLKfMJw-8|ic!06-~4E|)9knlV<@4*-aqf{Khj zwIKuvN_!d}Ja`a2Jw15*_%V{nB>MaN;q&=0G&BTF)6mz~hg>d)L?TfYEXxW+#-0kC zv1HLzJwj0wq3b&8>goV&Y#O?*!*LuCLZIt9B9X|hiruL|upY9=ldg}y`Ju1IwK^mh zja?PIDM^wb%QCXrENt6`*SpcunM?+nroruYqgX7$FpR3z8;!l4i$=RYq>{*zj!=_> zl~v(XUgCT{k9D&Qo#DAs S+I;5#0000Px#24YJ`L;!&Rf&hgIrkWf8000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipiA z5G*4LSM%rq000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000CDNkl|Y!gBx001FqV~kR|LOgSQ?z++*GIz@4Tovvjt60ZJ?nT(UrTn@p^SFvh^rlMo{fV(jF(;@8Jc z=Y$8ZP)dilMQ4mXUE36S`I(`?U1o!!Ub4@C?JozS*I7)BLr1I|ido11;Mw6!K3#en z5kK67E`%7YX)@k>{-Z-pd7M)&m;L}Dc_4U$QKCR=-WQy@ezQg*uO;skW| z_LwI={&he&@+dOK`VaKo9L__AR(L58szN1ZLmo1;`_Yc*sZTEUBj>!Uqo+BXa~FUI zH_ob+a~B}l*<^73XBP?~+QRi3=DcO#!Dy*k1vdx#8e26XL>o#eEsTKTmde2qv5Gmo z3^WQOKQr&>FmM&O@wOAaEABO;DW zp3J_QdMqI*LFx-P5Zd8Xs)51`aq*k!3SwvkDWx;KLWd{6Uwm?RU!pea%mqq2TwJwa z^1DTwSLm=7qB95ppzHe3@1JEKwmO?bkwlGN^j89@9m-Ve!Anzj;`3ZSq(_DT02Irz zfDn==Kr^#v^Y`6!e>_Arpe`?i01>>hy1@ki5LN3ycWc<`*V4<1r@x4ZV^`4u02D>J z;H?Q~ZoGKcuKlKJ)T6n$ZYgCuW2^xH)PQ(XJ|bobA(M!BM$@!!x58fUKY{Bjv(#Aiz5oCK M07*qoM6N<$g70Y=X#fBK literal 0 HcmV?d00001 diff --git a/resources/images/impl/gui/buttons/dialPadCallButtonBgRollover.png b/resources/images/impl/gui/buttons/dialPadCallButtonBgRollover.png new file mode 100644 index 0000000000000000000000000000000000000000..75f53856d0a02d0d98817fb176b432f8dc4732e4 GIT binary patch literal 1216 zcmV;x1V8(UP)Px#24YJ`L;!&Rf&hgIrkWf8000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipk& z2^1Ye_`_QO000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000CVNklTi8j%y2!&8feL!l!jo?BQvEV|)2e_~* zf?!)0f(r#VQX?p$0Wm9U8nwn2OH(tNcG5Ivl1wJa%-lP3ALkqwnjpzUh|KKn@8hiQ zxBA^bhwq+q(ZIj}Y=@LG&N+Wj2yswKnG`}a0sw`8&G;DOEJ7%SG5(PdGJ+7A*{&H? zk}jo;d!Bcqp+z6O@6n!cXZLR144I@M5~Tfxi9WqRiq<`FF6z8VKnJhPT1Q5zuG|BCHKUs8L+} z;d0^256&$K7hc8~4{s~o_x)$0ZK0Q*eD#r-5mDK7YXXWq7Z}|kArgfSvj^-I$NTW) z7n$5#@hwW}`|Hn1B9YigcyzaM^6A%yZnf0~`iJ!sltmF_P&+P1*s$cL!8A;A&jWp- z$&0B2r8Vy+LTGX$=~BwL06u!+y`gs7$S9d|Du`>9h-pbM?3jDzxwAJgki!U}8InjO zz;)f%jy~IWDAGyI8T;2Dt5vLmpM^-Mk=)W6Ay?1OsFc!gsFX6U)ziU!y&d6{H3mZR zAf8ob)}DlYy$8eJ)?XMDC3%{(x3@oj*RkY4q>Gx%-i^NppkP&X`O*QM)gePO#Pl!o zvy^k*zqhB&Sn=k82Pv-^E8aY`b+>4o^M1-XPwI6F&H2l~MKFigih{QU@km_ZoF}Q2 zvWaLw+_DvX{M3*#F9J3JODUVEloENu0WSPtd#NE90XV!YrId&wgqDhyy$cA!9K66z zjUd3FP_#HgXo(_(Qu*clekEqGvR?@7)Ch$bkYCLE2%!{ZjE$!!7LV*b7S_3(3+&Vg zhC`6Pk}WgF#wlZLWODS+SCU8W5EvNtWhpRJWhl~s_^P=4)l`WwbA)1y)4qj=r^gna zXg$=@kae#Gma0sI#bEmTg}iU!Vb#QG3IL$%`l+8ko_lzpyHhtBqH57!2uxLp5N!cB zi=By2=2uNUdb)DerQIuk#l<9Fs`;+sCZ{0000K+R literal 0 HcmV?d00001 diff --git a/resources/images/impl/gui/buttons/diezMac.png b/resources/images/impl/gui/buttons/diezMac.png new file mode 100644 index 0000000000000000000000000000000000000000..d38916b75f3bd6bb6d5c7579efaa092ebdcccc56 GIT binary patch literal 1313 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 P00000NkvXXu0mjfMXP&; literal 0 HcmV?d00001 diff --git a/resources/images/impl/gui/buttons/nineMacRollover.png b/resources/images/impl/gui/buttons/nineMacRollover.png new file mode 100644 index 0000000000000000000000000000000000000000..035d809649761331f51493590b9489af82595137 GIT binary patch literal 1895 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 literal 0 HcmV?d00001 diff --git a/resources/images/impl/gui/buttons/sixMac.png b/resources/images/impl/gui/buttons/sixMac.png new file mode 100644 index 0000000000000000000000000000000000000000..0996ee5a5aefa5145aacef802a6e3f838a88609a GIT binary patch literal 1805 zcmV+o2lDudP)Px#24YJ`L;!&Rf&hgIrkWf8000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipiA z5DO>P|AmwQ000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000JPNkl)V`~S~>EA9*5_7ZfR+$vaqmF zQc8VS2yy6YTba#fKYk;|JR*cRkjv!;(&==nTrN|sR)f|W)>^D*SZkrRMzh&O6h+k2 z(-Y5RGRab@^hIlJD1ej&txiHV7Rt+ih&m0*m)MufE%jYb2W=c&HFzGSIX z+Rn_2L^OMaG&2utt$#f>Ha4)bvf@{(RWLI)GME`*7=nmIHk%C!g~CoL<{br0^|-iaRPaP|{#C63(A z+mR6!9GgCg7670V+jifEp!zn4ihM{I*fQMKpVk`8ESWhgn3--E2(p_H0MH%#@aohIjvP6HnVHw|{3Ca*F~A5A zX_PKh;CJ;Q&i&|3YFw;okYq3u$W-ypYyn=^7L0cKFz(V^K?D~yuUW4VT9A}&{asFD z%*-T+sA!BaM6{~$#IEfK0AxRND`sDM3Sa;BLCoX>?0)DVp1iAbZN!Pt$Sm+|nAjsQ@YxZ~EfJ#Pl6wup0OgJe2}^7|ja0AR;(j^P;a zox|zrQ>ah?j|8l9ICuUcT(S?hq%NONYzOa%~qSvg$W+Is5naeVFO5Py5_dwBZKEj;ndpJ3mZ!fzkmg@Z@`j|n*0f$o@ut(Q@`fdCXj zAeBnlg@uJeB9Zt4<#IW+TCL~O>GT6Z5Og&fjq7J+_Te{&p27Ajf-J-vKYtXD{^IC{ zC`FUWB*HMfSglrHipS%RQ7)H*b8e*3XuRIr+uLugjkVLwllR<%41lv!hjF5`F=}t$ z_aUWRDHIC%WHR|BA;kQZCW6-bey#Ph*=#mzj8Q8qD;r*H#9}chrA)C{EP9^zxaWDl zzeZ0>DNk8z!+O2GBauib-}jZZwry#;o*|_~JRS#taCv#TET#NmEEaol)y|1hYKDjw zE0xNm5CTCEctQw)HAm|IJ%kXDQo{Frc%ElltyZ;ME|-EJc;afpZ5xBmxsfmoAGg-- zPo+{Z&+`Hzl1i!AdL?a)Sz%_YwGQj``ihkDP!I&q3L)nIqi*Qccahs2-J4OGNaZQtEBr_y4jQ*^lsVfmjvXC14S~00000NkvXXu0mjfgvU&s literal 0 HcmV?d00001 diff --git a/resources/images/impl/gui/buttons/sixMacRollover.png b/resources/images/impl/gui/buttons/sixMacRollover.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ee78c9c75fa93d21d221543b961f8e6b13120b GIT binary patch literal 1844 zcmV-42g~@0P)Px#24YJ`L;!&Rf&hgIrkWf8000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipk& z2rU^))8Nkl000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000J$NklA6O75?tuy!Skw8UKzmu^rpZOl+LE&^AeN8qszU85xiQG(s%cAc4e&s8Uf7 zT|{csiWNwe$|_J0iw2cQ&_W^IAfz@WaVr8cA&zOsjpNMJGmiac=DnHs?z{K0aN0WZ zOeoEwc0cKCp6-3;eD|Jn&kvcJnnEiWV}_Jc(^~5XjWK());$0?wjLr%X_*jml~Q_v zG4=`}D};Eq8Tn15wbsX^l+TQejCA+*_NJtiv|g`6DTN>iuvKAM78ql290x)OT`HB_ zd_KP-g!mDq^u>*9SvH&f&_|-^dz8{s`}XbInMfqsS65d_wOWOg5>XUkDCxl%7fV44YC=A12jgOD-41yq5sZ?N$!FGl*28~7ogbK1~S25Vmb|%d)V#x@vRI&rxH{5P-+Jy1G)X>%tiG zsgp{jg08Nv6oAK!F+*HRIo;FKV~1hL?i9lZzwtwS=gXf(`>iY;F3;e}<3GXmZE)LC zN`zs^(&=jUFbZ#O1`8Fy$>cC` z&kop>z~}~+-?@UhLZziP-}jM7B%ETgILVb#dl+Nf^Sl<1*C4+3$S8nioc{I+yb1s~ zi=W^1`Eyuy44ihNztdp;CLl8X=&(4n6fiar<1w`D9!KfMn<#_9wm1S~U=q7=e|86g z<#+JcE7y@3-H%*$0AYa(jbjxT)2D< zT5Bx*`y!Sb1brhzE%iw$0e~4}dbu%%Yz+EM=x##{fFD1M(`UYg4h{fy%)b0Hoc!ha zySQlzLL#h|eDtK#aEwB)6T$T~+L?hd1SG0qJ})tr8%D0Pib${9NC|BT+mxBk^Wj6MfgEf!kpqm;t;eMtzp z%7qYbRIAl5CX>l{Q`cB5qXEE*w}0q5H!BD?R6ZXwkw9yJ*arE<0y;AsZxhOIZ_5aZq#p7{!p63QZ@PcJoXUNpl6tvdE)oS%G{r&x! zD2l9Bee>k>G&%t+&Afttl(t9hZCMsL=fTp_QX!E@JW45DVA*UIgpf5#Y0-7vhf}GP zLkOYGO47yodCbqxqv&l9!nSQg2oV*F#TDDOf516^{kDFZG4?N|RKs=M{fR_^TbA`f z!Lr@J7(+ZB2Y^PgSiH$Of7-U~=bKJWgb*`?kn1ZeE0c^dw6(PfN-2H+h2F|NHl-Ad zF<6!b%d(W`d6nhmi>XxVr + + sodipodi:modified="true" + version="1.1"> + id="defs4"> + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:window-y="0" + showgrid="false" + inkscape:window-maximized="0" /> @@ -43,6 +209,7 @@ image/svg+xml + @@ -365,5 +532,896 @@ x="140.14545" y="440.64554" style="font-size:10.000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1.0000000;font-family:Bitstream Vera Sans">+ + + 9 + xyz + 1 + 6 + mno + 2 + ABC + 4 + ghi + 7 + pqrs + 3 + DEF + 5 + jkl + 8 + tuv + * + # + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/impl/gui/buttons/starMac.png b/resources/images/impl/gui/buttons/starMac.png new file mode 100644 index 0000000000000000000000000000000000000000..63e4d6c354a6dd38ef792645c812a2335f944d0d GIT binary patch literal 1384 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 literal 0 HcmV?d00001 diff --git a/resources/images/impl/gui/buttons/threeMac.png b/resources/images/impl/gui/buttons/threeMac.png new file mode 100644 index 0000000000000000000000000000000000000000..7d366e307a53f95705ac312278ea9092fb03e270 GIT binary patch literal 1680 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 literal 0 HcmV?d00001 diff --git a/resources/images/impl/gui/buttons/twoMac.png b/resources/images/impl/gui/buttons/twoMac.png new file mode 100644 index 0000000000000000000000000000000000000000..6258be3f98914317cd2ebe8a08f1edc93cd6dc38 GIT binary patch literal 1706 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 literal 0 HcmV?d00001 diff --git a/resources/images/impl/gui/buttons/zeroMac.png b/resources/images/impl/gui/buttons/zeroMac.png new file mode 100644 index 0000000000000000000000000000000000000000..b90b0347e33d939cc44d1efe0f8e4e6b2bd736ec GIT binary patch literal 1451 zcmV;c1yuTpP)Px#24YJ`L;!&Rf&hgIrkWf8000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipiA z5Fapmg4YHB000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000FBNkl1x>L%GucC)+p?wvm$+NLSlv;mPM{ort6 z_~ycQ=FB;B4yDs+%mr(0ht_(#wRWSmcC9g{34p-jgJO)06VVV6{lYmvMMPKTB2zWd z*4hrG)SI01XIolY;>l#P#&I0(d7jG{qs6A!7-PdQjHHyhP$-l$nM_G*{gn{nXf^S( zL>psvDWwjzx3@PoH#gTwDOnH%P)Z?+A}m(8t_vXqeBX!TIA(NoG(R#jk`+R{%NXmM z$>ph3>UNAM^%`UBKsudnOD2RLy zn|(}c9WurSW{Eb&>|%@^=<4cPCZ%+<*({V&Sc=eEqf{!vaU9Xw+8WPhv+J$3*NEtk zY0=i&4k_hlot>R+l}g1e6bi7`VkyH~i!cm9L@bp`d6`V6hjV^{i1Iv@Nmr}edz|xcnYFe9z|Mw-hPr${4{PmxXN5um4Gj%-0Crky zJA_hddwqSq7ex`j+Z}%K{V%X*^GX0fapXtr+x-p(m&j>LDG@~xZ)|L=$>nm}nbx{D znM}sZsgoO4kw zm*+@c-FR;6Dq#FHo`3yAOajQ)e~tZ5JcTzp58>#A1w2Bh9uF*YaP{iwyzaK|`>ru& zEwk39h)5`$h|+>7o?uov_6D~SJeZWz=-3)?u`H<3=f>cm2&kx zj4>#s6cLRHA{q*UU>#%3l~T?k7sDHWky9m1J0*VOGjZi_RCCn-jpFbiei#PeuECba z8_@qlKg##I{*Hqn2qX~=F(Jg+QmGVh&Z~yS@QHp*0$8)*b|`mrKZ*o^YeRzzTZ27< zH5OtXT+TUyAP9vJXPFS<)a2x3L`3@L8~jciKZcVRLnL}$#=&RS!K`};AH2FAP`~5& zu}ce^$R;k}%;|HOxCajah)Cyhxrz|t6s6N?1VL~lnM}Umd0u^~RH_mj+i>j6N9al2 znjc)pC$Bt-Bj=XJ<0KxBBMifdLZR@v@B432I-Q0wW<{w~`o5*5WtrAGHdo)=yJH8I zBfxJbzr&>^@)~np7o77-CX=}ykH@z%#x73}5u}v6rId$LsZ>fSB`TH5l5aL*u^5C9 zYHVz5%yFE(j^liJM?cLuKd-e8i^bxGnwlEnx~|Y#FGzO&ui%`+_k92e$H&KWob!XR zSnSiPlM^AtuS9e$pU?L)#^8CL!x&>Td(_1W#uzx~a9tOUv`VWGX>8% z7&OML2*Yr%)_PYWk%&2t;}H=TLc|uUXr)xeTC1g$VX;`OaL)TY&pXT*yF9OH=uGiZ z6g{n!+GMTmR7y1ia28|tD1;a#qKiU^pIz7erkdDW_!llRm+o5?i?{#)002ovPDHLk FV1m+6p>F^H literal 0 HcmV?d00001 diff --git a/resources/images/impl/gui/buttons/zeroMacRollover.png b/resources/images/impl/gui/buttons/zeroMacRollover.png new file mode 100644 index 0000000000000000000000000000000000000000..af9014933c71ac9d6d3714cade22085a08cb70b1 GIT binary patch literal 1479 zcmV;&1vvVNP)Px#24YJ`L;!&Rf&hgIrkWf8000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipk& z2rm!-IXdY8000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000FdNkl7iZ9RIzqc{AN^2itDLQfW)FE!Y+-A|Vw&Vq&Z*9!P+A@MgH^L1M&6G{ysB zyr5AJdNIa?L<#Xiu!%9kfgk~lp(2n1Y56E=?RHycw>#aLH*cPYLaBBOoamNc^74}Z z{3b8I_n-g#KS)nc4;F$krdey<8^`fRV@z8d$Mpa>Di0B*bes@!ky3h+G1f;2xw;UU zloM@?X;wr&d$yi$z-y6a&nRs3I!;o5JeFx8Br8LDFxs6p_C$Zb#+cE zl}e0{k3XZeE>TMVm?t`p{n5Xk$!s7>3`sx3{kdg22k>^DxF>DZ?0pQmF(&2yJL+ut!ElHZaBx5kfqc$z%|Q z;YTZ1uI!dlCOyx?!-OylVcRyBQetv)(&n81LX9!a0JhcE*1DeO!5H( zT6epyoA7-faU7Rj&+XiYEnR8c95{jlM+V?DbYa)NHy7kr;_`hT$z;;eT6c4;bsJ-h z7mLLOeqQVF@{=ooo2T*Khu>flKq2`xc5K*)*W13rw*!mlLQ#vRG{?1TWA_!?j^kKb z>o#hPNfAPL6h-B4sckJ9Eg*NHAGuq$Q~iSgEVONGTU-y?wPsd?zc(lE9*4EOw1`dGi zmA@A^2ipXQ4fuU<8DsE$za)e>!G#cg6B833xUQ=Kuz8;QXFrZ#+lrnwTd@0;zp!`c zalEs&6^Mp#c>iVS#Z17t^Ei6s-ZaJ-2q8L~%?8!g)qSkBwe@BcMNO2_HICyr<=V%S zhsUsf^Cqm@^b%fsaV=by!=aCN;NbAmC{7ZI1d7F?7X-l%Qpz7mPfrixIBqEv3P&3o z8`Dt~$%Xpn?%rN3M}V_^zv1!{sm7#~;G73HZrm72CX+8vO0Td?CIdpqO-kvg=XuY& zuIms&Xt|Q~`lU;_aA^<|OGL13+YmxTqoboa+qU23oFD&BKg}3Br?oD5p7&HTndDN+ z*@9)MfiZ?eA^`xU(b3Tf&iP*3w!bSoIT1pfCWH*!ohcFh%xa+6KVvJP<0Pfkruz3qA4_L`a+DTJ^&=S&D8E4Y&i z;yBi&QmK^B=L5#rLDzLZr<7i~uW9IAre you sure you want to start screen sharing?
Clicking OK will let people on this call see your screen. -service.gui.DIALPAD=Dialpad +service.gui.DIALPAD=Dial Pad service.gui.DISPLAY_NAME=Display name service.gui.DISCONNECTED_STATUS=Disconnected service.gui.DND_STATUS=Do not disturb diff --git a/src/net/java/sip/communicator/impl/gui/main/DialPadButton.java b/src/net/java/sip/communicator/impl/gui/main/DialPadButton.java new file mode 100644 index 000000000..1ee78e844 --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/main/DialPadButton.java @@ -0,0 +1,62 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.gui.main; + +import java.awt.*; +import java.awt.event.*; + +import net.java.sip.communicator.impl.gui.utils.*; +import net.java.sip.communicator.util.swing.*; + +/** + * The dial pad button in the contact list. + * + * @author Yana Stamcheva + */ +public class DialPadButton + extends SIPCommTextButton +{ + /** + * The dial pad dialog that this button opens. + */ + GeneralDialPadDialog dialPad; + + /** + * Creates an instance of DialPadButton. + */ + public DialPadButton() + { + super(""); + + loadSkin(); + + addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + if (dialPad == null) + dialPad = new GeneralDialPadDialog(); + + dialPad.clear(); + dialPad.setVisible(true); + } + }); + } + + /** + * Loads images and sets history view. + */ + public void loadSkin() + { + Image image = ImageLoader.getImage(ImageLoader.CONTACT_LIST_DIAL_BUTTON); + + setBgImage(image); + + this.setPreferredSize(new Dimension(image.getWidth(this), + image.getHeight(this))); + } +} diff --git a/src/net/java/sip/communicator/impl/gui/main/DialPadFieldUI.java b/src/net/java/sip/communicator/impl/gui/main/DialPadFieldUI.java new file mode 100644 index 000000000..ca43cea2d --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/main/DialPadFieldUI.java @@ -0,0 +1,93 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.gui.main; + +import java.awt.*; + +import net.java.sip.communicator.util.*; +import net.java.sip.communicator.util.skin.*; +import net.java.sip.communicator.util.swing.*; +import net.java.sip.communicator.util.swing.plaf.*; + +/** + * The SearchTextFieldUI is the one responsible for the search field + * look & feel. It draws a search icon inside the field and adjusts the bounds + * of the editor rectangle according to it. + * + * @author Yana Stamcheva + * @author Adam Netocny + */ +public class DialPadFieldUI + extends SIPCommTextFieldUI + implements Skinnable +{ + /** + * Creates a SIPCommTextFieldUI. + */ + public DialPadFieldUI() + { + loadSkin(); + } + + /** + * Adds the custom mouse listeners defined in this class to the installed + * listeners. + */ + protected void installListeners() + { + super.installListeners(); + } + + /** + * Implements parent paintSafely method and enables antialiasing. + * @param g the Graphics object that notified us + */ + protected void paintSafely(Graphics g) + { + customPaintBackground(g); + super.paintSafely(g); + } + + /** + * Paints the background of the associated component. + * @param g the Graphics object used for painting + */ + protected void customPaintBackground(Graphics g) + { + Graphics2D g2 = (Graphics2D) g.create(); + + try + { + AntialiasingManager.activateAntialiasing(g2); + super.customPaintBackground(g2); + } + finally + { + g2.dispose(); + } + } + + /** + * If we are in the case of disabled delete button, we simply call the + * parent implementation of this method, otherwise we recalculate the editor + * rectangle in order to leave place for the delete button. + * @return the visible editor rectangle + */ + protected Rectangle getVisibleEditorRect() + { + Rectangle rect = super.getVisibleEditorRect(); + + if ((rect.width > 0) && (rect.height > 0)) + { + rect.x += 8; + rect.width -= 18; + + return rect; + } + return null; + } +} \ No newline at end of file diff --git a/src/net/java/sip/communicator/impl/gui/main/GeneralDialPadDialog.java b/src/net/java/sip/communicator/impl/gui/main/GeneralDialPadDialog.java new file mode 100644 index 000000000..926c6ecb0 --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/main/GeneralDialPadDialog.java @@ -0,0 +1,320 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.gui.main; + +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; + +import net.java.sip.communicator.impl.gui.*; +import net.java.sip.communicator.impl.gui.main.call.*; +import net.java.sip.communicator.impl.gui.utils.*; +import net.java.sip.communicator.util.*; +import net.java.sip.communicator.util.skin.*; +import net.java.sip.communicator.util.swing.*; +import net.java.sip.communicator.util.swing.plaf.*; + +import com.explodingpixels.macwidgets.*; + +/** + * The DialpadDialog is a popup dialog containing a dialpad. + * + * @author Yana Stamcheva + */ +public class GeneralDialPadDialog +{ + /** + * The call field, where the dialed number is typed. + */ + private final JTextField callField; + + /** + * The actual dial pad dialog. + */ + private final JDialog dialPadDialog; + + /** + * The call button. + */ + private JButton callButton; + + /** + * A keyboard manager, where we register our own key dispatcher. + */ + private KeyboardFocusManager keyManager; + + /** + * A key dispatcher that redirects all key events to call field. + */ + private KeyEventDispatcher keyDispatcher; + + /** + * Creates an instance of GeneralDialPadDialog. + */ + public GeneralDialPadDialog() + { + if (OSUtils.IS_MAC) + { + HudWindow window = new HudWindow(); + + dialPadDialog = window.getJDialog(); + } + else + { + dialPadDialog = new SIPCommDialog(false); + } + + callField = new CallField(GuiActivator.getResources() + .getI18NString("service.gui.ENTER_NAME_OR_NUMBER")); + + dialPadDialog.setTitle( + GuiActivator.getResources().getI18NString("service.gui.DIALPAD")); + + JPanel mainPanel = new TransparentPanel(new BorderLayout()); + + mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + + mainPanel.add(callField, BorderLayout.NORTH); + DTMFHandler dtmfHandler = new DTMFHandler(); + dtmfHandler.addParent(dialPadDialog); + mainPanel.add(new GeneralDialPanel(this, dtmfHandler)); + mainPanel.add(createCallPanel(), BorderLayout.SOUTH); + + dialPadDialog.add(mainPanel); + dialPadDialog.pack(); + + dialPadDialog.addWindowListener(new WindowAdapter() + { + public void windowOpened(WindowEvent e) + { + if (keyManager == null) + { + keyManager + = KeyboardFocusManager.getCurrentKeyboardFocusManager(); + + keyDispatcher = new MainKeyDispatcher(keyManager); + } + + keyManager.addKeyEventDispatcher( + new MainKeyDispatcher(keyManager)); + } + + @Override + public void windowClosed(WindowEvent e) + { + if (keyManager != null) + keyManager.removeKeyEventDispatcher(keyDispatcher); + + keyManager = null; + keyDispatcher = null; + } + }); + } + + /** + * Creates the call panel. + * + * @return the created call panel. + */ + private JComponent createCallPanel() + { + JPanel buttonsPanel + = new TransparentPanel(new FlowLayout(FlowLayout.CENTER)); + + Image callButtonImage + = ImageLoader.getImage(ImageLoader.DIAL_PAD_CALL_BUTTON_BG); + + callButton = new SIPCommTextButton( + GuiActivator.getResources().getI18NString("service.gui.CALL"), + callButtonImage); + + callButton.setPreferredSize(new Dimension( + callButtonImage.getWidth(null), + callButtonImage.getHeight(null))); + + callButton.setForeground(Color.WHITE); + + callButton.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + CallManager.createCall(callField.getText(), callButton, + new CallInterfaceListener() + { + public void callInterfaceStarted() + { + dialPadDialog.setVisible(false); + } + }); + } + }); + + buttonsPanel.add(callButton); + + dialPadDialog.getRootPane().setDefaultButton(callButton); + + return buttonsPanel; + } + + /** + * Indicates that a dial button was pressed. + * + * @param s the string corresponding to a number to add to the call field + */ + public void dialButtonPressed(String s) + { + callField.setText(callField.getText() + s); + } + + /** + * Shows/hides the dial pad dialog. + * + * @param visible indicates if the dial pad should be shown or hidden. + */ + public void setVisible(boolean visible) + { + dialPadDialog.setLocationRelativeTo( + GuiActivator.getUIService().getMainFrame()); + dialPadDialog.setVisible(visible); + callField.requestFocus(); + } + + /** + * Clears the call field. + */ + public void clear() + { + callField.setText(""); + } + + /** + * The MainKeyDispatcher is added to pre-listen KeyEvents before + * they're delivered to the current focus owner in order to introduce a + * specific behavior for the CallField on top of the dial pad. + */ + private class MainKeyDispatcher implements KeyEventDispatcher + { + private KeyboardFocusManager keyManager; + + /** + * Creates an instance of MainKeyDispatcher. + * @param keyManager the parent KeyboardFocusManager + */ + public MainKeyDispatcher(KeyboardFocusManager keyManager) + { + this.keyManager = keyManager; + } + + /** + * Dispatches the given KeyEvent. + * @param e the KeyEvent to dispatch + * @return true if the KeyboardFocusManager should take no + * further action with regard to the KeyEvent; false + * otherwise + */ + public boolean dispatchKeyEvent(KeyEvent e) + { + // If this window is not the focus window or if the event is not + // of type PRESSED we have nothing more to do here. + if (!dialPadDialog.isFocused() + || (e.getID() != KeyEvent.KEY_TYPED)) + return false; + + if (e.getKeyChar() == KeyEvent.CHAR_UNDEFINED + || e.getKeyCode() == KeyEvent.VK_ENTER + || e.getKeyCode() == KeyEvent.VK_DELETE + || e.getKeyCode() == KeyEvent.VK_BACK_SPACE + || e.getKeyCode() == KeyEvent.VK_TAB + || e.getKeyCode() == KeyEvent.VK_SPACE) + { + return false; + } + + if (!callField.isFocusOwner() + && keyManager.getFocusOwner() != null) + { + // Request the focus in the call field if a letter is typed. + callField.requestFocusInWindow(); + + // We re-dispatch the event to call field. + keyManager.redispatchEvent(callField, e); + + // We don't want to dispatch further this event. + return true; + } + + return false; + } + } + + /** + * A custom call field. + */ + private class CallField + extends SIPCommTextField + implements Skinnable + { + /** + * The text field ui. + */ + private SIPCommTextFieldUI textFieldUI; + + /** + * Creates an instance of the CallField. + */ + public CallField(String text) + { + super(text); + + textFieldUI = new DialPadFieldUI(); + textFieldUI.setDeleteButtonEnabled(true); + + this.setPreferredSize(new Dimension(200, 23)); + this.setUI(textFieldUI); + this.setBorder(null); + this.setOpaque(false); + + this.setDragEnabled(true); + + InputMap imap + = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "escape"); + ActionMap amap = getActionMap(); + amap.put("escape", new AbstractAction() + { + public void actionPerformed(ActionEvent e) + { + setText(""); + } + }); + + loadSkin(); + } + + /** + * Reloads text field UI defs. + */ + public void loadSkin() + { + textFieldUI.loadSkin(); + + if (OSUtils.IS_MAC) + { + textFieldUI.setBgStartColor(Color.BLACK); + textFieldUI.setBgEndColor(Color.BLACK); + textFieldUI.setBgBorderStartColor(Color.DARK_GRAY); + textFieldUI.setBgBorderEndColor(Color.GRAY); + + setForegroundColor(Color.WHITE); + setDefaultTextColor(Color.GRAY); + + setCaretColor(Color.WHITE); + } + } + } +} diff --git a/src/net/java/sip/communicator/impl/gui/main/GeneralDialPanel.java b/src/net/java/sip/communicator/impl/gui/main/GeneralDialPanel.java new file mode 100755 index 000000000..16f1f1ddd --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/main/GeneralDialPanel.java @@ -0,0 +1,244 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.gui.main; + +import java.awt.*; +import java.awt.event.*; +import java.awt.image.*; + +import javax.swing.*; + +import net.java.sip.communicator.impl.gui.*; +import net.java.sip.communicator.impl.gui.main.call.*; +import net.java.sip.communicator.impl.gui.utils.*; +import net.java.sip.communicator.service.resources.*; +import net.java.sip.communicator.util.*; +import net.java.sip.communicator.util.skin.*; +import net.java.sip.communicator.util.swing.*; + +/** + * The DialPanel is the panel that contains the buttons to dial a + * phone number. + * + * @author Yana Stamcheva + * @author Adam Netocny + */ +public class GeneralDialPanel + extends TransparentPanel + implements MouseListener, + Skinnable +{ + /** + * The dial panel. + */ + private final JPanel dialPadPanel = + new TransparentPanel(new GridLayout(4, 3, + GuiActivator.getResources() + .getSettingsInt("impl.gui.DIAL_PAD_HORIZONTAL_GAP"), + GuiActivator.getResources() + .getSettingsInt("impl.gui.DIAL_PAD_VERTICAL_GAP"))); + + /** + * Handles DTMFs. + */ + private DTMFHandler dtmfHandler; + + /** + * The parent dial pad dialog. + */ + private final GeneralDialPadDialog dialPadDialog; + + /** + * Creates an instance of DialPanel for a specific call, by + * specifying the parent CallManager and the + * CallPeer. + * + * @param dtmfHandler handles DTMFs. + */ + public GeneralDialPanel(GeneralDialPadDialog dialPadDialog, + DTMFHandler dtmfHandler) + { + this.dialPadDialog = dialPadDialog; + this.dtmfHandler = dtmfHandler; + + this.init(); + } + + /** + * Initializes this panel by adding all dial buttons to it. + */ + public void init() + { + this.dialPadPanel.setOpaque(false); + + this.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); + + loadSkin(); + + this.add(dialPadPanel, BorderLayout.CENTER); + } + + /** + * Creates DTMF button. + * + * @param bgImage + * @param iconImage + * @param name + * @return the created dial button + */ + private JButton createDialButton(Image bgImage, ImageID iconImage, + String name) + { + JButton button = + new SIPCommButton(bgImage, ImageLoader.getImage(iconImage)); + + button.setAlignmentY(JButton.LEFT_ALIGNMENT); + button.setName(name); + button.setOpaque(false); + button.addMouseListener(this); + return button; + } + + /** + * Creates DTMF button. + * + * @param bgImage + * @param iconImage + * @param name + * @return the created dial button + */ + private JButton createMacOSXDialButton( ImageID imageID, + ImageID rolloverImageID, + String name) + { + JButton button = new SIPCommButton( + ImageLoader.getImage(imageID), + ImageLoader.getImage(rolloverImageID), + ImageLoader.getImage(rolloverImageID), + null, + null, + null); + + button.setName(name); + button.addMouseListener(this); + + return button; + } + + public void mouseClicked(MouseEvent e) {} + + public void mouseEntered(MouseEvent e) {} + + public void mouseExited(MouseEvent e) {} + + /** + * Handles the MouseEvent triggered when user presses one of the + * dial buttons. + * @param e the event + */ + public void mousePressed(MouseEvent e) + { + JButton button = (JButton) e.getSource(); + + dialPadDialog.dialButtonPressed(button.getName()); + dtmfHandler.startSendingDtmfTone(button.getName()); + } + + /** + * Handles the MouseEvent triggered when user releases one of the + * dial buttons. + * @param e the event + */ + public void mouseReleased(MouseEvent e) + { + dtmfHandler.stopSendingDtmfTone(); + } + + /** + * Paints the main background image to the background of this dial panel. + * + * @param g the Graphics object used for painting + */ + public void paintComponent(Graphics g) + { + // do the superclass behavior first + super.paintComponent(g); + + Graphics2D g2 = (Graphics2D) g; + + boolean isTextureBackground + = Boolean.parseBoolean(GuiActivator.getResources() + .getSettingsString("impl.gui.IS_CONTACT_LIST_TEXTURE_BG_ENABLED")); + + BufferedImage bgImage + = ImageLoader.getImage(ImageLoader.MAIN_WINDOW_BACKGROUND); + + // paint the image + if (bgImage != null) + { + if (isTextureBackground) + { + Rectangle rect + = new Rectangle(0, 0, + bgImage.getWidth(null), + bgImage.getHeight(null)); + + TexturePaint texture = new TexturePaint(bgImage, rect); + + g2.setPaint(texture); + + g2.fillRect(0, 0, this.getWidth(), this.getHeight()); + } + else + { + g.setColor(new Color( + GuiActivator.getResources() + .getColor("contactListBackground"))); + + // paint the background with the choosen color + g.fillRect(0, 0, getWidth(), getHeight()); + + g2.drawImage(bgImage, + this.getWidth() - bgImage.getWidth(), + this.getHeight() - bgImage.getHeight(), + this); + } + } + } + + /** + * Reloads dial buttons. + */ + public void loadSkin() + { + dialPadPanel.removeAll(); + + Image bgImage = ImageLoader.getImage(ImageLoader.DIAL_BUTTON_BG); + + DTMFHandler.DTMFToneInfo[] availableTones = DTMFHandler.availableTones; + for (int i = 0; i < availableTones.length; i++) + { + DTMFHandler.DTMFToneInfo info = availableTones[i]; + + // we add only buttons having image + if(info.imageID == null) + continue; + + JComponent c; + if (OSUtils.IS_MAC) + c = createMacOSXDialButton( + info.macImageID, + info.macImageRolloverID, + info.tone.getValue()); + else + c = createDialButton( + bgImage, info.imageID, info.tone.getValue()); + + dialPadPanel.add(c); + } + } +} diff --git a/src/net/java/sip/communicator/impl/gui/main/MainFrame.java b/src/net/java/sip/communicator/impl/gui/main/MainFrame.java index 3e1d4fa93..8f4e3fc37 100644 --- a/src/net/java/sip/communicator/impl/gui/main/MainFrame.java +++ b/src/net/java/sip/communicator/impl/gui/main/MainFrame.java @@ -265,8 +265,9 @@ private void init() TransparentPanel searchPanel = new TransparentPanel(new BorderLayout(2, 0)); - searchPanel.add(searchField); + searchPanel.add(searchField); + searchPanel.add(new DialPadButton(), BorderLayout.WEST); searchPanel.add(createButtonPanel(), BorderLayout.EAST); northPanel.add(accountStatusPanel, BorderLayout.CENTER); diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallInterfaceListener.java b/src/net/java/sip/communicator/impl/gui/main/call/CallInterfaceListener.java new file mode 100644 index 000000000..39839eea2 --- /dev/null +++ b/src/net/java/sip/communicator/impl/gui/main/call/CallInterfaceListener.java @@ -0,0 +1,21 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.gui.main.call; + +/** + * The CallInterfaceListener is notified when the call interface has + * been started after the call was created. + * + * @author Yana Stamcheva + */ +public interface CallInterfaceListener +{ + /** + * Indicates that the call interface was started. + */ + public void callInterfaceStarted(); +} diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java b/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java index 25c433c13..f7d383ac0 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java @@ -626,7 +626,23 @@ public static void enableDesktopRemoteControl( CallPeer callPeer, * @param c the component, which indicates where should be shown the "call * via" menu if needed */ - public static void createCall(String callString, JComponent c) + public static void createCall( String callString, + JComponent c) + { + createCall(callString, c, null); + } + + /** + * Creates a call to the given call string. The given component indicates + * where should be shown the "call via" menu if needed. + * + * @param callString the string to call + * @param c the component, which indicates where should be shown the "call + * via" menu if needed + */ + public static void createCall( String callString, + JComponent c, + CallInterfaceListener l) { callString = callString.trim(); @@ -653,6 +669,9 @@ public static void createCall(String callString, JComponent c) { CallManager.createCall( telephonyProviders.get(0), callString); + + if (l != null) + l.callInterfaceStarted(); } else if (telephonyProviders.size() > 1) { @@ -660,12 +679,22 @@ else if (telephonyProviders.size() > 1) = new ChooseCallAccountPopupMenu( c, callString, - telephonyProviders); + telephonyProviders, + l); chooseAccountDialog .setLocation(c.getLocation()); chooseAccountDialog.showPopupMenu(); } + else + { + new ErrorDialog( + null, + GuiActivator.getResources().getI18NString("service.gui.WARNING"), + GuiActivator.getResources().getI18NString( + "service.gui.NO_ONLINE_TELEPHONY_ACCOUNT")) + .showDialog(); + } } /** diff --git a/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java b/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java index cd4f307d5..d210f6407 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/ChooseCallAccountPopupMenu.java @@ -46,6 +46,12 @@ public class ChooseCallAccountPopupMenu */ private final JComponent invoker; + /** + * The call interface listener, which would be notified once the call + * interface is created. + */ + private CallInterfaceListener callInterfaceListener; + /** * Creates this dialog. * @@ -62,6 +68,25 @@ public ChooseCallAccountPopupMenu( OperationSetBasicTelephony.class); } + /** + * Creates this dialog. + * + * @param invoker the invoker of this pop up menu + * @param contactToCall the contact to call + * @param telephonyProviders a list of all possible telephony providers + */ + public ChooseCallAccountPopupMenu( + JComponent invoker, + final String contactToCall, + List telephonyProviders, + CallInterfaceListener l) + { + this(invoker, contactToCall, telephonyProviders, + OperationSetBasicTelephony.class); + + callInterfaceListener = l; + } + /** * Creates this dialog. * @@ -180,6 +205,9 @@ else if (opSetClass.equals( providerItem.getProtocolProvider(), contactString); + if (callInterfaceListener != null) + callInterfaceListener.callInterfaceStarted(); + ChooseCallAccountPopupMenu.this.setVisible(false); } }); diff --git a/src/net/java/sip/communicator/impl/gui/main/call/DTMFHandler.java b/src/net/java/sip/communicator/impl/gui/main/call/DTMFHandler.java index 798170fe6..bcba73566 100644 --- a/src/net/java/sip/communicator/impl/gui/main/call/DTMFHandler.java +++ b/src/net/java/sip/communicator/impl/gui/main/call/DTMFHandler.java @@ -51,103 +51,135 @@ public class DTMFHandler * All available tones and its properties like images for buttons, and * sounds to be played during send. */ - static final DTMFToneInfo[] availableTones = new DTMFToneInfo[] + public static final DTMFToneInfo[] availableTones = new DTMFToneInfo[] { new DTMFToneInfo( DTMFTone.DTMF_1, KeyEvent.VK_1, '1', ImageLoader.ONE_DIAL_BUTTON, + ImageLoader.ONE_DIAL_BUTTON_MAC, + ImageLoader.ONE_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_ONE), new DTMFToneInfo( DTMFTone.DTMF_2, KeyEvent.VK_2, '2', ImageLoader.TWO_DIAL_BUTTON, + ImageLoader.TWO_DIAL_BUTTON_MAC, + ImageLoader.TWO_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_TWO), new DTMFToneInfo( DTMFTone.DTMF_3, KeyEvent.VK_3, '3', ImageLoader.THREE_DIAL_BUTTON, + ImageLoader.THREE_DIAL_BUTTON_MAC, + ImageLoader.THREE_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_THREE), new DTMFToneInfo( DTMFTone.DTMF_4, KeyEvent.VK_4, '4', ImageLoader.FOUR_DIAL_BUTTON, + ImageLoader.FOUR_DIAL_BUTTON_MAC, + ImageLoader.FOUR_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_FOUR), new DTMFToneInfo( DTMFTone.DTMF_5, KeyEvent.VK_5, '5', ImageLoader.FIVE_DIAL_BUTTON, + ImageLoader.FIVE_DIAL_BUTTON_MAC, + ImageLoader.FIVE_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_FIVE), new DTMFToneInfo( DTMFTone.DTMF_6, KeyEvent.VK_6, '6', ImageLoader.SIX_DIAL_BUTTON, + ImageLoader.SIX_DIAL_BUTTON_MAC, + ImageLoader.SIX_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_SIX), new DTMFToneInfo( DTMFTone.DTMF_7, KeyEvent.VK_7, '7', ImageLoader.SEVEN_DIAL_BUTTON, + ImageLoader.SEVEN_DIAL_BUTTON_MAC, + ImageLoader.SEVEN_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_SEVEN), new DTMFToneInfo( DTMFTone.DTMF_8, KeyEvent.VK_8, '8', ImageLoader.EIGHT_DIAL_BUTTON, + ImageLoader.EIGHT_DIAL_BUTTON_MAC, + ImageLoader.EIGHT_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_EIGHT), new DTMFToneInfo( DTMFTone.DTMF_9, KeyEvent.VK_9, '9', ImageLoader.NINE_DIAL_BUTTON, + ImageLoader.NINE_DIAL_BUTTON_MAC, + ImageLoader.NINE_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_NINE), new DTMFToneInfo( DTMFTone.DTMF_A, KeyEvent.VK_A, 'a', null, + null, + null, null), new DTMFToneInfo( DTMFTone.DTMF_B, KeyEvent.VK_B, 'b', null, + null, + null, null), new DTMFToneInfo( DTMFTone.DTMF_C, KeyEvent.VK_C, 'c', null, + null, + null, null), new DTMFToneInfo( DTMFTone.DTMF_D, KeyEvent.VK_D, 'd', null, + null, + null, null), new DTMFToneInfo( DTMFTone.DTMF_STAR, KeyEvent.VK_ASTERISK, '*', ImageLoader.STAR_DIAL_BUTTON, + ImageLoader.STAR_DIAL_BUTTON_MAC, + ImageLoader.STAR_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_STAR), new DTMFToneInfo( DTMFTone.DTMF_0, KeyEvent.VK_0, '0', ImageLoader.ZERO_DIAL_BUTTON, + ImageLoader.ZERO_DIAL_BUTTON_MAC, + ImageLoader.ZERO_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_ZERO), new DTMFToneInfo( DTMFTone.DTMF_SHARP, KeyEvent.VK_NUMBER_SIGN, '#', ImageLoader.DIEZ_DIAL_BUTTON, + ImageLoader.DIEZ_DIAL_BUTTON_MAC, + ImageLoader.DIEZ_DIAL_BUTTON_MAC_ROLLOVER, SoundProperties.DIAL_DIEZ) }; @@ -167,11 +199,23 @@ public DTMFHandler(CallPanel callContainer) keyManager.addKeyEventDispatcher(this); } + /** + * Creates DTMF handler for a call. + * @param callContainer the CallContainer, where this handler is + * registered + */ + public DTMFHandler() + { + KeyboardFocusManager keyManager + = KeyboardFocusManager.getCurrentKeyboardFocusManager(); + keyManager.addKeyEventDispatcher(this); + } + /** * Add parent on which we listen for key entering. * @param w */ - void addParent(Window w) + public void addParent(Window w) { parents.add(w); } @@ -233,7 +277,7 @@ else if(e.getID() == KeyEvent.KEY_RELEASED) * * @param toneValue the value of the DTMF tone to send. */ - void startSendingDtmfTone(String toneValue) + public void startSendingDtmfTone(String toneValue) { for (int i = 0; i < availableTones.length; i++) { @@ -266,8 +310,35 @@ private synchronized void startSendingDtmfTone(DTMFToneInfo info) currentlyPlayingAudio.playInLoop(10); } - Iterator callPeers - = callContainer.getCurrentCallRenderer().getCall().getCallPeers(); + if (callContainer != null) + startSendingDtmfTone( + callContainer.getCurrentCallRenderer().getCall(), + info); + else + { + Collection activeCalls = CallManager.getActiveCalls(); + + if (activeCalls != null) + { + Iterator callsIter = activeCalls.iterator(); + + while (callsIter.hasNext()) + { + startSendingDtmfTone(callsIter.next(), info); + } + } + } + } + + /** + * Sends a DTMF tone to the current DTMF operation set of the given call. + * + * @param call The call to which we send DTMF-s. + * @param info The DTMF tone to send. + */ + private void startSendingDtmfTone(Call call, DTMFToneInfo info) + { + Iterator callPeers = call.getCallPeers(); try { @@ -299,15 +370,40 @@ private synchronized void startSendingDtmfTone(DTMFToneInfo info) /** * Stop sending DTMF tone. */ - synchronized void stopSendingDtmfTone() + public synchronized void stopSendingDtmfTone() { if(currentlyPlayingAudio != null) currentlyPlayingAudio.stop(); currentlyPlayingAudio = null; - Iterator callPeers - = callContainer.getCurrentCallRenderer().getCall().getCallPeers(); + if (callContainer != null) + stopSendingDtmfTone( + callContainer.getCurrentCallRenderer().getCall()); + else + { + Collection activeCalls = CallManager.getActiveCalls(); + + if (activeCalls != null) + { + Iterator callsIter = activeCalls.iterator(); + + while (callsIter.hasNext()) + { + stopSendingDtmfTone(callsIter.next()); + } + } + } + } + + /** + * Stops sending DTMF tone to the given call. + * + * @param call The call to which we send DTMF-s. + */ + private void stopSendingDtmfTone(Call call) + { + Iterator callPeers = call.getCallPeers(); try { @@ -332,32 +428,42 @@ synchronized void stopSendingDtmfTone() /** * DTMF extended information. */ - static class DTMFToneInfo + public static class DTMFToneInfo { /** * The tone itself */ - DTMFTone tone; + public DTMFTone tone; /** * The key code when entered from keyboard. */ - int keyCode; + public int keyCode; /** * The char associated with this DTMF tone. */ - char keyChar; + public char keyChar; /** * The image to display in buttons sending DTMFs. */ - ImageID imageID; + public ImageID imageID; + + /** + * The image to display on Mac buttons. + */ + public ImageID macImageID; + + /** + * The id of the image to display on Mac buttons on rollover. + */ + public ImageID macImageRolloverID; /** * The sound to play during send of this tone. */ - String sound; + public String sound; /** * Creates DTMF extended info. @@ -365,16 +471,20 @@ static class DTMFToneInfo * @param keyCode its key code. * @param keyChar the char associated with the DTMF * @param imageID the image if any. + * @param macImageID the Mac image if any. * @param sound the sound if any. */ public DTMFToneInfo( DTMFTone tone, int keyCode, char keyChar, - ImageID imageID, String sound) + ImageID imageID, ImageID macImageID, + ImageID macImageRolloverID, String sound) { this.tone = tone; this.keyCode = keyCode; this.keyChar = keyChar; this.imageID = imageID; + this.macImageID = macImageID; + this.macImageRolloverID = macImageRolloverID; this.sound = sound; } } diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchFieldUI.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchFieldUI.java index a2536694d..4d028f8d3 100644 --- a/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchFieldUI.java +++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/SearchFieldUI.java @@ -134,7 +134,7 @@ protected void customPaintBackground(Graphics g) int dy = (c.getY() + c.getHeight()) / 2 - searchIcon.getIconHeight()/2; - g2.drawImage(searchIcon.getImage(), c.getX() + 5, dy + 1, null); + g2.drawImage(searchIcon.getImage(), 5, dy + 1, null); if (c.getText() != null && c.getText().length() > 0 diff --git a/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java b/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java index 7c6b9896a..946e263ef 100644 --- a/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java +++ b/src/net/java/sip/communicator/impl/gui/utils/ImageLoader.java @@ -397,6 +397,150 @@ public class ImageLoader public static final ImageID STATUS_SELECTOR_BOX = new ImageID("service.gui.buttons.STATUS_SELECTOR_BOX"); + /** + * A dial button icon. + */ + public static final ImageID ONE_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.ONE_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID TWO_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.TWO_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID THREE_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.THREE_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID FOUR_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.FOUR_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID FIVE_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.FIVE_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID SIX_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.SIX_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID SEVEN_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.SEVEN_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID EIGHT_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.EIGHT_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID NINE_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.NINE_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID STAR_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.STAR_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID ZERO_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.ZERO_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID DIEZ_DIAL_BUTTON_MAC + = new ImageID("service.gui.buttons.DIEZ_DIAL_BUTTON_MAC"); + + /** + * A dial button icon. + */ + public static final ImageID ONE_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.ONE_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID TWO_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.TWO_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID THREE_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.THREE_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID FOUR_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.FOUR_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID FIVE_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.FIVE_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID SIX_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.SIX_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID SEVEN_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.SEVEN_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID EIGHT_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.EIGHT_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID NINE_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.NINE_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID STAR_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.STAR_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID ZERO_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.ZERO_DIAL_BUTTON_MAC_ROLLOVER"); + + /** + * A dial button icon. + */ + public static final ImageID DIEZ_DIAL_BUTTON_MAC_ROLLOVER + = new ImageID("service.gui.buttons.DIEZ_DIAL_BUTTON_MAC_ROLLOVER"); + /** * A dial button icon. */ @@ -973,6 +1117,30 @@ public class ImageLoader public static final ImageID TRANSPARENT_WINDOW_BUTTON = new ImageID("service.gui.buttons.TRANSPARENT_WINDOW_BUTTON"); + /** + * The dial button shown in contact list. + */ + public static final ImageID CONTACT_LIST_DIAL_BUTTON + = new ImageID("service.gui.buttons.CONTACT_LIST_DIAL_BUTTON"); + + /** + * The dial button shown in contact list. + */ + public static final ImageID CONTACT_LIST_DIAL_BUTTON_PRESSED + = new ImageID("service.gui.buttons.CONTACT_LIST_DIAL_BUTTON_PRESSED"); + + /** + * The dial pad call button background. + */ + public static final ImageID DIAL_PAD_CALL_BUTTON_BG + = new ImageID("service.gui.buttons.DIAL_PAD_CALL_BUTTON_BG"); + + /** + * The dial pad call button rollover background. + */ + public static final ImageID DIAL_PAD_CALL_BUTTON_ROLLOVER_BG + = new ImageID("service.gui.buttons.DIAL_PAD_CALL_BUTTON_ROLLOVER_BG"); + /* * ======================================================================= * ------------------------ EDIT TOOLBAR ICONS --------------------------- diff --git a/src/net/java/sip/communicator/util/swing/SIPCommDialog.java b/src/net/java/sip/communicator/util/swing/SIPCommDialog.java index 75a31cf2f..2f26e612f 100644 --- a/src/net/java/sip/communicator/util/swing/SIPCommDialog.java +++ b/src/net/java/sip/communicator/util/swing/SIPCommDialog.java @@ -18,7 +18,7 @@ * @author Yana Stamcheva * @author Lubomir Marinov */ -public abstract class SIPCommDialog +public class SIPCommDialog extends JDialog { /** @@ -416,5 +416,14 @@ public void dispose() * @param escaped true if this dialog has been closed by pressing * the Esc key; otherwise, false */ - protected abstract void close(boolean escaped); + /** + * All functions implemented in this method will be invoked when user + * presses the Escape key. + * @param isEscaped indicates if this frame has been closed by pressing the + * Esc key + */ + protected void close(boolean isEscaped) + { + + } } diff --git a/src/net/java/sip/communicator/util/swing/plaf/SIPCommTextFieldUI.java b/src/net/java/sip/communicator/util/swing/plaf/SIPCommTextFieldUI.java index eeb081488..4da1b0b0a 100644 --- a/src/net/java/sip/communicator/util/swing/plaf/SIPCommTextFieldUI.java +++ b/src/net/java/sip/communicator/util/swing/plaf/SIPCommTextFieldUI.java @@ -64,28 +64,28 @@ public class SIPCommTextFieldUI /** * The start background gradient color. */ - private final Color bgStartColor + private Color bgStartColor = new Color(UtilActivator.getResources().getColor( "service.gui.SEARCH_BACKGROUND")); /** * The end background gradient color. */ - private final Color bgEndColor + private Color bgEndColor = new Color(UtilActivator.getResources().getColor( "service.gui.SEARCH_GRADIENT")); /** * The start background gradient color. */ - private final Color bgBorderStartColor + private Color bgBorderStartColor = new Color(UtilActivator.getResources().getColor( "service.gui.SEARCH_BORDER")); /** * The end background gradient color. */ - private final Color bgBorderEndColor + private Color bgBorderEndColor = new Color(UtilActivator.getResources().getColor( "service.gui.SEARCH_BORDER_GRADIENT")); @@ -264,8 +264,8 @@ protected Rectangle getDeleteButtonRect() Rectangle rect = c.getBounds(); - int dx = rect.x + rect.width - deleteButton.getWidth() - BUTTON_GAP - 5; - int dy = (rect.y + rect.height) / 2 - deleteButton.getHeight()/2; + int dx = rect.width - deleteButton.getWidth() - BUTTON_GAP - 5; + int dy = rect.height / 2 - deleteButton.getHeight()/2; return new Rectangle( dx, dy, @@ -297,7 +297,7 @@ protected Rectangle getVisibleEditorRect() alloc.x += insets.left; alloc.y += insets.top; alloc.width -= insets.left + insets.right - + deleteButton.getWidth(); + + getDeleteButtonRect().getWidth(); alloc.height -= insets.top + insets.bottom; return alloc; } @@ -305,6 +305,38 @@ protected Rectangle getVisibleEditorRect() return null; } + /** + * @param bgStartColor the bgStartColor to set + */ + public void setBgStartColor(Color bgStartColor) + { + this.bgStartColor = bgStartColor; + } + + /** + * @param bgEndColor the bgEndColor to set + */ + public void setBgEndColor(Color bgEndColor) + { + this.bgEndColor = bgEndColor; + } + + /** + * @param bgBorderStartColor the bgBorderStartColor to set + */ + public void setBgBorderStartColor(Color bgBorderStartColor) + { + this.bgBorderStartColor = bgBorderStartColor; + } + + /** + * @param bgBorderEndColor the bgBorderEndColor to set + */ + public void setBgBorderEndColor(Color bgBorderEndColor) + { + this.bgBorderEndColor = bgBorderEndColor; + } + /** * Reloads skin information. */