From 23c0aa4e8ab49f808766822e23f779dbccdab858 Mon Sep 17 00:00:00 2001 From: houxg Date: Mon, 21 Nov 2016 16:56:07 +0800 Subject: [PATCH] support redo/undo --- app/build.gradle | 1 + .../org/houxg/leanotelite/editor/Editor.java | 4 +++ .../leanotelite/editor/MarkdownEditor.java | 10 ++++++ .../leanotelite/editor/RichTextEditor.java | 11 +++++++ .../leanotelite/ui/edit/EditorFragment.java | 12 +++++++- .../ic_insert_link_black_disable.png | Bin 2331 -> 962 bytes .../ic_insert_link_black_enable.png | Bin 0 -> 1036 bytes .../drawable-xxhdpi/ic_redo_black_disable.png | Bin 0 -> 981 bytes .../drawable-xxhdpi/ic_redo_black_enable.png | Bin 0 -> 997 bytes .../drawable-xxhdpi/ic_undo_black_disable.png | Bin 0 -> 1008 bytes .../drawable-xxhdpi/ic_undo_black_enable.png | Bin 0 -> 1034 bytes app/src/main/res/layout/fragment_editor.xml | 29 +++++++++--------- 12 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 app/src/main/res/drawable-xxhdpi/ic_insert_link_black_enable.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_redo_black_disable.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_redo_black_enable.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_undo_black_disable.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_undo_black_enable.png diff --git a/app/build.gradle b/app/build.gradle index 8817da0..f29092c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,4 +69,5 @@ dependencies { compile 'com.android.support:support-v13:24.1.0' compile project(':img-selector') compile 'com.facebook.stetho:stetho:1.4.1' + compile 'com.github.houxg:FlexLayout:1.2' } diff --git a/app/src/main/java/org/houxg/leanotelite/editor/Editor.java b/app/src/main/java/org/houxg/leanotelite/editor/Editor.java index 50bcb6b..14ef1ca 100644 --- a/app/src/main/java/org/houxg/leanotelite/editor/Editor.java +++ b/app/src/main/java/org/houxg/leanotelite/editor/Editor.java @@ -45,6 +45,10 @@ public abstract class Editor { public abstract void updateLink(String title, String url); + public abstract void redo(); + + public abstract void undo(); + public abstract void toggleOrderList(); public abstract void toggleUnorderList(); diff --git a/app/src/main/java/org/houxg/leanotelite/editor/MarkdownEditor.java b/app/src/main/java/org/houxg/leanotelite/editor/MarkdownEditor.java index 58422d7..df4086c 100644 --- a/app/src/main/java/org/houxg/leanotelite/editor/MarkdownEditor.java +++ b/app/src/main/java/org/houxg/leanotelite/editor/MarkdownEditor.java @@ -86,6 +86,16 @@ public class MarkdownEditor extends Editor { execJs(String.format(Locale.US, "ZSSEditor.updateLink('%s', '%s');", url, title)); } + @Override + public void redo() { + execJs("MD.undoMgr.redo()"); + } + + @Override + public void undo() { + execJs("MD.undoMgr.undo()"); + } + @Override public void toggleOrderList() { execJs("ZSSEditor.setOrderedList();"); diff --git a/app/src/main/java/org/houxg/leanotelite/editor/RichTextEditor.java b/app/src/main/java/org/houxg/leanotelite/editor/RichTextEditor.java index ba4ee80..9b178a5 100644 --- a/app/src/main/java/org/houxg/leanotelite/editor/RichTextEditor.java +++ b/app/src/main/java/org/houxg/leanotelite/editor/RichTextEditor.java @@ -2,6 +2,7 @@ package org.houxg.leanotelite.editor; import android.annotation.SuppressLint; +import android.text.TextUtils; import android.util.Log; import android.webkit.WebChromeClient; import android.webkit.WebView; @@ -95,6 +96,16 @@ public class RichTextEditor extends Editor implements OnJsEditorStateChangedList execJs(String.format(Locale.US, "ZSSEditor.updateLink('%s', '%s');", url, title)); } + @Override + public void redo() { + execJs("ZSSEditor.redo();"); + } + + @Override + public void undo() { + execJs("ZSSEditor.undo();"); + } + @Override public void toggleOrderList() { execJs("ZSSEditor.setOrderedList();"); diff --git a/app/src/main/java/org/houxg/leanotelite/ui/edit/EditorFragment.java b/app/src/main/java/org/houxg/leanotelite/ui/edit/EditorFragment.java index a81edee..ce565d4 100644 --- a/app/src/main/java/org/houxg/leanotelite/ui/edit/EditorFragment.java +++ b/app/src/main/java/org/houxg/leanotelite/ui/edit/EditorFragment.java @@ -44,7 +44,7 @@ public class EditorFragment extends Fragment implements Editor.EditorListener { private EditorFragmentListener mListener; private Editor mEditor; - @BindView(R.id.ll_tools) + @BindView(R.id.fl_tools) View mToolContainer; @BindView(R.id.btn_bold) @@ -201,6 +201,16 @@ public class EditorFragment extends Fragment implements Editor.EditorListener { mEditor.toggleItalic(); } + @OnClick(R.id.btn_undo) + void undo() { + mEditor.undo(); + } + + @OnClick(R.id.btn_redo) + void redo() { + mEditor.redo(); + } + public void setEditingEnabled(boolean enabled) { mIsEditingEnabled = enabled; mEditor.setEditingEnabled(enabled); diff --git a/app/src/main/res/drawable-xxhdpi/ic_insert_link_black_disable.png b/app/src/main/res/drawable-xxhdpi/ic_insert_link_black_disable.png index e2858fae9d830de46e791475feccdcca77b113ef..3e411ad8d8659d98ccec13e89ae8d1ab730c983a 100644 GIT binary patch literal 962 zcmV;z13mnSP)Px&d`Uz>R9Fe+SxsvbK^V?10fp$bLWp}Q$se$XAPV_7OT~C7{s2AIi?tNmn+*i* zt%B$e5D#s!=rtc8NDlQ6G~|+oh`nk+FB_jH>@K@IGf6g$W}*WxGxNUh%skJ|_pA|{ zAPfcrv(aeWgzGBOE0CmN7)iueCMfQ?6pKZ}%lH!2YIWetj!mNNA85OWm~w&w$GKeY zGt&0B!cqWkp?bZ385OTXHlSN__0z_)BCKft9EA5E`}utSr@|*@stmPStpuW{kmvBZ zFj-YQGt@5;D=`E6JypE|VH7Yh#C8!MK(4C_>Z&JZ$f3hQ7{LL;a5V6B-h#}wu7o1s z+9nrr@|TJGGjMo@{F+}UNpoRnW3Kd2*>{P38r8=rh0yj@w4FqmWk{gYLiMbHQyaP+ zSMRZhfphl2HAvzPbd^LRag@zwze((WUDa$hul4(V&etu7r2>EtR4Nn-N3;(KJF77l zDCwLvO>-}mO6{c6>0hc!=c#YCT9>-r?yhay+)ac4!e@{SSMT9)0MW-PvT%F^$EUiI zB|BmxMq(A%LP2hjb=piMC{JXL>{$$jH!_=!I$|Ye88&d-AXfv!`4)!4Cy7(XvaF2G zJuAT+thOQUzT)>Qs z1Gxsed;xhyg*@Dngx*vP^Qe{2)nCQ|y00A40%0Is=CN(Ah%eB%gPrH>Kp@vRSbu>w z7qDP;bIz!*LV9I3$||a?WJU%DyD(ir_yl{g`Cie^7B_K)Oxdf@-@EMLI7eb1a^@@RB{9ce zsyP19`Wjz+OcI9l)du0%3-pE z7$8gqNplDwz7LTuWc1TD5HqCYaPWH8#VZhY4fr~TD42n4LMPj&T~}RV{%YAIW?)y| k<-JvU6l%=vf97Y}Z|=dj2lNro2LJ#707*qoM6N<$f}UHzU;qFB literal 2331 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 DKYi5* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_redo_black_enable.png b/app/src/main/res/drawable-xxhdpi/ic_redo_black_enable.png new file mode 100644 index 0000000000000000000000000000000000000000..f83453f53e0485406a6a30550c9df9833997c858 GIT binary patch literal 997 zcmVPx&pGibPR9Fe+m|aLyQ5?YAN12l#N1{ZCETf3%#jGH=3UxA3$zaf<4+VWZ^$;ae z&6ggco{H@AA*h#p(t+Y8q8LdJNs-V)*~=;+*)XxyY;FC{aAS^p@2^Lp24Qbrru?N8_;91SZ)OZf$u9ZE(I<0 zHG$XH*YCwfH^3*Tt-_$e~i1*#-OrpciSUlBfn+=&H(iYip}58jU`~c)L(4q=@XG_XQiX zv}bAmptjSmpk2;YLA#1tRZPswEd#9o_v|Q_a|fjQd7Y4D5mY}x9h5R4Cj%<9q&H@@ zTF2D9jhmaBD`K%&6TX_zZRFY}XJ4ya5qt^y6@fU^Is$l<>rQEDX&*11ziRbz=Xt$e zOC%EUBJafi{@ih`eOYiE7vp$TZKi>p;88oziR-P_ptAMxZz2IL*uO^mK=zoHw&crA zI17ivPgO#T^N@kopd;{pt^dyD)4Tp&~ zfWIls(RIk}cGqw$evZ-IS`1rqm4QAE^y6H)M8ChJq@-nVa4;epm6VUha8DuTrcez~cT0R`|`H&kI`?SiZQO-n4z6_joEsmgjlr&gpeRXwp z7dX%)l;#;RruJ~6#&>3oW7NUsKZR1UoFdSZtZ5f}@=v)rM#=Sr7BOZr&g0WfUly9N zIp(yj1?UVo-_vDu#9=|UknJmMD_>|6g9b@ehPDS88Q-D1ZbY0pWg@c7P)A7#7EZ}bPAkbIPa>ftIGlO za6RD)XWs<+ceDFOw~fwpI{wUdmKLx-TgS)8#p%rpbS-PU7Fj$!Ze+b$(1PI~svD-9 To7$+200000NkvXXu0mjf@XO_# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_undo_black_disable.png b/app/src/main/res/drawable-xxhdpi/ic_undo_black_disable.png new file mode 100644 index 0000000000000000000000000000000000000000..bfcacc4f4f6cffbfdc45a0b8d6f2497f4e0d1427 GIT binary patch literal 1008 zcmVPx&s!2paR9Fe+m`!LCK@@+D8sX2fIUXiG~=B)i$$N9%#h$c*4g<^737qL+ZW0d{P6QCJOrlK2_7*=z%TzyEWt z)^`FIo4WAR)6>-iaF;P%$UV6Rkn21aAi>-R$RRQymaUzwU0rXU=5EhjKEX4*0Pyv4 zKufUrwNd-2pV+6)=>h2JjlgAI8XhO+Kp=2~)P95BrDwF1dSW_+zX{@cNIMgrf8iOW zx{~2OX>}aq?Mh{)ZRX0`Lw4z(NU2NcR*+6=9r`-t0ct)AI_`8juQWC`MzOPF$p(B! zLs}OBllSr@b)vGea>C>BENP8X>Vm=GzGyVsgih*t7DN^!n-Z$3s_HQERTOZ5KT?OA zo132@Q`tnV9Lol31^fcKYe-p$j0!%#QoU??l3ALi(BL79#c~ISuQk2pp_C1k6W|C7 z;K|TT$l-7_dA;60TH`a`474V1=~&$awZFBs)l&>;@xwcN0o$i(UZwsLok2Mni^ZO@ zP-d-hd4mJ|1;eL+9;TghT5AQT)`@+N)1%zUqg-21Usv~m?&NW~r`Ah9Z*Xk91p1wp z@nY#n-ygNLwSMdyK2pH<0)IvwOWxoZ?kmUlyxZ;m&4OPf3&zw?>OP09M~jP#@+Fuq zd4q3SN*{94mP^n8dY$LK2Uo8Q+_@r=$SviVLV=6Ta>1ua`^)%$uLM)Kx$Awiv$N^L zQ6a&_S6SdC?b+};$beNfu%d5YUtb^E>K7VZ?3M*yHax)lw!m~`r+h}swPJva-Lk-Q zQXB*RtpuP|*obX>V0Fv2Vu6e8lEVX?vRbWjz|k#?>Eid8t(f5AyyWn5!UJwbm)vA> z@K4ZPZ1A$c13sbxUqSbzqN1X`rlzKzS72EAds#KMpk2B11^snx5ZySS9~cwjxqi-v eQvleca?W2f5{iYw^~}Kl0000PxRU!R9Fe+m`g}hQ5eU)j^m^Wg`hGdq@ym1BoYECoe7^POhsTDcP$Eq7C~6H zajHdB(9Qx~1koapLNXK`H6!Uk52j5Jkt0!*h+&H+1|QS!E3Zt`otO7sC-A`GobR0P z_5Z%}x;L$^uFjLT0gI)msOVuyNr^HwH8ru3@TUvd<>lqBjh1<(rluyOW;#7R{ru?Y zs7IyswxLi+sjsi!g`O&cyF*cwQpOy#TN%rtZ=;=uo~1u4E%Xe2JcE9OFCU>zDSrVM z3wpu3-R|r_Akd8CM^RT#6_9H!(*$FJ>a|*}cZY_Cf@@V2DfbU>VOR_JhK7dxrKP3Q z0B%D?PNX3NXju`xnVFe42*4-3`ZR%y(nP^GHa6M;+`&>lfmoJahZ2xqBmn*Jb&ZXU zy-k2$lf_b8T}o%Ss)Ejf0({VJeu!CQq6tCk)U#^gZWNj>gxI5xRlt|va9 zZ!uXrQ8TV8(#kvsVg*sZ1K={1FNN&~i^bCJ^?FB=@!|J%7E2)fsspIPwRZ~8PyZ9p z;(7_IZkS|T^LRXQ@u*niW?W??^Op%iIdro+mSh_uVAIHal}dkx;C-XNg*Fd5kA9(^ zfTE*6J3G5|U|=ACu9ziZ;4!sCpOkyqOVEY^G|XW%6P@+XOl@s#0RUX^OFhVFVLX}e zd1PNeyW`n13-}uxxKv$T-N*7<4tFe>KC&5;laq&7X(y3$B`S+;zs+XbH#j&bt4p&O z3VbEn7l`%)O=~&^R}R!}RzYPVYQ&e^++0^*U*AtH{)7($E#a`S1q_`d!{#5l=sS zS4hU0NIu;eNAbP&1T6r_{%7uPC${5mDT33%6s7M+g zuQxR{$(P`2(VcP86#mFr)w~WJ4z4BkeH-8hVwnSYSuhwp8_r|I9$(d`^}Jo3G_k{% z;bvZMj{&$Rni+x<#J_T$w(o_Ks^-aNE z|H6NU?WSa04L~X~FE2d6O{hLZwk-E7zu&*xRN!JX72q-39S)d4$mj1(YIA96X+9_W zOVfdi1M3Z*yS*Q - - - - - - - - - - - - + + + + + + android:layout_above="@id/fl_tools" />