How do I create a List Model for my custom collection class

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

How do I create a List Model for my custom collection class

Frank Sonnemans-2
Hello all,

My application displays part of a list of targets. The part displayed
can be changed through the model. How do I make sure that the enhanced
list view gets updated.

App Structure:

MODEL:
instance vars: completeList filteredList (both are instances of
TargetList which is subclass of OrderedCollection)

filtering the list is done with a TargetList>>filter: method which
returns a new TargetList so:

applyFilter: aFilter
  filteredList := completeList filter: aFilter

Thus the filteredList is not edited inplace.

PRESENTER:
View1 : shell with enhanced list view on filteredList
View2 : shell which allows to change and activate filter

PROBLEM:
Using View2 the filteredList gets updated (as seen in the inspector),
but View1 does not get updated.

I tried several things like manually sending a #listChanged signal or
subclassing ListModel for my TargetList, but that did not work. What
is the correct approach.


Reply | Threaded
Open this post in threaded view
|

Re: How do I create a List Model for my custom collection class

Dmitry Zamotkin-3
"Frank Sonnemans" <[hidden email]> wrote in message
news:[hidden email]...
> Hello all,
>
> My application displays part of a list of targets. The part displayed
> can be changed through the model. How do I make sure that the enhanced
> list view gets updated.
>
> I tried several things like manually sending a #listChanged signal or
> subclassing ListModel for my TargetList, but that did not work. What
> is the correct approach.

Let's try my example based on FilteredListModel. I suppose it correct way :)

--
Dmitry Zamotkin
























begin 666 SimpleFilter.pac
M?"!P86-K86=E('P-"G!A8VMA9V4@.CT@4&%C:V%G92!N86UE.B G4VEM<&QE
M1FEL=&5R)RX-"G!A8VMA9V4@<&%X5F5R<VEO;CH@,#L-"@EB87-I8T-O;6UE
M;G0Z("<G+@T*#0IP86-K86=E(&)A<VEC4&%C:V%G959E<G-I;VXZ("<G+@T*
M#0HB061D('1H92!P86-K86=E('-C<FEP=',B#0H-"B)!9&0@=&AE(&-L87-S
M(&YA;65S+"!L;V]S92!M971H;V0@;F%M97,L(&=L;V)A;"!N86UE<RP@<F5S
M;W5R8V4@;F%M97,B#0IP86-K86=E(&-L87-S3F%M97,-"@EA9&0Z("-&:6QT
M97)E9$QI<W1-;V1E;#L-"@EA9&0Z("-3:6UP;&5,:7-T36]D96Q3:&5L;#L-
M"@EY;W5R<V5L9BX-"@T*<&%C:V%G92!M971H;V1.86UE<PT*"7EO=7)S96QF
M+@T*#0IP86-K86=E(&=L;V)A;$YA;65S#0H)>6]U<G-E;&8N#0H-"G!A8VMA
M9V4@<F5S;W5R8V5.86UE<PT*"7EO=7)S96QF+@T*#0HB0FEN87)Y($=L;V)A
M;"!.86UE<R(-"G!A8VMA9V4@8FEN87)Y1VQO8F%L3F%M97,Z("A3970@;F5W
M#0H)>6]U<G-E;&8I+@T*(E)E<V]U<F-E($YA;65S(@T*<&%C:V%G92!A;&Q2
M97-O=7)C94YA;65S.B H4V5T(&YE=PT*"6%D9#H@(U-I;7!L94QI<W1-;V1E
M;%-H96QL("T^("=$969A=6QT('9I97<G.PT*"7EO=7)S96QF*2X-"@T*(D%D
M9"!T:&4@<')E<F5Q=6ES:71E(&YA;65S(@T*<&%C:V%G92!S9710<F5R97%U
M:7-I=&5S.B H261E;G1I='E3970@;F5W#0H)861D.B G1&]L<&AI;B<[#0H)
M>6]U<G-E;&8I+@T*#0IP86-K86=E(0T*#0HB0VQA<W,@1&5F:6YI=&EO;G,B
M(0T*#0I,:7-T36]D96P@<W5B8VQA<W,Z("-&:6QT97)E9$QI<W1-;V1E; T*
M"6EN<W1A;F-E5F%R:6%B;&5.86UE<SH@)V]R:6=,:7-T(&9I;'1E<D)L;V-K
M)PT*"6-L87-S5F%R:6%B;&5.86UE<SH@)R<-"@EP;V]L1&EC=&EO;F%R:65S
M.B G)PT*"6-L87-S26YS=&%N8V5687)I86)L94YA;65S.B G)R$-"E-H96QL
M('-U8F-L87-S.B C4VEM<&QE3&ES=$UO9&5L4VAE;&P-"@EI;G-T86YC959A
M<FEA8FQE3F%M97,Z("=L:7-T4')E<V5N=&5R(&9I;'1E<E!R97-E;G1E<B<-
M"@EC;&%S<U9A<FEA8FQE3F%M97,Z("<G#0H)<&]O;$1I8W1I;VYA<FEE<SH@
M)R<-"@EC;&%S<TEN<W1A;F-E5F%R:6%B;&5.86UE<SH@)R<A#0HB3&]O<V4@
M365T:&]D<R(A#0H-"B)%;F0@;V8@<&%C:V%G92!D969I;FET:6]N(B$-"@T*
M#0H-"D9I;'1E<F5D3&ES=$UO9&5L(&-O;6UE;G0Z("?.\NOH]^#E\O'_(.[R
M($QI<W1-;V1E;"#RY>PL(/?R[B#O[N?B[NO_Y?(@\_'RX.W@XNOHXN#R_"#T
MZ.O\\O @*#Q-;VYA9&EC5F%L=6%B;&4^*2X-"L_PZ"#D[O'R\^_E(.H@3&ES
M=$UO9&5L(.3N\?+S[R#N\?/YY?'RXNO_Y?+Q_R#R[NO\ZNX@ZB#NX?KEZO+@
M["P@\^3NXNOE\N+N\/_^^>CL(/3HZ_SR\/,N)R$-"@T*1FEL=&5R961,:7-T
M36]D96P@9W5I9#H@*$=5240@9G)O;5-T<FEN9SH@)WM!-#-!-40Q-"TW1C,Q
M+3$Q1#0M0D$W0BTP,# X0S<X.4$T,C1])RDA#0H-"B%&:6QT97)E9$QI<W1-
M;V1E;"!C871E9V]R:65S1F]R0VQA<W,A56YC;&%S<VEF:65D(2 A#0HA1FEL
M=&5R961,:7-T36]D96P@;65T:&]D<T9O<B$-"@T*861D.B!A;D]B:F5C="!A
M9G1E<DEN9&5X.B!A;DEN=&5G97(-"@T*"2(@S>7PY>#KZ.?NXN#MX"#HYRWG
MX"#R[N/N+"#W\NX@[_#H(/3HZ_SR\.#VZ.@@[.7M__[R\?\@Z.WDY>KQ^RXN
M+B H]>SL*2 B#0H-"@E%<G)O<B!N;W19971);7!L96UE;G1E9"XA#0H-"F)E
M4V]R=&5D#0H)(E-O<G0@=&AE(&-O;&QE8W1I;VX@:&5L9"!B>2!T:&4@<F5C
M96EV97(@=7-I;F<@82!D969A=6QT('-O<G0@8FQO8VLB#0H-"@EL:7-T(#H]
M('-E;&8@;&ES="!A<U-O<G1E9$-O;&QE8W1I;VXN#0H)<V5L9B!T<FEG9V5R
M.B C;&ES=$-H86YG960N#0H-"B$-"@T*8F53;W)T960Z(&%3;W)T0FQO8VL-
M"@DB4V]R="!T:&4@8V]L;&5C=&EO;B!H96QD(&)Y('1H92!R96-E:79E<B!U
M<VEN9R!A4V]R=$)L;V-K(@T*#0H);&ES=" Z/2!S96QF(&QI<W0@87-3;W)T
M961#;VQL96-T:6]N.B!A4V]R=$)L;V-K+@T*"7-E;&8@=')I9V=E<CH@(VQI
M<W1#:&%N9V5D+@T*(0T*#0IF:6QT97(-"@E>(&9I;'1E<D)L;V-K(0T*#0IF
M:6QT97(Z(&%-;VYA9&EC5F%L=6%B;&4-"@T*"69I;'1E<D)L;V-K(#H](&%-
M;VYA9&EC5F%L=6%B;&4N#0H)<V5L9B!P97)F;W)M1FEL=&5R:6YG+B$-"@T*
M;&ES=#H@84QI<W0-"@EO<FEG3&ES=" Z/2!A3&ES="X-"@ES96QF('!E<F9O
M<FU&:6QT97)I;F<N#0H-"@T*(0T*#0IO<FEG:6Y,:7-T#0H);W)I9TQI<W0@
M:7-.:6P@:694<G5E.B!;;W)I9TQI<W0@.CT@<W5P97(@;&ES="!=+@T*"5X@
M;W)I9TQI<W0A#0H-"G!E<F9O<FU&:6QT97)I;F<-"@T*"69I;'1E<D)L;V-K
M(&ES3FEL#0H)"6EF5')U93H@6W-U<&5R(&QI<W0Z('-E;&8@;W)I9VEN3&ES
M=%T-"@D):69&86QS93H@6W-U<&5R(&QI<W0Z("AS96QF(&]R:6=I;DQI<W0@
M<V5L96-T.B!F:6QT97)";&]C:RE=+@T*(0T*#0IR96UO=F5!9G1E<DEN9&5X
M.B!A;DEN=&5G97(-"@T*"2(@T>PN(&%D9#IA9G1E<DEN9&5X("(-"@T*"45R
M<F]R($YO=%EE=$EM<&QE;65N=&5D+B$-"@T*<F5S971&:6QT97(-"@T*"69I
M;'1E<D)L;V-K(#H](&YI;"X-"@ES96QF('!E<F9O<FU&:6QT97)I;F<N(2 A
M#0HA1FEL=&5R961,:7-T36]D96P@8V%T96=O<FEE<T9O<CH@(V%D9#IA9G1E
M<DEN9&5X.B$J+6YO="!Y970@:6UP;&5M96YT960A861D:6YG(7!U8FQI8R$@
M(0T*(49I;'1E<F5D3&ES=$UO9&5L(&-A=&5G;W)I97-&;W(Z("-B95-O<G1E
M9"%P=6)L:6,A<V]R=&EN9R$@(0T*(49I;'1E<F5D3&ES=$UO9&5L(&-A=&5G
M;W)I97-&;W(Z("-B95-O<G1E9#HA<'5B;&EC(7-O<G1I;F<A("$-"B%&:6QT
M97)E9$QI<W1-;V1E;"!C871E9V]R:65S1F]R.B C9FEL=&5R(6%C8V5S<VEN
M9R%P=6)L:6,A("$-"B%&:6QT97)E9$QI<W1-;V1E;"!C871E9V]R:65S1F]R
M.B C9FEL=&5R.B%O<&5R871I;VYS(7!U8FQI8R$@(0T*(49I;'1E<F5D3&ES
M=$UO9&5L(&-A=&5G;W)I97-&;W(Z("-L:7-T.B%A8V-E<W-I;F<A<'5B;&EC
M(2 A#0HA1FEL=&5R961,:7-T36]D96P@8V%T96=O<FEE<T9O<CH@(V]R:6=I
M;DQI<W0A*BUU;F-L87-S:69I960A<'5B;&EC(2 A#0HA1FEL=&5R961,:7-T
M36]D96P@8V%T96=O<FEE<T9O<CH@(W!E<F9O<FU&:6QT97)I;F<A:&5L<&5R
M<R%P<FEV871E(2 A#0HA1FEL=&5R961,:7-T36]D96P@8V%T96=O<FEE<T9O
M<CH@(W)E;6]V94%F=&5R26YD97@Z(7!U8FQI8R%R96UO=FEN9R$@(0T*(49I
M;'1E<F5D3&ES=$UO9&5L(&-A=&5G;W)I97-&;W(Z("-R97-E=$9I;'1E<B%O
M<&5R871I;VYS(7!U8FQI8R$@(0T*#0H-"@T*4VEM<&QE3&ES=$UO9&5L4VAE
M;&P@8V]M;65N=#H@)R<A#0H-"E-I;7!L94QI<W1-;V1E;%-H96QL(&=U:60Z
M("A'54E$(&9R;VU3=')I;F<Z("=[,31!1#0P,# M0S0Y-"TQ,40U+4)!.$0M
M,# P.$,W.#E!-#(T?2<I(0T*#0HA4VEM<&QE3&ES=$UO9&5L4VAE;&P@8V%T
M96=O<FEE<T9O<D-L87-S(55N8VQA<W-I9FEE9"$@(0T*(5-I;7!L94QI<W1-
M;V1E;%-H96QL(&UE=&AO9'-&;W(A#0H-"F-R96%T94-O;7!O;F5N=',-"@D-
M"@ES=7!E<B!C<F5A=&5#;VUP;VYE;G1S+@T*#0H);&ES=%!R97-E;G1E<B Z
M/2!S96QF(&%D9#H@3&ES=%!R97-E;G1E<B!N97<@;F%M93H@)VQI<W0G+@T*
M"69I;'1E<E!R97-E;G1E<B Z/2!S96QF(&%D9#H@5&5X=%!R97-E;G1E<B!N
M97<@;F%M93H@)V9I;'1E<B<N#0H)(0T*#0IC<F5A=&538VAE;6%T:6-7:7)I
M;F<-"@T*"7-U<&5R(&-R96%T95-C:&5M871I8U=I<FEN9RX-"@T*"69I;'1E
M<E!R97-E;G1E<@T*"0EW:&5N.B C=F%L=65#:&%N9V5D#0H)"7-E;F0Z("-O
M;D9I;'1E<D-H86YG960-"@D)=&\Z('-E;&8N(0T*#0IM;V1E;#H@84-O;&QE
M8W1I;VX-"@T*"7-U<&5R(&UO9&5L.B!A0V]L;&5C=&EO;BX-"@EL:7-T4')E
M<V5N=&5R(&UO9&5L.B H1FEL=&5R961,:7-T36]D96P@;VXZ('-E;&8@;6]D
M96PI+@T*(0T*#0IO;D9I;'1E<D-H86YG960-"@E\('!A='1E<FX@? T*#0H)
M<&%T=&5R;B Z/2!F:6QT97)0<F5S96YT97(@;6]D96P@=F%L=64L)RHG+@T*
M"6QI<W10<F5S96YT97(@;6]D96P@9FEL=&5R.B!;(#IE;&5M96YT('P@<&%T
M=&5R;B!M871C:#H@96QE;65N="!=+B$@(0T*(5-I;7!L94QI<W1-;V1E;%-H
M96QL(&-A=&5G;W)I97-&;W(Z("-C<F5A=&5#;VUP;VYE;G1S(6EN:71I86QI
M>FEN9R%P=6)L:6,A("$-"B%3:6UP;&5,:7-T36]D96Q3:&5L;"!C871E9V]R
M:65S1F]R.B C8W)E871E4V-H96UA=&EC5VER:6YG(6EN:71I86QI>FEN9R%P
M=6)L:6,A("$-"B%3:6UP;&5,:7-T36]D96Q3:&5L;"!C871E9V]R:65S1F]R
M.B C;6]D96PZ(6%C8V5S<VEN9R%P=6)L:6,A("$-"B%3:6UP;&5,:7-T36]D
M96Q3:&5L;"!C871E9V]R:65S1F]R.B C;VY&:6QT97)#:&%N9V5D(2HM=6YC
M;&%S<VEF:65D(7!U8FQI8R$@(0T*#0HA4VEM<&QE3&ES=$UO9&5L4VAE;&P@
M8VQA<W,@;65T:&]D<T9O<B$-"@T*9&5F875L=$UO9&5L#0H-"@E>(",H("=A
M86$G("=B8F(G("=A8F,G("=C8V,G("=A8V1E9B<@)V)C9&4G("=A,3,R-"<@
M)V-A86$G("=A8V1E82<@)V)S9&8G("=A8V1E971E)R G8V%B86(G("DA("$-
M"B%3:6UP;&5,:7-T36]D96Q3:&5L;"!C;&%S<R!C871E9V]R:65S1F]R.B C
M9&5F875L=$UO9&5L(2HM=6YC;&%S<VEF:65D(7!U8FQI8R$@(0T*#0H@#0HB
M0FEN87)Y($=L;V)A;',B(0T*#0HB4F5S;W5R8V5S(B$-"@T**%)E<V]U<F-E
M261E;G1I9FEE<B!C;&%S<SH@4VEM<&QE3&ES=$UO9&5L4VAE;&P@;F%M93H@
M)T1E9F%U;'0@=FEE=R<I(&%S<VEG;CH@*$]B:F5C="!F<F]M0FEN87)Y4W1O
M<F5">71E<SH-"BA">71E07)R87D@9G)O;4AE>%-T<FEN9SH@)S(Q-3,U-#0R
M,C S,#(P-#8P,C!#,# P,3 P,# P,#4V-CDV-3<W-3(V-3<S-D8W-3<R-C,V
M-3 P,# P,# P,$4P,3(T,# U,S4T-#(U,C8U-S,V1C<U-S(V,S8U-3,U-#0R
M-#(W.3<T-C4T,3<R-S(V,3<Y-#$V,S8S-C4W,S<S-D8W,C4P-S(V1C<X-SDP
M,# P,# P,#,V,# P.3 P-#(W.3<T-C4T,3<R-S(V,3<Y1C<P-C P,# R,34S
M-30T,C(P,S R,#1%,#@P0S P,$$P,# P,# U,S4T-#(U-C8Y-C4W-S4P-S(V
M1C<X-SDP,# P,# P,#1%,#(P1# P,#$P,# P,# U,S4T-#(T,S9#-C$W,S<S
M-3 W,C9&-S@W.3 P,# P,# P,S8P,# V,# U,S<T-S(V.39%-C<P-S P,# P
M,#0T-D8V0S<P-C@V.39%.3(P,# P,# P.3 P,# P,#4S-C@V-39#-D,U-C8Y
M-C4W-S(V,# P-3 P-#$W,C<R-C$W.3%",# P,# P,# P,# P,# P,# P,# P
M,$,R,# P,# P,#(P,# P,# P,3 P.44P,3 Q,# P,C P-C P,# P,# P,# P
M,# P,# P,# P,# P,# P,# P,# P-S R,# P,# P,# P,# P,# P,# P,# P
M,# P,# P,# P,# P,# P,#8P-S!#,# T,C9&-S(V-#8U-S(T0S8Q-SDV1C<U
M-S0P,# P,# P,# Q,# P,# P,#$P,# P,# P,# P,# P,#5!,# P,# P,# P
M,# P,# W03 P,# P,# P,# P,# P03 P,# P,# Y,C P,# P,# X,# P,# P
M-30V-3<X-S0T-38T-CDW-$,R,# P,# P,3 P,# P,# P,# P,# P,#8P,# P
M,# P0S(P,# P,# P,C P,# P,#,V,# P0S P-$,V,3<R-C<V-30Y-D4W-#8U
M-C<V-3<R,#0P,# P,# X,# P,#$T-# Q,#0P,# P,3 P,3 P,# P,# P,# P
M,# P,# P,# P,# P,# P,# P-S P,# P,# P,# P,# P,# P,# P,# P,# P
M,# P,# P,# P,# P,# P,# P,# V,C Q,# P,# X,# P,# P1C)%.#0T.# P
M,# P,# P,# V,#(P1# P-$4W-39#-D,T,S9&-D4W-C8U-S(W-#8U-S(P,# P
M,# P,# P,# P,# P,# P,# P,# P-3 P,# P,# V,#$P1C P-$0V-3<S-S,V
M,38W-C4U,S8U-S$W-38U-D4V,S8U,# P,# P,# P13 R,3(P,#4S-30T,C0S
M-D8V0S9#-C4V,S<T-CDV1C9%-3 W,C9&-S@W.3 P,# P,# P-T$P,# P,# P
M,# P,# P,$$P,# P,# P.3(P,# P,# Q,3 P,# P,#1&-S(V-#8U-S(V-38T
M-#,V1C9#-D,V-38S-S0V.39&-D5#,C P,# P,# S,# P,# P,#8P,S!",# T
M1#8U-S,W,S8Q-C<V-34S-C4V138T,# P,# P,# P13 Q,$4P,#4S-30T,C4S
M-SDV1#8R-D8V0S4P-S(V1C<X-SDP,# P,# P,#DR,# P,# P,3 P,# P,# V
M,S<R-C4V,3<T-C4T,3<T,T$V-3<X-S0V-39%-S0S04,R,# P,# P,#(P,# P
M,# P-C R,#4P,#4P-D8V.39%-S0P,# P,# P,# Q,# P,# P1D(P,3 P,# X
M,C R,# P,# P,# P,# P.48P,3 P,# S,S P,# P,#$P,#$P,# P,C(P,C P
M,# P,# P,# P,#1!,#(P,# P,# P,# P,# Y,C P,# P,#!&,# P,# P-S,V
M-39#-C4V,S<T-CDV1C9%-3(V,39%-C<V-3-!0S(P,# P,# P,3 P,# P,# V
M,#,P.# P-#DV13<T-C4W,C<V-C$V0S P,# P,# P,#,P,# P,# P,3 P,# P
M,# S,# P,# P,3 P,3 P,# R,C R,# P,# P,# P,# P-$$P,C P,# P,# P
M,# P,#DR,# P,# P,$8P,# P,# V.3<S-30V-3<X-S0T1#9&-C0V.38V-CDV
M-38T,T%#,C P,# P,# Q,# P,# P,C P,# P,# Q,# Q,# P,# V,#$P1C P
M-3<T.31%-#0T1C4W-3 T0S0Q-#,T-31$-#4T134T,# P,# P,# S-C P,#DP
M,#0R-SDW-#8U-#$W,C<R-C$W.3)#,# P,# P,D,P,# P,# P,# P,# P,# Q
M,# P,# P1D9&1D9&1D9&1D9&1D9&1D9&1D9&1D9&1D9&1D9&1D8P,# P,# P
M,$9$,# P,# P0T8P,# P,# Q-C Q,# P,$1!,#$P,# P,# P,# P,#!&,# Q
M,# P,$,R,# P,# P,# P,# P,# X,C R,# P,# P,# P,# P0S$P,# P,#!#
M,3 P,# P,# P,# P,# P,3,P,# P,# P,# P,# P,# P,# P,# P-4$P,# P
M,# P,# P,# P,#=!,# P,# P,# P,# P,#!!,# P,# P,#DR,# P,# P,#<P
M,# P,# T0S8Y-S,W-#0R-D8W.$,R,# P,# P,3$P,# P,# P,# P,# P,#8P
M,# P,# P0S(P,# P,# P,C P,# P,#8R,#$P,# P,#0P,# P,# P,3 Q,S$T
M-# Q,#0P,# P0S P,S P,# T-C S,#DP,# R,# P,# P-$,V.3<S-S0T1#9&
M-C0V-39#,# P,# P,#!$03 Q,# P,# P,# P,# P1C P,3 P,#!!,# S,# P
M,# P,# P,# P,#8P,#$T,# T.38T-C4V13<T-CDW-#<Y-3,V-38Q-S(V,S8X
M-3 V1C9#-CDV,S<Y,# P,# P,# P,# P,# P,# P,# P,# P,#<P,# P,# P
M,# P,# P,# P,# P,# P,# P,# P,# P,# P,# P,# P,# P,# P-C(P,3 P
M,# P.# P,# P,# X13DT-#@P,# P,# P,# W03 P,# P,# P,# P,# P03 P
M,# P,# Y,C P,# P,#$Q,# P,# P-#(V,3<S-CDV,S1#-CDW,S<T-#$V,C<S
M-S0W,C8Q-C,W-# Q,# P,# P,C P,# P,#!",C Q,# P,# P,# P,# P1$$P
M,3 P,# P,# P,# P,$8P,#$P,# P0S(P,# P,# P,C P,# P,#(R,#(P,# P
M,# P,# P,# U,# R,# P,$,R,# P,# P,#(P,# P,# X,C R,# P,# P,# P
M,# P,#$P,# P,# P,3 P,# P,#@R,#(P,# P,# P,# P,# Y1C Q,# P,$9"
M,#$P,# P0S P,S P,# R,C R,# P,# P,# P,# P-$$P,C P,# P,# P,# P
M,#DR,# P,# P,3$P,# P,# V.#9&-S(V.3=!-D8V13<T-C$V0S0U-S@W-#8U
M-D4W-#-!0S(P,# P,# P,3 P,# P,# Q,# P,# P0S P,S P,# U,C S,# P
M,# P,# P,# P-S(P,S P,# R0S P,# P,#)#,# P,# P,# P,# P,# P,3 P
M,# P,$9&1D9&1D9&1D9&1D9&1D9&1D9&1D9&1D9&1D9&1D9&,# P,# P,# P
M,# P,# P,$-&,# P,# P1D0P,# P,#!$03 Q,# P,# P,# P,# P1C P,3 P
M,#!!,# S,# P,$(P,#,P,# P,# P,# P,# Q,S P,# P,#!%,#(Q03 P-3,U
M-#0R-#DV-#8U-D4W-#8Y-S0W.30T-CDV,S<T-CDV1C9%-C$W,C<Y-3 W,C9&
M-S@W.3 P,# P,# P-T$P,# P,# P,# P,# P,$$P,# P,# P.3(P,# P,# Q
M,C P,# P,#0Y-C0V-39%-S0V.3<T-SDT-#8Y-C,W-#8Y-D8V138Q-S(W.4,R
M,# P,# P,#0P,# P,# Q,# Q,# P,#DR,# P,# P,#8P,# P,# V-C8Y-D,W
M-#8U-S)#,# S,# P,#DR,# P,# P,#0P,# P,# V0S8Y-S,W-# P,# P,# P
M,# P,# P,# P,# P,# P,# P,# P,# P,# P,# P,# P,3 P,# P,# P,# P
M,# P,# P,# P,# P,# P,# P,# P,# P,# P,#$P,# P,# P,# P,# P,# P
M,# P,# P0C(P,3 P,# P,# P,# P,$1!,#$P,# P,# P,# P,#!&,# Q,# P
M,$,R,# P,# P,#,P,# P,# R,C R,# P,# P,# P,# P-3 P,C P,#!#,C P
M,# P,# R,# P,# P.#(P,C P,# P,# P,# P,#!",# P,# P,$(P,# P,# X
M,C R,# P,# P,# P,# P048P,3 P,# V,S R,# P,#8P,# P,# P,C(P,C P
M,# P,# P,# P,#1!,#(P,# P,# P,# P,# Y,C P,# P,# U,# P,# P-S0V
M-3<X-S0S04,R,# P,# P,#$P,# P,# Y,C P,# P,#!#,# P,# P-#8V.39#
M-S0V-3<R,C V.3<T,D4R13)%-C P,# P,# R,C R,# P,# P,# P,# P-$$P
M,C P,# P,# P,# P,#DR,# P,# P,#@P,# P,# V1#8U-D4W-30R-C$W,C-!
M0S(P,# P,# P,3 P,# P,# P,# P,# P-C P,# P,# U,C S,# P,# P,# P
M,# P-S(P,S P,# R0S P,# P,#)#,# P,# P,# P,# P,# P,# P,# P,$9&
M1D9&1D9&1D9&1D9&1D9&1D9&1D9&1D9&1D9&1D9&,#4P,# P,# P-3 P,# P
M,$1#,# P,# P,S8P,3 P,#!$03 Q,# P,# P,# P,# P1C P,3 P,#!#,C P
M,# P,# R,# P,# P0S P,S P,# Q,# Q,# P,$(P,#,P,# P,# P,# P,# Q
M-3 P,# P,#0V,#4P-# P,#,P,# P,# T.38S-D8V13 P,# P,# P,# P,# P
M,# Q,# P,# P,#!%,#(Q,3 P-3,U-#0R-3,V.39%-C<V0S8U-S0V1C9%-3 W
M,C9&-S@W.3 P,# P,# P-$4P,C!$,# P,3 P,# P,#4S-30T,C0S-D,V,3<S
M-S,U,#<R-D8W.#<Y,# P,# P,# S-C P,#8P,#4S-S0W,C8Y-D4V-S W,# P
M,# P-#0V1C9#-S V.#8Y-D4Q,C Q,# P,#$X,# P,# P-#DV1#8Q-C<V-34R
M-C4V0S8Q-S0V.3<V-C4T-C8Y-D,V-31#-D8V,S8Q-S0V1C<R,$4P,3!%,# U
M,S4T-#(U,S<Y-D0V,C9&-D,U,#<R-D8W.#<Y,# P,# P,# Q,C Q,# P,# W
M,# P,# P-C,W-3<R-S(V-39%-S0Q,C Q,# P,#!$,# P,# P-3,V.#8U-D,V
M0S4V-CDV-3<W,D4V.38S-D8P13 R,48P,#4S-30T,C0U-S@W-#8U-S(V138Q
M-D,U,C8U-S,V1C<U-S(V,S8U-$,V.38R-S(V,3<R-SDU,#<R-D8W.#<Y,# P
M,# P,# Q,C Q,# P,#$P,# P,# P-C0V1C9#-S V.#8Y-D4V-#<R,S S,#,T
8,D4V-#9#-D,P,# P,# P,"<I*2$-"@T*
`
end


Reply | Threaded
Open this post in threaded view
|

Re: How do I create a List Model for my custom collection class

Ian Bartholomew-5
In reply to this post by Frank Sonnemans-2
Frank,

You need to know when the filteredList is changed so make the model's
method -

applyFilter: aFilter
    filteredList := completeList filter: aFilter.
    self trigger: #filteredListChanged

If there are any other methods that can change the filtered list then they
will have to be altered to either use a common method in your model that
triggers the event or trigger the same event themselves.

-~-~-~ Short detour

One other thing that can catch you out here. The ListPresenter can be a bit
sniffy about updating it's view if it doesn't think it needs to.  If you
change the _contents_ of an collection object rather than changing the
object itself, resorting or removing for instance, then the ListPresenter
probably won't update.

a := #(1 2 3 4 5) asOrderedCollection.
lp := ListPresenter show.
lp list: a.
a remove: 1.
lp list: a

The Presenter will still show 1,2,3,4,5 as the Model (see ListModel>>list)
doesn't think the list has changed *even though it's contents have*.
Replace the last line above with "lp list: a copy" and all is OK.  The
upshot of this is that if your #filter: method doesn't answer a new
collection instance (which is unlikely in this case but you never know) then
you will have to make the model's accessor do it.

filteredList
   ^filteredList copy

[[Looking again at you post makes me wonder if this might not be the cause
anyway - it depends on how you are currently doing the update.  Before
changing anything else try making your model always answer a *copy* of
filteredList - you never know]]

-~-~-~

You then need to change/add a couple of things in the Presenter -

createSchematicWiring
    [...]
    self model when: #filteredListChanged send: #onFilteredListChanged to:
self

onFilteredListChanged
    self aListPresenter list: self model: filteredList

> instance vars: completeList filteredList (both are instances of
> TargetList which is subclass of OrderedCollection)

Hmmm, I'm not sure about this bit. IMHO subclassing the "Basic" Collection
classes is not usually a good idea - aggregation is normally better.

> I tried several things like manually sending a #listChanged signal or
> subclassing ListModel for my TargetList, but that did not work. What
> is the correct approach.

There are other ways. The most common would be to use a ListModel in your
model to hold the filteredCollection, You can then share that model between
the ListPresenter and your model to get automatic updating. This technique
can lead to problems though - if the ListPresenter resorts the list for
example.

You might also be able to subclass ListModel - as Dimitry showed - but you
might run into problems again with the tight coupling between Presenter and
Model.

Ian