From bf8af28f20ea98b22d0b739f1e72a6fb1dc46b0d Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Tue, 28 Apr 2009 12:33:30 +0000 Subject: [PATCH] added "search control" panel better search view git-svn-id: https://only.mawhrin.net/repos/FBReaderJ/trunk@950 6a642e6f-84f6-412e-ac94-c4a38d5a04b0 --- data/resources/application/en.xml | 18 +- data/resources/application/ru.xml | 6 +- platform/android/create_raw_resources.py | 2 + platform/android/data/default/menubar.xml | 2 - platform/android/icons/filetree/fb2.png | Bin 744 -> 0 bytes platform/android/icons/filetree/folder.png | Bin 1015 -> 0 bytes platform/android/icons/filetree/html.png | Bin 1759 -> 0 bytes .../android/icons/filetree/mobipocket.png | Bin 744 -> 0 bytes platform/android/icons/filetree/oeb.png | Bin 744 -> 0 bytes .../android/icons/filetree/openreader.png | Bin 744 -> 0 bytes platform/android/icons/filetree/palm.png | Bin 744 -> 0 bytes platform/android/icons/filetree/plucker.png | Bin 744 -> 0 bytes platform/android/icons/filetree/rtf.png | Bin 744 -> 0 bytes platform/android/icons/filetree/tcr.png | Bin 744 -> 0 bytes platform/android/icons/filetree/unknown.png | Bin 744 -> 0 bytes platform/android/icons/filetree/upfolder.png | Bin 1519 -> 0 bytes platform/android/icons/filetree/weasel.png | Bin 744 -> 0 bytes platform/android/icons/filetree/zipfolder.png | Bin 1067 -> 0 bytes .../icons/text_search/close-active.png | Bin 0 -> 2620 bytes .../icons/text_search/close-default.png | Bin 0 -> 2743 bytes platform/android/icons/text_search/close.xml | 5 + .../android/icons/text_search/next-active.png | Bin 0 -> 1389 bytes .../icons/text_search/next-default.png | Bin 0 -> 916 bytes .../icons/text_search/next-disabled.png | Bin 0 -> 907 bytes platform/android/icons/text_search/next.xml | 6 + .../icons/text_search/previous-active.png | Bin 0 -> 1409 bytes .../icons/text_search/previous-default.png | Bin 0 -> 953 bytes .../icons/text_search/previous-disabled.png | Bin 0 -> 940 bytes .../android/icons/text_search/previous.xml | 6 + .../res/layout/text_search_controls.xml | 24 ++ .../android/fbreader/BookSearchActivity.java | 48 ++-- .../android/fbreader/FBReader.java | 67 ++++- .../android/fbreader/LibraryTabActivity.java | 1 + .../android/fbreader/SearchActivity.java | 86 +++++++ .../android/fbreader/TextSearchActivity.java | 50 ++-- .../android/fbreader/TextSearchControls.java | 123 ++++++++++ .../android/fbreader/ZLTreeAdapter.java | 2 - .../ZLAndroidApplicationWindow.java | 14 +- .../ui/android/library/ZLAndroidActivity.java | 2 +- .../ui/android/view/ZLAndroidWidget.java | 2 + .../fbreader/collection/BookCollection.java | 2 +- .../fbreader/fbreader/ActionCode.java | 1 + .../fbreader/fbreader/BookTextView.java | 9 +- .../fbreader/ChangeFontSizeAction.java | 2 +- .../fbreader/ClearFindResultsAction.java | 32 +++ .../fbreader/fbreader/FBReader.java | 9 +- .../fbreader/fbreader/FBView.java | 4 +- .../fbreader/TrackballScrollingAction.java | 2 +- .../fbreader/optionsDialog/OptionsDialog.java | 3 +- .../core/application/ZLApplication.java | 229 ++---------------- .../core/application/ZLApplicationWindow.java | 109 +-------- .../zlibrary/text/view/ZLTextView.java | 3 +- .../text/view/impl/ZLTextSelectionModel.java | 2 +- .../text/view/impl/ZLTextViewImpl.java | 20 +- 54 files changed, 474 insertions(+), 417 deletions(-) delete mode 100644 platform/android/icons/filetree/fb2.png delete mode 100644 platform/android/icons/filetree/folder.png delete mode 100644 platform/android/icons/filetree/html.png delete mode 100644 platform/android/icons/filetree/mobipocket.png delete mode 100644 platform/android/icons/filetree/oeb.png delete mode 100644 platform/android/icons/filetree/openreader.png delete mode 100644 platform/android/icons/filetree/palm.png delete mode 100644 platform/android/icons/filetree/plucker.png delete mode 100644 platform/android/icons/filetree/rtf.png delete mode 100644 platform/android/icons/filetree/tcr.png delete mode 100644 platform/android/icons/filetree/unknown.png delete mode 100644 platform/android/icons/filetree/upfolder.png delete mode 100644 platform/android/icons/filetree/weasel.png delete mode 100644 platform/android/icons/filetree/zipfolder.png create mode 100644 platform/android/icons/text_search/close-active.png create mode 100644 platform/android/icons/text_search/close-default.png create mode 100644 platform/android/icons/text_search/close.xml create mode 100644 platform/android/icons/text_search/next-active.png create mode 100644 platform/android/icons/text_search/next-default.png create mode 100644 platform/android/icons/text_search/next-disabled.png create mode 100644 platform/android/icons/text_search/next.xml create mode 100644 platform/android/icons/text_search/previous-active.png create mode 100644 platform/android/icons/text_search/previous-default.png create mode 100644 platform/android/icons/text_search/previous-disabled.png create mode 100644 platform/android/icons/text_search/previous.xml create mode 100644 platform/android/res/layout/text_search_controls.xml create mode 100644 platform/android/src/org/geometerplus/android/fbreader/SearchActivity.java create mode 100644 platform/android/src/org/geometerplus/android/fbreader/TextSearchControls.java create mode 100644 src/org/geometerplus/fbreader/fbreader/ClearFindResultsAction.java diff --git a/data/resources/application/en.xml b/data/resources/application/en.xml index d3fd51738..181d1c266 100644 --- a/data/resources/application/en.xml +++ b/data/resources/application/en.xml @@ -42,8 +42,6 @@ - - @@ -64,8 +62,8 @@ - - + + @@ -74,12 +72,12 @@ - - + + - - + + @@ -245,6 +243,10 @@ + + + + diff --git a/data/resources/application/ru.xml b/data/resources/application/ru.xml index 238135bf0..88b91c38c 100644 --- a/data/resources/application/ru.xml +++ b/data/resources/application/ru.xml @@ -40,8 +40,6 @@ - - @@ -245,6 +243,10 @@ + + + + diff --git a/platform/android/create_raw_resources.py b/platform/android/create_raw_resources.py index e14fa5bb9..9b7565370 100755 --- a/platform/android/create_raw_resources.py +++ b/platform/android/create_raw_resources.py @@ -9,6 +9,7 @@ drawable_res_dir = platform_dir + "/res/drawable" data_dir_common = project_dir + "/data" application_icons_dir_common = project_dir + "/icons/application" tree_icons_dir_android = platform_dir + "/icons/tree" +text_search_icons_dir_android = platform_dir + "/icons/text_search" data_dir_android = platform_dir + "/data" print os.getcwd() @@ -37,3 +38,4 @@ process_data_dir("data__", data_dir_common, raw_res_dir) process_data_dir("data__", data_dir_android, raw_res_dir) shutil.copyfile(application_icons_dir_common + "/48x48.png", drawable_res_dir + "/fbreader.png") process_data_dir("tree_icon_", tree_icons_dir_android, drawable_res_dir, 0) +process_data_dir("text_search_", text_search_icons_dir_android, drawable_res_dir, 0) diff --git a/platform/android/data/default/menubar.xml b/platform/android/data/default/menubar.xml index 750316b53..bdfa320e9 100644 --- a/platform/android/data/default/menubar.xml +++ b/platform/android/data/default/menubar.xml @@ -15,6 +15,4 @@ - - diff --git a/platform/android/icons/filetree/fb2.png b/platform/android/icons/filetree/fb2.png deleted file mode 100644 index 928a67995ee9713bc3c86159ed84c0bc568675d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 744 zcmVP)C zM?hT&K^TU_ag0(bxuPga?shwG47iJ;=-p^E`eetGTZ)3<>f+*}zG)Lh5mHLD)~WaG ze#v(I^78Tu$QPiLY5?5a+zsTCLRNN(nF&Tp`V7^WPItN~Ijy6m}ud zZnu+uX#&3BK@iYtwRR$4#!Cq>1bjs}pU+WBmBucFpwsCj{YnA=#^W)kr>BVkgVVPv zio{eBV2W@s7^K$!Y&NS*pxf2#V}hDF=55Q3wlqb(u10_+;NzP_g4? z1l|Aw_yWW>zZ&ogcmXtkCz}`lhCT2&*?ZtC@EQ04o+s^wa(Qec2WuE*swad-w0(C(ANK1Q8*GfQX=~s{nZR z?Ab?y!Qd|N^wt2PC|VpH9i_*|$A}2t`xQtTB}A*$YKq7gw+i6Bmz|v*vMeKnP>B*i zL@>r!W6Xnx4-7jBtTIrVUjzVXHk+;8 z-Ca7J4kbhsMHpj<n*37N7 zt2m!G-KYd2k`ISN`u+YY1DDN12$cH|^*30KB0Oy=f)09r9Lzp&cHER6%&y*LZ`BnfnGL-jSy=K|ltrJDjxB{T6*?2r= zI22x|cjcBAXE^G&&3JbS1 z2S{SWZ0^9zaXIGV9yrUgjI(J5?2*Lgynb(H>_sV@AQ$e7nvIy|MF{BM6#(a4p{k^< zcW7zC+1%e~qRPrZmy19Iya;*)yD^4oRum}13P1>9lIJ<&!qaZXWETKbm%CY138HIf z`*kF$jI-RU(U%o~qA2DfLR{~XrZr}ZfDeibN(jQ66=PjNl<~CCNa0A0LCEIL7^GSP@4br1!q(equnBn)maD$B^i4AHU*(w>!eZ_cYK$rX zsycDbnX`pZk1W|d;QXtZt~J){#w>dcFv&emLhaYbU%iB{D*#4B97($t)Q~$_eR8!r z-=z+7xwA4v4U8rWEM^8~HOtz^Xi@lRw5ao5oUAU7&9vDTJv})?)jtPzfYUXAe!u^- z?0uFvAM^Z=zh1+9a~YMBkVM_K^%MXA002ovPDHLkV1g=#;xqsN diff --git a/platform/android/icons/filetree/html.png b/platform/android/icons/filetree/html.png deleted file mode 100644 index a896697d78043cf2ed044a1a6cdcae86e736cca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1759 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 VrB*sfC(8f;002ovPDHLkV1iwIv6=t? diff --git a/platform/android/icons/filetree/weasel.png b/platform/android/icons/filetree/weasel.png deleted file mode 100644 index 928a67995ee9713bc3c86159ed84c0bc568675d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 744 zcmVP)C zM?hT&K^TU_ag0(bxuPga?shwG47iJ;=-p^E`eetGTZ)3<>f+*}zG)Lh5mHLD)~WaG ze#v(I^78Tu$QPiLY5?5a+zsTCLRNN(nF&Tp`V7^WPItN~Ijy6m}ud zZnu+uX#&3BK@iYtwRR$4#!Cq>1bjs}pU+WBmBucFpwsCj{YnA=#^W)kr>BVkgVVPv zio{eBV2W@s7^K$!Y&NS*pxf2#V}hDF=55Q3wlqb(u10_+;NzP_g4? z1l|Aw_yWW>zZ&ogcmXtkCz}`lhCT2&*?ZtC@EQ04o_(TaVgb657zbqVb6YQ9Yp{)uHPI$P&0x6?Cz35>9(%)GIKJ0~gQwNc=SFiy%eIa0j`vjVrz@2MUC9L` zlgIB}-QBkMfz^8aLLaBU`B(~tE7&N++6X0}L{JK}5|k3O0yV8KE>Gd|PjXYoi<1B2 z6s?KS8y?HAdip^#@af57-&G!XzpG(hGL<~JY~`l*_9Y$Kjs1!jG*FBton)N_Ye5-A zd$FikD7B&uh%OsWHqWP!8>g>#Euu8PT^O5i)^6(DlRa1_(6cc;H)u>9Yg@2%p*V6w z1AXa7o_UStxwn!VIX8JRhas`u}9i&)h|J z`KdRmMbb1E6Hhm12HH(3p8@`Kql%qrYQ|6WC%77hWlg4X5eF z+;zwDf1agr&LZw!xuHe09=1v^7C7n@JE!~w2e!{S{P^bG52rH=ubChI3%=dIJvVgz z$Bmu4Dq;X&Uw6|(V(n3-bx}llqBPD%HJElY&WOae94>F8C;)hVPgbT7a3CLcH@5&3 zZFH$)?W+tN>#1(BM%;Y=I==sW2cFVx0G{~8XLk)|0Zf@CIChU-2I$?ACXq^$Or`5W zAV@X>u%TqX66UJaB`9t1lMQttpp7@<+>8XY@$eJ%@qjjd?F5YW2om-2fcf_xxRC@r zkDyL5VEpnG_(0)W1OlKH;)-Yd6u4S)K^2HXsdCZ11sDS^0Z}yq%|ON}Z*aK(%-qbv zj?!>Nl5v#@$CY(gbxqt3_4i@L8v^E+_KZp-rV!92-TUJ7#9P>%uM1&IjpwZjhZ*_g z#Kb#50`RDKhfL4;tw5&K2E=z(4-^0eWQk9H9w=5L0FVS)N}JCZq%|TWzK>C093~&P l*Q8Z00001b5ch_0Itp) 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 literal 0 HcmV?d00001 diff --git a/platform/android/icons/text_search/close.xml b/platform/android/icons/text_search/close.xml new file mode 100644 index 000000000..f5755d3e4 --- /dev/null +++ b/platform/android/icons/text_search/close.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/platform/android/icons/text_search/next-active.png b/platform/android/icons/text_search/next-active.png new file mode 100644 index 0000000000000000000000000000000000000000..1517e37ab9229ea526f79b78c19ce6b5e357bca9 GIT binary patch literal 1389 zcmV-z1(N!SP)8Z00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01l!601l!7cp)x*00007bV*G`2iXK0 z4>T6f-;ja;00iwxL_t(&-tCxOXdFcV$Nw|Cdw029E=$rR4OR`6)R-2FEk2~Jw&@D> zp;!tQL?vL6qCS*T7D0j_YJEEMQVn`&kfrN!LR4F3`n5O-8_GZ$enR z*;}>cz~dmaKjQ>kp!cnG6zujWX!SZVxZ{m_B1o5YE%eL-<3n{V^xh(huOU=87~FNF zf=v$toaGD!5wvy#03g=;xnUb~2W3S)`5*x0mFu6jiRdlnGmEDQ1qh|W+RbDE&`dsE zb7#gUu6${j(Z~n#?xP=-J<#B;BYCuEqhEuw z*JVYuO951LY(t4n0d{(M>Ylj)1RsL8b)S!VwU-iO1CQ!j=ml9(W97Li6&YDeYpW*i z+Nzda+d=4MT?;k3K$pT+H9qC3+H#;7gkICN&_);N(%32?xcyKa5u}T{7HW5aE=HCC z78wEYRFdG%!vVopbz0X#9pweoX{gKsn;r%L1hyUWN!4|q>fK%Mm&r-#Kft`>Iq!z0 zf_iHZ+)BZ}wWGpU-=yl@U0R=*D|5l8?K>o$M{ z8j-wqGHFI5C&1a8Wnt`{KLb*T4XpqX5x;WMuv77O<=sa=E{~Iv(;E^MAvSCR(or5C z(hO#$UzHX0RM{LoIp@v|OwkLmVH4Qwm>s*(8v|#1WJUe4yw36t*(T}>La1$qIn|#| zP7M7C&e~-~9WB4h5hq~!Ye3~Dq(;vtQ!`V8;Ou!>QD+?A1RddNo0xYWn(>*03JZRl z=Sj0kLSV-uMLR~QY5?)q!WcT6FcY(9z}d^PqNY&-IRez43xfz!ad`RbAR+U>inZ&3 zc%yfDngXk!JZ4V#MnR* zob8tt^}ChO4zWbgiiO-xCT4O@qM`?!+4F3X5Nw1w{i|t&M`!I+e9yoSr?2;Pwuu0E zHnbnRz{?V7PiGs=K+1pK6Re$1dU9O?kt#s_HAqeL8)^O4c>J$F_Kpl(ngrm=iW}I3=@Eq4=<-KmQxo4Kr&0t zvW{3MfEI#T2E%!nd+^QV-Vm_2^I_uMC$a$*j&{E^47@UAx(@Tvw{(CcRc z`Io#qan7W~_+ZMIy`>KIoj+aRKlgfvqnncxKv{u?(!55qLQ|enY66&xPmjMg(toip v4-zjh-E-rG)>TK=QCF^9xpL*oRXOT!=VUFK>EGC}00000NkvXXu0mjfy0C>0 literal 0 HcmV?d00001 diff --git a/platform/android/icons/text_search/next-default.png b/platform/android/icons/text_search/next-default.png new file mode 100644 index 0000000000000000000000000000000000000000..64a9f78ede8f1419f73f8d53ae3da6ca340b64fb GIT binary patch literal 916 zcmV;F18e+=P)Px#0%A)?L;(MXkIcUS000SaNLh0L01l!601l!7cp)x*00007bV*G`2iXK04=@om z*T5wJ00S6FL_t(o!|j((NEA^Rz<+Ocb{s9WY&DGz9V&&o1YJ^6oJ$=d2s%{+MdwZu z1RF$2w@yJ6bc?7{hYl4)<0aBcD*J~)1^u&P7t>tbS>1iF!_JOcBF(H$6Zt*nEi=RS zzTbZDeSZd)B+_EH*u!?~Vyvt!^n#++xNGnI7eI4uX7%NsuE>J|Y&8?zJr`{)@}QG! zu2_3e+_tMC4mwJP^=5OscxX378WbiNrKw^|vly^jA`J>ThN;!t8e)&^?F$m5zBA>? zd0!{A!yT0=l4D$gtkr*d`v?O_2sIrmHo^ zmJQ;my(!Y5Zn}!K*2ntn&Panoo-~GNUvA#C4~7I96jhP}wwcuzdQSZnj|zAE3Fe8#gH zG+t%%=hSgam6I`igNo}T#yqc=iPpM`Y0MQ&@y00}wJwGJDKeKNyG}!G~=2@!m zjzoCvmh^hHBCrY}n7mpleyOZV#XsjpyZUd=S!-4B&jbIU(le^Lrsee3Yg3G+4-NFY qNXpyz;yis?1Dw(&S&}9BzvL(BD=weJnAXz(0000Px#0%A)?L;(MXkIcUS000SaNLh0L01l!601l!7cp)x*00007bV*G`2iXK04=)aN zg~Lt&00R$6L_t(o!|j((NEC4t$G^Y%x8tg-<{uEO4w0>d!d{I6PkM+T=u{!BbaUt= zL5CnJx^;3k3IY!jb@I@`g6P~IB`SsfAckaNYC5*#?(9zU`*oPz**`AA%<3@FzF}sV z`SITGGw=Q0oA(215@=DQ>W13CAC|ejHb|Pp7wWlx0W{MmhbI$bfd>VE9=YjO;=alS z9@NB<1A zT`8~cI^4#M#OgL3W=$bV4QY4H^dICrj%Y!;2T0QhL6Z;syf9W(~3NR^bB zvY)gPjR<%w8roxaNwIteO@g}8sfUDRWA!CFqv$>+6LYPxjTE}%gD1$0+8Ma4-&wBO zrS7BToq9aL9(BqU-`mc;QU?MJ3Rut}l30T@tq%JH>J^n?6F{#VzL&TW&^1~>-GGIj zx~8$jLwA~j`^mPD^6XOpplAVr_Q0-DTbdEUm-N;o8`^h|R`Yi`0D{kkd2RHLTV26F zj}o-PWJ`v1QJHeD?HeeMRwS+OIvZ48d(rnP^b(q}mi@KD29!l_7JTujj7BV{^?5d= zYpiB+wivwXbmoIzjgzl+S_YVM}l= z350^jijjRXf5kK*=J7zlfr5a5g2ahi&k7#Wk1IOLo~Q_9v7Rx;=k9_)00nWjtkmh% zY+&X?GC8e2DQo;06W22O*r(}=TLI>Md*B|FI+Jp_sc9kfoQb3sUzp7yF(>f$wXj+} htkRm)q$dBD`~_#|B}QVGR51Vm002ovPDHLkV1g;_qc{Kn literal 0 HcmV?d00001 diff --git a/platform/android/icons/text_search/next.xml b/platform/android/icons/text_search/next.xml new file mode 100644 index 000000000..15f30c846 --- /dev/null +++ b/platform/android/icons/text_search/next.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/platform/android/icons/text_search/previous-active.png b/platform/android/icons/text_search/previous-active.png new file mode 100644 index 0000000000000000000000000000000000000000..88abf5313ca471109f86640f056da32fa451a85e GIT binary patch literal 1409 zcmV-{1%CR8P)8Z00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01l!601l!7cp)x*00007bV*G`2iXK0 z4>T=))On@=00jX_L_t(&-tC!RXdFcx$G62rf?)g!;>Utz{2Xi4BA$|ArIQyWf)uA!@m=S1edzgcAW?f}{xKq#Co|KDNmA%b+?*YmcQNFK^&#{oTCadD_vCNK{PvhSPf zo_AybV2Lq+>BYLguS6p=E7cVUg+I1+V6VgmK9Xu`k9waxya01%6yPjxl@zqD9mbz= z4$jyE&-44{UoYO)Rm_iH5dxtwv89D7(TD&-zn1G;UUhHZFLNUYe)ne4{+x5r`XB)y zEJ4e!AJ!ISVEl?bx4aUKRD;m7-lkx;)EbhxdJlYVviJbbz-LBQu267+1Rl4i4^^U( zMi3gSZr|G?H12fq)HHY|vHFUOxPpoXszf6lAT;LdI#^5nn}wyYs1#y1ph`5-O9bhx zulvm^;;JGg4~y&sREb6o3$pL4Wrjr#&_{$tpGY;e;fIDrrGRM%ph|4uq`a~DfV<;> zhwJM7u;~9dO6Je;NMQD`&^1sVv2S)i}~-P~N_=={&8vJkxx8+KGw_NcrpbP;S{|K~0V>znDr_pbGYf>mp-A8U1*@G8UDE`!5{(cL`Y9D%A9&lI z^ML6v=B5fJn8n%_=!x+MKo<0i#UL9wsEJ8?1GRvCiwM&3s@A7vNZy45K%RAp>zk4K z{RfqEJ`7-`QMwlB>wnqyKuxIoKZz{WxgU%Z3UOT%Qa66g8aef;_|TbA z09Nzly~i%{a`+u<26XU9H!<}umEi7|o)Fws7v%aDzf{*M8FN$My1L*){f{9v63eQ| zME8x$u`vr!YhAFE61KPo5UE)fK`yng{d9h;Ex7Ah0Oy#R+Tv>1F0=IA1*oPAFtm&d zfO|P0&B6wcbaOL1!h4ThWEBr|@JP26VzD*>K*z3KPSkIj+PA5F*GZO5cgb6V9!BVW zpnA>)!1V~2tU$fk)+!cg0gI%0g%rA;{$oO$P5k}Zwr8IIjNQ7r-_z77oBotAU9(zf zF^Ku?#XoG-w>~X_k0#56NdX9E5j8bS;zMUX)RHsD)3>gwEW7aSi7_Ub7U}{ZnMScV z&N>e*qSIC P00000NkvXXu0mjfJw%;m literal 0 HcmV?d00001 diff --git a/platform/android/icons/text_search/previous-default.png b/platform/android/icons/text_search/previous-default.png new file mode 100644 index 0000000000000000000000000000000000000000..fa931e4ede571baca60aae635d27e55060a0eced GIT binary patch literal 953 zcmV;q14jIbP)Px#0%A)?L;(MXkIcUS000SaNLh0L01l!601l!7cp)x*00007bV*G`2iXK04=**u zjw)&Z00TWqL_t(o!|j((NEA^V$G^Xs-Pv)~Hq#B=wnMR$paqHtx3X|Ss8a+TvY?J# zqLT*+g$N-CI(f)LbP+rDM?&b(Tf7KG^v6S(WoV!h?wanJyE{8GuYapd%p*iO78Bq(IoUu4f(M zSkUbhmZ6p`FBUo1H~wcv zxk*RGtQaC2Ey_fC=)Ke=YlvHLT~Y%k2YYO~hJiJ>n{?oRzkLvQBZdy;35p>BtJGg`$LAmB&t3Nffc1 zHEjV6->Du7%D~drteF?44XzK5)Lm$#1|bpn~AR z=VUziW*VEf5mU2PHUh8I&{N{9GQ0w8Z@ZTpdtPx#0%A)?L;(MXkIcUS000SaNLh0L01l!601l!7cp)x*00007bV*G`2iXK04=*Dy zTAw=r00S^dL_t(o!|j((NEA^V$G>l8cXoDN+qHEU5-m^>qgGJ57)f{#x@u!mI6E_Ku)iPk zc)XeS=ELv(-tYH*Ku!Jw5ig57VyC@pG7ezg^nM^AyH~XxG%*~Q>f(uP_qrZiZOM@5 zq5Ewo_Cn~3v364V%Jz?`H{VC%S9!ef^~6Oa6(=Xqe)G}eGEO7%j&2v1G# zHLSA&adGQKmb?hxZsj$k4~$bp2v~XmkD6K*>u&m}7$k3Fz0JIW{jxX7zvP&DHxH9| zhRn9KM!76bo`k4-pyCBG+Yt$}&V?gea=qBke2zzhY}z6wbq7?u$IWyHy(DQlYPtfN zcoG8bzJaK zL4Wu_8vT*;AmZ}YTR8O(pDA~jq&&5b>QZf+*INKoj7XHs|EM~4cC=9Yk2+HM>;H?8(W z{YIt9fh)t*OOFl;#Zk~9GoZOgz-%e0I~SjBT#xZOKr{}%GQ?s_Ku#V?nG?GTIRcXb z3l<)g%#CEnHe>~W?ga-9UU + + + + + diff --git a/platform/android/res/layout/text_search_controls.xml b/platform/android/res/layout/text_search_controls.xml new file mode 100644 index 000000000..cea106ed4 --- /dev/null +++ b/platform/android/res/layout/text_search_controls.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/platform/android/src/org/geometerplus/android/fbreader/BookSearchActivity.java b/platform/android/src/org/geometerplus/android/fbreader/BookSearchActivity.java index 7773ff764..ed93743c6 100644 --- a/platform/android/src/org/geometerplus/android/fbreader/BookSearchActivity.java +++ b/platform/android/src/org/geometerplus/android/fbreader/BookSearchActivity.java @@ -20,30 +20,38 @@ package org.geometerplus.android.fbreader; import android.app.Activity; -import android.app.SearchManager; -import android.os.Bundle; -import android.content.Intent; - -import org.geometerplus.zlibrary.core.dialogs.ZLDialogManager; import org.geometerplus.fbreader.fbreader.FBReader; import org.geometerplus.fbreader.collection.*; -public class BookSearchActivity extends Activity { - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); +public class BookSearchActivity extends SearchActivity { + private CollectionTree myTree; - final Intent intent = getIntent(); - if (Intent.ACTION_SEARCH.equals(intent.getAction())) { - final FBReader fbreader = (FBReader)FBReader.Instance(); - final String pattern = intent.getStringExtra(SearchManager.QUERY); - fbreader.BookSearchPatternOption.setValue(pattern); - CollectionTree tree = BookCollection.Instance().searchBooks(pattern); - if (tree.hasChildren()) { - LibraryTabActivity.Instance.showSearchResultsTab(tree); - } - } - finish(); + @Override + void onSuccess() { + LibraryTabActivity.Instance.showSearchResultsTab(myTree); + } + + @Override + String getFailureMessageResourceKey() { + return "bookNotFound"; + } + + @Override + String getWaitMessageResourceKey() { + return "bookSearch"; + } + + @Override + boolean runSearch(final String pattern) { + final FBReader fbreader = (FBReader)FBReader.Instance(); + fbreader.BookSearchPatternOption.setValue(pattern); + myTree = BookCollection.Instance().searchBooks(pattern); + return myTree.hasChildren(); + } + + @Override + Activity getParentActivity() { + return LibraryTabActivity.Instance; } } diff --git a/platform/android/src/org/geometerplus/android/fbreader/FBReader.java b/platform/android/src/org/geometerplus/android/fbreader/FBReader.java index d35cd62fa..e2f554204 100644 --- a/platform/android/src/org/geometerplus/android/fbreader/FBReader.java +++ b/platform/android/src/org/geometerplus/android/fbreader/FBReader.java @@ -19,21 +19,26 @@ package org.geometerplus.android.fbreader; +import android.app.SearchManager; import android.content.Intent; +import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import android.content.pm.ActivityInfo; -import android.widget.ZoomControls; +import android.widget.RelativeLayout; import org.geometerplus.zlibrary.core.application.ZLApplication; import org.geometerplus.zlibrary.ui.android.library.ZLAndroidActivity; import org.geometerplus.zlibrary.ui.android.library.ZLAndroidApplication; +import org.geometerplus.zlibrary.ui.android.R; public class FBReader extends ZLAndroidActivity { static FBReader Instance; private int myFullScreenFlag; + private TextSearchControls myTextSearchControls; + private boolean myRestoreTextSearchControls; @Override public void onCreate(Bundle icicle) { @@ -63,13 +68,51 @@ public class FBReader extends ZLAndroidActivity { ActivityInfo.SCREEN_ORIENTATION_SENSOR : ActivityInfo.SCREEN_ORIENTATION_NOSENSOR ); + + if (myTextSearchControls == null) { + myTextSearchControls = new TextSearchControls(this); + myTextSearchControls.Visible = myRestoreTextSearchControls; + + RelativeLayout root = (RelativeLayout)findViewById(R.id.root_view); + RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.WRAP_CONTENT, + RelativeLayout.LayoutParams.WRAP_CONTENT); + p.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + p.addRule(RelativeLayout.CENTER_HORIZONTAL); + root.addView(myTextSearchControls, p); + } } - void showZoomControls() { - final ZoomControls controls = new ZoomControls(this); - controls.setVisibility(View.GONE); - controls.setZoomSpeed(0); - controls.show(); + @Override + public void onResume() { + super.onResume(); + if (myTextSearchControls != null) { + final org.geometerplus.fbreader.fbreader.FBReader fbreader = + (org.geometerplus.fbreader.fbreader.FBReader)ZLApplication.Instance(); + myTextSearchControls.setVisibility(myTextSearchControls.Visible ? View.VISIBLE : View.GONE); + fbreader.registerButtonPanel(myTextSearchControls); + } + } + + @Override + public void onStop() { + if (myTextSearchControls != null) { + ZLApplication.Instance().unregisterButtonPanel(myTextSearchControls); + myRestoreTextSearchControls = myTextSearchControls.Visible; + myTextSearchControls.hide(false); + myTextSearchControls = null; + } + super.onStop(); + } + + void showTextSearchControls(boolean show) { + if (myTextSearchControls != null) { + if (show) { + myTextSearchControls.show(true); + } else { + myTextSearchControls.hide(false); + } + } } protected ZLApplication createApplication(String fileName) { @@ -80,6 +123,18 @@ public class FBReader extends ZLAndroidActivity { @Override public boolean onSearchRequested() { + if (myTextSearchControls != null) { + final boolean visible = myTextSearchControls.Visible; + myTextSearchControls.hide(false); + SearchManager manager = (SearchManager)getSystemService(Context.SEARCH_SERVICE); + manager.setOnCancelListener(new SearchManager.OnCancelListener() { + public void onCancel() { + if ((myTextSearchControls != null) && visible) { + myTextSearchControls.show(false); + } + } + }); + } final org.geometerplus.fbreader.fbreader.FBReader fbreader = (org.geometerplus.fbreader.fbreader.FBReader)ZLApplication.Instance(); startSearch(fbreader.TextSearchPatternOption.getValue(), true, null, false); diff --git a/platform/android/src/org/geometerplus/android/fbreader/LibraryTabActivity.java b/platform/android/src/org/geometerplus/android/fbreader/LibraryTabActivity.java index 98a76b196..e2c64a09a 100644 --- a/platform/android/src/org/geometerplus/android/fbreader/LibraryTabActivity.java +++ b/platform/android/src/org/geometerplus/android/fbreader/LibraryTabActivity.java @@ -57,6 +57,7 @@ public class LibraryTabActivity extends TabActivity implements MenuItem.OnMenuIt new LibraryAdapter(createTab("byAuthor", R.id.by_author), BookCollection.Instance().collectionByAuthor()); new LibraryAdapter(createTab("byTag", R.id.by_tag), BookCollection.Instance().collectionByTag()); new LibraryAdapter(createTab("recent", R.id.recent), BookCollection.Instance().recentBooks()); + findViewById(R.id.search_results).setVisibility(View.GONE); host.setCurrentTabByTag(mySelectedTabOption.getValue()); } diff --git a/platform/android/src/org/geometerplus/android/fbreader/SearchActivity.java b/platform/android/src/org/geometerplus/android/fbreader/SearchActivity.java new file mode 100644 index 000000000..14d2b6ac8 --- /dev/null +++ b/platform/android/src/org/geometerplus/android/fbreader/SearchActivity.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2009 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.fbreader; + +import android.os.*; +import android.app.*; +import android.content.Intent; + +import org.geometerplus.zlibrary.core.resources.ZLResource; +import org.geometerplus.zlibrary.core.dialogs.ZLDialogManager; + +abstract class SearchActivity extends Activity { + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + final Intent intent = getIntent(); + if (Intent.ACTION_SEARCH.equals(intent.getAction())) { + final String pattern = intent.getStringExtra(SearchManager.QUERY); + final Handler successHandler = new Handler() { + public void handleMessage(Message message) { + onSuccess(); + } + }; + final Handler failureHandler = new Handler() { + private AlertDialog myAlertDialog; + public void handleMessage(Message message) { + switch (message.what) { + case 0: + myAlertDialog = + new AlertDialog.Builder(getParentActivity()).setMessage( + ZLResource.resource("errorMessage").getResource(getFailureMessageResourceKey()).getValue() + ).create(); + myAlertDialog.show(); + break; + case 1: + myAlertDialog.dismiss(); + break; + } + } + }; + ZLDialogManager.Instance().wait(getWaitMessageResourceKey(), new Runnable() { + public void run() { + if (runSearch(pattern)) { + successHandler.sendEmptyMessage(0); + } else { + failureHandler.sendEmptyMessage(0); + new Thread(new Runnable() { + public synchronized void run() { + try { + wait(3000); + } catch (InterruptedException e) { + } + failureHandler.sendEmptyMessage(1); + } + }).start(); + } + } + }); + } + finish(); + } + + abstract boolean runSearch(String pattern); + abstract void onSuccess(); + abstract String getWaitMessageResourceKey(); + abstract String getFailureMessageResourceKey(); + abstract Activity getParentActivity(); +} diff --git a/platform/android/src/org/geometerplus/android/fbreader/TextSearchActivity.java b/platform/android/src/org/geometerplus/android/fbreader/TextSearchActivity.java index f6c6ce5b9..14bc42937 100644 --- a/platform/android/src/org/geometerplus/android/fbreader/TextSearchActivity.java +++ b/platform/android/src/org/geometerplus/android/fbreader/TextSearchActivity.java @@ -20,33 +20,33 @@ package org.geometerplus.android.fbreader; import android.app.Activity; -import android.app.SearchManager; -import android.os.Bundle; -import android.content.Intent; -import org.geometerplus.zlibrary.core.dialogs.ZLDialogManager; - -public class TextSearchActivity extends Activity { +public class TextSearchActivity extends SearchActivity { @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); + void onSuccess() { + FBReader.Instance.showTextSearchControls(true); + } - final Intent intent = getIntent(); - if (Intent.ACTION_SEARCH.equals(intent.getAction())) { - final org.geometerplus.fbreader.fbreader.FBReader fbreader = - (org.geometerplus.fbreader.fbreader.FBReader) - org.geometerplus.fbreader.fbreader.FBReader.Instance(); - final String pattern = intent.getStringExtra(SearchManager.QUERY); - fbreader.TextSearchPatternOption.setValue(pattern); - ZLDialogManager.Instance().wait("textSearch", new Runnable() { - public void run() { - int count = fbreader.getTextView().search(pattern, true, false, false, false); - if (count != 0) { - FBReader.Instance.showZoomControls(); - } - } - }); - } - finish(); + @Override + String getFailureMessageResourceKey() { + return "textNotFound"; + } + + @Override + String getWaitMessageResourceKey() { + return "textSearch"; + } + + @Override + boolean runSearch(final String pattern) { + final org.geometerplus.fbreader.fbreader.FBReader fbreader = + (org.geometerplus.fbreader.fbreader.FBReader)org.geometerplus.fbreader.fbreader.FBReader.Instance(); + fbreader.TextSearchPatternOption.setValue(pattern); + return fbreader.getTextView().search(pattern, true, false, false, false) != 0; + } + + @Override + Activity getParentActivity() { + return FBReader.Instance; } } diff --git a/platform/android/src/org/geometerplus/android/fbreader/TextSearchControls.java b/platform/android/src/org/geometerplus/android/fbreader/TextSearchControls.java new file mode 100644 index 000000000..176f29ff2 --- /dev/null +++ b/platform/android/src/org/geometerplus/android/fbreader/TextSearchControls.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2007-2009 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.fbreader; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.animation.AlphaAnimation; +import android.widget.*; + +import org.geometerplus.zlibrary.ui.android.R; + +import org.geometerplus.zlibrary.core.application.ZLApplication; +import org.geometerplus.fbreader.fbreader.ActionCode; + +public class TextSearchControls extends LinearLayout implements View.OnClickListener, ZLApplication.ButtonPanel { + private final ZoomButton myFindPreviousButton; + private final ZoomButton myFindNextButton; + private final ZoomButton myCloseButton; + + boolean Visible; + + public TextSearchControls(Context context) { + super(context); + + setFocusable(false); + + final LayoutInflater inflater = + (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + inflater.inflate(R.layout.text_search_controls, this, true); + //setBackgroundResource(android.R.drawable.zoom_plate); + //setPadding(15, 15, 15, 0); + + myFindPreviousButton = (ZoomButton)findViewById(R.id.previous); + //myFindPreviousButton = new ZoomButton(context); + //myFindPreviousButton.setImageResource(R.drawable.text_search_previous); + myFindPreviousButton.setOnClickListener(this); + //addView(myFindPreviousButton); + + myCloseButton = (ZoomButton)findViewById(R.id.close); + //myCloseButton = new ZoomButton(context); + //myCloseButton.setImageResource(R.drawable.text_search_close); + myCloseButton.setEnabled(true); + myCloseButton.setOnClickListener(this); + //addView(myCloseButton); + + myFindNextButton = (ZoomButton)findViewById(R.id.next); + //myFindNextButton = new ZoomButton(context); + //myFindNextButton.setImageResource(R.drawable.text_search_next); + myFindNextButton.setOnClickListener(this); + //addView(myFindNextButton); + } + + public void onClick(View view) { + if (view == myFindPreviousButton) { + ZLApplication.Instance().doAction(ActionCode.FIND_PREVIOUS); + } else if (view == myFindNextButton) { + ZLApplication.Instance().doAction(ActionCode.FIND_NEXT); + } else { + ZLApplication.Instance().doAction(ActionCode.CLEAR_FIND_RESULTS); + hide(true); + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + return true; + } + + public void show(boolean animate) { + if (animate) { + fade(View.VISIBLE, 0.0f, 1.0f); + } else { + setVisibility(View.VISIBLE); + } + Visible = true; + } + + public void hide(boolean animate) { + if (animate) { + fade(View.GONE, 1.0f, 0.0f); + } else { + setVisibility(View.GONE); + } + Visible = false; + } + + private void fade(int visibility, float startAlpha, float endAlpha) { + final AlphaAnimation animation = new AlphaAnimation(startAlpha, endAlpha); + animation.setDuration(500); + startAnimation(animation); + setVisibility(visibility); + } + + public void updateStates() { + final ZLApplication application = ZLApplication.Instance(); + myFindNextButton.setEnabled(application.isActionEnabled(ActionCode.FIND_NEXT)); + myFindPreviousButton.setEnabled(application.isActionEnabled(ActionCode.FIND_PREVIOUS)); + } + + @Override + public boolean hasFocus() { + return myFindPreviousButton.hasFocus() || myFindNextButton.hasFocus() || myCloseButton.hasFocus(); + } +} diff --git a/platform/android/src/org/geometerplus/android/fbreader/ZLTreeAdapter.java b/platform/android/src/org/geometerplus/android/fbreader/ZLTreeAdapter.java index cf11a5a45..7e15f4ad5 100644 --- a/platform/android/src/org/geometerplus/android/fbreader/ZLTreeAdapter.java +++ b/platform/android/src/org/geometerplus/android/fbreader/ZLTreeAdapter.java @@ -168,8 +168,6 @@ abstract class ZLTreeAdapter extends BaseAdapter implements AdapterView.OnItemCl runTreeItem(getItem(position)); } - private boolean myContextMenuInProgress; - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { } diff --git a/platform/android/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java b/platform/android/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java index 75e59a624..93708c8c6 100644 --- a/platform/android/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java +++ b/platform/android/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java @@ -71,11 +71,11 @@ public final class ZLAndroidApplicationWindow extends ZLApplicationWindow { public void buildMenu(Menu menu) { new MenuBuilder(menu).processMenu(getApplication()); - refresh(); + refreshMenu(); } - protected void refresh() { - super.refresh(); + @Override + protected void refreshMenu() { for (Map.Entry entry : myMenuItemMap.entrySet()) { final String actionId = entry.getValue().ActionId; final ZLApplication application = getApplication(); @@ -94,14 +94,6 @@ public final class ZLAndroidApplicationWindow extends ZLApplicationWindow { return viewWidget; } - public void addToolbarItem(ZLApplication.Toolbar.Item item) { - // TODO: implement - } - - public void setToolbarItemState(ZLApplication.Toolbar.Item item, boolean visible, boolean enabled) { - // TODO: implement - } - public void close() { ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).finish(); } diff --git a/platform/android/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java b/platform/android/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java index f4b01f954..400bced33 100644 --- a/platform/android/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java +++ b/platform/android/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java @@ -63,7 +63,7 @@ public abstract class ZLAndroidActivity extends Activity { } else if (fileToOpen != null) { ZLApplication.Instance().openFiles(new ZLPhysicalFile(new File(fileToOpen))); } - ZLApplication.Instance().refreshWindow(); + ZLApplication.Instance().repaintView(); } @Override diff --git a/platform/android/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidWidget.java b/platform/android/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidWidget.java index 925897dbe..ed3ebcdd7 100644 --- a/platform/android/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidWidget.java +++ b/platform/android/src/org/geometerplus/zlibrary/ui/android/view/ZLAndroidWidget.java @@ -103,6 +103,7 @@ public class ZLAndroidWidget extends View { onDrawInScrolling(canvas); } else { onDrawStatic(canvas); + ZLApplication.Instance().onRepaintFinished(); } } @@ -152,6 +153,7 @@ public class ZLAndroidWidget extends View { mySecondaryBitmap = swap; mySecondaryBitmapIsUpToDate = false; view.onScrollingFinished(myViewPageToScroll); + ZLApplication.Instance().onRepaintFinished(); } else { view.onScrollingFinished(ZLView.PAGE_CENTRAL); } diff --git a/src/org/geometerplus/fbreader/collection/BookCollection.java b/src/org/geometerplus/fbreader/collection/BookCollection.java index 958eaabcd..8ffca8ddd 100644 --- a/src/org/geometerplus/fbreader/collection/BookCollection.java +++ b/src/org/geometerplus/fbreader/collection/BookCollection.java @@ -116,7 +116,7 @@ public final class BookCollection { dirQueue.offer(BookDirectory); while (!dirQueue.isEmpty()) { for (ZLFile file : dirQueue.poll().children()) { - if (file.getName(true).startsWith(".")) { + if (file.getName(false).startsWith(".")) { continue; } if (file.isDirectory()) { diff --git a/src/org/geometerplus/fbreader/fbreader/ActionCode.java b/src/org/geometerplus/fbreader/fbreader/ActionCode.java index b2f2d3c18..3aa51ef38 100644 --- a/src/org/geometerplus/fbreader/fbreader/ActionCode.java +++ b/src/org/geometerplus/fbreader/fbreader/ActionCode.java @@ -30,6 +30,7 @@ public interface ActionCode { String SEARCH = "search"; String FIND_PREVIOUS = "findPrevious"; String FIND_NEXT = "findNext"; + String CLEAR_FIND_RESULTS = "clearFindResults"; String VOLUME_KEY_SCROLL_FORWARD = "volumeKeyScrollForward"; String VOLUME_KEY_SCROLL_BACKWARD = "volumeKeyScrollBackward"; String TRACKBALL_SCROLL_FORWARD = "trackballScrollForward"; diff --git a/src/org/geometerplus/fbreader/fbreader/BookTextView.java b/src/org/geometerplus/fbreader/fbreader/BookTextView.java index 793bbcabf..3cb1985af 100644 --- a/src/org/geometerplus/fbreader/fbreader/BookTextView.java +++ b/src/org/geometerplus/fbreader/fbreader/BookTextView.java @@ -118,7 +118,7 @@ public class BookTextView extends FBView { gotoPosition(0, 0, 0); preparePaintInfo(); savePosition(position, 0, getStartCursor()); - ZLApplication.Instance().refreshWindow(); + ZLApplication.Instance().repaintView(); } //TODO: remove @@ -276,13 +276,14 @@ public class BookTextView extends FBView { void undoPageMove() { gotoPosition((Position)myPositionStack.get(--myCurrentPointInStack)); - ZLApplication.Instance().refreshWindow(); - + ZLApplication.Instance().repaintView(); + /* for (Object p : myPositionStack) { System.out.print(((Position) p).ModelIndex + "," + ((Position) p).ParagraphIndex + "; "); } System.out.println("current position " + myCurrentPointInStack); + */ } boolean canRedoPageMove() { @@ -291,7 +292,7 @@ public class BookTextView extends FBView { void redoPageMove() { gotoPosition((Position)myPositionStack.get(++myCurrentPointInStack)); - ZLApplication.Instance().refreshWindow(); + ZLApplication.Instance().repaintView(); for (Object p : myPositionStack) { System.out.print(((Position) p).ModelIndex + "," diff --git a/src/org/geometerplus/fbreader/fbreader/ChangeFontSizeAction.java b/src/org/geometerplus/fbreader/fbreader/ChangeFontSizeAction.java index eb6639a61..609a6de7c 100644 --- a/src/org/geometerplus/fbreader/fbreader/ChangeFontSizeAction.java +++ b/src/org/geometerplus/fbreader/fbreader/ChangeFontSizeAction.java @@ -35,6 +35,6 @@ class ChangeFontSizeAction extends FBAction { ZLTextStyleCollection.Instance().getBaseStyle().FontSizeOption; option.setValue(option.getValue() + myDelta); Reader.clearTextCaches(); - Reader.refreshWindow(); + Reader.repaintView(); } } diff --git a/src/org/geometerplus/fbreader/fbreader/ClearFindResultsAction.java b/src/org/geometerplus/fbreader/fbreader/ClearFindResultsAction.java new file mode 100644 index 000000000..a38982d1a --- /dev/null +++ b/src/org/geometerplus/fbreader/fbreader/ClearFindResultsAction.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2007-2009 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.fbreader.fbreader; + +import org.geometerplus.zlibrary.text.view.ZLTextView; + +class ClearFindResultsAction extends FBAction { + ClearFindResultsAction(FBReader fbreader) { + super(fbreader); + } + + public void run() { + Reader.getTextView().clearFindResults(); + } +} diff --git a/src/org/geometerplus/fbreader/fbreader/FBReader.java b/src/org/geometerplus/fbreader/fbreader/FBReader.java index 9c3fa764c..b11ac962d 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBReader.java +++ b/src/org/geometerplus/fbreader/fbreader/FBReader.java @@ -92,6 +92,7 @@ public final class FBReader extends ZLApplication { addAction(ActionCode.SEARCH, new SearchAction(this)); addAction(ActionCode.FIND_NEXT, new FindNextAction(this)); addAction(ActionCode.FIND_PREVIOUS, new FindPreviousAction(this)); + addAction(ActionCode.CLEAR_FIND_RESULTS, new ClearFindResultsAction(this)); addAction(ActionCode.SCROLL_TO_HOME, new ScrollToHomeAction(this)); addAction(ActionCode.SCROLL_TO_START_OF_TEXT, new DummyAction(this)); @@ -195,8 +196,7 @@ public final class FBReader extends ZLApplication { setMode(ViewMode.FOOTNOTE); FootnoteView.gotoParagraph(label.ParagraphIndex, false); } - setHyperlinkCursor(false); - refreshWindow(); + repaintView(); } } } @@ -224,8 +224,7 @@ public final class FBReader extends ZLApplication { FootnoteView.setCaption(description.getTitle()); BookCollection.Instance().addBookToRecentList(description); } - resetWindowCaption(); - refreshWindow(); + repaintView(); } void showBookTextView() { @@ -257,7 +256,7 @@ main: } if (description != null) { openBookInternal(description); - refreshWindow(); + repaintView(); } } }); diff --git a/src/org/geometerplus/fbreader/fbreader/FBView.java b/src/org/geometerplus/fbreader/fbreader/FBView.java index 16676bd02..ecb19db1a 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBView.java +++ b/src/org/geometerplus/fbreader/fbreader/FBView.java @@ -61,7 +61,7 @@ public abstract class FBView extends ZLTextViewImpl { } } else { scrollPage(forward, ZLTextView.ScrollingMode.NO_OVERLAPPING, 0); - ZLApplication.Instance().refreshWindow(); + ZLApplication.Instance().repaintView(); } } @@ -167,7 +167,7 @@ public abstract class FBView extends ZLTextViewImpl { } else { scrollTo(PAGE_CENTRAL, 0); onScrollingFinished(viewPage); - ZLApplication.Instance().refreshWindow(); + ZLApplication.Instance().repaintView(); setScrollingActive(false); } } diff --git a/src/org/geometerplus/fbreader/fbreader/TrackballScrollingAction.java b/src/org/geometerplus/fbreader/fbreader/TrackballScrollingAction.java index 727e22369..98875db21 100644 --- a/src/org/geometerplus/fbreader/fbreader/TrackballScrollingAction.java +++ b/src/org/geometerplus/fbreader/fbreader/TrackballScrollingAction.java @@ -36,6 +36,6 @@ class TrackballScrollingAction extends FBAction { public void run() { Reader.getTextView().scrollPage(myForward, ZLTextView.ScrollingMode.SCROLL_LINES, 1); - Reader.refreshWindow(); + Reader.repaintView(); } } diff --git a/src/org/geometerplus/fbreader/optionsDialog/OptionsDialog.java b/src/org/geometerplus/fbreader/optionsDialog/OptionsDialog.java index 78f2aebfb..b43a7fe57 100644 --- a/src/org/geometerplus/fbreader/optionsDialog/OptionsDialog.java +++ b/src/org/geometerplus/fbreader/optionsDialog/OptionsDialog.java @@ -87,9 +87,8 @@ public class OptionsDialog { } public void run() { - myFBReader.grabAllKeys(myFBReader.KeyboardControlOption.getValue()); myFBReader.clearTextCaches(); - myFBReader.refreshWindow(); + myFBReader.repaintView(); } } diff --git a/src/org/geometerplus/zlibrary/core/application/ZLApplication.java b/src/org/geometerplus/zlibrary/core/application/ZLApplication.java index 95d6a5ad7..6e86370ee 100644 --- a/src/org/geometerplus/zlibrary/core/application/ZLApplication.java +++ b/src/org/geometerplus/zlibrary/core/application/ZLApplication.java @@ -47,8 +47,6 @@ public abstract class ZLApplication { private static final String ROTATION = "Rotation"; private static final String ANGLE = "Angle"; private static final String STATE = "State"; - private static final String KEYBOARD = "Keyboard"; - private static final String FULL_CONTROL = "FullControl"; private static final String CONFIG = "Config"; private static final String AUTO_SAVE = "AutoSave"; private static final String TIMEOUT = "Timeout"; @@ -60,9 +58,6 @@ public abstract class ZLApplication { public final ZLIntegerOption AngleStateOption = new ZLIntegerOption(STATE, ANGLE, ZLViewWidget.Angle.DEGREES0); - public final ZLBooleanOption KeyboardControlOption = - new ZLBooleanOption(KEYBOARD, FULL_CONTROL, false); - public final ZLBooleanOption ConfigAutoSavingOption = new ZLBooleanOption(CONFIG, AUTO_SAVE, true); public final ZLIntegerRangeOption ConfigAutoSaveTimeoutOption = @@ -76,10 +71,8 @@ public abstract class ZLApplication { private ZLView myView; private final HashMap myIdToActionMap = new HashMap(); - private Toolbar myToolbar; private Menubar myMenubar; //private ZLTime myLastKeyActionTime; - //private ZLMessageHandler myPresentWindowHandler; protected ZLApplication() { ourInstance = this; @@ -88,16 +81,8 @@ public abstract class ZLApplication { //ZLOption.startAutoSave(ConfigAutoSaveTimeoutOption.getValue()); } - //myPresentWindowHandler = new PresentWindowHandler(this); - //ZLCommunicationManager.instance().registerHandler("present", myPresentWindowHandler); - - new ToolbarCreator().read(ZLResourceFile.createResourceFile("data/default/toolbar.xml")); new MenubarCreator().read(ZLResourceFile.createResourceFile("data/default/menubar.xml")); } - - final Toolbar getToolbar() { - return myToolbar; - } final Menubar getMenubar() { return myMenubar; @@ -107,8 +92,7 @@ public abstract class ZLApplication { if (view != null) { myView = view; if (myViewWidget != null) { - resetWindowCaption(); - refreshWindow(); + repaintView(); } } } @@ -127,41 +111,29 @@ public abstract class ZLApplication { public void initWindow() { setViewWidget(myWindow.createViewWidget()); - if (KeyboardControlOption.getValue()) { - grabAllKeys(true); - } myWindow.init(); setView(myView); } - public final void refreshWindow() { + public final void repaintView() { if (myViewWidget != null) { myViewWidget.repaint(); } + } + + public final void onRepaintFinished() { if (myWindow != null) { - myWindow.refresh(); + myWindow.refreshMenu(); + } + for (ButtonPanel panel : myPanels) { + panel.updateStates(); } } - protected final void resetWindowCaption() { - } - protected final void addAction(String actionId, ZLAction action) { myIdToActionMap.put(actionId, action); } - public final void grabAllKeys(boolean grab) { - if (myWindow != null) { - //myWindow.grabAllKeys(grab); - } - } - - public final void setHyperlinkCursor(boolean hyperlink) { - if (myWindow != null) { - //myWindow.setHyperlinkCursor(hyperlink); - } - } - private final ZLAction getAction(String actionId) { return (ZLAction)myIdToActionMap.get(actionId); } @@ -208,20 +180,6 @@ public abstract class ZLApplication { public abstract void openFiles(ZLFile ... files); - public final void presentWindow() { - if (myWindow != null) { - //myWindow.present(); - } - } - - //public String lastCaller() { - //return null;//((PresentWindowHandler)myPresentWindowHandler).lastCaller(); - //} - - //public void resetLastCaller() { - //((PresentWindowHandler)myPresentWindowHandler).resetLastCaller(); - //} - final void setViewWidget(ZLViewWidget viewWidget) { myViewWidget = viewWidget; } @@ -273,134 +231,19 @@ public abstract class ZLApplication { } myViewWidget.rotate(newAngle); AngleStateOption.setValue(newAngle); - refreshWindow(); + repaintView(); } } - //toolbar - static public final class Toolbar { - private final ArrayList myItems = new ArrayList(); - private final ZLResource myResource = ZLResource.resource("toolbar"); - - private void addButton(String actionId/*, ButtonGroup group*/) { - ButtonItem button = new ButtonItem(actionId, myResource.getResource(actionId)); - myItems.add(button); - //button.setButtonGroup(group); - } - - /* - ButtonGroup createButtonGroup(int unselectAllButtonsActionId) { - return new ButtonGroup(unselectAllButtonsActionId); - } - - public void addOptionEntry(ZLOptionEntry entry) { - if (entry != null) { - myItems.add(new OptionEntryItem(entry)); - } - } - */ - - public void addSeparator() { - myItems.add(new SeparatorItem()); - } - - int size() { - return myItems.size(); - } - - Item getItem(int index) { - return (Item)myItems.get(index); - } - - public interface Item { - } - - public final class ButtonItem implements Item { - private final String myActionId; - private final ZLResource myTooltip; - //private ButtonGroup myButtonGroup; - - public ButtonItem(String actionId, ZLResource tooltip) { - myActionId = actionId; - myTooltip = tooltip; - } - - public String getActionId() { - return myActionId; - } - - public String getIconName() { - return myActionId; - } - - public String getTooltip() { - return myTooltip.hasValue() ? myTooltip.getValue() : null; - } - - /* - ButtonGroup getButtonGroup() { - return myButtonGroup; - } - - boolean isToggleButton() { - return myButtonGroup != null; - } - - void press() { - if (isToggleButton()) { - myButtonGroup.press(this); - } - } - - boolean isPressed() { - return isToggleButton() && (this == myButtonGroup.PressedItem); - } - - private void setButtonGroup(ButtonGroup bg) { - if (myButtonGroup != null) { - myButtonGroup.Items.remove(this); - } - - myButtonGroup = bg; - - if (myButtonGroup != null) { - myButtonGroup.Items.add(this); - } - } - */ - } - - public class SeparatorItem implements Item { - } - - /* - public class OptionEntryItem implements Item { - private ZLOptionEntry myOptionEntry; - - public OptionEntryItem(ZLOptionEntry entry) { - myOptionEntry = entry; - } - - public ZLOptionEntry entry() { - return myOptionEntry; - } - } - - public final class ButtonGroup { - public final int UnselectAllButtonsActionId; - public final ArrayList Items = new ArrayList(); - public ButtonItem PressedItem; - - ButtonGroup(int unselectAllButtonsActionId) { - UnselectAllButtonsActionId = unselectAllButtonsActionId; - PressedItem = null; - } - - void press(ButtonItem item) { - PressedItem = item; - } - } - */ + static public interface ButtonPanel { + void updateStates(); + } + private final HashSet myPanels = new HashSet(); + public final void registerButtonPanel(ButtonPanel panel) { + myPanels.add(panel); + } + public final void unregisterButtonPanel(ButtonPanel panel) { + myPanels.remove(panel); } //Menu @@ -503,40 +346,6 @@ public abstract class ZLApplication { protected abstract void processSepartor(Menubar.Separator separator); } - static public class PresentWindowHandler {//extends ZLMessageHandler { - private ZLApplication myApplication; - private String myLastCaller; - - //public PresentWindowHandler(ZLApplication application); - //public void onMessageReceived(List arguments); - //public String lastCaller(); - //public void resetLastCaller(); - } - - private class ToolbarCreator extends ZLXMLReaderAdapter { - private static final String BUTTON = "button"; - private static final String SEPARATOR = "separator"; - - public boolean dontCacheAttributeValues() { - return true; - } - - public boolean startElementHandler(String tag, ZLStringMap attributes) { - if (myToolbar == null) { - myToolbar = new Toolbar(); - } - if (BUTTON == tag) { - String id = attributes.getValue("id"); - if (id != null) { - myToolbar.addButton(id); - } - } else if (SEPARATOR == tag) { - myToolbar.addSeparator(); - } - return false; - } - } - private class MenubarCreator extends ZLXMLReaderAdapter { private static final String ITEM = "item"; private static final String SUBMENU = "submenu"; diff --git a/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java b/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java index 2f20b8f84..8993f9d11 100644 --- a/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java +++ b/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java @@ -41,120 +41,13 @@ abstract public class ZLApplicationWindow { protected void init() { myApplication.setViewWidget(createViewWidget()); - final ZLApplication.Toolbar toolbar = myApplication.getToolbar(); - if (toolbar != null) { - final int size = toolbar.size(); - for (int i = 0; i < size; ++i) { - addToolbarItem(toolbar.getItem(i)); - } - } - initMenu(); } abstract protected void initMenu(); - - public void onButtonPress(ZLApplication.Toolbar.ButtonItem button) { - /* - if (myToggleButtonLock) { - return; - } - if (button.isToggleButton()) { - myToggleButtonLock = true; - if (button.isPressed()) { - setToggleButtonState(button); - myToggleButtonLock = false; - return; - } else { - button.press(); - ZLApplication.Toolbar.ButtonGroup group = button.getButtonGroup(); - final ArrayList items = group.Items; - final int size = items.size(); - for (int i = 0; i < size; ++i) { - setToggleButtonState(items.get(i)); - } - } - myToggleButtonLock = false; - } - */ - - - getApplication().doAction(button.getActionId()); - } - - //public abstract void setToggleButtonState(ZLApplication.Toolbar.ButtonItem item); - - public abstract void setToolbarItemState(ZLApplication.Toolbar.Item item, boolean visible, boolean enabled); + abstract protected void refreshMenu(); abstract protected ZLViewWidget createViewWidget(); - abstract public void addToolbarItem(ZLApplication.Toolbar.Item item); - - protected void refresh() { - final ZLApplication.Toolbar toolbar = myApplication.getToolbar(); - if (toolbar != null) { - boolean enableToolbarSpace = false; - ZLApplication.Toolbar.Item lastSeparator = null; - final int size = toolbar.size(); - for (int i = 0; i < size; ++i) { - final ZLApplication.Toolbar.Item item = toolbar.getItem(i); - /* - if (item instanceof ZLApplication.Toolbar.OptionEntryItem) { - case OPTION_ENTRY: - { - boolean visible = ((OptionEntryItem)item.entry().isVisible())//((Toolbar.OptionEntryItem)**it).entry()->isVisible(); - if (visible) { - if (lastSeparator != null) { - setToolbarItemState(lastSeparator, true, true); - lastSeparator = null; - } - enableToolbarSpace = true; - } - setToolbarItemState(item, visible, true); - } - break; - } else */ - if (item instanceof ZLApplication.Toolbar.ButtonItem) { - ZLApplication.Toolbar.ButtonItem button = (ZLApplication.Toolbar.ButtonItem)item; - final String id = button.getActionId(); - - final boolean visible = getApplication().isActionVisible(id); - final boolean enabled = getApplication().isActionEnabled(id); - - if (visible) { - if (lastSeparator != null) { - setToolbarItemState(lastSeparator, true, true); - lastSeparator = null; - } - enableToolbarSpace = true; - } - /* - if (!enabled && button.isPressed()) { - ZLApplication.Toolbar.ButtonGroup group = button.getButtonGroup(); - group.press(null); - getApplication().doAction(group.UnselectAllButtonsActionId); - myToggleButtonLock = true; - setToggleButtonState(button); - myToggleButtonLock = false; - } - */ - setToolbarItemState(item, visible, enabled); - } else if (item instanceof ZLApplication.Toolbar.SeparatorItem) { - if (enableToolbarSpace) { - lastSeparator = item; - enableToolbarSpace = false; - } else { - setToolbarItemState(item, false, true); - } - //break; - } - } - - if (lastSeparator != null) { - setToolbarItemState(lastSeparator, false, true); - } - } - } - abstract protected void close(); } diff --git a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java index 47b0bd1f9..09231532d 100644 --- a/src/org/geometerplus/zlibrary/text/view/ZLTextView.java +++ b/src/org/geometerplus/zlibrary/text/view/ZLTextView.java @@ -50,11 +50,12 @@ public abstract class ZLTextView extends ZLView { public abstract void scrollPage(boolean forward, int scrollingMode, int value); public abstract int search(String text, boolean ignoreCase, boolean wholeText, boolean backward, boolean thisSectionOnly); - public abstract boolean canFindNext(); public abstract void findNext(); public abstract boolean canFindPrevious(); public abstract void findPrevious(); + public abstract void clearFindResults(); + public abstract boolean findResultsAreEmpty(); public abstract int getLeftMargin(); public abstract int getRightMargin(); diff --git a/src/org/geometerplus/zlibrary/text/view/impl/ZLTextSelectionModel.java b/src/org/geometerplus/zlibrary/text/view/impl/ZLTextSelectionModel.java index 7cde57097..670b35baf 100644 --- a/src/org/geometerplus/zlibrary/text/view/impl/ZLTextSelectionModel.java +++ b/src/org/geometerplus/zlibrary/text/view/impl/ZLTextSelectionModel.java @@ -279,7 +279,7 @@ final class ZLTextSelectionModel { public void run() { myView.scrollPage(forward, ZLTextView.ScrollingMode.SCROLL_LINES, 1); myDoUpdate = true; - ZLApplication.Instance().refreshWindow(); + ZLApplication.Instance().repaintView(); } }; myTimer.schedule(myScrollingTask, 200, 400); diff --git a/src/org/geometerplus/zlibrary/text/view/impl/ZLTextViewImpl.java b/src/org/geometerplus/zlibrary/text/view/impl/ZLTextViewImpl.java index f3be76708..3541fa93b 100644 --- a/src/org/geometerplus/zlibrary/text/view/impl/ZLTextViewImpl.java +++ b/src/org/geometerplus/zlibrary/text/view/impl/ZLTextViewImpl.java @@ -324,7 +324,7 @@ public abstract class ZLTextViewImpl extends ZLTextView { } */ savePosition(position, myCurrentModelIndex, myCurrentPage.StartCursor); - ZLApplication.Instance().refreshWindow(); + ZLApplication.Instance().repaintView(); } } @@ -359,7 +359,7 @@ public abstract class ZLTextViewImpl extends ZLTextView { (backward ? myModel.getLastMark() : myModel.getFirstMark()) : (backward ? myModel.getPreviousMark(position) : myModel.getNextMark(position))); } - ZLApplication.Instance().refreshWindow(); + ZLApplication.Instance().repaintView(); } return count; } @@ -388,6 +388,18 @@ public abstract class ZLTextViewImpl extends ZLTextView { } } + public void clearFindResults() { + if (!findResultsAreEmpty()) { + myModel.removeAllMarks(); + rebuildPaintInfo(); + ZLApplication.Instance().repaintView(); + } + } + + public boolean findResultsAreEmpty() { + return (myModel == null) || myModel.getMarks().isEmpty(); + } + private volatile boolean myScrollingIsActive; protected boolean isScrollingActive() { return myScrollingIsActive; @@ -1402,7 +1414,7 @@ public abstract class ZLTextViewImpl extends ZLTextView { public boolean onStylusMovePressed(int x, int y) { if (mySelectionModel.extendTo(x, y)) { - ZLApplication.Instance().refreshWindow(); + ZLApplication.Instance().repaintView(); return true; } return false; @@ -1418,7 +1430,7 @@ public abstract class ZLTextViewImpl extends ZLTextView { protected void activateSelection(int x, int y) { if (isSelectionEnabled()) { mySelectionModel.activate(x, y); - ZLApplication.Instance().refreshWindow(); + ZLApplication.Instance().repaintView(); } } }