ECOBL ;BP/CMF - List object
;;2.0;EVENT CAPTURE;**100**;8 May 96;Build 21
;@author - Chris Flegel
;@date - 17 May 2009
;@version - 1.0
;;
Q
;;private methods
ADD(RESULT,HANDLE,VALUE) ; add simple list item
N ITEM,X
D PARSE("Handle",HANDLE)
D GET(.ITEM,HANDLE,"Pu","Count")
S ITEM=ITEM+1
S @HANDLE@("Pr","list",ITEM)=VALUE
D METHOD(.X,HANDLE_".Criteria.SetLastItem."_ITEM)
D METHOD(.X,HANDLE_".Criteria.SetLastValue."_VALUE)
D SET(.X,HANDLE,"Pu","Count",ITEM)
D METHOD(.X,HANDLE_".Criteria.Index."_ITEM)
S RESULT=ITEM
Q
;;
CLEAR(RESULT,HANDLE,PARAMS) ; restore to default state
D METHOD(.RESULT,HANDLE_".Criteria.Clear")
K @HANDLE@("Pr","list")
D SET(.RESULT,HANDLE,"Pu","Count",0)
Q
;;
COLLECT(RESULT,HANDLE,CHILD) ; add a child object to the list
N ITEM
D PARSE("Handle",HANDLE)
D ADD(.ITEM,HANDLE,CHILD)
S @HANDLE@("Pr","list","Handle",CHILD)=ITEM
S RESULT=ITEM
Q
;;
FIRST(RESULT,HANDLE,PARAMS) ;
D METHOD(.RESULT,HANDLE_".Criteria.First")
Q
;;
FIND(RESULT,HANDLE,PARAMS) ;
D METHOD(.RESULT,HANDLE_".Criteria.Find."_PARAMS)
Q
;;
FIND1(RESULT,HANDLE,PARAMS) ;
D METHOD(.RESULT,HANDLE_".Criteria.Find1."_PARAMS)
Q
;;
;;
GET(RESULT,HANDLE,SCOPE,PROPERTY) ;
; if unique get methods, call them first, else call parent
D GET^ECOB(.RESULT,HANDLE,SCOPE,PROPERTY)
Q
;;
GETITEM(RESULT,HANDLE,ITEM) ; get simple list item
N NAME,COUNT
D PARSE("Handle",HANDLE)
S RESULT=$G(@HANDLE@("Pr","list",ITEM))
Q
;;
INFO(RESULT,HANDLE,PARAMS) ;
N NAME,COUNT,ITEMS,I,OUT,JUSTIFY,OFFSET
D PARSE("Offset",PARAMS)
D METHOD(.ITEMS,HANDLE_".ShowCount."_JUSTIFY)
D METHOD(.OUT,HANDLE_".First")
F Q:+OUT=-1 D
.W !,$J(OUT,OFFSET)
.D METHOD(.OUT,HANDLE_".Next")
.Q
Q
;;
ISHANDLE(HANDLE,VALUE) ; is value a collected handle
Q:(HANDLE="")!(VALUE="") 0
Q $D(@HANDLE@("Pr","list","Handle",VALUE))
;
LAST(RESULT,HANDLE,PARAMS) ; get the last referenced item from the list
D METHOD(.RESULT,HANDLE_".Criteria.Last")
Q
;;
NEXT(RESULT,HANDLE,PARAMS) ; get the next item from the list
D METHOD(.RESULT,HANDLE_".Criteria.Next")
Q
;;
SET(RESULT,HANDLE,SCOPE,PROPERTY,VALUE) ;
; if unique set methods, call them first, else call parent
D SET^ECOB(.RESULT,HANDLE,SCOPE,PROPERTY,VALUE)
Q
;;
SETITEM(RESULT,HANDLE,ITEM,VALUE) ; set simple list item
N NAME,COUNT,X
D PARSE("Handle",HANDLE)
I '$D(@HANDLE@("Pr","list",ITEM)) D Q
.S RESULT="-1^Item "_ITEM_" does not exist"
S @HANDLE@("Pr","list",ITEM)=VALUE
D SET(.RESULT,HANDLE,"Pr","last",ITEM)
D METHOD(.X,HANDLE_".Criteria.Index."_ITEM)
Q
;;
SHOW(RESULT,HANDLE,SCOPE,PROPERTY,JUSTIFY) ; parent method
D SHOW^ECOB(.RESULT,HANDLE,SCOPE,PROPERTY,JUSTIFY)
Q
;;
PARSE(PARSE,VALUE) ;
I PARSE="Child" D Q
.S CHILD=$P(VALUE,"Handle.",2)
.Q
I PARSE="Count" D Q
.S COUNT=$P(VALUE,".",2)
.Q
I PARSE="Get" D Q
.S PROPERTY=$P(VALUE,".",3)
.S PROPERTY=$P(VALUE,"Get",2)
.Q
I PARSE="Handle" D Q
.S HANDLE=$P(VALUE,".")
.Q
I PARSE="Justify" D Q
.S JUSTIFY=$S(+VALUE:+VALUE,1:0)
.Q
I PARSE="Method" D Q
.S METHOD=$P(VALUE,".",2)
.Q
I PARSE="Offset" D Q
.S JUSTIFY=$S(+VALUE:+VALUE,1:0)
.S OFFSET=JUSTIFY+5
.Q
I PARSE="Params" D Q
.S PARAMS=$P(VALUE,".",3,99)
.Q
I PARSE="Set" D Q
.S PROPERTY=$P(VALUE,".",3)
.S PROPERTY=$P(PROPERTY,"Set",2)
.Q
I PARSE="SetItem" D Q
.S SETITEM=+$P(VALUE,".")
.S SETVALUE=$P(VALUE,".",2)
.Q
I PARSE="SetValue" D Q
.S SETVALUE=$P(VALUE,".",4)
.Q
Q
;;
PROPERTY(HANDLE,SCOPE,PROPERTY,VALUE) ; parent method
D PROPERTY^ECOB(HANDLE,SCOPE,PROPERTY,VALUE)
Q
;;
ECOBC(RESULT,HANDLE,PROPERTY,ARGUMENT) ; handler for Criteria
N CHILD
D GET(.CHILD,HANDLE,"Pr",PROPERTY)
D METHOD^ECOBC(.RESULT,CHILD_"."_ARGUMENT)
Q
;;
;; public methods
CREATE(NAME) ;
; call parent first
N HANDLE,CHILD,COUNT,X
S HANDLE=$$CREATE^ECOB(NAME)
D PROPERTY(HANDLE,"Pu","Count",0)
D PROPERTY(HANDLE,"Pr","list",0)
D PROPERTY(HANDLE,"Pr","last","")
D SELF^ECOB(.X,HANDLE,"EC LIST","Basic list","METHOD^ECOBL(.RESULT,ARGUMENT)","ECOB2")
; complex properties last
S CHILD=$$CREATE^ECOBC(NAME)
D COLLECT^ECOB(HANDLE,CHILD,"Pr","Criteria")
D SET^ECOB(.X,CHILD,"Pr","_collector",HANDLE)
;
Q HANDLE
;;
DESTROY(HANDLE) ;
; call parent last
N CHILD
D GET(.CHILD,HANDLE,"Pr","Criteria")
D DESTROY^ECOBC(CHILD)
Q $$DESTROY^ECOB2(HANDLE)
;;
METHOD(RESULT,ARGUMENT) ;
; argument= handle.method.(additional.params...)
N HANDLE,METHOD,PARAMS
D PARSE("Handle",ARGUMENT)
D PARSE("Method",ARGUMENT)
D PARSE("Params",ARGUMENT)
I METHOD="Add" D ADD(.RESULT,HANDLE,PARAMS) Q
I METHOD="Clear" D CLEAR(.RESULT,HANDLE,PARAMS) Q
I METHOD="Criteria" D ECOBC(.RESULT,HANDLE,METHOD,PARAMS) Q
I METHOD="Collect" D COLLECT(.RESULT,HANDLE,PARAMS) Q
I METHOD="Find" D FIND(.RESULT,HANDLE,PARAMS) Q
I METHOD="Find1" D FIND1(.RESULT,HANDLE,PARAMS) Q
I METHOD="First" D FIRST(.RESULT,HANDLE,PARAMS) Q
I METHOD="GetItem" D GETITEM(.RESULT,HANDLE,PARAMS) Q
I METHOD="Info" D INFO(.RESULT,HANDLE,PARAMS) Q
I METHOD="IsHandle" S RESULT=$$ISHANDLE(HANDLE,PARAMS) Q
I METHOD="Last" D LAST(.RESULT,HANDLE,PARAMS) Q
I METHOD="Next" D NEXT(.RESULT,HANDLE,PARAMS) Q
; development methods last
I METHOD="SetItem" D Q
.N SETITEM,SETVALUE
.D PARSE("SetItem",PARAMS)
.D SETITEM(.RESULT,HANDLE,SETITEM,SETVALUE)
.Q
D METHOD^ECOB2(.RESULT,ARGUMENT)
Q
;;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HECOBL 5503 printed Oct 16, 2024@17:58:48 Page 2
ECOBL ;BP/CMF - List object
+1 ;;2.0;EVENT CAPTURE;**100**;8 May 96;Build 21
+2 ;@author - Chris Flegel
+3 ;@date - 17 May 2009
+4 ;@version - 1.0
+5 ;;
+6 QUIT
+7 ;;private methods
ADD(RESULT,HANDLE,VALUE) ; add simple list item
+1 NEW ITEM,X
+2 DO PARSE("Handle",HANDLE)
+3 DO GET(.ITEM,HANDLE,"Pu","Count")
+4 SET ITEM=ITEM+1
+5 SET @HANDLE@("Pr","list",ITEM)=VALUE
+6 DO METHOD(.X,HANDLE_".Criteria.SetLastItem."_ITEM)
+7 DO METHOD(.X,HANDLE_".Criteria.SetLastValue."_VALUE)
+8 DO SET(.X,HANDLE,"Pu","Count",ITEM)
+9 DO METHOD(.X,HANDLE_".Criteria.Index."_ITEM)
+10 SET RESULT=ITEM
+11 QUIT
+12 ;;
CLEAR(RESULT,HANDLE,PARAMS) ; restore to default state
+1 DO METHOD(.RESULT,HANDLE_".Criteria.Clear")
+2 KILL @HANDLE@("Pr","list")
+3 DO SET(.RESULT,HANDLE,"Pu","Count",0)
+4 QUIT
+5 ;;
COLLECT(RESULT,HANDLE,CHILD) ; add a child object to the list
+1 NEW ITEM
+2 DO PARSE("Handle",HANDLE)
+3 DO ADD(.ITEM,HANDLE,CHILD)
+4 SET @HANDLE@("Pr","list","Handle",CHILD)=ITEM
+5 SET RESULT=ITEM
+6 QUIT
+7 ;;
FIRST(RESULT,HANDLE,PARAMS) ;
+1 DO METHOD(.RESULT,HANDLE_".Criteria.First")
+2 QUIT
+3 ;;
FIND(RESULT,HANDLE,PARAMS) ;
+1 DO METHOD(.RESULT,HANDLE_".Criteria.Find."_PARAMS)
+2 QUIT
+3 ;;
FIND1(RESULT,HANDLE,PARAMS) ;
+1 DO METHOD(.RESULT,HANDLE_".Criteria.Find1."_PARAMS)
+2 QUIT
+3 ;;
+4 ;;
GET(RESULT,HANDLE,SCOPE,PROPERTY) ;
+1 ; if unique get methods, call them first, else call parent
+2 DO GET^ECOB(.RESULT,HANDLE,SCOPE,PROPERTY)
+3 QUIT
+4 ;;
GETITEM(RESULT,HANDLE,ITEM) ; get simple list item
+1 NEW NAME,COUNT
+2 DO PARSE("Handle",HANDLE)
+3 SET RESULT=$GET(@HANDLE@("Pr","list",ITEM))
+4 QUIT
+5 ;;
INFO(RESULT,HANDLE,PARAMS) ;
+1 NEW NAME,COUNT,ITEMS,I,OUT,JUSTIFY,OFFSET
+2 DO PARSE("Offset",PARAMS)
+3 DO METHOD(.ITEMS,HANDLE_".ShowCount."_JUSTIFY)
+4 DO METHOD(.OUT,HANDLE_".First")
+5 FOR
if +OUT=-1
QUIT
Begin DoDot:1
+6 WRITE !,$JUSTIFY(OUT,OFFSET)
+7 DO METHOD(.OUT,HANDLE_".Next")
+8 QUIT
End DoDot:1
+9 QUIT
+10 ;;
ISHANDLE(HANDLE,VALUE) ; is value a collected handle
+1 if (HANDLE="")!(VALUE="")
QUIT 0
+2 QUIT $DATA(@HANDLE@("Pr","list","Handle",VALUE))
+3 ;
LAST(RESULT,HANDLE,PARAMS) ; get the last referenced item from the list
+1 DO METHOD(.RESULT,HANDLE_".Criteria.Last")
+2 QUIT
+3 ;;
NEXT(RESULT,HANDLE,PARAMS) ; get the next item from the list
+1 DO METHOD(.RESULT,HANDLE_".Criteria.Next")
+2 QUIT
+3 ;;
SET(RESULT,HANDLE,SCOPE,PROPERTY,VALUE) ;
+1 ; if unique set methods, call them first, else call parent
+2 DO SET^ECOB(.RESULT,HANDLE,SCOPE,PROPERTY,VALUE)
+3 QUIT
+4 ;;
SETITEM(RESULT,HANDLE,ITEM,VALUE) ; set simple list item
+1 NEW NAME,COUNT,X
+2 DO PARSE("Handle",HANDLE)
+3 IF '$DATA(@HANDLE@("Pr","list",ITEM))
Begin DoDot:1
+4 SET RESULT="-1^Item "_ITEM_" does not exist"
End DoDot:1
QUIT
+5 SET @HANDLE@("Pr","list",ITEM)=VALUE
+6 DO SET(.RESULT,HANDLE,"Pr","last",ITEM)
+7 DO METHOD(.X,HANDLE_".Criteria.Index."_ITEM)
+8 QUIT
+9 ;;
SHOW(RESULT,HANDLE,SCOPE,PROPERTY,JUSTIFY) ; parent method
+1 DO SHOW^ECOB(.RESULT,HANDLE,SCOPE,PROPERTY,JUSTIFY)
+2 QUIT
+3 ;;
PARSE(PARSE,VALUE) ;
+1 IF PARSE="Child"
Begin DoDot:1
+2 SET CHILD=$PIECE(VALUE,"Handle.",2)
+3 QUIT
End DoDot:1
QUIT
+4 IF PARSE="Count"
Begin DoDot:1
+5 SET COUNT=$PIECE(VALUE,".",2)
+6 QUIT
End DoDot:1
QUIT
+7 IF PARSE="Get"
Begin DoDot:1
+8 SET PROPERTY=$PIECE(VALUE,".",3)
+9 SET PROPERTY=$PIECE(VALUE,"Get",2)
+10 QUIT
End DoDot:1
QUIT
+11 IF PARSE="Handle"
Begin DoDot:1
+12 SET HANDLE=$PIECE(VALUE,".")
+13 QUIT
End DoDot:1
QUIT
+14 IF PARSE="Justify"
Begin DoDot:1
+15 SET JUSTIFY=$SELECT(+VALUE:+VALUE,1:0)
+16 QUIT
End DoDot:1
QUIT
+17 IF PARSE="Method"
Begin DoDot:1
+18 SET METHOD=$PIECE(VALUE,".",2)
+19 QUIT
End DoDot:1
QUIT
+20 IF PARSE="Offset"
Begin DoDot:1
+21 SET JUSTIFY=$SELECT(+VALUE:+VALUE,1:0)
+22 SET OFFSET=JUSTIFY+5
+23 QUIT
End DoDot:1
QUIT
+24 IF PARSE="Params"
Begin DoDot:1
+25 SET PARAMS=$PIECE(VALUE,".",3,99)
+26 QUIT
End DoDot:1
QUIT
+27 IF PARSE="Set"
Begin DoDot:1
+28 SET PROPERTY=$PIECE(VALUE,".",3)
+29 SET PROPERTY=$PIECE(PROPERTY,"Set",2)
+30 QUIT
End DoDot:1
QUIT
+31 IF PARSE="SetItem"
Begin DoDot:1
+32 SET SETITEM=+$PIECE(VALUE,".")
+33 SET SETVALUE=$PIECE(VALUE,".",2)
+34 QUIT
End DoDot:1
QUIT
+35 IF PARSE="SetValue"
Begin DoDot:1
+36 SET SETVALUE=$PIECE(VALUE,".",4)
+37 QUIT
End DoDot:1
QUIT
+38 QUIT
+39 ;;
PROPERTY(HANDLE,SCOPE,PROPERTY,VALUE) ; parent method
+1 DO PROPERTY^ECOB(HANDLE,SCOPE,PROPERTY,VALUE)
+2 QUIT
+3 ;;
ECOBC(RESULT,HANDLE,PROPERTY,ARGUMENT) ; handler for Criteria
+1 NEW CHILD
+2 DO GET(.CHILD,HANDLE,"Pr",PROPERTY)
+3 DO METHOD^ECOBC(.RESULT,CHILD_"."_ARGUMENT)
+4 QUIT
+5 ;;
+6 ;; public methods
CREATE(NAME) ;
+1 ; call parent first
+2 NEW HANDLE,CHILD,COUNT,X
+3 SET HANDLE=$$CREATE^ECOB(NAME)
+4 DO PROPERTY(HANDLE,"Pu","Count",0)
+5 DO PROPERTY(HANDLE,"Pr","list",0)
+6 DO PROPERTY(HANDLE,"Pr","last","")
+7 DO SELF^ECOB(.X,HANDLE,"EC LIST","Basic list","METHOD^ECOBL(.RESULT,ARGUMENT)","ECOB2")
+8 ; complex properties last
+9 SET CHILD=$$CREATE^ECOBC(NAME)
+10 DO COLLECT^ECOB(HANDLE,CHILD,"Pr","Criteria")
+11 DO SET^ECOB(.X,CHILD,"Pr","_collector",HANDLE)
+12 ;
+13 QUIT HANDLE
+14 ;;
DESTROY(HANDLE) ;
+1 ; call parent last
+2 NEW CHILD
+3 DO GET(.CHILD,HANDLE,"Pr","Criteria")
+4 DO DESTROY^ECOBC(CHILD)
+5 QUIT $$DESTROY^ECOB2(HANDLE)
+6 ;;
METHOD(RESULT,ARGUMENT) ;
+1 ; argument= handle.method.(additional.params...)
+2 NEW HANDLE,METHOD,PARAMS
+3 DO PARSE("Handle",ARGUMENT)
+4 DO PARSE("Method",ARGUMENT)
+5 DO PARSE("Params",ARGUMENT)
+6 IF METHOD="Add"
DO ADD(.RESULT,HANDLE,PARAMS)
QUIT
+7 IF METHOD="Clear"
DO CLEAR(.RESULT,HANDLE,PARAMS)
QUIT
+8 IF METHOD="Criteria"
DO ECOBC(.RESULT,HANDLE,METHOD,PARAMS)
QUIT
+9 IF METHOD="Collect"
DO COLLECT(.RESULT,HANDLE,PARAMS)
QUIT
+10 IF METHOD="Find"
DO FIND(.RESULT,HANDLE,PARAMS)
QUIT
+11 IF METHOD="Find1"
DO FIND1(.RESULT,HANDLE,PARAMS)
QUIT
+12 IF METHOD="First"
DO FIRST(.RESULT,HANDLE,PARAMS)
QUIT
+13 IF METHOD="GetItem"
DO GETITEM(.RESULT,HANDLE,PARAMS)
QUIT
+14 IF METHOD="Info"
DO INFO(.RESULT,HANDLE,PARAMS)
QUIT
+15 IF METHOD="IsHandle"
SET RESULT=$$ISHANDLE(HANDLE,PARAMS)
QUIT
+16 IF METHOD="Last"
DO LAST(.RESULT,HANDLE,PARAMS)
QUIT
+17 IF METHOD="Next"
DO NEXT(.RESULT,HANDLE,PARAMS)
QUIT
+18 ; development methods last
+19 IF METHOD="SetItem"
Begin DoDot:1
+20 NEW SETITEM,SETVALUE
+21 DO PARSE("SetItem",PARAMS)
+22 DO SETITEM(.RESULT,HANDLE,SETITEM,SETVALUE)
+23 QUIT
End DoDot:1
QUIT
+24 DO METHOD^ECOB2(.RESULT,ARGUMENT)
+25 QUIT
+26 ;;