%D \module
%D   [      file=s-prent-wobbling,
%D        version=2010.04.28,
%D          title=\CONTEXT\ Style File,
%D       subtitle=Presentation Environment Wobbling,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D This a bit old style and I should adapt it a bit but as it sort of works ok I'll
%D not do that now.

\pushoverloadmode

\startmodule[present-wobbling]

%setuppapersize[S6][S6]
\setuppapersize[SM][SM]

\setupinteraction
  [state=start,
   contrastcolor=white,
   color=white,
   click=no]

\setuplayout
  [location=middle,
   topspace=60pt,
   bottomspace=80pt,
   backspace=80pt,
   header=0pt,
   footer=0pt,
   width=middle,
   height=middle]

\setupcolors
  [textcolor=white]

\setupbodyfont[pagella]

\definecolor[maincolor] [blue]
\definecolor[extracolor][green]

% \definecolor[maincolor] [red]
% \definecolor[extracolor][blue]

\startMPdefinitions
    picture MySoFar ; MySoFar := nullpicture ;
    path MyLastOne ; MyLastOne := origin -- cycle ;
    path MyLeftSteps, MyRightSteps ;
    boolean MyPageDone ; MyPageDone := false ;

    vardef MySmallShape(expr parent) =
        path p ; p := boundingbox parent ;
        numeric w, h ; w := bbwidth(p) ; h := bbheight(p) ;
        urcorner p shifted (-uniformdeviate w/4,0) --
        lrcorner p shifted (0,uniformdeviate h/4) --
        llcorner p shifted (uniformdeviate w/4,0) --
        ulcorner p shifted (0,-uniformdeviate h/4) -- cycle
    enddef ;

    vardef MyShape(expr parent) =
        path p ; p := boundingbox parent ;
        if MyPageDone :
            MyPageDone := false ;
            urcorner p shifted (-EmWidth + -uniformdeviate CutSpace/2,0) --
            lrcorner p shifted (0,EmWidth + uniformdeviate BottomSpace/2) --
            llcorner p shifted (EmWidth + uniformdeviate BackSpace/2,0) --
            ulcorner p shifted (0,-EmWidth + -uniformdeviate TopSpace/2) -- cycle
        else :
            MyPageDone := true ;
            urcorner p shifted (0,-EmWidth + -uniformdeviate TopSpace/2) --
            lrcorner p shifted (-EmWidth + -uniformdeviate CutSpace/2,0) --
            llcorner p shifted (0,EmWidth + uniformdeviate BottomSpace/2) --
            ulcorner p shifted (EmWidth + uniformdeviate BackSpace/2,0) -- cycle
        fi
    enddef ;

    vardef MyMakeOne =
        MyLastOne := MyShape(Page) ;
    enddef ;

    vardef MyAddOne =
        addto MySoFar also image(fill MyLastOne withcolor "maincolor" withtransparency(1,.25) ; ) ;
    enddef ;

    vardef MyDrawOne =
        fill MyLastOne withcolor black ;
        fill MyLastOne withcolor "maincolor" withtransparency(1,.25) ;
    enddef ;

    vardef MyDrawPage =
        draw MySoFar ;
    enddef ;

    vardef MySetSteps =
        path l, r ; numeric s ; path ll[], rr[] ; path t ;
        l := point 2 of MyLastOne -- point 3 of MyLastOne ;
        r := point 0 of MyLastOne -- point 1 of MyLastOne ;
        t := topboundary Field[Text][Text] rightenlarged TextWidth leftenlarged TextWidth ;
        s := bbheight(Field[Text][Text])/LineHeight + 2 ;
        t := t shifted (0,-TopSkip) ;
        for i=1 upto s :
            ll[i] := t intersectionpoint l ;
            rr[i] := t intersectionpoint r ;
            t := t shifted (0,-LineHeight) ;
        endfor ;
        MyLeftSteps  := for i=1 upto s : ll[i] -- endfor cycle ;
        MyRightSteps := for i=1 upto s : rr[i] -- endfor cycle ;
    enddef ;

    vardef MyDrawText(expr txt) =
        pair a ; a := (point 1 of MyLastOne) - (point 2 of MyLastOne) ;
        picture p ; p := txt ;
        p := p
            shifted (-EmWidth,EmWidth)
            shifted ulcorner txt
            shifted point 1 of MyLastOne ;
        p := p rotatedaround(lrcorner p, radian * tan(ypart a/xpart a)) ;
        setbounds p to origin -- cycle ;
        draw p ;
    enddef ;

    vardef MyDrawTitle(expr txt) =
      % pair a ; a := (point 2 of MyLastOne) - (point 3 of MyLastOne) ;
        pair a ; a := (point 3 of MyLastOne) - (point 4 of MyLastOne) ;
        picture p ;
        if bbheight(txt) > bbwidth(txt) :
            p := txt ysized(0.8*TextHeight) ;
        else :
            p := txt xsized(0.8*TextWidth) ;
        fi ;
        numeric d ; d := arclength(point 2 of MyLastOne -- point 3 of MyLastOne) - bbheight(p) ;
        p := p
            shifted (BackSpace,-d/2)
            shifted -ulcorner p
            shifted point 3 of MyLastOne ;
      % p := p rotatedaround(ulcorner p, - radian * tan(xpart a/ypart a)) ;
      % p := p rotatedaround(ulcorner p,  radian * tan(ypart a/xpart a)) ;
        setbounds p to origin -- cycle ;
        draw p ;
    enddef ;

    vardef MyDrawSteps =
        s := bbheight(Field[Text][Text])/LineHeight + 2 ;
        for i=1 upto s :
            draw ll[i] withpen pencircle scaled 1mm ;
            draw rr[i] withpen pencircle scaled 1mm ;
            draw ll[i] -- rr[i] ;
        endfor ;
        draw Field[Text][Text] ;
    enddef ;

\stopMPdefinitions

\startuseMPgraphic{initialization}
    StartPage ;
        MySoFar := image(fill Page enlarged 12pt withcolor "maincolor" withtransparency(1,.25) ;) ;
        MyMakeOne ;
        MySetSteps ;
    StopPage ;
\stopuseMPgraphic

\appendtoks
    \startnointerference
        \useMPgraphic{initialization}
    \stopnointerference
\to \everystarttext

\unexpanded\def\TitleCommand#1%
  {\framed
     [frame=off,
      offset=overlay,
      align=flushleft,
      foregroundcolor=white,
      foregroundstyle={\tfd},
      bottom=\vskip2\lineheight]
     {\setupinterlinespace
      \setupwhitespace[halfline]%
     %\showstruts
      \begstrut
      #1%
      \endstrut}}

\unexpanded\def\TopicCommand#1%
  {\color[white]{\tfb#1}}

\startuseMPgraphic{page}
    StartPage ;
        MyDrawPage ;
        MyDrawOne ;
        MySetSteps ;
        if RealPageNumber == 1 :
            MyDrawTitle(textext("\TitleCommand{\documentvariable{title}}")) ;
            MyDrawText (textext("\TopicCommand{\documentvariable{topic}}")) ;
        fi ;
        %
        % we have multiple runs when we have text
        %
      % MyDrawSteps ;
      % MyMakeOne ;
      % MySetSteps ;
    StopPage ;
\stopuseMPgraphic

\appendtoks
    \startnointerference
        \startMPcode
            MyAddOne ;
            MyMakeOne ;
            MySetSteps ;
        \stopMPcode
    \stopnointerference
\to \everyshipout

\defineoverlay[page][\useMPgraphic{page}]

\startuseMPgraphic{symbol}
    path p ; p := MySmallShape(unitsquare scaled (.6*LineHeight)) ;
    fill p withcolor white ;
    fill p withcolor "extracolor" withtransparency(1,.25) ;
\stopuseMPgraphic

\definesymbol[mysymbol][\struttedbox{\useMPgraphic{symbol}}]

\setupitemgroup
  [itemize] [1]
  [symbol=mysymbol]

\setupbackgrounds
  [page]
  [background=page]

\startluacode
    local texdimen = tex.dimen
    function document.SetParShape()
        local leftpath  = metapost.getclippath { mpx = "metafun", data = "clip currentpicture to MyLeftSteps ;" }
        local rightpath = metapost.getclippath { mpx = "metafun", data = "clip currentpicture to MyRightSteps ;" }
        local shape = { }
        for i=1,#leftpath do
            local left  = leftpath[i].x_coord
            local right = rightpath[i].x_coord
            local hsize = right - left - (texdimen.backspace + texdimen.cutspace)*number.dimenfactors.bp
            shape[#shape+1] = string.format("%sbp %sbp",left,hsize)
        end
     -- print(table.serialize(shape))
     -- context.parshape(string.format("%s %s ",#shape,table.concat(shape," ")))
        context("\\parshape %s %s ",#shape,table.concat(shape," "))
    end
\stopluacode

\nopenalties \dontcomplain

\setupwhitespace[none]

\startsetups document:start
    \bgroup
    \let\crlf\endgraf % \par in a mp textext doesn't work well
    \startstandardmakeup
        % dummy page
    \stopstandardmakeup
    \egroup
\stopsetups

\unexpanded\def\StartText#1#2% for old times sake
  {\startdocument[title={#1},subtitle={#2}]}

\unexpanded\def\StopText
  {\stopdocument
   \setupdocument[title=,topic=]}

\unexpanded\def\StartItems#1%
  {\setupdocument[topic={#1}]
   \startstandardmakeup[top=,bottom=\vss]
   \startelement[items][title={#1}]%
   \ctxlua{document.SetParShape()}
   \StartSteps}

\unexpanded\def\StopItems
  {\StopSteps
   \stopelement
   \stopstandardmakeup}

\unexpanded\def\StartItem
  {\dontleavehmode
   \startelement[item]%
   \llap{\symbol[mysymbol]\quad}% graphic
   \ignorespaces}

\unexpanded\def\StopItem
  {\removeunwantedspaces
   \nobreak
   \crlf
   \stopelement
   \crlf
   \FlushStep}

\unexpanded\def\ShapeParagraph
  {\ctxlua{document.SetParShape()}}

% no parshape yet

\unexpanded\def\StartParagraphs#1%
  {\setupdocument[topic={#1}]
   \startstandardmakeup[top=,bottom=\vss]
  %\ctxlua{document.SetParShape()}
   \startelement[paragraphs]%
   \StartSteps}

\unexpanded\def\StopParagraphs
  {\StopSteps
   \stopelement
   \stopstandardmakeup}

\unexpanded\def\StartParagraph
  {\startelement[paragraph]}

\unexpanded\def\StopParagraph
  {\par
   \stopelement
   \FlushStep}

% experiment .. likely to change

\setelementexporttag[items]     [nature][display]
\setelementexporttag[item]      [nature][mixed]
\setelementexporttag[paragraphs][nature][display]
\setelementexporttag[paragraph] [nature][mixed]

\stopmodule

\continueifinputfile{s-present-wobbling.mkiv}

\usemodule[present-common]

%inputpresentationfile{bachotex/2010/bachotex-2010-clash.tex}
\inputpresentationfile{bachotex/2010/bachotex-2010-move.tex}
