From 4d57bdbdff815f2a0d1156b5a7aa0d77d77ea5cb Mon Sep 17 00:00:00 2001 From: Seil0 Date: Fri, 9 Sep 2016 20:41:20 +0200 Subject: [PATCH] updated to 0.3.7 --- bin/application/Main.class | Bin 5814 -> 6805 bytes bin/application/MainWindowController$1.class | Bin 1518 -> 2607 bytes bin/application/MainWindowController$2.class | Bin 3218 -> 1590 bytes bin/application/MainWindowController$3.class | Bin 940 -> 2456 bytes bin/application/MainWindowController$4.class | Bin 2607 -> 1518 bytes ...1.class => MainWindowController$5$1.class} | Bin 1319 -> 1319 bytes ...2.class => MainWindowController$5$2.class} | Bin 2351 -> 2354 bytes ...3.class => MainWindowController$5$3.class} | Bin 1440 -> 1441 bytes ...4.class => MainWindowController$5$4.class} | Bin 2215 -> 2216 bytes ...5.class => MainWindowController$5$5.class} | Bin 1146 -> 1146 bytes ...6.class => MainWindowController$5$6.class} | Bin 1418 -> 1418 bytes bin/application/MainWindowController$5.class | Bin 1591 -> 3232 bytes bin/application/MainWindowController$6.class | Bin 2458 -> 939 bytes .../MainWindowController$7$1.class | Bin 0 -> 2381 bytes bin/application/MainWindowController$7.class | Bin 0 -> 2060 bytes bin/application/MainWindowController$8.class | Bin 0 -> 1770 bytes bin/application/MainWindowController.class | Bin 29900 -> 37473 bytes bin/application/streamUiData.class | Bin 0 -> 3060 bytes src/application/Main.java | 61 +- src/application/MainWindowController.java | 674 +++++++++++++----- src/application/streamUiData.java | 101 +++ 21 files changed, 624 insertions(+), 212 deletions(-) rename bin/application/{MainWindowController$2$1.class => MainWindowController$5$1.class} (66%) rename bin/application/{MainWindowController$2$2.class => MainWindowController$5$2.class} (63%) rename bin/application/{MainWindowController$2$3.class => MainWindowController$5$3.class} (64%) rename bin/application/{MainWindowController$2$4.class => MainWindowController$5$4.class} (69%) rename bin/application/{MainWindowController$2$5.class => MainWindowController$5$5.class} (55%) rename bin/application/{MainWindowController$2$6.class => MainWindowController$5$6.class} (60%) create mode 100644 bin/application/MainWindowController$7$1.class create mode 100644 bin/application/MainWindowController$7.class create mode 100644 bin/application/MainWindowController$8.class create mode 100644 bin/application/streamUiData.class create mode 100644 src/application/streamUiData.java diff --git a/bin/application/Main.class b/bin/application/Main.class index 30edc7b607aa745ada714f3af4ef05b89f45f91a..2c451d22aa4646837299b7281418b3b04d4b7e12 100644 GIT binary patch literal 6805 zcmcIpd3;pYb^eaFHyT~QNPxisTVQM>VKlbEI6)XABxGbHgb@gYv0*fNlAajN$TM$* zWXExgw>WVUJKln~I8JOFCnVTKBPFDwyEQO=f2U*NQhti zPx<{c_ub{(d)Duqd-?89zws>q8|0LO62S%0k&(C;i~3$N5$T9}2?u3@i-)44(f+YW z@nlnBp}>r!yy0kSyvvUcxPnFPIfAtIBX+b=P&N|v2L;u3HWH5}1~`@S5(Au@m-bU` zbeNspc2RjO8BeAJ;b_KB?i=Zg`rNl{IN7I7+Pi~|v0ecpGSiE!R}r% z((1)sJ++@LSB|8TBWb~sU_Rq}@yKotxhdas(_FV`nBwmD5`D>I&B=tHO2*?Z_gmFo zEVZg+_8QVwZ1xhKzlA)ksq5yE&EzwTQY<%Eie(Ni7F?(*DHeKL#*6p4sSs)fm6^1g zY8XrolWG-KJGhjlC?Xh7`|hy8Ww=~WHQ@R=#>WMhuQ^wnb>|L+u?F=H>Sk_hm2a>X zR|=fbXguR~_Rrd~vvj(k zVXVMYTzi}&Nlt5xy2W({AH;_QAwL=T5skQJ4o)i}Xf&uqD1_^I zqU)}|_L}uNdV@h&N1NzDSLr~rL6r_H&`zs?L8xNu8U_ge>CjCE^Dtk(+6@-q0tdV3 z{nk=Bj|*Wpg^uKfjueFMK!Z|t87xG#3b0&%x>XVTXUTtFwNJ|*LJwUb5=$ofy@7_Y z;kfR6i$M*l9o$MqSe|Bic^HSVTo)cOScJub1?^tK-IW>cbyItzy&5Lf?HW+s(UhnC z++dkM=rMGv&j|&(emP@2<vwpG9j-SpNDY^*X{qb3 z*!pm7euIx2d_osi1q=6keg2?s{7HjP;nTqeRD^d&VB4}a2kRJ=j}in3AR5=T1?N1D z#|$3VU=DG&y`CQ@79Gcv22bI$93<+r(c9<-m*rxN<|0VPxeb#=I?~xo3>(#x+P$>j z=-_F=(rMYOHkcxq4chcKglB1)NXm^_E2V9e^b;Bm>mi3XZW!CRpdtRoMr2!JB;yB5Y2_1mQLX$1GM1y7wWO}Q3NPWLgO>#>bG)Bl zMuS)IC1QTGk1jC-0;j|Gp!&|24ZfnjGmrciGK+(+3Tpqi+@jHQ+F%JT4C54DH~1N~ z&^%hGDW4a0X2KwgNus!V0&|q*XZGfe>dPJYy1_SaR&j8QhN3~4w8*I7XAQokcpC2a zQfX?9ajkp5Y4CG;s_w1HS;yWs_<0?>fMbDrbD3Kwf6?IE(~i`vX*`Ty!Y@1c?u_iy zlFZOoH2eIDa@$f2+`$|zb_(A!_%-}`aC(=``!h71Td9(r!fzV<7Ji!okShX6EWVFr zLD`zNVD@(nes5Zi4x6A);rj-Epm=1`(NVX{^?izw4&#sT0|$RhFem`bo=n2`hRN@r z;DFLG8MsXsR|Ba?=slz%f1OFAV+?e?>OkF*hc-;{5Jx z3nuOobJJ<6W)=R%;BQr2l6th1;O`Co!AhejRgk6w|7h?}YVz{oqb!nCRsU@8FS>NG zT{>NR6=+W3#|Hmqp<3N&+}g2{gzp;s2mX`xi1pf3K_|9JT7ln2IpbH0r%3Z)(u=v< zl4IocCwR}nf6qq8b50~WOu3%qp&(3yEm7cCa2>57-DGRQf6`5O z3XN6`>Bvp32ke5~UhJrwvaHQFvcMKD77;W+WTDhJQau|nN4UEmvE&RCStMvUuYcqX zP(;)imL;;(kqZTv{vVh#vP>=t5!Aux?<8f&uL$O?6jkUCIH)Q{@mB}Qs> zu#%9dWBb}1Syhzctb=svZ&+5!YJ#y`mIvd!0K20pmWvjxj>{EB)(GoX%}SPXMyXNQ zFt>cIkt>yhvh-l`SXdh5Do2P@HC75m`_AoSF?U2$mXWJ<(1?=lH4o#p%I=3Nqo~~u`sXgj?iCRiIJUr^A?r^=> zV8TnMYy02+W~!F=w_&%Iw?ucq?R66?^~{@$>{JZb47kHpEA4g1{E&1|Gv{ujw4}U2 zDLakqR?7LLY-ViI!<1B~_894sy;?@mXPOdy`=g%El5`r?Z4upRT_zf*5f<#W zaEr{CHPWM*zLarYDYwY2jvNwPGN(1RWqd!G2n=zX92S&x?qtz1xB3f<8y$(}(uykF z-mhCc)=_>kHBQJ)vIq;y5ne6ii1ZnHSHI>%3fAI9fky%eZ!*<+Iuq# z1sOErDNHS(I8D9jWIW@$S^%&pk)s9!@S{y;OKp9bqJLq zghQCeDoO4)@_;i z?M@s!&o*r#n6Nx5k2&(0Vw@}#&PE0FgqB~Kc8N_ZzI<=v(jymkjbs&#o| zNLcW)2F*OqacxXfQCJX-&Cu0&FXI0w0$6dl7p-uzld+`bm7C{w!AXR9`ZMl~cH466>n3 z%HoE;3__1UCrJ#{9VuIn+>=g z*WxfX;-k2Zx7oGm-ku- z#qP8uSe@I6bk;IVyZR0h?8zFjoZLaaa~AQQYN<|SF*1qK_O)4zzlpm#DC@u?+?~Ze z!PkRXJfvTxS*o0E^&?q)MnAH6;w(<+7SCky+$28#b$qb|`|G*Ut8e1e1ir>q`nN5M z*X(B&XV_AcQzvjIzYg;2X$;x9NqjSlH|*ybY|7%T+~<}oej)eSHihqG@vFIBe%CYD znZN&A=*sV zy+*r2-jKJXfgYhg_!j*RXy%Ju3*%=yBej*Db|XD-2R5S(`>~VW(vD$Xk2BbfyKyrf z!XCbdbn)$BFJ8qyOraZZbLIDN0N+Oseu#s-e%*o}5yaoYt@ts$_+1>q`-n;yy|NfF zsYM@oaOFejmlh02CkCY(o*c%I#1NMuzJ1+}gxrs$oWO{@fZOFH(sG*5SW_64H*iee z#<+Z&uTL5m8|bO@)0{UikkfLFtf#aW$}6%#uH_5H#ARKrHE7fCg;H)(Eye`*IN^|>K`na^Nt&tnE z(#EDeE4!%bn>((|%D&g-;LBKfR*v*cO7E_9fi+^A%IcSuWo2MOhE6hEYb4IE`ZF?g zntPX7vuxyJDyZx#2LD3bLr6PLh`0}{`To^_2M7uuV;Db(tu#g(!J(ay(8Z^%yeepl z03xbbt|TN$30Cv}GDfJ>5>nSlO45{OD=Nh&kd{e?=P9@Zt466XRgOW)duVrrX}(*b zm6zy17jhA)OSt0EvvRD5f*qWc@piU{Dg1})^`l1a&dNtsw4is7_K3AX@3`%4$@T7K zZ%Xb{#0{oDW~aB=UUiF|eMq4=nEkY!-Oi&PIf;esugeoPaw03wj)9t=CZ{Ey5|C`x| zp8WXz0M^Thg)+fu&gf{$OFF)nNhdlSFKry0?sgWbL} z=n59JhYNDrPMF?CL1fhNhXhq-G?8-BgB;3w=|PUoN@h}-tRUu$`I()g{fBHRYGv4jY>qL zIGdVXs2%6nh#^|BrItqJpLU&VV>WDkJI}@(%(ZYnRa6TlW~d&+N-WZeaU1h+nqXeL zmv%eHM*7@rkJFc;Evnkp4!us+({|Vy@rOLxqv~nrQ^V2+SzoZI_GC_}>(%Yn+L(ok z7~j_0xCjgAhJpnxTucWWb-hfY)l0ciT*?{AOnSf@Ts=OLilG6GYM#pkrw7}Vc(<YcUE=Q|i_Mq$U zaC4clY?4-4ezIKybfjHBv2#azV+yGg&%LRTRia!EJs@}vhdV}7D3ogB(!w>xRKV#|>e#`!UHW2c24dL}%2Q9Rh_ z#V#5)=lUI9dYkJF4$(`I+LpTBiY<54ObfWm#??A;b}(_5*Y6Lh;A?H{!*ziG8p1mi z;3HDIx2`veK87+wLUpd$mKkwdQ{K3)>bK#lo1&D~eW1L3NQ^n{s3a*P)QQQ@fXtY)g-h`N33rc^HI9HE7Gl z;i?%^>UwA60LCrcAXpaae(E#YIEX_e1E-&mC;@kfh`POso#)zko?>SX^)FD4g&PGm z&qO*Jfj8NhkE$3B<7OK#P!G+ahnl9jP)BaHaT{JJuoMX-FQd;);f;#r2E53|i*bii z)i@nRhmy^xsNkhGUWS)5dslXc5i+IW>Jqg!q#d28QmY`k^~Ld{Cr zF}xmcwD1N(t`Ms&nK7co#+&eFEGxlA?2pryCeNWaEqYQou!_ri5-=3}3;+ z7QRX@2t)Rn<=Oa}+N>gHc2O&Q!^Su9EkUK;ZpJoby7pvdBr!aYanqiXoiRf$ab@dn zGhw@z-0xP5N6N2f z>+jlb*6dCV=-%2dhyJy}O@`^W&35W(EwdJdBkP2KcRn&>T_!uE_*gL9aJ zrnz>nlJ!yrR+H-K!wWU&GWVhz7&epaa9ZfxLU7doJQ%5e13$v=QwlOB-92q&_W)HbuawzTPay0`F+?TCkia6rd zFuQjL-99(HO!us^#iWONt8H`DOFizmAC=Q-nWu}cXYAiV?M0=2WPmS8LOmFXUMs}r~ zE9Y6Vf~ovTy|H!7_cQ6h5i5n6d|B7Cm`I%5{DsMlmehq;hZ@|}MJ*n4BR`WpNYc$P zv5HA87V$?euw|93*87bIYw?^^W>8bI={?Nqpmu2tuc@gh;N>qD+OkH8Y95c%)R)Vo z#(YydN^QsS)B0zegvOhe zc+#VC(fojy-TrAaXhm02-4N|zg>$hHSGw_K(_54%U1al3wE7nE(GZ> z)nH(mF;x;w*-=x8m2$Z)t(r>CR%U6 z#YPhQP9df(CRfQdmRwy-yoD^>#-SlllFIWx5 zs{+3j*ZOK%5z^RzFgL15Ib*DxxWvg0GEc2O$qK5_ZAyqhg-T6+nQ9$y$bxO@w3{`B zq07~k(=3T)gm*cssHnmm6?`jGyf*g^We{TFc54rF5$R|w))gerH7C7< z=e(3(95xt93xnCAB(5`7;Ju{O_R8y zhN{>F}yC1w}h?f)km=+ zk9TNq9`8AZ_f>s3kGpr3AH&f*VbMw-3x@8~$5DJTj|YN|FXZv%pzrHJ$G4B+yLtRD zX#D&*9^12O62IOMVaJ*!kvx81r=XuSZf6aAh3^jpsKh+GTy{`IyA<5B!tb zE|Dty3;!lAmQluk@L!Zu#%XvGPw^vPLO=8guQO4U)gbaD9dnP5`xyqPU>S=6RS`rho_Dn-_kAT+9=!;MdPf`(Zcl@H5lFfVSC#9)_ z=d9!LTjKgsEm!1ao1QRewQGxH60|x@YiZc(Wb2r8DZK>4-KL|5R6}`tOE5|6q^B{t z)-cAVH=~Xp7%s*wMB}YQ*KI`2?OgLBWN-&9_fli4IPJ|dOkoJavd>_s z8oT8>acHYd30|sE_7t}*g-E6JNir}CDNd;em=!-J{RQTVQ4;Va|h9v@f+~$^QUj@9-M{ diff --git a/bin/application/MainWindowController$1.class b/bin/application/MainWindowController$1.class index 65e4683088db6e76945b60e019e24ddf4c79bafa..2f056096424b7446c4df52b0f04289cf28ed9cc5 100644 GIT binary patch literal 2607 zcmb7F-BTM?6#w0PuqA8@tqqpe+JaOQXxT%M}5$7w4S@!kT8S^!ff{5yXXGSIluF}=YIF^ zSKk778TTXv82Z%JRYTWQSGP=MTGh=3-7HueDa&+i%P_dzpO6q@=vqQ%^xy!oKf00~eTKP(n^@wij?kK~# zSZnimjvz4E-&=_9rMzN%OKSFkFvinvgJ?ceuSS;B$hMq-Rs5FYDU6xzuDu1lyj~mrT_y z*%aoTgCLI#?u8z00>0NOo{Qilo{?~h;cTnQ$T*E>84jtM#vQMkQwOO}jT%izNfR1# zNIo@cghrAbIEy|By>&6|Z!F_E^i#KVQ08=(6Hmwe=yvHf zf(cAXnB3J0s#=zDRUmY@R>s=kc1m@)sLM4O*O94xYn5z`PwL_- z=xKK44GBPo^j?q6XxM$^k2{%P(mTLl^G*dS3l+!YacdTBhR zVlgQ$1UYTeEt)b^$Kej?kQ7Ky7_6&HTz7Pn2kB{t$gqP(ml2?UATluc1>}LpIP#EY z0UQ-;-WS@i^2NPv#(${h~RMebIeqC^hCoIyc)n3M$34kjPdGnx{PU>l=04e z^j4RA7Y!RK$dR*;!Ymq&h8{e5=;2^y4GceLcplYz6Ptw)@|`5Fb3* z5;TQ8nufg8f5s8^3;Niv7-PR-iv5l?_6I(u@qP9uK4X93dwT!K{`RQ6O2r_Wd@99A zMc$)#8yX58@!Q}u3gQTUz#^8&+c@U2OrtP9#iT#d38z{Zfw4jucWLD?!v9bZ~h3%$ff9{oxaUD=3E0!Z64;H*INgPddt6;8LwfRdHU- zILdP!+ZJweJcKre=u`fjn>JT#=F;j@VR<2RF!bxwCtId?E|h1^>fd>;D&)q{;jPPR z@*;&OHj9xX>nW+EH_b4VYHpq`GqlY(6%hu*Q3D}#M$n3G17SoNT2tDfyC{`dtZl3c zx5QU%!4NAt7PrgXm3rSeY|}Iul1-x~$2HA$KRt$lRPjLWc}rK&uRtzc4&fw2ykSta zgc7C|RMgBi{F$9w#(M%%-#&L-#aLW=^Usn_V zqZGeL2Uu!0R}5U$Y`TbzmOAM+pwowI1}1Txid|iIUgT9}g-eg2HMYM!*srA^&z zZj&I|ed$xPce)Xb!hSiB5!X#;IK5+ZNcjn?Z?`=G$ex;RGo1XJ+#)mscMSBPmm#w3 z)LcuDh3LABD*$(s;zo-C#`3q!eA7X67G!6t5reM7v7aR5|mCWJ?&u8sGe;4vudR$ z44vo^T1}#bzCa{1`VK~B8(pty*MejE%)imzUl60cK|cEQI8M-;WQ*Pg$}2+ExT%lm zd;A9d+c>+BjSbe3%*Il6WU`sJFy7-r9hb9pOswq1h@*r2z7m&j6!SaD=?4b!6C?QL z$4mscjhGYxH<0tA4qys5(GtxQkLd=FbR(N^X7n>|)sf!|)Ilbiv`$1P+=dx{br-Y# adk**f(=p8BKCNP8r9Jc~PP87}?*9WQ9)_6! diff --git a/bin/application/MainWindowController$2.class b/bin/application/MainWindowController$2.class index 18a3323047a53ad22f6d578357ed03afb54ab39e..bc635f4d45c87371c4c81c25448410ec265f2af6 100644 GIT binary patch literal 1590 zcmbVMTTc^F5dO}#u(YgFP*CvJV$oiJa`6JTRo>=X8lBG`6wLN#{)G%zQK7%>4TO<0pVSsOZob=K0~FZJ9ija)_+rmq)>4-8U4tSdvZ0_t8b{Yr540Mb#q@?!UheAVe$1k+G-4cb$J{gIc zZv`Z~5sJ3RN2vt4P)*%dvto!$M}TdA80Ft+-7Q1H(B3I>zFNV8TEQ35G~U z8cftIN4#jgZwT)tZ`guis^*&9u5-_l_fQ#?Fd5PVqo&sgrf#Y%n+(r0wLV4IY52lx zOZRnIl%lffmahw?k4A!x?OJ;d4_Y3kMO-6Q~4KF{^PTF|Q-VkQ_v%ftyH^178HH+C)^QDnll5%fM}9=s#|n!uQkbLz1n+ z=M3bftlp8*8i(L@}ma|7}YHnLnIs`!sBdUF6cl>SjkSpTF5l3%A zgPGIq^YQScg*Jx>)Ss{aXrt~F_A(u6vUMFBG;M>Ej?>gUFfff7s^_lT@=Wo}k^?f^ zZxJj@hYZ!8^7LZ(=N2gSJPK=CrYV|u>X^3c6Ia_J*ms)-9%GA!i@22t7^crIfubA} zqw3IZso322g-oL?-?7j^R!SW#${-OH zWJ*5JG>mHz%xY02wGkC8*L4&IBbO*(MFB`*6>ADw3hN|AXl0*(lU8>r*)0NhFHCWj zJV{WKx%@HiFCJrViB1Qbe={9bj;X`ROjaX`qLNBsb`Mcj+9V#~2}!bgvKI9D0~y1d Aod5s; literal 3218 zcmbVO>vI!T6#v~eG)-7-K`1Q(7Dyo}O6Y@!4OB~@0;Uj6EwuPxySYubYK_ zzTYntoN z8xaU3t*i_|;3fq@G=@=+CIulh3)Dy1ped!B@@QdtT;_+>aYG8MOj(+0jHr2?`~F~n zVG2a5?i%T4n3HaJ0_&rxC9w}^%%ICaA~q66E7k_lCeU6jb_KU$oj{|iY0|bMT{SW= z##?Mqa2whe7k3LBsD-|H=(Z+JNl86x6`c5hsZCn>v}(#k7@H6YVza;oKgbG}3OcYw zV0lhD$w}SF=B3H_WAhtmEFqT}n`C3le36+?>9&&yA}X+AiTk6JQ4Xt9!8Y8!7*>x! z|NjnaWWP0=SdQ)35ky>IqrYQiWD2@KL^i0|?0{hiv_wz3;gpL%5gQ8;&|U>Qv5TcX zk)BYq0-IBsH65Rtu%xNa#x?H{+3_QTCx+#$GpI`=OM&kpxmA-zq&w0T#%}bnrb&2P zs}n#1W##R|T|v-6+E^8eg1a$5*|Vi{%=83I8UK&4%MZ1$?4*JNIJlUf-dbf>3DN$7 z<5(s!b5Cu|bcZpBzA%n(sP_`)8$0Gy4JkN^V*;URs&Prnu&6?HRLquZkk+-+GEb=P zs|{687->c|%%~n9F;qfT=AEG(S8xKORJLq`PJeqvP#Htd5}q(l;-MfOyg}HWrGkg? z2-U};Y7}HTZ_UWOb5?TmvXlTfB>y$Fcj;6)H~j>l>7c0@ zmQ8#PNoUf^D!9Nz-#jhN!ni|oT*>HqQVyGRfRcu4+tNlmu~ARoWf0BH{Dz`uVSv6N zFi*?r*B;c-9}w=`_9c|guW<7h)T_e^9&=}S^$%D{eTCNW=q*@9E$IL)o)pL8du93JC@4~p*Z&W8ZWd z$|!7;k}BCjs9fa>oC&w>AU#E{N`rjmNqgCL?QlilT4u0%wjz)ycr}%Tz*z|$qbZDF zOd^SKfsqU=jFoIxtv7b7$}gK$M+r=nJj-+{rf>7UB}_0(f%HJH=^28lTTzrXfrpt= z9}+gIf%5m+e1%ELM>^f~^^q{x=QMWRvK=zflLKfjM9M_w3ck?sIaSc*wvcE zI=f1?N@9A7rC&*Wjc>Z7(*mnQAjp<1Z`at_@|0^IwhJXN9;`kotHba%`OS}_EPxa$ zc%tJm)$E`f65rxGYD|F&*$A`QFHna4gT#;csS7r}t@)u~b86${w3uUaPbJJAZe|#^ zB~b%)v9o(#U~}OXOkWYK1SOdoUCMjeA-UE;>qEv zgXr`^Z+ri3uifIW58;OUDWTi+8os4gZ5|gF`;En$j6k4x5=lQNy)$w7sc_q?N%%a)k~|P;NO3XBqDwQi;Fv+6Xjol3rM*#~rT#9YLWIVN#$<*1)2LBZ~PhQoMTyZLbo*o6SS9fhox`gJpI$_!UfWJo7NiMVQYdX zZ-Vwmxo2dIz9udnwBP3+ONHXLBgU@&Eb-P$@N!Ou&%Lg^_ z!T9WtGM-as+=ygt+TMHa_kHJl=k({VZ{GntL(@Tlu%^z>V-u>(BsMry#=bQ+N(t+NP$JY$)rAUTW&6QV?^K7GgEFBm(RUvMeW7g@?92O=vJuk=oT zot2}_=pAECwo6!V&W3NE5K5gS(k=)$JUF;kK@n9CE^35gQvlVjvHJDstf$jAsuyd* zLN^Ije47D^gvxO;N<;n9h`;*(=J!No2=1}zTa}Gc#vSA}O%Ag?UFGB;cczaf zeeQBYs{1yKlcBNwL!Awh$bnC2%o@0d$1 diff --git a/bin/application/MainWindowController$4.class b/bin/application/MainWindowController$4.class index 1f7aa78b33dbf029f6fbfa8577ce3d4d2a16c4d8..e4545dc80fcaafb7cc959bd97d1591ccdbde400f 100644 GIT binary patch literal 1518 zcma)6ZBx@g5PmLHN=uMhl>&lREYOxpMC)r2tq4*r6oo0{$0I!)hINEF}|~7TPF7{M;goAk{gz6IPc~i z>AQ|?3pZ1YBEpb(&EImv=5ouZZN3(!A4NCAkUD*}Ylyc(`o@C#UE;DqZVcW2w&i86 zQHbhEF-l}TYe~zWV;Ik#Y@Vw#MCP4_h=HL`M-)AAbfI5I3<-v=tTO1YT2ibu-)stZ zop0KLAz5`yZr8bMseSt}qG&Q?PK=rXF>brmA32fl{s>#UR6Q+rTr0 z6owgA)F@MN{1}EY62%3I`*)*EV7mT(N9Y*EMTXwW%3|%sa(TT{TVa^!5I6?^z_k=d z3TaiC%M7`F(*O3!)q8M-N?ehz9OXZ*V*-;5J)ZE_Enn60dkK0uqhsn%SgHN~gdhiUddM*NH@(Ga2p;J;j{%1G zn$vVmv1q9t4IMYn(+Y;_xMpoh?l)bss~oCPINYTU&qF-ggFSon)8RblD24t7Y1)oQ za#$Arw$sp2Q6t%>ru&gELvsebBBgNWZSHx3rZ2WHb)+eqE_zOZB@$|~>CdW*o)}b~ zy|lUmjcy>GpZWqlzlYNwX{X_gIt#v#xAqK4+Uw+_PS4^Ty-BthXrp`}RE3-Uj?~Lf z7}~?7p%g?N#VqbaOO%PnT$@L(olPu1^%DHOI=OxLyygWHLI2@!_2C3RI*4AopvrstNp z=1OQ{=oHrZb!CpLrlYK?Mwu&_MRMXf-Eq0eZH6XyQFjs-C{%90SZVSe(oNkRW;mPN z-#t}eh-9oHZwA9*84?b~5JszvX0$Pclft1jr<;7LT$tY@l zBO*+z64RTW|(l5;}L(w70X2=aHbAJNgGi5Y;y;_V9v?7wfXSBrsDly3s>9+q`70 z@)5&e=`1@dpCbQX8L2NNC zV+gMj5d_T;PiB40+GCoQ@ER$;w!US3RCU!DhA|@J4P^Y(#&x4KrIv`+<3Vb5a*bgO z6B5SjI)N``8CN_I*UDLI+|H;D7gf0`;~H``ni)K(W;Cm$EX`Zo)Yq%5JIdAZ8#8>} z9oM;0B819J3S(Ma z2y)h>TQp;+j>8?&At{iaC|FyYxbEmC57W~OvBMS`4I)JUK&-pxbI9F~apWP*LO3dH z-WOWUe#9}F%d|#VpTco^Qx0e+kEdxI!ZQMmeM}LWXuj3`2=W)`sNgiiK*XP&4PF%_ zLzoqlM>w~E3*nui=U>4<7~z5FXPEL=bi|_-yb{7DhBxr~21b2zb_0_%*}&WP(dnCl z5H$-bC{VBuqbwecM;<(R=;2=6i5U4BeK*5j(NBP|6YDW<~D|CD^v`kDWFn}RLptw zZb3uQBYq2(z#8Hou_95)=uG@yiBMgked)k1S{Ui4vOu-^{gjQ#yX9J Jn1nRw?>})9$bg`WCVya3-W+SmL-CzA(r#d}UB)_%>OJwH*M3gcmIU diff --git a/bin/application/MainWindowController$2$4.class b/bin/application/MainWindowController$5$4.class similarity index 69% rename from bin/application/MainWindowController$2$4.class rename to bin/application/MainWindowController$5$4.class index 29baa197eeb365d76acae53daffaf8366b40e84d..25092e3d4951417417333758491bcabbeed3f00c 100644 GIT binary patch delta 103 zcmZ23xI%D(A*1O;qg)`dzyL^GEN3*G?8*2INIEc?v6xzG`b-p1*gT6#n310|F*!N4 zxLC!|kdeVn10+8AHnR(pk@03l7AIyVruxaL?Dc$1O$<^@%?xHtEesA!t&=~oZv_DN CSsYOS delta 110 zcmZ1>xLk08A*0bmqg)`dzyL^GEN3*D?8*2INIEc?u^3rv`b-p1*gT6#n30boF*!N4 zxLC!Kk-<#^Bs}>JvkSYS0V9Jdn7i4XMV6U~;m71O_If^s-waX=e;CXd{xUc){G0rl GeJcRSiXX=S diff --git a/bin/application/MainWindowController$2$5.class b/bin/application/MainWindowController$5$5.class similarity index 55% rename from bin/application/MainWindowController$2$5.class rename to bin/application/MainWindowController$5$5.class index 5b6ef673eb29f3fcd31084b82d2eaf6b2ff0f3e6..1e024031cea8425cebc719813159136263f5e045 100644 GIT binary patch delta 65 zcmeyx@rz@EA*1O;qf{U2P|FaQ!K%Nb24J2FN9$ytnMK=LAE9FvjxW}T= lQcRN=gqS8X$T3Y}&|sR%pv^Rm!JKJ2gCo<-$v;^p0s!z)7QO%g delta 85 zcmeC;?&6+c$Y?atC>2P|FaQ!K%NdO(J2FN9$ytnMK=LAE9Fw8RW}T= kQjFXTLX12Na*VtT8jO4l+Kl`R=8OUij*LQ+f3i#j0GO^4XaE2J diff --git a/bin/application/MainWindowController$5.class b/bin/application/MainWindowController$5.class index 87446ec4cabad7c0e9826a6037f44139c99c955d..1a46679a16a14e34e6caa21bbb2355a569b97629 100644 GIT binary patch literal 3232 zcmbVOTXz#x6#mY%G$ahRAe4fFTvBL?5?We{4OH7g1xz8D+R`G(baI+bna zL&Y23Q7)qR;H$2M5$)2&vv0onsK3LtT<$$HEvXQaWxCRnbIv~deEZwq+2{QB&(FUC zXv38d6oHM})RbxHnrqlryk9e{A;Zepr+RJ6&Do|YbJ6w?ss-vMv}rAFYF0LWcyvPQ zZU{93t9f*6CN8I?<;M5%|NWYkp=AO!?zrJZx6>BMa(g7mdbeR2ZkIq~Q+e~)pg?u6 zosnS(EL9Q0;s~lxt0Ig#fvP4ps7)G{Jd~dtmAL_J)RY3tleVszgIdnuelS?gFa@Gz zca63)%yBO~fwfJ^1+jPQ%%I0WA~qO71J;DFT3~&-*j3zz`vt<9u1m*>wzOAB!3giM zPQ?RQU$lCsz}`v-oCELZ(vp{VX2}Kn+29+ zrQ17hn3To=GghHf#?eF0dikvNSXmEoh}=Yne>9X$sUg9rfZV)_)>45+*hBPx2`7TmiIb}rKqb(71pp#`y+S^i| z0MaOnZx0>`fzHx~vQSh!if&4uBi+N6uVG60f3#hEt^;xRs@RKtMG2ySDidBQNIiMi zwJoCNvC61vji3*m5gg=LA1Bavcg(r!S8)i33G^h@xnA3}sY*4LOqXYnGW3%&N2s2t z4AqVZQjBVVQ9VU!D21xXJ3|{%aRkFux*W5GibhFLY17CMo(PWOSO`zwC2ZeP#c@1C zHF8=r^D>pQr)17OEzor9fR0Mda^h3LRD7?Ur}H^yNr7vX1>P3H2@X7iu@I=%MuS6k zSNAHi7$^17Ipc~zrHC@Jd0u_~S`T`>mkMvzs~c<;sBl8X$zm0@wuLZR8Q%5?Ovc-Q zDHYFx_MNN1t#q0XmOpBVSji*}*x9Tp=LPLnhG=I54kJ3n(wU((rKD5ro&$JJ#q)Tf zC;&Q(L}Iz}k{F2%a#4Iq#Tl-4;hdbbrzI6UE+DU{conY+gs8A{;SyL8XvQysX*XwB zSrTFc&Z>9=Z;~k$k(B0ALRb1JTwv*6isw|k%~!PQXwxz+U6-8D?Yqc(KnSdvyEeRj zy!cWj5vN^EKiRKM1vmGqd7=2$UYR0ggz$ktL!iIg97X8K@R5p@s25l~cj*f3FHaa3 z*Yd0iMACLXr^`Nr-yEy&^rqUz;E3_Gk+n28pCh{iw_h*|x$vS39#^{;P8HMCMHfZw zK1(-khp6qB?zo*%afvx!$}g-QcfQQ42P`^Dy{6_k(!qM-rHa0bAnNM)MMaOqYWjx3 zj4h#GyP(h?5NY1}1JvdpanJYEQ?QK3yct@p3}HF-Ra(QN_hJRLqzKgeUc@l%z+V1p zz7F*UR$as;|JT|AHdOzDEyGoQKbHOp4=EVp-gWGlMaMAh`EUWd{rR3*^zq340uJ~# z$yua$WefBeOWcgQErL{z79GCXZOb!W*z>;qXYlfN8d=zJb%dUQ3V6AI*SS-`TijHU116`+Bc}_s#M1~O%26~a$Iz){kW^-HTsZ?rIft{#d0bE~ zbi;M_kEfX zBYUPf+`RQB&KL0Etz6ZR3Fn0KL?(5M@i9ILmNin#vx_*2?>qxeueT&fEqkrTr{3IW oxZt&);|p)J0T*$Zesz+7*bRR={Dy98|C0*Z6G3YRt>d@<0-;Qiw*UYD literal 1591 zcmbVMZBG+H5PtSrI9g6AC@A>WV$r?;1r-HbtJrALSmXm*KkD|n!jbci++Bp8r#@r)7k0l%ro=M%<)XPT;w=Exh!ajwnN7pSO9z=FVV=RscCJe-oV2EU- z!9>k+#LL!)hVWkThAkMTYOcxcI`=Gj50y~~lOa7YYI==e>ZZ!F$?zgm>r;g7hA+If zbYGW6DJq+8`MOa0Xe8L!jSd^Ey%t$w5>axQR45@I|1iO+;m?GGr3B4BSSBa^Q$+_Y4w%8FtU^%-)r{=aLr$aErFrxZbw#P}Yhh!00M;yKl z4Q5XF&!>aq9@-cpP=CVyqmQ~{*h_V&$<}qO)3^;zI!eN5< znhd7sZqOU4y?~4KOBgUi7MDoYa9Mf#Oj4BYsoYl>OC8L1a6^jn{J=s7St)g}D1$^) zkSX~<(=e_@Fsnt8)J9aWT-Q+;j9j9C6$K!LRoqd~Qn*V}gm(5ZIBB&;$!-$3`(cW! z%;k^pVDSiZOLRKeILUNWIi?OLGg*x&ib^Vl**!v8X_I)2rzFYh$y(6oFVDf8 A+W-In diff --git a/bin/application/MainWindowController$6.class b/bin/application/MainWindowController$6.class index 4361fdb5bb8df247db6a6c60595f55f15bfb46ef..c68bdd0607ecf2428ca51b387415a9fecb4b236d 100644 GIT binary patch literal 939 zcmah{QBTuQ6#h;(Ry&KEsK8JZq39Ti^+Acr2njA2NrpaP@cFL0Y?stq(sk%R^3B8t zHSxjt?2j^@Q)b+VWNq5sd+zsr=X~e%*YEE?06an6g+o|Xr>C)rRAv$z9w=kq8rx0Y zw-TGBNgV4m*m6-MR8Q2I3S(t^;p@(cjxrY|LQSH_A3}YmZ5Hmy`=zp7rV&b6-wcAs zoT5D~N0ZUp#+q!0uwI`I-#8)^TS-@YAk6x3aixp`Dn2|^35B`2erh;eyCt zx{KR{#mn@|Ya9)f%|wMgPN6@KhNyBD8b*iR;R644F-CE74})+ zX9iTQ%8dE9E%4((I&hU&&*1P4lpC90;5WYE+GpN5xGu5$gxStV%<&`>H-$Iq+OP%jU+Z0BNAR?^Cyp0k^jq-01kvy*$yJ@>pk=k4GB{`wohJeoQ*fh*?ju47wfXnU@) zX4>u(+pT*01MFp1ri0Xs*(^Glh84m!U)DC zl9&(}$*{n9$#&Ixvr$q0mRWI>z+}m@Os8!6Hq&ipg54BI544(IAUAa@in1#3I8*8a z!bT-f{vN9@Gbs5;rW?LK9CkLjY1dpcZ2IKp`Y@W8b1QvRoivv%r|>S`({WMY(x5y@ zypIpa8Pl><5TxfQc@Kw4M+b?(qSPB!Ttmi|uVRqPw%X69a0yp*T&8+x<93R)#79UA zoUN&FQ#n+1RHbW_Z%5!>COd?=bdT{~9puUsGCHmatPFPLG))p&mq?&6-n>x5cCInI4EGzH$u6yv=1 zG>eY=JtJr{^li7sQLIXQj)z^y+!k0I0@$t&iIwHEWsd)m#AA+sERLU?VhGsMn#6jK zr3L1GA@L=?5*Tgw${m5#Ame(-q+n#dmgHERe#-r7zTk0UZ>nk%qiY)=8P{vao zPpE4Ly^#0@-_mFbRLDvg%YIR^*WXM0fFHY1TNGFr%56?;oSHUltnQhF*#pfIyKPBS zLDe(1>jgGNUvf8Fg2`D;U%;fYG#ZF)`LQmZyEj0^o1;|zNsP(0~LKO?7278);-?Ul$uFXa9 z=Hgh|@lsUSMlHhN5Ie9VbPiFc(+GYh-7!8a<&abY4dQ8V+X#8sB|1UP@(ThwP0}6X M$-gPeRG3Kq4**`Vp8x;= diff --git a/bin/application/MainWindowController$7$1.class b/bin/application/MainWindowController$7$1.class new file mode 100644 index 0000000000000000000000000000000000000000..64750b24b88c1f1179e68b4bae21a22213d3d982 GIT binary patch literal 2381 zcma)7X>$`t5Ph>Utfh>xFqa{L2(ZBiMm`8fOh_E#i`Zb0W1KtV)mU1y+BLf)Th3LL z56NHQGbtimIS8p7RPl%MEtQ_pT9#9;vRAd*-Ja>!uiy0ay!`j4X8}NQxtxJ`x zT$R4cj_LnN;pfSbVZSQ6QO5uUnch9hFwMX2`mVacaK39V4&Cz%O`}0xCc)6cVWT;P z1X?+gNHZk5^n})F*O#};r9~OeiA7H`v`q(&@a9G6>hIXtq^UBT+e6%r0Zp}Nl4Lm9 zHN8!N5l1U&bQtcQPoW(rY#e7ev%3Nuui`a^X5lz8GP+IfO^01c52tVn85^%NWOn1h zaT;eBlAA29F^uj`W4L=$hDeEm%-(cEs*oUDA1ww!Btv4*fpa!GNwHY3ohNdfM;AjX zDh6veUEu`#o0=*5LC_CtdVLwjIv$k&ndx}CyBjx72c zu!a~0_kdMXq7IhCATHS;=Y|cGTaT11alC=cRH#8&F&wFLm8 zVpZm(QZyDNX<(XT2Dd3tWYQ(GTAE!Fd4{voPEg7&F9p(fD_N)3j-u?X@r5~AQRA-k z@@BH3**S)^v15#=SK97-kq z6qe!Hc+gNdQ+LKHj$F~Li=(8Ms?`)uP6_A1TqqpsoBK?QXE zpgo*(3%*e0kmgM_s98J6hPP+bc!*u!KGc}(4N9qX%y+yXqLQ1Dsu)n+@+se!;ixB~ zNJhvI*#zDDz|v`bK+(yYpgRej#w+x86&C$~R8Q}Z;5|=q;4yt!IH+xAguJb%XrpgV zKH7Q+hv`W|<7f?qaYEI&-}gKL-@vi>v4NAUinAN&t{eJZ;J^8UU6N!Ne-6NxDR literal 0 HcmV?d00001 diff --git a/bin/application/MainWindowController$7.class b/bin/application/MainWindowController$7.class new file mode 100644 index 0000000000000000000000000000000000000000..bfd26158f6d574d46d3c130c2695a43894e32d45 GIT binary patch literal 2060 zcmbVNZBrXn6n^d|5E8bMqEe`qQVeYpv|9?Awn3DnL8t+$siDwM%jT9WUG6fw8^pij zAMmT4X=&Bb@ngpsUuOI{&N!a4StMvNjLB^7-h0ov=XsuU?#WMoe)|J}89Ycp6Bsvl zcOBa@1KU-`vT3U|TQ%Iz%dQGM*KwqmDI^dVNN<~ars0@s%UIpqmR68JufPbeKHN9t zo>YNR;on75HONh%H)z^^<{E{lc8gIY>sedb!JNQEw!3+*E)Xxf4Vi?%8664qr4Yk_ zjwI3ou`C-5RBa_!T05K4yJv1XQed#^TBcJsJ)7szVw_u3R7@au7{KBp z3bpa6aD3_QvG!Hl4~hw71SCKk5s4BZvPo|KWN}+&TT>4a>SGtQtb<73&K0Zi*?%U{p2%JBx zt#EF1-aP6CwZOCK z5|ygCEzgn*HaDh`mo?t242~42*;~pCS{~Ug{ksZ}YtfmA+2dQCGR+Zyfr_#m*SFQy zvJ9GTL&rMz&NJMGOTpi%)|Zr$UfD5yU-}p$U1Id~K%~>$cIlraPEQi7SU+ zm7jbHJ^u`^Jf@k3v%D7Wkhk_2gEZI4hgV<4YcvX$J38eBMc`AM{1fQUaqdgZwcjor z;8Og1Tv?B`=egQ9ct^updp7+Y3hNZ}<^g7TCH@?xuaG<0bs=(%ks;%Zg*eBVm-YlH z?J2U_Gu+aCMoIex74278+HZKI{T|{UYGaJ>6Iv|c4l($cPU?mB2PzZkd16(KSmnr` zStaw6KVta+t4GrGk_k(|vXDu-51-)E$Zdi~-tA!?Uxx;)X6OeD+2%k literal 0 HcmV?d00001 diff --git a/bin/application/MainWindowController$8.class b/bin/application/MainWindowController$8.class new file mode 100644 index 0000000000000000000000000000000000000000..22da586cf224746a58e92f0c4c8d89b25d8ad6d8 GIT binary patch literal 1770 zcma)6U3U{j7=C7xcAIptu}YhQd`w|6Yr zm7cPe_4}gmTC|K|SZz9C;S3#7-|LJDq30aWQS%HZi+jUMYYgeC-;x^&(rK^DU{$QUl3~2=+rnKFfurY%F|BDb6!tu|Fso^9M)DXA73;gS zFW5SQQ3NWbwJh>DU}B2l=w8}64&o(-jIeDPhJ~}|8D^d(1kv$vLYgXYyp75T4l@k7 zT4NSRaoohQU3rUP94Am9A@WW~xFmdkEMzdXmC~&dyiA-z6-d#hy|tbqM+s#HGnA@9 zv43o7LL%1w3dgHBJ)mlaVdU&oQIRgNLFkn^Gwf7G}sX%kd`OqLK=HUojl%XEwB@C;Kd{)j-Oc zl5OHJhj|lkQxPO3@MIvz1-!#Bx*=6{({WpY^mKWb`rF&OzoN1Usi#62bah$QolsRq zv4|xTRfc295l;tmEMtYpht3z26RQ21UVV|HhD(&^K(_rZIfjb0TAZ9ZM?=RUBU-H` zp~UqXd7}QhRus>~x?WA=kAM1gB^_yriae>NYrFMTe>$mM1j|P-a{UJ*yQPgioYSAXc%z3(>e28%78vg1-4tTf zWlcI2kuDQK7{6f5_!W8M0Sd-L%oxAng7G^p8-L)M@h9#We__Y?I}$Y!6Hi2u1YE&Y zlJy?#n1*rcL~enEzMlv!5n2n)l&62dwH{UvNcGoV+{?_VnI%9j8D literal 0 HcmV?d00001 diff --git a/bin/application/MainWindowController.class b/bin/application/MainWindowController.class index 106e20010a7890b71ceb423fa035e8347f291568..021d7e15100799d4e54c353d25d3683a4346fe5f 100644 GIT binary patch literal 37473 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 S7^s%(1GVrVtV9^odH)|8$TjEy literal 29900 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 diff --git a/bin/application/streamUiData.class b/bin/application/streamUiData.class new file mode 100644 index 0000000000000000000000000000000000000000..00cacde91d001e87282c1fd93ec71de6644edee4 GIT binary patch literal 3060 zcma)8ZBrXn6n<_X*<@LuP+po+V_O>Xf|81@tp%Z!2*gIH4Nb*r>ymD9J0Zzz7DxC4 z{uyV~8A)e!#__X1%JH1NOJ0^6?T74r_U?V2^K#EQlfVD@{Z9b5@Jd5S;F8&BRPBoC z+Vxtl={lBq_{7eeuBl;A;KFP3dox!xYX`ZV{nu8-6&O6WOh+J9Rp5BlfL7tK>SQ z+QkaHwrf=dVtzOd;mERGv)vVe<#eHt_w38CBzx&?b~0s(e!c$E(lLN>10%R7Fp$oa zHB1W3tMgH^4;xi0kQE&h7>|LnZy<~aqss;~L^NCx$o`j7Z;o`#NTGKPL=n?)?SJUK z$k{Rs{tm`ne*m2MV~WaTcG!VAGwA{J$)=wCJ-g{UD+rG zJ0x45dqtzWlm5pDwLK+#=IJowF3);0E)94YkJ7m_8!Xkak&$NT!9hmIERQ5Ma&$N)CHGV~| ziA)PQdY_GlTew9a8IMSiifaUZ^?du7p7+Qv&_o=h$umkb=Q6z~3Ed=5moSD6Okx{T zC}SGWaR~>Aqd}*RY53hE<`!juBB8U(v@#0g6N;0OMkwT=C|118ozSFPr4#(sAjG*l zA*-u&R^UF?WQMRvD{DkKwiX`zL^uTYH{$IlJllpm++MDP{H_#(K-I+de)AMQ{k-}OYMmDYxjlU4d$&Tda check config.xml TODO nur Windows getestet siehe dir und file + if(dir.exists() == true){ + if (file.exists() != true) { + mainWindowController.setPath(firstStart()); + mainWindowController.setStreamingPath(streamingPath); + mainWindowController.setColor(color); + mainWindowController.setSize(size); + mainWindowController.setAutoUpdate(autoUpdate); + mainWindowController.setLoaclUI(local); + mainWindowController.setMode(mode); + mainWindowController.saveSettings(); + Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //starte neu um Bugs zu verhindern + System.exit(0); //beendet sich selbst + }else{ + loadSettings(); + } }else{ - loadSettings(); + dir.mkdir(); + mainWindowController.setPath(firstStart()); + mainWindowController.setStreamingPath(streamingPath); + mainWindowController.setColor(color); + mainWindowController.setSize(size); + mainWindowController.setAutoUpdate(autoUpdate); + mainWindowController.setLoaclUI(local); + mainWindowController.setMode(mode); + mainWindowController.saveSettings(); + Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //starte neu um Bugs zu verhindern + System.exit(0); //beendet sich selbst } - + mainWindowController.loadStreamingSettings(); mainWindowController.applyColor(); //setzt die Theme Farbe mainWindowController.cbLocal.getSelectionModel().select(mainWindowController.getLocal()); //setzt local mainWindowController.mainColor.setValue(Color.valueOf(mainWindowController.getColor())); mainWindowController.loadData(); //läd die Daten im Controller + mainWindowController.addDataUI(); Scene scene = new Scene(pane); //neue Scen um inhalt der stage anzuzeigen @@ -124,24 +144,23 @@ public class Main extends Application { //lädt die einstellungen aus der XML public void loadSettings(){ - File configFile = new File("config.xml"); try { - InputStream inputStream = new FileInputStream(configFile); + InputStream inputStream = new FileInputStream(file); props.loadFromXML(inputStream); - path = props.getProperty("path"); + path = props.getProperty("path"); //setzt Propselement in Pfad + streamingPath = props.getProperty("streamingPath"); color = props.getProperty("color"); - autoUpdate = props.getProperty("autoUpdate"); size = Double.parseDouble(props.getProperty("size")); + autoUpdate = props.getProperty("autoUpdate"); local = Integer.parseInt(props.getProperty("local")); - + mode = props.getProperty("mode"); inputStream.close(); } catch (IOException e) { - // Auto-generated catch block + System.out.println("An error has occurred!"); e.printStackTrace(); } } - public static void main(String[] args) { launch(args); } diff --git a/src/application/MainWindowController.java b/src/application/MainWindowController.java index 231acff..d1d0fb0 100644 --- a/src/application/MainWindowController.java +++ b/src/application/MainWindowController.java @@ -27,11 +27,14 @@ import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.math.BigInteger; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; @@ -43,7 +46,9 @@ import java.util.Scanner; import org.apache.commons.lang3.SystemUtils; import com.eclipsesource.json.Json; +import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonObject; +import com.eclipsesource.json.JsonValue; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXColorPicker; import com.jfoenix.controls.JFXDialog; @@ -66,6 +71,8 @@ import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.ChoiceBox; import javafx.scene.control.Label; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeTableColumn; import javafx.scene.control.TreeTableColumn.CellDataFeatures; @@ -84,6 +91,8 @@ public class MainWindowController { private AnchorPane anpane; @FXML private AnchorPane settingsan = new AnchorPane(); + @FXML + private AnchorPane streamingSettingsan = new AnchorPane(); @FXML private VBox topVBox; @FXML @@ -91,7 +100,11 @@ public class MainWindowController { @FXML private VBox settingsBox = new VBox(); @FXML - private TreeTableView treeTableViewfilm; + private VBox streamingSettingsBox = new VBox(); + @FXML + private TreeTableView treeTableViewfilm; + @FXML + private TableView treeViewStreamingdata = new TableView<>(); @FXML private JFXTextArea ta1; @FXML @@ -111,14 +124,22 @@ public class MainWindowController { @FXML private JFXButton settingsBtn = new JFXButton("Settings"); @FXML - private JFXButton updateBtn = new JFXButton("Auf Update pr�fen"); + private JFXButton streamingSettingsBtn = new JFXButton("Streaming-Settings"); @FXML - private JFXButton directoryBtn = new JFXButton("Ordner ausw�hlen"); + private JFXButton switchBtn = new JFXButton("local"); + @FXML + private JFXButton updateBtn = new JFXButton("Auf Update prüfen"); + @FXML + private JFXButton directoryBtn = new JFXButton("Ordner auswählen"); + @FXML + private JFXButton streamingDirectoryBtn = new JFXButton("Ordner auswählen"); @FXML private JFXToggleButton autoupdateBtn = new JFXToggleButton(); @FXML public JFXTextField tfPfad = new JFXTextField(); @FXML + public JFXTextField streamingtfPfad = new JFXTextField(); + @FXML private JFXTextField tfsearch; @FXML public JFXColorPicker mainColor = new JFXColorPicker(); @@ -131,26 +152,43 @@ public class MainWindowController { @FXML private Label versionlbl = new Label(); @FXML - private Label sizelbl = new Label("Schriftgr��e:"); + private Label sizelbl = new Label("Schriftgröße:"); @FXML private Label aulbl = new Label("beim starten nach Updates suchen:"); @FXML private ImageView image1; @FXML - TreeItem root = new TreeItem<>(new uiData(1.0, "filme","1")); + TreeItem root = new TreeItem<>(new streamUiData(1, 1, 5.0,"1", "filme","1")); @FXML - TreeTableColumn columnRating = new TreeTableColumn<>("Bewertung"); + TreeTableColumn columnRating = new TreeTableColumn<>("Bewertung"); @FXML - TreeTableColumn columnName = new TreeTableColumn<>("Name"); + TreeTableColumn columnTitel = new TreeTableColumn<>("Name"); @FXML - TreeTableColumn columnDatName = new TreeTableColumn<>("Datei Name"); + TreeTableColumn columnStreamUrl = new TreeTableColumn<>("Datei Name"); + @FXML + TreeTableColumn columnResolution = new TreeTableColumn<>("Auflösung"); //TODO translate + @FXML + TreeTableColumn columnYear = new TreeTableColumn<>("Jahr"); //TODO translate + @FXML + TreeTableColumn columnSeason = new TreeTableColumn<>("Staffel"); //TODO translate + + @FXML + private TreeItem streamingRoot =new TreeItem<>(new streamUiData(1 ,1 ,1.0 ,"1" ,"filme" ,"1")); + @FXML + private TableColumn dataNameColumn = new TableColumn<>("Datei Name"); + @FXML + private TableColumn dataNameEndColumn = new TableColumn<>("Datei Name mit Endung"); + private boolean menutrue = false; //merker f�r menubtn (�ffnen oder schlie�en) private boolean settingstrue = false; - private String version = "0.3.6"; + private boolean streamingSettingsTrue = false; + private String version = "0.3.7"; private String versionURL = "https://raw.githubusercontent.com/Seil0/Project-HomeFlix/master/updates/version.txt"; - private String downloadLink = "https://raw.githubusercontent.com/Seil0/Project-HomeFlix/master/updates/downloadLink.txt"; + private String downloadLink = "https://raw.githubusercontent.com/Seil0/Project-HomeFlix/master/updates/downloadLink.txt"; + private File dir = new File(System.getProperty("user.home") + "/Documents/HomeFlix"); + private File file = new File(dir + "/config.xml"); private String updateDataURL; private String errorUpdateD; @@ -161,21 +199,26 @@ public class MainWindowController { private String vlcNotInstalled; private String aktVersion; private String path; + private String streamingPath; private String color; private String Name; private String datPath; private String autoUpdate; + private String mode; private double size; private int last; private int selected; private int next; private int local; private File selectedFolder; + private File selectedStreamingFolder; private ResourceBundle bundle; - private ObservableList newDaten = FXCollections.observableArrayList(); - private ObservableList filterData = FXCollections.observableArrayList(); + private ObservableList newDaten = FXCollections.observableArrayList(); + private ObservableList filterData = FXCollections.observableArrayList(); + private ObservableList streamData = FXCollections.observableArrayList(); private ObservableList locals = FXCollections.observableArrayList("english", "deutsch"); + private ObservableList streamingData = FXCollections.observableArrayList(); private Image imHF = new Image("recources/Homeflix_Poster.png"); private ImageView menu_icon_black = new ImageView(new Image("recources/menu_icon_black.png")); private ImageView menu_icon_white = new ImageView(new Image("recources/menu_icon_white.png")); @@ -190,111 +233,7 @@ public class MainWindowController { @FXML private void menubtnclicked(){ if(menutrue == false){ - anpane.getChildren().addAll(menuBox); - - //infobtn clicked - infoBtn.setOnAction(new EventHandler(){ - @Override - public void handle(ActionEvent event) { - Alert alert = new Alert(AlertType.INFORMATION); - alert.setTitle("Info"); - alert.setHeaderText("Project HomeFlix"); - alert.setContentText(infoText); - alert.showAndWait(); - } - }); - - //setteingsbtn clicked, deklarieren der actions der Objekte die bei settingsbtn angezeigt werden - settingsBtn.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent event){ - if(settingstrue == false){ - anpane.getChildren().addAll(settingsBox); - - tfPfad.setOnAction(new EventHandler(){ - @Override - public void handle(ActionEvent event){ - setPath(tfPfad.getText()); - saveSettings(); - } - }); - directoryBtn.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent event){ - selectedFolder = directoryChooser.showDialog(null); - if(selectedFolder == null){ - System.out.println("No Directory selected"); - }else{ - setPath(selectedFolder.getAbsolutePath()); - saveSettings(); - tfPfad.setText(getPath()); - try { - Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //starte neu - System.exit(0); //beendet sich selbst - } catch (IOException e) { - System.out.println("es ist ein Fehler aufgetreten"); - e.printStackTrace(); - } - } - } - }); - mainColor.setOnAction(new EventHandler(){ - @Override - public void handle(ActionEvent event){ - editColor(mainColor.getValue().toString()); - applyColor(); - } - }); - sl1.valueProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue ov,Number old_val, Number new_val) { - setSize(sl1.getValue()); - ta1.setFont(Font.font("System", size)); - saveSettings(); - } - }); - - //updater - updateBtn.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent event){ - update(); - } - }); - autoupdateBtn.setOnAction(new EventHandler(){ - @Override - public void handle(ActionEvent event) { - if(autoUpdate.equals("0")){ - setAutoUpdate("1"); - saveSettings(); - }else{ - setAutoUpdate("0"); - saveSettings(); - } - } - }); - - settingstrue = true; - }else{ - anpane.getChildren().removeAll(settingsBox); - setPath(tfPfad.getText()); - saveSettings(); - settingstrue = false; - } - } - }); - - //demoBtn clicked debbuging - demoBtn.setOnAction(new EventHandler(){ - @Override - public void handle(ActionEvent event) { - /** - * TODO DBController - */ -// loadData(); - } - }); - + anpane.getChildren().addAll(menuBox); menutrue = true; }else{ anpane.getChildren().removeAll(menuBox); @@ -306,6 +245,11 @@ public class MainWindowController { saveSettings(); settingstrue = false; } + if(streamingSettingsTrue == true){ + System.out.println("close settings"); + anpane.getChildren().removeAll(streamingSettingsBox); + streamingSettingsTrue = false; + } } @FXML @@ -353,15 +297,26 @@ public class MainWindowController { } }else if(SystemUtils.IS_OS_WINDOWS || SystemUtils.IS_OS_MAC_OSX){ System.out.println("This is Windows or Mac OSX"); - try { - Desktop.getDesktop().open(new File(getPath()+"\\"+ datPath)); - } catch (IOException e) { - Alert alert = new Alert(AlertType.ERROR); - alert.setHeaderText(""); - alert.setTitle("Info"); - alert.setContentText(errorPlay); - alert.showAndWait(); - e.printStackTrace(); + if(mode.equals("local")){ + try { + Desktop.getDesktop().open(new File(getPath()+"\\"+ datPath)); + } catch (IOException e) { + Alert alert = new Alert(AlertType.ERROR); + alert.setHeaderText(""); + alert.setTitle("Info"); + alert.setContentText(errorPlay); + alert.showAndWait(); + e.printStackTrace(); + } + }else if(mode.equals("streaming")){ + try { + Desktop.getDesktop().browse(new URI(datPath)); //TODO muss noch überarbeite werden! + } catch (URISyntaxException | IOException e) { + //Auto-generated catch block + e.printStackTrace(); + } + }else{ + System.out.println("error"); //TODO richtige fehlermeldung mode } } } @@ -369,7 +324,7 @@ public class MainWindowController { @FXML private void openfolderbtnclicked(){ try { - Desktop.getDesktop().open(new File(getPath())); //�ffnet den aktuellen Pfad + Desktop.getDesktop().open(new File(getPath())); //öffnet den aktuellen Pfad } catch (IOException e) { // Auto-generated catch block e.printStackTrace(); @@ -391,7 +346,11 @@ public class MainWindowController { public void setMain(Main main) { loadSettings(); +// loadStreamingSettings(); initTabel(); + initBtnAction(); + + System.out.println("Mode: "+mode); infoBtn.setPrefWidth(130); infoBtn.setPrefHeight(32); @@ -401,6 +360,14 @@ public class MainWindowController { settingsBtn.setPrefHeight(32); settingsBtn.setFont(Font.font("System", FontWeight.BOLD, 15)); + streamingSettingsBtn.setPrefWidth(130); + streamingSettingsBtn.setPrefHeight(32); + streamingSettingsBtn.setFont(Font.font("System", FontWeight.BOLD, 15)); + + switchBtn.setPrefWidth(130); + switchBtn.setPrefHeight(32); + switchBtn.setFont(Font.font("System", FontWeight.BOLD, 15)); + demoBtn.setPrefWidth(130); demoBtn.setPrefHeight(32); demoBtn.setFont(Font.font("System", FontWeight.BOLD, 15)); @@ -412,6 +379,10 @@ public class MainWindowController { tfPfad.setPrefWidth(250); tfPfad.setPromptText("Pfad"); tfPfad.setText(getPath()); + + streamingtfPfad.setPrefWidth(250); + streamingtfPfad.setPromptText("Pfad"); + streamingtfPfad.setText(getStreamingPath()); sl1.setMaxWidth(250); sl1.setMin(2); @@ -425,6 +396,12 @@ public class MainWindowController { directoryBtn.setFont(Font.font("System", 12)); directoryBtn.setMaxSize(180, 25); + streamingDirectoryBtn.setFont(Font.font("System", 12)); + streamingDirectoryBtn.setMaxSize(180, 25); + + treeViewStreamingdata.setPrefHeight(533); + treeViewStreamingdata.setPrefWidth(370); + if(autoUpdate.equals("1")){ autoupdateBtn.setSelected(true); update(); @@ -436,7 +413,7 @@ public class MainWindowController { menuBox.setSpacing(2.5); //Zeilenabstand menuBox.setPadding(new Insets(2.5,0,0,2.5)); // abstand zum Rand - menuBox.getChildren().addAll(infoBtn, settingsBtn,demoBtn); + menuBox.getChildren().addAll(infoBtn, settingsBtn, streamingSettingsBtn, switchBtn, demoBtn); menuBox.setFillWidth(true); AnchorPane.setTopAnchor(menuBox, 33d); @@ -445,6 +422,9 @@ public class MainWindowController { settingsBox.setStyle("-fx-background-color: #FFFFFF;"); settingsBox.getChildren().add(settingsan); + streamingSettingsBox.setStyle("-fx-background-color: #FFFFFF;"); + streamingSettingsBox.getChildren().add(streamingSettingsan); + settingsan.getChildren().addAll(tfPfad, directoryBtn, mainColor, sizelbl, sl1, cbLocal, updateBtn, aulbl, autoupdateBtn, versionlbl); settingsan.setTopAnchor(tfPfad, 5d); @@ -477,10 +457,28 @@ public class MainWindowController { settingsan.setTopAnchor(versionlbl, 280d); settingsan.setLeftAnchor(versionlbl, 5d); + streamingSettingsan.getChildren().addAll(streamingtfPfad, streamingDirectoryBtn,treeViewStreamingdata); + + streamingSettingsan.setTopAnchor(streamingtfPfad, 5d); + streamingSettingsan.setLeftAnchor(streamingtfPfad, 5d); + + streamingSettingsan.setTopAnchor(streamingDirectoryBtn, 5d); + streamingSettingsan.setLeftAnchor(streamingDirectoryBtn, 260d); + + streamingSettingsan.setTopAnchor(treeViewStreamingdata, 40d); + streamingSettingsan.setLeftAnchor(treeViewStreamingdata, 5d); + streamingSettingsan.setBottomAnchor(treeViewStreamingdata, 5d); + + AnchorPane.setTopAnchor(settingsBox, 34d); AnchorPane.setRightAnchor(settingsBox, 0d); AnchorPane.setBottomAnchor(settingsBox, 0d); AnchorPane.setLeftAnchor(settingsBox, 130d); + + AnchorPane.setTopAnchor(streamingSettingsBox, 34d); + AnchorPane.setRightAnchor(streamingSettingsBox, 0d); + AnchorPane.setBottomAnchor(streamingSettingsBox, 0d); + AnchorPane.setLeftAnchor(streamingSettingsBox, 130d); ta1.setWrapText(true); ta1.setEditable(false); @@ -488,6 +486,7 @@ public class MainWindowController { image1.setImage(imHF); + //TODO kann das auch raus? tfsearch.textProperty().addListener(new ChangeListener() { @SuppressWarnings("unchecked") @Override @@ -497,17 +496,18 @@ public class MainWindowController { root.getChildren().remove(0,root.getChildren().size()); for(int i = 0; i < counter; i++){ - if(newDaten.get(i).getFilmName().toLowerCase().contains(tfsearch.getText().toLowerCase())){ + if(newDaten.get(i).getTitel().toLowerCase().contains(tfsearch.getText().toLowerCase())){ filterData.add(newDaten.get(i)); } } for(int i = 0; i < filterData.size(); i++){ - root.getChildren().addAll(new TreeItem(filterData.get(i))); //f�gt daten zur Rootnode hinzu + root.getChildren().addAll(new TreeItem(filterData.get(i))); //fügt daten zur Rootnode hinzu } } }); + //TODO das auch? cbLocal.getSelectionModel().selectedIndexProperty() .addListener(new ChangeListener() { public void changed(ObservableValue ov, Number value, Number new_value) { @@ -518,54 +518,236 @@ public class MainWindowController { }); } - //initialisierung der TreeTabelView - @SuppressWarnings("unchecked") + //initialisierung der Tabellen für filme(beide Modi) und Streaming-Settings + @SuppressWarnings({ "unchecked", "rawtypes" }) private void initTabel(){ - root.setExpanded(true); + //Filmtabelle +// root.setExpanded(true); columnRating.setMaxWidth(120); - columnName.setMaxWidth(240); - columnDatName.setMaxWidth(0); + columnTitel.setMaxWidth(240); + columnStreamUrl.setMaxWidth(0); treeTableViewfilm.setRoot(root); treeTableViewfilm.setColumnResizePolicy( TreeTableView.CONSTRAINED_RESIZE_POLICY ); treeTableViewfilm.setShowRoot(false); //inhalt in Zelle schreiben - columnName.setCellValueFactory((CellDataFeatures p) -> - new ReadOnlyStringWrapper(p.getValue().getValue().getFilmName())); + columnTitel.setCellValueFactory((CellDataFeatures p) -> + new ReadOnlyStringWrapper(p.getValue().getValue().getTitel())); - columnRating.setCellValueFactory((CellDataFeatures p) -> - new ReadOnlyObjectWrapper(p.getValue().getValue().getFilmBewertung())); + columnRating.setCellValueFactory((CellDataFeatures p) -> + new ReadOnlyObjectWrapper(p.getValue().getValue().getRating())); - columnDatName.setCellValueFactory((CellDataFeatures p) -> - new ReadOnlyStringWrapper(p.getValue().getValue().getDataName())); + columnStreamUrl.setCellValueFactory((CellDataFeatures p) -> + new ReadOnlyStringWrapper(p.getValue().getValue().getStreamUrl())); + + columnResolution.setCellValueFactory((CellDataFeatures p) -> + new ReadOnlyStringWrapper(p.getValue().getValue().getResolution())); + + columnYear.setCellValueFactory((CellDataFeatures p) -> + new ReadOnlyObjectWrapper(p.getValue().getValue().getYear())); + + columnSeason.setCellValueFactory((CellDataFeatures p) -> + new ReadOnlyObjectWrapper(p.getValue().getValue().getSeason())); - treeTableViewfilm.getColumns().addAll(columnName, columnRating, columnDatName); + treeTableViewfilm.getColumns().addAll(columnTitel, columnRating, columnStreamUrl, columnResolution, columnYear, columnSeason); + treeTableViewfilm.getColumns().get(2).setVisible(false); //blendet die Column mit den Dateinamen aus (wichtig um sie abzuspielen) - //Changelistener f�r TreeTable - treeTableViewfilm.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { - + //Changelistener für TreeTable + treeTableViewfilm.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, Object oldVal, Object newVal) { - // last = selected; //f�r autoplay + // last = selected; //für autoplay selected = treeTableViewfilm.getSelectionModel().getSelectedIndex(); // holt aktuelles Item last = selected - 1; next = selected + 1; - Name = columnName.getCellData(selected); // holt Namen des Aktuelle Items aus der ColumnName - datPath = columnDatName.getCellData(selected); // holt den aktuellen Datei Pfad aus der ColumnDatName - ta1.setText(""); // l�scht Text in ta1 + Name = columnTitel.getCellData(selected); // holt Namen des Aktuelle Items aus der ColumnName + datPath = columnStreamUrl.getCellData(selected); // holt den aktuellen Datei Pfad aus der ColumnDatName + ta1.setText(""); // löscht Text in ta1 apiAbfrage(Name); // startet die api abfrage ta1.positionCaret(0); // setzt die startposition des Cursors in // ta1 } }); - treeTableViewfilm.getColumns().get(2).setVisible(false); //blendet die Column mit den Dateinamen aus (wichtig um sie abzuspielen) + //Streaming-Settings Tabelle + + dataNameColumn.setCellValueFactory(cellData -> cellData.getValue().titelProperty()); + dataNameEndColumn.setCellValueFactory(cellData -> cellData.getValue().streamUrlProperty()); + + treeViewStreamingdata.getColumns().addAll(dataNameColumn, dataNameEndColumn); + treeViewStreamingdata.setItems(streamingData); } - //pr�ft auf Update und f�ht es gegebenenfalls aus + //initialisierung der Button Actions + private void initBtnAction(){ + + infoBtn.setOnAction(new EventHandler(){ + @Override + public void handle(ActionEvent event) { + Alert alert = new Alert(AlertType.INFORMATION); + alert.setTitle("Info"); + alert.setHeaderText("Project HomeFlix"); + alert.setContentText(infoText); + alert.showAndWait(); + } + }); + + //setteingsbtn clicked, deklarieren der actions der Objekte die bei settingsbtn angezeigt werden + settingsBtn.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event){ + if(settingstrue == false){ + anpane.getChildren().addAll(settingsBox); + + tfPfad.setOnAction(new EventHandler(){ + @Override + public void handle(ActionEvent event){ + setPath(tfPfad.getText()); + saveSettings(); + } + }); + directoryBtn.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event){ + selectedFolder = directoryChooser.showDialog(null); + if(selectedFolder == null){ + System.out.println("No Directory selected"); + }else{ + setPath(selectedFolder.getAbsolutePath()); + saveSettings(); + tfPfad.setText(getPath()); + try { + Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //starte neu + System.exit(0); //beendet sich selbst + } catch (IOException e) { + System.out.println("es ist ein Fehler aufgetreten"); + e.printStackTrace(); + } + } + } + }); + mainColor.setOnAction(new EventHandler(){ + @Override + public void handle(ActionEvent event){ + editColor(mainColor.getValue().toString()); + applyColor(); + } + }); + sl1.valueProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue ov,Number old_val, Number new_val) { + setSize(sl1.getValue()); + ta1.setFont(Font.font("System", size)); + saveSettings(); + } + }); + + //updater + updateBtn.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event){ + update(); + } + }); + autoupdateBtn.setOnAction(new EventHandler(){ + @Override + public void handle(ActionEvent event) { + if(autoUpdate.equals("0")){ + setAutoUpdate("1"); + saveSettings(); + }else{ + setAutoUpdate("0"); + saveSettings(); + } + } + }); + + settingstrue = true; + }else{ + anpane.getChildren().removeAll(settingsBox); + setPath(tfPfad.getText()); + saveSettings(); + settingstrue = false; + } + } + }); + + //demoBtn clicked debbuging + demoBtn.setOnAction(new EventHandler(){ + @Override + public void handle(ActionEvent event) { + /** + * TODO DBController + */ +// loadData(); + } + }); + + streamingSettingsBtn.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event){ + if(streamingSettingsTrue == false){ + anpane.getChildren().addAll(streamingSettingsBox); + + streamingDirectoryBtn.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent event) { + selectedStreamingFolder = directoryChooser.showDialog(null); + if(selectedStreamingFolder == null){ + System.out.println("No Directory selected"); + }else{ + setStreamingPath(selectedStreamingFolder.getAbsolutePath()); + saveSettings(); + streamingtfPfad.setText(getStreamingPath()); + try { + Runtime.getRuntime().exec("java -jar ProjectHomeFlix.jar"); //starte neu + System.exit(0); //beendet sich selbst + } catch (IOException e) { + System.out.println("es ist ein Fehler aufgetreten"); + e.printStackTrace(); + } + } + } + });; + + streamingSettingsTrue = true; + }else{ + anpane.getChildren().removeAll(streamingSettingsBox); + streamingSettingsTrue = false; + } + + } + }); + + /** + * TODO menu wieder verschwinden lassen + * TODO Banner zurück auf homeflix setzen + */ + switchBtn.setOnAction(new EventHandler() { + + @Override + public void handle(ActionEvent event) { + + if(mode.equals("local")){ //switch to streaming mode + setMode("streaming"); + switchBtn.setText("local"); + }else if(mode.equals("streaming")){ //switch to local mode + setMode("local"); + switchBtn.setText("streaming"); + } + saveSettings(); + root.getChildren().remove(0,root.getChildren().size()); + addDataUI(); + + } + }); + } + + //prüft auf Update und fürht es gegebenenfalls aus private void update(){ System.out.println("check for updates ..."); @@ -589,11 +771,11 @@ public class MainWindowController { int iaktVersion = Integer.parseInt(aktVersion.replace(".", "")); if(iversion >= iaktVersion){ - updateBtn.setText("kein Update verf�gbar"); - System.out.println("kein Update verf�gbar"); + updateBtn.setText("kein Update verügbar"); + System.out.println("kein Update verfügbar"); }else{ - updateBtn.setText("Update verf�gbar"); - System.out.println("Update verf�gbar"); + updateBtn.setText("Update verfügbar"); + System.out.println("Update verfügbar"); try { URL website; URL downloadURL = new URL(downloadLink); @@ -619,23 +801,102 @@ public class MainWindowController { } } - //l�dt die Daten im angegeben Ordner in newDaten + //lädt die Daten im angegeben Ordner in newDaten public void loadData(){ - if(getPath().equals("")||getPath().equals(null)){ - System.out.println("Kein Pfad angegeben"); //falls der Pfad null oder "" ist - }else{ - String[] entries = new File(getPath()).list(); - for(int i = 0; i < entries.length; i++){ - String titel = ohneEndung(entries[i]); - String data = entries[i]; - newDaten.add(new uiData(5.0, titel ,data)); - } - for(int i = 0; i < newDaten.size(); i++){ - root.getChildren().add(new TreeItem(newDaten.get(i))); //f�gt daten zur Rootnode hinzu - } + //load local Data + if(getPath().equals("")||getPath().equals(null)){ + System.out.println("Kein Pfad angegeben"); //falls der Pfad null oder "" ist + }else{ + String[] entries = new File(getPath()).list(); + for(int i = 0; i < entries.length; i++){ + String titel = ohneEndung(entries[i]); + String data = entries[i]; + newDaten.add(new streamUiData(1, 1, 5.0, "1", titel, data)); + } + } + + //load streaming Data TODO prüfen ob streaming daten vorhanden -> momentan evtl. fehler + String titel = null; + String resolution = null; + String streamUrl = null; + int season; + int year; + double rating = 5.0; + if(getStreamingPath().equals("")||getStreamingPath().equals(null)){ + System.out.println("Kein Pfad angegeben"); //falls der Pfad null oder "" ist + }else{ + for(int i=0; i< streamingData.size(); i++){ + String fileName = streamingPath+"/"+streamingData.get(i).getStreamUrl(); + try { + JsonObject object = Json.parse(new FileReader(fileName)).asObject(); + JsonArray items = object.get("entries").asArray(); + + for (JsonValue item : items) { + titel = item.asObject().getString("titel",""); + season = item.asObject().getInt("season", 0); + year = item.asObject().getInt("year", 0); + resolution = item.asObject().getString("resolution", ""); + streamUrl = item.asObject().getString("streamUrl", ""); + streamData.add(new streamUiData(year, season, rating, resolution, titel, streamUrl)); + } + + } catch (IOException e) { + //Auto-generated catch block + e.printStackTrace(); + } + } + } +// }else{ +// Alert alert = new Alert(AlertType.ERROR); +// alert.setHeaderText(""); +// alert.setTitle("Error"); +// alert.setContentText("Oh, something went wrong! It seems someone has used a wrong mode. Please contact the maintainer!"); +// alert.showAndWait(); +// } + } + + public void addDataUI(){ + if(mode.equals("local")){ + for(int i = 0; i < newDaten.size(); i++){ + root.getChildren().add(new TreeItem(newDaten.get(i))); //fügt daten zur Rootnode hinzu + } + columnRating.setMaxWidth(120); + columnTitel.setMaxWidth(240); + treeTableViewfilm.getColumns().get(3).setVisible(false); + treeTableViewfilm.getColumns().get(4).setVisible(false); + treeTableViewfilm.getColumns().get(5).setVisible(false); + }else if(mode.equals("streaming")){ + for(int i = 0; i < streamData.size(); i++){ + root.getChildren().add(new TreeItem(streamData.get(i))); //fügt daten zur Rootnode hinzu + } + columnTitel.setMaxWidth(150); + columnResolution.setMaxWidth(65); + columnRating.setMaxWidth(52.5); + columnYear.setMaxWidth(40); + columnSeason.setMaxWidth(52.5); + treeTableViewfilm.getColumns().get(3).setVisible(true); + treeTableViewfilm.getColumns().get(4).setVisible(true); + treeTableViewfilm.getColumns().get(5).setVisible(true); } } + public void loadStreamingSettings(){ + if(getStreamingPath().equals("")||getStreamingPath().equals(null)){ + System.out.println("Kein Pfad angegeben"); //falls der Pfad null oder "" ist + }else{ + String[] entries = new File(getStreamingPath()).list(); + for(int i = 0; i < entries.length; i++){ + if(entries[i].endsWith(".json")){ + String titel = ohneEndung(entries[i]); + String data = entries[i]; + streamingData.add(new streamUiData(1,1,5.0,"1",titel ,data)); + } + } + for(int i = 0; i < streamingData.size(); i++){ + streamingRoot.getChildren().add( new TreeItem(streamingData.get(i))); //fügt daten zur Rootnode hinzu + } + } + } //entfernt die Endung vom String private String ohneEndung (String str) { if (str == null) return null; @@ -644,7 +905,7 @@ public class MainWindowController { return str.substring(0, pos); } - //setzt die Farben f�r die UI-Elemente + //setzt die Farben für die UI-Elemente public void applyColor(){ String style = "-fx-background-color: #"+getColor()+";"; String btnStyle = "-fx-button-type: RAISED; -fx-background-color: #"+getColor()+"; -fx-text-fill: BLACK;"; @@ -659,9 +920,12 @@ public class MainWindowController { if(icolor.compareTo(ccolor) == -1){ settingsBtn.setStyle("-fx-text-fill: WHITE;"); + streamingSettingsBtn.setStyle("-fx-text-fill: WHITE;"); + switchBtn.setStyle("-fx-text-fill: WHITE;"); infoBtn.setStyle("-fx-text-fill: WHITE;"); demoBtn.setStyle("-fx-text-fill: WHITE;"); directoryBtn.setStyle(btnStylewhite); + streamingDirectoryBtn.setStyle(btnStyle); updateBtn.setStyle(btnStylewhite); playbtn.setStyle(btnStylewhite); openfolderbtn.setStyle(btnStylewhite); @@ -670,9 +934,12 @@ public class MainWindowController { menubtn.setGraphic(menu_icon_white); }else{ settingsBtn.setStyle("-fx-text-fill: BLACK;"); + streamingSettingsBtn.setStyle("-fx-text-fill: BLACK;"); + switchBtn.setStyle("-fx-text-fill: BLACK;"); infoBtn.setStyle("-fx-text-fill: BLACK;"); demoBtn.setStyle("-fx-text-fill: BLACK;"); directoryBtn.setStyle(btnStyle); + streamingDirectoryBtn.setStyle(btnStyle); updateBtn.setStyle(btnStyle); playbtn.setStyle(btnStyle); openfolderbtn.setStyle(btnStyle); @@ -680,6 +947,13 @@ public class MainWindowController { forwardBtn.setStyle(btnStyle); menubtn.setGraphic(menu_icon_black); } + + //das solte weg kann aber hier bleiben wicht ist dass es zum selben zeitpunkt wie aply color ausgeführt wird + if(mode.equals("local")){ + switchBtn.setText("streaming"); + }else if(mode.equals("streaming")){ + switchBtn.setText("local"); + } } @@ -702,12 +976,12 @@ public class MainWindowController { sizelbl.setText(bundle.getString("fontSize")); aulbl.setText(bundle.getString("autoUpdate")); versionlbl.setText(bundle.getString("version")+" "+version); - columnName.setText(bundle.getString("columnName")); + columnTitel.setText(bundle.getString("columnName")); columnRating.setText(bundle.getString("columnRating")); - columnDatName.setText(bundle.getString("columnDatName")); + columnStreamUrl.setText(bundle.getString("columnDatName")); errorUpdateD = bundle.getString("errorUpdateD"); errorUpdateV = bundle.getString("errorUpdateV"); - infoText = bundle.getString("version")+" "+version+bundle.getString("infoText"); + infoText = bundle.getString("version")+" "+version+" plasma bucket"+bundle.getString("infoText"); linuxBugText = bundle.getString("linuxBug"); errorPlay = bundle.getString("errorPlay"); vlcNotInstalled = bundle.getString("vlcNotInstalled"); @@ -715,14 +989,15 @@ public class MainWindowController { //speichert die Einstellungen public void saveSettings(){ - File configFile = new File("config.xml"); //neue Datei "config.xml" try { props.setProperty("path", getPath()); //setzt pfad in propselement props.setProperty("color", getColor()); props.setProperty("autoUpdate", getAutoUpdate()); props.setProperty("size", getSize().toString()); props.setProperty("local", Integer.toString(getLocal())); - OutputStream outputStream = new FileOutputStream(configFile); //neuer outputstream + props.setProperty("streamingPath", getStreamingPath()); + props.setProperty("mode", getMode()); + OutputStream outputStream = new FileOutputStream(file); //neuer outputstream props.storeToXML(outputStream, "Project HomeFlix settings"); outputStream.close(); } catch (IOException e) { @@ -731,17 +1006,18 @@ public class MainWindowController { } } - //l�dt die Einstellungen + //lädt die Einstellungen public void loadSettings(){ - File configFile = new File("config.xml"); try { - InputStream inputStream = new FileInputStream(configFile); + InputStream inputStream = new FileInputStream(file); props.loadFromXML(inputStream); path = props.getProperty("path"); //setzt Propselement in Pfad + streamingPath = props.getProperty("streamingPath"); color = props.getProperty("color"); size = Double.parseDouble(props.getProperty("size")); autoUpdate = props.getProperty("autoUpdate"); local = Integer.parseInt(props.getProperty("local")); + mode = props.getProperty("mode"); inputStream.close(); } catch (IOException e) { System.out.println("An error has occurred!"); @@ -749,6 +1025,14 @@ public class MainWindowController { } } + //entfernt 0x von dem Rückgabewert des Colorpickers + private void editColor(String input){ + StringBuilder sb = new StringBuilder(input); + sb.delete(0, 2); + this.color = sb.toString(); + saveSettings(); + } + //getter Und setter public void setColor(String input){ this.color = input; @@ -757,15 +1041,7 @@ public class MainWindowController { public String getColor(){ return color; } - - //entfernt 0x von dem r�ckgabe wert des Colorpickers - private void editColor(String input){ - StringBuilder sb = new StringBuilder(input); - sb.delete(0, 2); - this.color = sb.toString(); - saveSettings(); - } - + public void setPath(String input){ this.path = input; } @@ -774,6 +1050,14 @@ public class MainWindowController { return path; } + public void setStreamingPath(String input){ + this.streamingPath = input; + } + + public String getStreamingPath(){ + return streamingPath; + } + public void setSize(Double input){ this.size = input; } @@ -798,6 +1082,14 @@ public class MainWindowController { return local; } + public void setMode(String input){ + this.mode = input; + } + + public String getMode(){ + return mode; + } + //methode der API-Abfrage @SuppressWarnings("deprecation") private void apiAbfrage(String input){ @@ -816,7 +1108,7 @@ public class MainWindowController { sc = new Scanner(System.in); moviename = input; - // f�r keinen oder "" Filmtitel + // für keinen oder "" Filmtitel if (moviename == null || moviename.equals("")) { System.out.println("No movie found"); } @@ -824,10 +1116,10 @@ public class MainWindowController { //entfernen ungewolter leerzeichen moviename = moviename.trim(); - // ersetzen der Leerzeichen durch + f�r api-abfrage + // ersetzen der Leerzeichen durch + für api-abfrage moviename = moviename.replace(" ", "+"); - //URL wird zusammengestellt abfragetypen: http,json,xml (muss json sein um sp�teres trennen zu erm�glichen) + //URL wird zusammengestellt abfragetypen: http,json,xml (muss json sein um späteres trennen zu ermöglichen) dataurl = apiurl + "t=" + moviename + "&plot=full&r=json"; url = new URL(dataurl); @@ -836,7 +1128,7 @@ public class MainWindowController { // lesen der Daten aus dem Antwort Stream while ((retdata = dis.readLine()) != null) { - //retdata in json object parsen und anschlie�end das json Objekt "zerschneiden" + //retdata in json object parsen und anschließend das json Objekt "zerschneiden" System.out.println(retdata); JsonObject object = Json.parse(retdata).asObject(); String titel = object.getString("Title", ""); @@ -894,7 +1186,7 @@ public class MainWindowController { System.out.println(e); } finally { try { - //schlie�t datainputStream, InputStream,Scanner + //schließt datainputStream, InputStream,Scanner if (dis != null) { dis.close(); } diff --git a/src/application/streamUiData.java b/src/application/streamUiData.java new file mode 100644 index 0000000..413e598 --- /dev/null +++ b/src/application/streamUiData.java @@ -0,0 +1,101 @@ +package application; + +import javafx.beans.property.DoubleProperty; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; + +public class streamUiData { + + private IntegerProperty year = new SimpleIntegerProperty(); + private IntegerProperty season = new SimpleIntegerProperty(); + private DoubleProperty rating = new SimpleDoubleProperty(); + private StringProperty resolution = new SimpleStringProperty(); + private StringProperty titel = new SimpleStringProperty(); + private StringProperty streamUrl = new SimpleStringProperty(); + + //uiData ist der Typ der Daten in der TreeTabelView + public streamUiData (final int year, final int season, final double rating, final String resolution, final String titel, final String streamUrl) { + this.year.set(year); + this.season.set(season); + this.rating.set(rating); + this.resolution.set(resolution); + this.titel.set(titel); + this.streamUrl.set(streamUrl); + } + + public int getYear() { + return year.get(); + } + + public int getSeason() { + return season.get(); + } + + public double getRating() { + return rating.get(); + } + + public String getResolution() { + return resolution.get(); + } + + public String getTitel() { + return titel.get(); + } + + public String getStreamUrl() { + return streamUrl.get(); + } + + + public void setYear(int year) { + this.year.set(year); + } + + public void setSeason(int season) { + this.season.set(season); + } + + public void setRating(int rating) { + this.rating.set(rating); + } + + public void setResolution(String resolution) { + this.resolution.set(resolution); + } + + public void setTitel(String titel) { + this.titel.set(titel); + } + + public void setStreamUrl(StringProperty streamUrl) { + this.streamUrl = streamUrl; + } + + public IntegerProperty yearProperty(){ + return year; + } + + public IntegerProperty seasonProperty(){ + return season; + } + + public DoubleProperty ratingProperty(){ + return rating; + } + + public StringProperty resolutionProperty(){ + return resolution; + } + + public StringProperty titelProperty(){ + return titel; + } + + public StringProperty streamUrlProperty(){ + return streamUrl; + } +}