From 65f72a8d7407cfc1d4ded97e87a8cbbbe6d16d8b Mon Sep 17 00:00:00 2001 From: Jeffry Lum <22460123+j-lum@users.noreply.github.com> Date: Tue, 6 Aug 2019 15:24:53 +0800 Subject: [PATCH 01/51] Add support for Gradle workflow --- build.gradle | 16 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 55190 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 +++++++++++++++++++++++ gradlew.bat | 84 +++++++++++ settings.gradle | 1 + 6 files changed, 278 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..e5b8ce7e49 --- /dev/null +++ b/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'java' + id 'application' +} + +group 'seedu.duke' +version '0.1.0' + +repositories { + mavenCentral() +} + +application { + // Change this to your main class. + mainClassName = "seedu.duke.Duke" +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..87b738cbd051603d91cc39de6cb000dd98fe6b02 GIT binary patch literal 55190 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 z ze;^F?mwdU?K+=fBabokSls^6_6At#1Sh7W*y?r6Ss*dmZP{n;VB^LDxM1QWh;@H0J z!4S*_5j_;+@-NpO1KfQd&;C7T`9ak;X8DTRz$hDNcjG}xAfg%gwZSb^zhE~O);NMO zn2$fl7Evn%=Lk!*xsM#(y$mjukN?A&mzEw3W5>_o+6oh62kq=4-`e3B^$rG=XG}Kd zK$blh(%!9;@d@3& zGFO60j1Vf54S}+XD?%*uk7wW$f`4U3F*p7@I4Jg7f`Il}2H<{j5h?$DDe%wG7jZQL zI{mj?t?Hu>$|2UrPr5&QyK2l3mas?zzOk0DV30HgOQ|~xLXDQ8M3o#;CNKO8RK+M; zsOi%)js-MU>9H4%Q)#K_me}8OQC1u;f4!LO%|5toa1|u5Q@#mYy8nE9IXmR}b#sZK z3sD395q}*TDJJA9Er7N`y=w*S&tA;mv-)Sx4(k$fJBxXva0_;$G6!9bGBw13c_Uws zXks4u(8JA@0O9g5f?#V~qR5*u5aIe2HQO^)RW9TTcJk28l`Syl>Q#ZveEE4Em+{?%iz6=V3b>rCm9F zPQQm@-(hfNdo2%n?B)u_&Qh7^^@U>0qMBngH8}H|v+Ejg*Dd(Y#|jgJ-A zQ_bQscil%eY}8oN7ZL+2r|qv+iJY?*l)&3W_55T3GU;?@Om*(M`u0DXAsQ7HSl56> z4P!*(%&wRCb?a4HH&n;lAmr4rS=kMZb74Akha2U~Ktni>>cD$6jpugjULq)D?ea%b zk;UW0pAI~TH59P+o}*c5Ei5L-9OE;OIBt>^(;xw`>cN2`({Rzg71qrNaE=cAH^$wP zNrK9Glp^3a%m+ilQj0SnGq`okjzmE7<3I{JLD6Jn^+oas=h*4>Wvy=KXqVBa;K&ri z4(SVmMXPG}0-UTwa2-MJ=MTfM3K)b~DzSVq8+v-a0&Dsv>4B65{dBhD;(d44CaHSM zb!0ne(*<^Q%|nuaL`Gb3D4AvyO8wyygm=1;9#u5x*k0$UOwx?QxR*6Od8>+ujfyo0 zJ}>2FgW_iv(dBK2OWC-Y=Tw!UwIeOAOUUC;h95&S1hn$G#if+d;*dWL#j#YWswrz_ zMlV=z+zjZJ%SlDhxf)vv@`%~$Afd)T+MS1>ZE7V$Rj#;J*<9Ld=PrK0?qrazRJWx) z(BTLF@Wk279nh|G%ZY7_lK7=&j;x`bMND=zgh_>>-o@6%8_#Bz!FnF*onB@_k|YCF z?vu!s6#h9bL3@tPn$1;#k5=7#s*L;FLK#=M89K^|$3LICYWIbd^qguQp02w5>8p-H z+@J&+pP_^iF4Xu>`D>DcCnl8BUwwOlq6`XkjHNpi@B?OOd`4{dL?kH%lt78(-L}eah8?36zw9d-dI6D{$s{f=M7)1 zRH1M*-82}DoFF^Mi$r}bTB5r6y9>8hjL54%KfyHxn$LkW=AZ(WkHWR;tIWWr@+;^^ zVomjAWT)$+rn%g`LHB6ZSO@M3KBA? z+W7ThSBgpk`jZHZUrp`F;*%6M5kLWy6AW#T{jFHTiKXP9ITrMlEdti7@&AT_a-BA!jc(Kt zWk>IdY-2Zbz?U1)tk#n_Lsl?W;0q`;z|t9*g-xE!(}#$fScX2VkjSiboKWE~afu5d z2B@9mvT=o2fB_>Mnie=TDJB+l`GMKCy%2+NcFsbpv<9jS@$X37K_-Y!cvF5NEY`#p z3sWEc<7$E*X*fp+MqsOyMXO=<2>o8)E(T?#4KVQgt=qa%5FfUG_LE`n)PihCz2=iNUt7im)s@;mOc9SR&{`4s9Q6)U31mn?}Y?$k3kU z#h??JEgH-HGt`~%)1ZBhT9~uRi8br&;a5Y3K_Bl1G)-y(ytx?ok9S*Tz#5Vb=P~xH z^5*t_R2It95=!XDE6X{MjLYn4Eszj9Y91T2SFz@eYlx9Z9*hWaS$^5r7=W5|>sY8}mS(>e9Ez2qI1~wtlA$yv2e-Hjn&K*P z2zWSrC~_8Wrxxf#%QAL&f8iH2%R)E~IrQLgWFg8>`Vnyo?E=uiALoRP&qT{V2{$79 z%9R?*kW-7b#|}*~P#cA@q=V|+RC9=I;aK7Pju$K-n`EoGV^-8Mk=-?@$?O37evGKn z3NEgpo_4{s>=FB}sqx21d3*=gKq-Zk)U+bM%Q_}0`XGkYh*+jRaP+aDnRv#Zz*n$pGp zEU9omuYVXH{AEx>=kk}h2iKt!yqX=EHN)LF}z1j zJx((`CesN1HxTFZ7yrvA2jTPmKYVij>45{ZH2YtsHuGzIRotIFj?(8T@ZWUv{_%AI zgMZlB03C&FtgJqv9%(acqt9N)`4jy4PtYgnhqev!r$GTIOvLF5aZ{tW5MN@9BDGu* zBJzwW3sEJ~Oy8is`l6Ly3an7RPtRr^1Iu(D!B!0O241Xua>Jee;Rc7tWvj!%#yX#m z&pU*?=rTVD7pF6va1D@u@b#V@bShFr3 zMyMbNCZwT)E-%L-{%$3?n}>EN>ai7b$zR_>=l59mW;tfKj^oG)>_TGCJ#HbLBsNy$ zqAqPagZ3uQ(Gsv_-VrZmG&hHaOD#RB#6J8&sL=^iMFB=gH5AIJ+w@sTf7xa&Cnl}@ zxrtzoNq>t?=(+8bS)s2p3>jW}tye0z2aY_Dh@(18-vdfvn;D?sv<>UgL{Ti08$1Q+ zZI3q}yMA^LK=d?YVg({|v?d1|R?5 zL0S3fw)BZazRNNX|7P4rh7!+3tCG~O8l+m?H} z(CB>8(9LtKYIu3ohJ-9ecgk+L&!FX~Wuim&;v$>M4 zUfvn<=Eok(63Ubc>mZrd8d7(>8bG>J?PtOHih_xRYFu1Hg{t;%+hXu2#x%a%qzcab zv$X!ccoj)exoOnaco_jbGw7KryOtuf(SaR-VJ0nAe(1*AA}#QV1lMhGtzD>RoUZ;WA?~!K{8%chYn?ttlz17UpDLlhTkGcVfHY6R<2r4E{mU zq-}D?+*2gAkQYAKrk*rB%4WFC-B!eZZLg4(tR#@kUQHIzEqV48$9=Q(~J_0 zy1%LSCbkoOhRO!J+Oh#;bGuXe;~(bIE*!J@i<%_IcB7wjhB5iF#jBn5+u~fEECN2* z!QFh!m<(>%49H12Y33+?$JxKV3xW{xSs=gxkxW-@Xds^|O1`AmorDKrE8N2-@ospk z=Au%h=f!`_X|G^A;XWL}-_L@D6A~*4Yf!5RTTm$!t8y&fp5_oqvBjW{FufS`!)5m% z2g(=9Ap6Y2y(9OYOWuUVGp-K=6kqQ)kM0P^TQT{X{V$*sN$wbFb-DaUuJF*!?EJPl zJev!UsOB^UHZ2KppYTELh+kqDw+5dPFv&&;;C~=u$Mt+Ywga!8YkL2~@g67}3wAQP zrx^RaXb1(c7vwU8a2se75X(cX^$M{FH4AHS7d2}heqqg4F0!1|Na>UtAdT%3JnS!B)&zelTEj$^b0>Oyfw=P-y-Wd^#dEFRUN*C{!`aJIHi<_YA2?piC%^ zj!p}+ZnBrM?ErAM+D97B*7L8U$K zo(IR-&LF(85p+fuct9~VTSdRjs`d-m|6G;&PoWvC&s8z`TotPSoksp;RsL4VL@CHf z_3|Tn%`ObgRhLmr60<;ya-5wbh&t z#ycN_)3P_KZN5CRyG%LRO4`Ot)3vY#dNX9!f!`_>1%4Q`81E*2BRg~A-VcN7pcX#j zrbl@7`V%n z6J53(m?KRzKb)v?iCuYWbH*l6M77dY4keS!%>}*8n!@ROE4!|7mQ+YS4dff1JJC(t z6Fnuf^=dajqHpH1=|pb(po9Fr8it^;2dEk|Ro=$fxqK$^Yix{G($0m-{RCFQJ~LqUnO7jJcjr zl*N*!6WU;wtF=dLCWzD6kW;y)LEo=4wSXQDIcq5WttgE#%@*m><@H;~Q&GniA-$in z`sjWFLgychS1kIJmPtd-w6%iKkj&dGhtB%0)pyy0M<4HZ@ZY0PWLAd7FCrj&i|NRh?>hZj*&FYnyu%Ur`JdiTu&+n z78d3n)Rl6q&NwVj_jcr#s5G^d?VtV8bkkYco5lV0LiT+t8}98LW>d)|v|V3++zLbHC(NC@X#Hx?21J0M*gP2V`Yd^DYvVIr{C zSc4V)hZKf|OMSm%FVqSRC!phWSyuUAu%0fredf#TDR$|hMZihJ__F!)Nkh6z)d=NC z3q4V*K3JTetxCPgB2_)rhOSWhuXzu+%&>}*ARxUaDeRy{$xK(AC0I=9%X7dmc6?lZNqe-iM(`?Xn3x2Ov>sej6YVQJ9Q42>?4lil?X zew-S>tm{=@QC-zLtg*nh5mQojYnvVzf3!4TpXPuobW_*xYJs;9AokrXcs!Ay z;HK>#;G$*TPN2M!WxdH>oDY6k4A6S>BM0Nimf#LfboKxJXVBC=RBuO&g-=+@O-#0m zh*aPG16zY^tzQLNAF7L(IpGPa+mDsCeAK3k=IL6^LcE8l0o&)k@?dz!79yxUquQIe($zm5DG z5RdXTv)AjHaOPv6z%99mPsa#8OD@9=URvHoJ1hYnV2bG*2XYBgB!-GEoP&8fLmWGg z9NG^xl5D&3L^io&3iYweV*qhc=m+r7C#Jppo$Ygg;jO2yaFU8+F*RmPL` zYxfGKla_--I}YUT353k}nF1zt2NO?+kofR8Efl$Bb^&llgq+HV_UYJUH7M5IoN0sT z4;wDA0gs55ZI|FmJ0}^Pc}{Ji-|#jdR$`!s)Di4^g3b_Qr<*Qu2rz}R6!B^;`Lj3sKWzjMYjexX)-;f5Y+HfkctE{PstO-BZan0zdXPQ=V8 zS8cBhnQyy4oN?J~oK0zl!#S|v6h-nx5to7WkdEk0HKBm;?kcNO*A+u=%f~l&aY*+J z>%^Dz`EQ6!+SEX$>?d(~|MNWU-}JTrk}&`IR|Ske(G^iMdk04)Cxd@}{1=P0U*%L5 zMFH_$R+HUGGv|ju2Z>5x(-aIbVJLcH1S+(E#MNe9g;VZX{5f%_|Kv7|UY-CM(>vf= z!4m?QS+AL+rUyfGJ;~uJGp4{WhOOc%2ybVP68@QTwI(8kDuYf?#^xv zBmOHCZU8O(x)=GVFn%tg@TVW1)qJJ_bU}4e7i>&V?r zh-03>d3DFj&@}6t1y3*yOzllYQ++BO-q!)zsk`D(z||)y&}o%sZ-tUF>0KsiYKFg6 zTONq)P+uL5Vm0w{D5Gms^>H1qa&Z##*X31=58*r%Z@Ko=IMXX{;aiMUp-!$As3{sq z0EEk02MOsgGm7$}E%H1ys2$yftNbB%1rdo@?6~0!a8Ym*1f;jIgfcYEF(I_^+;Xdr z2a>&oc^dF3pm(UNpazXgVzuF<2|zdPGjrNUKpdb$HOgNp*V56XqH`~$c~oSiqx;8_ zEz3fHoU*aJUbFJ&?W)sZB3qOSS;OIZ=n-*#q{?PCXi?Mq4aY@=XvlNQdA;yVC0Vy+ z{Zk6OO!lMYWd`T#bS8FV(`%flEA9El;~WjZKU1YmZpG#49`ku`oV{Bdtvzyz3{k&7 zlG>ik>eL1P93F zd&!aXluU_qV1~sBQf$F%sM4kTfGx5MxO0zJy<#5Z&qzNfull=k1_CZivd-WAuIQf> zBT3&WR|VD|=nKelnp3Q@A~^d_jN3@$x2$f@E~e<$dk$L@06Paw$);l*ewndzL~LuU zq`>vfKb*+=uw`}NsM}~oY}gW%XFwy&A>bi{7s>@(cu4NM;!%ieP$8r6&6jfoq756W z$Y<`J*d7nK4`6t`sZ;l%Oen|+pk|Ry2`p9lri5VD!Gq`U#Ms}pgX3ylAFr8(?1#&dxrtJgB>VqrlWZf61(r`&zMXsV~l{UGjI7R@*NiMJLUoK*kY&gY9kC@^}Fj* zd^l6_t}%Ku<0PY71%zQL`@}L}48M!@=r)Q^Ie5AWhv%#l+Rhu6fRpvv$28TH;N7Cl z%I^4ffBqx@Pxpq|rTJV)$CnxUPOIn`u278s9#ukn>PL25VMv2mff)-RXV&r`Dwid7}TEZxXX1q(h{R6v6X z&x{S_tW%f)BHc!jHNbnrDRjGB@cam{i#zZK*_*xlW@-R3VDmp)<$}S%t*@VmYX;1h zFWmpXt@1xJlc15Yjs2&e%)d`fimRfi?+fS^BoTcrsew%e@T^}wyVv6NGDyMGHSKIQ zC>qFr4GY?#S#pq!%IM_AOf`#}tPoMn7JP8dHXm(v3UTq!aOfEXNRtEJ^4ED@jx%le zvUoUs-d|2(zBsrN0wE(Pj^g5wx{1YPg9FL1)V1JupsVaXNzq4fX+R!oVX+q3tG?L= z>=s38J_!$eSzy0m?om6Wv|ZCbYVHDH*J1_Ndajoh&?L7h&(CVii&rmLu+FcI;1qd_ zHDb3Vk=(`WV?Uq;<0NccEh0s`mBXcEtmwt6oN99RQt7MNER3`{snV$qBTp={Hn!zz z1gkYi#^;P8s!tQl(Y>|lvz{5$uiXsitTD^1YgCp+1%IMIRLiSP`sJru0oY-p!FPbI)!6{XM%)(_Dolh1;$HlghB-&e><;zU&pc=ujpa-(+S&Jj zX1n4T#DJDuG7NP;F5TkoG#qjjZ8NdXxF0l58RK?XO7?faM5*Z17stidTP|a%_N z^e$D?@~q#Pf+708cLSWCK|toT1YSHfXVIs9Dnh5R(}(I;7KhKB7RD>f%;H2X?Z9eR z{lUMuO~ffT!^ew= z7u13>STI4tZpCQ?yb9;tSM-(EGb?iW$a1eBy4-PVejgMXFIV_Ha^XB|F}zK_gzdhM z!)($XfrFHPf&uyFQf$EpcAfk83}91Y`JFJOiQ;v5ca?)a!IxOi36tGkPk4S6EW~eq z>WiK`Vu3D1DaZ}515nl6>;3#xo{GQp1(=uTXl1~ z4gdWxr-8a$L*_G^UVd&bqW_nzMM&SlNW$8|$lAfo@zb+P>2q?=+T^qNwblP*RsN?N zdZE%^Zs;yAwero1qaoqMp~|KL=&npffh981>2om!fseU(CtJ=bW7c6l{U5(07*e0~ zJRbid6?&psp)ilmYYR3ZIg;t;6?*>hoZ3uq7dvyyq-yq$zH$yyImjfhpQb@WKENSP zl;KPCE+KXzU5!)mu12~;2trrLfs&nlEVOndh9&!SAOdeYd}ugwpE-9OF|yQs(w@C9 zoXVX`LP~V>%$<(%~tE*bsq(EFm zU5z{H@Fs^>nm%m%wZs*hRl=KD%4W3|(@j!nJr{Mmkl`e_uR9fZ-E{JY7#s6i()WXB0g-b`R{2r@K{2h3T+a>82>722+$RM*?W5;Bmo6$X3+Ieg9&^TU(*F$Q3 zT572!;vJeBr-)x?cP;^w1zoAM`nWYVz^<6N>SkgG3s4MrNtzQO|A?odKurb6DGZffo>DP_)S0$#gGQ_vw@a9JDXs2}hV&c>$ zUT0;1@cY5kozKOcbN6)n5v)l#>nLFL_x?2NQgurQH(KH@gGe>F|$&@ zq@2A!EXcIsDdzf@cWqElI5~t z4cL9gg7{%~4@`ANXnVAi=JvSsj95-7V& zME3o-%9~2?cvlH#twW~99=-$C=+b5^Yv}Zh4;Mg-!LS zw>gqc=}CzS9>v5C?#re>JsRY!w|Mtv#%O3%Ydn=S9cQarqkZwaM4z(gL~1&oJZ;t; zA5+g3O6itCsu93!G1J_J%Icku>b3O6qBW$1Ej_oUWc@MI)| zQ~eyS-EAAnVZp}CQnvG0N>Kc$h^1DRJkE7xZqJ0>p<>9*apXgBMI-v87E0+PeJ-K& z#(8>P_W^h_kBkI;&e_{~!M+TXt@z8Po*!L^8XBn{of)knd-xp{heZh~@EunB2W)gd zAVTw6ZZasTi>((qpBFh(r4)k zz&@Mc@ZcI-4d639AfcOgHOU+YtpZ)rC%Bc5gw5o~+E-i+bMm(A6!uE>=>1M;V!Wl4 z<#~muol$FsY_qQC{JDc8b=$l6Y_@_!$av^08`czSm!Xan{l$@GO-zPq1s>WF)G=wv zDD8j~Ht1pFj)*-b7h>W)@O&m&VyYci&}K|0_Z*w`L>1jnGfCf@6p}Ef*?wdficVe_ zmPRUZ(C+YJU+hIj@_#IiM7+$4kH#VS5tM!Ksz01siPc-WUe9Y3|pb4u2qnn zRavJiRpa zq?tr&YV?yKt<@-kAFl3s&Kq#jag$hN+Y%%kX_ytvpCsElgFoN3SsZLC>0f|m#&Jhu zp7c1dV$55$+k78FI2q!FT}r|}cIV;zp~#6X2&}22$t6cHx_95FL~T~1XW21VFuatb zpM@6w>c^SJ>Pq6{L&f9()uy)TAWf;6LyHH3BUiJ8A4}od)9sriz~e7}l7Vr0e%(=>KG1Jay zW0azuWC`(|B?<6;R)2}aU`r@mt_#W2VrO{LcX$Hg9f4H#XpOsAOX02x^w9+xnLVAt z^~hv2guE-DElBG+`+`>PwXn5kuP_ZiOO3QuwoEr)ky;o$n7hFoh}Aq0@Ar<8`H!n} zspCC^EB=6>$q*gf&M2wj@zzfBl(w_@0;h^*fC#PW9!-kT-dt*e7^)OIU{Uw%U4d#g zL&o>6`hKQUps|G4F_5AuFU4wI)(%9(av7-u40(IaI|%ir@~w9-rLs&efOR@oQy)}{ z&T#Qf`!|52W0d+>G!h~5A}7VJky`C3^fkJzt3|M&xW~x-8rSi-uz=qBsgODqbl(W#f{Ew#ui(K)(Hr&xqZs` zfrK^2)tF#|U=K|_U@|r=M_Hb;qj1GJG=O=d`~#AFAccecIaq3U`(Ds1*f*TIs=IGL zp_vlaRUtFNK8(k;JEu&|i_m39c(HblQkF8g#l|?hPaUzH2kAAF1>>Yykva0;U@&oRV8w?5yEK??A0SBgh?@Pd zJg{O~4xURt7!a;$rz9%IMHQeEZHR8KgFQixarg+MfmM_OeX#~#&?mx44qe!wt`~dd zqyt^~ML>V>2Do$huU<7}EF2wy9^kJJSm6HoAD*sRz%a|aJWz_n6?bz99h)jNMp}3k ztPVbos1$lC1nX_OK0~h>=F&v^IfgBF{#BIi&HTL}O7H-t4+wwa)kf3AE2-Dx@#mTA z!0f`>vz+d3AF$NH_-JqkuK1C+5>yns0G;r5ApsU|a-w9^j4c+FS{#+7- zH%skr+TJ~W_8CK_j$T1b;$ql_+;q6W|D^BNK*A+W5XQBbJy|)(IDA=L9d>t1`KX2b zOX(Ffv*m?e>! zS3lc>XC@IqPf1g-%^4XyGl*1v0NWnwZTW?z4Y6sncXkaA{?NYna3(n@(+n+#sYm}A zGQS;*Li$4R(Ff{obl3#6pUsA0fKuWurQo$mWXMNPV5K66V!XYOyc})^>889Hg3I<{V^Lj9($B4Zu$xRr=89-lDz9x`+I8q(vEAimx1K{sTbs|5x7S zZ+7o$;9&9>@3K;5-DVzGw=kp7ez%1*kxhGytdLS>Q)=xUWv3k_x(IsS8we39Tijvr z`GKk>gkZTHSht;5q%fh9z?vk%sWO}KR04G9^jleJ^@ovWrob7{1xy7V=;S~dDVt%S za$Q#Th%6g1(hiP>hDe}7lcuI94K-2~Q0R3A1nsb7Y*Z!DtQ(Ic<0;TDKvc6%1kBdJ z$hF!{uALB0pa?B^TC}#N5gZ|CKjy|BnT$7eaKj;f>Alqdb_FA3yjZ4CCvm)D&ibL) zZRi91HC!TIAUl<|`rK_6avGh`!)TKk=j|8*W|!vb9>HLv^E%t$`@r@piI(6V8pqDG zBON7~=cf1ZWF6jc{qkKm;oYBtUpIdau6s+<-o^5qNi-p%L%xAtn9OktFd{@EjVAT% z#?-MJ5}Q9QiK_jYYWs+;I4&!N^(mb!%4zx7qO6oCEDn=8oL6#*9XIJ&iJ30O`0vsFy|fEVkw}*jd&B6!IYi+~Y)qv6QlM&V9g0 zh)@^BVDB|P&#X{31>G*nAT}Mz-j~zd>L{v{9AxrxKFw8j;ccQ$NE0PZCc(7fEt1xd z`(oR2!gX6}R+Z77VkDz^{I)@%&HQT5q+1xlf*3R^U8q%;IT8-B53&}dNA7GW`Ki&= z$lrdH zDCu;j$GxW<&v_4Te7=AE2J0u1NM_7Hl9$u{z(8#%8vvrx2P#R7AwnY|?#LbWmROa; zOJzU_*^+n(+k;Jd{e~So9>OF>fPx$Hb$?~K1ul2xr>>o@**n^6IMu8+o3rDp(X$cC z`wQt9qIS>yjA$K~bg{M%kJ00A)U4L+#*@$8UlS#lN3YA{R{7{-zu#n1>0@(#^eb_% zY|q}2)jOEM8t~9p$X5fpT7BZQ1bND#^Uyaa{mNcFWL|MoYb@>y`d{VwmsF&haoJuS2W7azZU0{tu#Jj_-^QRc35tjW~ae&zhKk!wD}#xR1WHu z_7Fys#bp&R?VXy$WYa$~!dMxt2@*(>@xS}5f-@6eoT%rwH zv_6}M?+piNE;BqaKzm1kK@?fTy$4k5cqYdN8x-<(o6KelwvkTqC3VW5HEnr+WGQlF zs`lcYEm=HPpmM4;Ich7A3a5Mb3YyQs7(Tuz-k4O0*-YGvl+2&V(B&L1F8qfR0@vQM-rF<2h-l9T12eL}3LnNAVyY_z51xVr$%@VQ-lS~wf3mnHc zoM({3Z<3+PpTFCRn_Y6cbxu9v>_>eTN0>hHPl_NQQuaK^Mhrv zX{q#80ot;ptt3#js3>kD&uNs{G0mQp>jyc0GG?=9wb33hm z`y2jL=J)T1JD7eX3xa4h$bG}2ev=?7f>-JmCj6){Upo&$k{2WA=%f;KB;X5e;JF3IjQBa4e-Gp~xv- z|In&Rad7LjJVz*q*+splCj|{7=kvQLw0F@$vPuw4m^z=B^7=A4asK_`%lEf_oIJ-O z{L)zi4bd#&g0w{p1$#I&@bz3QXu%Y)j46HAJKWVfRRB*oXo4lIy7BcVl4hRs<%&iQ zr|)Z^LUJ>qn>{6y`JdabfNNFPX7#3`x|uw+z@h<`x{J4&NlDjnknMf(VW_nKWT!Jh zo1iWBqT6^BR-{T=4Ybe+?6zxP_;A5Uo{}Xel%*=|zRGm1)pR43K39SZ=%{MDCS2d$~}PE-xPw4ZK6)H;Zc&0D5p!vjCn0wCe&rVIhchR9ql!p2`g0b@JsC^J#n_r*4lZ~u0UHKwo(HaHUJDHf^gdJhTdTW z3i7Zp_`xyKC&AI^#~JMVZj^9WsW}UR#nc#o+ifY<4`M+?Y9NTBT~p`ONtAFf8(ltr*ER-Ig!yRs2xke#NN zkyFcaQKYv>L8mQdrL+#rjgVY>Z2_$bIUz(kaqL}cYENh-2S6BQK-a(VNDa_UewSW` zMgHi<3`f!eHsyL6*^e^W7#l?V|42CfAjsgyiJsA`yNfAMB*lAsJj^K3EcCzm1KT zDU2+A5~X%ax-JJ@&7>m`T;;}(-e%gcYQtj}?ic<*gkv)X2-QJI5I0tA2`*zZRX(;6 zJ0dYfMbQ+{9Rn3T@Iu4+imx3Y%bcf2{uT4j-msZ~eO)5Z_T7NC|Nr3)|NWjomhv=E zXaVin)MY)`1QtDyO7mUCjG{5+o1jD_anyKn73uflH*ASA8rm+S=gIfgJ);>Zx*hNG z!)8DDCNOrbR#9M7Ud_1kf6BP)x^p(|_VWCJ+(WGDbYmnMLWc?O4zz#eiP3{NfP1UV z(n3vc-axE&vko^f+4nkF=XK-mnHHQ7>w05$Q}iv(kJc4O3TEvuIDM<=U9@`~WdKN* zp4e4R1ncR_kghW}>aE$@OOc~*aH5OOwB5U*Z)%{LRlhtHuigxH8KuDwvq5{3Zg{Vr zrd@)KPwVKFP2{rXho(>MTZZfkr$*alm_lltPob4N4MmhEkv`J(9NZFzA>q0Ch;!Ut zi@jS_=0%HAlN+$-IZGPi_6$)ap>Z{XQGt&@ZaJ(es!Po5*3}>R4x66WZNsjE4BVgn z>}xm=V?F#tx#e+pimNPH?Md5hV7>0pAg$K!?mpt@pXg6UW9c?gvzlNe0 z3QtIWmw$0raJkjQcbv-7Ri&eX6Ks@@EZ&53N|g7HU<;V1pkc&$3D#8k!coJ=^{=vf z-pCP;vr2#A+i#6VA?!hs6A4P@mN62XYY$#W9;MwNia~89i`=1GoFESI+%Mbrmwg*0 zbBq4^bA^XT#1MAOum)L&ARDXJ6S#G>&*72f50M1r5JAnM1p7GFIv$Kf9eVR(u$KLt z9&hQ{t^i16zL1c(tRa~?qr?lbSN;1k;%;p*#gw_BwHJRjcYPTj6>y-rw*dFTnEs95 z`%-AoPL!P16{=#RI0 zUb6#`KR|v^?6uNnY`zglZ#Wd|{*rZ(x&Hk8N6ob6mpX~e^qu5kxvh$2TLJA$M=rx zc!#ot+sS+-!O<0KR6+Lx&~zgEhCsbFY{i_DQCihspM?e z-V}HemMAvFzXR#fV~a=Xf-;tJ1edd}Mry@^=9BxON;dYr8vDEK<<{ zW~rg(ZspxuC&aJo$GTM!9_sXu(EaQJNkV9AC(ob#uA=b4*!Uf}B*@TK=*dBvKKPAF z%14J$S)s-ws9~qKsf>DseEW(ssVQ9__YNg}r9GGx3AJiZR@w_QBlGP>yYh0lQCBtf zx+G;mP+cMAg&b^7J!`SiBwC81M_r0X9kAr2y$0(Lf1gZK#>i!cbww(hn$;fLIxRf? z!AtkSZc-h76KGSGz%48Oe`8ZBHkSXeVb!TJt_VC>$m<#}(Z}!(3h631ltKb3CDMw^fTRy%Ia!b&at`^g7Ew-%WLT9(#V0OP9CE?uj62s>`GI3NA z!`$U+i<`;IQyNBkou4|-7^9^ylac-Xu!M+V5p5l0Ve?J0wTSV+$gYtoc=+Ve*OJUJ z$+uIGALW?}+M!J9+M&#bT=Hz@{R2o>NtNGu1yS({pyteyb>*sg4N`KAD?`u3F#C1y z2K4FKOAPASGZTep54PqyCG(h3?kqQQAxDSW@>T2d!n;9C8NGS;3A8YMRcL>b=<<%M zMiWf$jY;`Ojq5S{kA!?28o)v$;)5bTL<4eM-_^h4)F#eeC2Dj*S`$jl^yn#NjJOYT zx%yC5Ww@eX*zsM)P(5#wRd=0+3~&3pdIH7CxF_2iZSw@>kCyd z%M}$1p((Bidw4XNtk&`BTkU{-PG)SXIZ)yQ!Iol6u8l*SQ1^%zC72FP zLvG>_Z0SReMvB%)1@+et0S{<3hV@^SY3V~5IY(KUtTR{*^xJ^2NN{sIMD9Mr9$~(C$GLNlSpzS=fsbw-DtHb_T|{s z9OR|sx!{?F``H!gVUltY7l~dx^a(2;OUV^)7 z%@hg`8+r&xIxmzZ;Q&v0X%9P)U0SE@r@(lKP%TO(>6I_iF{?PX(bez6v8Gp!W_nd5 z<8)`1jcT)ImNZp-9rr4_1MQ|!?#8sJQx{`~7)QZ75I=DPAFD9Mt{zqFrcrXCU9MG8 zEuGcy;nZ?J#M3!3DWW?Zqv~dnN6ijlIjPfJx(#S0cs;Z=jDjKY|$w2s4*Xa1Iz953sN2Lt!Vmk|%ZwOOqj`sA--5Hiaq8!C%LV zvWZ=bxeRV(&%BffMJ_F~~*FdcjhRVNUXu)MS(S#67rDe%Ler=GS+WysC1I2=Bmbh3s6wdS}o$0 zz%H08#SPFY9JPdL6blGD$D-AaYi;X!#zqib`(XX*i<*eh+2UEPzU4}V4RlC3{<>-~ zadGA8lSm>b7Z!q;D_f9DT4i)Q_}ByElGl*Cy~zX%IzHp)@g-itZB6xM70psn z;AY8II99e6P2drgtTG5>`^|7qg`9MTp%T~|1N3tBqV}2zgow3TFAH{XPor0%=HrkXnKyxyozHlJ6 zd3}OWkl?H$l#yZqOzZbMI+lDLoH48;s10!m1!K87g;t}^+A3f3e&w{EYhVPR0Km*- zh5-ku$Z|Ss{2?4pGm(Rz!0OQb^_*N`)rW{z)^Cw_`a(_L9j=&HEJl(!4rQy1IS)>- zeTIr>hOii`gc(fgYF(cs$R8l@q{mJzpoB5`5r>|sG zBpsY}RkY(g5`bj~D>(;F8v*DyjX(#nVLSs>)XneWI&%Wo>a0u#4A?N<1SK4D}&V1oN)76 z%S>a2n3n>G`YY1>0Hvn&AMtMuI_?`5?4y3w2Hnq4Qa2YH5 zxKdfM;k467djL31Y$0kd9FCPbU=pHBp@zaIi`Xkd80;%&66zvSqsq6%aY)jZacfvw ztkWE{ZV6V2WL9e}Dvz|!d96KqVkJU@5ryp#rReeWu>mSrOJxY^tWC9wd0)$+lZc%{ zY=c4#%OSyQJvQUuy^u}s8DN8|8T%TajOuaY^)R-&8s@r9D`(Ic4NmEu)fg1f!u`xUb;9t#rM z>}cY=648@d5(9A;J)d{a^*ORdVtJrZ77!g~^lZ9@)|-ojvW#>)Jhe8$7W3mhmQh@S zU=CSO+1gSsQ+Tv=x-BD}*py_Ox@;%#hPb&tqXqyUW9jV+fonnuCyVw=?HR>dAB~Fg z^vl*~y*4|)WUW*9RC%~O1gHW~*tJb^a-j;ae2LRNo|0S2`RX>MYqGKB^_ng7YRc@! zFxg1X!VsvXkNuv^3mI`F2=x6$(pZdw=jfYt1ja3FY7a41T07FPdCqFhU6%o|Yb6Z4 zpBGa=(ao3vvhUv#*S{li|EyujXQPUV;0sa5!0Ut)>tPWyC9e0_9(=v*z`TV5OUCcx zT=w=^8#5u~7<}8Mepqln4lDv*-~g^VoV{(+*4w(q{At6d^E-Usa2`JXty++Oh~on^ z;;WHkJsk2jvh#N|?(2PLl+g!M0#z_A;(#Uy=TzL&{Ei5G9#V{JbhKV$Qmkm%5tn!CMA? z@hM=b@2DZWTQ6>&F6WCq6;~~WALiS#@{|I+ucCmD6|tBf&e;$_)%JL8$oIQ%!|Xih1v4A$=7xNO zZVz$G8;G5)rxyD+M0$20L$4yukA_D+)xmK3DMTH3Q+$N&L%qB)XwYx&s1gkh=%qGCCPwnwhbT4p%*3R)I}S#w7HK3W^E%4w z2+7ctHPx3Q97MFYB48HfD!xKKb(U^K_4)Bz(5dvwyl*R?)k;uHEYVi|{^rvh)w7}t z`tnH{v9nlVHj2ign|1an_wz0vO)*`3RaJc#;(W-Q6!P&>+@#fptCgtUSn4!@b7tW0&pE2Qj@7}f#ugu4*C)8_}AMRuz^WG zc)XDcOPQjRaGptRD^57B83B-2NKRo!j6TBAJntJPHNQG;^Oz}zt5F^kId~miK3J@l ztc-IKp6qL!?u~q?qfGP0I~$5gvq#-0;R(oLU@sYayr*QH95fnrYA*E|n%&FP@Cz`a zSdJ~(c@O^>qaO`m9IQ8sd8!L<+)GPJDrL7{4{ko2gWOZel^3!($Gjt|B&$4dtfTmBmC>V`R&&6$wpgvdmns zxcmfS%9_ZoN>F~azvLFtA(9Q5HYT#A(byGkESnt{$Tu<73$W~reB4&KF^JBsoqJ6b zS?$D7DoUgzLO-?P`V?5_ub$nf1p0mF?I)StvPomT{uYjy!w&z$t~j&en=F~hw|O(1 zlV9$arQmKTc$L)Kupwz_zA~deT+-0WX6NzFPh&d+ly*3$%#?Ca9Z9lOJsGVoQ&1HNg+)tJ_sw)%oo*DK)iU~n zvL``LqTe=r=7SwZ@LB)9|3QB5`0(B9r(iR}0nUwJss-v=dXnwMRQFYSRK1blS#^g(3@z{`=8_CGDm!LESTWig zzm1{?AG&7`uYJ;PoFO$o8RWuYsV26V{>D-iYTnvq7igWx9@w$EC*FV^vpvDl@i9yp zPIqiX@hEZF4VqzI3Y)CHhR`xKN8poL&~ak|wgbE4zR%Dm(a@?bw%(7(!^>CM!^4@J z6Z)KhoQP;WBq_Z_&<@i2t2&xq>N>b;Np2rX?yK|-!14iE2T}E|jC+=wYe~`y38g3J z8QGZquvqBaG!vw&VtdXWX5*i5*% zJP~7h{?&E|<#l{klGPaun`IgAJ4;RlbRqgJz5rmHF>MtJHbfqyyZi53?Lhj=(Ku#& z__ubmZIxzSq3F90Xur!1)Vqe6b@!ueHA!93H~jdHmaS5Q^CULso}^poy)0Op6!{^9 zWyCyyIrdBP4fkliZ%*g+J-A!6VFSRF6Liu6G^^=W>cn81>4&7(c7(6vCGSAJ zQZ|S3mb|^Wf=yJ(h~rq`iiW~|n#$+KcblIR<@|lDtm!&NBzSG-1;7#YaU+-@=xIm4 zE}edTYd~e&_%+`dIqqgFntL-FxL3!m4yTNt<(^Vt9c6F(`?9`u>$oNxoKB29<}9FE zgf)VK!*F}nW?}l95%RRk8N4^Rf8)Xf;drT4<|lUDLPj^NPMrBPL;MX&0oGCsS za3}vWcF(IPx&W6{s%zwX{UxHX2&xLGfT{d9bWP!g;Lg#etpuno$}tHoG<4Kd*=kpU z;4%y(<^yj(UlG%l-7E9z_Kh2KoQ19qT3CR@Ghr>BAgr3Vniz3LmpC4g=g|A3968yD2KD$P7v$ zx9Q8`2&qH3&y-iv0#0+jur@}k`6C%7fKbCr|tHX2&O%r?rBpg`YNy~2m+ z*L7dP$RANzVUsG_Lb>=__``6vA*xpUecuGsL+AW?BeSwyoQfDlXe8R1*R1M{0#M?M zF+m19`3<`gM{+GpgW^=UmuK*yMh3}x)7P738wL8r@(Na6%ULPgbPVTa6gh5Q(SR0f znr6kdRpe^(LVM;6Rt(Z@Lsz3EX*ry6(WZ?w>#ZRelx)N%sE+MN>5G|Z8{%@b&D+Ov zPU{shc9}%;G7l;qbonIb_1m^Qc8ez}gTC-k02G8Rl?7={9zBz8uRX2{XJQ{vZhs67avlRn| zgRtWl0Lhjet&!YC47GIm%1gdq%T24_^@!W3pCywc89X4I5pnBCZDn(%!$lOGvS*`0!AoMtqxNPFgaMR zwoW$p;8l6v%a)vaNsesED3f}$%(>zICnoE|5JwP&+0XI}JxPccd+D^gx`g`=GsUc0 z9Uad|C+_@_0%JmcObGnS@3+J^0P!tg+fUZ_w#4rk#TlJYPXJiO>SBxzs9(J;XV9d{ zmTQE1(K8EYaz9p^XLbdWudyIPJlGPo0U*)fAh-jnbfm@SYD_2+?|DJ-^P+ojG{2{6 z>HJtedEjO@j_tqZ4;Zq1t5*5cWm~W?HGP!@_f6m#btM@46cEMhhK{(yI&jG)fwL1W z^n_?o@G8a-jYt!}$H*;{0#z8lANlo!9b@!c5K8<(#lPlpE!z86Yq#>WT&2} z;;G1$pD%iNoj#Z=&kij5&V1KHIhN-h<;{HC5wD)PvkF>CzlQOEx_0;-TJ*!#&{Wzt zKcvq^SZIdop}y~iouNqtU7K7+?eIz-v_rfNM>t#i+dD$s_`M;sjGubTdP)WI*uL@xPOLHt#~T<@Yz>xt50ZoTw;a(a}lNiDN-J${gOdE zx?8LOA|tv{Mb}=TTR=LcqMqbCJkKj+@;4Mu)Cu0{`~ohix6E$g&tff)aHeUAQQ%M? zIN4uSUTzC1iMEWL*W-in1y)C`E+R8j?4_?X4&2Zv5?QdkNMz(k} zw##^Ikx`#_s>i&CO_mu@vJJ*|3ePRDl5pq$9V^>D;g0R%l>lw;ttyM6Sy`NBF{)Lr zSk)V>mZr96+aHY%vTLLt%vO-+juw6^SO_ zYGJaGeWX6W(TOQx=5oTGXOFqMMU*uZyt>MR-Y`vxW#^&)H zk0!F8f*@v6NO@Z*@Qo)+hlX40EWcj~j9dGrLaq%1;DE_%#lffXCcJ;!ZyyyZTz74Q zb2WSly6sX{`gQeToQsi1-()5EJ1nJ*kXGD`xpXr~?F#V^sxE3qSOwRSaC9x9oa~jJ zTG9`E|q zC5Qs1xh}jzb5UPYF`3N9YuMnI7xsZ41P;?@c|%w zl=OxLr6sMGR+`LStLvh)g?fA5p|xbUD;yFAMQg&!PEDYxVYDfA>oTY;CFt`cg?Li1 z0b})!9Rvw&j#*&+D2))kXLL z0+j=?7?#~_}N-qdEIP>DQaZh#F(#e0WNLzwUAj@r694VJ8?Dr5_io2X49XYsG^ zREt0$HiNI~6VV!ycvao+0v7uT$_ilKCvsC+VDNg7yG1X+eNe^3D^S==F3ByiW0T^F zH6EsH^}Uj^VPIE&m)xlmOScYR(w750>hclqH~~dM2+;%GDXT`u4zG!p((*`Hwx41M z4KB+`hfT(YA%W)Ve(n+Gu9kuXWKzxg{1ff^xNQw>w%L-)RySTk9kAS92(X0Shg^Q? zx1YXg_TLC^?h6!4mBqZ9pKhXByu|u~gF%`%`vdoaGBN3^j4l!4x?Bw4Jd)Z4^di}! zXlG1;hFvc>H?bmmu1E7Vx=%vahd!P1#ZGJOJYNbaek^$DHt`EOE|Hlij+hX>ocQFSLVu|wz`|KVl@Oa;m2k6b*mNK2Vo{~l9>Qa3@B7G7#k?)aLx;w6U ze8bBq%vF?5v>#TspEoaII!N}sRT~>bh-VWJ7Q*1qsz%|G)CFmnttbq$Ogb{~YK_=! z{{0vhlW@g!$>|}$&4E3@k`KPElW6x#tSX&dfle>o!irek$NAbDzdd2pVeNzk4&qgJ zXvNF0$R96~g0x+R1igR=Xu&X_Hc5;!Ze&C)eUTB$9wW&?$&o8Yxhm5s(S`;?{> z*F?9Gr0|!OiKA>Rq-ae=_okB6&yMR?!JDer{@iQgIn=cGxs-u^!8Q$+N&pfg2WM&Z zulHu=Uh~U>fS{=Nm0x>ACvG*4R`Dx^kJ65&Vvfj`rSCV$5>c04N26Rt2S?*kh3JKq z9(3}5T?*x*AP(X2Ukftym0XOvg~r6Ms$2x&R&#}Sz23aMGU&7sU-cFvE3Eq`NBJe84VoftWF#v7PDAp`@V zRFCS24_k~;@~R*L)eCx@Q9EYmM)Sn}HLbVMyxx%{XnMBDc-YZ<(DXDBYUt8$u5Zh} zBK~=M9cG$?_m_M61YG+#|9Vef7LfbH>(C21&aC)x$^Lg}fa#SF){RX|?-xZjSOrn# z2ZAwUF)$VB<&S;R3FhNSQOV~8w%A`V9dWyLiy zgt7G=Z4t|zU3!dh5|s(@XyS|waBr$>@=^Dspmem8)@L`Ns{xl%rGdX!R(BiC5C7Vo zXetb$oC_iXS}2x_Hy}T(hUUNbO47Q@+^4Q`h>(R-;OxCyW#eoOeC51jzxnM1yxBrp zz6}z`(=cngs6X05e79o_B7@3K|Qpe3n38Py_~ zpi?^rj!`pq!7PHGliC$`-8A^Ib?2qgJJCW+(&TfOnFGJ+@-<<~`7BR0f4oSINBq&R z2CM`0%WLg_Duw^1SPwj-{?BUl2Y=M4e+7yL1{C&&f&zjF06#xf>VdLozgNye(BNgSD`=fFbBy0HIosLl@JwCQl^s;eTnc( z3!r8G=K>zb`|bLLI0N|eFJk%s)B>oJ^M@AQzqR;HUjLsOqW<0v>1ksT_#24*U@R3HJu*A^#1o#P3%3_jq>icD@<`tqU6ICEgZrME(xX#?i^Z z%Id$_uyQGlFD-CcaiRtRdGn|K`Lq5L-rx7`vYYGH7I=eLfHRozPiUtSe~Tt;IN2^gCXmf2#D~g2@9bhzK}3nphhG%d?V7+Zq{I2?Gt*!NSn_r~dd$ zqkUOg{U=MI?Ehx@`(X%rQB?LP=CjJ*V!rec{#0W2WshH$X#9zep!K)tzZoge*LYd5 z@g?-j5_mtMp>_WW`p*UNUZTFN{_+#m*bJzt{hvAdkF{W40{#L3w6gzPztnsA_4?&0 z(+>pv!zB16rR-(nm(^c>Z(its{ny677vT8sF564^mlZvJ!h65}OW%Hn|2OXbOQM%b z{6C54Z2v;^hyMQ;UH+HwFD2!F!VlQ}6Z{L0_9g5~CH0@Mqz?ZC`^QkhOU#$Lx<4`B zyZsa9uPF!rZDo8ZVfzzR#raQ>5|)k~_Ef*wDqG^76o)j!C4 zykvT*o$!-MBko@?{b~*Zf2*YMlImrK`cEp|#D7f%Twm<|C|dWD \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..6d57edc706 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000000..d1e92fe5db --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'duke' From 0112efe4f745ecd1985e5362f85e8ddc5facb02c Mon Sep 17 00:00:00 2001 From: Jeffry Lum <22460123+j-lum@users.noreply.github.com> Date: Mon, 12 Aug 2019 18:09:24 +0800 Subject: [PATCH 02/51] Add sample checkstyle configuration Add toolVersion block in to Gradle code sample to prevent errors. --- config/checkstyle/checkstyle.xml | 257 +++++++++++++++++++++++++++++++ tutorials/gradleTutorial.md | 7 +- 2 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 config/checkstyle/checkstyle.xml diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000000..b1a57ba6c0 --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorials/gradleTutorial.md b/tutorials/gradleTutorial.md index d16b72179a..fd6b043bf7 100644 --- a/tutorials/gradleTutorial.md +++ b/tutorials/gradleTutorial.md @@ -74,11 +74,16 @@ plugins { id 'application' id 'checkstyle' } + +checkstyle { + toolVersion = '8.23' +} + // ... ``` Checkstyle expects configuration files for checkstyle to be in `./config/checkstyle/` by convention. -For example, you can copy [these files from se-edu/addressbook-level3](https://github.com/se-edu/addressbook-level3/blob/master/config/checkstyle/) to your project. +A sample checkstyle rule configuration is provided in the branch. The plugin adds a few _tasks_ to your project. Run `gradlew checkstyleMain checkstyleTest` to verify that you have set up Checkstyle properly (the command will check your main code and test code against the style rules). From cfd6da79bab287c74d4b7f5666e61e686674fb29 Mon Sep 17 00:00:00 2001 From: Jeffry Lum <22460123+j-lum@users.noreply.github.com> Date: Sun, 18 Aug 2019 23:25:53 +0800 Subject: [PATCH 03/51] Change file mode on `gradle` to be executable --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From 3a7a107d79532dcf135869711f085c7999bde862 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Wed, 21 Aug 2019 22:31:25 +0800 Subject: [PATCH 04/51] Done Level 1. Added Greeting, Echo and Exit. --- src/.idea/$PRODUCT_WORKSPACE_FILE$ | 40 +++++++++++++++++++++++ src/.idea/.gitignore | 2 ++ src/.idea/misc.xml | 6 ++++ src/.idea/modules.xml | 8 +++++ src/.idea/vcs.xml | 6 ++++ src/main/java/Duke.class | Bin 0 -> 1894 bytes src/main/java/Duke.java | 50 +++++++++++++++++++++++++---- 7 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 src/.idea/$PRODUCT_WORKSPACE_FILE$ create mode 100644 src/.idea/.gitignore create mode 100644 src/.idea/misc.xml create mode 100644 src/.idea/modules.xml create mode 100644 src/.idea/vcs.xml create mode 100644 src/main/java/Duke.class diff --git a/src/.idea/$PRODUCT_WORKSPACE_FILE$ b/src/.idea/$PRODUCT_WORKSPACE_FILE$ new file mode 100644 index 0000000000..67bd976742 --- /dev/null +++ b/src/.idea/$PRODUCT_WORKSPACE_FILE$ @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/.idea/.gitignore b/src/.idea/.gitignore new file mode 100644 index 0000000000..5c98b42884 --- /dev/null +++ b/src/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/src/.idea/misc.xml b/src/.idea/misc.xml new file mode 100644 index 0000000000..1763e153b6 --- /dev/null +++ b/src/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/.idea/modules.xml b/src/.idea/modules.xml new file mode 100644 index 0000000000..49577a565d --- /dev/null +++ b/src/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/.idea/vcs.xml b/src/.idea/vcs.xml new file mode 100644 index 0000000000..6c0b863585 --- /dev/null +++ b/src/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class new file mode 100644 index 0000000000000000000000000000000000000000..9ebd0658a903344330cfdcd8a9e09a2911573a13 GIT binary patch literal 1894 zcmbtU>rxy=6#klBmJEu>dKi{7G0bmY4n&`urj&TiX z6A6r|Wx~KDrc$KfnD`JMY4})iZkRCeiCS)|!JA$EW#r4HnwX`iN>wMcIPO`*ZpP?`PWaTM;#vPCQyG}l= zxc+WN8Fu7DUff^h1g`U><#grZLgQxOM>u@x~32Xs=J1v?fg#=GCK9i@6I zinI@+)wUN@2&XPm4jg-{P?#=|c&k8E;lQK>mM!FPjp0&M(Q4>=PQJ)}UsNnSz*j286$`6av+xj)=!&*$6ya-p zW8pdmEDS5-1ZBx^UnQ%c{m)NFo?%2eqvFrn%d#x&P}+eIc1>1ozDr$T2U7aOlwG3{ z9&SGsMY`lOta@*pXVrpGlnAn{l5TJP>RstPQhh@Df|oKT*6}UFl!CARFci{TZ9?~Lihb0(b(#A+o(M+jhM9|a&v4EeuGh+l9 zUdXQ*Hin`9*26H3zdjn6KpRaz8XdF_(&;MgjP};aBe36zV0bT90+|?iA6H`4BRaQ| zY%SHY@(PK~BP3Uk(fSf?Qzy`XL+EsT1!MCi%plR0vws@hYp&*TZgj_cEimqLCVJZj!4FJi&K#*VA Date: Thu, 22 Aug 2019 00:55:53 +0800 Subject: [PATCH 05/51] Done Level 2. Added List function and Task function. --- src/main/java/Duke.class | Bin 1894 -> 2286 bytes src/main/java/Duke.java | 51 +++++++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 9ebd0658a903344330cfdcd8a9e09a2911573a13..36d49d96053a6e6a2d6398bfe826ba0a10e7a485 100644 GIT binary patch literal 2286 zcmbtVT~8ZF6g^|s-u1ExiHS*QzLtDp2;i2qBmqJ`oDkdsNo$%k4Xv}-6L45|U3(oB ziKi-3rM^_E)T-%gAM)Hh5Jc7ffc}d9jwot+W^Dq*R$ppMGk5OXd*;r$ckcf6&*q;1 z&ciox7=s3eOuU1%8s3fLJq#zfJ7Ut{f{u$yGit)Xn2vEZUsA(_fy*Y^aYcDuHE=Bf zf$M5oB~Q-QRu*Js z&RKA&(N>(2C(xC;KmEvg?4(`CTTJJIO37OsQ;vIbfm2wXamt~+j#+{BGIxWlSCn2L z5D!-hm$FkV&iT`&D)oJ>5S!1)szZzrUf|9ocQweKIF&`@PYg{SIyxrJRiZ}nXomQq>TcPz@INJ8O zIwD=)QUGatKA#`Rb9+8dDZge~IE|wgPT{DITNZBPV}X6wd_SlL6{kESgC)OM?TFzM z133$G_*BOo3wO~kus=*iEhxF^T*2`?S+VdL?x_oYPLQ_~W#K;NEqsA5neK&EX(5jX z7E+20&1E(WkeoRzSU7`T3w`PgO>tqNpyZ6Y!T{3B9r$)tN_*9>+0G&h z%&z*r*JGf_b5*`}UEn+7 zJQV1ilCJCb*xB9{Q-oQ%yW|8m$+WX}(YGJ^6&2lOfrBf~vds8i!3pk`f+b4T!0`f> z-v>xxVC7XXV$tD<3fv zZ+KkPU)q6GU#m!B@~fKTzWsFS1dk~QO$^zB^rW)Q?ky3c;VpPJpSCQH+Cs;os-b|@*exkve7r{WKKGTz^|<8V8UY4zQ0^63s_lI%o*3IRwbkSc_+gSjQYcva=fA| ztEcLYW6iqn61W!ppe@(Ecj*~jtbr=*#=PMlH@)bJ7OPq+lL`MXsYQl9U zi4mbM5GR3&xi8sTo0e*J}>B8pSa2aU0Saos|2g%5`*Ir&0{Cc-xm|yC1^kk21 zc=k}McBB1A&gQmV>Ia>Nh6^-jn{JqoHV#U>Npa#(J-yq$U1S#+C+sCMJVAahliMrA zVOMY9Ob|yER@WPx{!Nvb)>zkxb%R)wO!iIYXNv2y^p23+N1RP!Ex|>J5a+l)!2S2B L`yd=M;rP+N?Ta3axioEM*74r z;0y@^fy8k3?7@@qZWP-{Xdz4fJ94m%4=-iR9vuu4@~TVHnl!A&PfvMQkr<-uF_AWix&rkX5_FBU6m%Nv$Xc$8ZhINc!RK}Q&yJ%o2Ua{ZU)`q{lYRxRzuIsGp7{@&w zWth;Bz@&~TOfv}cn^fUG9_VO9xsH0CESRRr!WboG2D_pD;3OnYE0|$u;wB>6ZH{?s zj_G@5%5lt1Z^N_~?Pb?Yd7fKOB(v35ZFkX{nqP4i{4=H*pW0mvMuZ;iAs#VwaL^zv ze3nGldFKanVmu;o8N_*kbw*ox*kJK?m;_1!DLqk`ZnrG6~@I1 z(THRa-G+LIq8$`eh=(ZN`Tcd55JTWK Date: Thu, 22 Aug 2019 23:38:07 +0800 Subject: [PATCH 06/51] Done lvl 3. --- src/main/java/Duke.class | Bin 2286 -> 3189 bytes src/main/java/Duke.java | 33 +++++++++++++++++++++++++++++---- src/main/java/Task.class | Bin 0 -> 763 bytes src/main/java/Task.java | 21 +++++++++++++++++++++ 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/main/java/Task.class create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 36d49d96053a6e6a2d6398bfe826ba0a10e7a485..c2b9e1ac0dde5a8b59097a2fc20cb614f93d1483 100644 GIT binary patch literal 3189 zcmbtWSxg+~9shmoF|*^rm?aReQ|$4{VZzo)?KnV5F}~IT+szVFY?Ae`JBBgK4B44= zy)8|8xH;-x>6N&5n=~kob)*H^YL&N2eaSjHHTy9IJJjo6NLwmdgwmB!4eA|cT^({=>fIybROGB##?Ge0|O&WH3{=4r5>aSE10 zUlPGf3Y8ud3S(}~gSO6%K4zpiHDEYak@UfJs8H|(S~sDWi8TE3%p>+za0O9i@dK~GE;4qsRB4ISUakU(=#C_x=$^QPliB^}?w4e8*wbv%z3bi9a{ z7#f*&2_;Wts$%K*4sPmrOzQnC4(a$VzNh2+cu7Yu(kgx+_54sk7&>0Yk97PPKcSQY zG-)!=)SXd-r8+sI<8s9oLQQ+3Wh&pdxlTv4bwBE`F$#WA)Wgr zV|;IyvGwZlT@%n85vW=BzdBI(gF{xBVI3Jl}MDHpGF= z8e(Hlt+=$_5CJ9Vts)z{L3VfD+>A3{UNKi-d#Hu%YZ0>Zlo``IYh9FU-mM2mo~>luP}tbqn(*G zFt0O?Z%tbzImpbC zXYonDIQVF95ON~;vI>3Dbj|ioa#VRUmc$!I;Lp)bGW$Qdqu@8PvR`8()GOO|uDP>T zxJGJ~bkfZGZmFW+58MJHt~*THd}IWB*3W z)SB7yjsd(Yt7zNJW>hwJ(;6CY!3*b_pBr%xxSpn(zoJ%2U&@LRl&-?1)7`QCvjV6vsbzXJ%(urYtP%!XlKV6oCbbg$gZFN(-f>+M-hN2UfeV+ZKw@l(k6{ zlZ~cN#>Au(P3oJ`gy+^2HzfK8_~75rzrZ(Nnks&0*+@*BhjZ__=X}5C-0wZ}XUiWA zrQiPE{S_EvGsa5{dK`<<%1~%tso^-o2}MU^N;v6qDm)pF;qjWwM7W*~&7{Yf7`04= zsIwmD5*TJe=X_{pJuZX<7d_@YE+vRC>hgxmWkWDw7A==6!9&w)_4O_VUi4`2yEzeL zB5A9Q_Fy9N)mS&}K1XSHnfG~e_p}@6*Ny!mQ=)<%ZUC8#jj*ig#BxZu%_oq0cowGFZ#^3qBun-KUp!gT21G zRrJV(gv&lJ)8o@eR)LH@pOtVw9ei({4W3y&9eD+2KD}M|PnG%QwZcl#(6|)TJ59mo z_HnDgjh~*{ttMuhV;N)U>75JyvU}3b9W|s>FPG03^5YrfqV}$GJ4m^G=96H`eQIwQ zx`R&daM0}aUuxB3g`X>>C6nx7dEsibI@zBwkF_y$$VMxN7Byt()LyA(0!Lu@Hu%x& zD%IzIq4tV3Y7gw-Kcb-J(72O!5_LPoA5l}Lew%su4HbX5jAf5TlhLI8107}TCpgLI zU@~gwhj-D$?BG6#n(e)3O5CP#FzqDmGL31cOw$8ff$zfZB9-oLkS@t_u<+IDA+=dY zk~l3i&_$zkPclG?5t=!r(`nMoYOdy_!GdnTsC!@6rB+0DPy5ew$uETbQZw^4-8`g+ zZ}hB3RHYYpPh^fumrJdSr;VY+3)#Cc9ULM$A)eYHdq5g2N8(L{2G)PcCM zN@zg8!Jr@-)hcA53i0>lNi<8715}-Ei+(1HVf{Fz5kWO$RcNPt8s)>{lAY z=A_a!rq%TEYNdq4t`=)iF?k2rl=OuO(VmvZlT!GM)SVKKrkeZv<1;CuaC}n#5@mO# zb@-b9LpCF_^CFwogI~}SU6kK1bVT~DX^n~N7VE5vVnlwE;wN arrayList = new ArrayList(); + public static void main(String[] args) { String logo = " ____ _ \n" + " | _ \\ _ _| | _____ \n" @@ -16,11 +20,15 @@ public static void main(String[] args) { Scanner sc = new Scanner(System.in); // String array to store text entered by user. - String[] list = new String[100]; + //String[] list = new String[100]; // Counter to count total number of items in array. int n = 0; + + //Task task = new Task(); + while (sc.hasNext()) { String text = sc.nextLine(); + Task task = new Task(text); if (text.equals("bye")) { printBye(); break; @@ -28,14 +36,20 @@ public static void main(String[] args) { printLine(); for (int i = 1; i <= n; i++) { printIndent(); - System.out.println(i + ". " + list[i-1]); + System.out.println(i + "." + arrayList.get(i-1).getStatusIcon() + " " + list[i - 1]); } printLine(); + } else if (text.indexOf(" ") > -1 && + (text.substring(0, text.indexOf(" "))).equals("done")) { + //Task.checklist[n] = "done"; + int num = text.indexOf(" "); + printDone(Integer.parseInt(text.substring(num+1, num+2))); } else { - addToList(list, text, n); + addToList(text, n); printAdds(text); n++; } + arrayList.add(task); } } @@ -51,7 +65,7 @@ private static void printLine() { } // Adds text into the string array. - private static void addToList(String[] list, String str, int num) { + private static void addToList(String str, int num) { list[num] = str; } @@ -70,4 +84,15 @@ private static void printAdds(String str) { System.out.println("added: " + str); printLine(); } + + private static void printDone(int i) { + arrayList.get(i-1).markAsDone(); + printLine(); + printIndent(); + System.out.println("Nice! I've marked this task as done:"); + printIndent(); + System.out.println(" " + arrayList.get(i-1).getStatusIcon() + " " + list[i-1]); + printLine(); + } + } diff --git a/src/main/java/Task.class b/src/main/java/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..2ee911641b0e2ac32556bab4dfa1ed78e76b654e GIT binary patch literal 763 zcmZuuO>fgc5PcgvUfXp@a9RrGvjy73g$9WO2dWALs)ST1QYsE`a-3DVjblf)Q>nj$ z3rO6#@>P(K;0N$C_#qXuTMGz9mc~0XZ{EC_`Em61JAga5v{5l<$gp2&8>UQChNKos2~EGGG* zNU51^wNEk-j4;vgaX2o^T$yiD%Y0Y#8H|={VXsGVslx51lPnUOQgv{4!hE=-0?&*?L4LR(zuxjN3`UoZZREZ;9~`f6FQ>0D`3D>n(1XK+4R>^v`^lAxQL3VeT-~RpDb7-qqcVG+lgn@p3nkl9$z}!Sl#1hGA5{`<-AL0BFZt0Xs_JY=M@fTFak2L@Q literal 0 HcmV?d00001 diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 0000000000..b4a6e9a6a5 --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,21 @@ +public class Task { + protected String description; + protected boolean isDone; + protected static String[] checklist = new String[100]; + + public Task(String description) { + this.description = description; + this.isDone = false; + } + + // Returns tick or cross symbol. + public String getStatusIcon() { + //System.out.println("\u2713"); + return (isDone ? "\u2713" : "\u2718"); //return tick or X symbols + } + + public void markAsDone() { + isDone = true; + + } +} From dbb4abcc115fc76096b21364164454a6d3a75f6d Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Thu, 22 Aug 2019 23:43:58 +0800 Subject: [PATCH 07/51] Done lvl 4. --- src/main/java/Deadline.class | Bin 0 -> 915 bytes src/main/java/Deadline.java | 14 ++++ src/main/java/Duke.class | Bin 3189 -> 3850 bytes src/main/java/Duke.java | 121 +++++++++++++++++++++++++---------- src/main/java/Event.class | Bin 0 -> 911 bytes src/main/java/Event.java | 14 ++++ src/main/java/Task.class | Bin 763 -> 1627 bytes src/main/java/Task.java | 18 ++++++ src/main/java/Todo.class | Bin 0 -> 804 bytes src/main/java/Todo.java | 14 ++++ 10 files changed, 146 insertions(+), 35 deletions(-) create mode 100644 src/main/java/Deadline.class create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.class create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/Todo.class create mode 100644 src/main/java/Todo.java diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..e6107f321b1f33fc686b148e174e3c8f467bde8f GIT binary patch literal 915 zcmaJYx15Pg%D-DI258X1s*;T0Nai@H%E3_2rRD;46nx3_>P(oapl5;jWK73O-g*@^KFZ!rBXCY-}Sj zdL!+r8N?+A+j-pgQNa$s_?v=NbwxZRY-E&?h%OFf+>g}ADx*C-z(aoj`0yi9rPiA~ ztx%n?c`k;sWprQI56Ygh6}oS=OgTS#yrrH@y^k5X!hZOKhf`q291Ae@K zf7d&cecN2DZBEe=Vc1btHeECbyQ%uJv=O%dkHZd6v&+NGEl#F`tsL7PioE-LYw&%E z&tlNH1O@xwkoz))ukgM)4LP{R6dtEjGF$V+fMdj%a&U>I;47AS<*pct&wuirDZ*#u b8vAm%jy*m-_U@vNN7%wmz9+n!yl(vhp4{oa literal 0 HcmV?d00001 diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 0000000000..1f196e2637 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,14 @@ +public class Deadline extends Task { + + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + + @Override + public String toString() { + return "[D]" + super.toString() + description + " (by: " + by + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index c2b9e1ac0dde5a8b59097a2fc20cb614f93d1483..68c00cc2f213db8441df4497abd3b837b28335bd 100644 GIT binary patch literal 3850 zcmbtW`*##)8GgQGH!~TA+d{&n4NSN+36LzM6>JhIAtA7B5-6b{mo`jxhh)iSX4#od zSxxU3Xe*_*UP`NNZL3kyY6EU!u!!|uZ^ysD<2nB7ub!jD>hsO)CV{LT&vEzccX_|} zeZKd;--jPhT?McWf6&m1!zzwwXu(lA9IM0wcre1#ehqOX6j+jSLW7C{ISk4nsi6xe zRSd~FCFO=y*m8DMq$Tl`95O0gIeQwi7?H;hRdP5jhn$AH@EHZ4)lh>`NqJbsBMKgs z0*`5^#pCkii3o&Lr3Oz)fu~hGqvDK$vl=$wSryMIcwR%JTz*a}d``s+D$Ykx7D#*Ebv#2(>#2 z;x6n;+E!0?xZlbgF#A)agoe$eEl^#5G`KQl+5^#EFGIK%DLB8^Gvhah@T!8> z1m>m5;Kl5OWz(Wce=EpO0CxC<-rhKe_Jd<}0Ycw5Ii*e|enCM|m7rfpjp9bd;cq=92PzKL(?_%<%; z_zo^Is{J`j$9M6rj(yVpP>Q*w<9@johK}#y`#RpkI8PFEu8vE%tl$Sa^75b;2XwTf zL&vAEUB?6_$tROb#}B3YZP-bI=Oi3S=OpE)q$c}yT){;ZKhp8O?dbbKJ4v#uu@w`z@8-H2rjo0%aiVR(Z{*N`P-n64qc)l9@aR>m?+{=7l{ zc<34gBW%Wyt|rR@SLtn;}t)Z0sWc4l9@nG*EjtrQ)$Z7F(>s*(2Dx%Q)Am@tx0Nd2xfNZs{YFLDmi(rWVxK9K z&8E-+$rZEH*`m4v%L}*MbRe68GHALz)@j*r8Eh#htWY5)~T$S zy14@du5Xb@N|Igd^xhNyp+~X3hTU{3$(!p+IiX~rD&1^93*K+Z)%CGhNd<#?_cI~J zUOphZxtcaJuEj0w9I#|$*%N13SJ1oY(cRSUCXOJ3_!psiPBELx4MVW^`$1sy-+Mxq zI$ct3CK9F1nssFXPzE9FBM_Q$R-##gYO;pf+@OJ%izbrl>SHCu=aLlsQWnf_Sd%j~ zk+esgA*=8Q6r^IO8TXt_PQmXO%`V3o%BBVMm~4>kDbsZ=TJp;5&=fF&X1m9<6DiAG z7YMe@Rbv+A2EhZlv{izAcD##OG#8@XOr?60p4Fn@_X6wZ*jGw7fmQ#V54C)~wDQSR z4!?2p#d0@yW!S+zTQ=8zSLa;GGyX4f+|6ALXTdqVVFKbkE(G>)tni5;GRJTa*JLfb zOsYzT$w*n(B+4fd8b^5J6si2@P)NA~_3$_nF0HZmp#8Y4^cSX%auc)(v(HHTJ&%C|(SeV#jl)2-pgs&MFdRXBV+k7bis zK8Y3MSXmVw$1OZafotzj0d<#S>^j-U?xXn;+w5p2X+Y{F}3!t02#VmI@> zayy?PcVd!n`)l|l{)lG$nMi+Odj6Gfioaop2%}BR=R2Yb?P4=J#18Bd?feJs!ftUt z?hy&xD^lnZ9=gSO^oTdGSGG>^?Q39tD_{Y>yUMfgxFh-@l|=s~(iZfB~` zNG+fXfdP(#n1>`Z`Qj=_HWwr#)3p-W64c3zd^N(9AEvy`KsZ={G#29&aqh$Z0?u~g z$O^5V#@R51JBl@TGgg*ZBgA?L5u9dFbHw74u7GudrxI%mvwCH*X!5vo8ana`UqxBj ztbmnNc-_r9)9FMQ#X>yHJ09U3k1|~zW12k9Gri(g{}`nX?7Cmbiu^v5Ut K@kM|9;=ch=!IftK delta 1754 zcmZuxTX0iV6kR8|x%VdA(Ds%@LTO1`+R{>~=ak(OeiKtmHspeEP^w2H(> zeL(R6M@4)qkI1JmrWsI&KWF^V4`&=doMD{t*BNz&4;%&8xy{f~%*VdxvDeyXuf2DU zRa~E$`R3;3uK+AV)`z>%Vd4QF8qulDdM`Gh%jWGSA0EbL1KsMR#|INzl<8GwtAR&+ z@T1SfHXrJ-T|xUzEb#KX!-od!RM)%IcEE-7)$R>MpH#Po;GpBLI%$mc-F#m zXcH)L-ght^A8zU%j3g4V5ev^_%)(;4VBtl)WZ`8TWkNlX)P8kJjC=QJ%)&8@Tewff zy$4&GEgZ)y7GA|s3k%R>;x!fMbpa8!Z~`YSNW4LsXfhEq@TP^g)Y)pRv9JoQ7Vbxz zg;N-(OPD_kZ=+3CYWwxm7T#f!C$+jV6Ynb0_n6#&Rh8GZR@v{ValelbLygYMv4U&5iVHk7c=x;f!dsnj zw>IW5?KHmT$7<28z~2|rCNRCl6VmLW9EwlFn@33&=ef6?{hB=7+EP8Bm!Cm%9@<5C z0{TUi26Qc&!;Gu&=McDvpxQ6IjJtpwj4@qgZ+%B(7MsX4Gl!7tES6l2*s zQ=H8Un2!n8<|_O1doq8eLmQDClLE4urwuBe!D5v)bWfosW3^MbbwqGD6+&LKf|1jH6fx)XFES<_r=!`O1dNOjWhT|8Q+4S2wwOSg|dvRxi0Y;0{*? z7-c|3*3P=mnrgV(+uU}Y!>iiz-!7^riC|04yE8URMbbVLvG6vwGj2aSWCt5#C-c~a zwHTmBdhKo9n+m#@7DvBC{UrpiprLO9^Dm)vN}Wj|Jw)ovs+|#Bl=KsReN5sboW;lN V#f{w0f=1N@9&&8Nv5z@6{SW8OG0Fe{ diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 214f40b97f..14025cbe1a 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -2,15 +2,18 @@ import java.util.Scanner; public class Duke { - protected static String[] list = new String[100]; + //protected static String[] list = new String[100]; protected static ArrayList arrayList = new ArrayList(); + // Counter to count total number of items in array. + protected static int counter = 0; + protected static Task[] tasking = new Task[100]; public static void main(String[] args) { String logo = " ____ _ \n" - + " | _ \\ _ _| | _____ \n" - + " | | | | | | | |/ / _ \\\n" - + " | |_| | |_| | < __/\n" - + " |____/ \\__,_|_|\\_\\___|\n"; + + " | _ \\ _ _| | _____ \n" + + " | | | | | | | |/ / _ \\\n" + + " | |_| | |_| | < __/\n" + + " |____/ \\__,_|_|\\_\\___|\n"; // Prints out greeting of the chatbot. printLine(); @@ -18,57 +21,89 @@ public static void main(String[] args) { System.out.println("Hello! I'm\n" + logo + "\n" + " What can I do for you?"); printLine(); - Scanner sc = new Scanner(System.in); + Scanner scan = new Scanner(System.in); // String array to store text entered by user. //String[] list = new String[100]; - // Counter to count total number of items in array. - int n = 0; - //Task task = new Task(); - - while (sc.hasNext()) { - String text = sc.nextLine(); - Task task = new Task(text); + while (scan.hasNext()) { + String text = scan.nextLine().trim(); if (text.equals("bye")) { printBye(); break; + } else if (text.equals("list")) { - printLine(); - for (int i = 1; i <= n; i++) { + printList(); + + } else if (text.indexOf(" ") > -1) { + + String[] splittedText = text.split(" "); + + if (splittedText[0].equals("done")) { + int num = text.indexOf(" "); + printDone(Integer.parseInt(text.substring(num+1, num+2))); + tasking[num] = arrayList.get(num-1); // MIGHT BE WRONG NUM + + } else { + Task.printGI(); printIndent(); - System.out.println(i + "." + arrayList.get(i-1).getStatusIcon() + " " + list[i - 1]); + counter++; + + + if (splittedText[0].equals("todo")) { + + + int num = text.indexOf(" "); + Task task = new Todo(text.substring(num+1)); + + System.out.println(" " + task.toString()); + Task.printNumOfTasks(); + tasking[counter] = task; + arrayList.add(task); + + + } else if (splittedText[0].equals("deadline")) { + int num = text.indexOf("/"); + int num1 = text.indexOf(" "); + Task task = new Deadline(text.substring(num1, num-1), text.substring(num+4)); + System.out.println(" " + task.toString()); + Task.printNumOfTasks(); + tasking[counter] = task; + arrayList.add(task); + + + } else if (splittedText[0].equals("event")) { + int num = text.indexOf("/"); + int num1 = text.indexOf(" "); + Task task = new Event(text.substring(num1, num-1), text.substring(num+4)); + System.out.println(" " + task.toString()); + Task.printNumOfTasks(); + tasking[counter] = task; + arrayList.add(task); + } + + //counter++; + //arrayList.add(task); } - printLine(); - } else if (text.indexOf(" ") > -1 && - (text.substring(0, text.indexOf(" "))).equals("done")) { - //Task.checklist[n] = "done"; - int num = text.indexOf(" "); - printDone(Integer.parseInt(text.substring(num+1, num+2))); - } else { - addToList(text, n); - printAdds(text); - n++; + //tasking[counter] = task; + } - arrayList.add(task); } } + + + // Prints Indentation. - private static void printIndent() { + public static void printIndent() { System.out.print(" "); } // Prints the line. For better organisation. - private static void printLine() { + public static void printLine() { printIndent(); System.out.println("___________________________________________________________________"); } - // Adds text into the string array. - private static void addToList(String str, int num) { - list[num] = str; - } - // Ends the chatbot. private static void printBye() { printLine(); @@ -91,7 +126,23 @@ private static void printDone(int i) { printIndent(); System.out.println("Nice! I've marked this task as done:"); printIndent(); - System.out.println(" " + arrayList.get(i-1).getStatusIcon() + " " + list[i-1]); + System.out.println(tasking[i].toString()); + printLine(); + } + + private static void printList() { + printLine(); + printIndent(); + System.out.println("Here are the tasks in your list:"); + if (counter == 0) { + printIndent(); + System.out.println("List is empty!"); + } else { + for (int i = 1; i <= counter; i++) { + printIndent(); + System.out.println(i + "." + tasking[i].toString()); + } + } printLine(); } diff --git a/src/main/java/Event.class b/src/main/java/Event.class new file mode 100644 index 0000000000000000000000000000000000000000..1a2dcc636b08cb76f6364620f7cb1347bfeed23c GIT binary patch literal 911 zcmaJfgc5Pg%jcH+2A2`#03v?-)CaVmO5B8US~D?kAbiQrIi*f^`kjk_D!o1p#^ zeg;UONRdHtyKC zOIZFikcv=lpNok&3WYj5>X;}{XHA0jEKq@YPB^Hg%jr!0JjImqPVJ8CPe-X4=_8<{x7BawIe0rwjOZ zy>scC=3;MiiIxb%PGDryMuV`Q>MzS1Vdwui?C~bsyvRJ_WHmU-aqOVTr^~MfznAzf zdW|cPclaH-uT%IcpKH^Sg%y@?m`=%J&50h@h%sgF3QOKMEc2JUW+=Y=;agLL%gA-k ZU31$+6g_J@mZhq3aBAA5G*v>{IxZwY3#D}^qz*|9`6xKFK!%5nw8W}qtw&mi z$?xE$%<#@D6k0l&fgixn;D<2Wl}zfy9_*RBtGoA}d+ymQ{q@h$p8#%Q*Fp&u6R%)F zn`!~q3wXoAn^@Fl$;4ZDyMT8r+`vtfJnxn$@3uv;cS>MbHt>N?yldb?10OM*@kH!K zepmT2WGHPs<_CN!;NkvKQ$>EbUt`Go@v0031N)l6bX&r02Y##=CU-}MFZ-dd?lP1s z!^aB`8FF>$5n6G>55-omvnQe*z88?^?7mP<#Z@nExSGwm%EB-Lg;9*#-sIhWn$_V^ zd!^4YThS$qE^$}u4XTptsLb}aJ3Ma33C-x94XoPu7;6ld)}?ZMwdgdi9SDbep70#i@?%F4 z<{bm;Htu8EMgyNPOx%-F#VX?6O`%%Si;H=DTEK>lO>Eh?gqZ@i^}_>-J$*Gc&f@~f zsmY!=-rjpGT)Lm!YOk%kNhHu}({(5NM(Bx<0tO)uVPxY zw?$osE?19y)uLUjc&O;I%9X~*8OZLkZy2tQny}%KG0@Z+K4O@Esi7Yp$hPQDd0Kmo zyGllf2EL-9-;lE1>oVAlFceWe;BhR7(38QEeT?+(?(@(KL_D7+)`n>ecupkl9CpQs z@WGcWz0umB6n%&~4}zwzM9l!bomYnX8^w)b=Ktd`OP>h+;m9JVXPjn7%PqaOs-4E=1x?$5@IEcQ5z=a zj^j0D{VTpe{soMuRMUJ8>onyHq`?#spC-x|3E=f(fZKh5a+>`VXO2i65C$QhhM6Il z%Ot8pEHvZ!~eS4RdE3kLu zYMT1x;d?3=ZU=*4czo1TB&xOju%jw%pMrE@QGow(M@nOsrK4}!0@YXD;Y&bIW zooRBBBK{VJY><1z^sN_?^=A^-*uHg#@8hn?A-oHKJ~c7Fc4{Q=+&8dU_Sd9zT#Jv>$*(oK2y29e55_p_GBNxt-HAzTEx_Y4op8JiR5lU$huFIq$|>-p3H+D-sf=A~vbS-Hwn)>iaIQVhH(ndI)jY~9kK|Pu<9F`(z Date: Thu, 22 Aug 2019 23:51:22 +0800 Subject: [PATCH 08/51] Done lvl 5. --- src/main/java/Duke.class | Bin 3850 -> 4536 bytes src/main/java/Duke.java | 113 +++++++++++++++++------------- src/main/java/DukeException.class | Bin 0 -> 226 bytes src/main/java/DukeException.java | 6 ++ 4 files changed, 72 insertions(+), 47 deletions(-) create mode 100644 src/main/java/DukeException.class create mode 100644 src/main/java/DukeException.java diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 68c00cc2f213db8441df4497abd3b837b28335bd..503488def2d9470df2d4870912cc5ca9bd77ffc9 100644 GIT binary patch delta 2340 zcma)-YjjlA6~}*PW|Fxx+zey{tk}Q}DH4#$kWh-xNJ0>igrGoec*#uWLMD%ybmk@) zZ99V0B2q!FFCHpTG;OsHh)yDiT5WABw$<8)_OZIU+D~2W$NB*&tNYvp($&?q%KfnS zIs5GQ`R{XgPaml&ymR5yYrrD@7-k8Z4H97*Novv_B8455({z|lx`K3TNlzGqj3!x4 zdc&;div~H(^V-fa=+nI4V4D`+qsf55y_(+_=1Y88AAcnzq)^cG{xFN#9%M(D3Lems zod#bG@}Rc(T9`_9>63?|D4k0M4{L)x246RLB*@+{bJ=I`XpsG3V(bgz8ax&z&Mt$; z4W2M~QkU?Q!2!(=8XPh>9K}~P>hBqYXAO=R9F5}V8$pii0Goq67vy=@Q11o?gM8Ed zP(9*rro~PB_7px(i^*DAf_%&5+q|Hd)R@gWc_)|XZLyt>Y$`volot)YWAa_T7v%dU zCumcYcP9E1@jfTr9bes^$YkuC$w`Jxnt93OWr`-ljF`N_h{B&7uuV>J+T<=;6oKw^ z-Z9xgK{m=Vd6hFJukpGZrLq~(eS;qadDG-AeXx%8CbzS~q=}^_KjcTEwn!Gx-T420t}wfF%X^Y^#_G)#vb}cB+LF!nBpjz6Sa) z-G2u5_&?xRLpw{FeOFAWZua2boycsBw#%TwD5Ut^1LCjWI|4-d$z99QcD` zmRlQ|?#>Qf+u0~j5i*D#Y-Q$em7R}evKPS0+QYQ)ketap3SB9?3gJq4$=qSo30Wvw zg_e54fGDrx4q1z;KOs^>d`8_@Lvw2XHm`_Tq-_xR9-10nuL?Ae;2$9ni&~yq*=gc!(fPyFz8;HK|A(k4EB&cgbO;+Dof?mR0H)cc>S* zQ@zAGHOzW-iVf-v8`axvQtxrM`iRZyFC^68Nve-Y`Jh|M>+l8W^i8147mpo%AxdQ8bpNdA$5o!z)FOxf#7kTuKnI$dMUq~7o z{alenydCEwAT+yiA5ZF(wZYW%a8iR=?+ zkBYPXGC-~X=`m_}TmbTfINxxoHAe_|zQ-`HyK}Q7d6F3iDIaTBy*n{tsaxFnk;w%e zqfTH72PCV5lJp^Iz+ooyG*=1;XL3Ya33dPg delta 1628 zcmZvb`&U#|6vsbjW|({DdPJCftgI1)ST0Qh&GJ<~La=mDd}V-IAcQCmJ^&>j<13#i z=Iy1HnpsqorQk4WnAzK`mj6Jl*6O!bKlDp$m8R`8Oz=zhhrQ3)=Y045?!CV!p1prq z^xEx5-9B&ASiEcEu*~CB!ZRc;05W%^r)r4x`v-v)|%?L#|o27{&)}4%xH@@${fxusLGm+PoOV%gYw8 zI3`c2#j6%a-QnuG@0i7L_YZZ*TS$?+!_$&Bmm)tV1Dt0|#K z;j61%-=JA!)+$r;As=bZab8ZU>LYTsgHDSJnwU9Q5N4sKfEk)cnWE_;E*BS8tY4-1 z*wCHMV-jenuc|k3aVEh5{%rCu^?z>q@P+%6zs36{Uv;du!XEcVpv3>RiGSyg za7L={-FeOh-w%o$H{#^DdHwENIa#!Z%pg&L40WpPJWP|laF=zWJn;cJlSzo3DZ7w( zB|c?T7wViW6pxGbCxSk?`~^JF$NqZ5GSoo zHRlG?|Jw%JR84O1t{4M7XVlV;A-Y@*xLt34;z|7ED*5hj{WGE=#xhI9Dn zGFzsYLm4BeWF!$0V-xqYm(d*O0Zx!7t;iRdjFIV&BQB5a3KO`&Bz}=hze+EDmr4G~ zG?l`1)nBGJhys<*3^k2HRUoPeGgB>Mma2*}Th$R(4HTT?3B5YybA|#8{TNGOq-=yp&%l@L=BmELx_w-BXdjus7KTk?9FGhY}d!58l zrL=Q7fhh7Il9_ourV>LK3J-Z7iz?=pdYn3M(RoAq$DyJ$D0I?6|n63@PkPa z{A$5RWR~@$vW9dPua!jen4e5EMG_fB4DL-d>LL#!@8tiIHA=E3Nw$F?8yQ5io^F!TDSQb^ z;l5-K3!U?193wqh?0C03Ei*bH!E+a??at51(tETvR`d_Mh3y_;yH`rz$3XTogabn7 zplIum{JK?M%0bcQ5gE9f7`lTu>lRA=EsC^xvX|2MWV?r4Vq$3*lRCJ^+rg5Iw5o1G z9SrSjde6}OQjjfw4G4q9!o -1) { + } else if (text.indexOf(" ") > -1) { - String[] splittedText = text.split(" "); + String[] splittedText = text.split(" "); - if (splittedText[0].equals("done")) { - int num = text.indexOf(" "); - printDone(Integer.parseInt(text.substring(num+1, num+2))); - tasking[num] = arrayList.get(num-1); // MIGHT BE WRONG NUM + if (splittedText[0].equals("done")) { + int num = text.indexOf(" "); + printDone(Integer.parseInt(text.substring(num + 1, num + 2))); + tasking[num] = arrayList.get(num - 1); // MIGHT BE WRONG NUM - } else { - Task.printGI(); - printIndent(); - counter++; + } else { + Task.printGI(); + printIndent(); + counter++; - if (splittedText[0].equals("todo")) { + if (splittedText[0].equals("todo")) { - int num = text.indexOf(" "); - Task task = new Todo(text.substring(num+1)); - - System.out.println(" " + task.toString()); - Task.printNumOfTasks(); - tasking[counter] = task; - arrayList.add(task); - - - } else if (splittedText[0].equals("deadline")) { - int num = text.indexOf("/"); - int num1 = text.indexOf(" "); - Task task = new Deadline(text.substring(num1, num-1), text.substring(num+4)); - System.out.println(" " + task.toString()); - Task.printNumOfTasks(); - tasking[counter] = task; - arrayList.add(task); - - - } else if (splittedText[0].equals("event")) { - int num = text.indexOf("/"); - int num1 = text.indexOf(" "); - Task task = new Event(text.substring(num1, num-1), text.substring(num+4)); - System.out.println(" " + task.toString()); - Task.printNumOfTasks(); - tasking[counter] = task; - arrayList.add(task); + int num = text.indexOf(" "); + Task task = new Todo(text.substring(num + 1)); + + System.out.println(" " + task.toString()); + Task.printNumOfTasks(); + tasking[counter] = task; + arrayList.add(task); + + + } else if (splittedText[0].equals("deadline")) { + int num = text.indexOf("/"); + int num1 = text.indexOf(" "); + Task task = new Deadline(text.substring(num1, num - 1), text.substring(num + 4)); + System.out.println(" " + task.toString()); + Task.printNumOfTasks(); + tasking[counter] = task; + arrayList.add(task); + + + } else if (splittedText[0].equals("event")) { + int num = text.indexOf("/"); + int num1 = text.indexOf(" "); + Task task = new Event(text.substring(num1, num - 1), text.substring(num + 4)); + System.out.println(" " + task.toString()); + Task.printNumOfTasks(); + tasking[counter] = task; + arrayList.add(task); + } + + //counter++; + //arrayList.add(task); + } + //tasking[counter] = task; + + } else { + printLine(); + printIndent(); + if (text.equals("todo")) { + throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. It must be in proper format (i.e. todo clean table)."); + } else if (text.equals("deadline")) { + throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. It must be in proper format (i.e. deadline return book /by 23 Aug)."); + } else if (text.equals("event")) { + throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); + } else { + throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); } - //counter++; - //arrayList.add(task); } - //tasking[counter] = task; + } catch (DukeException e) { + System.out.println(e); + printLine(); } } } diff --git a/src/main/java/DukeException.class b/src/main/java/DukeException.class new file mode 100644 index 0000000000000000000000000000000000000000..228e75622a7f7ae143a2e2fd3f4e1ccae689b80d GIT binary patch literal 226 zcmX^0Z`VEs1_pBmUM>b^1}=66ZgvJ9Mg}&U%)HDJJ4Oak4WF#UvPAuy#JqI<;F6-u zymV{LFh&Lz=lqmZMh1SL%)C^;(%hufqL9R-9H0nSaDHh~a;jS literal 0 HcmV?d00001 diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java new file mode 100644 index 0000000000..eeaf783477 --- /dev/null +++ b/src/main/java/DukeException.java @@ -0,0 +1,6 @@ +public class DukeException extends Exception { + + public DukeException(String message) { + super(message); + } +} \ No newline at end of file From def74774c1c317bb715eeabce61cbcbb87ec5173 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Thu, 22 Aug 2019 23:59:05 +0800 Subject: [PATCH 09/51] Done lvl 6. --- src/main/java/Duke.class | Bin 4536 -> 4782 bytes src/main/java/Duke.java | 16 ++++++++++++++-- src/main/java/Task.class | Bin 1627 -> 1754 bytes src/main/java/Task.java | 6 ++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 503488def2d9470df2d4870912cc5ca9bd77ffc9..fef5f0b03b9b4a391bcaef44b262c7dd022516a9 100644 GIT binary patch delta 2381 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 P7TYbJTe`=|WTH2?k2_6~r4JhO2C*$5ouROqvC z!b09g0Vh>B6~Sqov2fPLIh>EM((iEYvd!Kr4m4b|FkoU(&0aS#Wa7r!++P{3)|QsN zsq(AJO4*;)()kXgB-(ILq8)J!`tSFC5Z{@&DRE1o!$_GJk+_Xf|D%>#y(4iKof7vj zrXe;|sd#m-R;-Sdy~RqY-V(;Rh5Hf{n3PE3h=nPYOlwGvSG;m5?~eAYl-*k3q2zjt zOLf;P)?egF_Pn@KEW9i(FBGOd8eNb$goFk$L;OGNXF_lF8O-`$LvO+l6!l|&SkGur z{Hp#%Jk@aApA<=dMC5V~PYCD`YD4}BwIttwmaoM-b)b{+u>V20T9>~g5+*$dm0!Y5 zb+IeV3}}YSXd)ze&KOHakqX*eBc4!gHbRUJ42nf?Y!{s{6zyvxVRr9U){OM3>UU@d zJdjSgR+6`ok>(rXL=?LcwzHdP+NM4}G1IVbshc|K1}l+)Kp%*2A-n~19Z^x*Ky)3J z)3OQs^WJbfY6g>DDrdM{mee^OrjO_7*<({))E9}Bz9F`O*8Ta$Jp{*l*$^VhBfd5V V9%3GINZX3PKp delta 635 zcmYL`J5y6p6otS0$bHQ*30G7C2ni%8phQIl-+&KLK~#L8RGGmcIu3Cl^? zU@+i7#6gBkD2E*4aKMp>VUC7^9E(MFA`mTy&pDs5R||i1)hZ6^Zt||7?6)%x6hd0Htyt}HK==jtmDmzNZKXw%d7x^sh@`ltQUn={nA z`kB*j-P5m~4fno9Nq=%m`h{B@Y>{684z6)5U#>ANIq4(WmpyZ|OYG2J-MrPQf4Mnd zJS0dqm4DtTEKe#()14@6HSUuUC{MxA1nj|1DBgg(f%8TX3nPpKM=Yddcqpv@{NV(L z%qHF@{#$}Ld{5LA#^My(a9YKlCkE3pC#1L0L4Qv56-@sItxFc{mWRsA6f>dt&wk`} zRGapT1eCTN7@j#{cJTw5cVwHh8{4|lv`+{&`?w=H62UFzxh;l{OP!XR5y3{2c Date: Wed, 28 Aug 2019 17:43:58 +0800 Subject: [PATCH 10/51] Clean up my code a bit. Added some edge cases and fixed some issues. --- src/main/java/Duke.class | Bin 4782 -> 5090 bytes src/main/java/Duke.java | 51 +++++++++++++++++++++------------------ 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index fef5f0b03b9b4a391bcaef44b262c7dd022516a9..6f33ef358da0839cb29056c86d6b84a2535fb5a2 100644 GIT binary patch literal 5090 zcmbtY33wFM9sj+_W@oYvAPeCVaDoWoNTQ%12?im6EQWvvK_D6?yF;>McV^k0jYO$d zt5TI#JX!?tL`^+fCD?R?^etvfI@#ek%d;j}- zj~CuQ^b~-(_*V$^*sP&FgmaLPL$U-moG^DYA-Kq@=#Y?$L(s5Q4xMtiB!nhhs$rY_ zenR41rr~n={iKE~B=AZ(d`iPr@_Tg%*I;`Iw?7?11lP)g*U9Dea=AmrXHh$&&k>6CC)Alx2o7J>Fx<(I(EvP+rki1;s|cnaEFFF<@Q|~ z?pAS62&ZA6hI=*Kr{ew)&XB7v4PVgkfQAR9nh$AsSbo2#;Y%7G2}6;@CSt#aZVd-C zJQhX~aw-l=7MoS{sCZnU#7w8n&iZ)96)3IWY<8GcSvQ`jT37(r@JwU8)i&L1+7g&B z*qQnDtIbS%O)bx=Q73D=R$4$rxN-@P+pU~!@XrVY=f~~1TPsjhK5dOapw5Yr?y&l} zZ8c<*EmnH9*^(e6kTm1Az^L*KKFfq@w^lW}X_Bjvh(j7(GupnwOnK*398z&u;J6eI zxDh*M+0>}STS?Lanm1q6$*B)s7>i}7bot=q{WFUli5e)6NRB@3#a6;{dx`j#)8
z=>4lQs^rnamUnuaHyXx#$)d{Nk_4)Zrsn3E&D?Hk=B#;JNJlf)=(q@LR6L>MNjxQR z{36G3Gj7^Ut+3oSCzcr&#M2s{(eV{LtKvBwUqy?+@V+2vjGDG>rFDD_&r1cruHzf{ zrj8eIM8~&qgg$QRv~+wMFY4GR^$#Q%X*xE^xiECRgzxD1F22W|7)`C?`}l#1AL{s# z+*pAI9Y4m)I--c_XvAtAKfx5VLL`98*MXWI2yJWWk%dKI_WAyN@O^jyuA#ORwXPmV;PJeD{YuYhna}S z@;GHuNtz%S^I|~9Po)tpDcjHF?B{qz$1mjUT%1QKT_@&9Vfm4o{ZhxTa74qaI$pzz zjL4W}#uzsY6j7z)*Z7Tq($dL|#rX}%@3#WQR)-hPipiKRUg9t8W0f^xRwkN`d)AOD znTC|WkX~|JqlHQ(Q*LLa5pj)VmRb`+E2Pp+imGmM(n-@b%Hx$*Wgd@~uxS^j7wMsStQnAcrO$cw|PXblTtVF^oGgfpOwwd&*LP&Tea;@|ZbHsC;Oap1Q1p=d! zX1i7A*iqA68+Y3{%ebcPvS&;gtY;kCMhZ4KS|Ij9uM;I~X1nZg`L@eb5j&MFh%GQC z&t<@d>_lptnQ5@LQfD^N^(+`R7k--?Sw3wrNdjz~G*r;qk~I?p+n(=&8c9iwvvqD= zx#>e1BYS#rCY6Yj^VGqNFsQ>yGT9dP74IG}syq@IR6xJ2co7j{>1~x)2rXr%GZvSO zn@s!?#tqe_2t}=ybT_+lKUMQe6x#H8R?_Jp#xT#=yjiT=B%20R52o{5z8}se!2zWF z_~UIxbDcsg78!;hXEPQfIO^Cgvx>w{=x>F(HZ$Ew3tM*7@~k~5CH#iC$2%U!wOmc$SMXar{UF4CP6RIC81#Svlwcj!bIzlIDTHdIc}G~O z??F)y0^KN{afndlpb~Nz+PZF(97Jfv%p8u}t#t6C=P;z9B0MyQVY^Y%gX6oD=8Ev} z!ZO^YET{;N$YG>%uXxj&l~xDF28w2dM|o#f`@3_BD@uz48%v9eH|8+92V>?0OM`b{ zT4}HwV{;g{4--p+JvgBo<4cPPDh&o=IZSv46C1lQwd@c_y_qSHL0iwi^#WBNJ|JBJwuF|(SY z7LN_)P;m&Ad7F{J_-JhROS z9>!^86Qp@4+GsLVX(BQ_y;_wF)j=7m9z*U)hFd&_b3BGtfnifcc&^8=@mPju49alc zM`oChpNg<=G2cJc(mxepUvD2&XsyI%QZ2_M zrqE>Oz!bEgoX_)V=-|oin1NlGiM^;mH>&UiF^^z2FVCm(NpLz|#~i$YGei;Qi6E*) z32KCn`C=p%2m^~mIqJkbED;eb74qs27)Gh1iY;aRXM02eC>V!nxu} z-qW8)qj-szqF1q2yoC$Izp+jM)+-~hK{)|U$_!knRN^9KE}E6I(5lp-O<9V#!dJ9% z9@>>ABozy`;vl7L#TMmCxXKP}qlLCAJ8_A!3zsT;xV{~iVFN8S2gBdPNh+FDXzyYI zCqv(dsp3K*{(})%1@ZPFbR4!@0(MJi4lLc8+0=GP3IOmE0v34Ih^ki%Jh zB_`x;UCokm4N>^a%cIQ9qv(Et2`^-E>BAaI_W{>&ydKA42df$1YkAD-JZ8AJI)xYc zm8lPZ6pD$zllV6>2yVhq+>GJ4g>+0h*sqDTq$6wMs9rkL523D5F^RyL|IE&3&zc2whokek}SKp6T@&9dE8AN z_b^QN!N9#NB=_M|+)ti--sO4D%kwPtE%;$%!w8V<13dg7P4Eyi;$f2ElQ&PMi>8vI zH}=W8l%la*?ZNQ8bIvB93#SBX#u2&o6daPqONF96lUqLx`w8QLVPk6x@LeZpmA;jBEMh&gKLeI^| z!05w>tUHM12QapX<@xy7lbCn_lH$Li(U;Y5(l@ekA delta 2494 zcma)-TX>E&%@qp@3sH` zz1BKwt^I!K$%%<`pY)vp=J1a&*Auf?A7(zc=wU;MHa0qO4aTH`t>ZDNFnEgrFW)a0=+S8~wekjddN zGdO5+#NzQVGdW=K9g8O{j%uf7J!$cj7M`|v#^RWRp{a^VT0CcQ+~Ro$A16#+&=gUNpzyc1 zZSS;c)v_wF`3XO@d6l1uCfX5~qd(`I$uDeP(~8vz*4QlO%Qp2auz8&~5+d%Sd)oW6@$c|01x?9)9wsf|2#JdBhmD9)X<(3lp zZ2q9bG|zo2SnCcqOM`#3`IE%>T60zK&pMWWagUmNhrh$SiqiU6dwa*&k_Dxkdm`2e zBz8>Bbd{2WuaBFhP)Q9edoKxx}cZ|I#F<%lM`MF+fB!w2r z%HRfBi{m1Dfs;8bI{C*kE|pcW%u43KlwMSq2#Q7-gWjf}5X-npWI5_PE4!9(HaW(k zG`=+cZUR&LWS11C`>~y;D%?-(g2c#jCpX2ggM`vJN%ik?=L;$FjAzs_Ps*?I7y5mb zPJwr3W=1gqiW`$^wTB(!VXwJ_O>@N{ zJdwqhq!}ydL4~)UVq8;F6{Z>QIWWQB(!&IgbE3x?xy0Geq-GDBqO_OERYCE#FqopO zk13wV9(_@_po5KakJe3XN^&OQu}$;XmX|x_;=6d~#b9=@pDTqmm~m-@@SEbV@K;os zn%}%Ezv=OdPV=wv=%;)1ji05T(VVy(f92=q&;HwTClik${mg83uIgphOXW_+sm#{w z%vQ#b%+?&e)jvlAuGV65;GMb%*|38x$)?!IB8 z5~D>whDxrWni6UlOD*Fimv!Y$VkMJVD<|SiWhc|vLpg_~H$G1V-Aw0{G{;v3eU7Vm zk6HYU*?cIk!N*+9zl3ps8WrF=RY0wp#9URzJXJ|VRdc;sNWEH`V1Zi6LbZb%)ZHvn zd!%RVXR$gY4eB^cr9v9ji!4)bbCddjzfRy>D_uZVgZKghg1<-b_ezu4 z!%*%cm-~h1E3DEyZddNeL`}AsJ_Fn*zy}2QAP)P<=YRlLvnFf6deQ2}RVk%cbg4h2 zxNgv%FM0OpCMAues8TBH{|y``5h;U*8O9@W$)j?~W6}{1O6DDstU4^&bVM$d$HcRC ztCN?wJduN6OnE{~Iw~GMNghuLPF}UFu}4L(jUDWpPOTUtz2gwM+2GHWjU;9MYTZ(v zM!J_aT^5-u`oRj(CuYh7~i;yD0N;+%#y;oWbT~o&mGZEq`8;69!B}3OAe2oUO{mWMT5UM wlOjQJ){{|NW#!Af!OSg4|(IW-uT`B0>6d#i2wiq diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 07e83b6664..2c6f2491d6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -10,20 +10,18 @@ public class Duke { public static void main(String[] args) { String logo = " ____ _ \n" - + " | _ \\ _ _| | _____ \n" - + " | | | | | | | |/ / _ \\\n" - + " | |_| | |_| | < __/\n" - + " |____/ \\__,_|_|\\_\\___|\n"; + + " | _ \\ _ _| | _____ \n" + + " | | | | | | | |/ / _ \\\n" + + " | |_| | |_| | < __/\n" + + " |____/ \\__,_|_|\\_\\___|\n"; // Prints out greeting of the chatbot. printLine(); printIndent(); - System.out.println("Hello! I'm\n" + logo + "\n" + " What can I do for you?"); + System.out.println("Hello! My name is \n" + logo + "\n" + " What can I do for you?"); printLine(); Scanner scan = new Scanner(System.in); - // String array to store text entered by user. - //String[] list = new String[100]; while (scan.hasNext()) { try { @@ -41,15 +39,21 @@ public static void main(String[] args) { if (splittedText[0].equals("done")) { int num = text.indexOf(" "); - printDone(Integer.parseInt(text.substring(num + 1, num + 2))); - tasking[num] = arrayList.get(num - 1); + int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); + if (taskNumber > 0 && taskNumber <= arrayList.size()) { + printDone(taskNumber); + tasking[num] = arrayList.get((taskNumber - 1)); + } else { + throw new DukeException("☹ OOPS!!! There is no such task number in your list of tasks!! " + + "Please enter a valid number!"); + } } else if (splittedText[0].equals("delete")) { int num = text.indexOf(" "); Task.printRemove(); printDelete(Integer.parseInt(text.substring(num + 1, num + 2))); Task.printNumOfTasks(); - // delete tasking[Integer.parseInt(text.substring(num + 1, num + 2))] - arrayList.remove(Integer.parseInt(text.substring(num + 1, num + 2))); + + arrayList.remove((Integer.parseInt(text.substring(num + 1, num + 2))) - 1); } else { Task.printGI(); printIndent(); @@ -68,7 +72,8 @@ public static void main(String[] args) { arrayList.add(task); - } else if (splittedText[0].equals("deadline")) { + } else if (splittedText[0].equals("deadline") && + text.contains("/") && text.contains("by")) { // what if there is deadline int num = text.indexOf("/"); int num1 = text.indexOf(" "); Task task = new Deadline(text.substring(num1, num - 1), text.substring(num + 4)); @@ -78,30 +83,30 @@ public static void main(String[] args) { arrayList.add(task); - } else if (splittedText[0].equals("event")) { + } else if (splittedText[0].equals("event") && + text.contains("/") && text.contains("at")) { // what if there is no date int num = text.indexOf("/"); int num1 = text.indexOf(" "); - Task task = new Event(text.substring(num1, num - 1), text.substring(num + 4)); + Task task = new Event(text.substring(num1, num - 1), + text.substring(num + 4)); System.out.println(" " + task.toString()); Task.printNumOfTasks(); tasking[counter] = task; arrayList.add(task); } - - //counter++; - //arrayList.add(task); } - //tasking[counter] = task; - } else { printLine(); printIndent(); if (text.equals("todo")) { - throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. It must be in proper format (i.e. todo clean table)."); + throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. " + + "It must be in proper format (i.e. todo clean table)."); } else if (text.equals("deadline")) { - throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. It must be in proper format (i.e. deadline return book /by 23 Aug)."); + throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. " + + "It must be in proper format (i.e. deadline return book /by 23 Aug)."); } else if (text.equals("event")) { - throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); + throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. " + + "It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); } else { throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); } @@ -171,7 +176,7 @@ private static void printList() { } else { for (int i = 1; i <= counter; i++) { printIndent(); - System.out.println(i + "." + tasking[i].toString()); + System.out.println(i + "." + arrayList.get(i-1).toString()); } } printLine(); From e89761d5d3a0c3cb6c417b4fcffae4099ff70153 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Thu, 29 Aug 2019 03:35:24 +0800 Subject: [PATCH 11/51] Added a storage class to add tasks into a file. Done a save feature. Cleaned up my code more. --- src/main/java/Duke.class | Bin 5090 -> 6746 bytes src/main/java/Duke.java | 193 ++++++++++++++++++++++++++---------- src/main/java/Storage.class | Bin 0 -> 2079 bytes src/main/java/Storage.java | 89 +++++++++++++++++ src/main/java/Task.class | Bin 1754 -> 1688 bytes src/main/java/Task.java | 31 ++++-- src/main/java/todo.txt | 0 7 files changed, 252 insertions(+), 61 deletions(-) create mode 100644 src/main/java/Storage.class create mode 100644 src/main/java/Storage.java create mode 100644 src/main/java/todo.txt diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 6f33ef358da0839cb29056c86d6b84a2535fb5a2..f62a68bdb3e60372ff36e94c630fa1cc1b0c4b4b 100644 GIT binary patch literal 6746 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 SJ(cGlCfB?C_t*UQ_kRP>5~KeB literal 5090 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 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 2c6f2491d6..2be8918cfd 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,28 +1,55 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.File; +import java.io.FileNotFoundException; import java.util.ArrayList; +import java.util.BitSet; import java.util.Scanner; public class Duke { - //protected static String[] list = new String[100]; - protected static ArrayList arrayList = new ArrayList(); - // Counter to count total number of items in array. - protected static int counter = 0; - protected static Task[] tasking = new Task[100]; + private static ArrayList arrayList = new ArrayList(); + private static String file = "todo.txt"; - public static void main(String[] args) { + public static void main(String[] args) throws IOException{ String logo = " ____ _ \n" + " | _ \\ _ _| | _____ \n" + " | | | | | | | |/ / _ \\\n" + " | |_| | |_| | < __/\n" + " |____/ \\__,_|_|\\_\\___|\n"; - // Prints out greeting of the chatbot. + // Prints out greeting of the chat bot. printLine(); printIndent(); - System.out.println("Hello! My name is \n" + logo + "\n" + " What can I do for you?"); + System.out.println("Hello! My name is \n" + logo + "\n" + " What can I do for you? \n"); + System.out.println("I can only do these functions for now: \n \n" + " Todo \n" + " Event \n" + " Deadline \n" + " Delete \n" + " Done \n" + " List \n"); + System.out.println("Ill be adding in more features soon! Please be patient! :)"); printLine(); Scanner scan = new Scanner(System.in); + File f = new File(file); + Scanner sc = new Scanner(f); + while (sc.hasNext()) { + String task = sc.nextLine(); + String taskType = task.substring(1, 2); + switch (taskType) { + case "T": + Task toDo = new Todo(task.substring(7)); + arrayList.add(toDo); + break; + case "D": + int byIndex = task.indexOf("("); + Task deadline = new Deadline(task.substring(7, byIndex - 1), task.substring(byIndex + 5)); + arrayList.add(deadline); + break; + case "E": + int atIndex = task.indexOf("("); + Task event = new Event(task.substring(7, atIndex - 1), task.substring(atIndex + 5)); + arrayList.add(event); + break; + } + } + while (scan.hasNext()) { try { String text = scan.nextLine().trim(); @@ -32,7 +59,8 @@ public static void main(String[] args) { } else if (text.equals("list")) { printList(); - + } else if (text.equals("delete all")) { + deleteAll(); } else if (text.indexOf(" ") > -1) { String[] splittedText = text.split(" "); @@ -42,77 +70,84 @@ public static void main(String[] args) { int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); if (taskNumber > 0 && taskNumber <= arrayList.size()) { printDone(taskNumber); - tasking[num] = arrayList.get((taskNumber - 1)); + //tasking[num] = arrayList.get((taskNumber - 1)); } else { throw new DukeException("☹ OOPS!!! There is no such task number in your list of tasks!! " + "Please enter a valid number!"); } } else if (splittedText[0].equals("delete")) { int num = text.indexOf(" "); + int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); Task.printRemove(); - printDelete(Integer.parseInt(text.substring(num + 1, num + 2))); + printDelete(taskNumber); + arrayList.remove(taskNumber - 1); + Storage.writeToFile(file, ""); + for (Task task : arrayList) { + Storage.addToFile(file, task.toString()); + } Task.printNumOfTasks(); - - arrayList.remove((Integer.parseInt(text.substring(num + 1, num + 2))) - 1); } else { - Task.printGI(); - printIndent(); - counter++; - - if (splittedText[0].equals("todo")) { - - + Task.printGI(); + printIndent(); int num = text.indexOf(" "); Task task = new Todo(text.substring(num + 1)); - System.out.println(" " + task.toString()); - Task.printNumOfTasks(); - tasking[counter] = task; arrayList.add(task); + Storage.addToFile(file, task.toString()); + Task.printNumOfTasks(); } else if (splittedText[0].equals("deadline") && - text.contains("/") && text.contains("by")) { // what if there is deadline + text.contains("/") && text.contains("by")) { // what if there is no deadline + Task.printGI(); + printIndent(); int num = text.indexOf("/"); int num1 = text.indexOf(" "); Task task = new Deadline(text.substring(num1, num - 1), text.substring(num + 4)); System.out.println(" " + task.toString()); - Task.printNumOfTasks(); - tasking[counter] = task; arrayList.add(task); + Storage.addToFile(file, task.toString()); + Task.printNumOfTasks(); } else if (splittedText[0].equals("event") && text.contains("/") && text.contains("at")) { // what if there is no date + Task.printGI(); + printIndent(); int num = text.indexOf("/"); int num1 = text.indexOf(" "); Task task = new Event(text.substring(num1, num - 1), text.substring(num + 4)); System.out.println(" " + task.toString()); - Task.printNumOfTasks(); - tasking[counter] = task; arrayList.add(task); + Storage.addToFile(file, task.toString()); + Task.printNumOfTasks(); + } else { + printLine(); + printIndent(); + throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct format! :<"); } } } else { printLine(); printIndent(); - if (text.equals("todo")) { + switch (text) { + case "todo": throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. " + - "It must be in proper format (i.e. todo clean table)."); - } else if (text.equals("deadline")) { + "It must be in proper format (i.e. todo clean table)."); + case "deadline": throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. " + - "It must be in proper format (i.e. deadline return book /by 23 Aug)."); - } else if (text.equals("event")) { + "It must be in proper format (i.e. deadline return book /by 23 Aug)."); + case "event": throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. " + "It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); - } else { + default: throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); } } - } catch (DukeException e) { + } catch (DukeException | IOException e) { System.out.println(e); printLine(); @@ -122,19 +157,29 @@ public static void main(String[] args) { - - // Prints Indentation. + /** + * Prints indentation. + * Helps to order the output, making it much neater. + */ public static void printIndent() { System.out.print(" "); } // Prints the line. For better organisation. + + /** + * Prints line. + * Helps to order the output and makes it + * much neater. + */ public static void printLine() { printIndent(); System.out.println("___________________________________________________________________"); } - // Ends the chatbot. + /** + * Ends the chat bot. + */ private static void printBye() { printLine(); printIndent(); @@ -142,44 +187,82 @@ private static void printBye() { printLine(); } - // Shows users what has been added into the list/string array. - private static void printAdds(String str) { - printLine(); - printIndent(); - System.out.println("added: " + str); - printLine(); - } - + /** + * Marks a task as done once the user has finished it. + * + * @param i To indicate which task number is done. + */ private static void printDone(int i) { arrayList.get(i-1).markAsDone(); printLine(); printIndent(); System.out.println("Nice! I've marked this task as done:"); printIndent(); - System.out.println(tasking[i].toString()); + System.out.println(arrayList.get(i-1).toString()); printLine(); } + /** + * To remove a task if it is not needed anymore. + * + * @param i Indicates the task number that is done. + */ private static void printDelete(int i) { printIndent(); - System.out.println(tasking[i].toString()); + System.out.println(arrayList.get(i-1).toString()); printLine(); } - private static void printList() { + /** + * Prints the list of tasks that has been added by the user. + * + * @throws FileNotFoundException if there is no such file that contains the tasks. + */ + private static void printList() throws FileNotFoundException { printLine(); printIndent(); - System.out.println("Here are the tasks in your list:"); - if (counter == 0) { - printIndent(); - System.out.println("List is empty!"); + if (arrayList.isEmpty()) { + System.out.println("There is no tasks in your list currently!!!"); } else { - for (int i = 1; i <= counter; i++) { + System.out.println("Here are the tasks in your list:"); + File temp = new File(file); + Scanner s = new Scanner(temp); + int numbering = 1; + while (s.hasNext()) { printIndent(); - System.out.println(i + "." + arrayList.get(i-1).toString()); + System.out.println(numbering + ". " + s.nextLine()); + numbering++; } } printLine(); } + /** + * Deletes everything off the task list. + * + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ + private static void deleteAll() throws IOException{ + Storage.writeToFile(file, ""); + arrayList.clear(); + printLine(); + printIndent(); + System.out.println("Everything in your list has been removed! Add more tasks to get started again!!!"); + printLine(); + } + + /** + * Gets the number of task inside the file. + * + * @return Number of tasks. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ + public static int getNumOfTasks() throws IOException { + return Storage.countLines(file); + } + + + } diff --git a/src/main/java/Storage.class b/src/main/java/Storage.class new file mode 100644 index 0000000000000000000000000000000000000000..f374e94b57a07b408a39da82b49c6c98cd20a73e GIT binary patch literal 2079 zcmaJ?-E$LF96dM5c9U&NLm-r|AZoE`6Iv80g+Of^C{&UbNd!y%V4EyuY1qwdHekmY zpZEuOa0Z-lWPGU)y!c@2P)FbW1AOp5aD4Ec=@8G|ZAut|lga%&=iJ}dz5B=Wr@sL> z30*@185Ku01dxefH-=S=Xi#uW!@GDdPSmKJo|Mg)Y)+{-ts<+T2d6YdaYn-c&dO#? z#khtzK2R~CVp2e>nss;XW=XFv3ncQl^}G5=!!@fTla8aWPgK&X|_zjtlHfbwXwbuL^{6c7;;CdDAjx8+R5Br=%}dxpKH8XIouzBYLG$ zvZqZ6AJ~Fdb!%y)=sKpgl=Tm7Uy&^B{Fh~;=9;!uS1~2fea|snqot#j?S|z_Yw8R_ z2hqV9fu5qPmzN8A&9hZSPQ^JD=c!$^8&28qO^Oy>+tHVdVHwFN_G4OLSBI!Zu?Kwu zac|4CMU3Vh)$1_z2UI zby?s*OK+-i^QPe#l^Ltna2Xmyza!As+LfoZ?MU*KD2gbxjP>GIy5-pSWMZQD7!0Di z@0>PBb)t(LsxGp!^87pCkYcT(#@0*VdJgQF;*%|4J}J6(Um$Q(m#L%8QL!%`xhAgX=Bk%XuMF#k{P9 z&jk8kW!nS0C6Uvs)grG%R>cj0Bd_?^$u@yQ|Bu6) zd_fa@Gg%Pw4zl0NSpfSG;&?v}aD0#}#}MQQhz+en3~eAVzmDL~2>s-7lWcbo0lu*z zbfcF)U*`}acms#GR3^A9Q3p4m%nyau(N)N#e}VcGVPFlB%o?;8igBVr8#G$cM=K5> zNqga0_7-*D-qt-yRjIqn(_Ke5WnUvVNa7HUP4nH)yd>9;Bfgp9YkoDlDEH$AqVpT* znWxh`*7-v34B^*sAx$%5nzN0a5dL)zcIRhv^pD~Ov&8Hd6EPX#q&Q+w?r!j$H zOyUHlILaZ9bGU*FSimLR;Eggd3y05ZgX6EbbDwYE19HD%|B$-xQ2ioyJV#o^fQppZ z%f1m#o{{c!$^VR?W literal 0 HcmV?d00001 diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java new file mode 100644 index 0000000000..0eb1901866 --- /dev/null +++ b/src/main/java/Storage.java @@ -0,0 +1,89 @@ +import java.io.IOException; +import java.io.BufferedReader; +import java.io.FileWriter; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.util.ArrayList; + +public class Storage { + private ArrayList listOfTask = new ArrayList(); + + public Storage(ArrayList list) { + + } + + /** + * Adds tasks to the file. + * + * @param filepath File that the task is added to. + * @param textToAdd Tasks that needs to be added. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason + */ + public static void addToFile(String filepath, String textToAdd) throws IOException { + FileWriter typer = new FileWriter(filepath, true); + typer.write(textToAdd + System.lineSeparator()); + typer.close(); + } + + /** + * Writes task to a file. + * Can be used as a way to overwrite tasks in the file as well. + * + * @param filepath File that the task is added to. + * @param textToAdd Tasks that needs to be added. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ + public static void writeToFile(String filepath, String textToAdd) throws IOException { + FileWriter typer = new FileWriter(filepath); + typer.write(textToAdd); + typer.close(); + } + + /** + * Counts the number of tasks in the list. + * + * @param filename File that the tasks are in. + * @return Returns the number of tasks. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ + public static int countLines(String filename) throws IOException { + try (InputStream inputs = new BufferedInputStream(new FileInputStream(filename))) { + byte[] characters = new byte[1024]; + + int readCharacters = inputs.read(characters); + if (readCharacters == -1) { + // no lines to read + return 0; + } + + int count = 0; + while (readCharacters == 1024) { + for (int i = 0; i < 1024; ) { + if (characters[i++] == '\n') { + ++count; + } + } + readCharacters = inputs.read(characters); + } + + // count remaining characters + while (readCharacters != -1) { + //System.out.println(readCharacters); + for (int i = 0; i < readCharacters; ++i) { + if (characters[i] == '\n') { + ++count; + } + } + readCharacters = inputs.read(characters); + } + + return count == 0 ? 1 : count; + } + } + +} diff --git a/src/main/java/Task.class b/src/main/java/Task.class index 8e0fc46ea097496a8b33a2a3c005b371c16670f1..d7430c2702ac2de4cbdb93800e4eccf0376ecd15 100644 GIT binary patch delta 779 zcmaJzL6nt6^?)rLg(Yku_Z4 z11ujhmNp*M*Sx0Fay88JGD~om#m9S*G!aG2#9{O>$iLomKW=GQFtI4A7m?JkWa1Jo z^9~y-UNKQZpNXru#t>O>9MARE?X_~&Nqd0Bdq-KmY&$ delta 872 zcmZ8e$x;(h6g@9#(nA^u%}f+RKxLB2Aukb*!=W74u^={nULta9fM zD3laMm3)Ao;F3RZVy`9P*mCN6MA07dS;gx|}^yskAE1^%r zMGgH11~4dLNXIZPX}E0Q3a;uriCOF$GsqpcATXg}QpF9~JEdY;#m!=3xKB^5rBfT( zOu-STU7lS}ZY2k@$=vEd!pUcHt78Iz@k}n`ObFDwQ~tW*r}^Tqp{VBAC4xY3lSF4B z{l?x(3uxo1tjBlbBHZ7CsEIn%n`l6zfdBZT>*0=yTPAMH>K#N?+%<6zGwzOv#_pSV zfUt>K%n5|1ZQCh0`Q+wY+F7$#3e^ET)DSoE2=gXd(WYTRZW8WK(J>hMKfZ}3Gz%z; z$-)NJ%H{a$^>oT{mwZl*nzG;JoOE75%ote2l6&lXA9yTPpS!ldTfA^T_`iymZd{q| zwfF{rABvoce~KK8t7pVj<3+b1Og!TrDUtTGJhR9G0z?%$8C66fvwN&RN+c>-0q($B zgs8%2@{K|~YDd(gO;t2DOPT>6(Lx0S=;%19zO9ICm#vx@u$h7_lnay9Sz@to#Ons? z51{Ts+ePq@(XkKX0D&(g2$W@7Dbt1;CaPl$fpewAWXVV}tyi z@A*^T$rIm3+IZGMWn~XRMzE@BUUqKaU_ck0yE#A)rF(h9eY~{`r(!aT{PfVuH-z?3 njHkSoYus0{GQzV_53m0P7ZZN? diff --git a/src/main/java/Task.java b/src/main/java/Task.java index ffc2fb7e55..c16efede09 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,24 +1,35 @@ +import java.io.IOException; + public class Task { protected String description; protected boolean isDone; - protected static String[] checklist = new String[100]; public Task(String description) { this.description = description; this.isDone = false; } - // Returns tick or cross symbol. + /** + * Returns tick or cross symbol. + * + * @return A tick or cross to symbolize whether the task has been done. + */ public String getStatusIcon() { //System.out.println("\u2713"); return (isDone ? "\u2713" : "\u2718"); //return tick or X symbols } + /** + * Method to mark the task to done. + */ public void markAsDone() { isDone = true; - } + /** + * Prints a statement informing the user that the bot + * has added the task into the list. + */ public static void printGI() { //Duke temp = new Duke(); Duke.printLine(); @@ -26,9 +37,15 @@ public static void printGI() { System.out.println("Got it. I've added this task:"); } - public static void printNumOfTasks() { + /** + * Prints the number of tasks in the list. + * + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ + public static void printNumOfTasks() throws IOException { Duke.printIndent(); - System.out.println("Now you have " + Duke.counter + " tasks in the list."); + System.out.println("Now you have " + Duke.getNumOfTasks() + " tasks in the list."); Duke.printLine(); } @@ -36,10 +53,12 @@ public String toString() { return "[" + getStatusIcon() + "]"; } + /** + * Prints a statement to tell the user that the task has been removed. + */ public static void printRemove() { Duke.printLine(); Duke.printIndent(); - Duke.counter--; System.out.println("Noted. I've removed this task."); } } diff --git a/src/main/java/todo.txt b/src/main/java/todo.txt new file mode 100644 index 0000000000..e69de29bb2 From 0c6b61e0eba18d4805e03926e31c15dfb955addd Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Thu, 29 Aug 2019 19:51:39 +0800 Subject: [PATCH 12/51] Done date changes and formats. --- src/main/java/Deadline.class | Bin 915 -> 982 bytes src/main/java/Deadline.java | 2 +- src/main/java/Duke.class | Bin 5090 -> 5239 bytes src/main/java/Duke.java | 8 ++++++-- src/main/java/Event.class | Bin 911 -> 978 bytes src/main/java/Event.java | 6 +++++- src/main/java/Task.class | Bin 1754 -> 2719 bytes src/main/java/Task.java | 32 ++++++++++++++++++++++++++++++++ 8 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class index e6107f321b1f33fc686b148e174e3c8f467bde8f..ecaf0f8be3cd9ef9f0db3e01291f7796c508780e 100644 GIT binary patch delta 326 zcmXYrJx;?w6olv5iPy0g@&g9Ke}IJ8`GE>jQ6NgV1C|J)iHs6A+yb;UH7!U)L6P79 z9Dplu3&c23yxAGOZ#B=TFV+40nSKB`#-Rrn3k4`FW-iFwl1EvtaKEOouCVbCJ{|ek z)F{ByD59jXmAP%y1f|m?Nk{20zP;$DH_6qg=wQdiuErkfMx<93c-P5r5T|Ex+7~pM z=3eS~4-M>_6S;Gm8QM1Q5=z&6%UBM~qjla>yay2EvRXQe-iM~nF}0X&zJAo2K%({- z*2@f^H#IxBs`4f!b?;Q8+h)tNz>aGA+Mg$-b@AVdcds#sxm InX8=DUwaQKApigX delta 291 zcmXYrJ5B>Z42Hj%O?LJ%kgyOSyx(DGBP1$PQ^OG`B7sD=h-^c{9nc(t79^rbDL4QJ zpyMbYyn({@|J$Eze;RM{kDuu~a7I7Dki~>7)@rF%olHhu!E!t|VZ#y;Tjpt5 zHi;GO^Rlc))&219@}{~iuSczrt%z;Q4!b^8gJ!}W`~Fcqga>u=*ng{BIp5P`RroJ` zF$m=zC>r%{QCf6DD%pxF#0OGSS4>c@KSsaK@HsyWI#=?^Kj;KgGRfS8z`fCs&{LZ5 g^2bXKXM`29El#sQPii9FLvoJjvMfFlzap{v3k{$n1ONa4 diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 1f196e2637..6df4930f58 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -9,6 +9,6 @@ public Deadline(String description, String by) { @Override public String toString() { - return "[D]" + super.toString() + description + " (by: " + by + ")"; + return "[D]" + super.toString() + description + " (by: " + formatDate(by) + ")"; } } \ No newline at end of file diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 6f33ef358da0839cb29056c86d6b84a2535fb5a2..4268439b5e64cf359e41b4b07d38036c811b860b 100644 GIT binary patch delta 2659 zcma)-d3;pW7018#&GKF*4di6$~&5LE6=4m6pZ!+&2?xt$+C5=X3A5=bZcd z-Fwcx=bjvM`ikVUZyb37n9M&zEM%=kdx%;(bQ8~`lXZ?*6CpOS+2R(HTeY$)L>^mo zvsE|SLM-Qf7Psj>si(f*;&$DCz~TC_P z;fG8ceN$F=kc?X*WrpVV{qTI@5qPXpf{VjR1*tyuX;Y8 zws_FuGupi0;(*CRAtv###b+(jCJP=3F+~p#T0Cm;n8o9Iub;E{yzakX@kNV64u(c6 zqsQV)7Kbe|4nF!!zN|UcnjA6dPt8@&`M+XvG&Rh)-`7B6>aekMNHdK#D`+%%!sbby zN-gmXOMcbjYc^l!8zxWN9HT|CWuDs-iMyTg_AWQl(h^&jaATWe@q`jt#oa_}+eUX)XM20+Ep74DB5ml1Bx>A{D_=BPxo}}+mwaw(Yez?gySP0T z*%)&p(bm|8n49QKx^0P(ZhdPczSiyP+%!^AuqLuOQn@M7)?QgB%ZSG|*nE>`Y#R8M z&9i*l<~fere23!--^#9-&3Ad;CPJga-`=({VY6Dx%C$Mc_iVn;55yAfjEn0JdBNmG zo0qg<5$_#p^D?j4L=j^>OKpC{tEqFoZOH~5ieNO>9!rSn$2xYaw9`+t^iy87`I(lk zr%u2VozYI|>ZQ{hui2dBxW&(He!=q!YanW}s!E$*@+*b0vP%qea^ck5`?VtA1zL=e zp40wg$~new1Xf4V=C^u5*Q8DaXQhUiV}if4`Mo4|nz=l9N+<9SsRzxS!9VgR#l%#V zRcW}Po{06L5&W~Z{yjB4zg)eZYRx~aPNzoLwaHq!WXRF+!XRgKv5X9s$XK={vKJ2N zLt>K?B<&3{DwSSI9~j$k()#oSN{~zT7r4dF>3qp_2KU(Fz$$G z$zUe4W5*I%to`IQbrb3(f8qEH_FiMNbb~SsUKDmN$}nUvd3_Y5jTK?X85mxiHfDsK zp&1H|htw%g8dl>k_WP=w;hs-@)><717Y6*zg@HhGhN3=-tAmBXTAaLEBi z6bAcvS2v}F0Z|nO{m~2~o}#QS&7gkVCTCB29{ThF^gb?o3qc>3_c2GOeBb6YOV_@B}47vbZ8)G$l&H zSY2akM)PeMO^;D*nsL3yIN4*24KOYXJ6C&*bpwnS2&V{P^8XoY-Z5kDJcXTX%(5w( zs#6qpvOCYJ-knutmzGsc(<(`6vdNk5<@EfXMY7Luh8c1U)93FwB)4D^^Nf8`@@tJf zUT^3_uBxQQ!(h2Hg>s08$zdNZQjz?{;(G~~%I&C-(maWgOk)&tMKh1fWY%bwGDa>& zIWc(`ItbI16xZ7&le?L~ekPKpilba5rEW4WaJ7_~DZEAve`6}IGffR3CA8Vgu$ETYv|LYq;~8e=(Yjn#A* z>xdg$SZCb9dSe#}V-MRTR<|1WvBlWWR^wqAKf-M+lbBUgaGna23FF@(m&; zH!Jlo@{F_0JWjqLDH#&9n#)QK0Bq<$s>}RT9cdVyji-OYqF&(2awuT zP-?EEMf;}?6%-Able?9^0f(0hN*Bnxk^@{NG`ezD$z3fOs4p4ba{+&@hp(%o6rvKj zxE23PILj$FU#Z{s8Q4t{A53frR;@EAjRTs9^zVs0I20^U06E)ZWUJW@yY zQILz%b)rZ!!9TS`)CU-oRmUlKgMbGa+2(u*f2b>2hxMx8^c zGmMqow7$89$+_ST?`M8fFAI7o@ktpR5rB&X-NKc@%5pUSyx9 fzwi(KDi?6Qj7wze8)S1ErM*b;fH&y&+TQ;FW==a8 delta 2528 zcma)-d3;pW7018#W#+w?;j!d}2_}XR79j}?u>k`F1X)BP0mVQt7?$7+5{wDU7(uCH zEs9H8qR*CwDr&Kv)-Fm?C(}fPwn|&E+EuMx#V%HDYxjQo5!-X$OrTZ%aOU&5_nvd^ z`JMHi_s_DElM>Iq+y4|WgMWmmV~fqTA(qmrm+NwAqumwhju3IKx9HHE8$#IZ)XOft z+!&&Xn{0OL{li-CW}AfGZ?XA^X5OlokJ{|f`)wg^XK${E?+8&#;!b_@E=}L9=}wD} zS$y1PUx+bu+1wMNgnRWRPoM77mp-9SpVT`0Z9Zkut$`1OsGv(rKJB8k%e6dUbI|5N zEq=)6VT;d%n9d=aM{GW8@wpI7W@<8N^Ld*u*gUEO{i4m6^!{a=uh=~1VraAy4%_tD z^xAyYC5MznpSH2ZB5m3$6Hz}>#uHZYm04nc!uK+ ztN50~xA~64vz%~vjuVQUjk{tF-{pCS4KyeMtt~s^4x5-GgerA-f$uqdpC5=Q+TJF2 zf5?w4e(dm~7A#}A!%MvEa5YhfdR998gjc-Xf!&E!+8Hw%YmLQ4?Wa1Nn7;Hgefl}C zIQ&ANR&a%2$J?XrvaOU&oA{-}uQ*}zs>4a1SJ=^5bF{UkEhbJ?I=sfO6~@M0B3P6a z=6M{-24PbAev(IF-q!_3>{!hqg&d?*rQ3c#|IzhgU=lVPcuG?pBOZdW|V*UFq&OEEdSs&P9wud5aCTE!v)%1}Vdo#{{$?OS)Yl5;f6ujz$;O;7D#E^$Uu%#}7wp1Sj}GWmeYaq?~^$V-^WM#|(XQBH?k z-OFV5Gllz!&_g9pislKX$#9r1v*!X{rJp`Uq{{a)439kS6Xj+ppg+!}xQ3jd;Pfo3 z=x5>JEX!hfZSLr$^4-YlY!XDRQzdV;XmGxySace~z1Vj}PeysyMOE_f{?9k>MYnva zd}6YAv$A;MOz3A>d)9*EGA@x93U^7!ApdZ} z|Le5Ope25^dr-;$yex1!X8)B)8#{7-OuTzs@^={TnfwU}-3uXd#=V15|Ca8zx#qN2 zGqN=tH9&1+AD8x0m?JZBMDz$Hy%e9ROs1Ts0NGNNT(Pj(x7xy=eR##6_$zNy$X20? W^ZkaIm{Y6=jL0*N*y ze}MRph`C~CXJ=+_?@9mY;e0Xs0&tE~gBV!?jaAPYo;3}jRj0q9(b3o}^J%M!EsF%k zVi~E$wr4xoEq|NIUW|Qo(x9aj>%)5fn-y&1wRaoNEB sM^L;XWT_8CGgN>V8p3sO@S&996?TO>4%rRWoKF;JV~umnxy@St2acX2fdBvi delta 291 zcmW-bJx;?w5JunF&N^O}B!u6PK!C)64ML(ov=KdrKmv)*2)ltxAhdU&rT`(O-~g1| zh6XW9F*DzM^JZti)2Fof`kj9Q=Nwy7`Wc4hpjLuf?dxcevY9e`K6yE{j2vw;M~ALs zi%jTUR8> diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 8340bb84d6..939d770d51 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,3 +1,6 @@ +import java.text.SimpleDateFormat; +import java.util.Date; + public class Event extends Task { protected String when; @@ -7,8 +10,9 @@ public Event(String description, String when) { this.when = when; } + @Override public String toString() { - return "[E]" + super.toString() + description + " (at: " + when + ")"; + return "[E]" + super.toString() + description + " (at: " + formatDate(when) + ")"; } } \ No newline at end of file diff --git a/src/main/java/Task.class b/src/main/java/Task.class index 8e0fc46ea097496a8b33a2a3c005b371c16670f1..37c98f72dbaab205e474afb147eb3f7d51a5f9f1 100644 GIT binary patch literal 2719 zcmbVOS##4?6#lO5Sh6Cr7!nAD)L{)_NoiRV_JqYH4wR%&ptKd1h=py*wXOpxUFp8J z^aW1Rm<~+^ci$S-!Jf>F<9h{sOQa*9@%2-UL=* zpIY|oIH04?KtB$uzw<&KX#Nw+y_EcXU`f&g;nPu#<@3f`$y7jZ#ND9Z_Z$InMj(;RIoW){4Wz)rv-67Yay?h>5oqb0 zd%W(XK&;QVX{~X<^_;;<@w`(Ww$2yGSuoY=W7cJRuNfK-3 z13wpyh9WKQ$`)!d8$*7joOKSlDxQS$xJhNy#0G3Ju?A~RbYh)A^q*gU3D@fyJQKb; zEn$m>cTJQ*l*Kyyic11b2Yg=!vTT(y zj?DRX&=|*M9b+cm!xa-RVY80+711NmKIluwuGuYzq0g|qNnmN%0@ArGyNBFjsox43#7x6NBs&9TB;4<`rXG> zzp4juZ#}D|{``G3Z}Pjro;S&SJeqSmq$*dMvt= zQsc(TEG}Akr_cAYmOSOk9G?Pdd6M1I(wUxjRHA3aIf1&8%ACNeXZQ3}I@G*Z=U`fX z`fy$+_0k{kFFEBtOF3ztE=Za&j;JX05CF+%Tne01Q;3v*fq{z+DIsvKGd*|M{vT&v z%m%NTj1vUbh@;^f)oVX6-f8HrH|pn|+8tO;`5`MS{qmTGpO~Tn-_KV{gq`+0MqaRj zz+oM(&&+VmMs*~QSe{*Qf>l+;-sgrgOL2ItMCK|ASC%m?52DWe)p@BaUy#YNLyNSAF-EFcWp@DdK zoW#rIXo#5mHNFW29V<-*VFd-1g?LwNmS-ab)`~hTq35kr@(Qy0H9kcAA+)>nnHY!h zG~{K>!E(gWPRK9Pz_uv^J8K47s@iu^Kf%C28?^YenH4m%63tBOA|_Vwb73-a6@|iW zbd6)d1ie57UCmlG=uW!bG39n|&F$hz-1Ra09_khT###7P$Y714tWumQYG58)neqg7 zqK6KcH1Q#25|nz}HSh>cr<2VOkR*2v_)wRVZSOW~)L_>!05?Ti%UVodxL~x6FOL14-Hi(5>RfV_m>uDQ{x1CAYfn5xJ z5WN`2ZrIp^Joe%W_Teh_;~Ea&2EWRF<7e6}exlvR5!^ux*^1$P$9v-3;!Ir z>VsNU1zTI6FxT^+Q-l&vI0lib8iaW%r#oX2@JVl5iO1@+J#k`69thb!uxJu0rM?{-~WQ_mAKPXj&+V8YTH z@XOLm@btkMJSBI}AWPiH+XM{$f!6R7L|ClD2+caoHI@W=hye|N1kr&@agr$X3QdDa zo+38*2=f)>^}u=yJFwrgX2cGOxSvEnD-H~wubpCP06C)0kRwrBBtq-I(O#S^fXz)@ z3^w?x?(`3=2kYXd-HexEuq;{mChNB|{12;_tUk0cLI>vx3^n4bDVa@cuSUc?^}|j5 zJz037JDr>k6sR91E98_SYh!$fkp`1p?WlilYUvA7AJDe`dJSWX@&XA4O)m5FD7c6P STw?ScyeHY&$=a?Mr~U#u##UPZ diff --git a/src/main/java/Task.java b/src/main/java/Task.java index ffc2fb7e55..72b5fe3bb4 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,3 +1,7 @@ +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + public class Task { protected String description; protected boolean isDone; @@ -42,4 +46,32 @@ public static void printRemove() { Duke.counter--; System.out.println("Noted. I've removed this task."); } + + public static String formatDate(String date) { + String formatted = date; + try { + Date d = new SimpleDateFormat("dd/MM/yyyy hhmm").parse(date); + String day = new SimpleDateFormat("dd").format(d); + String month = new SimpleDateFormat("MMMMMMMMMMMMMMM").format(d); + String year = new SimpleDateFormat("yyyy").format(d); + String time = new SimpleDateFormat("h:mm a").format(d).toLowerCase(); + String endOfDate; + int dayInteger = Integer.parseInt(day); + + if (dayInteger % 10 == 1 && dayInteger != 11) { + endOfDate = "st"; + } else if (dayInteger % 10 == 2 && dayInteger != 12) { + endOfDate = "nd"; + } else if (dayInteger % 10 == 3 && dayInteger != 13) { + endOfDate = "rd"; + } else { + endOfDate = "th"; + } + + formatted = dayInteger + endOfDate + " of " + month + " " + year + ", " + time; + } catch (ParseException e) { + System.out.println(e.getMessage()); + } + return formatted; + } } From 091b79ed66cd29c24c517780e26b65a01eaa3bed Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Thu, 29 Aug 2019 23:34:46 +0800 Subject: [PATCH 13/51] Done A-MoreOOP. Added more classes. --- src/main/java/Deadline.class | Bin 982 -> 1122 bytes src/main/java/Deadline.java | 7 +- src/main/java/Duke.class | Bin 6746 -> 1018 bytes src/main/java/Duke.java | 269 +++-------------------------------- src/main/java/Event.class | Bin 978 -> 1140 bytes src/main/java/Event.java | 8 +- src/main/java/Parser.class | Bin 0 -> 186 bytes src/main/java/Parser.java | 2 + src/main/java/Storage.class | Bin 2079 -> 3353 bytes src/main/java/Storage.java | 45 ++++-- src/main/java/Task.class | Bin 1688 -> 2846 bytes src/main/java/Task.java | 27 ++-- src/main/java/TaskList.class | Bin 0 -> 517 bytes src/main/java/TaskList.java | 16 +++ src/main/java/Ui.class | Bin 0 -> 6651 bytes src/main/java/Ui.java | 261 +++++++++++++++++++++++++++++++++ 16 files changed, 363 insertions(+), 272 deletions(-) create mode 100644 src/main/java/Parser.class create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/TaskList.class create mode 100644 src/main/java/TaskList.java create mode 100644 src/main/java/Ui.class create mode 100644 src/main/java/Ui.java diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class index ecaf0f8be3cd9ef9f0db3e01291f7796c508780e..49014f110ef300ac58d2588b2fffb92db5469837 100644 GIT binary patch delta 491 zcmXX?%TB^T6g^XvmQoa}_*U=<6b0Xpt*^ucSF&<9(ux&qNjoudqkDIzEB^u$#l(dl z;0L&K<9Dd>mbjR6?>%#J&fNKszm$#l-`6()o7h&NVkm|fhE;-*5Jp38Eab*@5@i%j z$(WWgb6>pcOB@Sctsn7bg`YMo8MF88^lbuj8sgA2%p!>JU zDY#+R(dF%kApv&|qYJ+rOgQz~!8=nDXf4%ebiqCSBh!d{vRG)Jh$jlv6L2pBM$~8)+E>Ry delta 345 zcmWkp%}&B#5S*_qw3JUkv?vPri$YQKgm>dnZ@xgKO(ZHMv@!AI-FRufr|{-Mqv7BK zcs20>^gWF89d>ticV;vD<9yrw&%fCRfFm5baIjE-jYW+-jcP8_QkDBv8x0%HZ19kM zHBXCZNfh8plu?mb(`X$V0+r)9PLp&ROwOY8G7gh+9-9ufB(~8Oa89BiydI4s0qZ%^qDj zG{ag@JFfNot8yonx5r5`#E=h{`&p{z#`rlNMTlD&OivWQ6w-gku%VZ1+CnZxUZE5 z1|oQ+7<5|Df$_Ja)VW3OAka)>L>qlk#P&uC4kXRMy@|!McI!INw94e{w`~R0R zieA$%+Z&EfA6;u6*z>w26XTd>*Sn61FL#WnV+ z6J2yAFdmHQcsX5X%TpU()2&?CO{`1Kx~OoDvV*tVSI}_Hvnm3^=}db&P36>btG;i2?woC;bD@6>db9nF58kH& z<9W4p-}ihrT=i{RQ5WcS?IV@<>UGPlV3IE;#V6Utm&DCc3h6xsoZAg7ToNXT-=Ovd zVfq4V*%n0h453mBT_*@r>@Ll;&~pMwIa11ggFHpF1>*$0Uy<4*5I#j;U~C~y^q4uv zFoy-`OKKh?a+BGo5G9SVRv+U0jbVWHA$suJKoUzBM4o+5(kqG3ZyG`p35i<}61Nk$ zLqiw>clqamNOki$azP$%_tM{H1IL6!P`59bZ4{Cl=wsC=(#Uis&(NlWV`oT|63G?@ WPcd{Esy{_=O(rW{t)3+s!ptA+PsM8h literal 6746 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 SJ(cGlCfB?C_t*UQ_kRP>5~KeB diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index e8178e851d..4ddb511d34 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -5,264 +5,29 @@ import java.util.Scanner; public class Duke { - private static ArrayList arrayList = new ArrayList(); - private static String file = "todo.txt"; - public static void main(String[] args) throws IOException{ - String logo = " ____ _ \n" - + " | _ \\ _ _| | _____ \n" - + " | | | | | | | |/ / _ \\\n" - + " | |_| | |_| | < __/\n" - + " |____/ \\__,_|_|\\_\\___|\n"; - - // Prints out greeting of the chat bot. - printLine(); - printIndent(); - System.out.println("Hello! My name is \n" + logo + "\n" + " What can I do for you? \n"); - printIndent(); - System.out.println("I can only do these functions for now: \n \n" + " Todo \n" + " Event \n" + " Deadline \n" + " Delete \n" + " Done \n" + " List \n"); - printIndent(); - System.out.println("Ill be adding in more features soon! Please be patient! :)"); - printIndent(); - System.out.println("I can only accept dates in this following format: \n" + - " dd/MM/yyyy hhmm. Please adhere to it! Thank you!" ); - printLine(); - - Scanner scan = new Scanner(System.in); - - File f = new File(file); - Scanner sc = new Scanner(f); - while (sc.hasNext()) { - String task = sc.nextLine(); - String taskType = task.substring(1, 2); - switch (taskType) { - case "T": - Task toDo = new Todo(task.substring(7)); - arrayList.add(toDo); - break; - case "D": - int byIndex = task.indexOf("("); - Task deadline = new Deadline(task.substring(7, byIndex - 1), task.substring(byIndex + 5)); - arrayList.add(deadline); - break; - case "E": - int atIndex = task.indexOf("("); - Task event = new Event(task.substring(7, atIndex - 1), task.substring(atIndex + 5)); - arrayList.add(event); - break; - } - } - - while (scan.hasNext()) { - try { - String text = scan.nextLine().trim(); - if (text.equals("bye")) { - printBye(); - break; - - } else if (text.equals("list")) { - printList(); - } else if (text.equals("delete all")) { - deleteAll(); - } else if (text.indexOf(" ") > -1) { - - String[] splittedText = text.split(" "); - - if (splittedText[0].equals("done")) { - int num = text.indexOf(" "); - int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); - if (taskNumber > 0 && taskNumber <= arrayList.size()) { - printDone(taskNumber); - //tasking[num] = arrayList.get((taskNumber - 1)); - } else { - throw new DukeException("☹ OOPS!!! There is no such task number in your list of tasks!! " + - "Please enter a valid number!"); - } - } else if (splittedText[0].equals("delete")) { - int num = text.indexOf(" "); - int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); - Task.printRemove(); - printDelete(taskNumber); - arrayList.remove(taskNumber - 1); - Storage.writeToFile(file, ""); - for (Task task : arrayList) { - Storage.addToFile(file, task.toString()); - } - Task.printNumOfTasks(); - } else { - if (splittedText[0].equals("todo")) { - Task.printGI(); - printIndent(); - int num = text.indexOf(" "); - Task task = new Todo(text.substring(num + 1)); - System.out.println(" " + task.toString()); - arrayList.add(task); - Storage.addToFile(file, task.toString()); - Task.printNumOfTasks(); - - - } else if (splittedText[0].equals("deadline") && - text.contains("/") && text.contains("by")) { // what if there is no deadline - Task.printGI(); - printIndent(); - int num = text.indexOf("/"); - int num1 = text.indexOf(" "); - Task task = new Deadline(text.substring(num1, num - 1), text.substring(num + 4)); - System.out.println(" " + task.toString()); - arrayList.add(task); - Storage.addToFile(file, task.toString()); - Task.printNumOfTasks(); - - - } else if (splittedText[0].equals("event") && - text.contains("/") && text.contains("at")) { // what if there is no date - Task.printGI(); - printIndent(); - int num = text.indexOf("/"); - int num1 = text.indexOf(" "); - Task task = new Event(text.substring(num1, num - 1), - text.substring(num + 4)); - System.out.println(" " + task.toString()); - arrayList.add(task); - Storage.addToFile(file, task.toString()); - Task.printNumOfTasks(); - } else { - printLine(); - printIndent(); - throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct format! :<"); - } - } - } else { - printLine(); - printIndent(); - switch (text) { - case "todo": - throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. " + - "It must be in proper format (i.e. todo clean table)."); - case "deadline": - throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. " + - "It must be in proper format (i.e. deadline return book /by 23 Aug)."); - case "event": - throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. " + - "It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); - default: - throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); - } - - } - } catch (DukeException | IOException e) { - - System.out.println(e); - printLine(); - } + private Storage storage; + private TaskList tasks; + private Ui ui; + + public Duke(String filepath) throws IOException { + ui = new Ui(); + storage = new Storage(filepath); + try { + tasks = new TaskList(storage.load()); + } catch (DukeException | FileNotFoundException e) { + ui.showLoadingError(); + tasks = new TaskList(); } } - - - /** - * Prints indentation. - * Helps to order the output, making it much neater. - */ - public static void printIndent() { - System.out.print(" "); - } - - // Prints the line. For better organisation. - - /** - * Prints line. - * Helps to order the output and makes it - * much neater. - */ - public static void printLine() { - printIndent(); - System.out.println("___________________________________________________________________"); - } - - /** - * Ends the chat bot. - */ - private static void printBye() { - printLine(); - printIndent(); - System.out.println("Bye. Hope to see you again soon!"); - printLine(); - } - - /** - * Marks a task as done once the user has finished it. - * - * @param i To indicate which task number is done. - */ - private static void printDone(int i) { - arrayList.get(i-1).markAsDone(); - printLine(); - printIndent(); - System.out.println("Nice! I've marked this task as done:"); - printIndent(); - System.out.println(arrayList.get(i-1).toString()); - printLine(); + public void run() { + ui.greeting(); + ui.nextCommand(); } - /** - * To remove a task if it is not needed anymore. - * - * @param i Indicates the task number that is done. - */ - private static void printDelete(int i) { - printIndent(); - System.out.println(arrayList.get(i-1).toString()); - printLine(); - } - - /** - * Prints the list of tasks that has been added by the user. - * - * @throws FileNotFoundException if there is no such file that contains the tasks. - */ - private static void printList() throws FileNotFoundException { - printLine(); - printIndent(); - if (arrayList.isEmpty()) { - System.out.println("There is no tasks in your list currently!!!"); - } else { - System.out.println("Here are the tasks in your list:"); - File temp = new File(file); - Scanner s = new Scanner(temp); - int numbering = 1; - while (s.hasNext()) { - printIndent(); - System.out.println(numbering + ". " + s.nextLine()); - numbering++; - } - } - printLine(); - } - - /** - * Deletes everything off the task list. - * - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. - */ - private static void deleteAll() throws IOException{ - Storage.writeToFile(file, ""); - arrayList.clear(); - printLine(); - printIndent(); - System.out.println("Everything in your list has been removed! Add more tasks to get started again!!!"); - printLine(); + public static void main(String[] args) throws IOException{ + new Duke("todo.txt").run(); } - /** - * Gets the number of task inside the file. - * - * @return Number of tasks. - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. - */ - public static int getNumOfTasks() throws IOException { - return Storage.countLines(file); - } } diff --git a/src/main/java/Event.class b/src/main/java/Event.class index 182a8895e3fc0f29a8a6df3bb3671a0ddd84cf58..3c7e400110c11401ff37e73c80bb45cd109c1c20 100644 GIT binary patch delta 525 zcmYL_&u-H|5Ql$bJF(+#n$)yFA*5;3(8Ps=zbViI6$qrF_SC3{-j>7-rooQvRV29d z86ux}iyok$9(VwbJPQ{jgqRHnWNAG5_VaJN^TYn>bie<(_y%AL+b&!z7f`@8m&XM*)M9*G^R1o-BS7-y90>OEj=2<@Jk1yiPFo%Fx*z7<9N)h03WM+#XXCoVDl`di0DEOM8Pcg9$uQ5IhHoG6gixb84vK TkkjS1#TOCkSRuE`>#Xn}96v7G diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 939d770d51..17f58f6dd4 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -4,6 +4,7 @@ public class Event extends Task { protected String when; + protected boolean isValid; public Event(String description, String when) { super(description); @@ -13,6 +14,11 @@ public Event(String description, String when) { @Override public String toString() { - return "[E]" + super.toString() + description + " (at: " + formatDate(when) + ")"; + String date = formatDate(when); + if (getIsCorrectFormat()) { + return "[E]" + super.toString() + description + " (at: " + date + ")"; + } else { + return "Invalid date format!"; + } } } \ No newline at end of file diff --git a/src/main/java/Parser.class b/src/main/java/Parser.class new file mode 100644 index 0000000000000000000000000000000000000000..3a29ff98fbca10142cc8b37d6962797d322c9b92 GIT binary patch literal 186 zcmX^0Z`VEs1_pBmUM>b^1}=66ZgvJ9Mg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H1Xc2v=}^X;E^jTPBFZ9gtX5oLZ!pl~|U@!@$D83N!~I#K<5364cL0 z%uCnzPs&P7E@4n)U;^3*0*pWiR1GBAfIL|+pMil@YdZtuMzAzHkYoc2LzHp=X(k3v E0MI)i^#A|> literal 0 HcmV?d00001 diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 0000000000..4d27fe15e5 --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,2 @@ +public class Parser { +} diff --git a/src/main/java/Storage.class b/src/main/java/Storage.class index f374e94b57a07b408a39da82b49c6c98cd20a73e..43fb1ae5efbf60fab2f16f7ab2a8dc36a1a2e994 100644 GIT binary patch literal 3353 zcmaJ@>vI#=75`mX(yrEPYzqqz;6zRgwz0t>fN5<*!4HB{KT@Q|u^k9&X>AM3yFyw4 zPTHgo`c5Bdn-pl%(DdOnp=|;gDHC;?Fa6Y+&h%4f+W(-_5B-+uWGL?Mt|TmqQp~+~ z&%NiId(Qctb9Dc7=lwqbIE;5S9KtCDQ4Jo%G<+6M26-?m$vHVaEvM58&M0_BgND-@ z0ywMTBn&w{tzce5BjO4Y0UU&>p;@voXlTKr#+@YvNfqZbY?ZPtSe8>t!{b=Ul)jvB(X)oG)b;%3@O+E!Mx63v70IT$p1^8T+DyOUEntk$_$;uA?6eO0&D?CRj9XSXRmYD>_DTg25iiEt_{S z6KJ2djit6oY>B2tlG%u5J4?)@NYaY%BO6(uU2Qt9;+l>h<3$}m!K*rciq`~0OviQn zj2|N$qr@v_Cv3^_x{f{^*70-qv{T0~-6_N0piMB|8mx47NZ^&?#f^l#8NPWMSRmSW0IhR;vN*P#!wGq6j`EzER zhb0w6cxbQ`f@{ECOT2w%L{O0+bk^0|;QbKn?-Vo}nt*MTV zFgKD`!n`!KKy`L*qa!m8PtcNbWwMU$CPdXXrPGorWeJ4KzPh#tv-95O=)1Wte(L z?&>{Ety1r1S8o9-)qae+-4yJ=CUhdm=R>tRw&jwU;(40mr@A+a2+S0r&Ct900`&1_ zFMh91bkod+qphCnXsGM+@}f;4?+t#n^7uNs>iT>kA3tA5s3+vR>=Or?wCn5ty6hEe z>;EXpuC4#I)$PHR-_KzRmwEaUWnbocg?b;O_LJCj2i*!zDi{;D z*+Fk3AU;A^y$wY)e*~YZ9vACS;Zg87*&q}&u0ugxi6-T4`KnM6ymy@5F?qzliAe+3 zu_BshZX#H~=J6t0X1WUqO^|*MTdtv@h^;fhZ3TosAWGY>iU5}#{ob(G>&s(jzc1|T z_j~%3us@I1w`eu+1cywX5sm{Kqa4E=F^-4B{@??7Ja`qm>-v;6L`X+mdW%=mO{Cjg z+VAUALdu(zd4)s%^KgVYWIZhw@z6}z+oa_2Z~^W8>P_qlt9k66UPB`64R++w*%v6H z%Vi1$ya^f`_J#uLSyy6Dza}NLlEkAGiTWbCOA_@JiTbicProiDbXVfehc~e|xG#_1 zA|7Gvb``LHa_`%&kup7InH0b@>hTnx@MLklY6Dwjr(&8Y_i$P?>W5~LxaRl0b(4nANLCZP=ttvQJq6j~8 zLH-v&W23%($NqI*%ao`vFpjcH{alBc#if2U!8Dp=9+tXLj~i>CNqSenqqndtc;FU- m8?B_&kQBBOl~_x}J@^cM$5o?_-{2kmmRL=bR!Kj_G4o$iND{sP delta 1073 zcmZ{jOLJ3Y7{`C_$w}ViaM~VHBAAj|CRDYL02fEV?*qVRPK#ASc3O zR5Nao4b}O2n zY&0rg6r^-4S5lbM^`)w!r{J$t=hi;ET5T*=uGYjekPR{_W8_M~H)=*r1%Ij;J*_#V znF+2N{jD^!ir(j!Zo%5T#7;%B6Y}f%S-)1j(D0kphE1B&nlmpC<7}LQO_4d9dCu9q!)#b}PSN)aZ)$CMx!MT+HFA5?EZDru;xi((%F4(2 z#cPfFjj#us^OS;1=0|2ED{cI0o{wDMy&x4`3jR?kRSIrIFUK|I@V?8zgIG>|7M;BVa@Jk)M$hfENZ%ul)!xl1gAmoY_8(18aRV()ZivYxlQCA=1-m4 zjGWz)feh7T8$I%Sg40ieR~UGTG9l40YxgG6@}Su!R&06h&*=NaVS|LXfwcvhlyroI zB{X&ljXpB$5l=|%RRP}n9C$=vL*U*HaGPyK&;1{`oD>cUTUR#CW6$ghc>CD@gsA#T z7Bwc3A2zYen{<_>?e4ZL(RPzx;zd_@I^!ARE?tpfQ*PQG%p``C6EqXqmNUNo_^*`t zE!tcsnlgu@VL~eUV= listOfTask = new ArrayList(); + protected static ArrayList taskList = new ArrayList(); + protected static String file = "todo.txt"; - public Storage(ArrayList list) { + public Storage(String file) { } @@ -86,4 +83,36 @@ public static int countLines(String filename) throws IOException { } } + public ArrayList load() throws IOException, DukeException { + File f = new File(file); + Scanner sc = new Scanner(f); + ArrayList tempList; + if (countLines(file) == 0) { + throw new DukeException("Woah! There is nothing in this file!"); + } else { + while (sc.hasNext()) { + String task = sc.nextLine(); + String taskType = task.substring(1, 2); + switch (taskType) { + case "T": + Task toDo = new Todo(task.substring(7)); + taskList.add(toDo); + break; + case "D": + int byIndex = task.indexOf("("); + Task deadline = new Deadline(task.substring(7, byIndex - 1), task.substring(byIndex + 5)); + taskList.add(deadline); + break; + case "E": + int atIndex = task.indexOf("("); + Task event = new Event(task.substring(7, atIndex - 1), task.substring(atIndex + 5)); + taskList.add(event); + break; + } + } + System.out.println("Your file has been loaded! :)"); + tempList = new ArrayList(taskList); + return tempList; + } + } } diff --git a/src/main/java/Task.class b/src/main/java/Task.class index d7430c2702ac2de4cbdb93800e4eccf0376ecd15..8eca2976e4c90385ee25d2cf14de44589d2a8d9a 100644 GIT binary patch literal 2846 zcmbVOTXPge6#ja5vokvx2rLO06&xT+5+G4j&;(Ho1QxRik^lmtPIe~QA-gl{PA3rW z_xt^BX_Y=`@!|to8d6y0gH^s*W%(ccA>!A)n+qiHV3Io1=gc`@f9KLY`SagPzX8~V z&n?`F2Qz3xpA!3&*l(iW!~qKjkyGMO1`lDtMBc(6hLq)Smcb(yeUD}#aNNWr22Pkb zX<;=^De;duA3tOntDuRuD8_eG&EAWjN21#w?gt@;JoA63h)AwG5!PnWx z2A&i!WmHR?rP0nu{Bkr!veuZ+cb_Y%+_qe*O9>jNGH^JWtQP$KK&6~f+jglU+t`Yo zHg3Zf8|~<@(TNU$@e`UjW_Tn17nU?BJ?P#O30##w-nvC1#VbibJ(rM z{(Kv4yn`JAn@5T+3&pw=edla73dbFfe4SbsH#&QIwzqS8)ehEaVd{rQ&v3S{FwM=w z8toNC-MOLp-2_%@>!b`y-L=_B91YlKJv(aR=jJFEdVY8n@N_KwGTR+Z@3bS)z$jnP_ z9Q*9U7mF)g$Ecm>gKp@R{J51y=HR4Vw728@Jby*7GUo)zJAfQa{XxrnOOh zc6m=ys!i|WQ@J+LHTfmXY{PjpWYZUDO6dJ+K{w$}S_~xYy@rmt8$0U=o9L(z(w!-? zT_9@dWHyoRW)j^s?|-MZbH`a2voL=`CTq>0aUn3v+`zgdS(!9Rt|X5P?jb-zQ@*zj z&{B(@g?)*205OPoHOwx;+{6DS?nN_tC{+^#R|38BHP}Q=WngvAVC5y&5-R;#xohd) zM*_RAm%*xKGT6th_cMcjW^jOT_hAnui!Q!rQ7mrp_tyNcSbZX!y@)kiXV5&TwH9jI zXRx*>rPXzFYJ*m9m{ZeQZLO;_xUt7*P0iw_otc)*Dyx$E7OS~v{03I`<{tAr?$+jp zn%P$7^~$_Ko6|M(3T57)%trQ>9#eHR)sks7TN_%_t;QudK>j>h2iY_-+@wpcJGhz4 zZ5Nnc0zcy-N53{aCpoUbA!-9yg*Fn;U<^l5=IU7-=Qs5ce1a4B z3a9W5PUAZ~M!W(MAIB`7!0&MJ2S)K1JUx()B7K>`mVq{orT)8rZlP2X!rHZ$*@$bp w(2Gu&u@1?36bJ(wTNw2K*(b0UAMt4s>;tm<5UqHadNbc2p>0^pV_F9P0lSch-v9sr delta 768 zcmaJ-OHUJF6g}U}bY2c^9i**@7F!;6P#y&=AQUP122t^?F)@+E#6^kJok*DO~h$2}uu^ zaYZ0rDwiwkmFJJwmR2iI%TLy0CKhchdAN#Y51lw-a3RG03)Hgn>>49uE%Ab*&P)i_rGXfTvU{uxRpPmBH%ND@_Ko+5_>t{?=CqK( z4D0Ra3VAed&cacqjv-A<$*7&IszGk3qZ1KQJLqm!nO6$c6RX3l!}`n-&JNsv6=tEM z2PS%{u#W`CNuY%mCtCy^&F(r5G~fZ`AY({V-RE?OJi}bw2-lTIhJy{t%<}8`>p8:-("); } return formatted; } diff --git a/src/main/java/TaskList.class b/src/main/java/TaskList.class new file mode 100644 index 0000000000000000000000000000000000000000..c25112e2d970f300b6264a57cf10ec118ab5102d GIT binary patch literal 517 zcmZutO-lk%6g^MJ`O?%<%N9Y>Mh$Y=LJ=ZpHRM7GT0U)(XVVDdOwiAY7D7QkpdS^T zH<=O4=G}MiJsX15YdThs2r#6{>hBkZ*Tx1dPk&9a$Amh5mK& zIQ656oCd5k+gU<=%{k6&Z9O!^9?XJ`k2_u_(agV6T6IUyp{G96o0L#QsRRqQKrLf6 z>ipsbswp6l;k-ARF8o=H7B6Pxx(0zZ${W8b|GQhalave;-;uvv!}up){tUu*k3u=r Fz5#o>W6S^m literal 0 HcmV?d00001 diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java new file mode 100644 index 0000000000..e6c2d1e64e --- /dev/null +++ b/src/main/java/TaskList.java @@ -0,0 +1,16 @@ +import java.util.ArrayList; + +public class TaskList { + + protected static ArrayList listOfTasks = new ArrayList(); + //protected static String file = "todo.txt"; + + public TaskList() { + + } + + public TaskList(ArrayList list) { + listOfTasks = list; + } + +} diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class new file mode 100644 index 0000000000000000000000000000000000000000..c56c23563cf4d0e20e8355b89e4b744efc4fee7c GIT binary patch literal 6651 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 TpJ#FXE;9X~fBlkw{fGYn8A+(> literal 0 HcmV?d00001 diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java new file mode 100644 index 0000000000..d4d530b72a --- /dev/null +++ b/src/main/java/Ui.java @@ -0,0 +1,261 @@ +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Scanner; + +public class Ui { + + protected Scanner scan = new Scanner(System.in); + protected TaskList tL = new TaskList(); + + public void greeting() { + String logo = " ____ _ \n" + + " | _ \\ _ _| | _____ \n" + + " | | | | | | | |/ / _ \\\n" + + " | |_| | |_| | < __/\n" + + " |____/ \\__,_|_|\\_\\___|\n"; + + // Prints out greeting of the chat bot. + printLine(); + printIndent(); + System.out.println("Hello! My name is \n" + logo + "\n" + " What can I do for you? \n"); + printIndent(); + System.out.println("I can only do these functions for now: \n \n" + " Todo \n" + " Event \n" + " Deadline \n" + " Delete \n" + " Done \n" + " List \n"); + printIndent(); + System.out.println("Ill be adding in more features soon! Please be patient! :)"); + printIndent(); + System.out.println("I can only accept dates in this following format: \n" + + " dd/MM/yyyy hhmm. Please adhere to it! Thank you!" ); + printLine(); + } + + public void nextCommand() { + while (scan.hasNext()) { + try { + String text = scan.nextLine().trim(); + if (text.equals("bye")) { + printBye(); + break; + + } else if (text.equals("list")) { + printList(); + } else if (text.equals("delete all")) { + deleteAll(); + } else if (text.indexOf(" ") > -1) { + + String[] splittedText = text.split(" "); + + if (splittedText[0].equals("done")) { + int num = text.indexOf(" "); + int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); + if (taskNumber > 0 && taskNumber <= TaskList.listOfTasks.size()) { + printDone(taskNumber); + //tasking[num] = arrayList.get((taskNumber - 1)); + } else { + throw new DukeException("☹ OOPS!!! There is no such task number in your list of tasks!! " + + "Please enter a valid number!"); + } + } else if (splittedText[0].equals("delete")) { + int num = text.indexOf(" "); + int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); + Task.printRemove(); + printDelete(taskNumber); + TaskList.listOfTasks.remove(taskNumber - 1); + Storage.writeToFile(Storage.file, ""); + for (Task task : TaskList.listOfTasks) { + Storage.addToFile(Storage.file, task.toString()); + } + Task.printNumOfTasks(); + } else { + if (splittedText[0].equals("todo")) { + Task.printGI(); + printIndent(); + int num = text.indexOf(" "); + Task task = new Todo(text.substring(num + 1)); + System.out.println(" " + task.toString()); + TaskList.listOfTasks.add(task); + Storage.addToFile(Storage.file, task.toString()); + Task.printNumOfTasks(); + + + } else if (splittedText[0].equals("deadline") && + text.contains("/") && text.contains("by")) { // what if there is no deadline + int num = text.indexOf("/"); + int num1 = text.indexOf(" "); + Task task = new Deadline(text.substring(num1, num - 1), + text.substring(num + 4)); + String taskers = task.toString(); + if (!taskers.equals("Invalid date format!")) { + Task.printGI(); + printIndent(); + System.out.println(" " + taskers); + TaskList.listOfTasks.add(task); + Storage.addToFile(Storage.file, taskers); + Task.printNumOfTasks(); + } else { + printIndent(); + throw new DukeException(taskers); + } + + + } else if (splittedText[0].equals("event") && + text.contains("/") && text.contains("at")) { // what if there is no date + int num = text.indexOf("/"); + int num1 = text.indexOf(" "); + Task task = new Event(text.substring(num1, num - 1), + text.substring(num + 4)); + String taskers = task.toString(); + if (!taskers.equals("Invalid date format!")) { + + Task.printGI(); + printIndent(); + System.out.println(" " + taskers); + TaskList.listOfTasks.add(task); + Storage.addToFile(Storage.file, taskers); + Task.printNumOfTasks(); + } else { + printIndent(); + throw new DukeException(taskers); + } + } else { + printLine(); + printIndent(); + throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct format! :<"); + } + } + } else { + printLine(); + printIndent(); + switch (text) { + case "todo": + throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. " + + "It must be in proper format (i.e. todo clean table)."); + case "deadline": + throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. " + + "It must be in proper format (i.e. deadline return book /by 23 Aug)."); + case "event": + throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. " + + "It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); + default: + throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); + } + } + } catch (DukeException | IOException e) { + System.out.println(e); + printLine(); + } + } + } + + /** + * Prints indentation. + * Helps to order the output, making it much neater. + */ + public static void printIndent() { + System.out.print(" "); + } + + // Prints the line. For better organisation. + + /** + * Prints line. + * Helps to order the output and makes it + * much neater. + */ + public static void printLine() { + printIndent(); + System.out.println("___________________________________________________________________"); + } + + /** + * Ends the chat bot. + */ + private static void printBye() { + printLine(); + printIndent(); + System.out.println("Bye. Hope to see you again soon!"); + printLine(); + } + + /** + * Marks a task as done once the user has finished it. + * + * @param i To indicate which task number is done. + */ + private static void printDone(int i) { + TaskList.listOfTasks.get(i-1).markAsDone(); + printLine(); + printIndent(); + System.out.println("Nice! I've marked this task as done:"); + printIndent(); + System.out.println(TaskList.listOfTasks.get(i-1).toString()); + printLine(); + } + + /** + * To remove a task if it is not needed anymore. + * + * @param i Indicates the task number that is done. + */ + private static void printDelete(int i) { + printIndent(); + System.out.println(TaskList.listOfTasks.get(i-1).toString()); + printLine(); + } + + /** + * Prints the list of tasks that has been added by the user. + * + * @throws FileNotFoundException if there is no such file that contains the tasks. + */ + private static void printList() throws FileNotFoundException { + printLine(); + printIndent(); + if (TaskList.listOfTasks.isEmpty()) { + System.out.println("There is no tasks in your list currently!!!"); + } else { + System.out.println("Here are the tasks in your list:"); + File temp = new File(Storage.file); + Scanner s = new Scanner(temp); + int numbering = 1; + while (s.hasNext()) { + printIndent(); + System.out.println(numbering + ". " + s.nextLine()); + numbering++; + } + } + printLine(); + } + + /** + * Deletes everything off the task list. + * + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ + private static void deleteAll() throws IOException{ + Storage.writeToFile(Storage.file, ""); + TaskList.listOfTasks.clear(); + printLine(); + printIndent(); + System.out.println("Everything in your list has been removed! Add more tasks to get started again!!!"); + printLine(); + } + + /** + * Gets the number of task inside the file. + * + * @return Number of tasks. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ + public static int getNumOfTasks() throws IOException { + return Storage.countLines(Storage.file); + } + + public void showLoadingError() { + printLine(); + printIndent(); + System.out.println("Nothing in file!"); + } +} \ No newline at end of file From c69f71c1bbe91e2b804a4187112bde373d3665e6 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Mon, 2 Sep 2019 04:28:48 +0800 Subject: [PATCH 14/51] Cleaned up code again, Seperated them more into different class. But only halfway done. --- src/main/java/Parser.class | Bin 186 -> 374 bytes src/main/java/Parser.java | 10 ++++ src/main/java/Storage.class | Bin 3353 -> 3401 bytes src/main/java/Storage.java | 7 +-- src/main/java/Task.class | Bin 2846 -> 2941 bytes src/main/java/Task.java | 48 +++++++++-------- src/main/java/TaskList.class | Bin 517 -> 3707 bytes src/main/java/TaskList.java | 97 +++++++++++++++++++++++++++++++++++ src/main/java/Ui.class | Bin 6651 -> 5864 bytes src/main/java/Ui.java | 75 +++++---------------------- src/main/java/todo.txt | 3 ++ 11 files changed, 155 insertions(+), 85 deletions(-) diff --git a/src/main/java/Parser.class b/src/main/java/Parser.class index 3a29ff98fbca10142cc8b37d6962797d322c9b92..2d76b7d27b6b3e1184bbc6c41485d704049da81d 100644 GIT binary patch literal 374 zcmZutO-sW-5Ph4ZUGrf-jMe&a@z(ZW4jw!xUIalXDntq%H*t|I$ySn$;LlQ!f`UK5 zA0_fG)F*!RHEaJT z7R9O1S{5e^?Ng%~t+=?V4#)}tKk;)5I1OG-8r7RBX zh5Ia(8MxUQcqTfzGP5wSPTU~l$e_r;1e5>)Mj!-= j0!cO?PZrE)U|`kS&cL`4EX@ui*?__jr5r$-iGdRU8i@*C diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 4d27fe15e5..37a113a11d 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -1,2 +1,12 @@ +import java.util.Scanner; + public class Parser { + + Scanner sc = new Scanner(System.in); + + public Parser() { + + } + + } diff --git a/src/main/java/Storage.class b/src/main/java/Storage.class index 43fb1ae5efbf60fab2f16f7ab2a8dc36a1a2e994..0f816b4eb0a69445186482bfde58d18282ec4896 100644 GIT binary patch delta 1259 zcmZ9KTToSH6vuzx;c&ivwp%VI92I98pil{ssK}xKC60-rL7=25xrH5UpmXS)4MT7^nu_B# zbxc?sHs(pqJvLPw(cEiO%@LdXxIZqmrz{?@d61);hfK!9Ms!&`qIp#Fn8FI&>~OoE z4HPSm|NXOiJp4%|^%I&WHBW^VkxW-39g4(|JMPx{>DsOSh}VNv zqNpXE4zfYU9o^{#gX#WkVT|W2jypV0=StkR^xM48IWw~&Kdp)*yM4v7(Ttx8+EV>eF+3XE zA3JNtc`p1lR;A{`0(~xeUQrqTsV@zG)7AUx<<=q>GshFf^*PiaSOzEOnAl|eBAW%3 zi;jrSzhVw`Rt}2IBF)VKBpF6prRqP*~`cuBlsKqoIB=KuVjz#YDHtC>M9N3yWLmxUiuO;xkW?VKv9q r$r&mW*UXUk|F*R3!;-c;B{;&Zd?DJFBGb$=BU`#nuqAk}eEa?dHjwG= delta 1090 zcmZ9L+gH?86vsbjX5gGT9Rfy{BE1wrW(Y`86b%~5C>lvBMUtcwOgc(4HV$NVp^M$^ zVyBzg{bpsBLcv16&^WEQl_WAB}&hKp9k-Ew6 z=e|7+bnvz1YBp=OSRxEqZsoRw5JLgp5zMw=hBbF;wp%R2mN+{sy`+QLrn$>f$%tk& zPCFS(bx6P4Qo~LwkzJasVYg*Tm|MdhF=LEbHgHccIYU19y@q=Y1rg>a*@bGUxt0(-ADy5&) zJf(TsFN+i!lk_VRyVDct)@;6YZFVd(SjZML1xJ!+G|xJoQZdHm>p}~GLp{a7M6L#kz%c) zqGx(%(Z#&-MU4^>r6WFbW>Sg`4i|7B$(OLIHpKM3pWNYy%-+slP>G--M@>;0s?xNC!qQJTtmG*L~!f=Zz> z{#j0O6MaO3cJ+t!QXzi5|H+V zW93$f&(gNB`J~8*l$sr4v2S;qCX*D@I`$C+c47ZynWkD(GcPR~P5S~8eIhQr3MwmI z-9>Hlv;@t6CrH^KxLo`i`MDMj;ARXP=|8{iD})PARZuj`mD4mPy04lh@&6;xatKEH cy+x8EY~m~NR*Ib96koEGLBU4w?ecB?3!g&3m;e9( diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index a1da7410c5..fd03d57550 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -88,7 +88,7 @@ public ArrayList load() throws IOException, DukeException { Scanner sc = new Scanner(f); ArrayList tempList; if (countLines(file) == 0) { - throw new DukeException("Woah! There is nothing in this file!"); + throw new DukeException("Woahsies wavy! There is nothing in this file!"); } else { while (sc.hasNext()) { String task = sc.nextLine(); @@ -100,16 +100,17 @@ public ArrayList load() throws IOException, DukeException { break; case "D": int byIndex = task.indexOf("("); - Task deadline = new Deadline(task.substring(7, byIndex - 1), task.substring(byIndex + 5)); + Task deadline = new Deadline(task.substring(7, byIndex - 1), task.substring(byIndex + 4)); taskList.add(deadline); break; case "E": int atIndex = task.indexOf("("); - Task event = new Event(task.substring(7, atIndex - 1), task.substring(atIndex + 5)); + Task event = new Event(task.substring(7, atIndex - 1), task.substring(atIndex + 4)); taskList.add(event); break; } } + Ui.printIndent(); System.out.println("Your file has been loaded! :)"); tempList = new ArrayList(taskList); return tempList; diff --git a/src/main/java/Task.class b/src/main/java/Task.class index 8eca2976e4c90385ee25d2cf14de44589d2a8d9a..a6c0677fbf91e0f3c7cb242da71a0c465ef5b1e6 100644 GIT binary patch delta 1266 zcmZva`)?Fg6vscaJKec69hDC4)@3c0w)C~s7Aa5{K?FsGKByH+E3_`%g;H_1v`g^; zuJ1Q09Uq7wnwXSdj3{9x7>p+VA~6ONf6&AqeEc0+&z(~A2a}m|@ArG2_nh-V^si{) z^4}M~0#>bYBsOvvW$d5_>Yr*Adg!da(PsnJVuAb z<1SBd*zXC|tUluMB)7N}c*5uR2& z{WGCj%aCj@@S^`+Xt~#-gS^Dc2BCD?}Cd zeN%@!=J$uI!qc>$I}{EXVV}4B!{$(f8p&nzseRc=gLq@-SZXTOx<8fO+q!WyHPM$j za4?e{$*gG_JomF%V?^H8f!>>rG#T&v&5`rQN&mMuKe$GfL-yqh(>IG`hQ^mUr9*0kjk)i gHga4}N20yM3Eq`=^$9K){R6^n6KNar6b&Bv2Xz+KT>t<8 delta 1206 zcmZ{j?Nd}`7{-6+WzTue@l3)2mNwd4V9@}<#Dv;{lHSclB^41x(Z%RRA=rvuj4UmC zv7*ObW@@r#YWUIzO9ir-J~Y#pW}5l~`q1=$6y47O#!t=cUiW?7&wXEeo#)>3Px_1W z%&-4m`w8gclaMBQ1M=Kw;C=%SC>~Ti6!I{S7}y^0C_5CzkUn;r%C1<3_k_~BH^yQ> zvEOG0hws8LbTqpRc&s0R&v^-0v&vOya zGpz^ghOQSPUSwm$OT27R(K|j~o+?j{OcY1UW8(tj;?54R6rl^Jc_3-jb84vcSobz@&llnBr|C^Nt>Kvd+77 zTt4U6mUEu>^m%tUNKK4PPK{dR^;fCt%bQb<<-Kp(wJvzg)Cf)1j zTl2CgaB$5HNamVLNTS?>#6T7yMg`mStlwm{>jgjCv5DJEMb5JlEs3d?E4bfEV$m+> zB}KDEd2+!v?WtV<^^-cbNSBWtZS!S=7F+2wZBlHI)fq*v#l4F2on*_Bq14T3ibiqO zwcM|#Rj%I1#^M}t>WEiQbZ!tE0e483EkFK)S})H3QngigN|!5&1^M2!Vl52nYOY)B zmbtrE)C)mQ=7xgIOgB9;A^xmy#6c)3zqb~Dq;fEh7pQ8Tr@Aj;HNx8FNf+FN)~?c2 zLT_B9UP3b~be@|Ee#Tv-t~00!D#8i(ODZKxWTzOAKkR;HE-=Vv3~`Y|e9f>39uvvKEOLaO z8Q~X>@*AaO-3RfOWIFW8%hHq2J*$bK;)ry5Np|?ZEz%`TOVr{dDm}|{KJ_&+cCYxi e*~W(wLs9#H3(S&XxA1B?@0Z$R3GPeqiT?mp0=t|5 diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 856e80d562..af80b17342 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -72,30 +72,36 @@ public static void printRemove() { public String formatDate(String date) { String formatted = date; - try { - Date d = new SimpleDateFormat("dd/MM/yyyy hhmm").parse(date); - String day = new SimpleDateFormat("dd").format(d); - String month = new SimpleDateFormat("MMMMMMMMMMMMMMM").format(d); - String year = new SimpleDateFormat("yyyy").format(d); - String time = new SimpleDateFormat("h:mm a").format(d).toLowerCase(); - String endOfDate; - int dayInteger = Integer.parseInt(day); + if (!date.contains(")")) { + try { + Date d = new SimpleDateFormat("dd/MM/yyyy hhmm").parse(date); + String day = new SimpleDateFormat("dd").format(d); + String month = new SimpleDateFormat("MMMMMMMMMMMMMMM").format(d); + String year = new SimpleDateFormat("yyyy").format(d); + String time = new SimpleDateFormat("h:mm a").format(d).toLowerCase(); + String endOfDate; + int dayInteger = Integer.parseInt(day); - if (dayInteger % 10 == 1 && dayInteger != 11) { - endOfDate = "st"; - } else if (dayInteger % 10 == 2 && dayInteger != 12) { - endOfDate = "nd"; - } else if (dayInteger % 10 == 3 && dayInteger != 13) { - endOfDate = "rd"; - } else { - endOfDate = "th"; + if (dayInteger % 10 == 1 && dayInteger != 11) { + endOfDate = "st"; + } else if (dayInteger % 10 == 2 && dayInteger != 12) { + endOfDate = "nd"; + } else if (dayInteger % 10 == 3 && dayInteger != 13) { + endOfDate = "rd"; + } else { + endOfDate = "th"; + } + isCorrectFormat = true; + formatted = dayInteger + endOfDate + " of " + month + " " + year + ", " + time; + + } catch (ParseException e) { + Ui.printIndent(); + System.out.println(e.getMessage()); + Ui.printIndent(); + System.out.println("That is the wrong date format! >:-("); } + } else { isCorrectFormat = true; - formatted = dayInteger + endOfDate + " of " + month + " " + year + ", " + time; - } catch (ParseException e) { - System.out.println(e.getMessage()); - Ui.printIndent(); - System.out.println("That is the wrong date format! >:-("); } return formatted; } diff --git a/src/main/java/TaskList.class b/src/main/java/TaskList.class index c25112e2d970f300b6264a57cf10ec118ab5102d..aec2830e14a6e0f8bb74bb78db2e334fd2774414 100644 GIT binary patch literal 3707 zcmcgv|5qGW75@zE?kvj?$R;Eq<;&3K3xoiT(MBO8A&@j1NuY(0lB6la&f8_f?96s% z7J|06e%IQnwQ6g%v062L*QUB`gWrDk7ylkT$JWoA{Q{KLb3C5o;qYeOefQpX@8^Er zeY1ak@BW_voWLJrIEIT2co-j#Vj_lfxFmZQp5{3!A&mSZ@Gl_+jYja3z&h@ls56rWV_Obkb{qT*SpeNn}yR6M7k z(aL!KWNOCnmOKTm6Ss_IV=(V$tie&&HC89MI;@~!I+L~yKko_!9kp~$PDl^Kr>Gk_ znXxneDFyXCy|W5JV~$Cy=823gF6Xlg!ksY|EK2tE)N(W|ZSypz8S^0G<+Mcs(4MqcQB&ib-WzKcU62(!yCAx02;oJH#PhKKh*FR zex%{Y_(>FZHT+bHe+jiKm{i^;M>(OUmerhNmwGVe78Q zI?KZB)<;cK&pNKqeMu(Wcl5OIb^>p9ar-)Dpj{`fI^TlHi{1|_z?$nb4b<{~6TkLtFg+ahiFnPm}d z?CFMOIV&;|PhSz1#Z>g6UIo$dG8Gi;s&ROzP+lYhE2j3uHidw z#Zkr?OiXS{Zj*J1;0n}?ZHn8Isei-&1W&G)Um#IfJ_UPv5{cf@q1${+6ztrHD`ER0 zEf_;IXSkl=lszIxd;jsE&I;W=v$&HA;ZK-BTm(7~a9}6g;>fND5Knp`>Zbb+Q3Ros?wakgh1$ zn>ChrSnZ_YU(NW7d?PPypDpiDt;SIcq*8Ua=D-RB*jP6EUg;nxI9v{hr@~!vGky>g zn}NBi&GK+|KI&WC)?!T7} z@m&Q6HVB@vmz^b1z9LGDIBz7G5O2$Mnoc;*Qa-0ZOW3w>$1KD11ZncxX4uOzni|Ic*Y^U5v3EO|!tmD*mA0;I{l~#ipS1KkK2J z-#Ewk(ZclQCB^55Ijh4*5am1XE{-3iq?=D(CkP)|gYtG@@G*`tssarN@iRrL4{1j0Xrz{2$=;mU)`?JQr6fRj~B6vng#403blpa zMXSOav|qmMQ9y@7VOqC^1HXGKR>8c8eRtpgTM=zCr#eU&hL{Twhl*Wj#cu55*p5BS zZ7)u7Hj6gg#C|-32k;_SUPTA5>Q3I#U0j!F)V+t4qNq6i4;JAJMIiz*%Kx)fP^P$< z#8khBP2uk^;(;RC8Em|R$#b>=bteM?dI)nb13ZGA=won489+Zb9@w(aSaqLOgtU*>-O0X7d-Fz56kBED0K2~imzCBWwpDFX7Wo*auX!6qWp zPLB1FGRMiW5t8N%HP2A1lK6NfAf=Z!G7+-jK){B86sP*y)%o_8NSPIngjz#)kZldM zbiIYtIu6eDb+k(wgr!~(^`W6~P{5%`TO@wCfS%XUU&>LII&vS?T%=l%Ok1Rs%3ZV& zigonPwMEu&B0zMp>Oo2Ye_vd_dzm2IkfbprqZ delta 258 zcmY+8OAY~15JgXSzy50N*M5l!CO#1pi5=L3)ficTScw=&NG!lMEJGshYeGz_-mQ1; zt$OsfW^j9+ufURSLO>ql(+p`Pc;q4Nkk0OY-p|}oR3c3YiS~1|*w7ak$mmcE)nh3a zYjhB+TGphm?x_2d6V9P9WU7f!h%kCtydrJ!v6TIZEj~Ts{w$f2QLYiVipV|-t4gVT Y*9{9dlrDJd6Xq`=cweGgSCUKP1tvxmw*UYD diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index e6c2d1e64e..aa1a0454f2 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,3 +1,4 @@ +import java.io.IOException; import java.util.ArrayList; public class TaskList { @@ -13,4 +14,100 @@ public TaskList(ArrayList list) { listOfTasks = list; } + public void deleteCommand(String text) throws IOException { + int num = text.indexOf(" "); + int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); + Task.printRemove(); + Ui.printDelete(taskNumber); + System.out.println("before removing from listoftask: " + listOfTasks.get(1).toString()); + listOfTasks.remove(taskNumber - 1); + System.out.println("before overwriting file and for loop: " + listOfTasks.get(1).toString()); + Storage.writeToFile(Storage.file, ""); + for (Task task : listOfTasks) { + System.out.println("before storing to file again: " + task.toString()); + Storage.addToFile(Storage.file, task.toString()); + } + Task.printNumOfTasks(); + } + + /** + * Deletes everything off the task list. + * + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ + public void deleteAllCommand(String text) throws IOException { + Storage.writeToFile(Storage.file, ""); + listOfTasks.clear(); + Ui.printLine(); + Ui.printIndent(); + System.out.println("Everything in your list has been removed! Add more tasks to get started again!!!"); + Ui.printLine(); + } + + public void toDoCommand(String text) throws IOException { + Task.printGI(); + Ui.printIndent(); + int num = text.indexOf(" "); + Task task = new Todo(text.substring(num + 1)); + System.out.println(" " + task.toString()); + listOfTasks.add(task); + Storage.addToFile(Storage.file, task.toString()); + Task.printNumOfTasks(); + } + + public void eventCommand(String text) throws DukeException, IOException { + int num = text.indexOf("/"); + int num1 = text.indexOf(" "); + int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); + if (dayDate > 0 && dayDate <= 31) { + Task task = new Event(text.substring(num1, num - 1), + text.substring(num + 4)); + String taskers = task.toString(); + if (!taskers.equals("Invalid date format!")) { + + Task.printGI(); + Ui.printIndent(); + System.out.println(" " + taskers); + listOfTasks.add(task); + Storage.addToFile(Storage.file, taskers); + Task.printNumOfTasks(); + } else { + Ui.printIndent(); + throw new DukeException(taskers); + } + } else { + Ui.printLine(); + Ui.printIndent(); + throw new DukeException("Hmmm?? I'm sorry but there are at most 31 days in a month! " + + "And remember, no negative dates allowed as well!!! :)"); + } + } + + public void deadlineCommand(String text) throws DukeException, IOException { + int num = text.indexOf("/"); + int num1 = text.indexOf(" "); + int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); + if (dayDate > 0 && dayDate <= 31) { + Task task = new Deadline(text.substring(num1, num - 1), + text.substring(num + 4)); + String taskers = task.toString(); + if (!taskers.equals("Invalid date format!")) { + Task.printGI(); + Ui.printIndent(); + System.out.println(" " + taskers); + listOfTasks.add(task); + Storage.addToFile(Storage.file, taskers); + Task.printNumOfTasks(); + } else { + Ui.printIndent(); + throw new DukeException(taskers); + } + } else { + Ui.printLine(); + Ui.printIndent(); + throw new DukeException("Hmmm?? I'm sorry but there are at most 31 days in a month! " + + "And remember, no negative dates allowed as well!!! :)"); + } + } } diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class index c56c23563cf4d0e20e8355b89e4b744efc4fee7c..0491c39d35ae7759ee3784d784f7d53c9b7eb06a 100644 GIT binary patch delta 2910 zcmaJ@dwkQ?760C(?eFH-o3#Cv7AOTm0sBbWOvOz7By_; z*rsNwh6i+f3lG}J=^-5tqesCW(eNn8V>+f{JICXSVF$-fH9x`eZH^~7zN56KIG*N+ zDsdObcNO1mj%PUba6HTLoQCJshF{?5)f-9Z$h5;PbQG@O3ghvc8yu|UcPUcsX=MOo4q?8|X9M$luhS%hiY=d@8!|NK3OOM6J z-jG`@S5>S;14Gu$zO_D2SGYCcS=Q`pZ})d-_=&(z@iT#yI3chc*D&zqzRospYiC$s z1+JB2tefo3Xb@;p!%4g;d#$;n-r{&$;OF>-hIa%`;WT5l^0d_*aXOcWT0&0UnfO(& zE^~&JrLnOnOvJ^FjpkbQT7P?Zq?_L~4f{DgzOb{gsHMeISLf-bUvXp6nl-^-lA_A* zYYDWr`!8mRlsQ|H=8Kt{y8k~@z#ksLqi9SUk+gROoBSOV)fwtYntg$Qd5o&i$oRPg zRHlnz<4X+os;)MF^*XsKHBh@! zF{Q=11egQclk;Gb$C)hrHKeAE{I!fAPTTBU}6BgoJ$=V?>+ zo=w}sj8pgz@u|uSoKvtxvX?KEXZh4joX5wsrg}@@6EsMtt;mM|s$6`Eccs^MQ-Ov- zfeQ@OjEr$+q5fi41_+kIQUyyR(17h4tA-C{uD(L9*LPSsv+bRnp3X8e<40N$2rLQ( zgT8j@cDQA|m?q0af!rYOoNJFe#8+Dw(!-&u(2$mqJok`Am8O@B+GmeTZ4UT-9aPHZP*;1{OP$)O zF0#H)NM=s< z4RH&tw-LrdvqwfVOC5SIi451%SOQ&slsPUk0h2KiE;vz!Nwl^q3ALQ3AgSbjs$?Hh zW60`ZC*qP3L$=ptjEW(r2ey9XMp?hh7@btdMA^eGW2~t<2*F)3ojA6Fx@Im(?t1DR(S-Q)k4t-cyScn%33nQ>WZRSS>2}9=`u=9{?RU@%oLKr zJyBey{J!uxze`8>O^YJC-wC}R>4z}2!6-j~!oyMQ=r>KSI!h%*nl6uLPjSXKGRayQ zMZP<+f$S909Bwm=%oA2IXQ)eA0xx^DLk~s>~=lhX0x4xZJ`FA9X9oWQH@R%Q_ZFZ zY?M6XvKTHOZfx}(1Ong@1PMc5rUb^FzzC|Zg3XP=F${CSO0e5#T!(aYQ(Ec8O(5qa zkVd={6u6SWqz&V9)m=e^@VC=femxwBY(N(7AR>BW6GTC(F1=T%=tDtXN=pp$j$nQa z3x;_Yn!IX%BV87KHeLZZ5#5UnY=VLNs0HrFcxX|nr%ls0hEA<=JwPieH#a1ASr9{24;(5D)wHcB7AWxw5)YxK zp%1kO@WsW4U}-2hfGfQzbE&(tdXOK9=RKcP;~*9T1lVX{(F^Y<5*hF7Ig~o!DGK>C zB{E6}+=V>sMgg9ohTcPs`z#&qIcnDDsZn2`zhS-f0`8+bvES^jOjz>h};w{0&YsSKhb?M<2_0*U2qobC+CA8yN1e uc%4pAVop+G-lQG8MRJJPEVzZ)Y1YA5I?G@JWAQc89klXwiV-o#7yk$MA%vFz literal 6651 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 TpJ#FXE;9X~fBlkw{fGYn8A+(> diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index d4d530b72a..a76d1d3a73 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -20,12 +20,15 @@ public void greeting() { printIndent(); System.out.println("Hello! My name is \n" + logo + "\n" + " What can I do for you? \n"); printIndent(); - System.out.println("I can only do these functions for now: \n \n" + " Todo \n" + " Event \n" + " Deadline \n" + " Delete \n" + " Done \n" + " List \n"); + System.out.println("I can only do these functions for now: \n \n" + + " Todo \n" + " Eg. todo __(task)__\n" + + " Event \n" + " Eg. event __(task)__ /at _(dd/MM/yyyy)_(hhmm)__\n" + + " Deadline \n" + " Eg. deadline __(task)__ /by _(dd/MM/yyyy)_(hhmm)__\n" + + " Delete \n" + " Eg. delete __(number)__ or delete all\n" + + " Done \n" + " Eg. done __(number)__\n" + + " List \n"); printIndent(); System.out.println("Ill be adding in more features soon! Please be patient! :)"); - printIndent(); - System.out.println("I can only accept dates in this following format: \n" + - " dd/MM/yyyy hhmm. Please adhere to it! Thank you!" ); printLine(); } @@ -40,8 +43,8 @@ public void nextCommand() { } else if (text.equals("list")) { printList(); } else if (text.equals("delete all")) { - deleteAll(); - } else if (text.indexOf(" ") > -1) { + tL.deleteAllCommand(text); + } else if (text.contains(" ")) { String[] splittedText = text.split(" "); @@ -50,73 +53,23 @@ public void nextCommand() { int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); if (taskNumber > 0 && taskNumber <= TaskList.listOfTasks.size()) { printDone(taskNumber); - //tasking[num] = arrayList.get((taskNumber - 1)); } else { throw new DukeException("☹ OOPS!!! There is no such task number in your list of tasks!! " + "Please enter a valid number!"); } } else if (splittedText[0].equals("delete")) { - int num = text.indexOf(" "); - int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); - Task.printRemove(); - printDelete(taskNumber); - TaskList.listOfTasks.remove(taskNumber - 1); - Storage.writeToFile(Storage.file, ""); - for (Task task : TaskList.listOfTasks) { - Storage.addToFile(Storage.file, task.toString()); - } - Task.printNumOfTasks(); + tL.deleteCommand(text); } else { if (splittedText[0].equals("todo")) { - Task.printGI(); - printIndent(); - int num = text.indexOf(" "); - Task task = new Todo(text.substring(num + 1)); - System.out.println(" " + task.toString()); - TaskList.listOfTasks.add(task); - Storage.addToFile(Storage.file, task.toString()); - Task.printNumOfTasks(); - + tL.toDoCommand(text); } else if (splittedText[0].equals("deadline") && text.contains("/") && text.contains("by")) { // what if there is no deadline - int num = text.indexOf("/"); - int num1 = text.indexOf(" "); - Task task = new Deadline(text.substring(num1, num - 1), - text.substring(num + 4)); - String taskers = task.toString(); - if (!taskers.equals("Invalid date format!")) { - Task.printGI(); - printIndent(); - System.out.println(" " + taskers); - TaskList.listOfTasks.add(task); - Storage.addToFile(Storage.file, taskers); - Task.printNumOfTasks(); - } else { - printIndent(); - throw new DukeException(taskers); - } - + tL.deadlineCommand(text); } else if (splittedText[0].equals("event") && text.contains("/") && text.contains("at")) { // what if there is no date - int num = text.indexOf("/"); - int num1 = text.indexOf(" "); - Task task = new Event(text.substring(num1, num - 1), - text.substring(num + 4)); - String taskers = task.toString(); - if (!taskers.equals("Invalid date format!")) { - - Task.printGI(); - printIndent(); - System.out.println(" " + taskers); - TaskList.listOfTasks.add(task); - Storage.addToFile(Storage.file, taskers); - Task.printNumOfTasks(); - } else { - printIndent(); - throw new DukeException(taskers); - } + tL.eventCommand(text); } else { printLine(); printIndent(); @@ -197,7 +150,7 @@ private static void printDone(int i) { * * @param i Indicates the task number that is done. */ - private static void printDelete(int i) { + public static void printDelete(int i) { printIndent(); System.out.println(TaskList.listOfTasks.get(i-1).toString()); printLine(); diff --git a/src/main/java/todo.txt b/src/main/java/todo.txt index e69de29bb2..b34653d9c9 100644 --- a/src/main/java/todo.txt +++ b/src/main/java/todo.txt @@ -0,0 +1,3 @@ +[D][?]1342dasd (by: 1st of January 2001, 3:00 pm)) +[D][?]asda (by: 4th of December 3011, 12:30 am)) +[E][?]asdas (at: 2nd of March 1299, 3:12 am)) From 6ef426424e35f133879d5fa766f54b3081f0aabf Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Mon, 2 Sep 2019 19:27:31 +0800 Subject: [PATCH 15/51] Done JUnit. --- src/.idea/modules.xml | 2 + src/main/java/Parser.java | 2 - src/main/java/Storage.class | Bin 3401 -> 3449 bytes src/main/java/Storage.java | 14 +++--- src/main/java/Task.class | Bin 2941 -> 2941 bytes src/main/java/Task.java | 6 +-- src/main/java/TaskList.class | Bin 3707 -> 3769 bytes src/main/java/TaskList.java | 44 ++++++++++-------- src/main/java/TaskTest.class | Bin 0 -> 190 bytes src/main/java/TaskTest.java | 2 + src/main/java/Ui.class | Bin 5864 -> 5677 bytes src/main/java/Ui.java | 36 ++++---------- src/main/java/todo.txt | 3 -- src/out/production/main/Deadline.class | Bin 0 -> 1236 bytes src/out/production/main/Duke.class | Bin 0 -> 1218 bytes src/out/production/main/DukeException.class | Bin 0 -> 331 bytes src/out/production/main/Event.class | Bin 0 -> 1251 bytes src/out/production/main/Parser.class | Bin 0 -> 431 bytes src/out/production/main/Storage.class | Bin 0 -> 4169 bytes src/out/production/main/Task.class | Bin 0 -> 3412 bytes src/out/production/main/TaskList.class | Bin 0 -> 4323 bytes src/out/production/main/TaskTest.class | Bin 0 -> 249 bytes src/out/production/main/Todo.class | Bin 0 -> 887 bytes src/out/production/main/Ui.class | Bin 0 -> 6024 bytes src/out/production/main/todo.txt | 0 src/out/test/test/META-INF/test.kotlin_module | Bin 0 -> 16 bytes src/out/test/test/StorageTest.class | Bin 0 -> 861 bytes src/out/test/test/TaskTest.class | Bin 0 -> 724 bytes src/test/java/StorageTest.java | 19 ++++++++ src/test/java/TaskTest.java | 11 +++++ src/test/test.txt | 1 + src/test/test1.txt | 3 ++ 32 files changed, 83 insertions(+), 60 deletions(-) create mode 100644 src/main/java/TaskTest.class create mode 100644 src/main/java/TaskTest.java create mode 100644 src/out/production/main/Deadline.class create mode 100644 src/out/production/main/Duke.class create mode 100644 src/out/production/main/DukeException.class create mode 100644 src/out/production/main/Event.class create mode 100644 src/out/production/main/Parser.class create mode 100644 src/out/production/main/Storage.class create mode 100644 src/out/production/main/Task.class create mode 100644 src/out/production/main/TaskList.class create mode 100644 src/out/production/main/TaskTest.class create mode 100644 src/out/production/main/Todo.class create mode 100644 src/out/production/main/Ui.class create mode 100644 src/out/production/main/todo.txt create mode 100644 src/out/test/test/META-INF/test.kotlin_module create mode 100644 src/out/test/test/StorageTest.class create mode 100644 src/out/test/test/TaskTest.class create mode 100644 src/test/java/StorageTest.java create mode 100644 src/test/java/TaskTest.java create mode 100644 src/test/test.txt create mode 100644 src/test/test1.txt diff --git a/src/.idea/modules.xml b/src/.idea/modules.xml index 49577a565d..47664256fc 100644 --- a/src/.idea/modules.xml +++ b/src/.idea/modules.xml @@ -3,6 +3,8 @@ + + \ No newline at end of file diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 37a113a11d..78f0c8a323 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -7,6 +7,4 @@ public class Parser { public Parser() { } - - } diff --git a/src/main/java/Storage.class b/src/main/java/Storage.class index 0f816b4eb0a69445186482bfde58d18282ec4896..7082da3af844fec28840142a34b69e550251f5a2 100644 GIT binary patch delta 1515 zcmZ9MS#VTU5Qe`qb7#(-lbeMhAxr>Ggb*Nv$d=$JCL&>x0Lo$vpk!bsFc1>W28uek z?+acW04soN)?YC^qFs}{;JA- zd;atppqZ}?3s|qY)exe?a2uU*`Ea|1cUZOAsxD1Rv&CTOGQ`+wSV7vV&6UC#TtGXdq{JfCpnz{6j7e8y?|N&0{wBajVw5JfV3~^OV9J zObzU8-~Z=N>S_N6)ux}(Jga%muM73pwy;JK-;o+lHD>!7mt=b~9sSwCOut79&ujL3 zynyeY35^^7qRUGj2YA`z6j7jH|vw?EB`m$o@rZO1>5je@i<~9ju7gscM618HOxGPbD9X`i8kb8=!r zHVJkl#S)RF|E6gs9Hbc=q$%J^mVkYkTo$Vwdzl=ww`6PZld^MH^ z$ndiS|H5|uAgfB)p(@#_s@SC_)2mwPQ_JaB?F^{Z45|)>)E0)Z_u7K_n>x)HP5A{j zVKmL7NUn9I-0!GBX{lE=VfF=P*~@O0|0m0^9ko{-6}v?K21lR3&A8mc8W}`8$uonl wLzz8ef%zwx7H>L1{Qqx2%PVkYP}T}3#5zuiHIgIGX$sPa4T4?48$~w#1M3b9Z~y=R delta 1496 zcmZ9MX>3$g6vuye`eyE%*QYH5wV4*MWrw!ZvJ@CCOKn-pqAg-kD$~xC4h%CeowA5p zaNiL1xuN1NxXU_4nwXgQMH8cbH1UgH{bc+=VvN*tU#So$^Ul5hbIE`1Fw;wy(n+BF>x0X93_#g>R1++*Oq#%wdDOLL!QyMsfQLzuY38oG_yrs;7g zA)!fzSxB$LI1|3ZVFG=Qcv703HoF|k4R-=*F@x-OSVzW~tj!*??zPF;^lS144LD4p z%P8)1Xkfq10pmWXx!++nhcpj3)Nsh*K^_WA+JiQS9ggs@<`Khq)R=ag$25;?o>18N zc>k`pRDWJk=2_}j^`!TkYSm9^p4L3$)dh0xO>9y`cEr>hKm8o=cOD>g9=3JV1 zR&&(lIgTkxo3q(`e?AxAvp$*c%O?6uLOgHtg3F6|E-$gv7}!Kx}gpueiL* zYl`u{csichQQy&*%kGbNr;{$nd0pXN|6Z3{xlJ+7_YLGz>H7AbcqTKN${Q{#S>+um zY94%(6E1IY%;jy~ae0^b6sp7JeLj#)i#)9gt0SApnurfw>G)!olm6)}ms6~g!n7pg ziF7I>i8Rry2)6D^X7ZYkTs}6p_=HatlRC2lxvE|%NmXCGzp6W#%v7bb-dfA4{>0CnKQv(LR3?!;u(8)W8Onyvn6h2)D)nqN zZ13zZW~-EbBTKB=$RWrC_@4agdtGlV)L8^v<5W_FFW zgcfE6&4Nw%a`6<&I&qjl=NxN@qV=^k7qKo8gaV=3LKuBj#{1DOUwpd+TO!&bGOho~ zED{kTGv1dO!WI>ueT_UhTt5DKvNX=*;H?h-td@HfPEYA-5m?QQSE$jf(X923I#o^U zWRKF6jG!sf7%a$l1-T}uXk)$PAeT}jQj;5GZS#J2>L!M33slCesAUBUOpFDi!B{BJ zsH33*le~4s)8>XElMCE@oEb%p`V>{sP^8MoH(3Uk3a<8XDA=gWw0EMoa&Ss#)GE~l zrVcSJW}jtx)Gjb%%PA63D>Addtj6##v;Cm5u$7SaMy;~2-tIHz#2mwLMj7+Q7{$ZX zj53PH7{yl^wK3N)T%U2}^2Mpton>yMzQ8TRG<3?@5c4+Fot6Ry{C0Oy?rn9e2hY>Z zxAgD>34WrNU)aHA`WPXl0_;-7q}42Ts|NO{1?*Le$f;%YtF`2%706sU|1eWCPBURd zdTwhLjw0!Xw8H!ql$5v?l?@}zH60oYkW>ate?qcpk#FAU+-|^TBb%;HYptA_U#Ypq t5cAJ5J+j~&k^c{_meIAPyLU)zfIB%at0Nj`Wk$~t load() throws IOException, DukeException { } else { while (sc.hasNext()) { String task = sc.nextLine(); - String taskType = task.substring(1, 2); + int index = task.indexOf("["); + String taskType = task.substring(index + 1, index + 2); + int spaceIndex = task.indexOf(" "); switch (taskType) { case "T": - Task toDo = new Todo(task.substring(7)); + Task toDo = new Todo(task.substring(spaceIndex)); taskList.add(toDo); break; case "D": int byIndex = task.indexOf("("); - Task deadline = new Deadline(task.substring(7, byIndex - 1), task.substring(byIndex + 4)); + Task deadline = new Deadline(task.substring(spaceIndex, byIndex - 1), task.substring(byIndex + 4)); taskList.add(deadline); break; case "E": int atIndex = task.indexOf("("); - Task event = new Event(task.substring(7, atIndex - 1), task.substring(atIndex + 4)); + Task event = new Event(task.substring(spaceIndex, atIndex - 1), task.substring(atIndex + 4)); taskList.add(event); break; } diff --git a/src/main/java/Task.class b/src/main/java/Task.class index a6c0677fbf91e0f3c7cb242da71a0c465ef5b1e6..580bec8fbedd446a8c94b8f1c2d822ee2c5920f0 100644 GIT binary patch delta 74 zcmew>_E&5}K8GM9gC&Cn10#bz0|SFG0}}(|_E&5}K8GMDgC&Cn10#bz0|SFG0}}(oTh_U94SU zlQv0jZZ1tPY3p1Y_u@8g(xz>kSP(P4z4W1veQjp?+?mdFrf==ENx!qYAZ*ncjaGa9 z^Pm6x|Mz|8-_@T!y7pTDcVkt<9T-({EP{tL1TYrGK8&lFh$4)KHC}wnacMpg!RItQ zfJu2dso@bkDwmwn@E9J~(2XhSZ_2yrdJG{YFKOu_>~U&Z$_^umev-@OkO+1r<+f=)_nAPpNoX!yY`L;)~Lo z1${}ymlf1!EY};InK0dXS3!LEw7F<@=RGUaJ&?AUNox>CrfB*xImX2Ec^~yCy&8bQ%(xo9SGQtysPBv@WX%<*ok}>Vs?r|^2JpE7&zOLd09p8|HZ=z4dw{(0PFY5RXzN_PVxS-=DysYCDysG0hysqQ> zctgiUIq?JZ>G+|%{77DYESF!>@e}-1!LdV&BDdtt5i`TGjU}dUNc9+VrfWl^ zxvc56>-e>FZWzkXiwdI(7LH`I*#ifRC+`2NZ8!oCyCbMpzA`a{v^=EUICnlWY$=O-sMBkX53>@LA5^OCUr3(B` zSB6tIFKT&2oMXCdODCC=?GHAU{i_(Ecf@nb_^$UTTImrr)9G@ijXnTuZk2W$N@ave zl%oEOY<*=+l4L}JR?Xy+>xnEAbMl-hb!swyOv1_yg_-4sMP;owvn+puj9tFFpPXI? zZz*LB@8SwKF$_h)=Bzo--espu?}X*e@s3B>_V}RKQ3LgwqNpPP*XgQ6q=Yvt&g9Ju z`|Er1U@t4!zNR6|UUcR~sYw@;IBce<`Xv<~$cKyL%;y&r=tXKf4QbAQz^tCyTLe>*Q?^1g4=GWuU2jf zw%*(i?R?v~gOC0?J{;Koq2Ml#0@#nBd`|E_D4z}djc|@n6JGD-Xoz+`QDAf~L+M;a zU@}&>jNny-I0#Q(fx3*yRYc#VkAi+)V_X5$^BO@jqS%H8&h+8{casr^ITPUT_D_h| z^&Ygfs4WO_O=DHmCfv&S#VYRO4g)w?+TjoM3e(%}iq#jO-`mw1oN5hC70|GP4gH<( zBUC_R+X|YlKx+%83urz;W0bYT>I#U_TENDhU?TVdHYs=&?eZ?J;P(jhgi4+X#%L*E z^W~5KQVh67<{I!3*vsmHO;8c%rvO%nLS{N7(FY=ZO^p}Ria#0oyOf?KYjHP%+ZR*u%7+sZ`1&2@BFYMlZp+3S&}2T0r|UK0U%c_YjL~j0J8@^f=sJ zMpRA_rYekzD%nA0fJ#)UMU5;r6B&a_?4}m)rVia>`xgR~GelSL`;Q zVV~&!u2yxbwJBU;dVeq;yojZEuxZ;R`nRhM+F6qX3Dm30|Sgl83^AX@hyK>UjQi+C{}YSJ&^`FQvu&d0+|TQ1?LxcWL7Qk!~x zhW6aZ(B7U%B0>%IL=(~43`MIMqU#z%(V7fJKartn9uE+ImH)>!;88Mkin@G^Ts@AX zn8K5o=F4&l7my|c0&nspzk^x6H_qWVu<%E6_GkVJ`;e#mulyJGH!R@qID>y6hkugG z|6tK)%aCk+2(7}_O$m#T|8iHp)o%mrva9HxT*mF|T4k6$15Cb-$;y^Af&zavTHnVC PuCfui9LqNE@tgl2*^GSs literal 3707 zcmcgv|5qGW75@zE?kvj?$R;Eq<;&3K3xoiT(MBO8A&@j1NuY(0lB6la&f8_f?96s% z7J|06e%IQnwQ6g%v062L*QUB`gWrDk7ylkT$JWoA{Q{KLb3C5o;qYeOefQpX@8^Er zeY1ak@BW_voWLJrIEIT2co-j#Vj_lfxFmZQp5{3!A&mSZ@Gl_+jYja3z&h@ls56rWV_Obkb{qT*SpeNn}yR6M7k z(aL!KWNOCnmOKTm6Ss_IV=(V$tie&&HC89MI;@~!I+L~yKko_!9kp~$PDl^Kr>Gk_ znXxneDFyXCy|W5JV~$Cy=823gF6Xlg!ksY|EK2tE)N(W|ZSypz8S^0G<+Mcs(4MqcQB&ib-WzKcU62(!yCAx02;oJH#PhKKh*FR zex%{Y_(>FZHT+bHe+jiKm{i^;M>(OUmerhNmwGVe78Q zI?KZB)<;cK&pNKqeMu(Wcl5OIb^>p9ar-)Dpj{`fI^TlHi{1|_z?$nb4b<{~6TkLtFg+ahiFnPm}d z?CFMOIV&;|PhSz1#Z>g6UIo$dG8Gi;s&ROzP+lYhE2j3uHidw z#Zkr?OiXS{Zj*J1;0n}?ZHn8Isei-&1W&G)Um#IfJ_UPv5{cf@q1${+6ztrHD`ER0 zEf_;IXSkl=lszIxd;jsE&I;W=v$&HA;ZK-BTm(7~a9}6g;>fND5Knp`>Zbb+Q3Ros?wakgh1$ zn>ChrSnZ_YU(NW7d?PPypDpiDt;SIcq*8Ua=D-RB*jP6EUg;nxI9v{hr@~!vGky>g zn}NBi&GK+|KI&WC)?!T7} z@m&Q6HVB@vmz^b1z9LGDIBz7G5O2$Mnoc;*Qa-0ZOW3w>$1KD11ZncxX4uOzni|Ic*Y^U5v3EO|!tmD*mA0;I{l~#ipS1KkK2J z-#Ewk(ZclQCB^55Ijh4*5am1XE{-3iq?=D(CkP)|gYtG@@G*`tssarN@iRrL4{1j0Xrz{2$=;mU)`?JQr6fRj~B6vng#403blpa zMXSOav|qmMQ9y@7VOqC^1HXGKR>8c8eRtpgTM=zCr#eU&hL{Twhl*Wj#cu55*p5BS zZ7)u7Hj6gg#C|-32k;_SUPTA5>Q3I#U0j!F)V+t4qNq6i4;JAJMIiz*%Kx)fP^P$< z#8khBP2uk^;(;RC8Em|R$#b>=bteM?dI)nb13ZGA=won489+Zb9@w(aSaqLOgtU*>-O0X7d-Fz56kBED0K2~imzCBWwpDFX7Wo*auX!6qWp zPLB1FGRMiW5t8N%HP2A1lK6NfAf=Z!G7+-jK){B86sP*y)%o_8NSPIngjz#)kZldM zbiIYtIu6eDb+k(wgr!~(^`W6~P{5%`TO@wCfS%XUU&>LII&vS?T%=l%Ok1Rs%3ZV& zigonPwMEu&B0zMp>Oo2Ye_vd_dzm2IkfbprqZ diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index aa1a0454f2..9bde5c261d 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,10 +1,12 @@ import java.io.IOException; +import java.sql.SQLOutput; import java.util.ArrayList; public class TaskList { protected static ArrayList listOfTasks = new ArrayList(); - //protected static String file = "todo.txt"; + protected Task tasking = new Task(""); + protected Storage store = new Storage(Storage.file); public TaskList() { @@ -17,17 +19,17 @@ public TaskList(ArrayList list) { public void deleteCommand(String text) throws IOException { int num = text.indexOf(" "); int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); - Task.printRemove(); + tasking.printRemove(); Ui.printDelete(taskNumber); - System.out.println("before removing from listoftask: " + listOfTasks.get(1).toString()); + //System.out.println("before removing from listoftask: " + listOfTasks.get(1).toString()); listOfTasks.remove(taskNumber - 1); - System.out.println("before overwriting file and for loop: " + listOfTasks.get(1).toString()); - Storage.writeToFile(Storage.file, ""); + //System.out.println("before overwriting file and for loop: " + listOfTasks.get(1).toString()); + store.writeToFile(Storage.file, ""); for (Task task : listOfTasks) { - System.out.println("before storing to file again: " + task.toString()); - Storage.addToFile(Storage.file, task.toString()); + //System.out.println("before storing to file again: " + task.toString()); + store.addToFile(Storage.file, task.toString()); } - Task.printNumOfTasks(); + tasking.printNumOfTasks(); } /** @@ -37,7 +39,7 @@ public void deleteCommand(String text) throws IOException { * does not exist but cannot be created, or cannot be opened for any other reason. */ public void deleteAllCommand(String text) throws IOException { - Storage.writeToFile(Storage.file, ""); + store.writeToFile(Storage.file, ""); listOfTasks.clear(); Ui.printLine(); Ui.printIndent(); @@ -46,14 +48,14 @@ public void deleteAllCommand(String text) throws IOException { } public void toDoCommand(String text) throws IOException { - Task.printGI(); + tasking.printGI(); Ui.printIndent(); int num = text.indexOf(" "); Task task = new Todo(text.substring(num + 1)); System.out.println(" " + task.toString()); listOfTasks.add(task); - Storage.addToFile(Storage.file, task.toString()); - Task.printNumOfTasks(); + store.addToFile(Storage.file, task.toString()); + tasking .printNumOfTasks(); } public void eventCommand(String text) throws DukeException, IOException { @@ -66,12 +68,12 @@ public void eventCommand(String text) throws DukeException, IOException { String taskers = task.toString(); if (!taskers.equals("Invalid date format!")) { - Task.printGI(); + tasking.printGI(); Ui.printIndent(); System.out.println(" " + taskers); listOfTasks.add(task); - Storage.addToFile(Storage.file, taskers); - Task.printNumOfTasks(); + store.addToFile(Storage.file, taskers); + tasking.printNumOfTasks(); } else { Ui.printIndent(); throw new DukeException(taskers); @@ -88,17 +90,21 @@ public void deadlineCommand(String text) throws DukeException, IOException { int num = text.indexOf("/"); int num1 = text.indexOf(" "); int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); - if (dayDate > 0 && dayDate <= 31) { + int monthDate = Integer.parseInt(text.substring(num + 7, num + 9)); + int timeHour = Integer.parseInt(text.substring(num + 15, num + 17)); + int timeMin = Integer.parseInt(text.substring(num + 17)); + if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 && + timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59 ) { Task task = new Deadline(text.substring(num1, num - 1), text.substring(num + 4)); String taskers = task.toString(); if (!taskers.equals("Invalid date format!")) { - Task.printGI(); + tasking.printGI(); Ui.printIndent(); System.out.println(" " + taskers); listOfTasks.add(task); - Storage.addToFile(Storage.file, taskers); - Task.printNumOfTasks(); + store.addToFile(Storage.file, taskers); + tasking.printNumOfTasks(); } else { Ui.printIndent(); throw new DukeException(taskers); diff --git a/src/main/java/TaskTest.class b/src/main/java/TaskTest.class new file mode 100644 index 0000000000000000000000000000000000000000..99735453f4b50958d7fa5c57e8a5c3c4dda10772 GIT binary patch literal 190 zcmX^0Z`VEs1_pBmUM>b^1}=66ZgvJ9Mg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H1Xc2v=}^X;E^jTPBFZ8*plqrR)1AWu+#UFeoxG0c`~VMj!;L2a;?+o-CNpz`&}toq=&9SehM3vH^u5N;!Zu H69Xpzz@8$7 literal 0 HcmV?d00001 diff --git a/src/main/java/TaskTest.java b/src/main/java/TaskTest.java new file mode 100644 index 0000000000..f5bcdcaf3c --- /dev/null +++ b/src/main/java/TaskTest.java @@ -0,0 +1,2 @@ +public class TaskTest { +} diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class index 0491c39d35ae7759ee3784d784f7d53c9b7eb06a..83ab6e39ae54e10ceabbbafeed1b340a99f6451f 100644 GIT binary patch delta 2605 zcmah~YjjlA75>h=?wOlAGjOMqK+FpWLNbF9!b`ve5CnCi~IGw&`%;Gk&bWb`3i;d{&2sP8~jcPF>!t z;TAs%aI4P6Qa3v#ZqvDcUM*ixDt4Jvd%KRWV7J5`iM>kY9csB#$0qEPxQn}muPTYV zC2X~SP2%gy$~PqLQC$1g(k*eX+V4}#{W`vh2mItYpnQ5zNqtMhLlOsdL}5uhtQ0&V z@olxIB@RhEDsfny9+NmCaa56yOMHj=8u49;9*JIwK8a%*jw_Ed68&l)koca&31w(d z!xK6##rGwK)P7Q3o|1S{;wcSJ>u7+bg8P99foGT(d$m|J-rJc+wkeEhlW?=lF$s z7&g#|tL^7pduM+N8x17X@*;jIFm7ownd(e!ZQjz5NZpWZ=?wYslEljfeuZCac*Vf0 z81CEW-Yu-x@VbHD;0*(B;tc`!rX2|bzs2tiT#tntrw;T99 zh6O~0fj{81fj{C;Q#u`SV&5^y!soqzG=a$mjg43YvJ zcWae>eZC_i^eWC$xPm_e?~|oNwuSzU4|u1NYT!d=`?Rc*BP!gF@VY(G-()hA%(@WF zjc^&ljkoRh{4csEOpn{|8e#Xss&)3sK$(cxGlOCK8GW+bBfR!odUxOb1#5-v3-s8p z1eS;O&B?BgRJ^q#(Wwca(xuy7!75?c2ZF~v0fDLZ&QO`XEfk%%h8+gD;ZX%AJ&1zFUKsrd97nK+Oaj+(HK`KB zr3Ze}Iw~EN*X32V5uh$|)R>|80LBeqd@s!C350k)&oV0=sXFIo zYF)I{(^Tqh%HaF~Oq=V8cpgAu#M6uE8B`raLBunF>NEm_h&GzBe#|(T#y+Lx0!PcJ zt(r7;@YXUfJm-358k-gKEa$c&YSud56h+P14lyb|Cyj-QZ|?u_%{zy0ej4FyMI3)F z%KCF4dlhYPdFx^sEU=#&Us;iLWRklsjgnZ-fv|_CV9YUNhs{chF)dU&9Bqs8)WvzK z&ap5uKdumv!D3oUk5u=tOgbispRkD8y&jd~S?8SH>j@wQwO+)yo=>jn1V9zaQ0V##(U<>%|bR7SCE} zqR-cepW<5a0HBPFZ4FwdPc(ivT~9XD-QL=~xS@Zvfk+6%sd6hT}OW6U)gMxi-6m zy)`DLItoZ}?PAYvV_G?cbCL^kl4ibT&1Lzy7MLB4#6TEFb9 GKl~4ckQ_7s delta 2850 zcmai0YjjlA75>i5B=^kC%_O-YybR$60+>uNmG?71cou>pq(ZD#hRhWrlMGIVM_SuK zp=uQcy?q!JwN)8JP?L~J3JUmWm$qG9U7)l=Ew%QcR{O36tD)byGbDxn=wz*P_C9C7 z&feeNHwP-;8=Lr1@1Y|ACJR%?3f!V0=0^+SIy~6u$8v1auvteoZc)q@iB_Ham(}tW zC3vez<*hny!|f8=B(^KXudC$_9XH}miM!PP4W)3m#64=?A#txVd7s42gu30Omir|h zP`jg+Z|e9KzU`;bcXT|6Hl_BEhKD5{(J>0UB_3549+P-n?cbI7p2QOpPb%&yi9HfY zMedb&TG`tt@r=ZNi31YPYIsfs{JccFUPq!sqEq6aa@3_ErDHa_C3@8UeRX(9;;_UE z8ea6{2#)Glh~4Ui$4m&kEb)rY<5!jB4?ho4$J8sX3M4XVP#=8pj z&K^(6;8i$opblRUkaeM!^|g&HaRb+4rIYX7F`)tV2G*$M1l|zHuZc$EE%8`r!%{oG zE*fsh%f_1$Ck^}@ztHfOfm1l$`7`g`BJoSSZQxfpW8l{~Bj8=rY8!Y5zcCO-y?`&` z`dO!FJsp@8ibM>&i_-$aGVojc&cN^S2g-({%~XC5?;H34f7I}yfsYjPC;VB%Ukv;e zO$Kb-B#=9A<9d7kmIm87nYC`QfmO;{cG|vyzbVcakA|ZL{;p^lwnO1aW3x?{RRW$h ztp@&~F0$-Rc5|F3AtvLWIPGl9o|XMEngp7i7qzm^53~0R^A!F?a~6LF&MK|BPP?4p z9Fv;!ksOtG4xjK^<G<{Z}tcRra@ zCk7PW9NHAB+8A$)RLzOSLahoD&c{ZlsjY}dW1+Q7m+z*=2shK&kTbw}I(NR2vpLon zx9g${c<#(L20B{cY=W~ zQQ*82s7)+q^Mjc7DO{5BDLisF2yw!e>viO+dCqL1q@o+5;xIh*9q@L;*M%%{+4bGf zx**#rA@D`60eHD)Q%k~xpQqRN*;-F;9^O`&{@R`d^d97Nzz7~fE|5YX&6;`rWWG!4 z{njg>Q{SMELi!j$`$ha4h`|^H3ndtd;Ruqt0;TkP!v)WtbBrg8A)cx@h^!O}+Qjih znlw`=tPPq2QYdPJzXt=8q9K%tLZpwe~Y94jbG@JSPu z3D?-9K5B9wHN|z%JEc|uAcbjklQ_s5?Pm7X7UZCnY327Lqd6_3X{N!Td{$rDmjhLIAwm7E?91B{ z90Rwb0NZGYUyO{Qrpzdr$|e}<3#Tya7-pw1r{8W(U+Z5iGWSw{Bltex9^_#Mr_8;C zzum zs4;i_h0xj5^V$$lxtY&c6G_Zb^a9d{v5+HkQ8zxnL`_eQ(Z#jCnZ$fS8#2)plQR!t zi8}?idqnd5yELq-lLq@VrW1IIF846INxph7hGHK^;2ENPKhb=E4}O*ievasU9?KJG z=LkQ@PU&(nmk;mIUJTQ)P=iOD<&bQoK{eQK=DXJSy=z&f)D{CaYkRQN9amRfc%@-p zeQ6;|pwZG1mg6XcJjR;8#Ic-s8O3;oZeHzkG?nFu5R>Ty4ySAN)99!N%l4B@e?GF^ zi=Y0N8vhySgW`CqE5*G2h^}Eo{Wwk+?)WsO>I75u24i}Ybd)+CY!Lj;@V!Fhh&*9n R2);@_z?-kpYQkM#`VR`()); + protected Storage store = new Storage(Storage.file); public void greeting() { - String logo = " ____ _ \n" - + " | _ \\ _ _| | _____ \n" - + " | | | | | | | |/ / _ \\\n" - + " | |_| | |_| | < __/\n" - + " |____/ \\__,_|_|\\_\\___|\n"; + String logo = " ____ _ \n" + + " | _ \\ _ _| | _____ \n" + + " | | | | | | | |/ / _ \\\n" + + " | |_| | |_| | < __/\n" + + " |____/ \\__,_|_|\\_\\___|\n"; // Prints out greeting of the chat bot. printLine(); @@ -37,17 +39,14 @@ public void nextCommand() { try { String text = scan.nextLine().trim(); if (text.equals("bye")) { - printBye(); + Ui.printBye(); break; - } else if (text.equals("list")) { printList(); } else if (text.equals("delete all")) { tL.deleteAllCommand(text); } else if (text.contains(" ")) { - String[] splittedText = text.split(" "); - if (splittedText[0].equals("done")) { int num = text.indexOf(" "); int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); @@ -62,11 +61,9 @@ public void nextCommand() { } else { if (splittedText[0].equals("todo")) { tL.toDoCommand(text); - } else if (splittedText[0].equals("deadline") && text.contains("/") && text.contains("by")) { // what if there is no deadline tL.deadlineCommand(text); - } else if (splittedText[0].equals("event") && text.contains("/") && text.contains("at")) { // what if there is no date tL.eventCommand(text); @@ -180,21 +177,6 @@ private static void printList() throws FileNotFoundException { printLine(); } - /** - * Deletes everything off the task list. - * - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. - */ - private static void deleteAll() throws IOException{ - Storage.writeToFile(Storage.file, ""); - TaskList.listOfTasks.clear(); - printLine(); - printIndent(); - System.out.println("Everything in your list has been removed! Add more tasks to get started again!!!"); - printLine(); - } - /** * Gets the number of task inside the file. * diff --git a/src/main/java/todo.txt b/src/main/java/todo.txt index b34653d9c9..e69de29bb2 100644 --- a/src/main/java/todo.txt +++ b/src/main/java/todo.txt @@ -1,3 +0,0 @@ -[D][?]1342dasd (by: 1st of January 2001, 3:00 pm)) -[D][?]asda (by: 4th of December 3011, 12:30 am)) -[E][?]asdas (at: 2nd of March 1299, 3:12 am)) diff --git a/src/out/production/main/Deadline.class b/src/out/production/main/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..0cceec5e537998d966e7d83edc6e163ebcde934a GIT binary patch literal 1236 zcmaJ>YflqF6g|^Iw_Ub?D-ZDj1$ndu!S{orA1onaipG>+BJsntJHpasr`a7y`cL#< zV4{%l!5`pnGR8aI5-Z#IWp?Jwopa8;b7z14KK}vW37(rUaWjJqZkaSp>S0P_IgL%* z6f~E{ynzJ+d4@!-#b8$s_%UDcxWBhjRe|g8l^9ZMuJ5WB3=8@Ab{r|}F!YtBBN&D% zt}osk9o9s!&1)VZc16~?x5EQhuRCC$+IK?+v$8I@y0hmY*QO35N%Z+1$D9EYW?hm#IjD*LKZ~}1F$SCV#&fCEL#}G zn1vBo48t#_RG|uZb4#dw>4ZZmtfX<*!adw4E1Ui?_gp8ZwR4|jaLCm(nZ3{;SKB;n z5YOeRGK}`9rLLSA(X6+#neP?UD|>rSsLik}gFw{PM%xHOGGF*$;sG8~+Pmu?8O!Bs zt<@Z(nv5UvhA2zF&eeNY?b9q&+*fo7uX{+w72`;cOEK_B7wQ?q?BD!d|5!Fer@0~r z8@#S$&@!NVts-UPsL5b$`o0Lt9uGr7wmx^;>TpDN@{0S8C&Jn2U@7jb3;E~ZcB?6R zgzt96zpWimJxkrWbtuZ*^Qx{AB?D^=bFut-d1ILTe;lUiVVd+Vsd02u(kwyqECy*D zqSZTEC+Ry-Ts#9SE`3MhYddI|#=-Vh3jHvMB#kSC<)U!dxJoNJsQa48^h^tAdTRF$ zeUqXSv^P^Mena9E$x87QeP3V~&(Kd$YVn-7abl-WC@Kl9YLitEQ-*8~lZPo9wencR u)KSi00^@DvYqXaJ`-Lfkuq3Y2I)NK_N?((FJjN>hyCyIb#o;z#vwr|t5icnK literal 0 HcmV?d00001 diff --git a/src/out/production/main/Duke.class b/src/out/production/main/Duke.class new file mode 100644 index 0000000000000000000000000000000000000000..993d93ae6b0f7373bec6205a991870951549b8f6 GIT binary patch literal 1218 zcmZuxYflqF6g^uOhL$abmhuo$@PP%Cii&_m6nQARfTlpw_-Sd^vQT!(cB=S`{7fP= zk;EUM|4BWwEfmENX6`-r&bepK4*dA_?K^-eyo;b4lLC(;2w^geIHm-qBWT8qN}dR0 zR5BYuE1oK3PT-lqbJaetz)2OoP|JeAVk?#+Y?@KavcO9XqAWe%D%u*tX0{e)G&D=A zyjRu`F*g{PPFWHRRU8evx#=)&nRQ%8&S^-d%w6lFl`dIsF`bpZ;}$a`TkKo#3M7r0 zj%%+~_P1?+!`dzpiJM;DDs5T5qw+eav5>q#v~-xa52WL{9Hq-0hf-S1#mb(|y!C@q zvJWh|qqr{3))37~E5EmD9R%D0uLM?jlXJ?lz-tXne#PaQ3bgK94wLTG`^$Vm-SUf6 zkoZrT#96Q6=j~;RqK8W3xDsVx0ORy*(=pJGt2Daqt}0wJ(1TuH<;-0JZ(yp*s)0US z;UyH&xnvCk!9^V}t>&zGa@ni6h4Z?BHH;frSIb*9R#(T#FTH{{E)S)FdkXGo*tNdB zYv<)(Q0?pSo{g^a31=u3tgK%^^^#{5H1woKYSvYxQ%cYKzV*5OXnO1K26S=Nw`M* zIf0=G<5nEyoayTXUmdAx;pkB65tjFX&z+pr4>UC{__8 zdPL5C`gb4dOR7Ce?m@B-Bg{3*S?!4NryrfHC)p9l1QM7=7Z#{{h+Ts`GeP_YZjz76 za0|D&t7sT^pdrOLfzWRr4++EtMxY6d#xcf%&W5}E!*#B=dP6f1aGFaGIPS|dGsva#55N=o5rS8Itwonf_qy$ zNy0EvT0Ye4r7R!CGG}HS6{*M*Q7VgnN!P4YWz~!NMc%!q^3|w9hXj8ut4d^zZ*LDF zh>N;R<-KZ>Tjpyk@54oxFlbE(C;w4@%P@h%KeR=B*vH*tG-ux7+q=B_0B!i?z~>$` atkreVV|@0b!U0cgc{oJB$r>rN9v7(LS#wq2Hsm5Wy>$fYd^-cgE@SRrDH#*|C$DV*&S+l6MYLz z6cT>;06vp3ezV)eYBy$+-I+6I&N<(=Ge3S^d)gn`;MNs!IY{y0l8MzTf$T1-&YfX?K@57 zNQ#(NGD^lUoG)}6l3k4}67R1nZa21gGt@OO&tO*Nv2TkFN1L0W{-Q3}!XOqb^ue-l z8;cf}aL2+Ju2>j_#W3_-N);%dH@AeU%UUqli@Ryuvv3~|D95JP(hbUKdqbrwHcJ9?+aUPgee%3`NFP=hj>H{ z*;{|lST4`iN{$s6#*TPHl%;2L_0Cas8U>1bihBPl#OPso(Kh zvLV_hEK0D!Z6*B^15fFQRitbjHyNx=&l7&xZMsk^#C8GhOw?Wn&osKM#|1KTW!x38eIi zq)`g}7zh!%L>L0YC7Qh@Mv}gL#rbov;=(s1zJw%ww+F%{6FnqhlE`JkauFTF7@-+$ z)Q6kI^hg^eXiR6mE#D+|g4U*r#ji-5Az3M&A@v#A;yHQ<>YcxU0i0&jr^HG^yJjgW zC|rg{L*zL@PTF}iQffPAaFrhIe2v!9U_UWo;5upCpm_o}u|i*y)*oXPPl!7m@i0T! F>~H6?FrEMa literal 0 HcmV?d00001 diff --git a/src/out/production/main/Parser.class b/src/out/production/main/Parser.class new file mode 100644 index 0000000000000000000000000000000000000000..9503fc75f06feda19cf67e93c2907d287dcb8273 GIT binary patch literal 431 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 literal 0 HcmV?d00001 diff --git a/src/out/production/main/TaskList.class b/src/out/production/main/TaskList.class new file mode 100644 index 0000000000000000000000000000000000000000..a91a63e494c68fa433a36256f347e1ac9b22ae5c GIT binary patch literal 4323 zcmai1Yj7LY75>(iwUWHXwh}vWv7L1ZiDM@*0UC;J9FjN>Q9DktNiZoTYiVt7EbThd z%86-#wv@KK+R`>D;St)VG$k!<2*eI?fxaJfra$_(%<#K2onfXwI@3p>-`QQsaw5Wb zw7U21x%Zs&ecw4(e*684Zvwale~#fs98_UMFcw1vl2L3zN`)Ck7~?TMyp;)Ao{YeX z;cgs~$5aeyWMqpSgM;Z9x^P(Rvogw6V+gK1@?tV0FOJCQsJxw(9rw%Qb5VRA4@B@_ z3=iQ8V(>*3Uy}15jzLE<&LF=kTfP>-qbeSYVGSOS;0dvKQpML}=s+@pZ>acY3>)yc zil@Yy34Ke&w-r>Ut(-eFK4Rpiatay-4jD5>SKhVKU0btRV|IXVdlW>6tqI$3^I20t zOF5g~0XdXi)s&cL)TcZQR92gTO&BDEwZMl64D%;oXQxMwjq-aq) zVANUuEYnNq>L$?r(Mgjb1IH0sPlu^nobwvsCJ!xr#REh8Pj%) zQ;!NWOQb^dxryAQjM;v}HB}rZ)+y6SrHOaZKALfCcTx-#L|iLl?soE7VU)u`%jRNl zk{dkQV#9owGgA~o|nl<^s0D4!}sug4L`ss4L`(-8h(V+8h(tIG@QXtH2f4VYxtSG z_&IttoR!Bb@;E2kU)As$&MVlvW5&$RQaJX6ZrS=Q!`DR@`lON5$4t}Kvu4JbF;i{& z)>KN*P_er3lha*CpDvnw1)vudEKk@oM%qg0DH5QMJK2okwrTjK z7}xaYr_7=n6in~VWHMW}=!vx%J?CVzv-()x)!j*xK^yXMnE-RUX%kPI%}K%rSI922 zvs03)DMhwkw;kO!Ck)q`F+ImQ-AJdMBa&xMKVqiS%vA4QNACLrxhPmxrc2PEAOhy^ z8F;cE8arerr4$zTBwRCVun`mvvYf8OP)TwnyZy?dmc~7usg|8Gj}DE0Nd2*-qPhGS zf%p1PV|ya8u3QDyFNT+}U30=@D3NI+n=?6OPn_m{_fAg@3M%fh3QPT74`4Ly3F!%8 zUoaBP5~YmcvX*O(IDV0=Ez>ftj7|=Ya94m(V|$Q+*OLp#Nt>l?_jpZ)4fGzV zaBs4_U|#}0ts|~efO4sYzeIy8+89r_|#y3DjZ2Wj>if3%C7UIuRvaty!1ujxeB6$L9Y z#uWRQoiyD2mOIH2tJQYd`PP&{y{srI3BYB#3WyYV!{*_@wS5NugI@lYzkVhZihDhF1nFFQYv{5 zu+u}qCpfFXW`yKQ;5a1L0KX%A$BTo{+c?|DbzUCOJLaKuETCdEUOA7@c~o%{9z6$j z9+C5izCxP{^zj+z4xpOP2WiBiH~jEAwKS>Z3Vwqe}s?DR}m9G zm7bqQRB>Ee;-?PR(WCfk^v?@?@nmfGa_;9lKMq;h%qV;mc5t*4yMlQB%QM5Yv^(R~ zbI@+e(o$nGEHNjqRSI)x`2;ez_sVl9B-LJD`$&RXr)syYz>{1#dY;;pkjx`^s6tdAY6kO3-J5by8x`P$n&AQr#eqyl$Lfbt=;9kxSQG+?+ z@(}TRl)8I@|8gCt$WBmX&(ZP)s`n-A_mJJqQ@3&MYdJx!-o@Qgk!Ol%pDC*PRDkw1 zJZGP$>QIlfPX`)sP(7`Q`;S$;ztYQR8-Poj4m%- zot)0*I$5r$WLG+d6nQZDzri?OX2&^;NxT6Izo!EJiYdIqj`c3P)88?T zf8a3QLl*y}GX94dkNa_gek|ZV!jpXNr7ABKxxZB8{$EAz-z#$eZoqvP{=#?%*f4Hq z1P3?@^R%;!eSld==hH`hi{N7b literal 0 HcmV?d00001 diff --git a/src/out/production/main/TaskTest.class b/src/out/production/main/TaskTest.class new file mode 100644 index 0000000000000000000000000000000000000000..123cf563692fab1ec8f72d07ba58de2e0515b4d5 GIT binary patch literal 249 zcmXwz%?`m(5QWcFf2gAI26kBJ(t_AXtQr;?``fzVQf< z{STVeQI!NYj6`{kWLeGFZ1Zc8$d%Gpo&RET5;x(&ghgonA;H%;NJVxCHt|U&6$UW) nJzd1jc~+ZUP+N4Zg5l#;|qC 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 H4tM_oX1u?# literal 0 HcmV?d00001 diff --git a/src/out/test/test/TaskTest.class b/src/out/test/test/TaskTest.class new file mode 100644 index 0000000000000000000000000000000000000000..011aca40a7e042b5e0d322d3ddd8fc83cda648ef GIT binary patch literal 724 zcmZuv+iuf95Ivi?v1{B5Zdxc5>T+pQgmCIejY1Go#pMB61(7HckDFv0HaK>$*ZdbR z6oJGC@KK0a<0_S?A7(sf=bV{6+TVYE`~uKM!-kC;7H*o@ws6Zv6}K(y=zPbC%dm7Ixz%p_4y;y6)U$s{J`PMD+|vQ+h5jmF+CPdbRQZ${<)ugGU|);lRf@F&G_Xehx|JHRj_Z`^IS^7Q z$Zud2XLYyo6V(r{agHUo_6_EDSPLzex&Vt9%cNmpgBDrn)=S+D>d{l{#f(jg6>R+l D1R Date: Mon, 2 Sep 2019 21:37:03 +0800 Subject: [PATCH 16/51] Done jar. --- src/.idea/artifacts/src_jar.xml | 9 +++++++++ src/main/java/META-INF/MANIFEST.MF | 3 +++ src/out/artifacts/src_jar/src.jar | Bin 0 -> 14591 bytes src/out/production/main/META-INF/MANIFEST.MF | 3 +++ src/out/production/main1/META-INF/MANIFEST.MF | 3 +++ src/out/production/main1/todo.txt | 0 6 files changed, 18 insertions(+) create mode 100644 src/.idea/artifacts/src_jar.xml create mode 100644 src/main/java/META-INF/MANIFEST.MF create mode 100644 src/out/artifacts/src_jar/src.jar create mode 100644 src/out/production/main/META-INF/MANIFEST.MF create mode 100644 src/out/production/main1/META-INF/MANIFEST.MF create mode 100644 src/out/production/main1/todo.txt diff --git a/src/.idea/artifacts/src_jar.xml b/src/.idea/artifacts/src_jar.xml new file mode 100644 index 0000000000..0f80aa6c05 --- /dev/null +++ b/src/.idea/artifacts/src_jar.xml @@ -0,0 +1,9 @@ + + + $PROJECT_DIR$/out/artifacts/src_jar + + + + + + \ No newline at end of file diff --git a/src/main/java/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..9f37e4e0aa --- /dev/null +++ b/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: Duke + diff --git a/src/out/artifacts/src_jar/src.jar b/src/out/artifacts/src_jar/src.jar new file mode 100644 index 0000000000000000000000000000000000000000..edc0d09d26113ee4ed398803e919c86f83d7280a GIT binary patch literal 14591 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 Date: Mon, 2 Sep 2019 22:56:02 +0800 Subject: [PATCH 17/51] Done JavaDoc comments. --- src/main/java/Deadline.java | 13 +++++++++++++ src/main/java/Duke.java | 14 ++++++++++++++ src/main/java/DukeException.java | 6 ++++++ src/main/java/Event.java | 14 +++++++++++++- src/main/java/Parser.java | 3 +++ src/main/java/Storage.java | 12 +++++++++++- src/main/java/Task.java | 26 ++++++++++++++++++++++++++ src/main/java/Todo.java | 13 ++++++++++--- src/main/java/Ui.java | 21 +++++++++++++++++++-- 9 files changed, 115 insertions(+), 7 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index e4d4a0ad6f..378c12d6f4 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -2,11 +2,24 @@ public class Deadline extends Task { protected String by; + /** + * Constructor for Deadline task. + * + * @param description Deadline task to be added. + * @param by Date of the deadline task. + */ public Deadline(String description, String by) { super(description); this.by = by; } + /** + * Method to give the string that is to be + * added to the list of tasks. + * + * @return Returns the string to be loaded into + * the file and printed out. + */ @Override public String toString() { String date = formatDate(by); diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 4ddb511d34..a97dfebc7e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -10,6 +10,13 @@ public class Duke { private TaskList tasks; private Ui ui; + /** + * Constructor for Duke that takes in a file to add text into. + * + * @param filepath File that the task is added to. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ public Duke(String filepath) throws IOException { ui = new Ui(); storage = new Storage(filepath); @@ -21,11 +28,18 @@ public Duke(String filepath) throws IOException { } } + /** + * Contains the methods to start the bot and + * start to take in inputs for the bot + */ public void run() { ui.greeting(); ui.nextCommand(); } + /** + * Main method. + */ public static void main(String[] args) throws IOException{ new Duke("todo.txt").run(); } diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java index eeaf783477..fbd80cdcac 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/DukeException.java @@ -1,5 +1,11 @@ public class DukeException extends Exception { + /** + * Constructor for Duke Exceptions. + * + * @param message takes in the error and + * prints it out to the user. + */ public DukeException(String message) { super(message); } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 17f58f6dd4..aaf41a4003 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -6,12 +6,24 @@ public class Event extends Task { protected String when; protected boolean isValid; + /** + * Constructor for Event task. + * + * @param description Event task to be attended. + * @param when Date of the event. + */ public Event(String description, String when) { super(description); this.when = when; } - + /** + * Method to give the string that is to be + * added to the list of tasks. + * + * @return Returns the string to be loaded into + * the file and printed out. + */ @Override public String toString() { String date = formatDate(when); diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 78f0c8a323..2c35297fd6 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -4,6 +4,9 @@ public class Parser { Scanner sc = new Scanner(System.in); + /** + * Constructor for Parser class. + */ public Parser() { } diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index ae616d0d65..158fd246af 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -17,7 +17,7 @@ public Storage(String file) { * @param filepath File that the task is added to. * @param textToAdd Tasks that needs to be added. * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason + * does not exist but cannot be created, or cannot be opened for any other reason. */ public void addToFile(String filepath, String textToAdd) throws IOException { FileWriter typer = new FileWriter(filepath, true); @@ -83,6 +83,16 @@ public static int countLines(String filename) throws IOException { } } + /** + * Loads the task into the tasklist + * in TaskList from the file. + * + * @return ArrayList that has been copied from the file. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + * @throws DukeException If there is nothing in the file to be loaded, + * this exception will be thrown. + */ public ArrayList load() throws IOException, DukeException { File f = new File(file); Scanner sc = new Scanner(f); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 15cf1be826..f4c9e4b9e2 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -8,15 +8,27 @@ public class Task { protected boolean isDone; protected boolean isCorrectFormat; + /** + * Constructor for Task. + * + * @param description Takes in a string that is + * either Todo, Event or Deadline. + */ public Task(String description) { this.description = description; this.isDone = false; this.isCorrectFormat = false; } + /** + * Method to get whether that date is in correct format. + * + * @return Returns the boolean isCorrectFormat for the date. + */ public boolean getIsCorrectFormat() { return isCorrectFormat; } + /** * Returns tick or cross symbol. * @@ -57,6 +69,12 @@ public void printNumOfTasks() throws IOException { Ui.printLine(); } + /** + * Method to get the String for whether + * the task is done or not. + * + * @return Returns the tick or cross in brackets. + */ public String toString() { return "[" + getStatusIcon() + "]"; } @@ -70,6 +88,14 @@ public void printRemove() { System.out.println("Noted. I've removed this task."); } + /** + * Method to format the date into the appropriate format. + * For example, 10/02/2012 1800 to 10th of February 2012, 6:00 pm. + * + * @param date Takes in a valid date to format it. + * @return Returns the correctly formatted date with the + * appropriate strings. + */ public String formatDate(String date) { String formatted = date; if (!date.contains(")")) { diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 715c65153f..9e57638386 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,12 +1,19 @@ public class Todo extends Task { - //protected String by; - + /** + * Constructor for Todo task. + * @param description + */ public Todo(String description) { super(description); - //this.by = by; } + /** + * Method to get the string for Todo tasks. + * + * @return Returns the formatted string to + * be added into tasklist and file. + */ @Override public String toString() { return "[T]" + super.toString() + " " + description; diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 74e8c8e1c6..1a723efa6a 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -10,6 +10,16 @@ public class Ui { protected TaskList tL = new TaskList(new ArrayList<>()); protected Storage store = new Storage(Storage.file); + /** + * Constructor for Ui. + */ + public Ui() { + + } + + /** + * Prints the greeting at the initiation of the chat bot. + */ public void greeting() { String logo = " ____ _ \n" + " | _ \\ _ _| | _____ \n" + @@ -34,6 +44,10 @@ public void greeting() { printLine(); } + /** + * Scans the input from the user and does the respective + * command based on the input. Prints out error messages as well. + */ public void nextCommand() { while (scan.hasNext()) { try { @@ -105,8 +119,6 @@ public static void printIndent() { System.out.print(" "); } - // Prints the line. For better organisation. - /** * Prints line. * Helps to order the output and makes it @@ -188,6 +200,11 @@ public static int getNumOfTasks() throws IOException { return Storage.countLines(Storage.file); } + /** + * When there is nothing in the file, this method + * will print out to the user, telling them that there + * is no previous tasks saved in the file + */ public void showLoadingError() { printLine(); printIndent(); From 3bad8f83247a085b85d40f5f640ce216c9d60f26 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Tue, 3 Sep 2019 01:59:46 +0800 Subject: [PATCH 18/51] did some changes. --- src/main/java/Deadline.class | Bin 1122 -> 1122 bytes src/main/java/Duke.class | Bin 1018 -> 1018 bytes src/main/java/DukeException.class | Bin 226 -> 226 bytes src/main/java/Event.class | Bin 1140 -> 1140 bytes src/main/java/Parser.class | Bin 374 -> 374 bytes src/main/java/Storage.class | Bin 3449 -> 3449 bytes src/main/java/Task.class | Bin 2941 -> 2941 bytes src/main/java/TaskList.class | Bin 3769 -> 3867 bytes src/main/java/TaskList.java | 51 +++++++++++++++++++++++++++++- src/main/java/TaskTest.class | Bin 190 -> 0 bytes src/main/java/TaskTest.java | 2 -- src/main/java/Todo.class | Bin 804 -> 804 bytes src/main/java/Ui.class | Bin 5677 -> 5681 bytes src/main/java/todo.txt | 1 + 14 files changed, 51 insertions(+), 3 deletions(-) delete mode 100644 src/main/java/TaskTest.class delete mode 100644 src/main/java/TaskTest.java diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class index 49014f110ef300ac58d2588b2fffb92db5469837..17f52cca56d4fe9fd183f3ad0578c7fa86949a3b 100644 GIT binary patch delta 39 vcmaFF@rYx?d1g)?237`M1}+A^$v2qYc_kS*8Kf8l7^E5G8DuBxu$Tb=uA&C? delta 39 vcmaFF@rYx?d1g*F237`k1}+AU$v2qYd3hK(8F(2482A|E83ZQlu$Tb=s(=Qr diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index c84456548571ab69b12dcfe12464ecfa0da8145a..3a69bb46462831d8a2d53f542dce6c9ea216477f 100644 GIT binary patch delta 85 zcmWNII}SiV6aZ(fWFrw8#J7+vgHs9whRX- diff --git a/src/main/java/Parser.class b/src/main/java/Parser.class index 2d76b7d27b6b3e1184bbc6c41485d704049da81d..2b70682b878139bbb6252a765805d80abe3ef24e 100644 GIT binary patch delta 27 icmeyy^o?mlGNUjT0}BHygAfA`10w?;0|NsS13v&yl>=!2 delta 27 icmeyy^o?mlGNUj%0}BHygAfBJ10w?;0|NsS13v&yI|E|? diff --git a/src/main/java/Storage.class b/src/main/java/Storage.class index 7082da3af844fec28840142a34b69e550251f5a2..617e3ea4948b5dd33e1134a159d95ad6e5a0917f 100644 GIT binary patch delta 109 zcmew<^;2p?EKg!012;nwg9t+kgDgWTgE~VxgC0W$g9$?>gDpcAgAYSCLnuQI!x@G= zhC2-T3{M#f7+x?GF??hwX5?ciVH9U5Wt3tlXH;gWV02)pWb|aHVf10BW%OsLV+?1g NXG~&fn7of?HvmvI83_OY delta 109 zcmew<^;2p?EKg!M12;nig9t+ugDgWdgE~VjgC0X1g9$@CgDpb>gAYR@LnuQM!x@GY zhC2+Y3{M%-7+x@BFnnalWaMMWViae{W|U&cWmIO!V{~B1XY^z!V)S7sX7pz$VGL&| NWlUlyo4k)_Hvk-S7!Lpd diff --git a/src/main/java/Task.class b/src/main/java/Task.class index 580bec8fbedd446a8c94b8f1c2d822ee2c5920f0..db1af3a29be5f3450b622c6ec6297c927791d6dd 100644 GIT binary patch delta 243 zcmW-Yy-Px29EG1-*?VttqpK!3w5B-p0oVN4q;hrB8lpw9j8ZegC^aP9Tzu!YhL$LB z78IHT$DpNuqA95#at>#Bc+NC94Ze+(MU6H6t6U?jx6OoS0}q?} z!gTF8^CVa#DQ-%?nkjo%$Q};+^3CWUGihY?mgU+x;dwC+#5^3-tQDhOV2&bQN`yEe z!YOgeWH=M)oMS4ID%aHLa!HRmk6iI2H0S7?~3cDcMg)F)l;!w1-glcL37|3xb#mnDfJM~Z~F4#8AV2sPEQ4F#+k&z!7mqLO83=*5!6HF8c`iLlinC! zX7!EfI*WK%!pE}675!?aorIJm0aAoX>mM^^Wb~@#IyvciksBg6yLZ;K(b!^)ZEOn6 zu){pNB-j(M&ml$5C~-@fdk%P%(&UIIj(O&U7fxx5c;lKL=e%>l2bX+uMV~5P(g)P| Xrp_8rLH)|33B{aZ{eM~2vLF5c|J*J? diff --git a/src/main/java/TaskList.class b/src/main/java/TaskList.class index 43006db7bda1797820183b621696a5aa8d4dbe11..e14442d44386f5cecd590169165f150b17dd193d 100644 GIT binary patch delta 384 zcmYk$$t%Qh7{~GVl;StWFiIK5AX&p$in2RUvM(10Wt}WpvkdVUjIs2!kH`=wH8rO> zxcUQ}m9tXH*}>lE#zP5tl&_+`&jI%{K5N4{+=C}v+w zNX&tlLor8Uj>Q;tPsE&xITLd(=0eP+m@6@1G1p>l#N3Lx6B7}0FXlnalbGNiehE^c delta 524 zcmYk3+e=ho6vcmM7|-z>=PHeQa-2~VY^FP=E@{eX(C<149w>TH)-kHQj5Fw_32>NVjws?NWgL_5 zxN@EFHk{`zb;@-LhkEfg$a7l0GddgTAVV)_bt4r9o!VWr;^Q0`^_Yr;Wv@1vuw(v3 zp2hr;q_<(hd) z_pxP5LD*!`bfW`p#uLOfh>!Y7TtznSorjSUj%&Ny%v0Of+-_AAo^RP zzb*Q#T6IT4?sAEHyx=}>)chG9D*YoqXb39|vC1%8jPON*zB0-;4dy#f_`x_onP8iz O>`Lfwro6YISAPL+30Qdm diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 9bde5c261d..e4d0dfb2de 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -8,14 +8,31 @@ public class TaskList { protected Task tasking = new Task(""); protected Storage store = new Storage(Storage.file); + /** + * Constructor for TaskList. + */ public TaskList() { } + /** + * Overloaded Constructor for Task list in + * the event that a array list is available + * from the file. + * + * @param list Arraylist that contains all the tasks. + */ public TaskList(ArrayList list) { listOfTasks = list; } + /** + * Deletes the specified tasks off the task list. + * + * @param text Delete command with the which tasks to delete based of their numbering. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ public void deleteCommand(String text) throws IOException { int num = text.indexOf(" "); int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); @@ -47,6 +64,13 @@ public void deleteAllCommand(String text) throws IOException { Ui.printLine(); } + /** + * Adds todo task into arraylist and into file. + * + * @param text Takes in todo command with task. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ public void toDoCommand(String text) throws IOException { tasking.printGI(); Ui.printIndent(); @@ -58,11 +82,25 @@ public void toDoCommand(String text) throws IOException { tasking .printNumOfTasks(); } + /** + * Event command with event and date at which it is and adds + * it into the arraylist and file. + * + * @param text Takes in a event command with the task and date. + * @throws DukeException If the user inputs more than the normal + * number of days/months/time, this error will be thrown out instead. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ public void eventCommand(String text) throws DukeException, IOException { int num = text.indexOf("/"); int num1 = text.indexOf(" "); int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); - if (dayDate > 0 && dayDate <= 31) { + int monthDate = Integer.parseInt(text.substring(num + 7, num + 9)); + int timeHour = Integer.parseInt(text.substring(num + 15, num + 17)); + int timeMin = Integer.parseInt(text.substring(num + 17)); + if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 && + timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59 ) { Task task = new Event(text.substring(num1, num - 1), text.substring(num + 4)); String taskers = task.toString(); @@ -86,6 +124,17 @@ public void eventCommand(String text) throws DukeException, IOException { } } + + /** + * Deadline command with deadline task and date at which it is and adds + * it into the arraylist and file. + * + * @param text Takes in a deadline command with the task and date. + * @throws DukeException If the user inputs more than the normal + * number of days/months/time, this error will be thrown out instead. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ public void deadlineCommand(String text) throws DukeException, IOException { int num = text.indexOf("/"); int num1 = text.indexOf(" "); diff --git a/src/main/java/TaskTest.class b/src/main/java/TaskTest.class deleted file mode 100644 index 99735453f4b50958d7fa5c57e8a5c3c4dda10772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmX^0Z`VEs1_pBmUM>b^1}=66ZgvJ9Mg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H1Xc2v=}^X;E^jTPBFZ8*plqrR)1AWu+#UFeoxG0c`~VMj!;L2a;?+o-CNpz`&}toq=&9SehM3vH^u5N;!Zu H69Xpzz@8$7 diff --git a/src/main/java/TaskTest.java b/src/main/java/TaskTest.java deleted file mode 100644 index f5bcdcaf3c..0000000000 --- a/src/main/java/TaskTest.java +++ /dev/null @@ -1,2 +0,0 @@ -public class TaskTest { -} diff --git a/src/main/java/Todo.class b/src/main/java/Todo.class index 9948c020db7be873dc773c732ffb72e711971f70..c2c6aca21c936f4a6e9ecdd1f4a59b0a3cc5c973 100644 GIT binary patch delta 23 fcmZ3&wuEiNVJ21%237{n$tReM8HFeRVbTBqO``@v delta 23 fcmZ3&wuEiNVJ22K237`+$tReM8F?oEVbTBqO;-ju diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class index 83ab6e39ae54e10ceabbbafeed1b340a99f6451f..ba050566f993c38340db5c318ef52953ce44ccab 100644 GIT binary patch delta 443 zcmWNN%S+Tz6vsa&GqligW}LFr#wJ^oKPU2$mZoW97?zJ7N@E2^53!AvkNLHf0$81JTx9JNS(8)F3!_S1AR0yzy*eAVw`3sX9lOF z+Ci>c0XHm6mmTM(dBp5wlpZVNmQ8cVKGJJR?pcb5w#pOxPQU%&k*)LCHq>wO)cp_i zr9UHs0e3%mD)WVM4l4IcHyy0<52+hg>JhRT#m|`g7rb3Kfsa=*^jaa`P{><(ct@qy zu4c;J&27k<5%*q(K9J9>i{}nje$vf?CM}AMb4bx5Bqe1@sy>VRA{}3);TxSS)6EJo bQtm;h)mB|HRG0Nr{4eqA+T^#}4n=nWP^ns$ delta 439 zcmW-d%S#kc7{z~IW@+M#&N!x}nU6$k8s8curfH~PW+6=Eqi_>r+X@$!xij+xccHlw zA7q-6TI50`b(7RiQ2Ym6wQ(QVK@ME*ckXvC=bV+`Qt)e=*TSydTj%$27C5gn79SVL zAwZepqGkv*|QU7L(j&UYl!FvB@2Fspfzhj=0M)wVY6A9`0Ex^_E71 zWzcB(G+B`QRuH1uig{pDJhTN`?Hgg+vFquXY9%@&oA%sfA(LACdJ@_dKa4 zeq6cC7%^}LApi7{GxbEJYt#0tkA})dl6`| W4YwYsivKD7mh{_lvg4wXL;nHmrc{{# diff --git a/src/main/java/todo.txt b/src/main/java/todo.txt index e69de29bb2..67220f6728 100644 --- a/src/main/java/todo.txt +++ b/src/main/java/todo.txt @@ -0,0 +1 @@ +[E][?] qewq (at: 3rd of January 1234, 2:23 pm) From 8fd78d727aed204be1a84b30586e4adc6668ae49 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Tue, 3 Sep 2019 02:05:23 +0800 Subject: [PATCH 19/51] minor changes --- src/main/java/todo.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/todo.txt b/src/main/java/todo.txt index 67220f6728..e69de29bb2 100644 --- a/src/main/java/todo.txt +++ b/src/main/java/todo.txt @@ -1 +0,0 @@ -[E][?] qewq (at: 3rd of January 1234, 2:23 pm) From 52f5392b05ac2cd75174ba3e93093fb53bf46530 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Tue, 3 Sep 2019 02:07:31 +0800 Subject: [PATCH 20/51] Done JavaDocs --- src/main/java/Deadline.class | Bin 1122 -> 1122 bytes src/main/java/Deadline.java | 13 ++++++++ src/main/java/Duke.class | Bin 1018 -> 1018 bytes src/main/java/Duke.java | 14 ++++++++ src/main/java/DukeException.class | Bin 226 -> 226 bytes src/main/java/DukeException.java | 6 ++++ src/main/java/Event.class | Bin 1140 -> 1140 bytes src/main/java/Event.java | 14 +++++++- src/main/java/Parser.class | Bin 374 -> 374 bytes src/main/java/Parser.java | 3 ++ src/main/java/Storage.class | Bin 3449 -> 3449 bytes src/main/java/Storage.java | 12 ++++++- src/main/java/Task.class | Bin 2941 -> 2941 bytes src/main/java/Task.java | 26 +++++++++++++++ src/main/java/TaskList.class | Bin 3769 -> 3867 bytes src/main/java/TaskList.java | 51 +++++++++++++++++++++++++++++- src/main/java/TaskTest.class | Bin 190 -> 0 bytes src/main/java/TaskTest.java | 2 -- src/main/java/Todo.class | Bin 804 -> 804 bytes src/main/java/Todo.java | 13 ++++++-- src/main/java/Ui.class | Bin 5677 -> 5681 bytes src/main/java/Ui.java | 21 ++++++++++-- 22 files changed, 165 insertions(+), 10 deletions(-) delete mode 100644 src/main/java/TaskTest.class delete mode 100644 src/main/java/TaskTest.java diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class index 49014f110ef300ac58d2588b2fffb92db5469837..17f52cca56d4fe9fd183f3ad0578c7fa86949a3b 100644 GIT binary patch delta 39 vcmaFF@rYx?d1g)?237`M1}+A^$v2qYc_kS*8Kf8l7^E5G8DuBxu$Tb=uA&C? delta 39 vcmaFF@rYx?d1g*F237`k1}+AU$v2qYd3hK(8F(2482A|E83ZQlu$Tb=s(=Qr diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index e4d4a0ad6f..378c12d6f4 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -2,11 +2,24 @@ public class Deadline extends Task { protected String by; + /** + * Constructor for Deadline task. + * + * @param description Deadline task to be added. + * @param by Date of the deadline task. + */ public Deadline(String description, String by) { super(description); this.by = by; } + /** + * Method to give the string that is to be + * added to the list of tasks. + * + * @return Returns the string to be loaded into + * the file and printed out. + */ @Override public String toString() { String date = formatDate(by); diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index c84456548571ab69b12dcfe12464ecfa0da8145a..3a69bb46462831d8a2d53f542dce6c9ea216477f 100644 GIT binary patch delta 85 zcmWNII}SiV6aZ(fWFrw8#J7+vgHs9whRX- diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 17f58f6dd4..aaf41a4003 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -6,12 +6,24 @@ public class Event extends Task { protected String when; protected boolean isValid; + /** + * Constructor for Event task. + * + * @param description Event task to be attended. + * @param when Date of the event. + */ public Event(String description, String when) { super(description); this.when = when; } - + /** + * Method to give the string that is to be + * added to the list of tasks. + * + * @return Returns the string to be loaded into + * the file and printed out. + */ @Override public String toString() { String date = formatDate(when); diff --git a/src/main/java/Parser.class b/src/main/java/Parser.class index 2d76b7d27b6b3e1184bbc6c41485d704049da81d..2b70682b878139bbb6252a765805d80abe3ef24e 100644 GIT binary patch delta 27 icmeyy^o?mlGNUjT0}BHygAfA`10w?;0|NsS13v&yl>=!2 delta 27 icmeyy^o?mlGNUj%0}BHygAfBJ10w?;0|NsS13v&yI|E|? diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 78f0c8a323..2c35297fd6 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -4,6 +4,9 @@ public class Parser { Scanner sc = new Scanner(System.in); + /** + * Constructor for Parser class. + */ public Parser() { } diff --git a/src/main/java/Storage.class b/src/main/java/Storage.class index 7082da3af844fec28840142a34b69e550251f5a2..617e3ea4948b5dd33e1134a159d95ad6e5a0917f 100644 GIT binary patch delta 109 zcmew<^;2p?EKg!012;nwg9t+kgDgWTgE~VxgC0W$g9$?>gDpcAgAYSCLnuQI!x@G= zhC2-T3{M#f7+x?GF??hwX5?ciVH9U5Wt3tlXH;gWV02)pWb|aHVf10BW%OsLV+?1g NXG~&fn7of?HvmvI83_OY delta 109 zcmew<^;2p?EKg!M12;nig9t+ugDgWdgE~VjgC0X1g9$@CgDpb>gAYR@LnuQM!x@GY zhC2+Y3{M%-7+x@BFnnalWaMMWViae{W|U&cWmIO!V{~B1XY^z!V)S7sX7pz$VGL&| NWlUlyo4k)_Hvk-S7!Lpd diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index ae616d0d65..158fd246af 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -17,7 +17,7 @@ public Storage(String file) { * @param filepath File that the task is added to. * @param textToAdd Tasks that needs to be added. * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason + * does not exist but cannot be created, or cannot be opened for any other reason. */ public void addToFile(String filepath, String textToAdd) throws IOException { FileWriter typer = new FileWriter(filepath, true); @@ -83,6 +83,16 @@ public static int countLines(String filename) throws IOException { } } + /** + * Loads the task into the tasklist + * in TaskList from the file. + * + * @return ArrayList that has been copied from the file. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + * @throws DukeException If there is nothing in the file to be loaded, + * this exception will be thrown. + */ public ArrayList load() throws IOException, DukeException { File f = new File(file); Scanner sc = new Scanner(f); diff --git a/src/main/java/Task.class b/src/main/java/Task.class index 580bec8fbedd446a8c94b8f1c2d822ee2c5920f0..db1af3a29be5f3450b622c6ec6297c927791d6dd 100644 GIT binary patch delta 243 zcmW-Yy-Px29EG1-*?VttqpK!3w5B-p0oVN4q;hrB8lpw9j8ZegC^aP9Tzu!YhL$LB z78IHT$DpNuqA95#at>#Bc+NC94Ze+(MU6H6t6U?jx6OoS0}q?} z!gTF8^CVa#DQ-%?nkjo%$Q};+^3CWUGihY?mgU+x;dwC+#5^3-tQDhOV2&bQN`yEe z!YOgeWH=M)oMS4ID%aHLa!HRmk6iI2H0S7?~3cDcMg)F)l;!w1-glcL37|3xb#mnDfJM~Z~F4#8AV2sPEQ4F#+k&z!7mqLO83=*5!6HF8c`iLlinC! zX7!EfI*WK%!pE}675!?aorIJm0aAoX>mM^^Wb~@#IyvciksBg6yLZ;K(b!^)ZEOn6 zu){pNB-j(M&ml$5C~-@fdk%P%(&UIIj(O&U7fxx5c;lKL=e%>l2bX+uMV~5P(g)P| Xrp_8rLH)|33B{aZ{eM~2vLF5c|J*J? diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 15cf1be826..f4c9e4b9e2 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -8,15 +8,27 @@ public class Task { protected boolean isDone; protected boolean isCorrectFormat; + /** + * Constructor for Task. + * + * @param description Takes in a string that is + * either Todo, Event or Deadline. + */ public Task(String description) { this.description = description; this.isDone = false; this.isCorrectFormat = false; } + /** + * Method to get whether that date is in correct format. + * + * @return Returns the boolean isCorrectFormat for the date. + */ public boolean getIsCorrectFormat() { return isCorrectFormat; } + /** * Returns tick or cross symbol. * @@ -57,6 +69,12 @@ public void printNumOfTasks() throws IOException { Ui.printLine(); } + /** + * Method to get the String for whether + * the task is done or not. + * + * @return Returns the tick or cross in brackets. + */ public String toString() { return "[" + getStatusIcon() + "]"; } @@ -70,6 +88,14 @@ public void printRemove() { System.out.println("Noted. I've removed this task."); } + /** + * Method to format the date into the appropriate format. + * For example, 10/02/2012 1800 to 10th of February 2012, 6:00 pm. + * + * @param date Takes in a valid date to format it. + * @return Returns the correctly formatted date with the + * appropriate strings. + */ public String formatDate(String date) { String formatted = date; if (!date.contains(")")) { diff --git a/src/main/java/TaskList.class b/src/main/java/TaskList.class index 43006db7bda1797820183b621696a5aa8d4dbe11..e14442d44386f5cecd590169165f150b17dd193d 100644 GIT binary patch delta 384 zcmYk$$t%Qh7{~GVl;StWFiIK5AX&p$in2RUvM(10Wt}WpvkdVUjIs2!kH`=wH8rO> zxcUQ}m9tXH*}>lE#zP5tl&_+`&jI%{K5N4{+=C}v+w zNX&tlLor8Uj>Q;tPsE&xITLd(=0eP+m@6@1G1p>l#N3Lx6B7}0FXlnalbGNiehE^c delta 524 zcmYk3+e=ho6vcmM7|-z>=PHeQa-2~VY^FP=E@{eX(C<149w>TH)-kHQj5Fw_32>NVjws?NWgL_5 zxN@EFHk{`zb;@-LhkEfg$a7l0GddgTAVV)_bt4r9o!VWr;^Q0`^_Yr;Wv@1vuw(v3 zp2hr;q_<(hd) z_pxP5LD*!`bfW`p#uLOfh>!Y7TtznSorjSUj%&Ny%v0Of+-_AAo^RP zzb*Q#T6IT4?sAEHyx=}>)chG9D*YoqXb39|vC1%8jPON*zB0-;4dy#f_`x_onP8iz O>`Lfwro6YISAPL+30Qdm diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 9bde5c261d..e4d0dfb2de 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -8,14 +8,31 @@ public class TaskList { protected Task tasking = new Task(""); protected Storage store = new Storage(Storage.file); + /** + * Constructor for TaskList. + */ public TaskList() { } + /** + * Overloaded Constructor for Task list in + * the event that a array list is available + * from the file. + * + * @param list Arraylist that contains all the tasks. + */ public TaskList(ArrayList list) { listOfTasks = list; } + /** + * Deletes the specified tasks off the task list. + * + * @param text Delete command with the which tasks to delete based of their numbering. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ public void deleteCommand(String text) throws IOException { int num = text.indexOf(" "); int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); @@ -47,6 +64,13 @@ public void deleteAllCommand(String text) throws IOException { Ui.printLine(); } + /** + * Adds todo task into arraylist and into file. + * + * @param text Takes in todo command with task. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ public void toDoCommand(String text) throws IOException { tasking.printGI(); Ui.printIndent(); @@ -58,11 +82,25 @@ public void toDoCommand(String text) throws IOException { tasking .printNumOfTasks(); } + /** + * Event command with event and date at which it is and adds + * it into the arraylist and file. + * + * @param text Takes in a event command with the task and date. + * @throws DukeException If the user inputs more than the normal + * number of days/months/time, this error will be thrown out instead. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ public void eventCommand(String text) throws DukeException, IOException { int num = text.indexOf("/"); int num1 = text.indexOf(" "); int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); - if (dayDate > 0 && dayDate <= 31) { + int monthDate = Integer.parseInt(text.substring(num + 7, num + 9)); + int timeHour = Integer.parseInt(text.substring(num + 15, num + 17)); + int timeMin = Integer.parseInt(text.substring(num + 17)); + if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 && + timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59 ) { Task task = new Event(text.substring(num1, num - 1), text.substring(num + 4)); String taskers = task.toString(); @@ -86,6 +124,17 @@ public void eventCommand(String text) throws DukeException, IOException { } } + + /** + * Deadline command with deadline task and date at which it is and adds + * it into the arraylist and file. + * + * @param text Takes in a deadline command with the task and date. + * @throws DukeException If the user inputs more than the normal + * number of days/months/time, this error will be thrown out instead. + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ public void deadlineCommand(String text) throws DukeException, IOException { int num = text.indexOf("/"); int num1 = text.indexOf(" "); diff --git a/src/main/java/TaskTest.class b/src/main/java/TaskTest.class deleted file mode 100644 index 99735453f4b50958d7fa5c57e8a5c3c4dda10772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmX^0Z`VEs1_pBmUM>b^1}=66ZgvJ9Mg}&U%)HDJJ4Oa(4b3n{1{UZ1lvG9rexJ;| zRKL>Pq|~C2#H1Xc2v=}^X;E^jTPBFZ8*plqrR)1AWu+#UFeoxG0c`~VMj!;L2a;?+o-CNpz`&}toq=&9SehM3vH^u5N;!Zu H69Xpzz@8$7 diff --git a/src/main/java/TaskTest.java b/src/main/java/TaskTest.java deleted file mode 100644 index f5bcdcaf3c..0000000000 --- a/src/main/java/TaskTest.java +++ /dev/null @@ -1,2 +0,0 @@ -public class TaskTest { -} diff --git a/src/main/java/Todo.class b/src/main/java/Todo.class index 9948c020db7be873dc773c732ffb72e711971f70..c2c6aca21c936f4a6e9ecdd1f4a59b0a3cc5c973 100644 GIT binary patch delta 23 fcmZ3&wuEiNVJ21%237{n$tReM8HFeRVbTBqO``@v delta 23 fcmZ3&wuEiNVJ22K237`+$tReM8F?oEVbTBqO;-ju diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 715c65153f..9e57638386 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,12 +1,19 @@ public class Todo extends Task { - //protected String by; - + /** + * Constructor for Todo task. + * @param description + */ public Todo(String description) { super(description); - //this.by = by; } + /** + * Method to get the string for Todo tasks. + * + * @return Returns the formatted string to + * be added into tasklist and file. + */ @Override public String toString() { return "[T]" + super.toString() + " " + description; diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class index 83ab6e39ae54e10ceabbbafeed1b340a99f6451f..ba050566f993c38340db5c318ef52953ce44ccab 100644 GIT binary patch delta 443 zcmWNN%S+Tz6vsa&GqligW}LFr#wJ^oKPU2$mZoW97?zJ7N@E2^53!AvkNLHf0$81JTx9JNS(8)F3!_S1AR0yzy*eAVw`3sX9lOF z+Ci>c0XHm6mmTM(dBp5wlpZVNmQ8cVKGJJR?pcb5w#pOxPQU%&k*)LCHq>wO)cp_i zr9UHs0e3%mD)WVM4l4IcHyy0<52+hg>JhRT#m|`g7rb3Kfsa=*^jaa`P{><(ct@qy zu4c;J&27k<5%*q(K9J9>i{}nje$vf?CM}AMb4bx5Bqe1@sy>VRA{}3);TxSS)6EJo bQtm;h)mB|HRG0Nr{4eqA+T^#}4n=nWP^ns$ delta 439 zcmW-d%S#kc7{z~IW@+M#&N!x}nU6$k8s8curfH~PW+6=Eqi_>r+X@$!xij+xccHlw zA7q-6TI50`b(7RiQ2Ym6wQ(QVK@ME*ckXvC=bV+`Qt)e=*TSydTj%$27C5gn79SVL zAwZepqGkv*|QU7L(j&UYl!FvB@2Fspfzhj=0M)wVY6A9`0Ex^_E71 zWzcB(G+B`QRuH1uig{pDJhTN`?Hgg+vFquXY9%@&oA%sfA(LACdJ@_dKa4 zeq6cC7%^}LApi7{GxbEJYt#0tkA})dl6`| W4YwYsivKD7mh{_lvg4wXL;nHmrc{{# diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 74e8c8e1c6..1a723efa6a 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -10,6 +10,16 @@ public class Ui { protected TaskList tL = new TaskList(new ArrayList<>()); protected Storage store = new Storage(Storage.file); + /** + * Constructor for Ui. + */ + public Ui() { + + } + + /** + * Prints the greeting at the initiation of the chat bot. + */ public void greeting() { String logo = " ____ _ \n" + " | _ \\ _ _| | _____ \n" + @@ -34,6 +44,10 @@ public void greeting() { printLine(); } + /** + * Scans the input from the user and does the respective + * command based on the input. Prints out error messages as well. + */ public void nextCommand() { while (scan.hasNext()) { try { @@ -105,8 +119,6 @@ public static void printIndent() { System.out.print(" "); } - // Prints the line. For better organisation. - /** * Prints line. * Helps to order the output and makes it @@ -188,6 +200,11 @@ public static int getNumOfTasks() throws IOException { return Storage.countLines(Storage.file); } + /** + * When there is nothing in the file, this method + * will print out to the user, telling them that there + * is no previous tasks saved in the file + */ public void showLoadingError() { printLine(); printIndent(); From b325ed95293c93e69ccb7e090460160d7c221be7 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Tue, 3 Sep 2019 02:24:51 +0800 Subject: [PATCH 21/51] Done Coding Standard. --- src/main/java/Event.class | Bin 1140 -> 1140 bytes src/main/java/Event.java | 1 - src/main/java/Storage.java | 28 ++++++++++++++++------------ src/main/java/Task.class | Bin 2941 -> 2949 bytes src/main/java/Task.java | 7 +++---- src/main/java/TaskList.class | Bin 3769 -> 3867 bytes src/main/java/TaskList.java | 21 ++++++++++++--------- src/main/java/Todo.class | Bin 804 -> 804 bytes src/main/java/Todo.java | 3 --- src/main/java/Ui.java | 20 ++++++++++++-------- src/main/java/todo.txt | 1 + 11 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/main/java/Event.class b/src/main/java/Event.class index 3c7e400110c11401ff37e73c80bb45cd109c1c20..d48ac454a294f2a2c9fd2701a0b6b3ca3ee75ee4 100644 GIT binary patch delta 25 gcmeyu@r7f9Aq%en11EzZg8+jNgFJ)CWIGl!080u4bpQYW delta 25 gcmeyu@r7f9Aq%e{11EzJg8+jtgFJ)iWIGl!082Imc>n+a diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 17f58f6dd4..681754e42a 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -11,7 +11,6 @@ public Event(String description, String when) { this.when = when; } - @Override public String toString() { String date = formatDate(when); diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index ae616d0d65..c0129f8a3c 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -16,8 +16,10 @@ public Storage(String file) { * * @param filepath File that the task is added to. * @param textToAdd Tasks that needs to be added. - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason + * @throws IOException If the named file exists but + * is a directory rather than a regular file, + * does not exist but cannot be created, or + * cannot be opened for any other reason. */ public void addToFile(String filepath, String textToAdd) throws IOException { FileWriter typer = new FileWriter(filepath, true); @@ -31,8 +33,10 @@ public void addToFile(String filepath, String textToAdd) throws IOException { * * @param filepath File that the task is added to. * @param textToAdd Tasks that needs to be added. - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. + * @throws IOException If the named file exists but + * is a directory rather than a regular file, + * does not exist but cannot be created, or + * cannot be opened for any other reason. */ public void writeToFile(String filepath, String textToAdd) throws IOException { FileWriter typer = new FileWriter(filepath); @@ -45,19 +49,19 @@ public void writeToFile(String filepath, String textToAdd) throws IOException { * * @param filename File that the tasks are in. * @return Returns the number of tasks. - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. + * @throws IOException If the named file exists but + * is a directory rather than a regular file, + * does not exist but cannot be created, or + * cannot be opened for any other reason. */ public static int countLines(String filename) throws IOException { try (InputStream inputs = new BufferedInputStream(new FileInputStream(filename))) { byte[] characters = new byte[1024]; - int readCharacters = inputs.read(characters); if (readCharacters == -1) { // no lines to read return 0; } - int count = 0; while (readCharacters == 1024) { for (int i = 0; i < 1024; ) { @@ -67,10 +71,8 @@ public static int countLines(String filename) throws IOException { } readCharacters = inputs.read(characters); } - // count remaining characters while (readCharacters != -1) { - //System.out.println(readCharacters); for (int i = 0; i < readCharacters; ++i) { if (characters[i] == '\n') { ++count; @@ -102,12 +104,14 @@ public ArrayList load() throws IOException, DukeException { break; case "D": int byIndex = task.indexOf("("); - Task deadline = new Deadline(task.substring(spaceIndex, byIndex - 1), task.substring(byIndex + 4)); + Task deadline = new Deadline(task.substring(spaceIndex, byIndex - 1), + task.substring(byIndex + 4)); taskList.add(deadline); break; case "E": int atIndex = task.indexOf("("); - Task event = new Event(task.substring(spaceIndex, atIndex - 1), task.substring(atIndex + 4)); + Task event = new Event(task.substring(spaceIndex, atIndex - 1), + task.substring(atIndex + 4)); taskList.add(event); break; } diff --git a/src/main/java/Task.class b/src/main/java/Task.class index 580bec8fbedd446a8c94b8f1c2d822ee2c5920f0..f17f02e45121981fde017d456bc2ff6e31da0cf3 100644 GIT binary patch delta 64 zcmew>)+)YX5r?!E12cm*0~>=510RDf10#bKg9QT=b10RDP10#bKg9QTEOclOqUncIP7Q6r zjix|X|A6M8IS7L0hR*iDIh@b)7JG2~xD^RALWF4s*<^?!Q9NRlame6YbMIllD4H(UI$%`ZFrv1cZNQ?I@q?{Qr*c`*es`(h5n9BQN}=17burX=QA h%!!y&F=t}V#gxTdh^dIFin$b16LTfzT1-RC-9J9kKfwS1 delta 404 zcmXAl*(-!$6vls}@qNu_jHQP8EHfsG8CxzWb72?8mL;+bvWzXVlyV{0La8sx5_d$Y zF*I3k{Q<6(Yo*AYQXIK?JMTHqd!FC>>^pDLLvBsi@sdgjX>{Ub1Q$Uvn89uMv|xf4 zE4d_+hn;*J6c`uUy`>lh6*x1pW1SYe`H*G1Io@S_#H6%E>(LRCe2T6l=0x!9QR=-y zTCQtS!=&lTEtwF(8Akh)W_8Ql5=PaP2+99i#|iNwzr)+3D~8qPUhNWpC==ImY*Ywo zrEpi_qgu`y8mOg%I(n%mAh#*}EYip-O{~$v2CeMS#xCs~i1J8&drG&whIGt7B2ra~ zRQx8BNhL}O_`(_$CyU`yi}jcSy<*=d_WfcXppXFp8KjvZRv2be!rNw4){k*4A)Yf% jhzTB; 0 && dayDate <= 31) { + int monthDate = Integer.parseInt(text.substring(num + 7, num + 9)); + int timeHour = Integer.parseInt(text.substring(num + 15, num + 17)); + int timeMin = Integer.parseInt(text.substring(num + 17)); + if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 && + timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59 ) { Task task = new Event(text.substring(num1, num - 1), text.substring(num + 4)); String taskers = task.toString(); if (!taskers.equals("Invalid date format!")) { - tasking.printGI(); Ui.printIndent(); System.out.println(" " + taskers); diff --git a/src/main/java/Todo.class b/src/main/java/Todo.class index 9948c020db7be873dc773c732ffb72e711971f70..3393ea50c7db20666304236e25f66ebbb3362db6 100644 GIT binary patch delta 23 fcmZ3&wuEiNVJ21<237{v$tReM8968aVbTBqO$i1t delta 23 fcmZ3&wuEiNVJ22K237`+$tReM8F?oEVbTBqO;-ju diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 715c65153f..66c45345e7 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,10 +1,7 @@ public class Todo extends Task { - //protected String by; - public Todo(String description) { super(description); - //this.by = by; } @Override diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 74e8c8e1c6..efc227c4cd 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -20,7 +20,8 @@ public void greeting() { // Prints out greeting of the chat bot. printLine(); printIndent(); - System.out.println("Hello! My name is \n" + logo + "\n" + " What can I do for you? \n"); + System.out.println("Hello! My name is \n" + logo + "\n" + + " What can I do for you? \n"); printIndent(); System.out.println("I can only do these functions for now: \n \n" + " Todo \n" + " Eg. todo __(task)__\n" + @@ -53,8 +54,8 @@ public void nextCommand() { if (taskNumber > 0 && taskNumber <= TaskList.listOfTasks.size()) { printDone(taskNumber); } else { - throw new DukeException("☹ OOPS!!! There is no such task number in your list of tasks!! " + - "Please enter a valid number!"); + throw new DukeException("☹ OOPS!!! There is no such task " + + "number in your list of tasks!! Please enter a valid number!"); } } else if (splittedText[0].equals("delete")) { tL.deleteCommand(text); @@ -62,10 +63,10 @@ public void nextCommand() { if (splittedText[0].equals("todo")) { tL.toDoCommand(text); } else if (splittedText[0].equals("deadline") && - text.contains("/") && text.contains("by")) { // what if there is no deadline + text.contains("/") && text.contains("by")) { tL.deadlineCommand(text); } else if (splittedText[0].equals("event") && - text.contains("/") && text.contains("at")) { // what if there is no date + text.contains("/") && text.contains("at")) { tL.eventCommand(text); } else { printLine(); @@ -114,7 +115,8 @@ public static void printIndent() { */ public static void printLine() { printIndent(); - System.out.println("___________________________________________________________________"); + System.out.println("_____________________" + + "______________________________________________"); } /** @@ -181,8 +183,10 @@ private static void printList() throws FileNotFoundException { * Gets the number of task inside the file. * * @return Number of tasks. - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. + * @throws IOException If the named file exists + * but is a directory rather than a regular file, + * does not exist but cannot be created, or + * cannot be opened for any other reason. */ public static int getNumOfTasks() throws IOException { return Storage.countLines(Storage.file); diff --git a/src/main/java/todo.txt b/src/main/java/todo.txt index e69de29bb2..5ff96cc1b3 100644 --- a/src/main/java/todo.txt +++ b/src/main/java/todo.txt @@ -0,0 +1 @@ +[D][?] rer (by: 1st of January 2011, 11:00 pm) From 49db2a47096ce6ae9b2d77cd0f899c7a7006f1e0 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Tue, 3 Sep 2019 15:11:49 +0800 Subject: [PATCH 22/51] Done Level 9 feature (find). --- src/main/java/Ui.class | Bin 5677 -> 6601 bytes src/main/java/Ui.java | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class index 83ab6e39ae54e10ceabbbafeed1b340a99f6451f..e049a415f864bfa3a774b381354a2c6c69210e82 100644 GIT binary patch delta 3489 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 P|AeOh)EbXjVR{Bt delta 2688 zcmZve349dQ8NmNyqMbWh_ ztt~3pPOXHtUT9Z2R03>Lun5{(KwGG^X`!u(_O7+36+B|UH@gI}-QO?o``-7y`r?guW4=XG9wWO3N!h{;if(Xuqws3@vl5nB_hT%D+IsH_!AW88aE z-D19A@}kL)y~_eI^%L)&K*W0}*gH9&1&SUY6=*g&=5U;!I?U%KhfnZHg*7MEva-6q zB_Srx3ruQmj;+;H&3eLNE}v4EwTY(Y*s{38&-l51=yaIJrxkaU>E9yx`AC^pV%$9H zGc0h3>*E*vQc*a$sVUKtXpXI_i6@pf)wLAla?;|I!>{dQ?JOMx_V`N+D%L2s}l9ziQJ~~{97wC5>0i& z@|MP}x_GRvp}sLLHYyc?C2Jl2qaSkOYvPTPzCcW}^){W}MzhM`3{AU_nYVPn zdgGnBK||&2zSns(V3{gctGB(A1;do%1q=5Y`HI0_S>a&sbYXe2R^}Um7`kT!Gjv1v zQ0gx*Pa0QxPR@mLn@f&hFtVZ@Rk5GIyf%XE7<?-6gSA}iVdjrf+q`?U&}FRze+=q*O=5Ej@Sb zpHiD6?g0N97706&rYxn_N8EvF2DS2vk6c_64UTZjeXc5>GPo*IY9tqz<}6NgNe4ql z8^y-`^eQ&m7@B6-R`QCC4k}XQ?asb7jV#2Qs8cO`s~8X54nE z1~cU^$mr$M1rEx2zIltls{Y0)-7dqUSw9B`t5THojAk7yGUOVL`d)ZDi^`J{@_22+ zH}Hwl`umMV5S;I zwTe=sD!E3D;9B({*Q;&JQG1xH4#<8y%wln2p?Z-U)Cm@;PPw0y?@>%#xPm^s$HgW~ z!bM%oFj=b9Swey0Wbu$8?@$nUpGtXD`T2H9C=@zFXtGINz6^z|*6h3u_U8aXk_>lJ zn#t#AjF==11)fk^tpD1`6cE>#{*gdMBmaMHzQXhBq>nO%nc!Zrc;Hwo5YM|3B@?bDKgG zXLiwj63%8RS1T8>MM9AekfcH{yaVzQ6u97AN@RvV-bz^4W0v@uVvH|gX4_pe zOD{&*kk?ilS4j)^ZYAqYiQM|^OLCpR$kqo`>Vwxsu`W-hdB;gU;bAekRkHhtMExlJ zNHK`VqxF z(xk(Z`pbhZkZfVu&mCO9L(t4}&h;Oj?v|S%_f_2;GE(HVV8OX`xbAET{d|9A@_A4K qI3xi)E8#pR_-92VK(h)7v?*1}RC&sxFJBTuSf0KtTJP}BAO06xtwH$! diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 74e8c8e1c6..b4694b9c5d 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -7,7 +7,7 @@ public class Ui { protected Scanner scan = new Scanner(System.in); - protected TaskList tL = new TaskList(new ArrayList<>()); + protected TaskList tL = new TaskList(); protected Storage store = new Storage(Storage.file); public void greeting() { @@ -58,6 +58,9 @@ public void nextCommand() { } } else if (splittedText[0].equals("delete")) { tL.deleteCommand(text); + } else if (splittedText[0].equals("find")) { + ArrayList strList = findCommand(splittedText[1]); + printKeywordList(strList); } else { if (splittedText[0].equals("todo")) { tL.toDoCommand(text); @@ -193,4 +196,37 @@ public void showLoadingError() { printIndent(); System.out.println("Nothing in file!"); } + + public ArrayList findCommand(String wordToFind) throws IOException, DukeException { + File f = new File(Storage.file); + Scanner sc =new Scanner(f); + ArrayList tempList = new ArrayList<>(); + if (Storage.countLines(Storage.file) == 0) { + printIndent(); + throw new DukeException("No such word is found in any of the tasks."); + } else { + int num = 1; + while (sc.hasNext()) { + String text = sc.nextLine(); + if (text.contains(wordToFind)) { + String task = num + "." + text; + tempList.add(task); + num++; + } + } + } + System.out.println("5"); + return tempList; + } + + public void printKeywordList(ArrayList list) { + printLine(); + printIndent(); + System.out.println("Here are the matching tasks in your list!"); + for (String str : list) { + printIndent(); + System.out.println(str); + } + printLine(); + } } \ No newline at end of file From 3cd78155e5d624540cc24d18c843641de6bb2d8a Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Thu, 5 Sep 2019 19:30:23 +0800 Subject: [PATCH 23/51] Added Gradle. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e5b8ce7e49..5cb1781ca1 100644 --- a/build.gradle +++ b/build.gradle @@ -12,5 +12,5 @@ repositories { application { // Change this to your main class. - mainClassName = "seedu.duke.Duke" + mainClassName = "Duke" } From 26474d545dc9d025b4fb4d60e78e6a2332f2c791 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Thu, 5 Sep 2019 21:11:48 +0800 Subject: [PATCH 24/51] Added Checkstyle. --- build.gradle | 5 ++ src/main/java/Deadline.java | 2 +- src/main/java/Duke.java | 6 +- src/main/java/DukeException.java | 2 +- src/main/java/Event.java | 2 +- src/main/java/Storage.java | 72 ++++++++++--------- src/main/java/Task.java | 10 +-- src/main/java/TaskList.java | 38 +++++----- src/main/java/Todo.java | 2 +- src/main/java/Ui.java | 116 ++++++++++++++++++------------- src/main/java/todo.txt | 1 - 11 files changed, 144 insertions(+), 112 deletions(-) diff --git a/build.gradle b/build.gradle index 5cb1781ca1..2353702ab4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,11 @@ plugins { id 'java' id 'application' + id 'checkstyle' +} + +checkstyle { + toolVersion = '8.23' } group 'seedu.duke' diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 378c12d6f4..524555e10e 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -18,7 +18,7 @@ public Deadline(String description, String by) { * added to the list of tasks. * * @return Returns the string to be loaded into - * the file and printed out. + * the file and printed out. */ @Override public String toString() { diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a97dfebc7e..4aa0f7ecb2 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -15,7 +15,7 @@ public class Duke { * * @param filepath File that the task is added to. * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. + * does not exist but cannot be created, or cannot be opened for any other reason. */ public Duke(String filepath) throws IOException { ui = new Ui(); @@ -30,7 +30,7 @@ public Duke(String filepath) throws IOException { /** * Contains the methods to start the bot and - * start to take in inputs for the bot + * start to take in inputs for the bot. */ public void run() { ui.greeting(); @@ -40,7 +40,7 @@ public void run() { /** * Main method. */ - public static void main(String[] args) throws IOException{ + public static void main(String[] args) throws IOException { new Duke("todo.txt").run(); } diff --git a/src/main/java/DukeException.java b/src/main/java/DukeException.java index fbd80cdcac..4289ae7d85 100644 --- a/src/main/java/DukeException.java +++ b/src/main/java/DukeException.java @@ -4,7 +4,7 @@ public class DukeException extends Exception { * Constructor for Duke Exceptions. * * @param message takes in the error and - * prints it out to the user. + * prints it out to the user. */ public DukeException(String message) { super(message); diff --git a/src/main/java/Event.java b/src/main/java/Event.java index aaf41a4003..ef30388853 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -22,7 +22,7 @@ public Event(String description, String when) { * added to the list of tasks. * * @return Returns the string to be loaded into - * the file and printed out. + * the file and printed out. */ @Override public String toString() { diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index 5371afae15..1bed9dffcd 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -1,5 +1,9 @@ -import java.io.*; -import java.io.BufferedReader; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.Scanner; @@ -17,14 +21,14 @@ public Storage(String file) { * @param filepath File that the task is added to. * @param textToAdd Tasks that needs to be added. * @throws IOException If the named file exists but - * is a directory rather than a regular file, - * does not exist but cannot be created, or - * cannot be opened for any other reason. + * is a directory rather than a regular file, + * does not exist but cannot be created, or + * cannot be opened for any other reason. */ public void addToFile(String filepath, String textToAdd) throws IOException { - FileWriter typer = new FileWriter(filepath, true); - typer.write(textToAdd + System.lineSeparator()); - typer.close(); + FileWriter typer = new FileWriter(filepath, true); + typer.write(textToAdd + System.lineSeparator()); + typer.close(); } /** @@ -34,9 +38,9 @@ public void addToFile(String filepath, String textToAdd) throws IOException { * @param filepath File that the task is added to. * @param textToAdd Tasks that needs to be added. * @throws IOException If the named file exists but - * is a directory rather than a regular file, - * does not exist but cannot be created, or - * cannot be opened for any other reason. + * is a directory rather than a regular file, + * does not exist but cannot be created, or + * cannot be opened for any other reason. */ public void writeToFile(String filepath, String textToAdd) throws IOException { FileWriter typer = new FileWriter(filepath); @@ -50,9 +54,9 @@ public void writeToFile(String filepath, String textToAdd) throws IOException { * @param filename File that the tasks are in. * @return Returns the number of tasks. * @throws IOException If the named file exists but - * is a directory rather than a regular file, - * does not exist but cannot be created, or - * cannot be opened for any other reason. + * is a directory rather than a regular file, + * does not exist but cannot be created, or + * cannot be opened for any other reason. */ public static int countLines(String filename) throws IOException { try (InputStream inputs = new BufferedInputStream(new FileInputStream(filename))) { @@ -87,13 +91,13 @@ public static int countLines(String filename) throws IOException { /** * Loads the task into the tasklist - * in TaskList from the file. + * in TaskList from the file. * * @return ArrayList that has been copied from the file. * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. + * does not exist but cannot be created, or cannot be opened for any other reason. * @throws DukeException If there is nothing in the file to be loaded, - * this exception will be thrown. + * this exception will be thrown. */ public ArrayList load() throws IOException, DukeException { File f = new File(file); @@ -108,22 +112,24 @@ public ArrayList load() throws IOException, DukeException { String taskType = task.substring(index + 1, index + 2); int spaceIndex = task.indexOf(" "); switch (taskType) { - case "T": - Task toDo = new Todo(task.substring(spaceIndex)); - taskList.add(toDo); - break; - case "D": - int byIndex = task.indexOf("("); - Task deadline = new Deadline(task.substring(spaceIndex, byIndex - 1), - task.substring(byIndex + 4)); - taskList.add(deadline); - break; - case "E": - int atIndex = task.indexOf("("); - Task event = new Event(task.substring(spaceIndex, atIndex - 1), - task.substring(atIndex + 4)); - taskList.add(event); - break; + case "T": + Task toDo = new Todo(task.substring(spaceIndex)); + taskList.add(toDo); + break; + case "D": + int byIndex = task.indexOf("("); + Task deadline = new Deadline(task.substring(spaceIndex, byIndex - 1), + task.substring(byIndex + 4)); + taskList.add(deadline); + break; + case "E": + int atIndex = task.indexOf("("); + Task event = new Event(task.substring(spaceIndex, atIndex - 1), + task.substring(atIndex + 4)); + taskList.add(event); + break; + default: + break; } } Ui.printIndent(); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 4ec89ba4f2..a70f1dd5b3 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -12,7 +12,7 @@ public class Task { * Constructor for Task. * * @param description Takes in a string that is - * either Todo, Event or Deadline. + * either Todo, Event or Deadline. */ public Task(String description) { this.description = description; @@ -59,12 +59,12 @@ public void printGI() { * Prints the number of tasks in the list. * * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. + * does not exist but cannot be created, or cannot be opened for any other reason. */ public void printNumOfTasks() throws IOException { Ui.printIndent(); - System.out.println("Now you have " + - Ui.getNumOfTasks() + " tasks in the list."); + System.out.println("Now you have " + + Ui.getNumOfTasks() + " tasks in the list."); Ui.printLine(); } @@ -93,7 +93,7 @@ public void printRemove() { * * @param date Takes in a valid date to format it. * @return Returns the correctly formatted date with the - * appropriate strings. + * appropriate strings. */ public String formatDate(String date) { String formatted = date; diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index c5a065fcc6..edfc6495f9 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -31,7 +31,7 @@ public TaskList(ArrayList list) { * * @param text Delete command with the which tasks to delete based of their numbering. * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. + * does not exist but cannot be created, or cannot be opened for any other reason. */ public void deleteCommand(String text) throws IOException { int num = text.indexOf(" "); @@ -50,17 +50,17 @@ public void deleteCommand(String text) throws IOException { * Deletes everything off the task list. * * @throws IOException If the named file exists - * but is a directory rather than a regular file, - * does not exist but cannot be created, - * or cannot be opened for any other reason. + * but is a directory rather than a regular file, + * does not exist but cannot be created, + * or cannot be opened for any other reason. */ public void deleteAllCommand(String text) throws IOException { store.writeToFile(Storage.file, ""); listOfTasks.clear(); Ui.printLine(); Ui.printIndent(); - System.out.println("Everything in your list has been removed! " + - "Add more tasks to get started again!!!"); + System.out.println("Everything in your list has been removed! " + + "Add more tasks to get started again!!!"); Ui.printLine(); } @@ -69,7 +69,7 @@ public void deleteAllCommand(String text) throws IOException { * * @param text Takes in todo command with task. * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. + * does not exist but cannot be created, or cannot be opened for any other reason. */ public void toDoCommand(String text) throws IOException { tasking.printGI(); @@ -88,9 +88,9 @@ public void toDoCommand(String text) throws IOException { * * @param text Takes in a event command with the task and date. * @throws DukeException If the user inputs more than the normal - * number of days/months/time, this error will be thrown out instead. + * number of days/months/time, this error will be thrown out instead. * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. + * does not exist but cannot be created, or cannot be opened for any other reason. */ public void eventCommand(String text) throws DukeException, IOException { int num = text.indexOf("/"); @@ -99,8 +99,8 @@ public void eventCommand(String text) throws DukeException, IOException { int monthDate = Integer.parseInt(text.substring(num + 7, num + 9)); int timeHour = Integer.parseInt(text.substring(num + 15, num + 17)); int timeMin = Integer.parseInt(text.substring(num + 17)); - if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 && - timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59 ) { + if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 + && timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59) { Task task = new Event(text.substring(num1, num - 1), text.substring(num + 4)); String taskers = task.toString(); @@ -118,8 +118,8 @@ public void eventCommand(String text) throws DukeException, IOException { } else { Ui.printLine(); Ui.printIndent(); - throw new DukeException("Hmmm?? I'm sorry but there are at most 31 days in a month! " + - "And remember, no negative dates allowed as well!!! :)"); + throw new DukeException("Hmmm?? I'm sorry but there are at most 31 days in a month! " + + "And remember, no negative dates allowed as well!!! :)"); } } @@ -130,9 +130,9 @@ public void eventCommand(String text) throws DukeException, IOException { * * @param text Takes in a deadline command with the task and date. * @throws DukeException If the user inputs more than the normal - * number of days/months/time, this error will be thrown out instead. + * number of days/months/time, this error will be thrown out instead. * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. + * does not exist but cannot be created, or cannot be opened for any other reason. */ public void deadlineCommand(String text) throws DukeException, IOException { int num = text.indexOf("/"); @@ -141,8 +141,8 @@ public void deadlineCommand(String text) throws DukeException, IOException { int monthDate = Integer.parseInt(text.substring(num + 7, num + 9)); int timeHour = Integer.parseInt(text.substring(num + 15, num + 17)); int timeMin = Integer.parseInt(text.substring(num + 17)); - if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 && - timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59 ) { + if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 + && timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59) { Task task = new Deadline(text.substring(num1, num - 1), text.substring(num + 4)); String taskers = task.toString(); @@ -160,8 +160,8 @@ public void deadlineCommand(String text) throws DukeException, IOException { } else { Ui.printLine(); Ui.printIndent(); - throw new DukeException("Hmmm?? I'm sorry but there are at most 31 days in a month! " + - "And remember, no negative dates allowed as well!!! :)"); + throw new DukeException("Hmmm?? I'm sorry but there are at most 31 days in a month! " + + "And remember, no negative dates allowed as well!!! :)"); } } } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index bcceeb9dc2..04f074eeff 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -13,7 +13,7 @@ public Todo(String description) { * Method to get the string for Todo tasks. * * @return Returns the formatted string to - * be added into tasklist and file. + * be added into tasklist and file. */ @Override public String toString() { diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 2450a0102e..a6a7a7f6c1 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -7,7 +7,7 @@ public class Ui { protected Scanner scan = new Scanner(System.in); - protected TaskList tL = new TaskList(); + protected TaskList listTask = new TaskList(); protected Storage store = new Storage(Storage.file); /** @@ -21,25 +21,25 @@ public Ui() { * Prints the greeting at the initiation of the chat bot. */ public void greeting() { - String logo = " ____ _ \n" + - " | _ \\ _ _| | _____ \n" + - " | | | | | | | |/ / _ \\\n" + - " | |_| | |_| | < __/\n" + - " |____/ \\__,_|_|\\_\\___|\n"; + String logo = " ____ _ \n" + + " | _ \\ _ _| | _____ \n" + + " | | | | | | | |/ / _ \\\n" + + " | |_| | |_| | < __/\n" + + " |____/ \\__,_|_|\\_\\___|\n"; // Prints out greeting of the chat bot. printLine(); printIndent(); - System.out.println("Hello! My name is \n" + logo + "\n" + - " What can I do for you? \n"); + System.out.println("Hello! My name is \n" + logo + "\n" + + " What can I do for you? \n"); printIndent(); - System.out.println("I can only do these functions for now: \n \n" + - " Todo \n" + " Eg. todo __(task)__\n" + - " Event \n" + " Eg. event __(task)__ /at _(dd/MM/yyyy)_(hhmm)__\n" + - " Deadline \n" + " Eg. deadline __(task)__ /by _(dd/MM/yyyy)_(hhmm)__\n" + - " Delete \n" + " Eg. delete __(number)__ or delete all\n" + - " Done \n" + " Eg. done __(number)__\n" + - " List \n"); + System.out.println("I can only do these functions for now: \n \n" + + " Todo \n" + " Eg. todo __(task)__\n" + + " Event \n" + " Eg. event __(task)__ /at _(dd/MM/yyyy)_(hhmm)__\n" + + " Deadline \n" + " Eg. deadline __(task)__ /by _(dd/MM/yyyy)_(hhmm)__\n" + + " Delete \n" + " Eg. delete __(number)__ or delete all\n" + + " Done \n" + " Eg. done __(number)__\n" + + " List \n"); printIndent(); System.out.println("Ill be adding in more features soon! Please be patient! :)"); printLine(); @@ -59,7 +59,7 @@ public void nextCommand() { } else if (text.equals("list")) { printList(); } else if (text.equals("delete all")) { - tL.deleteAllCommand(text); + listTask.deleteAllCommand(text); } else if (text.contains(" ")) { String[] splittedText = text.split(" "); if (splittedText[0].equals("done")) { @@ -68,23 +68,23 @@ public void nextCommand() { if (taskNumber > 0 && taskNumber <= TaskList.listOfTasks.size()) { printDone(taskNumber); } else { - throw new DukeException("☹ OOPS!!! There is no such task " + - "number in your list of tasks!! Please enter a valid number!"); + throw new DukeException("☹ OOPS!!! There is no such task " + + "number in your list of tasks!! Please enter a valid number!"); } } else if (splittedText[0].equals("delete")) { - tL.deleteCommand(text); + listTask.deleteCommand(text); } else if (splittedText[0].equals("find")) { ArrayList strList = findCommand(splittedText[1]); printKeywordList(strList); } else { if (splittedText[0].equals("todo")) { - tL.toDoCommand(text); - } else if (splittedText[0].equals("deadline") && - text.contains("/") && text.contains("by")) { - tL.deadlineCommand(text); - } else if (splittedText[0].equals("event") && - text.contains("/") && text.contains("at")) { - tL.eventCommand(text); + listTask.toDoCommand(text); + } else if (splittedText[0].equals("deadline") + && text.contains("/") && text.contains("by")) { + listTask.deadlineCommand(text); + } else if (splittedText[0].equals("event") + && text.contains("/") && text.contains("at")) { + listTask.eventCommand(text); } else { printLine(); printIndent(); @@ -95,17 +95,17 @@ public void nextCommand() { printLine(); printIndent(); switch (text) { - case "todo": - throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. " + - "It must be in proper format (i.e. todo clean table)."); - case "deadline": - throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. " + - "It must be in proper format (i.e. deadline return book /by 23 Aug)."); - case "event": - throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. " + - "It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); - default: - throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); + case "todo": + throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. " + + "It must be in proper format (i.e. todo clean table)."); + case "deadline": + throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. " + + "It must be in proper format (i.e. deadline return book /by 23 Aug)."); + case "event": + throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. " + + "It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); + default: + throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); } } } catch (DukeException | IOException e) { @@ -130,8 +130,8 @@ public static void printIndent() { */ public static void printLine() { printIndent(); - System.out.println("_____________________" + - "______________________________________________"); + System.out.println("_____________________________" + + "______________________________________"); } /** @@ -150,12 +150,12 @@ private static void printBye() { * @param i To indicate which task number is done. */ private static void printDone(int i) { - TaskList.listOfTasks.get(i-1).markAsDone(); + TaskList.listOfTasks.get(i - 1).markAsDone(); printLine(); printIndent(); System.out.println("Nice! I've marked this task as done:"); printIndent(); - System.out.println(TaskList.listOfTasks.get(i-1).toString()); + System.out.println(TaskList.listOfTasks.get(i - 1).toString()); printLine(); } @@ -166,7 +166,7 @@ private static void printDone(int i) { */ public static void printDelete(int i) { printIndent(); - System.out.println(TaskList.listOfTasks.get(i-1).toString()); + System.out.println(TaskList.listOfTasks.get(i - 1).toString()); printLine(); } @@ -199,9 +199,9 @@ private static void printList() throws FileNotFoundException { * * @return Number of tasks. * @throws IOException If the named file exists - * but is a directory rather than a regular file, - * does not exist but cannot be created, or - * cannot be opened for any other reason. + * but is a directory rather than a regular file, + * does not exist but cannot be created, or + * cannot be opened for any other reason. */ public static int getNumOfTasks() throws IOException { return Storage.countLines(Storage.file); @@ -210,7 +210,7 @@ public static int getNumOfTasks() throws IOException { /** * When there is nothing in the file, this method * will print out to the user, telling them that there - * is no previous tasks saved in the file + * is no previous tasks saved in the file. */ public void showLoadingError() { printLine(); @@ -218,9 +218,23 @@ public void showLoadingError() { System.out.println("Nothing in file!"); } + /** + * Method to find the keyword searched + * by the user. + * + * @param wordToFind Keyword entered by user. + * @return Returns an array list of tasks that contains the keyword. + * @throws IOException If the named file exists + * but is a directory rather than a regular file, + * does not exist but cannot be created, or + * cannot be opened for any other reason. + * @throws DukeException This will be thrown out if there + * is no matching words to the key word searched + * by the user in all the tasks. + */ public ArrayList findCommand(String wordToFind) throws IOException, DukeException { File f = new File(Storage.file); - Scanner sc =new Scanner(f); + Scanner sc = new Scanner(f); ArrayList tempList = new ArrayList<>(); if (Storage.countLines(Storage.file) == 0) { printIndent(); @@ -240,6 +254,14 @@ public ArrayList findCommand(String wordToFind) throws IOException, Duke return tempList; } + /** + * Prints the Start of the message that prints + * out the list of tasks that matches the keyword + * inputted by the user. + * + * @param list Prints out the array list of tasks + * that contains the keyword. + */ public void printKeywordList(ArrayList list) { printLine(); printIndent(); diff --git a/src/main/java/todo.txt b/src/main/java/todo.txt index 5ff96cc1b3..e69de29bb2 100644 --- a/src/main/java/todo.txt +++ b/src/main/java/todo.txt @@ -1 +0,0 @@ -[D][?] rer (by: 1st of January 2011, 11:00 pm) From ca17439e7b7f29b18dc25c07fc5be0cf2c18c90d Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Thu, 5 Sep 2019 21:13:47 +0800 Subject: [PATCH 25/51] Done --- src/main/java/Ui.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index a6a7a7f6c1..06ff859401 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -39,6 +39,7 @@ public void greeting() { + " Deadline \n" + " Eg. deadline __(task)__ /by _(dd/MM/yyyy)_(hhmm)__\n" + " Delete \n" + " Eg. delete __(number)__ or delete all\n" + " Done \n" + " Eg. done __(number)__\n" + + " Find \n" + " Eg. find __(keyword)__\n" + " List \n"); printIndent(); System.out.println("Ill be adding in more features soon! Please be patient! :)"); From 987507fe1c0a1f24bc21260d2eaf9d09c2900de5 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Fri, 13 Sep 2019 00:06:18 +0800 Subject: [PATCH 26/51] Done some changes --- build.gradle | 6 + gradle/wrapper/gradle-wrapper.properties | 5 +- src/main/java/Command.java | 14 ++ src/main/java/DialogBox.java | 22 +++ src/main/java/Duke.java | 204 ++++++++++++++++++++++- src/main/java/Event.java | 3 - src/main/java/Launcher.java | 11 ++ src/main/java/Parser.java | 21 ++- src/main/java/Task.java | 15 +- src/main/java/TaskList.java | 33 ++-- src/main/java/Ui.java | 32 ++-- src/main/resources/images/DaDuke.png | Bin 0 -> 32657 bytes src/main/resources/images/DaUser.png | Bin 0 -> 37794 bytes 13 files changed, 318 insertions(+), 48 deletions(-) create mode 100644 src/main/java/Command.java create mode 100644 src/main/java/DialogBox.java create mode 100644 src/main/java/Launcher.java create mode 100644 src/main/resources/images/DaDuke.png create mode 100644 src/main/resources/images/DaUser.png diff --git a/build.gradle b/build.gradle index 2353702ab4..060028e7ba 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,12 @@ plugins { id 'java' id 'application' id 'checkstyle' + id 'org.openjfx.javafxplugin' version '0.0.7' +} + +javafx { + version = "11.0.2" + modules = [ 'javafx.controls', 'javafx.fxml' ] } checkstyle { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4b7e1f3d38..4d12c764e2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Tue Sep 10 20:33:34 SGT 2019 +distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/Command.java b/src/main/java/Command.java new file mode 100644 index 0000000000..d2a55226cb --- /dev/null +++ b/src/main/java/Command.java @@ -0,0 +1,14 @@ +public class Command { + + private String action; + private String task; + + public Command(action, task) { + this.action = action; + this.task = task; + } + + public String nextCommand(String input) { + String text = + } +} diff --git a/src/main/java/DialogBox.java b/src/main/java/DialogBox.java new file mode 100644 index 0000000000..82ae81e6fe --- /dev/null +++ b/src/main/java/DialogBox.java @@ -0,0 +1,22 @@ +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; + +public class DialogBox extends HBox { + + private Label text; + private ImageView displayPicture; + + public DialogBox(Label l, ImageView iv) { + text = l; + displayPicture = iv; + + text.setWrapText(true); + displayPicture.setFitWidth(100.0); + displayPicture.setFitHeight(100.0); + + this.setAlignment(Pos.TOP_RIGHT); + this.getChildren().addAll(text, displayPicture); + } +} \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 4aa0f7ecb2..42e900965f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,14 +1,36 @@ import java.io.IOException; -import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; -import java.util.Scanner; -public class Duke { +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; +import javafx.scene.control.Label; +import javafx.stage.Stage; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; + +public class Duke extends Application { private Storage storage; private TaskList tasks; private Ui ui; + ScrollPane scrollPane; + VBox dialogContainer; + TextField userInput; + Button sendButton; + Scene scene; + private Image user = new Image(this.getClass().getResourceAsStream("/images/DaUser.png")); + private Image duke = new Image(this.getClass().getResourceAsStream("/images/DaDuke.png")); + + public Duke() { + + } /** * Constructor for Duke that takes in a file to add text into. @@ -44,4 +66,180 @@ public static void main(String[] args) throws IOException { new Duke("todo.txt").run(); } + @Override + public void start(Stage stage) { + //Step 1. Setting up required components +// ScrollPane scrollPane; +// VBox dialogContainer; +// TextField userInput; +// Button sendButton; +// Scene scene; + + //The container for the content of the chat to scroll. + scrollPane = new ScrollPane(); + dialogContainer = new VBox(); + scrollPane.setContent(dialogContainer); + + userInput = new TextField(); + sendButton = new Button("Send"); + + AnchorPane mainLayout = new AnchorPane(); + mainLayout.getChildren().addAll(scrollPane, userInput, sendButton); + + stage.setTitle("Duke"); + stage.setResizable(false); + stage.setMinHeight(600.0); + stage.setMinWidth(400.0); + + mainLayout.setPrefSize(400.0, 600.0); + + scrollPane.setPrefSize(385, 535); + scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); + + scrollPane.setVvalue(1.0); + scrollPane.setFitToWidth(true); + + // You will need to import `javafx.scene.layout.Region` for this. + dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); + + userInput.setPrefWidth(325.0); + + sendButton.setPrefWidth(55.0); + + AnchorPane.setTopAnchor(scrollPane, 1.0); + + AnchorPane.setBottomAnchor(sendButton, 1.0); + AnchorPane.setRightAnchor(sendButton, 1.0); + + AnchorPane.setLeftAnchor(userInput , 1.0); + AnchorPane.setBottomAnchor(userInput, 1.0); + + scene = new Scene(mainLayout); + + stage.setScene(scene); + stage.show(); + + sendButton.setOnMouseClicked((event) -> { + dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); + userInput.clear(); + }); + + userInput.setOnAction((event) -> { + dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); + userInput.clear(); + }); + + //Scroll down to the end every time dialogContainer's height changes. + dialogContainer.heightProperty().addListener((observable) -> scrollPane.setVvalue(1.0)); + + //Part 3. Add functionality to handle user input. + sendButton.setOnMouseClicked((event) -> { + handleUserInput(); + }); + + userInput.setOnAction((event) -> { + handleUserInput(); + }); + // more code to be added here later + } + + /** + * Iteration 1: + * Creates a label with the specified text and adds it to the dialog container. + * @param text String containing text to add + * @return a label with the specified text that has word wrap enabled. + */ + private Label getDialogLabel(String text) { + // You will need to import `javafx.scene.control.Label`. + Label textToAdd = new Label(text); + textToAdd.setWrapText(true); + + return textToAdd; + } + + /** + * Iteration 2: + * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to + * the dialog container. Clears the user input after processing. + */ + private void handleUserInput() { + Label userText = new Label(userInput.getText()); + Label dukeText = new Label(getResponse(userInput.getText())); + dialogContainer.getChildren().addAll( + new DialogBox(userText, new ImageView(user)), + new DialogBox(dukeText, new ImageView(duke)) + ); + userInput.clear(); + } + + /** + * You should have your own function to generate a response to user input. + * Replace this stub with your completed method. + */ + private String getResponse(String input) { + String text = input.trim(); + try { + if (text.equals("bye")) { + return ui.printBye(); + //ui.printLine(); + } else if (text.equals("list")) { + return ui.printList(); + } else if (text.equals("delete all")) { + return tasks.deleteAllCommand(text); + } else if (text.contains(" ")) { + String[] splittedText = text.split(" "); + if (splittedText[0].equals("done")) { + int num = text.indexOf(" "); + int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); + if (taskNumber > 0 && taskNumber <= TaskList.listOfTasks.size()) { + return ui.printDone(taskNumber); + } else { + throw new DukeException("☹ OOPS!!! There is no such task " + + "number in your list of tasks!! Please enter a valid number!"); + } + } else if (splittedText[0].equals("delete")) { + return tasks.deleteCommand(text); + } else if (splittedText[0].equals("find")) { + ArrayList strList = ui.findCommand(splittedText[1]); + return ui.printKeywordList(strList); + } else { + if (splittedText[0].equals("todo")) { + System.out.println("hey"); + return tasks.toDoCommand(text); + } else if (splittedText[0].equals("deadline") + && text.contains("/") && text.contains("by")) { + return tasks.deadlineCommand(text); + } else if (splittedText[0].equals("event") + && text.contains("/") && text.contains("at")) { + return tasks.eventCommand(text); + } else { + ui.printLine(); + ui.printIndent(); + throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct format! :<"); + } + } + } else { + ui.printLine(); + ui.printIndent(); + switch (text) { + case "todo": + throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. " + + "It must be in proper format (i.e. todo clean table)."); + case "deadline": + throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. " + + "It must be in proper format (i.e. deadline return book /by 23 Aug)."); + case "event": + throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. " + + "It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); + default: + throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); + } + } + } catch (DukeException | IOException e) { + System.out.println(e); + ui.printLine(); + } + return ""; + } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index ef30388853..beedb5c93a 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,6 +1,3 @@ -import java.text.SimpleDateFormat; -import java.util.Date; - public class Event extends Task { protected String when; diff --git a/src/main/java/Launcher.java b/src/main/java/Launcher.java new file mode 100644 index 0000000000..ce3257483c --- /dev/null +++ b/src/main/java/Launcher.java @@ -0,0 +1,11 @@ +import javafx.application.Application; + +/** + * A launcher class to workaround classpath issues. + */ +public class Launcher { + + public static void main(String[] args) { + Application.launch(Duke.class, args); + } +} \ No newline at end of file diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 2c35297fd6..452936a7d2 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -4,10 +4,23 @@ public class Parser { Scanner sc = new Scanner(System.in); - /** - * Constructor for Parser class. - */ - public Parser() { + public static Command parse(String line) { } + + + public static String dateFormatter(String text) { + int num = text.indexOf("/"); + int num1 = text.indexOf(" "); + int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); + int monthDate = Integer.parseInt(text.substring(num + 7, num + 9)); + int timeHour = Integer.parseInt(text.substring(num + 15, num + 17)); + int timeMin = Integer.parseInt(text.substring(num + 17)); + if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 + && timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59) { + Task task = new Deadline(text.substring(num1, num - 1), + text.substring(num + 4)); + String taskers = task.toString(); + return taskers; + } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index a70f1dd5b3..2eb64f7b0f 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -49,10 +49,10 @@ public void markAsDone() { * Prints a statement informing the user that the bot * has added the task into the list. */ - public void printGI() { + public String printGI() { Ui.printLine(); Ui.printIndent(); - System.out.println("Got it. I've added this task:"); + return "Got it. I've added this task:"; } /** @@ -61,11 +61,10 @@ public void printGI() { * @throws IOException If the named file exists but is a directory rather than a regular file, * does not exist but cannot be created, or cannot be opened for any other reason. */ - public void printNumOfTasks() throws IOException { + public String printNumOfTasks() throws IOException { Ui.printIndent(); - System.out.println("Now you have " - + Ui.getNumOfTasks() + " tasks in the list."); - Ui.printLine(); + return "Now you have " + Ui.getNumOfTasks() + " tasks in the list."; + //Ui.printLine(); } /** @@ -81,10 +80,10 @@ public String toString() { /** * Prints a statement to tell the user that the task has been removed. */ - public void printRemove() { + public String printRemove() { Ui.printLine(); Ui.printIndent(); - System.out.println("Noted. I've removed this task."); + return "Noted. I've removed this task."; } /** diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index edfc6495f9..49cb610790 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,5 +1,4 @@ import java.io.IOException; -import java.sql.SQLOutput; import java.util.ArrayList; public class TaskList { @@ -33,9 +32,9 @@ public TaskList(ArrayList list) { * @throws IOException If the named file exists but is a directory rather than a regular file, * does not exist but cannot be created, or cannot be opened for any other reason. */ - public void deleteCommand(String text) throws IOException { - int num = text.indexOf(" "); - int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); + public String deleteCommand(String text) throws IOException { + int spaceIndex = text.indexOf(" "); + int taskNumber = Integer.parseInt(text.substring(spaceIndex + 1, spaceIndex + 2)); tasking.printRemove(); Ui.printDelete(taskNumber); listOfTasks.remove(taskNumber - 1); @@ -43,7 +42,7 @@ public void deleteCommand(String text) throws IOException { for (Task task : listOfTasks) { store.addToFile(Storage.file, task.toString()); } - tasking.printNumOfTasks(); + return tasking.printNumOfTasks(); } /** @@ -54,14 +53,14 @@ public void deleteCommand(String text) throws IOException { * does not exist but cannot be created, * or cannot be opened for any other reason. */ - public void deleteAllCommand(String text) throws IOException { + public String deleteAllCommand(String text) throws IOException { store.writeToFile(Storage.file, ""); listOfTasks.clear(); Ui.printLine(); Ui.printIndent(); - System.out.println("Everything in your list has been removed! " - + "Add more tasks to get started again!!!"); - Ui.printLine(); + return "Everything in your list has been removed! " + + "Add more tasks to get started again!!!"; + //Ui.printLine(); } /** @@ -71,15 +70,19 @@ public void deleteAllCommand(String text) throws IOException { * @throws IOException If the named file exists but is a directory rather than a regular file, * does not exist but cannot be created, or cannot be opened for any other reason. */ - public void toDoCommand(String text) throws IOException { + public String toDoCommand(String text) throws IOException { tasking.printGI(); + System.out.println("1"); Ui.printIndent(); + System.out.println("2"); int num = text.indexOf(" "); Task task = new Todo(text.substring(num + 1)); + System.out.println("3"); System.out.println(" " + task.toString()); listOfTasks.add(task); + System.out.println("4"); store.addToFile(Storage.file, task.toString()); - tasking.printNumOfTasks(); + return tasking.printNumOfTasks(); } /** @@ -92,7 +95,7 @@ public void toDoCommand(String text) throws IOException { * @throws IOException If the named file exists but is a directory rather than a regular file, * does not exist but cannot be created, or cannot be opened for any other reason. */ - public void eventCommand(String text) throws DukeException, IOException { + public String eventCommand(String text) throws DukeException, IOException { int num = text.indexOf("/"); int num1 = text.indexOf(" "); int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); @@ -110,7 +113,7 @@ public void eventCommand(String text) throws DukeException, IOException { System.out.println(" " + taskers); listOfTasks.add(task); store.addToFile(Storage.file, taskers); - tasking.printNumOfTasks(); + return tasking.printNumOfTasks(); } else { Ui.printIndent(); throw new DukeException(taskers); @@ -134,7 +137,7 @@ public void eventCommand(String text) throws DukeException, IOException { * @throws IOException If the named file exists but is a directory rather than a regular file, * does not exist but cannot be created, or cannot be opened for any other reason. */ - public void deadlineCommand(String text) throws DukeException, IOException { + public String deadlineCommand(String text) throws DukeException, IOException { int num = text.indexOf("/"); int num1 = text.indexOf(" "); int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); @@ -152,7 +155,7 @@ public void deadlineCommand(String text) throws DukeException, IOException { System.out.println(" " + taskers); listOfTasks.add(task); store.addToFile(Storage.file, taskers); - tasking.printNumOfTasks(); + return tasking.printNumOfTasks(); } else { Ui.printIndent(); throw new DukeException(taskers); diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index 06ff859401..ef26517ed1 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -17,6 +17,9 @@ public Ui() { } + public String readInput() { + return scan.nextLine(); + } /** * Prints the greeting at the initiation of the chat bot. */ @@ -138,11 +141,12 @@ public static void printLine() { /** * Ends the chat bot. */ - private static void printBye() { + static String printBye() { printLine(); printIndent(); - System.out.println("Bye. Hope to see you again soon!"); - printLine(); + //System.out.println("Bye. Hope to see you again soon!"); + return "Bye. Hope to see you again soon!"; + //printLine(); } /** @@ -150,14 +154,14 @@ private static void printBye() { * * @param i To indicate which task number is done. */ - private static void printDone(int i) { + static String printDone(int i) { TaskList.listOfTasks.get(i - 1).markAsDone(); printLine(); printIndent(); System.out.println("Nice! I've marked this task as done:"); printIndent(); - System.out.println(TaskList.listOfTasks.get(i - 1).toString()); - printLine(); + return TaskList.listOfTasks.get(i - 1).toString(); + //printLine(); } /** @@ -165,10 +169,10 @@ private static void printDone(int i) { * * @param i Indicates the task number that is done. */ - public static void printDelete(int i) { + public static String printDelete(int i) { printIndent(); - System.out.println(TaskList.listOfTasks.get(i - 1).toString()); - printLine(); + return TaskList.listOfTasks.get(i - 1).toString(); + //printLine(); } /** @@ -176,11 +180,11 @@ public static void printDelete(int i) { * * @throws FileNotFoundException if there is no such file that contains the tasks. */ - private static void printList() throws FileNotFoundException { + static String printList() throws FileNotFoundException { printLine(); printIndent(); if (TaskList.listOfTasks.isEmpty()) { - System.out.println("There is no tasks in your list currently!!!"); + return "There is no tasks in your list currently!!!"; } else { System.out.println("Here are the tasks in your list:"); File temp = new File(Storage.file); @@ -191,8 +195,9 @@ private static void printList() throws FileNotFoundException { System.out.println(numbering + ". " + s.nextLine()); numbering++; } + return ""; } - printLine(); + //printLine(); } /** @@ -263,7 +268,7 @@ public ArrayList findCommand(String wordToFind) throws IOException, Duke * @param list Prints out the array list of tasks * that contains the keyword. */ - public void printKeywordList(ArrayList list) { + public String printKeywordList(ArrayList list) { printLine(); printIndent(); System.out.println("Here are the matching tasks in your list!"); @@ -272,5 +277,6 @@ public void printKeywordList(ArrayList list) { System.out.println(str); } printLine(); + return ""; } } \ No newline at end of file diff --git a/src/main/resources/images/DaDuke.png b/src/main/resources/images/DaDuke.png new file mode 100644 index 0000000000000000000000000000000000000000..d893658717e29b50b4ceedada235d9f75835a118 GIT binary patch literal 32657 zcmV)5K*_&}P)Zf>Tg`t%N;{PE9Y2%-o7`CdniQG#9szpJX+ zcrVK`zK7pG^!n{1T{qo3os(XNkTqW0IXIfGihv^wpO4cHg6YjrzS7VYZJZVWev% z!fK9RcD(ntf zCxMCmC7oRZecuOe6J~p&f5@?I;U2zE;O2T?Vy_8UZ1S4i=b>l%q0jeYAI+i(>K zsIun-!&|SPodfa+5u7Z5yhtd`XRjxuF+Ww~1H4xg)(?GXYLo{q2VPiixh(3*`0iyFHj`V{p-_+Q4jWKC=o6ohr zW)q;Nb7IxtY}qD4RyBpAMv`rR!YytU)sgEIa8F)wX(O<=RwjYY+sLdy0`5o0>=a zd(GePvuhIc}2|`2Y7OgN%4u~XV>q*3e$65qJ;}bK0Li-Wh%~iQn_FhV_*O6|& z$E%S!>BN;~l+|jbw5B2<783HDuPYE-T1Z)&EZTFhZGIj)nseO*|7}7`Vz4%vMl&l& z!c*D(>n3|ulhD`D1FzG)Tik79GgrpJ#HE0O)y{gM#c%L1=xtu`A<9oj(;}Q6cpHb= zIjOSNTO3vD|G|N_tH+^nj?I`D4+@;j;9`s4!*lY>X2_|khHWO LGkWs%c&z?S( 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 z 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 KMNUMnLSTa5`eeEQ literal 0 HcmV?d00001 From 31ffff61a3fb074992d161ccccffab2a368083f4 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Fri, 13 Sep 2019 00:08:07 +0800 Subject: [PATCH 27/51] Clean some things up --- src/main/java/Command.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/Command.java b/src/main/java/Command.java index d2a55226cb..e30ddd5369 100644 --- a/src/main/java/Command.java +++ b/src/main/java/Command.java @@ -9,6 +9,7 @@ public Command(action, task) { } public String nextCommand(String input) { - String text = + String text = input; + } } From 723f40d5654cbb3de052647d7b5f9ec422d1ec6e Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Fri, 13 Sep 2019 00:16:12 +0800 Subject: [PATCH 28/51] Added new things --- src/main/java/Command.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Command.java b/src/main/java/Command.java index e30ddd5369..336b135ef6 100644 --- a/src/main/java/Command.java +++ b/src/main/java/Command.java @@ -10,6 +10,6 @@ public Command(action, task) { public String nextCommand(String input) { String text = input; - + switch () } } From 9dfc61acd2ca28f49ba127bd3b8c9792e80c3d45 Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Sun, 15 Sep 2019 05:48:28 +0800 Subject: [PATCH 29/51] Did some changes. Added Command classes. Did more OOP as well --- src/main/java/ByeCommand.class | Bin 0 -> 329 bytes src/main/java/ByeCommand.java | 25 ++ src/main/java/Command.class | Bin 0 -> 797 bytes src/main/java/Command.java | 25 +- src/main/java/Deadline.class | Bin 1122 -> 916 bytes src/main/java/Deadline.java | 7 +- src/main/java/DeadlineCommand.class | Bin 0 -> 1326 bytes src/main/java/DeadlineCommand.java | 18 ++ src/main/java/DeleteCommand.class | Bin 0 -> 1557 bytes src/main/java/DeleteCommand.java | 29 +++ src/main/java/DialogBox.java | 44 ++-- src/main/java/DoneCommand.class | Bin 0 -> 921 bytes src/main/java/DoneCommand.java | 16 ++ src/main/java/Duke.class | Bin 1018 -> 1542 bytes src/main/java/Duke.java | 351 ++++++++++++---------------- src/main/java/Event.class | Bin 1140 -> 934 bytes src/main/java/Event.java | 7 +- src/main/java/EventCommand.class | Bin 0 -> 1317 bytes src/main/java/EventCommand.java | 18 ++ src/main/java/Find.class | Bin 0 -> 193 bytes src/main/java/Find.java | 7 + src/main/java/FindCommand.class | Bin 0 -> 2130 bytes src/main/java/FindCommand.java | 47 ++++ src/main/java/Launcher.java | 22 +- src/main/java/ListCommand.class | Bin 0 -> 1511 bytes src/main/java/ListCommand.java | 28 +++ src/main/java/Parser.class | Bin 374 -> 8677 bytes src/main/java/Parser.java | 327 ++++++++++++++++++++++++-- src/main/java/Storage.class | Bin 3449 -> 3493 bytes src/main/java/Storage.java | 1 + src/main/java/Task.class | Bin 2941 -> 1167 bytes src/main/java/Task.java | 72 ------ src/main/java/TaskList.class | Bin 3867 -> 887 bytes src/main/java/TaskList.java | 143 +----------- src/main/java/ToDoCommand.class | Bin 0 -> 1288 bytes src/main/java/ToDoCommand.java | 18 ++ src/main/java/Todo.class | Bin 804 -> 804 bytes src/main/java/Ui.class | Bin 5681 -> 4026 bytes src/main/java/Ui.java | 171 ++++---------- src/main/java/todo.txt | 10 + 40 files changed, 775 insertions(+), 611 deletions(-) create mode 100644 src/main/java/ByeCommand.class create mode 100644 src/main/java/ByeCommand.java create mode 100644 src/main/java/Command.class create mode 100644 src/main/java/DeadlineCommand.class create mode 100644 src/main/java/DeadlineCommand.java create mode 100644 src/main/java/DeleteCommand.class create mode 100644 src/main/java/DeleteCommand.java create mode 100644 src/main/java/DoneCommand.class create mode 100644 src/main/java/DoneCommand.java create mode 100644 src/main/java/EventCommand.class create mode 100644 src/main/java/EventCommand.java create mode 100644 src/main/java/Find.class create mode 100644 src/main/java/Find.java create mode 100644 src/main/java/FindCommand.class create mode 100644 src/main/java/FindCommand.java create mode 100644 src/main/java/ListCommand.class create mode 100644 src/main/java/ListCommand.java create mode 100644 src/main/java/ToDoCommand.class create mode 100644 src/main/java/ToDoCommand.java diff --git a/src/main/java/ByeCommand.class b/src/main/java/ByeCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..c59f2204273bf631389f5679b567a3a75fa921e0 GIT binary patch literal 329 zcmZ9HzfQw25XL{JZA?ud5_=N}UQGiv=VG9)O2J zoFgP8Je=?Q?ss?g*Z0RKfGhL`+Sn1;Mav z_@4OoMUTs(P&Zk!l54GAsu4=BHBKxDy!MJj|;iiBk7A}tc^CeA3GCb28WE_oJS zfDIc!6%q>`fQLeyiLFF}%JLo0%>B-}_xksrpT7V+!vhZ`+^k>;w@kQg!j6kOF767H zWSHtW5~v5K@?5q@G8(kIX`-V+N1%Kz6D@lqCE$iKI+*HIKzty!rz4#{7g%ln&+Wbw zaQ5Rqsg*!S>TNdespKfvd3XtMxr8@4iL+5ZH?^C)wDlA#=zi2`cp|XeO=UQIBhLzD zS4~xzrF7kB21jx-4D=-J1jo7)bkjJI1JyB=c?Z)_otdU5F7COw&o=kMQPB^5Oink> zl2EnBjbb^Mz|}X^I0HjE#Aw zu`;JMW`2U}e1>Dc|DIFUtk9fV!!>3t!SY@h=~b)|G(E2KHN}WUbvdz)>pU(o?FN&| Z*uW-1gKWJz{zjsm!dd^p%JY}2qfqLsMVanY_$9;@%}ae$73 z2VWsXL!k>_pn0C>Wl=6~7MHW~E}s?+2R#pcg#q-Lh-Eyg@>Wut&Wg!$z9{GULx5fE z34~V{*J7Z5#nRa~>5;ybsmSz`e7DB}Lw#@c^u!vs9i9XT*ye3ANgklauJnu5DeBZh zSnLXGsM8DS@kEoLn$Z))DEokwy}@S56{C2iD!2ju*CY}qn?#9q91;VnL!>yM)8g!L I-ePV41Bq-ZDF6Tf delta 512 zcmXX@O;6iE5Pjo>*l{)xoVY+KO-f5hoV1}Id|fF*LV^Q=_Ry+_ZQ_QssU111Tzl^= zbuV1_4MBn+ao`8^XY|w`fe>TU%bT4y@6FE6{?`8*YkzL9t^urL(}ancG}4$g8RjB* z7;*Cv_sC*V$-omGi#nbTt3Ri+he|fT?aSVg{M>bQJR6=B53*Pi$Uq2`u`EzQRbU#H zfCE9uZTY_Ht3dYlU3KiY`co;?4Acdl;{~Cx>kVYL(<-&3a!X(Q;JZ}6$hLD|yJW3)%=zwY?u{-UC2LMsMSj#^)?18K*d_ zah~9qacY+!r+xwLESBdOC*zX91RKoQ!u$AdJmQ+hnnlMshc-rH&lw|m0?WC?1XHQn z6?96m=B1sU52y;0;HUFMEYGyk^hBy$+9= GE8YR@@l=}t diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 524555e10e..02f6388186 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -22,11 +22,6 @@ public Deadline(String description, String by) { */ @Override public String toString() { - String date = formatDate(by); - if (getIsCorrectFormat()) { - return "[D]" + super.toString() + description + " (by: " + date + ")"; - } else { - return "Invalid date format!"; - } + return "[D]" + super.toString() + " " + description + " (by: " + by + ")"; } } \ No newline at end of file diff --git a/src/main/java/DeadlineCommand.class b/src/main/java/DeadlineCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..5c39cbbc5b8ff52a5458816ffceb397d156f016b GIT binary patch literal 1326 zcmaJ>>rN9v6#fQEr(G6`MMOXm7U5I4Tm~HzM(*vTSiIBW}F5 zah{e1Wmu-e@r?AORkYJ`({OX#U6&%0qs&n&pBH9k&TUG^9RxX^>v(~e91A*LVUc4= zM+D0ZzFLfq*I3c<1}hwIb*y5IBdTNF)i-o(Vo}Eyf;zUb$k4TBS;|qiDC|geVr86w z7cn2+>3EMg%~#7>?S$sLk-E!J8CE!!xEY2L)&Y3oD4AzywTg>5Ntao7{)G#{LORT@+*!_b+w+iNjNwR*`zj zt0|%)mrEK-MmUJZv4;7Y^~Nyxe?JV6K$WTzQao|zk+YcGu`JY!9RNm%@x{9 z(0`!gfC9?uH97$byR9`yHGp=isbc^g)NChaso{BQd6k;&rGGut#eHhEkK`8g<0JiQ TWZOduAILgOx{vfZdc%JKZzxQB literal 0 HcmV?d00001 diff --git a/src/main/java/DeadlineCommand.java b/src/main/java/DeadlineCommand.java new file mode 100644 index 0000000000..1f0af253c4 --- /dev/null +++ b/src/main/java/DeadlineCommand.java @@ -0,0 +1,18 @@ +import java.io.IOException; + +public class DeadlineCommand extends Command { + + public DeadlineCommand(String action, String variable) { + super(action, variable); + } + + @Override + public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + System.out.println(ui.printGI()); + Task assignmentToDo = new Deadline(action, variable); + tasks.addToTaskList(assignmentToDo); + storage.addToFile(Storage.file, assignmentToDo.toString()); + Ui.printNumOfTasks(); + System.out.println(" " + assignmentToDo.toString()); + } +} \ No newline at end of file diff --git a/src/main/java/DeleteCommand.class b/src/main/java/DeleteCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..bf3f461e5969d6dcb714264aa2243260ec50c264 GIT binary patch literal 1557 zcmZ`(ZBrXn6n-v*Y_ho&8VD^|>!wzlP}=y~T7oE2TB9i-fmU1JZnBrKu-Q#_Z;<=| zXZ)()`V0D5#);?$$It!1w|Y2ZVK_=4j(YLVeWuDmPuMZpzby--nsXOBf2eQ^uw3^A4H$}Ktc0yGwZ#l(sMfriK%c4F%T2Z35 zcS|&*V+KkL=E^}$HkIRhp@ENRU-4T(P2O;H*z|SjN+p;5Mnib^WsQ>K1)Smd7-fcG z;kpKHajas^z&gh#+6s;hoH0=0*u<8B+Z=cBse#Wp?&|p-$LIKhVSQy^25q%NOSxg-QfU+Lovb$IE832EOF@ z3SS!_lvUI?Y)Fo6)H!zGaO`4_!$pI`gHLQ~qBxq`>Ao&10M$G?P%}~6tDe}1y3|sR zTPP_R2qKnYA~HIDp|tidlMIP{5jfq}q>s0fVf@*KlN{vzmT*Ic%zx#uR^62~Rm|Td zAiYi!@a?EOsc!;D$xXl8t3c zf*IO!C|r{ysY;$LJv9iu9V*!%U%y2kdU=S7b?r|=mZDMY=NU9pHBnI4d#2u={B`b= zPdO@iO4cQzN;E|fO4|Osx}DacO3(F*cLjLNq1P0GL;Ux2 zFx5{qpbskFAUUtf142xcQX6Alv>62UG@|mm6fh)(ZTFiy7O_RYe6Op>(tR~U_ZKh( zrhiEqU!>j37^Vj>W-reD4E7@}8P3vZk|PkO#~{l~uxPIj{6+2t%|FckgrW3s2eAjR zE*)Yd9q+(6M52S_5zIrR(!7JwhuG7OM>ugMMz*;Q#>h&mOza5b(K3;V#q17F-WiON zo*$VW`2`aU4{%nmCK-N5Wz%Q)uHfz9oXbBZ|H!YO-{C9I^c0xW){edxZ0kkRYmn O7;$l)-dCbruRZ}lN_jK@ literal 0 HcmV?d00001 diff --git a/src/main/java/DeleteCommand.java b/src/main/java/DeleteCommand.java new file mode 100644 index 0000000000..f6de21fb42 --- /dev/null +++ b/src/main/java/DeleteCommand.java @@ -0,0 +1,29 @@ +import java.io.IOException; + +public class DeleteCommand extends Command { + + public DeleteCommand(String action, String variable) { + super(action, variable); + } + + @Override + public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + if (variable.equals("all")) { + storage.writeToFile(Storage.file, ""); + TaskList.listOfTasks.clear(); + Ui.printIndent(); + System.out.println("Everything in your list has been removed! " + + "Add more tasks to get started again!!!"); + } else { + int taskNumber = Integer.parseInt(variable); + System.out.println(ui.printRemove()); + System.out.println(Ui.printDelete(taskNumber)); + TaskList.listOfTasks.remove(taskNumber - 1); + storage.writeToFile(Storage.file, ""); + for (Task task : TaskList.listOfTasks) { + storage.addToFile(Storage.file, task.toString()); + } + System.out.println(Ui.printNumOfTasks()); + } + } +} diff --git a/src/main/java/DialogBox.java b/src/main/java/DialogBox.java index 82ae81e6fe..186e0e7f22 100644 --- a/src/main/java/DialogBox.java +++ b/src/main/java/DialogBox.java @@ -1,22 +1,22 @@ -import javafx.geometry.Pos; -import javafx.scene.control.Label; -import javafx.scene.image.ImageView; -import javafx.scene.layout.HBox; - -public class DialogBox extends HBox { - - private Label text; - private ImageView displayPicture; - - public DialogBox(Label l, ImageView iv) { - text = l; - displayPicture = iv; - - text.setWrapText(true); - displayPicture.setFitWidth(100.0); - displayPicture.setFitHeight(100.0); - - this.setAlignment(Pos.TOP_RIGHT); - this.getChildren().addAll(text, displayPicture); - } -} \ No newline at end of file +//import javafx.geometry.Pos; +//import javafx.scene.control.Label; +//import javafx.scene.image.ImageView; +//import javafx.scene.layout.HBox; +// +//public class DialogBox extends HBox { +// +// private Label text; +// private ImageView displayPicture; +// +// public DialogBox(Label l, ImageView iv) { +// text = l; +// displayPicture = iv; +// +// text.setWrapText(true); +// displayPicture.setFitWidth(100.0); +// displayPicture.setFitHeight(100.0); +// +// this.setAlignment(Pos.TOP_RIGHT); +// this.getChildren().addAll(text, displayPicture); +// } +//} \ No newline at end of file diff --git a/src/main/java/DoneCommand.class b/src/main/java/DoneCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..406752147634d98c56e11851996ec02a88e11657 GIT binary patch literal 921 zcmZ`&YflqF6g|_|w%aX~0zOddB4{5}>JyYASTH6{8Zas7=V?3Efp(YdP8<1I5>tsE zjGz5c#yf3Ei|9_WyL0B=d(J(3_t)?5KLD&_$HWw_$B@7c6F0FC!!6u4aR+GwcTGfK zn^?rX7?!Xc#eEYGkkN3~K+Zs(A+jkQskRt0+3FGR@nV}htzu1i(rJ~hBDwbrpdRvRr;z_J(Q(tO}QR#iIUDYYi`$Th__Pb zB;UA>*mXM{?lf1m01MMdT3A8Bz(WhGC>nTV;W3^VcxvGpo|6Jy+`<~x4ZN`MQa?8= zl(5OLyeAuC(XM2A!tQYISTt?*N&2>;6r1~YllV3ayt1%`Z40kaW{6LSpf*Nw7@|Gy z$zgA)t6nh7j2){uO0+W)8lpAv>7T_xMavgh&B zfq@LO1D?w;L$DGqefGjpi$OW z05n`k(tU<@O9;{ejQmRB8`u|mWk}K8q(C4MZ2k(e=xEH9hCvl$wDeyVM;aFWNePArc$<$*2 literal 0 HcmV?d00001 diff --git a/src/main/java/DoneCommand.java b/src/main/java/DoneCommand.java new file mode 100644 index 0000000000..169f5a2d83 --- /dev/null +++ b/src/main/java/DoneCommand.java @@ -0,0 +1,16 @@ +public class DoneCommand extends Command { + + public DoneCommand(String action, String variable) { + super(action, variable); + } + + @Override + public void execute(TaskList tasks, Ui ui, Storage storage) { + int taskNum = Integer.parseInt(variable); + TaskList.listOfTasks.get(taskNum - 1).markAsDone(); + ui.printIndent(); + System.out.println("Nice! I've marked this task as done:"); + ui.printIndent(); + System.out.println(TaskList.listOfTasks.get(taskNum - 1).toString()); + } +} diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 3a69bb46462831d8a2d53f542dce6c9ea216477f..42f396f8651f8431bc4b9ce92ad3740479a16746 100644 GIT binary patch literal 1542 zcmZuxZBr9h6n-`@Ua~ADf}lugODh^)Q>85yQWOHA)DUO`*htkb$xd7dS!T1T^sn@5 zr^9DvO5*5D`@O%ZqdsRh1abVZ=bU@)c|XtH|6afR2fz$UI)*T<@Rg1breheu*9zb0 zh+;+#cNM;s!>o=D%!wwY@SVcEnBNoSv`F`bEC^ZDk;amaWn_e`D15JD9IJBogTjLj zWOYWF5wfO`)1Yde~@h)m4`%T11$Czsz-I(C*6z%TNGKt%ycS+Nj#we|N z5qd*aNMS(HMN=5>p-a$bKieSyNm)GGjPQR1>;<*N!>PeP@H9AF_6vOY0zDHi(3_j2 zwo`8Sv5za04fLhtEEdPO>`afdY5l6DEFlB@oF)6e1S2@Z>%I3RXVW7}+y@|mFK7Jno>nwcZ!Z>f! IC4@U~0eQUUc~Keq4y z4P9wkIFAd-2T?Drp={xyhIM^Xy1Cz_<4hcFM+@638gBPoF? yVh*Y23?)b^b3+>yRJAp-RbE1?N4~;-VUK-A{s@JCTK(gI1B*`oA3sahz}#;!bXuSQ diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 42e900965f..bc8ab9c1e6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,32 +1,32 @@ import java.io.IOException; import java.io.FileNotFoundException; -import java.util.ArrayList; -import javafx.application.Application; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.TextField; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.Region; -import javafx.scene.layout.VBox; -import javafx.scene.control.Label; -import javafx.stage.Stage; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; - -public class Duke extends Application { +//import javafx.application.Application; +//import javafx.scene.Scene; +//import javafx.scene.control.Button; +//import javafx.scene.control.ScrollPane; +//import javafx.scene.control.TextField; +//import javafx.scene.layout.AnchorPane; +//import javafx.scene.layout.Region; +//import javafx.scene.layout.VBox; +//import javafx.scene.control.Label; +//import javafx.stage.Stage; +//import javafx.scene.image.Image; +//import javafx.scene.image.ImageView; + +//public class Duke extends Application { +public class Duke { private Storage storage; private TaskList tasks; private Ui ui; - ScrollPane scrollPane; - VBox dialogContainer; - TextField userInput; - Button sendButton; - Scene scene; - private Image user = new Image(this.getClass().getResourceAsStream("/images/DaUser.png")); - private Image duke = new Image(this.getClass().getResourceAsStream("/images/DaDuke.png")); +// ScrollPane scrollPane; +// VBox dialogContainer; +// TextField userInput; +// Button sendButton; +// Scene scene; +// private Image user = new Image(this.getClass().getResourceAsStream("/images/DaUser.png")); +// private Image duke = new Image(this.getClass().getResourceAsStream("/images/DaDuke.png")); public Duke() { @@ -56,7 +56,20 @@ public Duke(String filepath) throws IOException { */ public void run() { ui.greeting(); - ui.nextCommand(); + boolean isThereANextCommand = false; + while (!isThereANextCommand) { + try { + String fullCommand = ui.readCommand(); + ui.printLine(); // show the divider line ("_______") + Command c = Parser.parse(fullCommand); + c.execute(tasks, ui, storage); + isThereANextCommand = c.shouldExit(); + } catch (DukeException | IOException e) { + ui.showError(e.getMessage()); + } finally { + ui.printLine(); + } + } } /** @@ -65,181 +78,119 @@ public void run() { public static void main(String[] args) throws IOException { new Duke("todo.txt").run(); } - - @Override - public void start(Stage stage) { - //Step 1. Setting up required components -// ScrollPane scrollPane; -// VBox dialogContainer; -// TextField userInput; -// Button sendButton; -// Scene scene; - - //The container for the content of the chat to scroll. - scrollPane = new ScrollPane(); - dialogContainer = new VBox(); - scrollPane.setContent(dialogContainer); - - userInput = new TextField(); - sendButton = new Button("Send"); - - AnchorPane mainLayout = new AnchorPane(); - mainLayout.getChildren().addAll(scrollPane, userInput, sendButton); - - stage.setTitle("Duke"); - stage.setResizable(false); - stage.setMinHeight(600.0); - stage.setMinWidth(400.0); - - mainLayout.setPrefSize(400.0, 600.0); - - scrollPane.setPrefSize(385, 535); - scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); - scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); - - scrollPane.setVvalue(1.0); - scrollPane.setFitToWidth(true); - - // You will need to import `javafx.scene.layout.Region` for this. - dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); - - userInput.setPrefWidth(325.0); - - sendButton.setPrefWidth(55.0); - - AnchorPane.setTopAnchor(scrollPane, 1.0); - - AnchorPane.setBottomAnchor(sendButton, 1.0); - AnchorPane.setRightAnchor(sendButton, 1.0); - - AnchorPane.setLeftAnchor(userInput , 1.0); - AnchorPane.setBottomAnchor(userInput, 1.0); - - scene = new Scene(mainLayout); - - stage.setScene(scene); - stage.show(); - - sendButton.setOnMouseClicked((event) -> { - dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); - userInput.clear(); - }); - - userInput.setOnAction((event) -> { - dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); - userInput.clear(); - }); - - //Scroll down to the end every time dialogContainer's height changes. - dialogContainer.heightProperty().addListener((observable) -> scrollPane.setVvalue(1.0)); - - //Part 3. Add functionality to handle user input. - sendButton.setOnMouseClicked((event) -> { - handleUserInput(); - }); - - userInput.setOnAction((event) -> { - handleUserInput(); - }); - // more code to be added here later - } - - /** - * Iteration 1: - * Creates a label with the specified text and adds it to the dialog container. - * @param text String containing text to add - * @return a label with the specified text that has word wrap enabled. - */ - private Label getDialogLabel(String text) { - // You will need to import `javafx.scene.control.Label`. - Label textToAdd = new Label(text); - textToAdd.setWrapText(true); - - return textToAdd; - } - - /** - * Iteration 2: - * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to - * the dialog container. Clears the user input after processing. - */ - private void handleUserInput() { - Label userText = new Label(userInput.getText()); - Label dukeText = new Label(getResponse(userInput.getText())); - dialogContainer.getChildren().addAll( - new DialogBox(userText, new ImageView(user)), - new DialogBox(dukeText, new ImageView(duke)) - ); - userInput.clear(); - } - - /** - * You should have your own function to generate a response to user input. - * Replace this stub with your completed method. - */ - private String getResponse(String input) { - String text = input.trim(); - try { - if (text.equals("bye")) { - return ui.printBye(); - //ui.printLine(); - } else if (text.equals("list")) { - return ui.printList(); - } else if (text.equals("delete all")) { - return tasks.deleteAllCommand(text); - } else if (text.contains(" ")) { - String[] splittedText = text.split(" "); - if (splittedText[0].equals("done")) { - int num = text.indexOf(" "); - int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); - if (taskNumber > 0 && taskNumber <= TaskList.listOfTasks.size()) { - return ui.printDone(taskNumber); - } else { - throw new DukeException("☹ OOPS!!! There is no such task " - + "number in your list of tasks!! Please enter a valid number!"); - } - } else if (splittedText[0].equals("delete")) { - return tasks.deleteCommand(text); - } else if (splittedText[0].equals("find")) { - ArrayList strList = ui.findCommand(splittedText[1]); - return ui.printKeywordList(strList); - } else { - if (splittedText[0].equals("todo")) { - System.out.println("hey"); - return tasks.toDoCommand(text); - } else if (splittedText[0].equals("deadline") - && text.contains("/") && text.contains("by")) { - return tasks.deadlineCommand(text); - } else if (splittedText[0].equals("event") - && text.contains("/") && text.contains("at")) { - return tasks.eventCommand(text); - } else { - ui.printLine(); - ui.printIndent(); - throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct format! :<"); - } - } - } else { - ui.printLine(); - ui.printIndent(); - switch (text) { - case "todo": - throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. " - + "It must be in proper format (i.e. todo clean table)."); - case "deadline": - throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. " - + "It must be in proper format (i.e. deadline return book /by 23 Aug)."); - case "event": - throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. " - + "It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); - default: - throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); - } - } - } catch (DukeException | IOException e) { - System.out.println(e); - ui.printLine(); - } - return ""; - } +// +// @Override +// public void start(Stage stage) { +// //Step 1. Setting up required components +//// ScrollPane scrollPane; +//// VBox dialogContainer; +//// TextField userInput; +//// Button sendButton; +//// Scene scene; +// +// //The container for the content of the chat to scroll. +// scrollPane = new ScrollPane(); +// dialogContainer = new VBox(); +// scrollPane.setContent(dialogContainer); +// +// userInput = new TextField(); +// sendButton = new Button("Send"); +// +// AnchorPane mainLayout = new AnchorPane(); +// mainLayout.getChildren().addAll(scrollPane, userInput, sendButton); +// +// stage.setTitle("Duke"); +// stage.setResizable(false); +// stage.setMinHeight(600.0); +// stage.setMinWidth(400.0); +// +// mainLayout.setPrefSize(400.0, 600.0); +// +// scrollPane.setPrefSize(385, 535); +// scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); +// scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); +// +// scrollPane.setVvalue(1.0); +// scrollPane.setFitToWidth(true); +// +// // You will need to import `javafx.scene.layout.Region` for this. +// dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); +// +// userInput.setPrefWidth(325.0); +// +// sendButton.setPrefWidth(55.0); +// +// AnchorPane.setTopAnchor(scrollPane, 1.0); +// +// AnchorPane.setBottomAnchor(sendButton, 1.0); +// AnchorPane.setRightAnchor(sendButton, 1.0); +// +// AnchorPane.setLeftAnchor(userInput , 1.0); +// AnchorPane.setBottomAnchor(userInput, 1.0); +// +// scene = new Scene(mainLayout); +// +// stage.setScene(scene); +// stage.show(); +// +// sendButton.setOnMouseClicked((event) -> { +// dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); +// userInput.clear(); +// }); +// +// userInput.setOnAction((event) -> { +// dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); +// userInput.clear(); +// }); +// +// //Scroll down to the end every time dialogContainer's height changes. +// dialogContainer.heightProperty().addListener((observable) -> scrollPane.setVvalue(1.0)); +// +// //Part 3. Add functionality to handle user input. +// sendButton.setOnMouseClicked((event) -> { +// handleUserInput(); +// }); +// +// userInput.setOnAction((event) -> { +// handleUserInput(); +// }); +// // more code to be added here later +// } +// +// /** +// * Iteration 1: +// * Creates a label with the specified text and adds it to the dialog container. +// * @param text String containing text to add +// * @return a label with the specified text that has word wrap enabled. +// */ +// private Label getDialogLabel(String text) { +// // You will need to import `javafx.scene.control.Label`. +// Label textToAdd = new Label(text); +// textToAdd.setWrapText(true); +// +// return textToAdd; +// } +// +// /** +// * Iteration 2: +// * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to +// * the dialog container. Clears the user input after processing. +// */ +// private void handleUserInput() { +// Label userText = new Label(userInput.getText()); +// Label dukeText = new Label(getResponse(userInput.getText())); +// dialogContainer.getChildren().addAll( +// new DialogBox(userText, new ImageView(user)), +// new DialogBox(dukeText, new ImageView(duke)) +// ); +// userInput.clear(); +// } +// +// /** +// * You should have your own function to generate a response to user input. +// * Replace this stub with your completed method. +// */ +// private String getResponse(String input) { +// +// } } diff --git a/src/main/java/Event.class b/src/main/java/Event.class index 6853fe2a28c976fdb97ef394beb4e1bc54aeae34..10e9de54f207990720e21f548404c76f88d91592 100644 GIT binary patch delta 330 zcmW-dyH3ME5Jk`0j_o+kgYdKo5D2fBM+q%LN*6jhL=h27M4&jt7XJ}hqTmClDL_a; z;sf{%ejzntmSSe^+CJdB$_B~MW1AgC<*IY7n)ytP?OlB?%I}S~I?SJpcXgC^&2GzQlo zPZ_x*|1=wERk#YKAVr4J;+KdAI9ga7~l delta 519 zcmXYu&rcdr5XZl>EbOu@KU~p@g$fENi!H5+^vA6&CMGs%A}5W9C#(d;#Vi}H{Ts-h z+CQMjMia$^gNe7Mr~W5RnjV{`v)kq+^WJ>tGxO%n`>gy@x4-?F-T`Rfl?Dx&D56-@ z*gW)2*4J{r_Q+spS;dNiqJq-6@@Xc%?~3->J8{tx$9+pdd3>MECb6m`23^M*DmqM5 zb<85IV;%bV$NcNZDxT=5;VB`#YmY>~*U5K;YvoS{&be?4gm80Y*)BnDiQyR`bt*=p z))#iSw(mMUyX)m>F`@m#-*P6Q?Byx#eIcVxFuInzJA5;69INf_1T_hvwaNh@*0F|d zr+4A@2DXN0*dW9Yn@8lmCnvJ$H`VaIQiWc4Kj}t(NhotG6I?{RYw%yWAApL=Z|L%&5i+`D6K?*y5PP%(7`-Lz*D8 zXHFo0gkjzy%+gV$I)wsU8tNruQc%#~E`Xf>H{8JzuL9;+Q9-}4q+p(lJ_zUqZ1b-1 RWm|ZTIx@@#9P+Fc{sL}IR5btq diff --git a/src/main/java/Event.java b/src/main/java/Event.java index beedb5c93a..d52cd577b2 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -23,11 +23,6 @@ public Event(String description, String when) { */ @Override public String toString() { - String date = formatDate(when); - if (getIsCorrectFormat()) { - return "[E]" + super.toString() + description + " (at: " + date + ")"; - } else { - return "Invalid date format!"; - } + return "[E]" + super.toString() + " " + description + " (at: " + when + ")"; } } \ No newline at end of file diff --git a/src/main/java/EventCommand.class b/src/main/java/EventCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..307a5cdd91cf8984c211f3d812a84b0014457b49 GIT binary patch literal 1317 zcmaJ>>rN9v6#k}^PP;4?iim(B$gSMP8$uC<%1sMJTO`I`Lp#7iyVLAW8+a36Lt=`- z#0T)9jAz>-H8f_k({oPG_5053uiuwH0nA~~KpT2PxQF`&`tZO&KL$7+h7iV}cMKV5 zMz4WkjD#?XsDUwz8zfD5{*w{P@`z)W<1s^E(XuVQ#4s979E*~e$qD;#CZ!$AK8)S8 zjD2MA$5mD`gcFu6w~P6G>7>Pejx1cB%1lv{)Dumlg?o~)Tpdg7TCqe*D@Pp4m=|xX zo@Qi0TgrAho{*kWMJFTIEH6jLZnP!vSmt z@z%sUBpA&49%!suHw+yWge*0)nfyBgWvj#O%+)f_(4>l*p|gq~`R@>%nn0BzA7k+C zT9mcm+1581Zb!#%0$o?EF8C@eXH)hDgn94=M8?CGA<`&oup}I-N>}iTB8FCx&8F40 z9;)(Jp^MkJBjOJ#6!|?rhM-o}HDL%_QJ|fB0!qzUsNTX?P4#1K0NJ=pbU88Q9c}t;QqPJKe>M_GdfmJc`Zd; zxX%NPgIIDBKiM!hlg{ofA*^g(E&8xQzE*9#FkJ4hQu6FmSQpP0M=`${6MBAo^~ z0s(qBSvqltbT7bxpFS(V$~kb;GgLBml2vehv5k=WtiX5 zx<>&O^%A!L3cIe=M>T*Js%fGZt<>x-Oi{zL)bcVl+eQESsf)YRYB$L~^xy;i8f4o+ Q8t=(EMS76*X?kb=01RhIHvj+t literal 0 HcmV?d00001 diff --git a/src/main/java/EventCommand.java b/src/main/java/EventCommand.java new file mode 100644 index 0000000000..b486aff4de --- /dev/null +++ b/src/main/java/EventCommand.java @@ -0,0 +1,18 @@ +import java.io.IOException; + +public class EventCommand extends Command { + + public EventCommand(String action, String variable) { + super(action, variable); + } + + @Override + public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + System.out.println(ui.printGI()); + Task assignmentToDo = new Event(action, variable); + tasks.addToTaskList(assignmentToDo); + storage.addToFile(Storage.file, assignmentToDo.toString()); + Ui.printNumOfTasks(); + System.out.println(" " + assignmentToDo.toString()); + } +} \ No newline at end of file diff --git a/src/main/java/Find.class b/src/main/java/Find.class new file mode 100644 index 0000000000000000000000000000000000000000..d76cd389ba964f27a94b0ad863ff229039f12f1c GIT binary patch literal 193 zcmX^0Z`VEs1_pBmUM>b^1}=66ZgvJ9Mg}&U%)HDJJ4Oak4WF#UvPAuy#JqI<;F6-u zymV{LFh&Lz=lqmZMh1SL%)C^;(%hufqL9R-9H0nSaDHh~a;jSKM Lk^?Bh#J~vvPyZpF literal 0 HcmV?d00001 diff --git a/src/main/java/Find.java b/src/main/java/Find.java new file mode 100644 index 0000000000..c0e97ea328 --- /dev/null +++ b/src/main/java/Find.java @@ -0,0 +1,7 @@ +public class Find extends Task { + + public Find(String description) { + super(description); + } + +} diff --git a/src/main/java/FindCommand.class b/src/main/java/FindCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..e711ae52e2347efc4f979ed34aedd9b09dfe3e1d GIT binary patch literal 2130 zcmaJ?-E$LF6#v~c&E0GlX+u*8UtI(xE!ZkTkpxi)RHC6p(}D#AZj;+)n`AfaZc5`9 zq9`-IIOCI@afU~pWt>#$jQZe=Grl;Ze}Mmn<2c~CNeYo>OlI%i^Ks8T=l45z@2?N; z{{Y}HZtK{E7dQ@tu@5im2;d;cAsyWq<2bB?<0T~=QA0vQQpX^Us^Mh~$JF~3HM|;z ziQ^H9cuFl9SHo*MhH;uBt>JYY12`DQ8^~xlqhkV-%HwPg_Tz{e-sE_TBg-+x5ISnv zmVb<4Z#=Ug7R6{u*z==V-?i-dpt&7hxJ%E^jvIkv|! zLvq%sx;Z&+srbF)mYq*I<+8BzBPv+~Ph&TO(Ma5KMwOd^3%IBZml*mQhN^FsMzc9# z+tO8rcNjK3HXL_dQB#R3(`5r!aMggoECVwQQHU1a^(-v7;3^GI>W0&@&D~Q=OK#79%WLt^B zxdv~M^?k$;?a*(kJNjDs7M+cb>53~0F9>f!F8K^3U!W9i5>yj1^v8!f?ZK&E{)wU{XBTA7 zZzRVp?^LyCRWd}I+Y;nwl|P++Day$CXLnCO( zCb+Ce4KT3AK;yKnH3r29DwdvPsFf_o4RuyNVc7GyGc9}3DazI-sEO0K$WfQoI6fuD zGLBQMR_N5H)qzfxgy%^D@2hscS}~f(@-%%eO48fYT-f2G)&}~27EaYFvV;4@Hvcu$ z+f=O(DN!nA37;g#XAIA*tFKdT3_Jhdk8Tf>9`y@=sjnZ6dq~=iF8Tv}c;EgNuy1He zo6@N67&V4qkmgzJC7Bkm&&hoQS^ii>VCEjWRuD`CSJ6Ea3$7rP=w1b%S%H=a1;==- zyN>WOuBf-3&|+Gorw(H*9MkI9Fs76IR2>_aVKirkQbohTt5Lm<-b7EVXZTz6H9TTb z9@FlFuC9a;3&o5&Hl4r4+1-bCVxc|j{N4mI1!@Dm0T;ig|KOn!GC{;7%&G>TuqR+{%w=@D$kCc>_tkc!gXJAebENn#65 zAchS2O=CM|v4h%iCw(yoag)4n5yH1=#TNwGmlW}9g6|IExQikDO!w_C6zMm*P=Ch= zX@NuF56NBQFgb=ehB@|e1UR}mI0GK2yMK_ezc3Q${|9{>`~N2Y=V)n&QXZf%T^Mbo Z|2#gXw@#dWL}}clBu|j6k({FE tempList = new ArrayList<>(); + int num = 1; + while (sc.hasNext()) { + String text = sc.nextLine(); + int spaceIndex = text.indexOf(" "); + int bracketIndex = text.length(); + if (text.contains("(")) { + bracketIndex = text.indexOf("("); + } + String description = text.substring(spaceIndex + 1, bracketIndex); + if (description.contains(variable)) { + String task = num + "." + text; + tempList.add(task); + num++; + } + } + if (tempList.isEmpty()) { + Ui.printIndent(); + throw new DukeException("No such word is found in any of the tasks."); + } else { + Ui.printIndent(); + System.out.println("Here are the matching tasks in your list!"); + for (String str : tempList) { + Ui.printIndent(); + System.out.println(str); + } + } + } +} diff --git a/src/main/java/Launcher.java b/src/main/java/Launcher.java index ce3257483c..fd296a6c5b 100644 --- a/src/main/java/Launcher.java +++ b/src/main/java/Launcher.java @@ -1,11 +1,11 @@ -import javafx.application.Application; - -/** - * A launcher class to workaround classpath issues. - */ -public class Launcher { - - public static void main(String[] args) { - Application.launch(Duke.class, args); - } -} \ No newline at end of file +//import javafx.application.Application; +//// +/////** +//// * A launcher class to workaround classpath issues. +//// */ +////public class Launcher { +//// +//// public static void main(String[] args) { +//// Application.launch(Duke.class, args); +//// } +////} \ No newline at end of file diff --git a/src/main/java/ListCommand.class b/src/main/java/ListCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..8baaee41310b2aeaec684604de97d6d5266795f1 GIT binary patch literal 1511 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 HG4KNbyrvd3 diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 452936a7d2..ae6255e507 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -1,26 +1,325 @@ +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Scanner; public class Parser { + Scanner sc = new Scanner(System.in); - public static Command parse(String line) { + public static Command parse(String line) throws DukeException { + String properInput = line.trim().toLowerCase(); + String[] inputArray = properInput.split(" "); + String taskType = inputArray[0]; + if (!isValidTaskType(taskType)) { + Ui.printIndent(); + throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-(" + + " I can only do these functions for now: \n \n" + + " Todo \n" + " Eg. todo __(task)__\n" + + " Event \n" + " Eg. event __(task)__ /at _(dd/MM/yyyy)_(hhmm)__\n" + + " Deadline \n" + " Eg. deadline __(task)__ /by _(dd/MM/yyyy)_(hhmm)__\n" + + " Delete \n" + " Eg. delete __(number)__ or delete all\n" + + " Done \n" + " Eg. done __(number)__\n" + + " Find \n" + " Eg. find __(keyword)__\n" + + " List \n" + " Bye\n"); + } + int dateIndex = 0; + String date = inputArray[0]; + String description = getDescriptionOfTask(properInput); + if (taskType.equals("deadline") || taskType.equals("event")) { + int slashIndex = properInput.indexOf("/"); + dateIndex = slashIndex + 4; + if (properInput.length() > dateIndex) { + date = properInput.substring(dateIndex); + } else { + throw new DukeException(" Wrong Format! Please follow the correct format! :)))"); + } + } + switch (taskType) { + case "todo": + if (isValidToDoCommand(properInput)) { + return new ToDoCommand(description); + } else { + Ui.printIndent(); + throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct todo format! :<\n" + + " Todo \n" + " Eg. todo __(task)__\n"); + } + case "deadline": + if (isValidDeadlineCommand(properInput) && isValidDateFormat(properInput)) { + return new DeadlineCommand(description, formatDate(date)); + } else { + Ui.printIndent(); + throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct deadline format! :<\n" + + " Deadline \n" + " Eg. deadline __(task)__ /by _(dd/MM/yyyy)_(hhmm)__\n"); + } + case "event": + if (isValidEventCommand(properInput) && isValidDateFormat(properInput)) { + return new EventCommand(description, formatDate(date)); + } else { + Ui.printIndent(); + throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct event format! :<\n" + + " Event \n" + " Eg. event __(task)__ /at _(dd/MM/yyyy)_(hhmm)__\n"); + } + case "delete": + if (isValidDeleteCommand(properInput)) { + return new DeleteCommand(taskType, description); + } else { + Ui.printIndent(); + throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct delete format! :<\n" + + " Delete \n" + " Eg. delete __(number)__ or delete all\n"); + } + case "find": + if (isValidFindCommand(properInput)) { + return new FindCommand(taskType, description); + } else { + Ui.printIndent(); + throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct find format! :<\n" + + " Find \n" + " Eg. find __(keyword)__\n"); + } + case "done": + if (isValidDoneCommand(properInput)) { + return new DoneCommand(taskType, description); + } else { + Ui.printIndent(); + throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct done format! :<\n" + + " Done \n" + " Eg. done __(number)__\n"); + } + case "list": + return new ListCommand(description); + case "bye": + Command byeCommand = new ByeCommand(description); + byeCommand.exitSwitch(); + return byeCommand; + default: + Ui.printIndent(); + throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-(" + + " I can only do these functions for now: \n \n" + + " Todo \n" + " Eg. todo __(task)__\n" + + " Event \n" + " Eg. event __(task)__ /at _(dd/MM/yyyy)_(hhmm)__\n" + + " Deadline \n" + " Eg. deadline __(task)__ /by _(dd/MM/yyyy)_(hhmm)__\n" + + " Delete \n" + " Eg. delete __(number)__ or delete all\n" + + " Done \n" + " Eg. done __(number)__\n" + + " Find \n" + " Eg. find __(keyword)__\n" + + " List \n" + " Bye\n"); + } + + + + } + + public static int getSlashIndex(String text) { + return text.indexOf("/"); + } + + public static int getDayDateNumbers(String text) throws DukeException { + if ((text.length() > (getSlashIndex(text) + 4)) && (text.length() > (getSlashIndex(text) + 6))) { + return Integer.parseInt(text.substring(getSlashIndex(text) + 4, getSlashIndex(text) + 6)); + } else { + Ui.printIndent(); + throw new DukeException("Wrong Format! Please enter a date format as follows: dd/mm/yyyy hhmm."); + } + } + + public static int getMonthDateNumbers(String text) throws DukeException { + if ((text.length() > (getSlashIndex(text) + 7)) && (text.length() > (getSlashIndex(text) + 9))) { + return Integer.parseInt(text.substring(getSlashIndex(text) + 7, getSlashIndex(text) + 9)); + } else { + Ui.printIndent(); + throw new DukeException("Wrong Format! Please enter a date format as follows: dd/mm/yyyy hhmm."); + } + } + + public static int getYearDateNumbers(String text) throws DukeException { + if ((text.length() > (getSlashIndex(text) + 10)) && (text.length() > (getSlashIndex(text) + 14))) { + return Integer.parseInt(text.substring(getSlashIndex(text) + 10, getSlashIndex(text) + 14)); + } else { + Ui.printIndent(); + throw new DukeException("Wrong Format! Please enter a date format as follows: dd/mm/yyyy hhmm."); + } + } + + public static int getHourDateNumbers(String text) throws DukeException { + if ((text.length() > (getSlashIndex(text) + 15)) && (text.length() > (getSlashIndex(text) + 17))) { + return Integer.parseInt(text.substring(getSlashIndex(text) + 15, getSlashIndex(text) + 17)); + } else { + Ui.printIndent(); + throw new DukeException("Wrong Format! Please enter a date format as follows: dd/mm/yyyy hhmm."); + } + } + + public static int getMinuteDateNumbers(String text) throws DukeException { + if (text.length() >= (getSlashIndex(text) + 17)) { + return Integer.parseInt(text.substring(getSlashIndex(text) + 17)); + } else { + Ui.printIndent(); + throw new DukeException("Wrong Format! Please enter a date format as follows: dd/mm/yyyy hhmm."); + } } - public static String dateFormatter(String text) { - int num = text.indexOf("/"); - int num1 = text.indexOf(" "); - int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); - int monthDate = Integer.parseInt(text.substring(num + 7, num + 9)); - int timeHour = Integer.parseInt(text.substring(num + 15, num + 17)); - int timeMin = Integer.parseInt(text.substring(num + 17)); - if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 - && timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59) { - Task task = new Deadline(text.substring(num1, num - 1), - text.substring(num + 4)); - String taskers = task.toString(); - return taskers; + public static boolean isValidDateNumbers(String text) throws DukeException { + int dayDate = getDayDateNumbers(text); + int monthDate = getMonthDateNumbers(text); + int yearDate = getYearDateNumbers(text); + int timeHour = getHourDateNumbers(text); + int timeMin = getMinuteDateNumbers(text); + return dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 + && timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59 + && yearDate >= 2019; + } + + public static boolean isValidDateFormat(String text) throws DukeException { + if (isValidDateNumbers(text)) { + return true; + } else { + Ui.printIndent(); + throw new DukeException("Invalid Date Format!\n" + + " There are at most 31 days, 12 months, 23 hours and 59 minutes! " + + "And remember that the year is 2019!\n" + + " Please try again! Thank you! :)"); + } + } + + /** + * Method to format the date into the appropriate format. + * For example, 10/02/2012 1800 to 10th of February 2012, 6:00 pm. + * + * @param date Takes in a valid date to format it. + * @return Returns the correctly formatted date with the + * appropriate strings. + */ + public static String formatDate(String date) { + String formatted = date; + if (!date.contains(")")) { + try { + Date d = new SimpleDateFormat("dd/MM/yyyy hhmm").parse(date); + String day = new SimpleDateFormat("dd").format(d); + String month = new SimpleDateFormat("MMMMMMMMMMMMMMM").format(d); + String year = new SimpleDateFormat("yyyy").format(d); + String time = new SimpleDateFormat("h:mm a").format(d).toLowerCase(); + String endOfDate; + int dayInteger = Integer.parseInt(day); + + if (dayInteger % 10 == 1 && dayInteger != 11) { + endOfDate = "st"; + } else if (dayInteger % 10 == 2 && dayInteger != 12) { + endOfDate = "nd"; + } else if (dayInteger % 10 == 3 && dayInteger != 13) { + endOfDate = "rd"; + } else { + endOfDate = "th"; + } + formatted = dayInteger + endOfDate + " of " + month + " " + year + ", " + time; + } catch (ParseException e) { + Ui.printIndent(); + System.out.println(e.getMessage()); + Ui.printIndent(); + System.out.println("That is the wrong date format! >:-("); + } + } else { + //isCorrectFormat = true; + } + return formatted; + } + + public static boolean isValidTaskType(String taskType) { + if (taskType.equals("todo") || taskType.equals("event") || taskType.equals("deadline") || + taskType.equals("delete") || taskType.equals("done") || taskType.equals("find") || + taskType.equals("list") || taskType.equals("bye") ) { + return true; + } else { + return false; + } + } + + public static String getDescriptionOfTask(String text) throws DukeException { + int spaceIndex = text.indexOf(" "); + if ((text.contains("deadline") && isValidDeadlineCommand(text)) + || text.contains("event") && isValidEventCommand(text)) { + int slashIndex = text.indexOf("/"); + return text.substring(spaceIndex + 1, slashIndex - 1); + } else if (text.contains("todo") || text.contains("done") || + text.contains("delete") || text.contains("find")) { + return text.substring(spaceIndex + 1); + } else { + return text; + } + } + + public static boolean isValidToDoCommand(String text) { + return text.contains(" ") && text.length() > 5; + } + + public static boolean isValidDeadlineCommand(String text) { + return text.contains(" ") && text.contains("/") && text.contains("by"); + } + + public static boolean isValidEventCommand(String text) { + return text.contains(" ") && text.contains("/") && text.contains("at"); + } + + public static boolean isValidDeleteCommand(String text) throws DukeException, NumberFormatException { + if (text.length() < 7) { + Ui.printIndent(); + throw new DukeException("Wrong Format! Please add an 'all' or a valid number after the delete word! :)"); + } else { + char[] valueArray = text.substring(7).toCharArray(); + boolean isNumber = false; + for (int i = 0; i < valueArray.length; i++) { + isNumber = false; + if (Character.isDigit(valueArray[i])) { + isNumber = true; + } + } + if (isNumber && Integer.parseInt(text.substring(7)) > 0) { + return text.contains(" ") && (text.contains("all") || Integer.parseInt(text.substring(7)) <= TaskList.listOfTasks.size()); + } else { + Ui.printIndent(); + throw new DukeException("Wrong Format! Please add an 'all' or a valid number after the delete word! Thank You :)"); + } + } + } + + public static boolean isValidFindCommand(String text) { + return text.contains(" ") && text.length() > 5; + } + + public static boolean isValidDoneCommand(String text) throws DukeException { + if (text.length() < 5) { + Ui.printIndent(); + throw new DukeException("Wrong Format! Please add a valid number after the done word! :)"); + } else { + char[] valueArray = text.substring(5).toCharArray(); + boolean isNumber = false; + for (int i = 0; i < valueArray.length; i++) { + isNumber = false; + if (Character.isDigit(valueArray[i])) { + isNumber = true; + } + } + if (isNumber && Integer.parseInt(text.substring(5)) > 0) { + return text.contains(" ") && Integer.parseInt(text.substring(5)) <= TaskList.listOfTasks.size(); + } else { + Ui.printIndent(); + throw new DukeException("Wrong Format! Please add a valid number after the done word! Thank You :)"); + } + } + } + + public static String findWord(String text) { + int spaceIndex = text.indexOf(" "); + return text.substring(spaceIndex + 1); + } + + public static String findToDelete(String text) { + int spaceIndex = text.indexOf(" "); + return text.substring(spaceIndex + 1); + } + + public static String findTaskNumber(String text) { + int spaceIndex = text.indexOf(" "); + return text.substring(spaceIndex + 1); } } diff --git a/src/main/java/Storage.class b/src/main/java/Storage.class index 617e3ea4948b5dd33e1134a159d95ad6e5a0917f..8a3860478f63d0af153972b49cfa3d1d2c00c5dc 100644 GIT binary patch delta 1422 zcmZ9LTU3-)6vuyOfH~iMe2am}q#z5Iw4w+HN)jy!2)vG0z-t<#j4(LP;4q+wIbf!u z-R#T4?pkJL7ljnkGJ9?HQm^&WL#tMA^=7rOea2ji)wkB!`|N%8`Jey3eAkLj7pK3S zymSSa%T=3stkJBs@vzQjJsSdYu-TYT8qsD%ShGd5)y5`l14_gEogatQj^pju^4V;;80X&2tLt z*tK8P^X|{8Nxz_ZQFF|#@Fbh-XjTNe!hPXjG!a}7jYZZbqp3*Jp^ld{uEWb5SL8P& z5~-e4GTgl^lIl#f_xQcMV)3fO2qzp~qu$|ln$4|x_fOCK);ivBc$2pjw`9O$;dn=| zr8Ak>72XnyIK0g}3TNuO4v+Gfq9EhzO+{nD=B?p){05bi4vSgh4rMi@Pw}q9dxn(S z=x~}P4)1eDtP+P0_)s=24j*w=HjT2H6xl6__JoQ0*kL{oJA9HkEt8@&M#Al}Xj}-@ zA(1&veUW%d^QpsUCYy6coM%)qV|}7GS+Xq}b8E8;XO201PW{c?GGyzM$#8!t+LJO+ z7u??LZ?Y~jJ~l5WrEFh!G8#{X(kbz?W%`4HSt<9cro{V9Pcrz6eBY-H{$@c% z=;jOI=|c7np*vG}mCA&ci7prX*@93luhq$GAwgIzaw98fV<4J&0P8p= zcaMu65!|JMzKFa@$~7U)GW8E0Sw8g_?udPB?Q(IWH2&*ovNXmPE91(U!d%IFE6Fm2 z^vspQ`lWnb?(cSmDs^wm9abmYQ@KIa;r@_YrK;U*r!q~}naLj~2u@HrN>$*2i#&Ll zIqOF$8>f1C#W^A7$uyu($_pLj(kVZFmss1mhaHl3T>i)ewR8)|oswLV??~~JB>M|} z{KjtnpkH~}qw*L~h3r*D>{GKys~Tnvsyc?$V)m;L2h|D=snr}-tqiM898sMdWvP4B znVzoE6li%^a+f;XSm5_NMa5OurF&A8n;}Bj^xi9aq4e#>xUIsH`ZvogNNu=Z&dir@ wavkTPG0FmS#|Zp?-g0H49I0nZsRVl@x67h!0r`TjxWw(!U<6q4gse^f0v~|` zkY?B`^`bUqCOl@dkP%xvqnfzILpF;{?m`kGvLr3WY&v<^h?GUz=#0g<(GwPv7JD>% zjrEAl%?z00`)pRT-{OGgpiK=~%^{mwvNn(Mm{*#A+~Tm!6CBYzX@Z|JqSxZ6=4s6{ z3M&&zj|SZW^_zOu{X@0u=QPi2UT{}=Qr%5-Df}a$iBKSx40Ocek-k(c6G=HV@uKFK z!*N_iX=^f>NoP`_vCc>)nhd9X#k^#3!r>$@JDj4~;T5_}RJ-|MiJdlY3k-*_e#4|MMiB@+2o-g4N$M)ycTYxZs4 zad_7>rTQJ-W23|SoEEFn;R8ODO^?Gzd@P$bS?!9#o@6*_qCRoBlSYS6bEnk;Oi(xP!kee)IJeOWHg^Sd~T-sf-ea1)Ots)IyjVzQj#X8!=ZgFR<+8T4}7e7Kp zn;S$frh;8 zt{2MQC?i$T$Wpo`yHQBHmK8EgeQuCuf-*{%+}SUc2G~SQ{;8CB$7R2dtsIuqW0HG9 z^eL&kNvdyP!7MeJ&6=RPibs}LU7>5Sbrr43u25uIEou%6kET=NP#WJHnu5G7R?by4 zZxqEAxvsz<>!}i?eS&BBcuB3Qa#xfbRVUpGB>@$7FPGG*Rc^VnGCTY01p-s7^w*td z)g@MMo1%J#HCt-WNQ<7_Qw#~f5Tb-Z`SHUnAtEpi3jk3WB_>de$f%?A66Yrp{6do7 z8RN1*@F!`tfQ(wixGHB--NYW%%wDyT{VK=-mEFog)kjthawvyN6ZStW)0Alz&aneq z(~!4h@J>M>zrg2n$}8&Tqzi%LT8MOPXizM=L!L0tyn6-0`vmwr-)@sL^Oc%mXVz0c pO|}2_Y5f1^o)&gl0%f-Zd+6bUXj_V$=OQx#$#$_VvHNB1_!lT$`%?e_ diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index 1bed9dffcd..0d98c54613 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -132,6 +132,7 @@ public ArrayList load() throws IOException, DukeException { break; } } + Ui.printLine(); Ui.printIndent(); System.out.println("Your file has been loaded! :)"); tempList = new ArrayList(taskList); diff --git a/src/main/java/Task.class b/src/main/java/Task.class index db1af3a29be5f3450b622c6ec6297c927791d6dd..ff1f67d1ab696947152ef52993e5b38daacd5833 100644 GIT binary patch delta 494 zcmYLEyG}wu6r6?YeQ^~9d?NA?5K!6we8rbs_>6#kT5X(cHn-e*O~9Ya?+TcnyW=&E>xa_vMJxS?ItajV(2G6?LG;o0 zc_TY`?O+JQ0{s=&^_pIzdbVBjj@*N0P)E^3$-yk<ER^IkR zv~?S$pigaTNlX43q2z%Mta)fhX6k`m4QrCF*=n=SbMB9t8NNg@x!YY>e Mbe4CM_bHy-FLYr%hyVZp literal 2941 zcmbVOTXP&o75;j6wKE!xEqg85k&Vsx5?hvREf6O-D`S$#mb0LhOr+Rxj0xkNwsxf5 zne|MsY>@;)E?g4AEnJ+C6g*JnJcO!15yfRH6jbq)2db#bOR9JQ{s-pknbk_R6hENL z={cv*`TE@Y^5K7P{u#jM@s@=HIMI#$IH}3FCZ|k1YNBl6OZc)T6Wyp_(!`X7)A)*( zJXWCb8H>7S3lKPG;z<+dEj)m)8n|HMYZkWPDNVj^!qwwN6IBzQ38}R%S(ru5gl}Tb z#Jq`m0T~1aLJND*G;!HLWFQvk@nl?${HF55K%g)&=PtO#x*N7?LS5^i zfdv{)hpnh8$9)}gw_bKcC)vhf9JMisgEodRY~v7y1+xEs^R;qxb*S9_!zR%dY^GYN(QufYAK-|A zS8e3PU7TZ+-zHjaj4g?l9~R3~oz(<3CeoJj>&3K5GLQQ# zc+y0=^_Lr}9C$Lg19&l3vcbBCEl%{OjYRy@x^KCvbQ|1vmz%rJJ)-x_>egoS z^Ne{7KNHwJ8D4P~!i(Ps&Z8C>8_@(kHEgwT4_#4+xVUA>0>9Y z(2D-b1lI1|jSsBsO!~wFOa8~hvu!V5KOU#fs$Am@Rb(8yv(muNbw|I>cvoEagN1NjwvXbpHsfwph0&scUok}!VL0Dv((Q5( zF!H(^$C7opwmQRYjPwL})D674jQ6F6qjwGEHp7|4rd&t;{3?WW$1ImJxkK6zV{W}Z z?JGHI;7x&h*TlD;Z#yw_;NVfM%Y6| zjgTM8(c2YAtt6Ncx?AM@gB|_*+WNgWVBCQD2Xq&#CG@Nq78sj;nq+B`r{PAF2v8!I zNnC!g4bY!j-++A+8vtSu@lKdA!kl2bPBKm77$tCyV8{6Xg-#Ckkkb)ZLrd6r6TN^A zKTUTU{uH_6cZ*=tIuV@V(q|dL6O7;-0ltWbNSSo;A(LWpiT?~&h6|gQPqu=5y~~h$@B#k9cU{_0bJ)(%J#vyWvlu{)+rwwU=UAb6 zrmKOc5c0Q)1zhHx9^qBQcnb=@rQ~hCI)2AT#|L:-("); - } - } else { - isCorrectFormat = true; - } - return formatted; - } } diff --git a/src/main/java/TaskList.class b/src/main/java/TaskList.class index e14442d44386f5cecd590169165f150b17dd193d..ddbe4188a3302c0d6f379d50104c6389d56bafec 100644 GIT binary patch delta 429 zcmYjNOHKko6s#Ucni(2V1Y{6K5J5ivP{D;4(1e``F>ynJF~$Xnu=fn6m!3jRG||KZ zxNzkOTzCa{#_G`+7gMiaO;x>@ckO?M_Fujpp8@Qk=^}=r#8Ma~7Z%D6rm!qgaS%e) zB?L^(&~+CID-x@w(z7P9e)aM0^#_B_u+tx%x6ejn0jJV7&2F`;53O1=4Nt%}i~xOU zY$zm<6p#nw;YI)SM4^FAg%su#rZJ8Low?tCsWkPiItL^JOnQfuKC1PBAf;m(| zAkNOhENm0Ww{2pADmclbBBS5Jjlw*+IR64sqNF#B1!fslmI)bMcAA$)mBJ)3{ZHkg zh|KS#934KL%%!SCr^V{r!mZyU(z{_JU}DTIfgH#9{PI7mkSPW{5P5<+dO-9J?w={n NYx70{7FaDTeghXIE|>rS literal 3867 zcmd5_^Pj_SKDzO90H4N+hI`Pj;&=#;XsEzI82d4(VknFt9@W_RlER7MC+iJrk}p4nnBMT zn>uDr`@5?6x&rO++?bg5EXQ_Ld_zGbZ>lSqT(ws1IX%wmNEb80_6kE4XBbUFn297K zTGa`4jB)J8tqnSv^q4qe$tY_id=l(^k^mj;=pZIir~q9`l4RG=6-p2fFxJcs91yrAPnId};jDqhy{3eM{IHeS{79h}qg8qVvufQvdV;j)e^ zcwNW5oOlBrI=(BLH)ZpdT)v>=ZG2C`@xwDBo%JS(nPJ&RmhKxedyGlbHAaQ7jkHKP zGa}JwbR`l-ij*5N7hJ=0j0xcxu4kq_kub~&)3O^I8&zD@u_#0Pem-0$;Yj~~K(G%v zj^}!5bNZO@CY^*^8^jMo_>qnu;~gD8!A}`+D>I8e*`5UGoPtepd&W#!2_s>8!Wehb zDbs7z@vc;^>B&rqRYny|A5EoF2M-$YT`9wL(&?-*n(+*8QqXBremw@j*zVm=YgtzY zY*J!-lZ?(z$WVpM(mjUl7`B)&J!?kz8@q;?OgghNPS=%)1NtI z*$FY%KmIR{N1O-O&5V)_|5R^oipO`CGqYjM=eX^O2|@ot(`MQg9J10(bGv|$Z$D9l&3YD77AD6IlLt&=4VLr3giy4-`LDDYv9wetX z!CP=y!+W^KO$C{AU} zB`8M86nQiKt+ro7G^Dnb)r3hJqcp#8=KY z1zZ2U9vb=DxQADNB`*h-e<=7AM-@1LfV?Nz56HWLzah@?Heq`|M?IADMuE}11f_We z6~ocWB?PXcii6L}=B8|4b%Hnt&bKp5K);Y>RYayMzQmopXo-Toge zw!9B*&FW@UaZO!`)jMz(?kq&{0C(uZp~4QoqE?XFc1yH62mSt*`oKti)kqFC%ebwx z`2$qtP}{JK$TesUfkX})PEZ(TEYZpwqLk*au`N&+_z;^ETtuVn#T5J!6>U`o%{toH zoWt#lAO9|IaEtV{!be~qs@dNGl~1b}cA*|ke0eqVvxj)^#Sq_9W4IgRAz8b}}=7hv`}`G#q25^wFVyB6FPi_z0aE;LPAU=i)`@l=I|Q#;y&+X7yT zRn6mUtSX`};JH|E9%o{~$d&~>6;m%G8&f0g3rMeE=Wt6yz09B*xwQ|-uC`EJh(Wi7 z>%!5d9ClyAeQOXBth#UsR8n;ntGe(SQj3TX@f9==*M*nR@{2`m%u_5y(LGYMmT;rw z6Br?wCJ){ywlck1ks!Z<(2nCtO!9SS;T%r#={AL{OuKjZ@4>rp@H0%~*EogWB8}g} z!yk~rA2EwRVGe&r7JtEM{GAqLk{SqnOeIaleiaWX{-25p_JO}buc-Cu3NlBV{mgy% z|BkS|w-UDRe@58zB@o?vLN4Y>*c&A5O%nDN30ojxZ-_DuK>d c(pg#b`jF$VM(GDw#&woymt%R6c>HGm2^O!Qod5s; diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 49cb610790..bdc4658b2d 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -25,146 +25,7 @@ public TaskList(ArrayList list) { listOfTasks = list; } - /** - * Deletes the specified tasks off the task list. - * - * @param text Delete command with the which tasks to delete based of their numbering. - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. - */ - public String deleteCommand(String text) throws IOException { - int spaceIndex = text.indexOf(" "); - int taskNumber = Integer.parseInt(text.substring(spaceIndex + 1, spaceIndex + 2)); - tasking.printRemove(); - Ui.printDelete(taskNumber); - listOfTasks.remove(taskNumber - 1); - store.writeToFile(Storage.file, ""); - for (Task task : listOfTasks) { - store.addToFile(Storage.file, task.toString()); - } - return tasking.printNumOfTasks(); - } - - /** - * Deletes everything off the task list. - * - * @throws IOException If the named file exists - * but is a directory rather than a regular file, - * does not exist but cannot be created, - * or cannot be opened for any other reason. - */ - public String deleteAllCommand(String text) throws IOException { - store.writeToFile(Storage.file, ""); - listOfTasks.clear(); - Ui.printLine(); - Ui.printIndent(); - return "Everything in your list has been removed! " - + "Add more tasks to get started again!!!"; - //Ui.printLine(); - } - - /** - * Adds todo task into arraylist and into file. - * - * @param text Takes in todo command with task. - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. - */ - public String toDoCommand(String text) throws IOException { - tasking.printGI(); - System.out.println("1"); - Ui.printIndent(); - System.out.println("2"); - int num = text.indexOf(" "); - Task task = new Todo(text.substring(num + 1)); - System.out.println("3"); - System.out.println(" " + task.toString()); - listOfTasks.add(task); - System.out.println("4"); - store.addToFile(Storage.file, task.toString()); - return tasking.printNumOfTasks(); - } - - /** - * Event command with event and date at which it is and adds - * it into the arraylist and file. - * - * @param text Takes in a event command with the task and date. - * @throws DukeException If the user inputs more than the normal - * number of days/months/time, this error will be thrown out instead. - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. - */ - public String eventCommand(String text) throws DukeException, IOException { - int num = text.indexOf("/"); - int num1 = text.indexOf(" "); - int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); - int monthDate = Integer.parseInt(text.substring(num + 7, num + 9)); - int timeHour = Integer.parseInt(text.substring(num + 15, num + 17)); - int timeMin = Integer.parseInt(text.substring(num + 17)); - if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 - && timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59) { - Task task = new Event(text.substring(num1, num - 1), - text.substring(num + 4)); - String taskers = task.toString(); - if (!taskers.equals("Invalid date format!")) { - tasking.printGI(); - Ui.printIndent(); - System.out.println(" " + taskers); - listOfTasks.add(task); - store.addToFile(Storage.file, taskers); - return tasking.printNumOfTasks(); - } else { - Ui.printIndent(); - throw new DukeException(taskers); - } - } else { - Ui.printLine(); - Ui.printIndent(); - throw new DukeException("Hmmm?? I'm sorry but there are at most 31 days in a month! " - + "And remember, no negative dates allowed as well!!! :)"); - } - } - - - /** - * Deadline command with deadline task and date at which it is and adds - * it into the arraylist and file. - * - * @param text Takes in a deadline command with the task and date. - * @throws DukeException If the user inputs more than the normal - * number of days/months/time, this error will be thrown out instead. - * @throws IOException If the named file exists but is a directory rather than a regular file, - * does not exist but cannot be created, or cannot be opened for any other reason. - */ - public String deadlineCommand(String text) throws DukeException, IOException { - int num = text.indexOf("/"); - int num1 = text.indexOf(" "); - int dayDate = Integer.parseInt(text.substring(num + 4, num + 6)); - int monthDate = Integer.parseInt(text.substring(num + 7, num + 9)); - int timeHour = Integer.parseInt(text.substring(num + 15, num + 17)); - int timeMin = Integer.parseInt(text.substring(num + 17)); - if (dayDate > 0 && dayDate <= 31 && monthDate > 0 && monthDate <= 12 - && timeHour > 0 && timeHour <= 24 && timeMin >= 0 && timeMin <= 59) { - Task task = new Deadline(text.substring(num1, num - 1), - text.substring(num + 4)); - String taskers = task.toString(); - if (!taskers.equals("Invalid date format!")) { - tasking.printGI(); - Ui.printIndent(); - System.out.println(" " + taskers); - listOfTasks.add(task); - store.addToFile(Storage.file, taskers); - return tasking.printNumOfTasks(); - } else { - Ui.printIndent(); - throw new DukeException(taskers); - } - } else { - Ui.printLine(); - Ui.printIndent(); - throw new DukeException("Hmmm?? I'm sorry but there are at most 31 days in a month! " - + "And remember, no negative dates allowed as well!!! :)"); - } + public void addToTaskList(Task assignment) { + listOfTasks.add(assignment); } } diff --git a/src/main/java/ToDoCommand.class b/src/main/java/ToDoCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..8ff25d6e50bbb442f90843f510c0aebbe9d8bc10 GIT binary patch literal 1288 zcmaJ>ZBr6a6n-uu3+ozcnrUfjzJPD^PKjBGueFK=<}`h}!c|vbFT-9O{U`m6oCX`4 z=?C$ryz4Wl94z?hD9 z4C=U#@en33sbdNeovf&vI^9D6^BQ6r9xwzJE!$E{41E#vn4j=if!l|%v?^QnVIumG z!Jm{l!4NhrTWnW~`=XrT`vr<<;#6cSimbtinc+^}v>cT%cddk(R3c*vlqWu=@IYnF@Am60nlDT_sJ=jL5{16}CW@W{YpJkjvfz%#@(JU8$H-PBA* z=A?lIBs44CVu}bGeMX_Cxid)MlVH20{WJ)O7c|c?>}% z>yu^()ynHrnQE~L&Ft=Sglos6wMZSfh>ni8ct^sFj4+1&BF~GYw6k38S?Y)^M{!#@ z43jMgTBxJJbVs$rFn%q*WuM5rXl!U5eT_7dyj`&(?rQ@yW|(L? zU#s32hX0?3QM&zMy54{fw6f@?r+eMU$oJ7ZFge)7K&DGfJJ#QI9XF%Ukr-PaX6V?`^Vu7(j~NI>ol|9^2&4kRK#}mVR@807^bV Ay8r+H literal 0 HcmV?d00001 diff --git a/src/main/java/ToDoCommand.java b/src/main/java/ToDoCommand.java new file mode 100644 index 0000000000..6b50ca067f --- /dev/null +++ b/src/main/java/ToDoCommand.java @@ -0,0 +1,18 @@ +import java.io.IOException; + +public class ToDoCommand extends Command { + + public ToDoCommand(String action) { + super(action); + } + + @Override + public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + System.out.println(ui.printGI()); + Task assignmentToDo = new Todo(action); + tasks.addToTaskList(assignmentToDo); + storage.addToFile(Storage.file, assignmentToDo.toString()); + Ui.printNumOfTasks(); + System.out.println(" " + assignmentToDo.toString()); + } +} diff --git a/src/main/java/Todo.class b/src/main/java/Todo.class index c2c6aca21c936f4a6e9ecdd1f4a59b0a3cc5c973..53730da2c7bbb3ae414ef85f41e266bb10f95d9e 100644 GIT binary patch delta 23 fcmZ3&wuEiNVJ22i237{H$tReM8AT@lVbTBqO~M96 delta 23 fcmZ3&wuEiNVJ21%237{n$tReM8HFeRVbTBqO``@v diff --git a/src/main/java/Ui.class b/src/main/java/Ui.class index ba050566f993c38340db5c318ef52953ce44ccab..e997c1f857a23b9bf53888d420322b65bf93f0a9 100644 GIT binary patch literal 4026 zcmbtW`+F4C8Ga{(%CgQ)`hVEI-^|`ZQu{+UPtKh4o$q$u@B7Yo{`twx zzXSLJ7Sh;@DHEqsIE^!D^x!KgWO3HS6KV8eN)}I=IF~{SUrlp(N+<Lae8Xr6LMBw{wR@gW0uE{UFrAKLg4ek=?> zv2i~>OQ2dIwDABwMRvGp zpPKOl<@p!((c{?qluxF3CWjlF9Z```3WcGFu^%oJ;=QqXCgNf?9g{kID(gh5FjOjK z$H%h`{)P)f<#M&!QgN6mT44$=)>3LwyA@40K3$O{?d@t}8kKl)(b1^lK}&IdE2mP4 zPa!37o19R(rDDD#u2)*jHzO4C&FRJkKPa`%Bo&Y_vJBG(_T?%SHLaCXk|bBIr>eX# z)QonbdZ0rU`o1@)PE@qRn2@jLL@t3HRQrZ`bw~hgyu%=3RC40~{2ADM)Q^-Kji}tt z`PeC4Vm`Q`lF;rmpy>68I_B3jgRVlYRl~0fQ-I(xs*wL43<}IWl5n91|9PEs1>C#&7Vx zf!$MOP2}jS#~hYhNYJEvfs)Hv73)DjL_RpI(sxk#kw ze{16dyl>%mV)pk2VB-(?Bg>4=mYdO=AurYUoN`Hz6~s68@#*ur$g6K{OK0wQ`+_9u zEvi_evLk-oD|PL6DVl7Ak*?B!%U(2)+<$a2ZWC+^+NrWFtZ!b7w{67TMjSMdS$cEw z*7Ni;QPMM3_|kPc`cFu6Y3fho3jSo^{$sjQ@dwp-LwQa$20m@X#c-y~x|SOyC)bHw zAB@7IirId5)tS?yzE^ajGj3GoEQ}m4V!zn2++Dt$lWhdMTx#{W3Ncw3w<0zu33|I7 zHBS6TXHC*9b<;Dmo6E{C$i+A%sw zB^f5(jL=Uv9IMu%M%?_LU_0tWN@BlXLS&YmaDtIw^%x_{FtBqdw-kwGdvvH>`!*_Hv`cPKvTsiukA@U()&$ZGq8Qh z`IhsIcg?5sVUX{}y?lADK(D+GIO~;HLHy+-fZsKIRPuGf@rztdai5n1_UyV2W7jS8 zoV|(_*U@_oE4k`BdmZLASe&M~k-m;q*I@sJ{A>ms@4`xsYp5fI4CL*)3cEQoupbAS z78Ji?!P@mPRxV)mM{Vi8m_ESq;kG|>e9-ogBb&J+e*^tDu;wc6+9hY{|4PYYy*vj|yeROOa2CxI``EXVQ=RU%-o6w99oRmC2XkLKW9-9SHw3oSS z0e5#)%1aw$vUui{JX@L~dzvD4)2;RNr6Y9*T>uVo93?7al=)H{ldW6{CViC5+|xlM zv6QFGIQI`OvLyU1OBCI>gT2tJt`qx3qvw z|G?%2+}n;sW=jkD?tRrc!3Kg3Orsw~#;io>HM3%d(9aUPv9_gb(^3-B|Dr5`<7u)6 zbn8g_P>bLj>=;k@pC$iuGWDAFl3)prUeVOeaNw(}DCbzINDUhMZq=;Be!};EacQ0VqWo%0FV-r`aZ!-BL zlV9jDKKS>)GJC|0p177C#A?o8p`lla;cG=sP?jna>k grw5ae8cI|4L;RItx`!DAtmFO+X|wV8Ts(f~KdnZzwEzGB literal 5681 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 B(}@58 diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index ef26517ed1..a2b959e1c9 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -43,82 +43,12 @@ public void greeting() { + " Delete \n" + " Eg. delete __(number)__ or delete all\n" + " Done \n" + " Eg. done __(number)__\n" + " Find \n" + " Eg. find __(keyword)__\n" - + " List \n"); + + " List \n" + " Bye\n"); printIndent(); System.out.println("Ill be adding in more features soon! Please be patient! :)"); printLine(); } - /** - * Scans the input from the user and does the respective - * command based on the input. Prints out error messages as well. - */ - public void nextCommand() { - while (scan.hasNext()) { - try { - String text = scan.nextLine().trim(); - if (text.equals("bye")) { - Ui.printBye(); - break; - } else if (text.equals("list")) { - printList(); - } else if (text.equals("delete all")) { - listTask.deleteAllCommand(text); - } else if (text.contains(" ")) { - String[] splittedText = text.split(" "); - if (splittedText[0].equals("done")) { - int num = text.indexOf(" "); - int taskNumber = Integer.parseInt(text.substring(num + 1, num + 2)); - if (taskNumber > 0 && taskNumber <= TaskList.listOfTasks.size()) { - printDone(taskNumber); - } else { - throw new DukeException("☹ OOPS!!! There is no such task " - + "number in your list of tasks!! Please enter a valid number!"); - } - } else if (splittedText[0].equals("delete")) { - listTask.deleteCommand(text); - } else if (splittedText[0].equals("find")) { - ArrayList strList = findCommand(splittedText[1]); - printKeywordList(strList); - } else { - if (splittedText[0].equals("todo")) { - listTask.toDoCommand(text); - } else if (splittedText[0].equals("deadline") - && text.contains("/") && text.contains("by")) { - listTask.deadlineCommand(text); - } else if (splittedText[0].equals("event") - && text.contains("/") && text.contains("at")) { - listTask.eventCommand(text); - } else { - printLine(); - printIndent(); - throw new DukeException("☹ OOPSY DAISY!!! Please follow the correct format! :<"); - } - } - } else { - printLine(); - printIndent(); - switch (text) { - case "todo": - throw new DukeException("☹ OOPS!!! The description of a todo cannot be empty. " - + "It must be in proper format (i.e. todo clean table)."); - case "deadline": - throw new DukeException("☹ OOPS!!! The description of a deadline cannot be empty. " - + "It must be in proper format (i.e. deadline return book /by 23 Aug)."); - case "event": - throw new DukeException("☹ OOPS!!! The description of a event cannot be empty. " - + "It must be in proper format (i.e. event Don's birthday /at 15 Jan 3pm)."); - default: - throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-("); - } - } - } catch (DukeException | IOException e) { - System.out.println(e); - printLine(); - } - } - } - /** * Prints indentation. * Helps to order the output, making it much neater. @@ -138,15 +68,25 @@ public static void printLine() { + "______________________________________"); } + /** + * Prints a statement informing the user that the bot + * has added the task into the list. + */ + public String printGI() { + Ui.printIndent(); + return "Got it. I've added this task:"; + } + /** * Ends the chat bot. */ - static String printBye() { - printLine(); + public void printBye() { printIndent(); - //System.out.println("Bye. Hope to see you again soon!"); - return "Bye. Hope to see you again soon!"; - //printLine(); + System.out.println("Bye. Hope to see you again soon!"); + } + + public String readCommand() { + return scan.nextLine(); } /** @@ -175,12 +115,32 @@ public static String printDelete(int i) { //printLine(); } + /** + * Prints a statement to tell the user that the task has been removed. + */ + public String printRemove() { + Ui.printIndent(); + return "Noted. I've removed this task."; + } + + /** + * Prints the number of tasks in the list. + * + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ + public static String printNumOfTasks() throws IOException { + Ui.printIndent(); + return "Now you have " + Ui.getNumOfTasks() + " tasks in the list."; + //Ui.printLine(); + } + /** * Prints the list of tasks that has been added by the user. * * @throws FileNotFoundException if there is no such file that contains the tasks. */ - static String printList() throws FileNotFoundException { + static String printList() throws FileNotFoundException { //WHY NEVER USEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE printLine(); printIndent(); if (TaskList.listOfTasks.isEmpty()) { @@ -197,7 +157,6 @@ static String printList() throws FileNotFoundException { } return ""; } - //printLine(); } /** @@ -224,59 +183,7 @@ public void showLoadingError() { System.out.println("Nothing in file!"); } - /** - * Method to find the keyword searched - * by the user. - * - * @param wordToFind Keyword entered by user. - * @return Returns an array list of tasks that contains the keyword. - * @throws IOException If the named file exists - * but is a directory rather than a regular file, - * does not exist but cannot be created, or - * cannot be opened for any other reason. - * @throws DukeException This will be thrown out if there - * is no matching words to the key word searched - * by the user in all the tasks. - */ - public ArrayList findCommand(String wordToFind) throws IOException, DukeException { - File f = new File(Storage.file); - Scanner sc = new Scanner(f); - ArrayList tempList = new ArrayList<>(); - if (Storage.countLines(Storage.file) == 0) { - printIndent(); - throw new DukeException("No such word is found in any of the tasks."); - } else { - int num = 1; - while (sc.hasNext()) { - String text = sc.nextLine(); - if (text.contains(wordToFind)) { - String task = num + "." + text; - tempList.add(task); - num++; - } - } - } - System.out.println("5"); - return tempList; - } - - /** - * Prints the Start of the message that prints - * out the list of tasks that matches the keyword - * inputted by the user. - * - * @param list Prints out the array list of tasks - * that contains the keyword. - */ - public String printKeywordList(ArrayList list) { - printLine(); - printIndent(); - System.out.println("Here are the matching tasks in your list!"); - for (String str : list) { - printIndent(); - System.out.println(str); - } - printLine(); - return ""; + public void showError(String error) { + System.out.println(error); } } \ No newline at end of file diff --git a/src/main/java/todo.txt b/src/main/java/todo.txt index e69de29bb2..f9e49dc736 100644 --- a/src/main/java/todo.txt +++ b/src/main/java/todo.txt @@ -0,0 +1,10 @@ +[T][?] herf asd +[D][?] hello (by: 2nd of April 2012, 3:00 pm)) +[E][?] jam (at: 2nd of March 2044, 2:32 pm)) +[T][?] asd 123 +[T][?] 2 +[D][?] deadline asd /by 02/12/3123 1234 (by: 2nd of December 3123, 12:34 am)) +[D][?] deadline asd /by 14/12/2111 1200 (by: 14th of December 2111, 12:00 am)) +[E][?] asd (at: 14th of December 2019, 12:44 am)) +[D][?] asd (by: 2nd of December 3123, 12:34 am) +[T][?] deadline From 20b7205bca6d61719fcf10f9c1b3f6430daadfba Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Mon, 16 Sep 2019 19:44:40 +0800 Subject: [PATCH 30/51] Did some changes to handle input better. --- src/main/java/ByeCommand.java | 4 +- src/main/java/Command.java | 4 +- src/main/java/DeadlineCommand.java | 11 +- src/main/java/DeleteCommand.java | 14 +- src/main/java/DialogBox.java | 44 ++--- src/main/java/DoneCommand.java | 7 +- src/main/java/Duke.java | 290 ++++++++++++++++------------- src/main/java/EventCommand.java | 10 +- src/main/java/FindCommand.java | 7 +- src/main/java/Launcher.java | 22 +-- src/main/java/ListCommand.java | 9 +- src/main/java/Parser.java | 3 - src/main/java/ToDoCommand.java | 11 +- src/main/java/Ui.java | 7 +- src/main/java/todo.txt | 1 + todo.txt | 4 + 16 files changed, 245 insertions(+), 203 deletions(-) create mode 100644 todo.txt diff --git a/src/main/java/ByeCommand.java b/src/main/java/ByeCommand.java index d098a07bf3..c9f54b599c 100644 --- a/src/main/java/ByeCommand.java +++ b/src/main/java/ByeCommand.java @@ -19,7 +19,7 @@ public ByeCommand(String action) { * @param storage Stores tasks into file. */ @Override - public void execute(TaskList tasks, Ui ui, Storage storage) { - ui.printBye(); + public String execute(TaskList tasks, Ui ui, Storage storage) { + return ui.printBye(); } } diff --git a/src/main/java/Command.java b/src/main/java/Command.java index d2b54927f4..8716038cc8 100644 --- a/src/main/java/Command.java +++ b/src/main/java/Command.java @@ -21,6 +21,8 @@ public boolean shouldExit() { public boolean exitSwitch() { return canExit = !canExit; } - public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException, DukeException { + public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException, DukeException { + return ""; } + } diff --git a/src/main/java/DeadlineCommand.java b/src/main/java/DeadlineCommand.java index 1f0af253c4..b88097a93c 100644 --- a/src/main/java/DeadlineCommand.java +++ b/src/main/java/DeadlineCommand.java @@ -7,12 +7,15 @@ public DeadlineCommand(String action, String variable) { } @Override - public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { - System.out.println(ui.printGI()); + public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + String deadlineOutput = ui.printGI() + "\n"; +// System.out.println(ui.printGI()); Task assignmentToDo = new Deadline(action, variable); tasks.addToTaskList(assignmentToDo); storage.addToFile(Storage.file, assignmentToDo.toString()); - Ui.printNumOfTasks(); - System.out.println(" " + assignmentToDo.toString()); +// Ui.printNumOfTasks(); + deadlineOutput += " " + assignmentToDo.toString() + "\n"; + deadlineOutput += Ui.printNumOfTasks(); + return deadlineOutput; } } \ No newline at end of file diff --git a/src/main/java/DeleteCommand.java b/src/main/java/DeleteCommand.java index f6de21fb42..a6d06e08e0 100644 --- a/src/main/java/DeleteCommand.java +++ b/src/main/java/DeleteCommand.java @@ -7,23 +7,25 @@ public DeleteCommand(String action, String variable) { } @Override - public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException { if (variable.equals("all")) { storage.writeToFile(Storage.file, ""); TaskList.listOfTasks.clear(); Ui.printIndent(); - System.out.println("Everything in your list has been removed! " - + "Add more tasks to get started again!!!"); + return "Everything in your list has been removed! " + + "Add more tasks to get started again!!!"; } else { int taskNumber = Integer.parseInt(variable); - System.out.println(ui.printRemove()); - System.out.println(Ui.printDelete(taskNumber)); + String deleteOutput = ui.printRemove() + "\n" + Ui.printDelete(taskNumber) + "\n"; +// System.out.println(ui.printRemove()); +// System.out.println(Ui.printDelete(taskNumber)); TaskList.listOfTasks.remove(taskNumber - 1); storage.writeToFile(Storage.file, ""); for (Task task : TaskList.listOfTasks) { storage.addToFile(Storage.file, task.toString()); } - System.out.println(Ui.printNumOfTasks()); + deleteOutput += Ui.printNumOfTasks(); + return deleteOutput; } } } diff --git a/src/main/java/DialogBox.java b/src/main/java/DialogBox.java index 186e0e7f22..82ae81e6fe 100644 --- a/src/main/java/DialogBox.java +++ b/src/main/java/DialogBox.java @@ -1,22 +1,22 @@ -//import javafx.geometry.Pos; -//import javafx.scene.control.Label; -//import javafx.scene.image.ImageView; -//import javafx.scene.layout.HBox; -// -//public class DialogBox extends HBox { -// -// private Label text; -// private ImageView displayPicture; -// -// public DialogBox(Label l, ImageView iv) { -// text = l; -// displayPicture = iv; -// -// text.setWrapText(true); -// displayPicture.setFitWidth(100.0); -// displayPicture.setFitHeight(100.0); -// -// this.setAlignment(Pos.TOP_RIGHT); -// this.getChildren().addAll(text, displayPicture); -// } -//} \ No newline at end of file +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; + +public class DialogBox extends HBox { + + private Label text; + private ImageView displayPicture; + + public DialogBox(Label l, ImageView iv) { + text = l; + displayPicture = iv; + + text.setWrapText(true); + displayPicture.setFitWidth(100.0); + displayPicture.setFitHeight(100.0); + + this.setAlignment(Pos.TOP_RIGHT); + this.getChildren().addAll(text, displayPicture); + } +} \ No newline at end of file diff --git a/src/main/java/DoneCommand.java b/src/main/java/DoneCommand.java index 169f5a2d83..0c10b6477c 100644 --- a/src/main/java/DoneCommand.java +++ b/src/main/java/DoneCommand.java @@ -5,12 +5,13 @@ public DoneCommand(String action, String variable) { } @Override - public void execute(TaskList tasks, Ui ui, Storage storage) { + public String execute(TaskList tasks, Ui ui, Storage storage) { int taskNum = Integer.parseInt(variable); TaskList.listOfTasks.get(taskNum - 1).markAsDone(); ui.printIndent(); - System.out.println("Nice! I've marked this task as done:"); + String doneOutput = "Nice! I've marked this task as done:\n"; ui.printIndent(); - System.out.println(TaskList.listOfTasks.get(taskNum - 1).toString()); + doneOutput += TaskList.listOfTasks.get(taskNum - 1).toString(); + return doneOutput; } } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index bc8ab9c1e6..380063dd33 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,35 +1,41 @@ import java.io.IOException; import java.io.FileNotFoundException; -//import javafx.application.Application; -//import javafx.scene.Scene; -//import javafx.scene.control.Button; -//import javafx.scene.control.ScrollPane; -//import javafx.scene.control.TextField; -//import javafx.scene.layout.AnchorPane; -//import javafx.scene.layout.Region; -//import javafx.scene.layout.VBox; -//import javafx.scene.control.Label; -//import javafx.stage.Stage; -//import javafx.scene.image.Image; -//import javafx.scene.image.ImageView; - -//public class Duke extends Application { -public class Duke { +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; +import javafx.scene.control.Label; +import javafx.stage.Stage; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; + +public class Duke extends Application { private Storage storage; private TaskList tasks; private Ui ui; -// ScrollPane scrollPane; -// VBox dialogContainer; -// TextField userInput; -// Button sendButton; -// Scene scene; -// private Image user = new Image(this.getClass().getResourceAsStream("/images/DaUser.png")); -// private Image duke = new Image(this.getClass().getResourceAsStream("/images/DaDuke.png")); - - public Duke() { + ScrollPane scrollPane; + VBox dialogContainer; + TextField userInput; + Button sendButton; + Scene scene; + private Image user = new Image(this.getClass().getResourceAsStream("/images/DaUser.png")); + private Image duke = new Image(this.getClass().getResourceAsStream("/images/DaDuke.png")); + public Duke() throws IOException { + ui = new Ui(); + storage = new Storage(Storage.file); + try { + tasks = new TaskList(storage.load()); + } catch (DukeException | FileNotFoundException e) { + ui.showLoadingError(); + tasks = new TaskList(); + } } /** @@ -55,6 +61,7 @@ public Duke(String filepath) throws IOException { * start to take in inputs for the bot. */ public void run() { + System.out.println("test"); ui.greeting(); boolean isThereANextCommand = false; while (!isThereANextCommand) { @@ -62,7 +69,7 @@ public void run() { String fullCommand = ui.readCommand(); ui.printLine(); // show the divider line ("_______") Command c = Parser.parse(fullCommand); - c.execute(tasks, ui, storage); + System.out.println(c.execute(tasks, ui, storage)); isThereANextCommand = c.shouldExit(); } catch (DukeException | IOException e) { ui.showError(e.getMessage()); @@ -78,61 +85,61 @@ public void run() { public static void main(String[] args) throws IOException { new Duke("todo.txt").run(); } -// -// @Override -// public void start(Stage stage) { -// //Step 1. Setting up required components -//// ScrollPane scrollPane; -//// VBox dialogContainer; -//// TextField userInput; -//// Button sendButton; -//// Scene scene; -// -// //The container for the content of the chat to scroll. -// scrollPane = new ScrollPane(); -// dialogContainer = new VBox(); -// scrollPane.setContent(dialogContainer); -// -// userInput = new TextField(); -// sendButton = new Button("Send"); -// -// AnchorPane mainLayout = new AnchorPane(); -// mainLayout.getChildren().addAll(scrollPane, userInput, sendButton); -// -// stage.setTitle("Duke"); -// stage.setResizable(false); -// stage.setMinHeight(600.0); -// stage.setMinWidth(400.0); -// -// mainLayout.setPrefSize(400.0, 600.0); -// -// scrollPane.setPrefSize(385, 535); -// scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); -// scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); -// -// scrollPane.setVvalue(1.0); -// scrollPane.setFitToWidth(true); -// -// // You will need to import `javafx.scene.layout.Region` for this. -// dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); -// -// userInput.setPrefWidth(325.0); -// -// sendButton.setPrefWidth(55.0); -// -// AnchorPane.setTopAnchor(scrollPane, 1.0); -// -// AnchorPane.setBottomAnchor(sendButton, 1.0); -// AnchorPane.setRightAnchor(sendButton, 1.0); -// -// AnchorPane.setLeftAnchor(userInput , 1.0); -// AnchorPane.setBottomAnchor(userInput, 1.0); -// -// scene = new Scene(mainLayout); -// -// stage.setScene(scene); -// stage.show(); -// + + @Override + public void start(Stage stage) { + //Step 1. Setting up required components +// ScrollPane scrollPane; +// VBox dialogContainer; +// TextField userInput; +// Button sendButton; +// Scene scene; + + //The container for the content of the chat to scroll. + scrollPane = new ScrollPane(); + dialogContainer = new VBox(); + scrollPane.setContent(dialogContainer); + + userInput = new TextField(); + sendButton = new Button("Send"); + + AnchorPane mainLayout = new AnchorPane(); + mainLayout.getChildren().addAll(scrollPane, userInput, sendButton); + + stage.setTitle("Duke"); + stage.setResizable(false); + stage.setMinHeight(600.0); + stage.setMinWidth(400.0); + + mainLayout.setPrefSize(400.0, 600.0); + + scrollPane.setPrefSize(385, 535); + scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); + + scrollPane.setVvalue(1.0); + scrollPane.setFitToWidth(true); + + // You will need to import `javafx.scene.layout.Region` for this. + dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); + + userInput.setPrefWidth(325.0); + + sendButton.setPrefWidth(55.0); + + AnchorPane.setTopAnchor(scrollPane, 1.0); + + AnchorPane.setBottomAnchor(sendButton, 1.0); + AnchorPane.setRightAnchor(sendButton, 1.0); + + AnchorPane.setLeftAnchor(userInput , 1.0); + AnchorPane.setBottomAnchor(userInput, 1.0); + + scene = new Scene(mainLayout); + + stage.setScene(scene); + stage.show(); + // sendButton.setOnMouseClicked((event) -> { // dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); // userInput.clear(); @@ -142,55 +149,74 @@ public static void main(String[] args) throws IOException { // dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); // userInput.clear(); // }); -// -// //Scroll down to the end every time dialogContainer's height changes. -// dialogContainer.heightProperty().addListener((observable) -> scrollPane.setVvalue(1.0)); -// -// //Part 3. Add functionality to handle user input. -// sendButton.setOnMouseClicked((event) -> { -// handleUserInput(); -// }); -// -// userInput.setOnAction((event) -> { -// handleUserInput(); -// }); -// // more code to be added here later -// } -// -// /** -// * Iteration 1: -// * Creates a label with the specified text and adds it to the dialog container. -// * @param text String containing text to add -// * @return a label with the specified text that has word wrap enabled. -// */ -// private Label getDialogLabel(String text) { -// // You will need to import `javafx.scene.control.Label`. -// Label textToAdd = new Label(text); -// textToAdd.setWrapText(true); -// -// return textToAdd; -// } -// -// /** -// * Iteration 2: -// * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to -// * the dialog container. Clears the user input after processing. -// */ -// private void handleUserInput() { -// Label userText = new Label(userInput.getText()); -// Label dukeText = new Label(getResponse(userInput.getText())); -// dialogContainer.getChildren().addAll( -// new DialogBox(userText, new ImageView(user)), -// new DialogBox(dukeText, new ImageView(duke)) -// ); -// userInput.clear(); -// } -// -// /** -// * You should have your own function to generate a response to user input. -// * Replace this stub with your completed method. -// */ -// private String getResponse(String input) { -// -// } -} + + //Scroll down to the end every time dialogContainer's height changes. + dialogContainer.heightProperty().addListener((observable) -> scrollPane.setVvalue(1.0)); + + //Part 3. Add functionality to handle user input. + sendButton.setOnMouseClicked((event) -> { + try { + handleUserInput(); + } catch (IOException | DukeException e) { + System.out.println(e.getMessage()); + } + }); + + userInput.setOnAction((event) -> { + try { + handleUserInput(); + } catch (IOException | DukeException e) { + System.out.println(e.getMessage()); + } + }); + // more code to be added here later + } + + /** + * Iteration 1: + * Creates a label with the specified text and adds it to the dialog container. + * @param text String containing text to add + * @return a label with the specified text that has word wrap enabled. + */ + private Label getDialogLabel(String text) { + // You will need to import `javafx.scene.control.Label`. + Label textToAdd = new Label(text); + textToAdd.setWrapText(true); + + return textToAdd; + } + + /** + * Iteration 2: + * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to + * the dialog container. Clears the user input after processing. + */ + private void handleUserInput() throws IOException, DukeException { + Label userText = new Label(userInput.getText()); + Label dukeText = new Label(getResponse(userInput.getText())); + dialogContainer.getChildren().addAll( + new DialogBox(userText, new ImageView(user)), + new DialogBox(dukeText, new ImageView(duke)) + ); + userInput.clear(); + } + + /** + * You should have your own function to generate a response to user input. + * Replace this stub with your completed method. + */ + private String getResponse(String input) throws DukeException, IOException { + try { + String fullCommand = input; + //ui.printLine(); // show the divider line ("_______") + Command c = Parser.parse(fullCommand); + return (c.execute(tasks, ui, storage)); + //isThereANextCommand = c.shouldExit(); + } catch (DukeException | IOException e) { + ui.showError(e.getMessage()); + return e.getMessage(); + } finally { + //ui.printLine(); + } + } +} \ No newline at end of file diff --git a/src/main/java/EventCommand.java b/src/main/java/EventCommand.java index b486aff4de..e6faea2e8b 100644 --- a/src/main/java/EventCommand.java +++ b/src/main/java/EventCommand.java @@ -7,12 +7,14 @@ public EventCommand(String action, String variable) { } @Override - public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { - System.out.println(ui.printGI()); + public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + String eventOutput = ui.printGI() + "\n"; Task assignmentToDo = new Event(action, variable); tasks.addToTaskList(assignmentToDo); storage.addToFile(Storage.file, assignmentToDo.toString()); - Ui.printNumOfTasks(); - System.out.println(" " + assignmentToDo.toString()); + //Ui.printNumOfTasks(); + eventOutput += " " + assignmentToDo.toString() + "\n"; + eventOutput += Ui.printNumOfTasks(); + return eventOutput; } } \ No newline at end of file diff --git a/src/main/java/FindCommand.java b/src/main/java/FindCommand.java index e334fcb251..84d8ea6f71 100644 --- a/src/main/java/FindCommand.java +++ b/src/main/java/FindCommand.java @@ -12,7 +12,7 @@ public FindCommand(String action, String variable) { } @Override - public void execute(TaskList tasks, Ui ui, Storage storage) throws DukeException, IOException { + public String execute(TaskList tasks, Ui ui, Storage storage) throws DukeException, IOException { File f = new File(Storage.file); Scanner sc = new Scanner(f); @@ -37,11 +37,12 @@ public void execute(TaskList tasks, Ui ui, Storage storage) throws DukeException throw new DukeException("No such word is found in any of the tasks."); } else { Ui.printIndent(); - System.out.println("Here are the matching tasks in your list!"); + String matchingTask = "Here are the matching tasks in your list!\n"; for (String str : tempList) { Ui.printIndent(); - System.out.println(str); + matchingTask += str + "\n"; } + return matchingTask; } } } diff --git a/src/main/java/Launcher.java b/src/main/java/Launcher.java index fd296a6c5b..ce3257483c 100644 --- a/src/main/java/Launcher.java +++ b/src/main/java/Launcher.java @@ -1,11 +1,11 @@ -//import javafx.application.Application; -//// -/////** -//// * A launcher class to workaround classpath issues. -//// */ -////public class Launcher { -//// -//// public static void main(String[] args) { -//// Application.launch(Duke.class, args); -//// } -////} \ No newline at end of file +import javafx.application.Application; + +/** + * A launcher class to workaround classpath issues. + */ +public class Launcher { + + public static void main(String[] args) { + Application.launch(Duke.class, args); + } +} \ No newline at end of file diff --git a/src/main/java/ListCommand.java b/src/main/java/ListCommand.java index 44e1d65c1f..30282f5142 100644 --- a/src/main/java/ListCommand.java +++ b/src/main/java/ListCommand.java @@ -9,20 +9,21 @@ public ListCommand(String action) { } @Override - public void execute(TaskList tasks, Ui ui, Storage storage) throws FileNotFoundException { + public String execute(TaskList tasks, Ui ui, Storage storage) throws FileNotFoundException { ui.printIndent(); if (TaskList.listOfTasks.isEmpty()) { - System.out.println("There is no tasks in your list currently!!!"); + return "There is no tasks in your list currently!!!"; } else { - System.out.println("Here are the tasks in your list:"); + String list = "Here are the tasks in your list:\n"; File temp = new File(Storage.file); Scanner s = new Scanner(temp); int numbering = 1; while (s.hasNext()) { ui.printIndent(); - System.out.println(numbering + ". " + s.nextLine()); + list += numbering + ". " + s.nextLine() + "\n"; numbering++; } + return list; } } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index ae6255e507..e2d9653403 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -103,9 +103,6 @@ public static Command parse(String line) throws DukeException { + " Find \n" + " Eg. find __(keyword)__\n" + " List \n" + " Bye\n"); } - - - } public static int getSlashIndex(String text) { diff --git a/src/main/java/ToDoCommand.java b/src/main/java/ToDoCommand.java index 6b50ca067f..d9f692471c 100644 --- a/src/main/java/ToDoCommand.java +++ b/src/main/java/ToDoCommand.java @@ -7,12 +7,15 @@ public ToDoCommand(String action) { } @Override - public void execute(TaskList tasks, Ui ui, Storage storage) throws IOException { - System.out.println(ui.printGI()); + public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + String todoOutput = ui.printGI() + "\n"; + //System.out.println(ui.printGI()); Task assignmentToDo = new Todo(action); tasks.addToTaskList(assignmentToDo); storage.addToFile(Storage.file, assignmentToDo.toString()); - Ui.printNumOfTasks(); - System.out.println(" " + assignmentToDo.toString()); + //System.out.println(Ui.printNumOfTasks()); + todoOutput += " " + assignmentToDo.toString() + "\n"; + todoOutput += Ui.printNumOfTasks(); + return todoOutput; } } diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index a2b959e1c9..f73778a92e 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -80,9 +80,9 @@ public String printGI() { /** * Ends the chat bot. */ - public void printBye() { + public String printBye() { printIndent(); - System.out.println("Bye. Hope to see you again soon!"); + return "Bye. Hope to see you again soon!"; } public String readCommand() { @@ -122,8 +122,7 @@ public String printRemove() { Ui.printIndent(); return "Noted. I've removed this task."; } - - /** + /** * Prints the number of tasks in the list. * * @throws IOException If the named file exists but is a directory rather than a regular file, diff --git a/src/main/java/todo.txt b/src/main/java/todo.txt index f9e49dc736..fc838c1302 100644 --- a/src/main/java/todo.txt +++ b/src/main/java/todo.txt @@ -8,3 +8,4 @@ [E][?] asd (at: 14th of December 2019, 12:44 am)) [D][?] asd (by: 2nd of December 3123, 12:34 am) [T][?] deadline +[T][?] das diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000000..3d9d0fb67c --- /dev/null +++ b/todo.txt @@ -0,0 +1,4 @@ +[T][?] asd +[E][?] die (at: 3rd of January 2025, 6:00 pm)) +[T][?] hiel +[T][?] ooo From 72dfe575da064ee2d850c2e033b9a872a480a4bb Mon Sep 17 00:00:00 2001 From: caesarpjz Date: Mon, 16 Sep 2019 21:39:18 +0800 Subject: [PATCH 31/51] Made some changes. --- src/main/java/ByeCommand.java | 3 + src/main/java/Command.java | 34 ++++++ src/main/java/Deadline.java | 1 + src/main/java/DeadlineCommand.java | 27 ++++- src/main/java/DeleteCommand.java | 27 ++++- src/main/java/DialogBox.java | 57 +++++++-- src/main/java/DoneCommand.java | 21 +++- src/main/java/Duke.java | 149 ++---------------------- src/main/java/EventCommand.java | 26 ++++- src/main/java/Find.java | 5 + src/main/java/FindCommand.java | 27 ++++- src/main/java/Launcher.java | 2 +- src/main/java/ListCommand.java | 21 +++- src/main/java/Main.java | 33 ++++++ src/main/java/MainWindow.java | 52 +++++++++ src/main/java/Parser.java | 47 +++++++- src/main/java/Storage.java | 15 ++- src/main/java/Task.java | 1 + src/main/java/TaskList.java | 1 + src/main/java/ToDoCommand.java | 5 +- src/main/java/Ui.java | 54 ++------- src/main/resources/view/DialogBox.fxml | 16 +++ src/main/resources/view/MainWindow.fxml | 19 +++ todo.txt | 4 + 24 files changed, 435 insertions(+), 212 deletions(-) create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/MainWindow.java create mode 100644 src/main/resources/view/DialogBox.fxml create mode 100644 src/main/resources/view/MainWindow.fxml diff --git a/src/main/java/ByeCommand.java b/src/main/java/ByeCommand.java index c9f54b599c..547774df64 100644 --- a/src/main/java/ByeCommand.java +++ b/src/main/java/ByeCommand.java @@ -20,6 +20,9 @@ public ByeCommand(String action) { */ @Override public String execute(TaskList tasks, Ui ui, Storage storage) { + assert tasks != null; + assert ui != null; + assert storage != null; return ui.printBye(); } } diff --git a/src/main/java/Command.java b/src/main/java/Command.java index 8716038cc8..2e3c3ff47b 100644 --- a/src/main/java/Command.java +++ b/src/main/java/Command.java @@ -6,21 +6,55 @@ public class Command { protected String variable; private static boolean canExit = false; + /** + * Constructor for Command classes. + * + * @param action Description of tasks. + */ public Command(String action) { this.action = action; } + /** + * Constructor for Command classes. + * + * @param action Description of tasks. + * @param variable Variable that changes depending on the command. + */ public Command(String action, String variable) { this.action = action; this.variable = variable; } + /** + * Tells the loop whether it should exit it. + * + * @return Returns the boolean canExit. + */ public boolean shouldExit() { return canExit; } + /** + * Changes the boolean canExit to the opposite value. + * + * @return Returns the newly changed boolean. + */ public boolean exitSwitch() { return canExit = !canExit; } + /** + * Dummy return value as it is always overrided by child classes. + * + * @param tasks Not needed in this case. + * @param ui Not needed in this case. + * @param storage Not needed in this case. + * @return Returns a dummy string. + * @throws IOException If the named file exists but is a directory rather + * than a regular file, does not exist but cannot be + * created, or cannot be opened for any other reason. + * @throws DukeException If there is a different input that is not accepted, + * a error message will show up. + */ public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException, DukeException { return ""; } diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 02f6388186..f0c6315562 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -22,6 +22,7 @@ public Deadline(String description, String by) { */ @Override public String toString() { + assert by != null; return "[D]" + super.toString() + " " + description + " (by: " + by + ")"; } } \ No newline at end of file diff --git a/src/main/java/DeadlineCommand.java b/src/main/java/DeadlineCommand.java index b88097a93c..a35c64895c 100644 --- a/src/main/java/DeadlineCommand.java +++ b/src/main/java/DeadlineCommand.java @@ -2,18 +2,41 @@ public class DeadlineCommand extends Command { + /** + * Constructor for Deadline Command. + * + * @param action Description of the task. + * @param variable Date to finish the tasks. + */ public DeadlineCommand(String action, String variable) { super(action, variable); } + /** + * Executes the deadline command and prints out statements to + * tell the user that the deadline tasks has been added to + * the list of tasks. + * + * @param tasks Adds the deadline to the list of tasks. + * @param ui Prints out statements to indicate to user what + * has happened. + * @param storage Stores the tasks inside another file so that + * the task will be available the next time the + * bot starts up. + * @return Returns String to print out to the user. + * @throws IOException If the named file exists but is a directory rather + * than a regular file, does not exist but cannot be + * created, or cannot be opened for any other reason. + */ @Override public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + assert tasks != null; + assert ui != null; + assert storage != null; String deadlineOutput = ui.printGI() + "\n"; -// System.out.println(ui.printGI()); Task assignmentToDo = new Deadline(action, variable); tasks.addToTaskList(assignmentToDo); storage.addToFile(Storage.file, assignmentToDo.toString()); -// Ui.printNumOfTasks(); deadlineOutput += " " + assignmentToDo.toString() + "\n"; deadlineOutput += Ui.printNumOfTasks(); return deadlineOutput; diff --git a/src/main/java/DeleteCommand.java b/src/main/java/DeleteCommand.java index a6d06e08e0..1bc6a299c9 100644 --- a/src/main/java/DeleteCommand.java +++ b/src/main/java/DeleteCommand.java @@ -2,12 +2,37 @@ public class DeleteCommand extends Command { + /** + * Constructor for Delete command. + * + * @param action Delete command word. + * @param variable Number of task to be deleted. + */ public DeleteCommand(String action, String variable) { super(action, variable); } + /** + * Executes the delete command and prints out statements to + * tell the user that the delete tasks has been deleted to + * the list of tasks. + * + * @param tasks Not needed in this case. + * @param ui Prints out statements to indicate to user what + * has happened. + * @param storage Stores the tasks inside another file so that + * the task will be available the next time the + * bot starts up. + * @return Returns String to print out to the user. + * @throws IOException If the named file exists but is a directory rather + * than a regular file, does not exist but cannot be + * created, or cannot be opened for any other reason. + */ @Override public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + assert tasks != null; + assert ui != null; + assert storage != null; if (variable.equals("all")) { storage.writeToFile(Storage.file, ""); TaskList.listOfTasks.clear(); @@ -17,8 +42,6 @@ public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException } else { int taskNumber = Integer.parseInt(variable); String deleteOutput = ui.printRemove() + "\n" + Ui.printDelete(taskNumber) + "\n"; -// System.out.println(ui.printRemove()); -// System.out.println(Ui.printDelete(taskNumber)); TaskList.listOfTasks.remove(taskNumber - 1); storage.writeToFile(Storage.file, ""); for (Task task : TaskList.listOfTasks) { diff --git a/src/main/java/DialogBox.java b/src/main/java/DialogBox.java index 82ae81e6fe..60636ac988 100644 --- a/src/main/java/DialogBox.java +++ b/src/main/java/DialogBox.java @@ -1,22 +1,59 @@ +import java.io.IOException; +import java.util.Collections; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; +import javafx.scene.Node; import javafx.scene.control.Label; +import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; +/** + * An example of a custom control using FXML. + * This control represents a dialog box consisting of an ImageView to represent the speaker's face and a label + * containing text from the speaker. + */ public class DialogBox extends HBox { - - private Label text; + @FXML + private Label dialog; + @FXML private ImageView displayPicture; - public DialogBox(Label l, ImageView iv) { - text = l; - displayPicture = iv; + private DialogBox(String text, Image img) { + try { + FXMLLoader fxmlLoader = new FXMLLoader(MainWindow.class.getResource("/view/DialogBox.fxml")); + fxmlLoader.setController(this); + fxmlLoader.setRoot(this); + fxmlLoader.load(); + } catch (IOException e) { + e.printStackTrace(); + } + + dialog.setText(text); + displayPicture.setImage(img); + } - text.setWrapText(true); - displayPicture.setFitWidth(100.0); - displayPicture.setFitHeight(100.0); + /** + * Flips the dialog box such that the ImageView is on the left and text on the right. + */ + private void flip() { + ObservableList tmp = FXCollections.observableArrayList(this.getChildren()); + Collections.reverse(tmp); + getChildren().setAll(tmp); + setAlignment(Pos.TOP_LEFT); + } + + public static DialogBox getUserDialog(String text, Image img) { + return new DialogBox(text, img); + } - this.setAlignment(Pos.TOP_RIGHT); - this.getChildren().addAll(text, displayPicture); + public static DialogBox getDukeDialog(String text, Image img) { + var db = new DialogBox(text, img); + db.flip(); + return db; } } \ No newline at end of file diff --git a/src/main/java/DoneCommand.java b/src/main/java/DoneCommand.java index 0c10b6477c..0a6f279aaf 100644 --- a/src/main/java/DoneCommand.java +++ b/src/main/java/DoneCommand.java @@ -1,16 +1,33 @@ public class DoneCommand extends Command { + /** + * Constructor for Done command. + * + * @param action Description of the task. + * @param variable Number of tasks that is completed. + */ public DoneCommand(String action, String variable) { super(action, variable); } + /** + * Executes the done command and prints out statements to + * tell the user that the deadline tasks has been added to + * the list of tasks. + * + * @param tasks Not needed in this case. + * @param ui Not needed in this case. + * @param storage Not needed in this case. + * @return Returns String to print out to the user. + */ @Override public String execute(TaskList tasks, Ui ui, Storage storage) { + assert tasks != null; + assert ui != null; + assert storage != null; int taskNum = Integer.parseInt(variable); TaskList.listOfTasks.get(taskNum - 1).markAsDone(); - ui.printIndent(); String doneOutput = "Nice! I've marked this task as done:\n"; - ui.printIndent(); doneOutput += TaskList.listOfTasks.get(taskNum - 1).toString(); return doneOutput; } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 380063dd33..71c1f24b07 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,32 +1,18 @@ import java.io.IOException; import java.io.FileNotFoundException; -import javafx.application.Application; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.TextField; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.Region; -import javafx.scene.layout.VBox; -import javafx.scene.control.Label; -import javafx.stage.Stage; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; - -public class Duke extends Application { +public class Duke { private Storage storage; private TaskList tasks; private Ui ui; - ScrollPane scrollPane; - VBox dialogContainer; - TextField userInput; - Button sendButton; - Scene scene; - private Image user = new Image(this.getClass().getResourceAsStream("/images/DaUser.png")); - private Image duke = new Image(this.getClass().getResourceAsStream("/images/DaDuke.png")); + /** + * Constructor for Duke. + * + * @throws IOException If the named file exists but is a directory rather than a regular file, + * does not exist but cannot be created, or cannot be opened for any other reason. + */ public Duke() throws IOException { ui = new Ui(); storage = new Storage(Storage.file); @@ -86,137 +72,18 @@ public static void main(String[] args) throws IOException { new Duke("todo.txt").run(); } - @Override - public void start(Stage stage) { - //Step 1. Setting up required components -// ScrollPane scrollPane; -// VBox dialogContainer; -// TextField userInput; -// Button sendButton; -// Scene scene; - - //The container for the content of the chat to scroll. - scrollPane = new ScrollPane(); - dialogContainer = new VBox(); - scrollPane.setContent(dialogContainer); - - userInput = new TextField(); - sendButton = new Button("Send"); - - AnchorPane mainLayout = new AnchorPane(); - mainLayout.getChildren().addAll(scrollPane, userInput, sendButton); - - stage.setTitle("Duke"); - stage.setResizable(false); - stage.setMinHeight(600.0); - stage.setMinWidth(400.0); - - mainLayout.setPrefSize(400.0, 600.0); - - scrollPane.setPrefSize(385, 535); - scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); - scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.ALWAYS); - - scrollPane.setVvalue(1.0); - scrollPane.setFitToWidth(true); - - // You will need to import `javafx.scene.layout.Region` for this. - dialogContainer.setPrefHeight(Region.USE_COMPUTED_SIZE); - - userInput.setPrefWidth(325.0); - - sendButton.setPrefWidth(55.0); - - AnchorPane.setTopAnchor(scrollPane, 1.0); - - AnchorPane.setBottomAnchor(sendButton, 1.0); - AnchorPane.setRightAnchor(sendButton, 1.0); - - AnchorPane.setLeftAnchor(userInput , 1.0); - AnchorPane.setBottomAnchor(userInput, 1.0); - - scene = new Scene(mainLayout); - - stage.setScene(scene); - stage.show(); - -// sendButton.setOnMouseClicked((event) -> { -// dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); -// userInput.clear(); -// }); -// -// userInput.setOnAction((event) -> { -// dialogContainer.getChildren().add(getDialogLabel(userInput.getText())); -// userInput.clear(); -// }); - - //Scroll down to the end every time dialogContainer's height changes. - dialogContainer.heightProperty().addListener((observable) -> scrollPane.setVvalue(1.0)); - - //Part 3. Add functionality to handle user input. - sendButton.setOnMouseClicked((event) -> { - try { - handleUserInput(); - } catch (IOException | DukeException e) { - System.out.println(e.getMessage()); - } - }); - - userInput.setOnAction((event) -> { - try { - handleUserInput(); - } catch (IOException | DukeException e) { - System.out.println(e.getMessage()); - } - }); - // more code to be added here later - } - - /** - * Iteration 1: - * Creates a label with the specified text and adds it to the dialog container. - * @param text String containing text to add - * @return a label with the specified text that has word wrap enabled. - */ - private Label getDialogLabel(String text) { - // You will need to import `javafx.scene.control.Label`. - Label textToAdd = new Label(text); - textToAdd.setWrapText(true); - - return textToAdd; - } - - /** - * Iteration 2: - * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to - * the dialog container. Clears the user input after processing. - */ - private void handleUserInput() throws IOException, DukeException { - Label userText = new Label(userInput.getText()); - Label dukeText = new Label(getResponse(userInput.getText())); - dialogContainer.getChildren().addAll( - new DialogBox(userText, new ImageView(user)), - new DialogBox(dukeText, new ImageView(duke)) - ); - userInput.clear(); - } - /** * You should have your own function to generate a response to user input. * Replace this stub with your completed method. */ - private String getResponse(String input) throws DukeException, IOException { + String getResponse(String input) throws DukeException, IOException { try { String fullCommand = input; - //ui.printLine(); // show the divider line ("_______") Command c = Parser.parse(fullCommand); return (c.execute(tasks, ui, storage)); - //isThereANextCommand = c.shouldExit(); } catch (DukeException | IOException e) { ui.showError(e.getMessage()); return e.getMessage(); - } finally { - //ui.printLine(); } } } \ No newline at end of file diff --git a/src/main/java/EventCommand.java b/src/main/java/EventCommand.java index e6faea2e8b..65cb8a1ef9 100644 --- a/src/main/java/EventCommand.java +++ b/src/main/java/EventCommand.java @@ -2,17 +2,41 @@ public class EventCommand extends Command { + /** + * Constructor for Event Command. + * + * @param action Description of the task. + * @param variable Date to finish the tasks. + */ public EventCommand(String action, String variable) { super(action, variable); } + /** + * Executes the deadline command and prints out statements to + * tell the user that the deadline tasks has been added to + * the list of tasks. + * + * @param tasks Adds the deadline to the list of tasks. + * @param ui Prints out statements to indicate to user what + * has happened. + * @param storage Stores the tasks inside another file so that + * the task will be available the next time the + * bot starts up. + * @return Returns String to print out to the user. + * @throws IOException If the named file exists but is a directory rather + * than a regular file, does not exist but cannot be + * created, or cannot be opened for any other reason. + */ @Override public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + assert tasks != null; + assert ui != null; + assert storage != null; String eventOutput = ui.printGI() + "\n"; Task assignmentToDo = new Event(action, variable); tasks.addToTaskList(assignmentToDo); storage.addToFile(Storage.file, assignmentToDo.toString()); - //Ui.printNumOfTasks(); eventOutput += " " + assignmentToDo.toString() + "\n"; eventOutput += Ui.printNumOfTasks(); return eventOutput; diff --git a/src/main/java/Find.java b/src/main/java/Find.java index c0e97ea328..3d82e6cef7 100644 --- a/src/main/java/Find.java +++ b/src/main/java/Find.java @@ -1,5 +1,10 @@ public class Find extends Task { + /** + * Constructor for Find tasks. + * + * @param description Description of tasks to find. + */ public Find(String description) { super(description); } diff --git a/src/main/java/FindCommand.java b/src/main/java/FindCommand.java index 84d8ea6f71..5634ce3043 100644 --- a/src/main/java/FindCommand.java +++ b/src/main/java/FindCommand.java @@ -6,15 +6,40 @@ public class FindCommand extends Command { + /** + * Constructor for FindCommand. + * + * @param action Find command word.s + * @param variable Number of task to be deleted. + */ public FindCommand(String action, String variable) { super(action, variable); } + /** + * Executes the deadline command and prints out statements to + * tell the user that the deadline tasks has been added to + * the list of tasks. + * + * @param tasks Not needed in this case. + * @param ui Prints out statements to indicate to user what + * has happened. + * @param storage Not needed in this case. + * @return Returns String to print out to the user. + * @throws IOException If the named file exists but is a directory rather + * than a regular file, does not exist but cannot be + * created, or cannot be opened for any other reason. + * @throws DukeException If there is no matching word, an error message + * will be sent to the user. + */ @Override public String execute(TaskList tasks, Ui ui, Storage storage) throws DukeException, IOException { - + assert tasks != null; + assert ui != null; + assert storage != null; File f = new File(Storage.file); + assert f != null; Scanner sc = new Scanner(f); ArrayList tempList = new ArrayList<>(); int num = 1; diff --git a/src/main/java/Launcher.java b/src/main/java/Launcher.java index ce3257483c..d2a6dd108e 100644 --- a/src/main/java/Launcher.java +++ b/src/main/java/Launcher.java @@ -6,6 +6,6 @@ public class Launcher { public static void main(String[] args) { - Application.launch(Duke.class, args); + Application.launch(Main.class, args); } } \ No newline at end of file diff --git a/src/main/java/ListCommand.java b/src/main/java/ListCommand.java index 30282f5142..10719e6842 100644 --- a/src/main/java/ListCommand.java +++ b/src/main/java/ListCommand.java @@ -4,13 +4,31 @@ public class ListCommand extends Command { + /** + * Constructor for ListCommand + * + * @param action List Command word. + */ public ListCommand(String action) { super(action); } + /** + * + * + * @param tasks Not needed in this case. + * @param ui Not needed in this case. + * @param storage Not needed in this case. + * @return Returns those tasks that match the keyword. + * @throws FileNotFoundException If there is no prior list of task + * available, there is nothing to print, + * thus, an error message will be shown. + */ @Override public String execute(TaskList tasks, Ui ui, Storage storage) throws FileNotFoundException { - ui.printIndent(); + assert tasks != null; + assert ui != null; + assert storage != null; if (TaskList.listOfTasks.isEmpty()) { return "There is no tasks in your list currently!!!"; } else { @@ -19,7 +37,6 @@ public String execute(TaskList tasks, Ui ui, Storage storage) throws FileNotFoun Scanner s = new Scanner(temp); int numbering = 1; while (s.hasNext()) { - ui.printIndent(); list += numbering + ". " + s.nextLine() + "\n"; numbering++; } diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 0000000000..8fff8a0bd7 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,33 @@ + +import java.io.IOException; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; + +/** + * A GUI for Duke using FXML. + */ +public class Main extends Application { + + private Duke duke = new Duke(); + + public Main() throws IOException { + } + + @Override + public void start(Stage stage) { + try { + FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("/view/MainWindow.fxml")); + AnchorPane ap = fxmlLoader.load(); + Scene scene = new Scene(ap); + stage.setScene(scene); + fxmlLoader.getController().setDuke(duke); + stage.show(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/MainWindow.java b/src/main/java/MainWindow.java new file mode 100644 index 0000000000..7570a33a1d --- /dev/null +++ b/src/main/java/MainWindow.java @@ -0,0 +1,52 @@ +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.VBox; + +import java.io.IOException; + +/** + * Controller for MainWindow. Provides the layout for the other controls. + */ +public class MainWindow extends AnchorPane { + @FXML + private ScrollPane scrollPane; + @FXML + private VBox dialogContainer; + @FXML + private TextField userInput; + @FXML + private Button sendButton; + + private Duke duke; + + private Image userImage = new Image(this.getClass().getResourceAsStream("/images/DaUser.png")); + private Image dukeImage = new Image(this.getClass().getResourceAsStream("/images/DaDuke.png")); + + @FXML + public void initialize() { + scrollPane.vvalueProperty().bind(dialogContainer.heightProperty()); + } + + public void setDuke(Duke d) { + duke = d; + } + + /** + * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to + * the dialog container. Clears the user input after processing. + */ + @FXML + private void handleUserInput() throws IOException, DukeException { + String input = userInput.getText(); + String response = duke.getResponse(input); + dialogContainer.getChildren().addAll( + DialogBox.getUserDialog(input, userImage), + DialogBox.getDukeDialog(response, dukeImage) + ); + userInput.clear(); + } +} \ No newline at end of file diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index e2d9653403..8bc40d00bc 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -5,13 +5,21 @@ public class Parser { - - Scanner sc = new Scanner(System.in); - + /** + * Makes sense of the user input and finds out what command + * the user typed in. + * + * @param line Input by user. + * @return Returns the command that comes from the user. + * @throws DukeException Prints out the message to tell the user + * what was wrong with the input by the user. + */ public static Command parse(String line) throws DukeException { + assert line != null; String properInput = line.trim().toLowerCase(); String[] inputArray = properInput.split(" "); String taskType = inputArray[0]; + assert taskType != null; if (!isValidTaskType(taskType)) { Ui.printIndent(); throw new DukeException("☹ OOPS!!! I'm sorry, but I don't know what that means :-(" @@ -105,11 +113,26 @@ public static Command parse(String line) throws DukeException { } } + /** + * Gets the slash index from the input, if available. + * This is so that we can determine the dates easily. + * + * @param text Input by the user. + * @return Returns the index of the slash. + */ public static int getSlashIndex(String text) { return text.indexOf("/"); } + /** + * + * + * @param text + * @return + * @throws DukeException + */ public static int getDayDateNumbers(String text) throws DukeException { + assert text != null; if ((text.length() > (getSlashIndex(text) + 4)) && (text.length() > (getSlashIndex(text) + 6))) { return Integer.parseInt(text.substring(getSlashIndex(text) + 4, getSlashIndex(text) + 6)); } else { @@ -119,6 +142,7 @@ public static int getDayDateNumbers(String text) throws DukeException { } public static int getMonthDateNumbers(String text) throws DukeException { + assert text != null; if ((text.length() > (getSlashIndex(text) + 7)) && (text.length() > (getSlashIndex(text) + 9))) { return Integer.parseInt(text.substring(getSlashIndex(text) + 7, getSlashIndex(text) + 9)); } else { @@ -128,6 +152,7 @@ public static int getMonthDateNumbers(String text) throws DukeException { } public static int getYearDateNumbers(String text) throws DukeException { + assert text != null; if ((text.length() > (getSlashIndex(text) + 10)) && (text.length() > (getSlashIndex(text) + 14))) { return Integer.parseInt(text.substring(getSlashIndex(text) + 10, getSlashIndex(text) + 14)); } else { @@ -137,6 +162,7 @@ public static int getYearDateNumbers(String text) throws DukeException { } public static int getHourDateNumbers(String text) throws DukeException { + assert text != null; if ((text.length() > (getSlashIndex(text) + 15)) && (text.length() > (getSlashIndex(text) + 17))) { return Integer.parseInt(text.substring(getSlashIndex(text) + 15, getSlashIndex(text) + 17)); } else { @@ -147,6 +173,7 @@ public static int getHourDateNumbers(String text) throws DukeException { public static int getMinuteDateNumbers(String text) throws DukeException { + assert text != null; if (text.length() >= (getSlashIndex(text) + 17)) { return Integer.parseInt(text.substring(getSlashIndex(text) + 17)); } else { @@ -157,6 +184,7 @@ public static int getMinuteDateNumbers(String text) throws DukeException { public static boolean isValidDateNumbers(String text) throws DukeException { + assert text != null; int dayDate = getDayDateNumbers(text); int monthDate = getMonthDateNumbers(text); int yearDate = getYearDateNumbers(text); @@ -168,6 +196,7 @@ public static boolean isValidDateNumbers(String text) throws DukeException { } public static boolean isValidDateFormat(String text) throws DukeException { + assert text != null; if (isValidDateNumbers(text)) { return true; } else { @@ -188,6 +217,7 @@ public static boolean isValidDateFormat(String text) throws DukeException { * appropriate strings. */ public static String formatDate(String date) { + assert date != null; String formatted = date; if (!date.contains(")")) { try { @@ -222,6 +252,7 @@ public static String formatDate(String date) { } public static boolean isValidTaskType(String taskType) { + assert taskType != null; if (taskType.equals("todo") || taskType.equals("event") || taskType.equals("deadline") || taskType.equals("delete") || taskType.equals("done") || taskType.equals("find") || taskType.equals("list") || taskType.equals("bye") ) { @@ -232,6 +263,7 @@ public static boolean isValidTaskType(String taskType) { } public static String getDescriptionOfTask(String text) throws DukeException { + assert text != null; int spaceIndex = text.indexOf(" "); if ((text.contains("deadline") && isValidDeadlineCommand(text)) || text.contains("event") && isValidEventCommand(text)) { @@ -246,18 +278,22 @@ public static String getDescriptionOfTask(String text) throws DukeException { } public static boolean isValidToDoCommand(String text) { + assert text != null; return text.contains(" ") && text.length() > 5; } public static boolean isValidDeadlineCommand(String text) { + assert text != null; return text.contains(" ") && text.contains("/") && text.contains("by"); } public static boolean isValidEventCommand(String text) { + assert text != null; return text.contains(" ") && text.contains("/") && text.contains("at"); } public static boolean isValidDeleteCommand(String text) throws DukeException, NumberFormatException { + assert text != null; if (text.length() < 7) { Ui.printIndent(); throw new DukeException("Wrong Format! Please add an 'all' or a valid number after the delete word! :)"); @@ -280,10 +316,12 @@ public static boolean isValidDeleteCommand(String text) throws DukeException, Nu } public static boolean isValidFindCommand(String text) { + assert text != null; return text.contains(" ") && text.length() > 5; } public static boolean isValidDoneCommand(String text) throws DukeException { + assert text != null; if (text.length() < 5) { Ui.printIndent(); throw new DukeException("Wrong Format! Please add a valid number after the done word! :)"); @@ -306,16 +344,19 @@ public static boolean isValidDoneCommand(String text) throws DukeException { } public static String findWord(String text) { + assert text != null; int spaceIndex = text.indexOf(" "); return text.substring(spaceIndex + 1); } public static String findToDelete(String text) { + assert text != null; int spaceIndex = text.indexOf(" "); return text.substring(spaceIndex + 1); } public static String findTaskNumber(String text) { + assert text != null; int spaceIndex = text.indexOf(" "); return text.substring(spaceIndex + 1); } diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java index 0d98c54613..96b70122a8 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Storage.java @@ -11,6 +11,11 @@ public class Storage { protected static ArrayList taskList = new ArrayList(); protected static String file = "todo.txt"; + /** + * Constructor for Storage. + * + * @param file File that the list of tasks to be. + */ public Storage(String file) { } @@ -26,6 +31,8 @@ public Storage(String file) { * cannot be opened for any other reason. */ public void addToFile(String filepath, String textToAdd) throws IOException { + assert filepath != null; + assert textToAdd != null; FileWriter typer = new FileWriter(filepath, true); typer.write(textToAdd + System.lineSeparator()); typer.close(); @@ -43,6 +50,8 @@ public void addToFile(String filepath, String textToAdd) throws IOException { * cannot be opened for any other reason. */ public void writeToFile(String filepath, String textToAdd) throws IOException { + assert filepath != null; + assert textToAdd != null; FileWriter typer = new FileWriter(filepath); typer.write(textToAdd); typer.close(); @@ -59,6 +68,7 @@ public void writeToFile(String filepath, String textToAdd) throws IOException { * cannot be opened for any other reason. */ public static int countLines(String filename) throws IOException { + assert filename != null; try (InputStream inputs = new BufferedInputStream(new FileInputStream(filename))) { byte[] characters = new byte[1024]; int readCharacters = inputs.read(characters); @@ -90,8 +100,8 @@ public static int countLines(String filename) throws IOException { } /** - * Loads the task into the tasklist - * in TaskList from the file. + * Loads the task into the task list + * in TaskList from the file. * * @return ArrayList that has been copied from the file. * @throws IOException If the named file exists but is a directory rather than a regular file, @@ -101,6 +111,7 @@ public static int countLines(String filename) throws IOException { */ public ArrayList load() throws IOException, DukeException { File f = new File(file); + assert f != null; Scanner sc = new Scanner(f); ArrayList tempList; if (countLines(file) == 0) { diff --git a/src/main/java/Task.java b/src/main/java/Task.java index a822655649..f3aa9bcfc3 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -4,6 +4,7 @@ import java.util.Date; public class Task { + protected String description; protected boolean isDone; protected boolean isCorrectFormat; diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index bdc4658b2d..826e71f219 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -26,6 +26,7 @@ public TaskList(ArrayList list) { } public void addToTaskList(Task assignment) { + assert assignment != null; listOfTasks.add(assignment); } } diff --git a/src/main/java/ToDoCommand.java b/src/main/java/ToDoCommand.java index d9f692471c..40e965d890 100644 --- a/src/main/java/ToDoCommand.java +++ b/src/main/java/ToDoCommand.java @@ -8,12 +8,13 @@ public ToDoCommand(String action) { @Override public String execute(TaskList tasks, Ui ui, Storage storage) throws IOException { + assert tasks != null; + assert ui != null; + assert storage != null; String todoOutput = ui.printGI() + "\n"; - //System.out.println(ui.printGI()); Task assignmentToDo = new Todo(action); tasks.addToTaskList(assignmentToDo); storage.addToFile(Storage.file, assignmentToDo.toString()); - //System.out.println(Ui.printNumOfTasks()); todoOutput += " " + assignmentToDo.toString() + "\n"; todoOutput += Ui.printNumOfTasks(); return todoOutput; diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java index f73778a92e..4659fa368e 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Ui.java @@ -7,8 +7,6 @@ public class Ui { protected Scanner scan = new Scanner(System.in); - protected TaskList listTask = new TaskList(); - protected Storage store = new Storage(Storage.file); /** * Constructor for Ui. @@ -17,9 +15,6 @@ public Ui() { } - public String readInput() { - return scan.nextLine(); - } /** * Prints the greeting at the initiation of the chat bot. */ @@ -85,23 +80,13 @@ public String printBye() { return "Bye. Hope to see you again soon!"; } - public String readCommand() { - return scan.nextLine(); - } - /** - * Marks a task as done once the user has finished it. + * Reads what the user writes. * - * @param i To indicate which task number is done. + * @return Returns what the scanner reads. */ - static String printDone(int i) { - TaskList.listOfTasks.get(i - 1).markAsDone(); - printLine(); - printIndent(); - System.out.println("Nice! I've marked this task as done:"); - printIndent(); - return TaskList.listOfTasks.get(i - 1).toString(); - //printLine(); + public String readCommand() { + return scan.nextLine(); } /** @@ -122,6 +107,7 @@ public String printRemove() { Ui.printIndent(); return "Noted. I've removed this task."; } + /** * Prints the number of tasks in the list. * @@ -134,30 +120,6 @@ public static String printNumOfTasks() throws IOException { //Ui.printLine(); } - /** - * Prints the list of tasks that has been added by the user. - * - * @throws FileNotFoundException if there is no such file that contains the tasks. - */ - static String printList() throws FileNotFoundException { //WHY NEVER USEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE - printLine(); - printIndent(); - if (TaskList.listOfTasks.isEmpty()) { - return "There is no tasks in your list currently!!!"; - } else { - System.out.println("Here are the tasks in your list:"); - File temp = new File(Storage.file); - Scanner s = new Scanner(temp); - int numbering = 1; - while (s.hasNext()) { - printIndent(); - System.out.println(numbering + ". " + s.nextLine()); - numbering++; - } - return ""; - } - } - /** * Gets the number of task inside the file. * @@ -182,7 +144,13 @@ public void showLoadingError() { System.out.println("Nothing in file!"); } + /** + * Prints out the error message. + * + * @param error Error message. + */ public void showError(String error) { + assert error != null; System.out.println(error); } } \ No newline at end of file diff --git a/src/main/resources/view/DialogBox.fxml b/src/main/resources/view/DialogBox.fxml new file mode 100644 index 0000000000..e433809947 --- /dev/null +++ b/src/main/resources/view/DialogBox.fxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml new file mode 100644 index 0000000000..435f3ce0d8 --- /dev/null +++ b/src/main/resources/view/MainWindow.fxml @@ -0,0 +1,19 @@ + + + + + + + + + + + +