diff --git a/manual/fig/test_class.mp b/manual/fig/test_class.mp index 411ab2b..94e1fdc 100644 --- a/manual/fig/test_class.mp +++ b/manual/fig/test_class.mp @@ -63,13 +63,13 @@ beginfig(5); save P, Q; Class.P("AAA")()(); - Class_stereotypes.P("<>","<>", "<>"); + Class_stereotypes.P("ooo", "home", "interface"); Class_setDebugMode.P; P.nw=(0,0); Class_draw.P; Class.Q("AAA")()(); - Class_stereotypes.Q("<>","<>", "<>"); + Class_stereotypes.Q("ooo", "home", "interface"); Q.nw=P.ne + (20,0); Class_draw.Q; endfig; diff --git a/manual/fig/test_class_feature_types.mp b/manual/fig/test_class_feature_types.mp new file mode 100644 index 0000000..663d7a6 --- /dev/null +++ b/manual/fig/test_class_feature_types.mp @@ -0,0 +1,34 @@ +% Copyright 2015 Ovidiu Gheorghies +% Licensed under the Apache License, Version 2.0. + +input metauml; + +beginfig(1); + if not metauml_private_isAbstract(abstract "foo"): + 1 = 2; + fi; + + if metauml_private_isAbstract("@abstracp"): + 1 = 2; + fi; +endfig; + +beginfig(2); + if not metauml_private_isStatic(static "bar"): + 1 = 2; + fi; + + if metauml_private_isStatic("@statique"): + 1 = 2; + fi; +endfig; + +beginfig(3); + Class.A("A") + ("+a:int+", static "+b:int") + ("+f+():int", static "+g+():int", abstract "+h():int"); + Class_setDebugMode.A; + drawObjects(A); +endfig; + +end diff --git a/manual/fig/test_picture.mp b/manual/fig/test_picture.mp index dba6a1c..7a56236 100644 --- a/manual/fig/test_picture.mp +++ b/manual/fig/test_picture.mp @@ -88,8 +88,6 @@ beginfig(3); A0.nw=(50,0); drawboxed(A0,A1,A2,A3,A4); - show A[1].nw; - myy := 10; bboxmargin := 0; @@ -102,9 +100,6 @@ beginfig(3); draw bbox(x) shifted p; draw x shifted p; - show "LLCORNER P"; - show llcorner x; - pair q; q := (70,myy); dotlabel.lrt(".", q); @@ -121,9 +116,6 @@ beginfig(3); draw bbox(y) shifted qq; draw y shifted qq; - show "LLCORNER q"; - show llcorner y; - draw (0,myy)--(150, myy) dashed evenly; myyb := 30; @@ -262,4 +254,20 @@ beginfig(10); drawObjects(a, b, c, d, e); endfig; +beginfig(11); + save a, b, c; + Picture.a("goo"); + a.info.textDecoration := "underline"; + + Picture.b("foo()"); + b.info.textDecoration := "underline"; + + Picture.c("x"); + c.info.textDecoration := "underline"; + + topToBottom(5)(a, b, c); + + drawObjects(a, b, c); +endfig; + end diff --git a/manual/fig/test_picture_stack.mp b/manual/fig/test_picture_stack.mp index 817af4a..8ad4776 100644 --- a/manual/fig/test_picture_stack.mp +++ b/manual/fig/test_picture_stack.mp @@ -118,9 +118,9 @@ beginfig(7); PictureStackInfoCopy.stylePictureStack(iStack); - def styleSelector(expr i)= if i mod 2 = 0: stylePA else: stylePB fi enddef; + def styleSupplier(expr i)= if i mod 2 = 0: stylePA else: stylePB fi enddef; - stylePictureStack.itemStyleCallback := "styleSelector"; + stylePictureStack.childStyleSupplier := "styleSupplier"; EPictureStack.stackX(stylePictureStack)("a","b","c","d","e")("vcenter"); diff --git a/manual/test-suite.tex b/manual/test-suite.tex index a6f2271..704794e 100644 --- a/manual/test-suite.tex +++ b/manual/test-suite.tex @@ -1,81 +1,82 @@ -% Part of the MetaUML manual -% Copyright (c) 2005 Ovidiu Gheorghies -% -% Permission is granted to copy, distribute and/or modify this document -% under the terms of the GNU Free Documentation License, Version 1.2 -% or any later version published by the Free Software Foundation; -% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. -% A copy of the license is included in the section entitled "GNU -% Free Documentation License". - -\newcommand{\metaumltest}[2]{Test #2 --- \\ \includegraphics{fig/test_#1.#2} \\ } -\newcommand{\metaumltests}[2]{\multido{\iA=1+1}{#2}{\metaumltest{#1}{\iA}}} - -\section{Test suite} - -\subsection{Low-level} - \metaumltests{lowlevel}{2} - -\subsection{Fonts} - \metaumltests{font}{3} - -\subsection{Util library} - \subsubsection{Picture tests} - \metaumltests{picture}{10} - - \subsubsection{Picture tests - TeX rendering} - \metaumltests{picture_tex_rendering}{1} - - \subsubsection{Group tests} - \metaumltests{group}{2} - - \subsubsection{PictureStack tests} - \metaumltests{picture_stack}{7} - - \subsubsection{Positioning tests} - \metaumltests{positioning}{6} - -\subsection{Class diagram} - \subsubsection{Class tests} - \metaumltests{class}{16} - - \subsubsection{Class template tests} - \metaumltests{class_templates}{3} - - \subsubsection{Qualified Association tests} - \metaumltests{class_qual_assoc}{2} - -\subsection{Package diagram} -\subsubsection{Package tests} - \metaumltests{package}{2} - -\subsection{Component diagram} -\subsubsection{Component tests} - \metaumltests{component}{1} - -\subsection{Paths} - \metaumltests{paths}{3} - -\subsection{Behavioral diagrams} - \subsubsection{Activity tests} - \metaumltests{activity}{2} - - \subsubsection{State Machine tests} - \metaumltests{state}{5} - - \subsubsection{Usecase tests} - \metaumltests{usecase}{9} - -\subsection{Miscelaneous} - \subsubsection{Notes} - \metaumltests{note}{2} - \subsubsection{Objects (Class Instances)} - \metaumltests{instance}{1} - -\subsection{User requests} - Test 1 --- \\ \includegraphics[scale=.2]{fig/test_lars_issues.1} \\ - \metaumltest{lars_issues}{2} - -\subsection{Skins} - \metaumltests{skins}{1} - \metaumltests{skins_global_defaults}{1} +% Part of the MetaUML manual +% Copyright (c) 2005 Ovidiu Gheorghies +% +% Permission is granted to copy, distribute and/or modify this document +% under the terms of the GNU Free Documentation License, Version 1.2 +% or any later version published by the Free Software Foundation; +% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +% A copy of the license is included in the section entitled "GNU +% Free Documentation License". + +\newcommand{\metaumltest}[2]{Test #2 --- \\ \includegraphics{fig/test_#1.#2} \\ } +\newcommand{\metaumltests}[2]{\multido{\iA=1+1}{#2}{\metaumltest{#1}{\iA}}} + +\section{Test suite} + +\subsection{Low-level} + \metaumltests{lowlevel}{2} + +\subsection{Fonts} + \metaumltests{font}{3} + +\subsection{Util library} + \subsubsection{Picture tests} + \metaumltests{picture}{10} + + \subsubsection{Picture tests - TeX rendering} + \metaumltests{picture_tex_rendering}{1} + + \subsubsection{Group tests} + \metaumltests{group}{2} + + \subsubsection{PictureStack tests} + \metaumltests{picture_stack}{7} + + \subsubsection{Positioning tests} + \metaumltests{positioning}{6} + +\subsection{Class diagram} + \subsubsection{Class tests} + \metaumltests{class}{16} + \subsubsection{Class feature types tests} + \metaumltests{class_feature_types}{3} + \subsubsection{Class template tests} + \metaumltests{class_templates}{3} + + \subsubsection{Qualified Association tests} + \metaumltests{class_qual_assoc}{2} + +\subsection{Package diagram} +\subsubsection{Package tests} + \metaumltests{package}{2} + +\subsection{Component diagram} +\subsubsection{Component tests} + \metaumltests{component}{1} + +\subsection{Paths} + \metaumltests{paths}{3} + +\subsection{Behavioral diagrams} + \subsubsection{Activity tests} + \metaumltests{activity}{2} + + \subsubsection{State Machine tests} + \metaumltests{state}{5} + + \subsubsection{Usecase tests} + \metaumltests{usecase}{9} + +\subsection{Miscelaneous} + \subsubsection{Notes} + \metaumltests{note}{2} + \subsubsection{Objects (Class Instances)} + \metaumltests{instance}{1} + +\subsection{User requests} + Test 1 --- \\ \includegraphics[scale=.2]{fig/test_lars_issues.1} \\ + \metaumltest{lars_issues}{2} + +\subsection{Skins} + \metaumltests{skins}{1} + \metaumltests{skins_global_defaults}{1} diff --git a/src/metauml_class.mp b/src/metauml_class.mp index c100e28..a23efc0 100644 --- a/src/metauml_class.mp +++ b/src/metauml_class.mp @@ -31,15 +31,25 @@ visibilityProtected:="#"; visibilityPrivate:="-"; visibilityPackage:="~"; +string metauml_private_abstractMarker, metauml_private_staticMarker; +metauml_private_abstractMarker := "@abstract"; +metauml_private_staticMarker := "@static"; + +def abstract expr methodName= metauml_private_abstractMarker&methodName enddef; +def static expr featureName= metauml_private_staticMarker&featureName enddef; + +def metauml_private_isAbstract(expr name) = (substring (0, 9) of name = metauml_private_abstractMarker) enddef; +def metauml_private_isStatic(expr name) = (substring (0, 7) of name = metauml_private_staticMarker) enddef; +def metauml_private_stripStatic(expr name) = substring (7,infinity) of name enddef; +def metauml_private_stripAbstract(expr name) = substring (9,infinity) of name enddef; + vardef ClassInfo@#= attributes(@#); var(color) foreColor, borderColor; var(string) featureVisibilityMode; FontInfo.@#nameFont(metauml_defaultFont, defaultscale); - - FontInfo.@#attributeFont (metauml_defaultFont, defaultscale); - FontInfo.@#methodFont (metauml_defaultFont, defaultscale); + FontInfo.@#featureFont (metauml_defaultFont, defaultscale); FontInfo.@#stereotypeFont(metauml_defaultFont, .7); ShadeInfo.@#iShade; @@ -50,26 +60,31 @@ vardef ClassInfo@#= @#borderColor := black; PictureInfo.@#iName (2, 2, 1, 3)(@#nameFont); + @#iName.ignoreNegativeBase := 1; PictureInfo.@#iStereotype(2, 2, 2, 2)(@#stereotypeFont); - PictureInfo.@#iAttribute (2, 2, 1.25, 0)(@#attributeFont); - PictureInfo.@#iMethod (2, 2, 1.25, 0)(@#methodFont); + @#iStereotypeStack.iPict.ignoreNegativeBase := 1; PictureStackInfo.@#iStereotypeStack(2, 2, 1, 1)(5.5)(@#iStereotype); - PictureStackInfo.@#iAttributeStack (2, 2, 2.5, 2)(10.5)(@#iAttribute); - PictureStackInfo.@#iMethodStack (2, 2, 2.5, 2)(10.5)(@#iMethod); - - @#iAttributeStack.iPict.bottom := 2; - @#iMethodStack.iPict.bottom := 2; - @#iName.ignoreNegativeBase := 1; - @#iAttributeStack.iPict.ignoreNegativeBase := 1; - @#iMethodStack.iPict.ignoreNegativeBase := 1; - @#iStereotypeStack.iPict.ignoreNegativeBase := 1; + PictureInfo.@#iFeature (2, 2, 1.25, 0)(@#featureFont); + + PictureInfoCopy.@#iFeatureAbstract (@#iFeature); + @#iFeatureAbstract.iFont.name := metauml_defaultFontOblique; + + PictureInfoCopy.@#iFeatureStatic (@#iFeature); + @#iFeatureStatic.textDecoration := "underline"; + + PictureStackInfo.@#iFeatureStack (2, 2, 2.5, 2)(10.5)(@#iFeature); + PictureStackInfoCopy.@#iAttributeStack(@#iFeatureStack); + PictureStackInfoCopy.@#iMethodStack(@#iFeatureStack); + + @#iFeatureStack.iPict.bottom := 2; + @#iFeatureStack.iPict.ignoreNegativeBase := 1; + + PictureStackInfoCopy.@#iAttributeVisibilityStack (@#iFeatureStack); + PictureStackInfoCopy.@#iMethodVisibilityStack (@#iFeatureStack); - PictureStackInfoCopy.@#iAttributeVisibilityStack (@#iAttributeStack); - PictureStackInfoCopy.@#iMethodVisibilityStack (@#iMethodStack); - @#iAttributeVisibilityStack.right := 0; @#iMethodVisibilityStack.right := 0; enddef; @@ -83,9 +98,7 @@ vardef ClassInfoCopy@#(text src)= var(string) featureVisibilityMode; FontInfoCopy.@#nameFont(src.nameFont); - - FontInfoCopy.@#attributeFont(src.attributeFont); - FontInfoCopy.@#methodFont(src.methodFont); + FontInfoCopy.@#featureFont(src.featureFont); FontInfoCopy.@#stereotypeFont(src.stereotypeFont); ShadeInfoCopy.@#iShade(src.iShade); @@ -96,10 +109,12 @@ vardef ClassInfoCopy@#(text src)= PictureInfoCopy.@#iName (src.iName); PictureInfoCopy.@#iStereotype(src.iStereotype); - PictureInfoCopy.@#iAttribute (src.iAttribute); - PictureInfoCopy.@#iMethod (src.iMethod); + PictureInfoCopy.@#iFeature (src.iFeature); + PictureInfoCopy.@#iFeatureAbstract (src.iFeatureAbstract); + PictureInfoCopy.@#iFeatureStatic (src.iFeatureStatic); PictureStackInfoCopy.@#iStereotypeStack(src.iStereotypeStack); + PictureStackInfoCopy.@#iFeatureStack (src.iFeatureStack); PictureStackInfoCopy.@#iAttributeStack (src.iAttributeStack); PictureStackInfoCopy.@#iMethodStack (src.iMethodStack); PictureStackInfoCopy.@#iAttributeVisibilityStack (src.iAttributeVisibilityStack); @@ -141,12 +156,16 @@ vardef defClass@#(expr pname) = string @#attributes[]; string @#attributesVisibility[]; + boolean @#attributesIsStatic[]; string @#methods[]; string @#methodsVisibility[]; + boolean @#methodsIsStatic[]; + boolean @#methodsIsAbstract[]; numeric @#nAttrs; numeric @#nMethods; + numeric @#nStereotypes; @#nStereotypes := 0; @#nAttrs := 0; @@ -155,20 +174,29 @@ enddef; vardef addAttribute@#(expr pcontent) = string visibility; - visibility := substring(0,1) of pcontent; + string attribute; + + attribute := pcontent; + + @#attributesIsStatic[@#nAttrs] := metauml_private_isStatic(attribute); + if @#attributesIsStatic[@#nAttrs]: + attribute := metauml_private_stripStatic(attribute); + fi + + visibility := substring(0,1) of attribute; if (not (visibility = visibilityPublic)) and (not (visibility = visibilityPrivate)) and (not (visibility = visibilityProtected)) and (not (visibility = visibilityPackage)): - @#.attributes[@#.nAttrs] := pcontent; + @#.attributes[@#.nAttrs] := attribute; @#.attributesVisibility[@#.nAttrs] := visibilityPackage; else: save from; from := 1; - if (substring(1,2) of pcontent) = " ": from := 2; fi; + if (substring(1,2) of attribute) = " ": from := 2; fi; - @#.attributes[@#.nAttrs] := substring(from, infinity) of pcontent; + @#.attributes[@#.nAttrs] := substring(from, infinity) of attribute; @#.attributesVisibility[@#.nAttrs] := visibility; fi; @@ -177,20 +205,34 @@ enddef; vardef addMethod@#(expr pcontent) = string visibility; - visibility := substring(0,1) of pcontent; + string method; + + method := pcontent; + + @#methodsIsStatic[@#nMethods] := metauml_private_isStatic(method); + if @#methodsIsStatic[@#nMethods]: + method := metauml_private_stripStatic(method); + fi + + @#methodsIsAbstract[@#nMethods] := metauml_private_isAbstract(method); + if @#methodsIsAbstract[@#nMethods]: + method := metauml_private_stripAbstract(method); + fi + + visibility := substring(0,1) of method; if (not (visibility = visibilityPublic)) and (not (visibility = visibilityPrivate)) and (not (visibility = visibilityProtected)) and (not (visibility = visibilityPackage)): - @#.methods[@#.nMethods] := pcontent; + @#.methods[@#.nMethods] := method; @#.methodsVisibility[@#.nMethods] := visibilityPackage; else: save from; from := 1; - if (substring(1,2) of pcontent) = " ": from := 2; fi; + if (substring(1,2) of method) = " ": from := 2; fi; - @#.methods[@#.nMethods] := substring(from, infinity) of pcontent; + @#.methods[@#.nMethods] := substring(from, infinity) of method; @#.methodsVisibility[@#.nMethods] := visibility; fi; @@ -198,11 +240,12 @@ vardef addMethod@#(expr pcontent) = enddef; vardef classStereotype@#(expr pcontent) = - @#stereotypes[@#nStereotypes] := pcontent; - @#nStereotypes := @#nStereotypes + 1; + show "Macro classStereotype is deprecated, use Class_stereotypes instead."; + Class_stereotypes.@#(pcontent); enddef; vardef classStereotypes@#(text stereotypes)= + show "Macro classStereotypes is deprecated, use Class_stereotypes instead."; Class_stereotypes.@#(stereotypes); enddef; @@ -275,6 +318,14 @@ vardef Class_layout@# = % Define attributes + def metauml_private_attributeStyleSupplier(expr i)= + if @#attributesIsStatic[i]: @#info.iFeatureStatic + else: @#info.iFeature + fi + enddef; + + @#info.iAttributeStack.childStyleSupplier := "metauml_private_attributeStyleSupplier"; + EPictureStack.@#attributeStack(@#info.iAttributeStack) (scantokens listArray(@#attributes)(@#nAttrs))("vleftbase"); @@ -296,6 +347,15 @@ vardef Class_layout@# = % Define methods + def metauml_private_methodStyleSupplier(expr i)= + if @#methodsIsStatic[i]: @#info.iFeatureStatic + elseif @#methodsIsAbstract[i]: @#info.iFeatureAbstract + else: @#info.iFeature + fi + enddef; + + @#info.iMethodStack.childStyleSupplier := "metauml_private_methodStyleSupplier"; + EPictureStack.@#methodStack(@#info.iMethodStack) (scantokens listArray(@#methods)(@#nMethods))("vleftbase"); @@ -371,16 +431,22 @@ vardef Class_paintSkin@# = enddef; vardef Class_draw@#= - log "draw class begin..."; + log "Class_draw begin " & @#; Class_layout.@#; objectEnsurePositioning.@#; Class_paintSkin.@#; drawObjects(@#all); + log "Class_draw end " & @#; enddef; vardef Class_setDebugMode@#= @#.info.iName.boxed := 1; + + @#.info.iFeature.boxed := 1; + @#.info.iFeatureStatic.boxed := 1; + @#.info.iFeatureAbstract.boxed := 1; + @#.info.iStereotypeStack.boxed := 1; @#.info.iStereotypeStack.iPict.boxed := 1; @#.info.iAttributeStack.boxed := 1; @@ -394,8 +460,9 @@ vardef Class_setDebugMode@#= @#.info.iMethodVisibilityStack.iPict.boxed := 1; enddef; -vardef Class_stereotypes@#(text stereotypes)= - for stereotype = stereotypes: - classStereotype@#(stereotype); +vardef Class_stereotypes@#(text _stereotypes)= + for stereotype = _stereotypes: + @#stereotypes[@#nStereotypes] := stereotype; + @#nStereotypes := @#nStereotypes + 1; endfor; enddef; diff --git a/src/util_picture.mp b/src/util_picture.mp index 1af6387..85ce68f 100644 --- a/src/util_picture.mp +++ b/src/util_picture.mp @@ -77,13 +77,15 @@ vardef PictureInfo@#(expr pleft, pright, ptop, pbottom)(text pfont)= %% var(numeric) fixedWidth, fixedHeight; - %% Controls how the contents of the picture is to be alligned relatively - %% to the picture margins. Can be one of "left", "centered", defaults to + %% Controls how the contents of the picture is to be aligned relatively + %% to the picture margins. Can be one of "left", "centered", and defaults to %% "left". The "centered" setting is useful for Picture-s whose fixedWidth %% is set to a given value. %% var(string) halign, valign; - + + var(string) textDecoration; + @#boxed := 0; @#borderColor := blue; @@ -94,7 +96,9 @@ vardef PictureInfo@#(expr pleft, pright, ptop, pbottom)(text pfont)= @#halign := "left"; @#valign := "bottom"; - + + @#textDecoration := "none"; + Margins.@#(pleft, pright, ptop, pbottom); FontInfoCopy.@#iFont(pfont); @@ -106,7 +110,8 @@ vardef PictureInfoCopy@#(text src)= @#boxed := src.boxed; @#borderColor := src.borderColor; @#ignoreNegativeBase := src.ignoreNegativeBase; - + @#textDecoration := src.textDecoration; + @#fixedWidth := src.fixedWidth; @#fixedHeight := src.fixedHeight; @@ -212,7 +217,7 @@ vardef Picture_layout@# = elseif @#info.halign = "center": xdelta__ := (@#width-pictWidth(@#pict))/2; else: - 2 = 3; % throw exception illegal value for @#info.hallign + 2 = 3; % throw exception illegal value for @#info.halign fi; if @#info.valign = "bottom": @@ -220,7 +225,7 @@ vardef Picture_layout@# = elseif @#info.valign = "center": ydelta__ := (@#height-pictHeight(@#pict))/2 - @#negativeBase + negativeBaseAdjustement__; else: - 2 = 3; % throw exception illegal value for @#info.vallign + 2 = 3; % throw exception illegal value for @#info.valign fi; @#contentShift = @#sw + (xdelta__, ydelta__); @@ -236,6 +241,15 @@ vardef Picture_draw@# = draw @#pict shifted @#contentShift; + if (@#info.textDecoration = "underline"): + save ydelta, height; + height := pictHeight(@#pict) - @#negativeBase; + + ydelta := @#info.bottom - @#negativeBase - 0.8; + + draw @#sw + (@#info.left, ydelta) -- @#se + (-@#info.right, ydelta) withcolor black withpen pencircle scaled 0.2bp; + fi; + if (@#info.boxed = 1): draw objectBox(@#) withcolor @#info.borderColor; fi; diff --git a/src/util_picture_stack.mp b/src/util_picture_stack.mp index 393241c..edade32 100644 --- a/src/util_picture_stack.mp +++ b/src/util_picture_stack.mp @@ -30,12 +30,15 @@ inputonce util_log; % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -vardef PictureStackInfo@#(expr marginLeft, marginRight, marginTop, marginBottom)(text _spacing)(text _pictInfo)= +%% Style for a stack of child pictures with the given margins, spacing between children, and a common child style. +%% If child style supplier @#childStyleSupplier is set, it takes precedence over the common child style. +%% The child style supplier must be the name of a macro taking a child index as an argument and returning a child style. +vardef PictureStackInfo@#(expr marginLeft, marginRight, marginTop, marginBottom)(text _spacing)(text _childStyle)= attributes(@#); var(numeric) boxed; var(color) borderColor; var(numeric) spacing; - var(string) itemStyleCallback; + var(string) childStyleSupplier; Margins@#(marginLeft, marginRight, marginTop, marginBottom); @@ -44,20 +47,19 @@ vardef PictureStackInfo@#(expr marginLeft, marginRight, marginTop, marginBottom) @#boxed := 0; @#borderColor := green; - @#itemStyleCallback := ""; + @#childStyleSupplier := ""; - PictureInfoCopy.@#iPict(_pictInfo); + PictureInfoCopy.@#iPict(_childStyle); enddef; vardef PictureStackInfoCopy@#(text src)= PictureStackInfo@#(src.left, src.right, src.top, src.bottom)(src.spacing)(src.iPict); - @#itemStyleCallback := src.itemStyleCallback; + @#childStyleSupplier := src.childStyleSupplier; @#boxed := src.boxed; @#borderColor := src.borderColor; enddef; -log "*** Creating iStack..."; PictureStackInfo.iStack(2, 2, 2, 2)(2)(iPict); vardef EPictureStack@#(text pictStackInfo)(text thePictures)(text how)= @@ -79,12 +81,10 @@ vardef EPictureStack@#(text pictStackInfo)(text thePictures)(text how)= @#joinMethod := l; endfor; - show "@#info.itemStyleCallback", @#info.itemStyleCallback; - @#nItems := 0; for p=thePictures: - if (@#info.itemStyleCallback <> ""): - EPicture.@#pict[@#nItems](scantokens (@#info.itemStyleCallback)(@#nItems))(p); + if (@#info.childStyleSupplier <> ""): + EPicture.@#pict[@#nItems](scantokens (@#info.childStyleSupplier)(@#nItems))(p); else: EPicture.@#pict[@#nItems](@#info.iPict)(p); fi;