From da3b49d800a00d4dba32e7c24e6bdf46e5642114 Mon Sep 17 00:00:00 2001 From: Le Xuan Quynh Date: Sun, 8 Aug 2021 17:24:52 +0700 Subject: [PATCH] move files --- QRichTextView/Assets/backcolor.png | Bin 0 -> 2185 bytes QRichTextView/Assets/bold.png | Bin 0 -> 267 bytes QRichTextView/Assets/bold@2x.png | Bin 0 -> 493 bytes QRichTextView/Assets/bullist.png | Bin 0 -> 949 bytes QRichTextView/Assets/bullist@2x.png | Bin 0 -> 473 bytes QRichTextView/Assets/button.png | Bin 0 -> 3506 bytes QRichTextView/Assets/buttonSelected.png | Bin 0 -> 3627 bytes QRichTextView/Assets/buttoncenter.png | Bin 0 -> 3205 bytes QRichTextView/Assets/buttoncenterSelected.png | Bin 0 -> 3507 bytes QRichTextView/Assets/buttonleft.png | Bin 0 -> 3319 bytes QRichTextView/Assets/buttonleftSelected.png | Bin 0 -> 3560 bytes QRichTextView/Assets/buttonright.png | Bin 0 -> 3375 bytes QRichTextView/Assets/buttonrightSelected.png | Bin 0 -> 3656 bytes QRichTextView/Assets/code.png | Bin 0 -> 200 bytes QRichTextView/Assets/colors.jpg | Bin 0 -> 30452 bytes QRichTextView/Assets/dropDownTriangle.png | Bin 0 -> 161 bytes QRichTextView/Assets/dropDownTriangle@2x.png | Bin 0 -> 209 bytes QRichTextView/Assets/email.png | Bin 0 -> 1167 bytes QRichTextView/Assets/file.png | Bin 0 -> 996 bytes QRichTextView/Assets/firstLineIndent.png | Bin 0 -> 180 bytes QRichTextView/Assets/firstLineIndent@2x.png | Bin 0 -> 248 bytes QRichTextView/Assets/forecolor.png | Bin 0 -> 1053 bytes QRichTextView/Assets/image.png | Bin 0 -> 269 bytes QRichTextView/Assets/indent.png | Bin 0 -> 177 bytes QRichTextView/Assets/indent@2x.png | Bin 0 -> 375 bytes QRichTextView/Assets/italic.png | Bin 0 -> 260 bytes QRichTextView/Assets/italic@2x.png | Bin 0 -> 412 bytes QRichTextView/Assets/justifycenter.png | Bin 0 -> 182 bytes QRichTextView/Assets/justifycenter@2x.png | Bin 0 -> 351 bytes QRichTextView/Assets/justifyfull.png | Bin 0 -> 153 bytes QRichTextView/Assets/justifyfull@2x.png | Bin 0 -> 321 bytes QRichTextView/Assets/justifyleft.png | Bin 0 -> 168 bytes QRichTextView/Assets/justifyleft@2x.png | Bin 0 -> 363 bytes QRichTextView/Assets/justifyright.png | Bin 0 -> 169 bytes QRichTextView/Assets/justifyright@2x.png | Bin 0 -> 347 bytes QRichTextView/Assets/link.png | Bin 0 -> 1266 bytes QRichTextView/Assets/numlist.png | Bin 0 -> 971 bytes QRichTextView/Assets/numlist@2x.png | Bin 0 -> 510 bytes QRichTextView/Assets/outdent.png | Bin 0 -> 181 bytes QRichTextView/Assets/outdent@2x.png | Bin 0 -> 378 bytes QRichTextView/Assets/popoverArrowDown.png | Bin 0 -> 1388 bytes QRichTextView/Assets/popoverArrowDown@2x.png | Bin 0 -> 1416 bytes .../Assets/popoverArrowDownSimple.png | Bin 0 -> 292 bytes QRichTextView/Assets/popoverArrowLeft.png | Bin 0 -> 3212 bytes QRichTextView/Assets/popoverArrowLeft@2x.png | Bin 0 -> 3166 bytes .../Assets/popoverArrowLeftSimple.png | Bin 0 -> 293 bytes QRichTextView/Assets/popoverArrowRight.png | Bin 0 -> 3224 bytes QRichTextView/Assets/popoverArrowRight@2x.png | Bin 0 -> 3247 bytes .../Assets/popoverArrowRightSimple.png | Bin 0 -> 292 bytes QRichTextView/Assets/popoverArrowUp.png | Bin 0 -> 1443 bytes QRichTextView/Assets/popoverArrowUp@2x.png | Bin 0 -> 1540 bytes QRichTextView/Assets/popoverArrowUpSimple.png | Bin 0 -> 279 bytes QRichTextView/Assets/popoverBg.png | Bin 0 -> 2339 bytes QRichTextView/Assets/popoverBg@2x.png | Bin 0 -> 4022 bytes QRichTextView/Assets/popoverBgSimple.png | Bin 0 -> 642 bytes QRichTextView/Assets/redo.png | Bin 0 -> 1074 bytes QRichTextView/Assets/removeformat.png | Bin 0 -> 1043 bytes QRichTextView/Assets/strikethrough.png | Bin 0 -> 305 bytes QRichTextView/Assets/strikethrough@2x.png | Bin 0 -> 499 bytes QRichTextView/Assets/underline.png | Bin 0 -> 275 bytes QRichTextView/Assets/underline@2x.png | Bin 0 -> 459 bytes QRichTextView/Assets/undo.png | Bin 0 -> 1076 bytes QRichTextView/Assets/unlink.png | Bin 0 -> 1038 bytes .../NSAttributedString+RichTextEditor.h | 37 ++ .../NSAttributedString+RichTextEditor.m | 220 ++++++++++ .../Classes/UIBarButtonItem+WEPopover.h | 18 + .../Classes/UIBarButtonItem+WEPopover.m | 46 +++ QRichTextView/Classes/UIFont+RichTextEditor.h | 40 ++ QRichTextView/Classes/UIFont+RichTextEditor.m | 103 +++++ QRichTextView/Classes/UIView+RichTextEditor.h | 36 ++ QRichTextView/Classes/UIView+RichTextEditor.m | 72 ++++ .../Classes/WEPopoverContainerView.h | 100 +++++ .../Classes/WEPopoverContainerView.m | 367 +++++++++++++++++ QRichTextView/Classes/WEPopoverController.h | 75 ++++ QRichTextView/Classes/WEPopoverController.m | 377 ++++++++++++++++++ QRichTextView/Classes/WEPopoverParentView.h | 18 + QRichTextView/Classes/WETouchableView.h | 37 ++ QRichTextView/Classes/WETouchableView.m | 70 ++++ 78 files changed, 1616 insertions(+) create mode 100644 QRichTextView/Assets/backcolor.png create mode 100644 QRichTextView/Assets/bold.png create mode 100644 QRichTextView/Assets/bold@2x.png create mode 100644 QRichTextView/Assets/bullist.png create mode 100644 QRichTextView/Assets/bullist@2x.png create mode 100644 QRichTextView/Assets/button.png create mode 100644 QRichTextView/Assets/buttonSelected.png create mode 100644 QRichTextView/Assets/buttoncenter.png create mode 100644 QRichTextView/Assets/buttoncenterSelected.png create mode 100644 QRichTextView/Assets/buttonleft.png create mode 100644 QRichTextView/Assets/buttonleftSelected.png create mode 100644 QRichTextView/Assets/buttonright.png create mode 100644 QRichTextView/Assets/buttonrightSelected.png create mode 100644 QRichTextView/Assets/code.png create mode 100644 QRichTextView/Assets/colors.jpg create mode 100644 QRichTextView/Assets/dropDownTriangle.png create mode 100644 QRichTextView/Assets/dropDownTriangle@2x.png create mode 100644 QRichTextView/Assets/email.png create mode 100644 QRichTextView/Assets/file.png create mode 100644 QRichTextView/Assets/firstLineIndent.png create mode 100644 QRichTextView/Assets/firstLineIndent@2x.png create mode 100644 QRichTextView/Assets/forecolor.png create mode 100644 QRichTextView/Assets/image.png create mode 100644 QRichTextView/Assets/indent.png create mode 100644 QRichTextView/Assets/indent@2x.png create mode 100644 QRichTextView/Assets/italic.png create mode 100644 QRichTextView/Assets/italic@2x.png create mode 100644 QRichTextView/Assets/justifycenter.png create mode 100644 QRichTextView/Assets/justifycenter@2x.png create mode 100644 QRichTextView/Assets/justifyfull.png create mode 100644 QRichTextView/Assets/justifyfull@2x.png create mode 100644 QRichTextView/Assets/justifyleft.png create mode 100644 QRichTextView/Assets/justifyleft@2x.png create mode 100644 QRichTextView/Assets/justifyright.png create mode 100644 QRichTextView/Assets/justifyright@2x.png create mode 100644 QRichTextView/Assets/link.png create mode 100644 QRichTextView/Assets/numlist.png create mode 100644 QRichTextView/Assets/numlist@2x.png create mode 100644 QRichTextView/Assets/outdent.png create mode 100644 QRichTextView/Assets/outdent@2x.png create mode 100755 QRichTextView/Assets/popoverArrowDown.png create mode 100755 QRichTextView/Assets/popoverArrowDown@2x.png create mode 100755 QRichTextView/Assets/popoverArrowDownSimple.png create mode 100755 QRichTextView/Assets/popoverArrowLeft.png create mode 100755 QRichTextView/Assets/popoverArrowLeft@2x.png create mode 100755 QRichTextView/Assets/popoverArrowLeftSimple.png create mode 100755 QRichTextView/Assets/popoverArrowRight.png create mode 100755 QRichTextView/Assets/popoverArrowRight@2x.png create mode 100755 QRichTextView/Assets/popoverArrowRightSimple.png create mode 100755 QRichTextView/Assets/popoverArrowUp.png create mode 100755 QRichTextView/Assets/popoverArrowUp@2x.png create mode 100755 QRichTextView/Assets/popoverArrowUpSimple.png create mode 100755 QRichTextView/Assets/popoverBg.png create mode 100755 QRichTextView/Assets/popoverBg@2x.png create mode 100755 QRichTextView/Assets/popoverBgSimple.png create mode 100644 QRichTextView/Assets/redo.png create mode 100644 QRichTextView/Assets/removeformat.png create mode 100644 QRichTextView/Assets/strikethrough.png create mode 100644 QRichTextView/Assets/strikethrough@2x.png create mode 100644 QRichTextView/Assets/underline.png create mode 100644 QRichTextView/Assets/underline@2x.png create mode 100644 QRichTextView/Assets/undo.png create mode 100644 QRichTextView/Assets/unlink.png create mode 100644 QRichTextView/Classes/NSAttributedString+RichTextEditor.h create mode 100644 QRichTextView/Classes/NSAttributedString+RichTextEditor.m create mode 100755 QRichTextView/Classes/UIBarButtonItem+WEPopover.h create mode 100755 QRichTextView/Classes/UIBarButtonItem+WEPopover.m create mode 100644 QRichTextView/Classes/UIFont+RichTextEditor.h create mode 100644 QRichTextView/Classes/UIFont+RichTextEditor.m create mode 100644 QRichTextView/Classes/UIView+RichTextEditor.h create mode 100644 QRichTextView/Classes/UIView+RichTextEditor.m create mode 100755 QRichTextView/Classes/WEPopoverContainerView.h create mode 100755 QRichTextView/Classes/WEPopoverContainerView.m create mode 100755 QRichTextView/Classes/WEPopoverController.h create mode 100755 QRichTextView/Classes/WEPopoverController.m create mode 100755 QRichTextView/Classes/WEPopoverParentView.h create mode 100755 QRichTextView/Classes/WETouchableView.h create mode 100755 QRichTextView/Classes/WETouchableView.m diff --git a/QRichTextView/Assets/backcolor.png b/QRichTextView/Assets/backcolor.png new file mode 100644 index 0000000000000000000000000000000000000000..794d5c16efa8a07b551203df5a6eff79975255cd GIT binary patch literal 2185 zcmV;42zK|0P)4Tx05}naRo`#hR1`jmZ&IWdKOk5~hl<6oRa0BJ8yc;~21%2p?MfD<>DVeH z9(p*dx19w`~g7O0}n_%Aq@s%d)fBDv`JHkDym6Hd+5XuAtvnwRpGmK zVkc9?T=n|PIo~X-eVh__(Z?q}P9Z-Dj?gOW6|D%o20XmjW-qs4UjrD(li^iv8@eK9k+ZFm zVRFymFOPAzG5-%Pn|1W;U4vNroTa&AxDScmEA~{ri9gr1^c?U@uwSpaNnw8l_>cP1 zd;)kMQS_;jeRSUEM_*s96y65j1$)tOrwdK{YIQMt92l|D^(E_=$Rjw{b!QT@q!)ni zR`|5oW9X5n$Wv+HVc@|^eX5yXnsHX8PF3UX~a6)MwxDE0HaPjyrlI!;jX{6Kvuh*8ej?;85ekN$?5uuCiS zBTvvVG+XTxAO{m@bvM#Jr)z6J><&E22D|vq?Y?Vkbo_DijopiF$2PET#mZ8eu=y$(ArYkv7@Ex`GL?QCc!_*KFrd&;n1r7 zqW-CFs9&fT)ZaU5gc&=gBz-DaCw(vdOp0__x+47~U6sC(E(JNe@4cTT*n6*E zVH4eoU1-&7pEV~_PRe`a7v+@vy!^5}8?Y3)UmlaER00009a7bBm000XT000XT0n*)m`~Uz13rR#lR7ef& zQ*BIJRTzHG?H6rt>B#TfC2f4~^FsSD9KOw?(N%s&%J%#!`^ zdzrsX7M*B}UkNUeIrc%uN}^?j5dlX_hixfcq4ZwbLVNE$-dng=AhP{f_~*&JdEax+ z`##V6yyqN3DaB?EW;4MR?EeYw*kQdI5yZ1*cHU~D)To`h!vUN);mL&@Jz9@=d^wtD z7MN}JY!dh`qvmg9H3AD~ISw6tLlPGgYVcxKkEJZhO&7BQBqHSeEqa4}me;jzwc)fH zyV?>0B45s2p&Eff57uU}Lco$;*%AZ_gJJm&n9Vxm8H~`|Np4;7qw$nQ0e$m$&%Klg zJy|}QN@S!0#$aiqbpHj?*~!q34oM?$|2`)r7iQoYn1O{gpng{|8tMy>Z!@5)%MVGU zFq(AOSyzaCdx}xy_$x@rNbxhTN53hu8*7{uRiLRn42}Nrv2D+RPTJS?gHnJ-kP-+a zhJj561VixE*M8hz!9p*qFd7+fynu7RgyHngqpB(o)6vJC`sfRxxvuu{y;ld^bUHLi zOj(;Ki9(HohzDitwFH&rEDE+5Q0romN{e{s?VoV0y&CDXfTpJHc;(e-=YK{l7HJF&{@Sa6t{xh}p_WpG6=Q$Kq1O`}++TsRG7E}} z?Wn9Og70q|c5HtHPS=Bo@!K#NNmI|z5V?G@n{#^x4%5g;j{>Z=MkP`Dl=Hb{>*;(e zdkFaVaVCW<{5LXmDUna|*iwwlmLN7R!sMuY{qfBEl+K+}0oPkiK~|8) z<~VLlmXUkOawSqICe=)gnc2!hCmtv*K_uqKmlsB0Wp9#D=qBgxyOaZ8U-cRiMS=X~ zlq~zoeEDxb(sb1~_yMKd8JY}!N~eZirk|gBjW#s66xl5+>i;uW#aL0W(x)}lfRPH; zv)vwWsSJWq4l|K?gyf&&(~UAfuII8{?(w=@b*i;UU07|2NDqX9F?)0_C5{F-Ox_TX z;`}-u!rNRJ-Dx(VQI4%C##UI1jVoHbi1$dF zBO7X$sIKdZHOot} zauEOl5C8!X00CIFY;q?krP@eW>2){a5x-u;GtQuQl3m(_2{{Tc?`Bd9;Br{C?M#ehmUlib9nvno~keDY(08yP2k%JV780E15{0gbzTkx~q6Sp240K?q_L#y9JF8jx&0dg~F1*^PA3c8wN0JWH_ zU>no}C9{Prt9#?O$jTqc1s$Q3nCp{@gQTXX*hBTe4^s1AM@A6`dBDzbpp^W{CjbH< j00JNY0w4f%`4eCOfg45_ZuuFT00000NkvXXu0mjfSa{3o literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/bullist.png b/QRichTextView/Assets/bullist.png new file mode 100644 index 0000000000000000000000000000000000000000..cd84c951d6d62d0a7c9690a892c48e5240022169 GIT binary patch literal 949 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqMyzU}gyL32_B-6$}a#EE*Cj76cR= z2#37$4=KfXYR~sI-}DwL#)tnQ*e?X8w0}%VX=vA SGb=(t0qN=L=d#Wzp$Pyf#akc% literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/bullist@2x.png b/QRichTextView/Assets/bullist@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7f90a64064de7d654f22472020644e8888c7053d GIT binary patch literal 473 zcmV;~0Ve*5P)fFrPh zI)S)>BRGO?zzDcON5Bmj0VlvVxh9uJXbD%L$zAdia(vyp_U;{szVDNmZIeW9On?b6 z0Vco%m;e)C0&`3cb1r}#6r{cdP${HK$LC8x2il?F4J3M3^W*$nJg5lVMqZMcWCeh9 z#pYWBV_PMQp@^FS|Hs-!f48mYb+y7v;b{49==cnUPHBzn0^##XDTFYGrNT*}1yb@K zU5JvvB5j^x3t=rdK})S+B^I?QE1-qzVij-+L=qrIT?4g>uc1)lVxUjs6x!kQLp|4h|ifg-!7#0`c)5C3Of{hX>};-v4UL4Og(fy4`(6sATZ^N zECnrSA^Z0=6!CUK@OtjaQTxonZw9(YfR-wqiSiV(azt#>7=$cy%tx!&fp$)-TSE<0 zu-9|T|3qT*46qs%r4E>aEzrZO&>1Gt0sb?`1egF5U;<2l2{3`*_7z|N5IDx!Wxi`- P00000NkvXXu0mjf&CkUs literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/button.png b/QRichTextView/Assets/button.png new file mode 100644 index 0000000000000000000000000000000000000000..69c789decb96e97375ccd4a68cf5ea59fe83b0a8 GIT binary patch literal 3506 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 literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/buttonSelected.png b/QRichTextView/Assets/buttonSelected.png new file mode 100644 index 0000000000000000000000000000000000000000..6d2ced6a1fb642e9862f49c98b8d6541f1762fe5 GIT binary patch literal 3627 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 literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/buttoncenter.png b/QRichTextView/Assets/buttoncenter.png new file mode 100644 index 0000000000000000000000000000000000000000..64cc64e1e387da5a1b44813bc5da1757544dbcd4 GIT binary patch literal 3205 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 literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/buttonleft.png b/QRichTextView/Assets/buttonleft.png new file mode 100644 index 0000000000000000000000000000000000000000..1a15aaeccaba52d059a49e28ed815d354eae86bf GIT binary patch literal 3319 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 FV1nGtPp$v} literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/buttonrightSelected.png b/QRichTextView/Assets/buttonrightSelected.png new file mode 100644 index 0000000000000000000000000000000000000000..e29ea617f6f3aae906e910a24e6b27c8b9e9b117 GIT binary patch literal 3656 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 HN@xNA{HZZ% literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/dropDownTriangle@2x.png b/QRichTextView/Assets/dropDownTriangle@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..164c5012af4f26c4d17862c1a27c07394d7f0a21 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W?!3HGtkJx+wQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@CH?vT-=5i&QJ8rv<3v3jhDQvG&L|x^z^bq{ zV2;De#uIIVCQ~Lf-rzZ$tzpOfQL^oFKn$BuvP78kMoEvZM2WUV(jI+@8f{9_7L81Y z6D$}~#I6=|DW3>&b8{28-N;mI$MBJLL*x}b83raE28JzD6crXKegj(1;OXk;vd$@? F2>^HOLNWjV literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/email.png b/QRichTextView/Assets/email.png new file mode 100644 index 0000000000000000000000000000000000000000..cc79cabddc20cac4076158cc961496c716a134f5 GIT binary patch literal 1167 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqMyzU}gyL332@o1V8?N0HO~-^x?sa z{|{b#c<|uE1t7WsL=O&J_;BFDgJY-8960gdz=;bRfaHM-2M!+IbMWYf0}nPFxUgZz zgKfJGZrE{Q&5nzkcJAM>WAB0;4;JjWuz3B^1sg6b*l=Lpy1ffl9GJ6u$CT9v=dRc@ zVa0`c%T`ZVabU)h^>dc2oUq`)#Ch9$7H;icuyw+M4XtxFO_;HvXV%v4nOnN2uWgvI zp>OKah8YVQCTwWwomVj7K*59sbv?`Lx@Ts!%q?hGP*gkdLxMwgO;19_gtU@|=-S zV~E7mWRBxZ5(zx40uI7c5)u;Q>hEO{R`am{f!aP+Xc zlJfdA4)K%*rUjoAW-QS0Idid@Ur&Q8`1wP9Ch;ff2@f7Vel9MO@?4~u`_SCAYx%=9 zvr_Zku6gn}ZSm^WJi=3g9wjA-Z7sjf5NP&Dz|ocO_5_9CN?uM;dw*Y6_KpRN&KoAE zFbiv|Zx>!K=da)rF!lHmKXnrwoio?{+|OMRRno}OIj@}XFqLiLm4(~9qpR3=WE|9Z f;&4pr(+LI!wPVpTEXoaQL5a!J)z4*}Q$iB}3}9zP literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/file.png b/QRichTextView/Assets/file.png new file mode 100644 index 0000000000000000000000000000000000000000..83ed38cffb84b05741bc0283f6dc5f036d896674 GIT binary patch literal 996 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqMyzU}gyL32{Am^1^`=7Y-gfb>Qg9 zoqP9h*tToKmR(ENY?`-ZeL=^9f(9U(P*5=;0f-8Ks39PuAs_*W3IZYu9DpbQh!Pw; z5)3>N{{R0EG<+0{hQJUC0Xwa%c|hk%l?3?(0~0WIz#yW;a0{r4v%n*=n1O*?2!t6g z-L3lr6io4SaSV}|I`zCaUxNYEak-aXR_W|Nr*Pri{YOQx9^O zOkkaP_{510J^zrNzyJTwpJ=Cdgh@ivbiy4MPkVjipxXxm_4%3fjr*pxi!d`B&*U|V Tct33>&@cv1S3j3^P6<>&kwYlV6aL?bhrrSD;Xa{Ud-6Gl&-s!nd`=r|#m$NtPuF!Eh`{)L93wC?By9H%Za zJ-uf=gI(^Xd4|DmJ%51rV5;L!ekhxY6{w0rNV?R$@H+I@EQ&eOA(ZEcu&v|-Bb^8WoL zU0Vw}4wQGS%BWotTfHQ{a!pY2g1Gz{ae0#i3N{4g%=gMz5|ld0EoqiR!UE5PGV6q? zRtZxaA{JOhOfiUGz4fK z0-JPpxd1IOE(!7r2Bta^0Yl-uy?sFKoCO|{#S9GGLLkg|>2BR0pkRxqi(`n!#NP8K zg_<0ATraW-t`ZPs7ue!h*u*yL;otwqIdxQ5KGK_XG;)d30d=vN7N5$d?eUyh^i1Ap zYpRax8o4cRl_GXVO%{_p;2rDvTjl$cXtODE^_FdST$$gpce$j=)jNkCS)Qp~UTV8} x>f@f%+hV8x>d)BlO@D!WGLNufTirq1ZSocml4TF6=6?bOq^GN&%Q~loCIC$v*~I_= literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/image.png b/QRichTextView/Assets/image.png new file mode 100644 index 0000000000000000000000000000000000000000..2c29b360edf08fcb34379ae8b814732c76f6e63f GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAd3?%E9GuQzsg8-ip*Z=?jKX~w9&bcph&WX;P zIWui01H()P)ntY_7Fx!}#z0x1LS&GBy!}0p&s`Ga7Yvkz0tPRC#!o)kGO-}x-V6mBJ zm4e4ji!D5dM0mrvxpi3#C7qm)svKcD;1kw&2VQHR-93%40cOGleYOE=G0vvA?s pwF?(2s6|Uk6fE4uv-|Qx1_lQQk9F!gx3+=Y?CI*~vd$@?2>`YOb(miLYiH3T%3N8Z%W!;%+l2Z=|f`mO? L{an^LB{Ts51r3!m literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/italic.png b/QRichTextView/Assets/italic.png new file mode 100644 index 0000000000000000000000000000000000000000..f9982f1ec840874f7dd4305469ffb89279228a2f GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8Wu7jMAr-fh{`~)M&uq#l%siFxDsRd`)q^Kaa3t?y*k~xG zy1MaTDZjIbNZSnqAr1CN#tKUV{_u5#Gj3D}t96m!V9NAhYkO48voW#b&C|_SIz&`8 z{>pW{e;DeyWP0MgyS^U!hI%E6*LEMNx;bMS+q;F!8ow`?=(MrX%Y!Xw%JkR;mQ3L+ ziRU-%=+aM!vt$1Hs9I%uQ;cNWoSY7`f*;e`L(Byf4lrEp>oMM^7H}BoVg^rFKbLh* G2~7ZUyI?5* literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/italic@2x.png b/QRichTextView/Assets/italic@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf7b1837c05fab790bd093cb28582d6e18dfc00 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@jCP(bjv*Dd-poA6d&q#tRr(6!jfOl2GYw?}Cgl>A8x4U8 z&6^x=EV#SCCqPJZs#c2ftRsxv(Z9r3C)nn&9}j(OAvPyB)WDokfB}SlNQHf#;iw9~N;rGUzT(F5&)RrN>}>ogaU9vaa_mzok&l@OX2=g5L#Sq!)FpJ(Bp6Pb2k@XDZ8X z>sY_dZnF2jxK6E-7L0Y;pR{SN7}%d6uP(D?m0(Eym8`exclst^a5H$i`njxgN@xNA DzP+4C literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/justifycenter.png b/QRichTextView/Assets/justifycenter.png new file mode 100644 index 0000000000000000000000000000000000000000..bd76f35ae1e87749bb35bc55905479f66306c135 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h82u~NskcwMLzyANXXErqyW}bSG!(;;M%)=*6bm;w;Z?_X^ zU2tMSKR4&jmKf&$lQY@*;Ki~iW literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/justifycenter@2x.png b/QRichTextView/Assets/justifycenter@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8232942ca511505eaec0022d2befddc111160a22 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@jEtTxjv*Dd-pshjdsuR)ac}4BS+j%;k6l@lI$1XHz3$EHQ!Z#UuBcf*W_quj?(}YBgNRZ_+A_ZjGS9-&9{mWq+$Zr&C8_wB zfq6lPuy~!iF>;GxvXw^LS literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/justifyfull.png b/QRichTextView/Assets/justifyfull.png new file mode 100644 index 0000000000000000000000000000000000000000..ee62452bef380b674bf1d6c06b966dc344a8c75c GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!foYfl%)kcwMLfByfsXEtRNW}bSG!(;;M%)=*6c!cpVDo>ke yr^jMB=@#3h*&6P9ZC<5%F+9$w^e|-LFkrZz$!ny`pYRT741=eupUXO@geCwLh%H3` literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/justifyfull@2x.png b/QRichTextView/Assets/justifyfull@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2706960ea467c806ddbf7f657583eb1a618d5618 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1Gk3C%+Ln>~)nSPPC*?`BT@Myi{LS+Ll_Y)jFhd5*#10_`F zDwHnyvOY`b;WLj?^|?PBAGkj{JW=4#h0S`-&y^S$IUE?61R59ujz(&vUtRO<Bi-r4ZuMsfDKeNqe&Cu%N7d|V^Cfk`ix z|M&~0jtei&YPqRj;G4B3=*1Q(?eF!kr$*=`Z}}~vUBwvbaGQUlA`?dV=L7~$cd<%C?mvlev+{Nh7z{qgDlh^2^U1b2! OR0dC1KbLh*2~7ZWJT-g( literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/justifyleft@2x.png b/QRichTextView/Assets/justifyleft@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ebaf8815509b1eb63b5cc76d587e0b225fd15800 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@jJ%#Mjv*Dd-b}yCdq_c~)%)@8o(F7YEbax&vWsrJsb`s@oLPqdVr zl6dX9hk4;+trf{30`3`SnylP@o>OlRUVb5QYE|dX)pM%fw5er|Fvn*fES}&!Q^{Oan#WmG9XNHc8Y-jJJIlf*y^YgU5X2mBz z_etKq>C|P^I_nPOX1h?H58SOhFsCyxBsj}6vN3ersy^H2ebp5t?&<31vd$@?2>=o# BlSKdk literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/justifyright.png b/QRichTextView/Assets/justifyright.png new file mode 100644 index 0000000000000000000000000000000000000000..e281ef498f562aa31a6c94cfc53f1db4fe6b61e0 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!foZ%-G;kcwMLfByfsXEtRNW}bSG!(;;M%)=*6bm;kq^e`$< zn`ozZgh^s$qJkyogTe~DWM4fs6jP7 literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/justifyright@2x.png b/QRichTextView/Assets/justifyright@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e1401edd7c115c325e96fe8fc2179539280537c2 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1Ge?46sLn>~)nQ@V~*?`Bz^C*MlQe^`#w-XvY7X+=Gc01lU zBE5w1Y4iMRf;Tp*faTZCAzopr0Qka%IRF3v literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/link.png b/QRichTextView/Assets/link.png new file mode 100644 index 0000000000000000000000000000000000000000..b261c636ea706ab1bddbc3e9d2a495299c95d43f GIT binary patch literal 1266 zcmeHE?{8C87``~0Kn+R3EtBbo#zcdehC76q?1P>`tLtKx!&(ECkeuPzIv99h12;07 zLjzi9C1+!WJKf5GO;^}Dt}A1Al|ozCtT4i1+lNAw91;d-7+wgPnP}?WKj3FS_~iYO z_sR3&eV_Lbto&fHxyUR@(qc!st;*>6^SLn3sPXl)?@3ag1V41ybGe*8m(%qepVRrA z5D#-)=c=CMLg!f{1be7n41kja^eSf@WFb@((nNFQmr4 zPmNQqk}RQ|sYy<<=zKh-YJ5PuIW&4n)e=!HJ*cGzMpDs{6xCFw@}9F}hBPu5>xrhr zg9)4gM5A5(8p;3`Np?prbo8fi5~7SuBgyc${awAMmENC=YRpIAm|q|gS!ug zfP%Ij=(aM139~Y=YhRnJK$$W~__o#{BE+fy;3rl}>RbG%nF2yVGp}tTuo+qXGQ?=( zw!P3pp@+!LU|r2;z=NIDtxnVmJW%%F3ilrS$2%(Ab++~OU<0yOZ7+4y$>r#ccTsWa z2Fr42Sq_ZP8o&M@|L#Ebowsa;;zUzbrPFZiKMd)q_qUbCs*7;ByHS!}SUR5zCV%$+ zWstKDTbb*n&?m|lCRr@Wca6lR3hf21srDs>=QBeO%9c*AYTr`#q~qDAX8S^Oi~Fz| zD{1Vjo&F_dTD@{p!JO${y60)J`L1uz&X(6dZ}WcV2yHnkd^;Ym9xZXF9Dlwx>=eHE z{{6G|n?K(A=*9TU!Z*37+7UIGe!rfWdc{(?Yr^3#uW$G|+j;*{!_0MP=6 z1R&brkO4#o0tyZUR9pyXc+fiIMAw4jOE;ZbyXokbz2~+cxW3`Qot?)YUAXq-;?0*p z6Gp*k2n^8>5MY~l3+Qz5k|4j}|5yRTGlyq!KqZ_79+AZi4BSE>%y{W;-5;Q!pQnps zh{V)nfx}D^8sZ{P4=J5E%b9e5Ata#1S0GrG-B@^{SYh$Uq(IFhU6~UNb~7yV@)L7Y x(tY$O>G+~a-Tar84CQqCo~Jxizof*&z>p*=H}6cUf;1>FJzf1=);T3K0RYbcZfO7j literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/numlist@2x.png b/QRichTextView/Assets/numlist@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..98b9d4c1ae55c748a06ad1a015d1d33991ab8821 GIT binary patch literal 510 zcmVJi!vJVLucMsO!6BV+`+fxAJwfinRC>5xvyU#MU}y^~In<2d5sKHkGjYu(gri~tCL z00@8p2%u`S09%f%w~v6IOIY7sz<=4rf0h=25P+`43rmXF~ zkeiA0OiC4hpm77+37w54nn*tq)PRf~fd<~l;a%c6GbHrQoI6&2dudgC4YVLuevXd0 z*B6pPJt|=9mm_vR$|zB?5dZ-Y009udpX?^U0ERxU(zG8MmjD0&07*qoM6N<$g5xXM A<^TWy literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/outdent.png b/QRichTextView/Assets/outdent.png new file mode 100644 index 0000000000000000000000000000000000000000..50ef60790c20c9c730b99c149ff803731dda9350 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8a8DP4qz^3C(dN@AzKjcm_(&IGg$0#<$6d?DuRuHQ?! zQlIZBEME}tYaeTsLg~{prT(h*WqFMcV={USS1BrQWKP!7oLjT?;AiQnEm^BxNXQ!B z54sZCT<&M!HaDb)?`-wtCY z*o=(ZQFgoJg&6*=m{X|CeBizNiFLN0Yj$2Za$KWN0OkpXAHfa%49pAxr+s&JyhyVG OiF>;GxvX z!0Re%qZQe3s@hcn7t0C{7wEA(7BgY63D@Jse1afyVFQL^C}u!$Lmp0$Mgxgq@aBU6 zYYOKhJ(P3P7Lcq+gR1&T6b%N0`k+xSEA=RDu~?!U216du$P2VeDx>8|fderHiVv`g z;8z7%f}@N~o!qQi5#Z@Y2%_KR+9H+$n~4G`Lp8>a;(81f#b{jX+5y$W|KrBC+5vB? zpGQ4>KyFr8P!HdM7#QU4$%dkez#Fn$5kOIxCQ4?TMP5>A%8Gy+JtuIalOmirPUK^R z0W+C#+)Ut3CtgJ14!po_x0_=e+hHjaZZ3AoyQZ#yT(6mp1nPHy(~NZ za{J*n+?BBwI5rsG-95Sz`gTpI2~R*J@jL8ooT28#C&Q~+;hJt&S0rWRr{q)2p83dQ zOxLqtyJ+JsuS7}*6yu(hHhyZbZ9Xep@~cYjPD$)(%|z;dpAEi7FSb0J?|Qj>z+=n! z<@6g>{U5V6@4G_Z(34u>TfQ$=_H~a+T_exuCfsYyJ$E~D{c3q~nErn5)BSxp3(KJ| zr}~d3c4WD)+`lrP|I+x2XX0n12%_tGGk1Da7)qZ!w4jpVA?jgo)6dAeW6Px(Ie&d6 zK6tNmAm{vO8PaajrOqt2)c<&Md}t~Bn{LqW{p>#1Uwm(28LByca$jWj&jiy4&ck~x zRaIi$!85aj&QyMBOv{1K({Z<;zB?tyUU(*%-eF+rYtjvO*NFMM=FSI8PknTkczQgu edvxcBEiMsyeR!PA?%jz-|9`Z@OT literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverArrowDown@2x.png b/QRichTextView/Assets/popoverArrowDown@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..8b791165f9347f157326661fa5ff7059dc5931b0 GIT binary patch literal 1416 zcmeAS@N?(olHy`uVBq!ia0vp^DnKmF!3HEnbaWp8DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49sbnArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yY-;xWReF(0~F4nSMoLfxe-hfqrf-$X{U9#U(+h2xnkbT^v$bkg6Y) zTAW{6lnjiIG-a4(VA$ce2&53`8Y};zOkkuW=D6f1m*%GCm3X??DgkBmQZiGl++57v z3=Pdq49txT%q$EIEzAww+zg#u3|$RP9UUDlU}j*`>tbeT;p}Q?V&>@RYG~+c;OJ^( z=w|F>>}YA~=3-%K2-EACS6q^qmz)Z-Hxp(9`B4F0=4a>XDz`(e})5S5Q;?|LA zzFCJHM2;U%nX2a_i?Hb;{?#|-|0=k8&OE~+p8 z9ClI3O-lRpkh!$N`17;lzb#d4oleYNmbt$9V8b0FozqIc|JLbT{%FE;m_0P~y{PL> zP99dp*I$2GdrnI4eCl(1+sTg=Z)Digt@{@iZZvTDF3t3y090eq{ zSihg{(6Vy(;#&*WXNT%X`kh*9cyXWJm4`fke2qdQPwXs>3xD-#RhL!Eg-q@JWxHdu z4Oa9Tw;f(MZ~kPiZ(Ek>)vsQ~bk=YAdIA2S61xGUbTwJ zaqhhqt7TsLL7}1?i5JZ3^R`DPO1yF94#I?@a=gjh?Q4 JF6*2UngHV%`0)S$ literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverArrowDownSimple.png b/QRichTextView/Assets/popoverArrowDownSimple.png new file mode 100755 index 0000000000000000000000000000000000000000..ddae902441a8d0170b848e032890d905ca73df69 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^LLfE=8<1S$XD11yBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%9rJW?45_%4G-cYfxN`>%JUH%PXTf$v&c{JXyd!>6<_U2H zzuHevPR37g%x|#h_G#{FY_nl7oUwq(x}n0XvuzFgBUJ-F;YlvM0{7J}O_+W`A@M+( zz={2u4u7U|G&{Vy_t=PoelF{r5}E*xm1O(? literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverArrowLeft.png b/QRichTextView/Assets/popoverArrowLeft.png new file mode 100755 index 0000000000000000000000000000000000000000..d55ef2b6a4140f4d4244d661f3d6636e46863024 GIT binary patch literal 3212 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 Ef;k=R9RL6T literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverArrowLeftSimple.png b/QRichTextView/Assets/popoverArrowLeftSimple.png new file mode 100755 index 0000000000000000000000000000000000000000..adc4a8a0ac9a73c3d7fd792c645fd795bd5f2d52 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp@KrF<;1|%D@LyUlwWQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8#Ar-fh{`~)M&%DvW&CQL)!#7RQu~~b1EZ@+e~rHF4WO48JYD@<);T3K0RV1vXjA|I literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverArrowRight.png b/QRichTextView/Assets/popoverArrowRight.png new file mode 100755 index 0000000000000000000000000000000000000000..f549522c3772279f10fbf4563f903e56d06b8e30 GIT binary patch literal 3224 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 KMNUMnLSTYN()&;V literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverArrowRight@2x.png b/QRichTextView/Assets/popoverArrowRight@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..84af6f541311a25617d72dc9e0b4cbd87811ff12 GIT binary patch literal 3247 zcmV;g3{dllP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0005nNkl z#`k>#AmxNL06wtRGIw#V{9 z2=VVNmW}tea~Ot5k_6puHzlGUMD&Rbwy_)zhqmRVvzi^UtUGpU)$(cYY;+Zi#RBvB z9930a0r<9^`W(^g^$^D~I-SlGz!zsVV?Adlr13WkY`tDXYmK5Pz5}=h@Wf)aTrM%2 z&9+U!lE$(uk!2Z*qWD?cJhIfxvKa%Iurx?nme5)w&+~&e?}i;?b27}b`BmFIu$;5i zY6Y$J(KbiHESuZf=ALDOST+*?W0rB{(&iw{warc#m(71L`!eC$=JiEldl}^XmKpQ% hLy+PF!We_+0RTG|=ibVSxk3N{002ovPDHLkV1jsq3%CFP literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverArrowRightSimple.png b/QRichTextView/Assets/popoverArrowRightSimple.png new file mode 100755 index 0000000000000000000000000000000000000000..b3ebfe373ad6897681a2c982f8f6cd5444d7d060 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp@KrF<;1|%D@LyUlwWQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8W1cRKAr-fh{`~)M&%Cn1)6Ff7T|j%n63&j?#vdvH$r2l9 zNi1EubidL^bH>77lhyt01UGR?{$TtVxnQl|k_;wBO@(_rS8nhfnR6tosnJHkj_Jw@ z-!3(Q3k_L1$HWDG97t5~V`aOP9AwgXAXZ^pl9D5{hSi(~v)V*Or;p+a>sYkru?s6K zdC4PioY~YyLG4Q&W1;dDOa2S08*i3KcLXzVm n&)1v4$CS0hDdz?=iv+{8K8J7eDw&BuA2E2k`njxgN@xNA28Crn literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverArrowUp.png b/QRichTextView/Assets/popoverArrowUp.png new file mode 100755 index 0000000000000000000000000000000000000000..14adae01488ef433c1d8968887f9586427225717 GIT binary patch literal 1443 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&N!3HFiZux8nQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?{&CLn2Bde0{8v^Ko2Tt~skz|cV7z)0WFNY~KZ%Gk)tz(4^Clz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiFN27#ZmTRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab zT4JjNbScCOxdpzyaD(%Tp#cR9GX09g0)0b01O41wkiWpHi%Wu15zfG>x;Uh=AXPso zwK%`DC>aHCFybnZQU%%yG$2F3nBNEAe!(RRYTBrDUd9xw)9T z85)|K7?>Lwm{}MaT9_NUxfwdS7`hsoIyyR9z|6p^*Tm4p(9+e!%+b-=(9qSu(bdS% z&DhD<(bCk-#lq4Mrq?sCxFj(zITdDaCdgihUSqs^t(=Qe6HD@oLh|!-U@0IVBfliS zI3vG6!8zDe!8b8EGY`ZEMGwTcE~!PCWvMA{Mftf3;PAD|#A3ghlclS%n-kE-xcm*# zn?g>Q=>r|34@w+Ji3KJEOo1RKJm~{D@XV8%2h1@=z^tL0z-~i-H7O#cI=*h zLS|~B{xb3R%K2hpVjra>?j@&xH~()b_P}8AHdd)#Hl69-0&kU1q-@#~wYE>H_n7tU zv){~T`h;z~nZs7Kci!Ij%&{y?jphBv7q1G@($|~*np1uelSzx#RIhJ(cU%>8ImA|Eyt3O>z!AYv(SZm$mt3$%N1!s)rXOeXRI%IcuvNKU;INLd?yI jtgW{uN3C7jIfR55GrEC2u$wq-<)ye7+U(z7$=uPQa|ro1FdR+p5^d!-6WpaI;&7t)}O zrB>59H07!M;4Hle0Ajq1(r+7tK@l~AsZlHq)f>|>BZ7d_ z4PI#F`U)PBmRMqxzFvf;QUwM8k1{>P0c zYKzWFAFa-zMZQdM%k}Ush=AqXJ>5`PQTE2TTwvs)P^AR#E@Np3}Kqa=x12-J#daU9Qxa6AcX(GZxb^J`?DU?0cy29hKZg#53#r?8&?lQXsKj5^#L|7w=Vk=%jd?c>&$ zg~!7~bMnLp@@On=YbyhQXpN1)o&Kv|2m0%7n^m>1_qCjWLQviL1O@T#oPFP{Fe{S? z<<{Glm0z4yN;^;0@IxDph#|!t?TLFQf)jm2)xB{^^Rd)Z-3YH=+q7hbVa|8Y1TNhj zzwqa4j$;qj_mxcq@yvejk@SL=x0}!WAWV#I`{ZW)oi~%?CpuiI!99-seOJbQ&#S2_ zUkLVNdHuudx-Z0U-kA6mxi<;doAVcc#^*I(7H71+m6xK@bXODY#k#rM-qSYBW@BFo zJ=ZvUX3UHAX9n1ZSoS8}cvtC>xcTNPII!kR=R&^RoD@=Rv5tbAj#(fzABSH>l~yMEnxwAU4-D7whN$D^?B6&H(! zwMtD3KYGwyn^LC;>AGs$qVoq^E*GEfFbgTFp*1Jxzwy%Sf|%Wdt>2De_xDCOjdFn* z8}R$)!Hv2*hhy6N6BOrwBvp_D>Z948@&1;Lu<6o`G6s_v!NED>pZ+bM0&z@NS{( zJaZG%Q-e|yQz{EjrrH1%?euhU45_%4G-cYfGzF#)3?IdFg#72(Fkbd?kx=43;@%L! zGGEDw&5-${k3tyhqmxr4rf?tm7O+iT;P~X^31$M<7k8F2Ze-GA+sOD)NuyWp#peZa zYNr;6DO@|Cn9g_P=n)APuE{w}iQ$|_+J5i|u{^SLQQ@30{W-Itx?ZzGpw3YTnSfR{ z#x}=^4l*Ykq)tqjII)n)P-0;ui^$UBjWhZiOFjs7^v?YG bNMLw;SmgU8pZ{V&PcV48`njxgN@xNAA9P{p literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverBg.png b/QRichTextView/Assets/popoverBg.png new file mode 100755 index 0000000000000000000000000000000000000000..8fb67548f80c749e82f1c216cd87fcea49b62584 GIT binary patch literal 2339 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 TBkP}U{%sNRgLx-?;y3&SPSM7* literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverBg@2x.png b/QRichTextView/Assets/popoverBg@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..e1e575b0816f7a59b36acd385c687b3c135175e1 GIT binary patch literal 4022 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 literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/popoverBgSimple.png b/QRichTextView/Assets/popoverBgSimple.png new file mode 100755 index 0000000000000000000000000000000000000000..3cdf457d54debb572e821fbb2424632164dd2b78 GIT binary patch literal 642 zcmV-|0)737P)Px#24YJ`L;xEA8vq-0Wtfow000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipY& z3p*Td^<|g<00II@L_t(Y$L*HAj?+L8fWMjDLph^>Kr~K!qN1TfRPYo$1)`(9N1#WD zC!j~X0K5Q^5ERt>MB*ojlbmCFX(ni8Y$xVIXl|s@#)@aZogeQET*!e$db}e&>_Wru z&<8AlMyvJ&SEeCaJ2wzO(los%B9DOEK)PcTKZg*;MNvGTOeU{^0$AI+fd|)OtfSHB zv8p};ZUV#jKwESuA}7wd2T78+EX&5VNVI|_P1E}#^0XG(-m0p1oOAD2tJRk%+!YXf zQ%*(X6mT`@uEiLO8w>^yfpL`cvI&fNd20_)%W@k#YjfW&I# zGB5xP!Hg3Q;l#akN;Y*H&3Bm#?PN=^IPkPtygEyOx5}EX&?{??0&O4G~F15y^2v;2@l!G-wx8sDS zEqULw{#`E+ZFo0(=lcmeKCIe(cjexDi}t=-vitqYz3*1;d%xr0#ob4*tvvdE&CxfT z553=d?8Ww@@3)_Lw&~Q{9VegcI`QJr=|=}nKRa;l$?;1sPF;Qj^u;I`4FNJjpr%Q{ z52($#B*-uLKgEE-F^T0p&^XQlkH}&M25un`X1sK_?hjC~)6>NGTIr0s=OfiMDWObsAe+uH3Zw z#7d1K1`&teIgu7R*!O@3<5;(d|_&CEt5r#^ccvl*H&&i u>b}UxD&mixc51h(L(Z9v97%?gIUE^wc}A}&+okvu6keXLelF{r5}E)H{S2f4 literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/removeformat.png b/QRichTextView/Assets/removeformat.png new file mode 100644 index 0000000000000000000000000000000000000000..1a2b6dc0c54d2aa76d89602e6a86afe396fa80ba GIT binary patch literal 1043 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqMyzU}gyL32_B-{{z8~{}(Pic<|uE zhY$a6-+OlR&Xa(IhJ=C%1q}-tCTwV%x_QEa0}D1>*l^&%Euie(r#J3AzJB}B;3=*Ydu{YLnNjqUpUSru|oBP+BxmB%AHyo z3g=FoIHIG~q@%$hl$;v$%uOhTz4PVD4F*MuEUgJiMKT4Bi92RAiTDICdHOJ`X`DN9 zf?a*-bDZa literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/strikethrough.png b/QRichTextView/Assets/strikethrough.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8366333594b2ea257968cd76a9c9c893bf7eb7 GIT binary patch literal 305 zcmV-10nYx3P)}M7hOvM&Abtl@hJ?=mu^=`B!DiqwFb!%z2h;#1s9_*67jg`Q zxeVDg#!#_Pat!>B zz|3Glv&a>nx6oWX3y9xC*?TbjjwK93p|Oe#1d+lvjnqg1rMcZ$T)7)daw6J5D&hl;Z|in?^qp8E8p*_B^`s1VV)i zJ)fF`H2ZcJN~OtetIg#Am@^PF1Z^W7U?diHlz>bW zKTiQD_G$!x3$=G)mV2~q;z*-?g^O^iqqxwCvJ+9i-f#kxn!*wT6zL0@Y?d$&l!ly~ zD_RNj099IUfFpxzJn}nr@cEHA)PGh~+98o7MBGYHo4Dtq_e~uyUlqhSFiQpRTr&V| z5d$e7?=$YyA$Pe^bN!YlfNv!R=tgJsu9b8v(ZbG`x>657;<`~Bpf=$`4&2ArddKQk pLN9j}Kmim$0Te(1UMRl;3;-Tf1s{uHtH%HU002ovPDHLkV1n*L#-tB5ejdEM5wV8g=bQ z?3hFEHL6{2Ok|tYXt06nq(O-ShiLi1XBsha``V8Ozh4;9IVc<>Zg>(*PK8RG=W++xEZenV2S#cBhJEf&NO;#LKXijrF>b!AQ<6(yx;pNIp-JiI~ zb)63EIl*RVWMt$J+sxOqk%g7#j8h@cyfyARWr|OnRBJYN=rRSKk*H+VacE#<2-cY0 U@3Ph_66gU2Pgg&ebxsLQ0A_4nXaE2J literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/underline@2x.png b/QRichTextView/Assets/underline@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502a40f08c3fddc46134e117823f4b3c1ca903ff GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@jJcjJjv*Dd-pqW++hicny7J@xo&y|t49W&g$`(zFf#dhE7|zvEsh_#(#_I21UsSqY{a(8*_3fr!ZlG-tux4fL3x}m4)+IkL z_$=@|d{*pi;HTH;5`+1+&YZ>CAgj;%So*l>+1iIQR|~f{thzWMt#jWWuVstf8m0<- z$c^^?`}2n=qr)x>hNy?PWOZ-bh$)l_Z|D3rU+$nnFO!1P-Tf{LZfQ0AT*@&;&`fH! z1cP?&y`2nQ9=m^EVz6R#$jhzSYr?Q}fBWMq-5HP1{7nur>ssShE4q?X=S-i?w&#^c z{`u%GH-25BW-0#U&4!Ot9|SRo{;H_82>KN^X^w@3-R_SEkIO|zCg=aT*TXn%SL>V5 zT$za8yqq=gw}1#tX$=galoMfh%Us{9Sx|s5K(u*q2hs8-GjKMy#Wmm zBHJDWG<*o?_>eH+LB`bg2@^gP%y>{R<3quM5B;ky&s=-1Va12u4euwc_%M6>`&m2Q zPT25a)z&l1w%=H?iH^nUZPx7&}t-+cQ0wv%tJT)TSd+TF|7@1MW={PdM~r*FOmdSMidh5&gXu&1L}RgEpeDNHRb6N3kwk$ z*_o}O51S@Ex>R(B&4G=7(gKayJJu|b^$75h*3&q0{P3Y8FJ5FER!;1CSfQ(!=_CKq yJ7W>|tt=0Yq#t(!oE&7GFL>OWwIe`DgM)$NRb-)4k;7k*Ydu~4T-G@yGywqmq7^y- literal 0 HcmV?d00001 diff --git a/QRichTextView/Assets/unlink.png b/QRichTextView/Assets/unlink.png new file mode 100644 index 0000000000000000000000000000000000000000..a5913e02f96ca8dddd376e27e0fbbb8b94a712be GIT binary patch literal 1038 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqMyzU}gyL331hSNP6<x0o3`%$|NsBHH!q((xqt84wFfUge1HG`($y;mZhV-xW>;Z# zzkx?VLcxT9f(h$(p8Nj&`+*Y=x~Hz#ap1V6PfkL^f&d`iaADHY9ha}&?_IR*%C+k= z7VmNoDQK9n;pByD8D+iK?%fMcthw;u!^-WKvs>rQUU_u$-V3u4nJa0`Jj?ur8r42^S!X!2^5(8t%5t?w zvbS_8%g&jqicPPI9$7g#+`jt7rN!sVRK=#gARZrs^e*jJ4lI#BkLLDH$)RiXo_122_Tq-y;9R%Xqxi&>Bu?y81 cb8<5=94Y2|^F>2^Iw&kWUHx3vIVCg!0Ke$wo&W#< literal 0 HcmV?d00001 diff --git a/QRichTextView/Classes/NSAttributedString+RichTextEditor.h b/QRichTextView/Classes/NSAttributedString+RichTextEditor.h new file mode 100644 index 0000000..423f99c --- /dev/null +++ b/QRichTextView/Classes/NSAttributedString+RichTextEditor.h @@ -0,0 +1,37 @@ +// +// NSAttributedString+RichTextEditor.h +// RichTextEdtor +// +// Created by Aryan Gh on 7/21/13. +// Copyright (c) 2013 Aryan Ghassemi. All rights reserved. +// +// https://github.com/aryaxt/iOS-Rich-Text-Editor +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import "UIFont+RichTextEditor.h" + +@interface NSAttributedString (RichTextEditor) + +- (NSRange)firstParagraphRangeFromTextRange:(NSRange)range; +- (NSArray *)rangeOfParagraphsFromTextRange:(NSRange)textRange; +- (NSString *)htmlString; + +@end diff --git a/QRichTextView/Classes/NSAttributedString+RichTextEditor.m b/QRichTextView/Classes/NSAttributedString+RichTextEditor.m new file mode 100644 index 0000000..15052e2 --- /dev/null +++ b/QRichTextView/Classes/NSAttributedString+RichTextEditor.m @@ -0,0 +1,220 @@ +// +// NSAttributedString+RichTextEditor.m +// RichTextEdtor +// +// Created by Aryan Gh on 7/21/13. +// Copyright (c) 2013 Aryan Ghassemi. All rights reserved. +// +// https://github.com/aryaxt/iOS-Rich-Text-Editor +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "NSAttributedString+RichTextEditor.h" + +@implementation NSAttributedString (RichTextEditor) + +#pragma mark - Public MEthods - + +- (NSRange)firstParagraphRangeFromTextRange:(NSRange)range +{ + NSInteger start = -1; + NSInteger end = -1; + NSInteger length = 0; + + NSInteger startingRange = (range.location == self.string.length || [self.string characterAtIndex:range.location] == '\n') ? + range.location-1 : + range.location; + + for (int i=startingRange ; i>=0 ; i--) + { + char c = [self.string characterAtIndex:i]; + if (c == '\n') + { + start = i+1; + break; + } + } + + start = (start == -1) ? 0 : start; + + NSInteger moveForwardIndex = (range.location > start) ? range.location : start; + + for (int i=moveForwardIndex; i<= self.string.length-1 ; i++) + { + char c = [self.string characterAtIndex:i]; + if (c == '\n') + { + end = i; + break; + } + } + + end = (end == -1) ? self.string.length : end; + length = end - start; + + return NSMakeRange(start, length); +} + +- (NSArray *)rangeOfParagraphsFromTextRange:(NSRange)textRange +{ + NSMutableArray *paragraphRanges = [NSMutableArray array]; + NSInteger rangeStartIndex = textRange.location; + + while (true) + { + NSRange range = [self firstParagraphRangeFromTextRange:NSMakeRange(rangeStartIndex, 0)]; + rangeStartIndex = range.location + range.length + 1; + + [paragraphRanges addObject:[NSValue valueWithRange:range]]; + + if (range.location + range.length >= textRange.location + textRange.length) + break; + } + + return paragraphRanges; +} + +- (NSString *)htmlString +{ + NSMutableString *htmlString = [NSMutableString string]; + NSArray *paragraphRanges = [self rangeOfParagraphsFromTextRange:NSMakeRange(0, self.string.length-1)]; + + for (int i=0 ; i 0) + [htmlString appendFormat:@"text-indent:%.0fpx; ", paragraphStyle.firstLineHeadIndent - paragraphStyle.headIndent]; + + if (paragraphStyle.headIndent > 0) + [htmlString appendFormat:@"margin-left:%.0fpx; ", paragraphStyle.headIndent]; + + + [htmlString appendString:@" \">"]; + + [self enumerateAttributesInRange:range + options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired + usingBlock:^(NSDictionary *dictionary, NSRange range, BOOL *stop){ + + NSMutableString *fontString = [NSMutableString string]; + UIFont *font = [dictionary objectForKey:NSFontAttributeName]; + UIColor *foregroundColor = [dictionary objectForKey:NSForegroundColorAttributeName]; + UIColor *backGroundColor = [dictionary objectForKey:NSBackgroundColorAttributeName]; + NSNumber *underline = [dictionary objectForKey:NSUnderlineStyleAttributeName]; + BOOL hasUnderline = (!underline || underline.intValue == NSUnderlineStyleNone) ? NO :YES; + NSNumber *strikeThrough = [dictionary objectForKey:NSStrikethroughStyleAttributeName]; + BOOL hasStrikeThrough = (!strikeThrough || strikeThrough.intValue == NSUnderlineStyleNone) ? NO :YES; + + [fontString appendFormat:@""]; + [fontString appendString:[[self.string substringFromIndex:range.location] substringToIndex:range.length]]; + [fontString appendString:@""]; + + if ([font isBold]) + { + [fontString insertString:@"" atIndex:0]; + [fontString insertString:@"" atIndex:fontString.length]; + } + + if ([font isItalic]) + { + [fontString insertString:@"" atIndex:0]; + [fontString insertString:@"" atIndex:fontString.length]; + } + + if (hasUnderline) + { + [fontString insertString:@"" atIndex:0]; + [fontString insertString:@"" atIndex:fontString.length]; + } + + if (hasStrikeThrough) + { + [fontString insertString:@"" atIndex:0]; + [fontString insertString:@"" atIndex:fontString.length]; + } + + + [htmlString appendString:fontString]; + }]; + + [htmlString appendString:@"

"]; + } + + return htmlString; +} + +#pragma mark - Helper Methods - + +- (NSString *)htmlTextAlignmentString:(NSTextAlignment)textAlignment +{ + switch (textAlignment) + { + case NSTextAlignmentLeft: + return @"left"; + + case NSTextAlignmentCenter: + return @"center"; + + case NSTextAlignmentRight: + return @"right"; + + case NSTextAlignmentJustified: + return @"justify"; + + default: + return nil; + } +} + +- (NSString *)htmlRgbColor:(UIColor *)color +{ + CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; + [color getRed:&red green:&green blue:&blue alpha:&alpha]; + return [NSString stringWithFormat:@"rgb(%d,%d,%d)",(int)(red*255.0), (int)(green*255.0), (int)(blue*255.0)]; +} + +@end diff --git a/QRichTextView/Classes/UIBarButtonItem+WEPopover.h b/QRichTextView/Classes/UIBarButtonItem+WEPopover.h new file mode 100755 index 0000000..4cf59bd --- /dev/null +++ b/QRichTextView/Classes/UIBarButtonItem+WEPopover.h @@ -0,0 +1,18 @@ +/* + * UIBarButtonItem+WEPopover.h + * WEPopover + * + * Created by Werner Altewischer on 07/05/11. + * Copyright 2010 Werner IT Consultancy. All rights reserved. + * + */ + +#import +#import + +@interface UIBarButtonItem(WEPopover) + +- (CGRect)frameInView:(UIView *)v; +- (UIView *)superview; + +@end diff --git a/QRichTextView/Classes/UIBarButtonItem+WEPopover.m b/QRichTextView/Classes/UIBarButtonItem+WEPopover.m new file mode 100755 index 0000000..52b13d2 --- /dev/null +++ b/QRichTextView/Classes/UIBarButtonItem+WEPopover.m @@ -0,0 +1,46 @@ +/* + * UIBarButtonItem+WEPopover.m + * WEPopover + * + * Created by Werner Altewischer on 07/05/11. + * Copyright 2010 Werner IT Consultancy. All rights reserved. + * + */ + +#import "UIBarButtonItem+WEPopover.h" + +@implementation UIBarButtonItem(WEPopover) + +- (CGRect)frameInView:(UIView *)v { + + UIView *theView = self.customView; + if (!theView && [self respondsToSelector:@selector(view)]) { + theView = [self performSelector:@selector(view)]; + } + + UIView *parentView = theView.superview; + NSArray *subviews = parentView.subviews; + + NSUInteger indexOfView = [subviews indexOfObject:theView]; + NSUInteger subviewCount = subviews.count; + + if (subviewCount > 0 && indexOfView != NSNotFound) { + UIView *button = [parentView.subviews objectAtIndex:indexOfView]; + return [button convertRect:button.bounds toView:v]; + } else { + return CGRectZero; + } +} + +- (UIView *)superview { + + UIView *theView = self.customView; + if (!theView && [self respondsToSelector:@selector(view)]) { + theView = [self performSelector:@selector(view)]; + } + + UIView *parentView = theView.superview; + return parentView; +} + +@end diff --git a/QRichTextView/Classes/UIFont+RichTextEditor.h b/QRichTextView/Classes/UIFont+RichTextEditor.h new file mode 100644 index 0000000..a56acf5 --- /dev/null +++ b/QRichTextView/Classes/UIFont+RichTextEditor.h @@ -0,0 +1,40 @@ +// +// UIFont+RichTextEditor.h +// RichTextEdtor +// +// Created by Aryan Gh on 7/21/13. +// Copyright (c) 2013 Aryan Ghassemi. All rights reserved. +// +// https://github.com/aryaxt/iOS-Rich-Text-Editor +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +@interface UIFont (RichTextEditor) + ++ (NSString *)postscriptNameFromFullName:(NSString *)fullName; ++ (UIFont *)fontWithName:(NSString *)name size:(CGFloat)size boldTrait:(BOOL)isBold italicTrait:(BOOL)isItalic; +- (UIFont *)fontWithBoldTrait:(BOOL)bold italicTrait:(BOOL)italic andSize:(CGFloat)size; +- (UIFont *)fontWithBoldTrait:(BOOL)bold andItalicTrait:(BOOL)italic; +- (BOOL)isBold; +- (BOOL)isItalic; + +@end diff --git a/QRichTextView/Classes/UIFont+RichTextEditor.m b/QRichTextView/Classes/UIFont+RichTextEditor.m new file mode 100644 index 0000000..10b95ce --- /dev/null +++ b/QRichTextView/Classes/UIFont+RichTextEditor.m @@ -0,0 +1,103 @@ +// +// UIFont+RichTextEditor.m +// RichTextEdtor +// +// Created by Aryan Gh on 7/21/13. +// Copyright (c) 2013 Aryan Ghassemi. All rights reserved. +// +// https://github.com/aryaxt/iOS-Rich-Text-Editor +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIFont+RichTextEditor.h" + +@implementation UIFont (RichTextEditor) + ++ (NSString *)postscriptNameFromFullName:(NSString *)fullName +{ + UIFont *font = [UIFont fontWithName:fullName size:1]; + return (__bridge NSString *)(CTFontCopyPostScriptName((__bridge CTFontRef)(font))); +} + ++ (UIFont *)fontWithName:(NSString *)name size:(CGFloat)size boldTrait:(BOOL)isBold italicTrait:(BOOL)isItalic +{ + NSString *postScriptName = [UIFont postscriptNameFromFullName:name]; + + CTFontSymbolicTraits traits = 0; + CTFontRef newFontRef; + CTFontRef fontWithoutTrait = CTFontCreateWithName((__bridge CFStringRef)(postScriptName), size, NULL); + + if (isItalic) + traits |= kCTFontItalicTrait; + + if (isBold) + traits |= kCTFontBoldTrait; + + if (traits == 0) + { + newFontRef= CTFontCreateCopyWithAttributes(fontWithoutTrait, 0.0, NULL, NULL); + } + else + { + newFontRef = CTFontCreateCopyWithSymbolicTraits(fontWithoutTrait, 0.0, NULL, traits, traits); + } + + if (newFontRef) + { + NSString *fontNameKey = (__bridge NSString *)(CTFontCopyName(newFontRef, kCTFontPostScriptNameKey)); + return [UIFont fontWithName:fontNameKey size:CTFontGetSize(newFontRef)]; + } + + return nil; +} + +- (UIFont *)fontWithBoldTrait:(BOOL)bold italicTrait:(BOOL)italic andSize:(CGFloat)size +{ + CTFontRef fontRef = (__bridge CTFontRef)self; + NSString *familyName = (__bridge NSString *)(CTFontCopyName(fontRef, kCTFontFamilyNameKey)); + NSString *postScriptName = [UIFont postscriptNameFromFullName:familyName]; + return [[self class] fontWithName:postScriptName size:size boldTrait:bold italicTrait:italic]; +} + +- (UIFont *)fontWithBoldTrait:(BOOL)bold andItalicTrait:(BOOL)italic +{ + return [self fontWithBoldTrait:bold italicTrait:italic andSize:self.pointSize]; +} + +- (BOOL)isBold +{ + CTFontSymbolicTraits trait = CTFontGetSymbolicTraits((__bridge CTFontRef)self); + + if ((trait & kCTFontTraitBold) == kCTFontTraitBold) + return YES; + + return NO; +} + +- (BOOL)isItalic +{ + CTFontSymbolicTraits trait = CTFontGetSymbolicTraits((__bridge CTFontRef)self); + + if ((trait & kCTFontTraitItalic) == kCTFontTraitItalic) + return YES; + + return NO; +} + +@end diff --git a/QRichTextView/Classes/UIView+RichTextEditor.h b/QRichTextView/Classes/UIView+RichTextEditor.h new file mode 100644 index 0000000..4c00b28 --- /dev/null +++ b/QRichTextView/Classes/UIView+RichTextEditor.h @@ -0,0 +1,36 @@ +// +// UIView+RichTextEditor.h +// RichTextEdtor +// +// Created by Aryan Gh on 7/21/13. +// Copyright (c) 2013 Aryan Ghassemi. All rights reserved. +// +// https://github.com/aryaxt/iOS-Rich-Text-Editor +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import +#import + +@interface UIView (RichTextEditor) + +- (UIColor *)colorOfPoint:(CGPoint)point; +- (UIViewController *)firstAvailableViewController; + +@end diff --git a/QRichTextView/Classes/UIView+RichTextEditor.m b/QRichTextView/Classes/UIView+RichTextEditor.m new file mode 100644 index 0000000..831cefe --- /dev/null +++ b/QRichTextView/Classes/UIView+RichTextEditor.m @@ -0,0 +1,72 @@ +// +// UIView+RichTextEditor.m +// RichTextEdtor +// +// Created by Aryan Gh on 7/21/13. +// Copyright (c) 2013 Aryan Ghassemi. All rights reserved. +// +// https://github.com/aryaxt/iOS-Rich-Text-Editor +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "UIView+RichTextEditor.h" + +@implementation UIView (RichTextEditor) + +- (UIColor *)colorOfPoint:(CGPoint)point +{ + unsigned char pixel[4] = {0}; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, (uint32_t)kCGImageAlphaPremultipliedLast); + + CGContextTranslateCTM(context, -point.x, -point.y); + + [self.layer renderInContext:context]; + + CGContextRelease(context); + CGColorSpaceRelease(colorSpace); + UIColor *color = [UIColor colorWithRed:pixel[0]/255.0 green:pixel[1]/255.0 blue:pixel[2]/255.0 alpha:pixel[3]/255.0]; + + return color; +} + +- (UIViewController *)firstAvailableViewController +{ + return (UIViewController *)[self traverseResponderChainForUIViewController]; +} + +- (id)traverseResponderChainForUIViewController +{ + id nextResponder = [self nextResponder]; + + if ([nextResponder isKindOfClass:[UIViewController class]]) + { + return nextResponder; + } + else if ([nextResponder isKindOfClass:[UIView class]]) + { + return [nextResponder traverseResponderChainForUIViewController]; + } + else + { + return nil; + } +} + +@end diff --git a/QRichTextView/Classes/WEPopoverContainerView.h b/QRichTextView/Classes/WEPopoverContainerView.h new file mode 100755 index 0000000..ffe32a6 --- /dev/null +++ b/QRichTextView/Classes/WEPopoverContainerView.h @@ -0,0 +1,100 @@ +// +// WEPopoverContainerView.h +// WEPopover +// +// Created by Werner Altewischer on 02/09/10. +// Copyright 2010 Werner IT Consultancy. All rights reserved. +// + +#import +#import + +/** + * @brief Properties for the container view determining the area where the actual content view can/may be displayed. Also Images can be supplied for the arrow images and background. + */ +@interface WEPopoverContainerViewProperties : NSObject +{ + NSString *bgImageName; + NSString *upArrowImageName; + NSString *downArrowImageName; + NSString *leftArrowImageName; + NSString *rightArrowImageName; + CGFloat leftBgMargin; + CGFloat rightBgMargin; + CGFloat topBgMargin; + CGFloat bottomBgMargin; + NSInteger topBgCapSize; + NSInteger leftBgCapSize; + CGFloat arrowMargin; +} + +@property(nonatomic, retain) NSString *bgImageName; +@property(nonatomic, retain) NSString *upArrowImageName; +@property(nonatomic, retain) NSString *downArrowImageName; +@property(nonatomic, retain) NSString *leftArrowImageName; +@property(nonatomic, retain) NSString *rightArrowImageName; +@property(nonatomic, assign) CGFloat leftBgMargin; +@property(nonatomic, assign) CGFloat rightBgMargin; +@property(nonatomic, assign) CGFloat topBgMargin; +@property(nonatomic, assign) CGFloat bottomBgMargin; +@property(nonatomic, assign) CGFloat leftContentMargin; +@property(nonatomic, assign) CGFloat rightContentMargin; +@property(nonatomic, assign) CGFloat topContentMargin; +@property(nonatomic, assign) CGFloat bottomContentMargin; +@property(nonatomic, assign) NSInteger topBgCapSize; +@property(nonatomic, assign) NSInteger leftBgCapSize; +@property(nonatomic, assign) CGFloat arrowMargin; + +@end + +@class WEPopoverContainerView; + +/** + * @brief Container/background view for displaying a popover view. + */ +@interface WEPopoverContainerView : UIView { + UIImage *bgImage; + UIImage *arrowImage; + + WEPopoverContainerViewProperties *properties; + + UIPopoverArrowDirection arrowDirection; + + CGRect arrowRect; + CGRect bgRect; + CGPoint offset; + CGPoint arrowOffset; + + CGSize correctedSize; + UIView *contentView; +} + +/** + * @brief The current arrow direction for the popover. + */ +@property (nonatomic, readonly) UIPopoverArrowDirection arrowDirection; + +/** + * @brief The content view being displayed. + */ +@property (nonatomic, retain) UIView *contentView; + +/** + * @brief Initializes the position of the popover with a size, anchor rect, display area and permitted arrow directions and optionally the properties. + * If the last is not supplied the defaults are taken (requires images to be present in bundle representing a black rounded background with partial transparency). + */ +- (id)initWithSize:(CGSize)theSize + anchorRect:(CGRect)anchorRect + displayArea:(CGRect)displayArea +permittedArrowDirections:(UIPopoverArrowDirection)permittedArrowDirections + properties:(WEPopoverContainerViewProperties *)properties; + +/** + * @brief To update the position of the popover with a new anchor rect, display area and permitted arrow directions + */ +- (void)updatePositionWithSize:(CGSize)theSize + anchorRect:(CGRect)anchorRect + displayArea:(CGRect)displayArea + permittedArrowDirections:(UIPopoverArrowDirection)permittedArrowDirections; + +@end diff --git a/QRichTextView/Classes/WEPopoverContainerView.m b/QRichTextView/Classes/WEPopoverContainerView.m new file mode 100755 index 0000000..d037050 --- /dev/null +++ b/QRichTextView/Classes/WEPopoverContainerView.m @@ -0,0 +1,367 @@ +// +// WEPopoverContainerViewProperties.m +// WEPopover +// +// Created by Werner Altewischer on 02/09/10. +// Copyright 2010 Werner IT Consultancy. All rights reserved. +// + +#import "WEPopoverContainerView.h" + +@implementation WEPopoverContainerViewProperties + +@synthesize bgImageName, upArrowImageName, downArrowImageName, leftArrowImageName, rightArrowImageName, topBgMargin, bottomBgMargin, leftBgMargin, rightBgMargin, topBgCapSize, leftBgCapSize; +@synthesize leftContentMargin, rightContentMargin, topContentMargin, bottomContentMargin, arrowMargin; + +//- (void)dealloc { +// self.bgImageName = nil; +// self.upArrowImageName = nil; +// self.downArrowImageName = nil; +// self.leftArrowImageName = nil; +// self.rightArrowImageName = nil; +// [super dealloc]; +//} + +@end + +@interface WEPopoverContainerView(Private) + +- (void)determineGeometryForSize:(CGSize)theSize anchorRect:(CGRect)anchorRect displayArea:(CGRect)displayArea permittedArrowDirections:(UIPopoverArrowDirection)permittedArrowDirections; +- (CGRect)contentRect; +- (CGSize)contentSize; +- (void)setProperties:(WEPopoverContainerViewProperties *)props; +- (void)initFrame; + +@end + +@implementation WEPopoverContainerView + +@synthesize arrowDirection, contentView; + +- (id)initWithSize:(CGSize)theSize + anchorRect:(CGRect)anchorRect + displayArea:(CGRect)displayArea +permittedArrowDirections:(UIPopoverArrowDirection)permittedArrowDirections + properties:(WEPopoverContainerViewProperties *)theProperties { + if ((self = [super initWithFrame:CGRectZero])) { + + [self setProperties:theProperties]; + correctedSize = CGSizeMake(theSize.width + properties.leftBgMargin + properties.rightBgMargin + properties.leftContentMargin + properties.rightContentMargin, + theSize.height + properties.topBgMargin + properties.bottomBgMargin + properties.topContentMargin + properties.bottomContentMargin); + [self determineGeometryForSize:correctedSize anchorRect:anchorRect displayArea:displayArea permittedArrowDirections:permittedArrowDirections]; + [self initFrame]; + self.backgroundColor = [UIColor clearColor]; + UIImage *theImage = [UIImage imageNamed:properties.bgImageName]; + bgImage = [theImage stretchableImageWithLeftCapWidth:properties.leftBgCapSize topCapHeight:properties.topBgCapSize]; + + self.clipsToBounds = YES; + self.userInteractionEnabled = YES; + } + return self; +} + +//- (void)dealloc { +// [properties release]; +// [contentView release]; +// [bgImage release]; +// [arrowImage release]; +// [super dealloc]; +//} + +- (void)drawRect:(CGRect)rect { + [bgImage drawInRect:bgRect blendMode:kCGBlendModeNormal alpha:1.0]; + [arrowImage drawInRect:arrowRect blendMode:kCGBlendModeNormal alpha:1.0]; +} + +- (void)updatePositionWithSize:(CGSize)theSize + anchorRect:(CGRect)anchorRect + displayArea:(CGRect)displayArea + permittedArrowDirections:(UIPopoverArrowDirection)permittedArrowDirections { + + correctedSize = CGSizeMake(theSize.width + properties.leftBgMargin + properties.rightBgMargin + properties.leftContentMargin + properties.rightContentMargin, + theSize.height + properties.topBgMargin + properties.bottomBgMargin + properties.topContentMargin + properties.bottomContentMargin); + [self determineGeometryForSize:correctedSize anchorRect:anchorRect displayArea:displayArea permittedArrowDirections:permittedArrowDirections]; + [self initFrame]; + [self setNeedsDisplay]; + +} + +- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { + return CGRectContainsPoint(self.contentRect, point); +} + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { + +} + +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { + +} + +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { + +} + +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { + +} + +- (void)setContentView:(UIView *)v { + if (v != contentView) { +// [contentView release]; + contentView = v; + contentView.frame = self.contentRect; + [self addSubview:contentView]; + } +} + + + +@end + +@implementation WEPopoverContainerView(Private) + +- (void)initFrame { + CGRect theFrame = CGRectOffset(CGRectUnion(bgRect, arrowRect), offset.x, offset.y); + + //If arrow rect origin is < 0 the frame above is extended to include it so we should offset the other rects + arrowOffset = CGPointMake(MAX(0, -arrowRect.origin.x), MAX(0, -arrowRect.origin.y)); + bgRect = CGRectOffset(bgRect, arrowOffset.x, arrowOffset.y); + arrowRect = CGRectOffset(arrowRect, arrowOffset.x, arrowOffset.y); + + self.frame = CGRectIntegral(theFrame); +} + +- (CGSize)contentSize { + return self.contentRect.size; +} + +- (CGRect)contentRect { + CGRect rect = CGRectMake(properties.leftBgMargin + properties.leftContentMargin + arrowOffset.x, + properties.topBgMargin + properties.topContentMargin + arrowOffset.y, + bgRect.size.width - properties.leftBgMargin - properties.rightBgMargin - properties.leftContentMargin - properties.rightContentMargin, + bgRect.size.height - properties.topBgMargin - properties.bottomBgMargin - properties.topContentMargin - properties.bottomContentMargin); + return rect; +} + +- (void)setProperties:(WEPopoverContainerViewProperties *)props { + if (properties != props) { +// [properties release]; + properties = props; + } +} + +- (void)determineGeometryForSize:(CGSize)theSize anchorRect:(CGRect)anchorRect displayArea:(CGRect)displayArea permittedArrowDirections:(UIPopoverArrowDirection)supportedArrowDirections { + + //Determine the frame, it should not go outside the display area + UIPopoverArrowDirection theArrowDirection = UIPopoverArrowDirectionUp; + + offset = CGPointZero; + bgRect = CGRectZero; + arrowRect = CGRectZero; + arrowDirection = UIPopoverArrowDirectionUnknown; + + CGFloat biggestSurface = 0.0f; + CGFloat currentMinMargin = 0.0f; + + UIImage *upArrowImage = [UIImage imageNamed:properties.upArrowImageName]; + UIImage *downArrowImage = [UIImage imageNamed:properties.downArrowImageName]; + UIImage *leftArrowImage = [UIImage imageNamed:properties.leftArrowImageName]; + UIImage *rightArrowImage = [UIImage imageNamed:properties.rightArrowImageName]; + + while (theArrowDirection <= UIPopoverArrowDirectionRight) { + + if ((supportedArrowDirections & theArrowDirection)) { + + CGRect theBgRect = CGRectMake(0, 0, theSize.width, theSize.height); + CGRect theArrowRect = CGRectZero; + CGPoint theOffset = CGPointZero; + CGFloat xArrowOffset = 0.0; + CGFloat yArrowOffset = 0.0; + CGPoint anchorPoint = CGPointZero; + + switch (theArrowDirection) { + case UIPopoverArrowDirectionUp: + + anchorPoint = CGPointMake(CGRectGetMidX(anchorRect) - displayArea.origin.x, CGRectGetMaxY(anchorRect) - displayArea.origin.y); + + xArrowOffset = theSize.width / 2 - upArrowImage.size.width / 2; + yArrowOffset = properties.topBgMargin - upArrowImage.size.height; + + theOffset = CGPointMake(anchorPoint.x - xArrowOffset - upArrowImage.size.width / 2, anchorPoint.y - yArrowOffset); + + if (theOffset.x < 0) { + xArrowOffset += theOffset.x; + theOffset.x = 0; + } else if (theOffset.x + theSize.width > displayArea.size.width) { + xArrowOffset += (theOffset.x + theSize.width - displayArea.size.width); + theOffset.x = displayArea.size.width - theSize.width; + } + + //Cap the arrow offset + xArrowOffset = MAX(xArrowOffset, properties.leftBgMargin + properties.arrowMargin); + xArrowOffset = MIN(xArrowOffset, theSize.width - properties.rightBgMargin - properties.arrowMargin - upArrowImage.size.width); + + theArrowRect = CGRectMake(xArrowOffset, yArrowOffset, upArrowImage.size.width, upArrowImage.size.height); + + break; + case UIPopoverArrowDirectionDown: + + anchorPoint = CGPointMake(CGRectGetMidX(anchorRect) - displayArea.origin.x, CGRectGetMinY(anchorRect) - displayArea.origin.y); + + xArrowOffset = theSize.width / 2 - downArrowImage.size.width / 2; + yArrowOffset = theSize.height - properties.bottomBgMargin; + + theOffset = CGPointMake(anchorPoint.x - xArrowOffset - downArrowImage.size.width / 2, anchorPoint.y - yArrowOffset - downArrowImage.size.height); + + if (theOffset.x < 0) { + xArrowOffset += theOffset.x; + theOffset.x = 0; + } else if (theOffset.x + theSize.width > displayArea.size.width) { + xArrowOffset += (theOffset.x + theSize.width - displayArea.size.width); + theOffset.x = displayArea.size.width - theSize.width; + } + + //Cap the arrow offset + xArrowOffset = MAX(xArrowOffset, properties.leftBgMargin + properties.arrowMargin); + xArrowOffset = MIN(xArrowOffset, theSize.width - properties.rightBgMargin - properties.arrowMargin - downArrowImage.size.width); + + theArrowRect = CGRectMake(xArrowOffset , yArrowOffset, downArrowImage.size.width, downArrowImage.size.height); + + break; + case UIPopoverArrowDirectionLeft: + + anchorPoint = CGPointMake(CGRectGetMaxX(anchorRect) - displayArea.origin.x, CGRectGetMidY(anchorRect) - displayArea.origin.y); + + xArrowOffset = properties.leftBgMargin - leftArrowImage.size.width; + yArrowOffset = theSize.height / 2 - leftArrowImage.size.height / 2; + + theOffset = CGPointMake(anchorPoint.x - xArrowOffset, anchorPoint.y - yArrowOffset - leftArrowImage.size.height / 2); + + if (theOffset.y < 0) { + yArrowOffset += theOffset.y; + theOffset.y = 0; + } else if (theOffset.y + theSize.height > displayArea.size.height) { + yArrowOffset += (theOffset.y + theSize.height - displayArea.size.height); + theOffset.y = displayArea.size.height - theSize.height; + } + + //Cap the arrow offset + yArrowOffset = MAX(yArrowOffset, properties.topBgMargin + properties.arrowMargin); + yArrowOffset = MIN(yArrowOffset, theSize.height - properties.bottomBgMargin - properties.arrowMargin - leftArrowImage.size.height); + + theArrowRect = CGRectMake(xArrowOffset, yArrowOffset, leftArrowImage.size.width, leftArrowImage.size.height); + + break; + case UIPopoverArrowDirectionRight: + + anchorPoint = CGPointMake(CGRectGetMinX(anchorRect) - displayArea.origin.x, CGRectGetMidY(anchorRect) - displayArea.origin.y); + + xArrowOffset = theSize.width - properties.rightBgMargin; + yArrowOffset = theSize.height / 2 - rightArrowImage.size.width / 2; + + theOffset = CGPointMake(anchorPoint.x - xArrowOffset - rightArrowImage.size.width, anchorPoint.y - yArrowOffset - rightArrowImage.size.height / 2); + + if (theOffset.y < 0) { + yArrowOffset += theOffset.y; + theOffset.y = 0; + } else if (theOffset.y + theSize.height > displayArea.size.height) { + yArrowOffset += (theOffset.y + theSize.height - displayArea.size.height); + theOffset.y = displayArea.size.height - theSize.height; + } + + //Cap the arrow offset + yArrowOffset = MAX(yArrowOffset, properties.topBgMargin + properties.arrowMargin); + yArrowOffset = MIN(yArrowOffset, theSize.height - properties.bottomBgMargin - properties.arrowMargin - rightArrowImage.size.height); + + theArrowRect = CGRectMake(xArrowOffset, yArrowOffset, rightArrowImage.size.width, rightArrowImage.size.height); + + break; + default: + break; + } + + CGRect bgFrame = CGRectOffset(theBgRect, theOffset.x, theOffset.y); + + CGFloat minMarginLeft = CGRectGetMinX(bgFrame); + CGFloat minMarginRight = CGRectGetWidth(displayArea) - CGRectGetMaxX(bgFrame); + CGFloat minMarginTop = CGRectGetMinY(bgFrame); + CGFloat minMarginBottom = CGRectGetHeight(displayArea) - CGRectGetMaxY(bgFrame); + + if (minMarginLeft < 0) { + // Popover is too wide and clipped on the left; decrease width + // and move it to the right + theOffset.x -= minMarginLeft; + theBgRect.size.width += minMarginLeft; + minMarginLeft = 0; + if (theArrowDirection == UIPopoverArrowDirectionRight) { + theArrowRect.origin.x = CGRectGetMaxX(theBgRect) - properties.rightBgMargin; + } + } + if (minMarginRight < 0) { + // Popover is too wide and clipped on the right; decrease width. + theBgRect.size.width += minMarginRight; + minMarginRight = 0; + if (theArrowDirection == UIPopoverArrowDirectionLeft) { + theArrowRect.origin.x = CGRectGetMinX(theBgRect) - leftArrowImage.size.width + properties.leftBgMargin; + } + } + if (minMarginTop < 0) { + // Popover is too high and clipped at the top; decrease height + // and move it down + theOffset.y -= minMarginTop; + theBgRect.size.height += minMarginTop; + minMarginTop = 0; + if (theArrowDirection == UIPopoverArrowDirectionDown) { + theArrowRect.origin.y = CGRectGetMaxY(theBgRect) - properties.bottomBgMargin; + } + } + if (minMarginBottom < 0) { + // Popover is too high and clipped at the bottom; decrease height. + theBgRect.size.height += minMarginBottom; + minMarginBottom = 0; + if (theArrowDirection == UIPopoverArrowDirectionUp) { + theArrowRect.origin.y = CGRectGetMinY(theBgRect) - upArrowImage.size.height + properties.topBgMargin; + } + } + bgFrame = CGRectOffset(theBgRect, theOffset.x, theOffset.y); + + CGFloat minMargin = MIN(minMarginLeft, minMarginRight); + minMargin = MIN(minMargin, minMarginTop); + minMargin = MIN(minMargin, minMarginBottom); + + // Calculate intersection and surface + CGFloat surface = theBgRect.size.width * theBgRect.size.height; + + if (surface >= biggestSurface && minMargin >= currentMinMargin) { + biggestSurface = surface; + offset = CGPointMake(theOffset.x + displayArea.origin.x, theOffset.y + displayArea.origin.y); + arrowRect = theArrowRect; + bgRect = theBgRect; + arrowDirection = theArrowDirection; + currentMinMargin = minMargin; + } + } + + theArrowDirection <<= 1; + } + + switch (arrowDirection) { + case UIPopoverArrowDirectionUp: + arrowImage = upArrowImage; + break; + case UIPopoverArrowDirectionDown: + arrowImage = downArrowImage; + break; + case UIPopoverArrowDirectionLeft: + arrowImage = leftArrowImage; + break; + case UIPopoverArrowDirectionRight: + arrowImage = rightArrowImage; + break; + default: + break; + } +} + +@end diff --git a/QRichTextView/Classes/WEPopoverController.h b/QRichTextView/Classes/WEPopoverController.h new file mode 100755 index 0000000..068a799 --- /dev/null +++ b/QRichTextView/Classes/WEPopoverController.h @@ -0,0 +1,75 @@ +// +// WEPopoverController.h +// WEPopover +// +// Created by Werner Altewischer on 02/09/10. +// Copyright 2010 Werner IT Consultancy. All rights reserved. +// + +#import +#import +#import "WEPopoverContainerView.h" +#import "WETouchableView.h" + +@class WEPopoverController; + +@protocol WEPopoverControllerDelegate + +- (void)popoverControllerDidDismissPopover:(WEPopoverController *)popoverController; +- (BOOL)popoverControllerShouldDismissPopover:(WEPopoverController *)popoverController; + +@end + +/** + * @brief Popover controller for the iPhone, mimicing the iPad UIPopoverController interface. See that class for more details. + */ +@interface WEPopoverController : NSObject { + UIViewController *contentViewController; + UIView *view; +// UIView *parentView; + WETouchableView *backgroundView; + + BOOL popoverVisible; + UIPopoverArrowDirection popoverArrowDirection; +// id delegate; + CGSize popoverContentSize; + WEPopoverContainerViewProperties *containerViewProperties; + id context; + NSArray *passthroughViews; +} + +@property(nonatomic, retain) UIViewController *contentViewController; + +@property (nonatomic, readonly) UIView *view; +@property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible; +@property (nonatomic, readonly) UIPopoverArrowDirection popoverArrowDirection; +@property (nonatomic, weak) id delegate; +@property (nonatomic, assign) CGSize popoverContentSize; +@property (nonatomic, retain) WEPopoverContainerViewProperties *containerViewProperties; +@property (nonatomic, retain) id context; +@property (nonatomic, weak) UIView *parentView; +@property (nonatomic, copy) NSArray *passthroughViews; + +- (id)initWithContentViewController:(UIViewController *)theContentViewController; + +- (void)dismissPopoverAnimated:(BOOL)animated; + +- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item + permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections + animated:(BOOL)animated; + +- (void)presentPopoverFromRect:(CGRect)rect + inView:(UIView *)view + permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections + animated:(BOOL)animated; + +- (void)repositionPopoverFromRect:(CGRect)rect + inView:(UIView *)view + permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections; + +- (void)repositionPopoverFromRect:(CGRect)rect + inView:(UIView *)view + permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections + animated:(BOOL)animated; + +@end diff --git a/QRichTextView/Classes/WEPopoverController.m b/QRichTextView/Classes/WEPopoverController.m new file mode 100755 index 0000000..2ef2b8e --- /dev/null +++ b/QRichTextView/Classes/WEPopoverController.m @@ -0,0 +1,377 @@ +// +// WEPopoverController.m +// WEPopover +// +// Created by Werner Altewischer on 02/09/10. +// Copyright 2010 Werner IT Consultancy. All rights reserved. +// + +#import "WEPopoverController.h" +#import "WEPopoverParentView.h" +#import "UIBarButtonItem+WEPopover.h" + +#define FADE_DURATION 0.3 + +@interface WEPopoverController(Private) + +- (UIView *)keyView; +- (void)updateBackgroundPassthroughViews; +- (void)setView:(UIView *)v; +- (CGRect)displayAreaForView:(UIView *)theView; +- (WEPopoverContainerViewProperties *)defaultContainerViewProperties; +- (void)dismissPopoverAnimated:(BOOL)animated userInitiated:(BOOL)userInitiated; + +@end + + +@implementation WEPopoverController + +@synthesize contentViewController; +@synthesize popoverContentSize; +@synthesize popoverVisible; +@synthesize popoverArrowDirection; +@synthesize delegate; +@synthesize view; +@synthesize parentView; +@synthesize containerViewProperties; +@synthesize context; +@synthesize passthroughViews; + +- (id)init { + if ((self = [super init])) { + } + return self; +} + +- (id)initWithContentViewController:(UIViewController *)viewController { + if ((self = [self init])) { + self.contentViewController = viewController; + } + return self; +} + +//- (void)dealloc { +// [self dismissPopoverAnimated:NO]; +// [contentViewController release]; +// [containerViewProperties release]; +// [passthroughViews release]; +// self.context = nil; +// [super dealloc]; +//} + +- (void)setContentViewController:(UIViewController *)vc { + if (vc != contentViewController) { +// [contentViewController release]; + contentViewController = vc; + popoverContentSize = CGSizeZero; + } +} + +- (BOOL)forwardAppearanceMethods { + return ![contentViewController respondsToSelector:@selector(automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers)]; +} + +//Overridden setter to copy the passthroughViews to the background view if it exists already +- (void)setPassthroughViews:(NSArray *)array { +// [passthroughViews release]; + passthroughViews = nil; + if (array) { + passthroughViews = [[NSArray alloc] initWithArray:array]; + } + [self updateBackgroundPassthroughViews]; +} + +- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)theContext { + + if ([animationID isEqual:@"FadeIn"]) { + self.view.userInteractionEnabled = YES; + popoverVisible = YES; + + if ([self forwardAppearanceMethods]) { + [contentViewController viewDidAppear:YES]; + } + } else if ([animationID isEqual:@"FadeOut"]) { + popoverVisible = NO; + + if ([self forwardAppearanceMethods]) { + [contentViewController viewDidDisappear:YES]; + } + [self.view removeFromSuperview]; + self.view = nil; + [backgroundView removeFromSuperview]; +// [backgroundView release]; + backgroundView = nil; + + BOOL userInitiatedDismissal = [(__bridge NSNumber *)theContext boolValue]; + + if (userInitiatedDismissal) { + //Only send message to delegate in case the user initiated this event, which is if he touched outside the view + [delegate popoverControllerDidDismissPopover:self]; + } + } +} + +- (void)dismissPopoverAnimated:(BOOL)animated { + + [self dismissPopoverAnimated:animated userInitiated:NO]; +} + +- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item + permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections + animated:(BOOL)animated { + + UIView *v = [self keyView]; + CGRect rect = [item frameInView:v]; + + return [self presentPopoverFromRect:rect inView:v permittedArrowDirections:arrowDirections animated:animated]; +} + +- (void)presentPopoverFromRect:(CGRect)rect + inView:(UIView *)theView + permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections + animated:(BOOL)animated { + + + [self dismissPopoverAnimated:NO]; + + //First force a load view for the contentViewController so the popoverContentSize is properly initialized + [contentViewController view]; + + if (CGSizeEqualToSize(popoverContentSize, CGSizeZero)) { + popoverContentSize = contentViewController.preferredContentSize; + } + + CGRect displayArea = [self displayAreaForView:theView]; + + WEPopoverContainerViewProperties *props = self.containerViewProperties ? self.containerViewProperties : [self defaultContainerViewProperties]; + WEPopoverContainerView *containerView = [[WEPopoverContainerView alloc] initWithSize:self.popoverContentSize anchorRect:rect displayArea:displayArea permittedArrowDirections:arrowDirections properties:props]; + popoverArrowDirection = containerView.arrowDirection; + + UIView *keyView = self.keyView; + + backgroundView = [[WETouchableView alloc] initWithFrame:keyView.bounds]; + backgroundView.contentMode = UIViewContentModeScaleToFill; + backgroundView.autoresizingMask = ( UIViewAutoresizingFlexibleLeftMargin | + UIViewAutoresizingFlexibleWidth | + UIViewAutoresizingFlexibleRightMargin | + UIViewAutoresizingFlexibleTopMargin | + UIViewAutoresizingFlexibleHeight | + UIViewAutoresizingFlexibleBottomMargin); + backgroundView.backgroundColor = [UIColor clearColor]; + backgroundView.delegate = self; + + [keyView addSubview:backgroundView]; + + containerView.frame = [theView convertRect:containerView.frame toView:backgroundView]; + + [backgroundView addSubview:containerView]; + + containerView.contentView = contentViewController.view; + containerView.autoresizingMask = ( UIViewAutoresizingFlexibleLeftMargin | + UIViewAutoresizingFlexibleRightMargin); + + self.view = containerView; + [self updateBackgroundPassthroughViews]; + + if ([self forwardAppearanceMethods]) { + [contentViewController viewWillAppear:animated]; + } + [self.view becomeFirstResponder]; + popoverVisible = YES; + if (animated) { + self.view.alpha = 0.0; + + [UIView animateWithDuration:FADE_DURATION + delay:0.0 + options:UIViewAnimationOptionCurveLinear + animations:^{ + + self.view.alpha = 1.0; + + } completion:^(BOOL finished) { + + [self animationDidStop:@"FadeIn" finished:[NSNumber numberWithBool:finished] context:nil]; + }]; + + } else { + if ([self forwardAppearanceMethods]) { + [contentViewController viewDidAppear:animated]; + } + } +} + +- (void)repositionPopoverFromRect:(CGRect)rect + inView:(UIView *)theView + permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections +{ + + [self repositionPopoverFromRect:rect + inView:theView + permittedArrowDirections:arrowDirections + animated:NO]; +} + +- (void)repositionPopoverFromRect:(CGRect)rect + inView:(UIView *)theView + permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections + animated:(BOOL)animated { + + if (animated) { + [UIView beginAnimations:nil context:nil]; + [UIView setAnimationDuration:FADE_DURATION]; + [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; +// [UIView animateWithDuration:FADE_DURATION delay:0 options:UIViewAnimationOptionCurveEaseOut animations:nil completion:nil]; + } + + if (CGSizeEqualToSize(popoverContentSize, CGSizeZero)) { + popoverContentSize = contentViewController.preferredContentSize; + } + + CGRect displayArea = [self displayAreaForView:theView]; + WEPopoverContainerView *containerView = (WEPopoverContainerView *)self.view; + [containerView updatePositionWithSize:self.popoverContentSize + anchorRect:rect + displayArea:displayArea + permittedArrowDirections:arrowDirections]; + + popoverArrowDirection = containerView.arrowDirection; + containerView.frame = [theView convertRect:containerView.frame toView:backgroundView]; + + if (animated) { + [UIView commitAnimations]; + } +} + +#pragma mark - +#pragma mark WETouchableViewDelegate implementation + +- (void)viewWasTouched:(WETouchableView *)view { + if (popoverVisible) { + if (!delegate || [delegate popoverControllerShouldDismissPopover:self]) { + [self dismissPopoverAnimated:YES userInitiated:YES]; + } + } +} + +- (BOOL)isPopoverVisible { + if (!popoverVisible) { + return NO; + } + UIView *sv = self.view; + BOOL foundWindowAsSuperView = NO; + while ((sv = sv.superview) != nil) { + if ([sv isKindOfClass:[UIWindow class]]) { + foundWindowAsSuperView = YES; + break; + } + } + return foundWindowAsSuperView; +} + +@end + + +@implementation WEPopoverController(Private) + +- (UIView *)keyView { + if (self.parentView) { + return self.parentView; + } else { + UIWindow *w = [[UIApplication sharedApplication] keyWindow]; + if (w.subviews.count > 0) { + return [w.subviews objectAtIndex:0]; + } else { + return w; + } + } +} + +- (void)setView:(UIView *)v { + if (view != v) { +// [view release]; + view = v; + } +} + +- (void)updateBackgroundPassthroughViews { + backgroundView.passthroughViews = passthroughViews; +} + + +- (void)dismissPopoverAnimated:(BOOL)animated userInitiated:(BOOL)userInitiated { + if (self.view) { + if ([self forwardAppearanceMethods]) { + [contentViewController viewWillDisappear:animated]; + } + popoverVisible = NO; + [self.view resignFirstResponder]; + if (animated) { + self.view.userInteractionEnabled = NO; + + [UIView animateWithDuration:FADE_DURATION + delay:0.0 + options:UIViewAnimationOptionCurveLinear + animations:^{ + + self.view.alpha = 0.0; + + } completion:^(BOOL finished) { + + [self animationDidStop:@"FadeOut" finished:[NSNumber numberWithBool:finished] context:(__bridge void *)([NSNumber numberWithBool:userInitiated])]; + }]; + + + } else { + if ([self forwardAppearanceMethods]) { + [contentViewController viewDidDisappear:animated]; + } + [self.view removeFromSuperview]; + self.view = nil; + [backgroundView removeFromSuperview]; +// [backgroundView release]; + backgroundView = nil; + } + } +} + +- (CGRect)displayAreaForView:(UIView *)theView { + CGRect displayArea = CGRectZero; + if ([theView conformsToProtocol:@protocol(WEPopoverParentView)] && [theView respondsToSelector:@selector(displayAreaForPopover)]) { + displayArea = [(id )theView displayAreaForPopover]; + } else { + UIView *keyView = [self keyView]; + displayArea = [keyView convertRect:keyView.bounds toView:theView]; + } + return displayArea; +} + +//Enable to use the simple popover style +- (WEPopoverContainerViewProperties *)defaultContainerViewProperties { + WEPopoverContainerViewProperties *ret = [WEPopoverContainerViewProperties new]; + + CGSize imageSize = CGSizeMake(30.0f, 30.0f); + NSString *bgImageName = @"popoverBgSimple.png"; + CGFloat bgMargin = 6.0; + CGFloat contentMargin = 2.0; + + ret.leftBgMargin = bgMargin; + ret.rightBgMargin = bgMargin; + ret.topBgMargin = bgMargin; + ret.bottomBgMargin = bgMargin; + ret.leftBgCapSize = imageSize.width/2; + ret.topBgCapSize = imageSize.height/2; + ret.bgImageName = bgImageName; + ret.leftContentMargin = contentMargin; + ret.rightContentMargin = contentMargin; + ret.topContentMargin = contentMargin; + ret.bottomContentMargin = contentMargin; + ret.arrowMargin = 1.0; + + ret.upArrowImageName = @"popoverArrowUpSimple.png"; + ret.downArrowImageName = @"popoverArrowDownSimple.png"; + ret.leftArrowImageName = @"popoverArrowLeftSimple.png"; + ret.rightArrowImageName = @"popoverArrowRightSimple.png"; + return ret; +} + +@end diff --git a/QRichTextView/Classes/WEPopoverParentView.h b/QRichTextView/Classes/WEPopoverParentView.h new file mode 100755 index 0000000..d881bfe --- /dev/null +++ b/QRichTextView/Classes/WEPopoverParentView.h @@ -0,0 +1,18 @@ +/* + * WEPopoverParentView.h + * WEPopover + * + * Created by Werner Altewischer on 02/09/10. + * Copyright 2010 Werner IT Consultancy. All rights reserved. + * + */ + +#import +#import + +@protocol WEPopoverParentView + +@optional +- (CGRect)displayAreaForPopover; + +@end \ No newline at end of file diff --git a/QRichTextView/Classes/WETouchableView.h b/QRichTextView/Classes/WETouchableView.h new file mode 100755 index 0000000..39432b9 --- /dev/null +++ b/QRichTextView/Classes/WETouchableView.h @@ -0,0 +1,37 @@ +// +// WETouchableView.h +// WEPopover +// +// Created by Werner Altewischer on 12/21/10. +// Copyright 2010 Werner IT Consultancy. All rights reserved. +// + +#import +#import + +@class WETouchableView; + +/** + * @brief delegate to receive touch events + */ +@protocol WETouchableViewDelegate + +- (void)viewWasTouched:(WETouchableView *)view; + +@end + +/** + * @brief View that can handle touch events and/or disable touch forwording to child views + */ +@interface WETouchableView : UIView { + BOOL touchForwardingDisabled; +// id delegate; + NSArray *passthroughViews; + BOOL testHits; +} + +@property (nonatomic, assign) BOOL touchForwardingDisabled; +@property (nonatomic, weak) id delegate; +@property (nonatomic, copy) NSArray *passthroughViews; + +@end diff --git a/QRichTextView/Classes/WETouchableView.m b/QRichTextView/Classes/WETouchableView.m new file mode 100755 index 0000000..2a0d49e --- /dev/null +++ b/QRichTextView/Classes/WETouchableView.m @@ -0,0 +1,70 @@ +// +// WETouchableView.m +// WEPopover +// +// Created by Werner Altewischer on 12/21/10. +// Copyright 2010 Werner IT Consultancy. All rights reserved. +// + +#import "WETouchableView.h" + +@interface WETouchableView(Private) + +- (BOOL)isPassthroughView:(UIView *)v; + +@end + +@implementation WETouchableView + +@synthesize touchForwardingDisabled, delegate, passthroughViews; + +//- (void)dealloc { +// [passthroughViews release]; +// [super dealloc]; +//} + +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { + if (testHits) { + return nil; + } else if (touchForwardingDisabled) { + return self; + } else { + UIView *hitView = [super hitTest:point withEvent:event]; + + if (hitView == self) { + //Test whether any of the passthrough views would handle this touch + testHits = YES; + UIView *superHitView = [self.superview hitTest:point withEvent:event]; + testHits = NO; + + if ([self isPassthroughView:superHitView]) { + hitView = superHitView; + } + } + + return hitView; + } +} + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { + [self.delegate viewWasTouched:self]; +} + +@end + +@implementation WETouchableView(Private) + +- (BOOL)isPassthroughView:(UIView *)v { + + if (v == nil) { + return NO; + } + + if ([passthroughViews containsObject:v]) { + return YES; + } + + return [self isPassthroughView:v.superview]; +} + +@end