%%%%%%%%%%%%%%%%%%%% Macros for process diagrams %%%%%%%%%%%%%%%%%%%%%

\newcount\processx
\newcount\processy
\newcount\processv
\newcount\processw

\def\process(#1,#2)#3#4{\sf\processx=#1%
\processy=#2%
\put(\processx,\processy){\makebox(8,8){\shortstack{#4}}}%
\advance\processx 4%
\advance\processy 5%
%\thicklines\put(\processx,\processy){\hspace{-3pt}\oval(8,10)}\thinlines
\thicklines\put(\processx,\processy){\oval(8,10)}\thinlines%
\advance\processx -4%
\advance\processy by 3%
\put(\processx,\processy){\line(1,0){8}}%
\put(\processx,\processy){\makebox(8,2){\sf #3}}}

\def\bigprocess(#1,#2)#3#4{\sf\processx=#1%
\processy=#2%
\put(\processx,\processy){\makebox(22,26){\shortstack{#4}}}%
\advance\processx 11%
\advance\processy 15%
\thicklines\put(\processx,\processy){\oval(22,30)}\thinlines%
\advance\processx -11%
\advance\processy by 11%
\put(\processx,\processy){\line(1,0){22}}%
\put(\processx,\processy){\makebox(22,4){\sf #3}}}

\def\condport(#1,#2){\thinlines\processx=#1
\processy=#2
\put(\processx,\processy){\line(1,0){1.5}\line(0,1){2}}
\advance \processy 2
\put(\processx,\processy){\line(1,0){1.5}}
\advance \processx 1
\advance \processy -2
\put(\processx,\processy){\dashbox(0.5,2){}}
}

\def\manyport(#1,#2){\thinlines\processx=#1
\processy=#2
\put(\processx,\processy){\line(1,0){1.5}\line(0,1){2}}
\advance \processy 2
\put(\processx,\processy){\line(1,0){1.5}}
\advance \processx 1
\put(\processx,\processy){\line(0,-1){2}}
}

\def\andport(#1,#2){\thinlines\processx=#1
\processy=#2
\put(\processx,\processy){\line(1,0){1}\line(0,1){4}}
\advance \processy 4
\put(\processx,\processy){\line(1,0){1}}
}

\def\xorport(#1,#2){\processx=#1
\processy=#2
\put(\processx,\processy){\line(1,0){0.5}\line(1,4){0.5}}
\advance \processy 4
\put(\processx,\processy){\line(1,0){0.5}\line(1,-4){0.5}}
}

\def\orport(#1,#2){\processx=#1
\processy=#2
\processv=#1
\processw=#2
\advance \processy 1
\put(\processx,\processy){\arc{2}{0}{1.57}}
%\put(\processx,\processy){\oval(2,4)[rt]}
\advance \processy 2
\put(\processx,\processy){\arc{2}{4.71}{6.28}}
%\put(\processx,\processy){\oval(2,2)[tr]}
\advance \processx 1
\put(\processx,\processy){\line(0,-1){2}}
}

\def\whitebox{\begin{picture}(1,1)
\whiten\path(0,0)(1,0)(1,1)(0,1)(0,0)
\end{picture}}

\def\ertview(#1,#2)#3#4{\processx=#1
\processy=#2
\put(\processx,\processy){\thicklines\framebox(5,4){}}
\advance\processx 1
\advance\processy 1
\thinlines
\put(\processx,\processy){\line(1,1){1}}
\put(\processx,\processy){\makebox(0,0){\whitebox}}
\advance\processx 2
\put(\processx,\processy){\line(-1,1){1}}
\put(\processx,\processy){\makebox(0,0){\whitebox}}
\advance\processx -1
\advance\processy 2
\put(\processx,\processy){\line(0,-1){1}}
\put(\processx,\processy){\line(1,0){2}}
\put(\processx,\processy){\makebox(0,0){\whitebox}}
\advance\processx 2
\put(\processx,\processy){\makebox(0,0){\whitebox}}
\advance\processx -4
\advance\processy 1
\put(\processx,\processy){
\makebox(2,1.5)[l]{\sf #3}\makebox(0,1.5)[l]{\sf\shortstack{#4}}}
}

\def\timer(#1,#2)#3{\thicklines\processx=#1
\processy=#2
\put(\processx,\processy){\makebox(6,6)[tl]{\sf #3}}
\advance\processx 3
\advance\processy 3
\put(\processx,\processy){\circle{6}}
\put(\processx,\processy){\vector(1,0){2}}
\put(\processx,\processy){\vector(0,1){3}}
}

\def\datastore(#1,#2)#3#4{\thicklines\processx=#1
\processy=#2
\put(\processx,\processy){\framebox(2,2){\sf\shortstack{#3\\~}}}
\advance\processx 2
\put(\processx,\processy){\makebox(6,2)[l]{~\sf\shortstack{#4}}}
\put(\processx,\processy){\line(1,0){6}}
\advance\processy 2
\put(\processx,\processy){\line(1,0){6}}
}

\def\externalentity(#1,#2)#3#4{{\thicklines\processx=#1
\processy=#2
\advance\processx 1
\put(\processx,\processy){\framebox(4,4){\sf\shortstack{#4}}}
\advance\processy 1
\put(\processx,\processy){\line(-1,0){1}\line(0,1){4}}
\advance\processx -1
\advance\processy 4
\put(\processx,\processy){\makebox(1,1.5){\sf #3}}
\put(\processx,\processy){\line(1,0){4}\line(0,-1){1}}
}}

\def\rightdataflow(#1,#2)#3#4#5{\put(#1,#2){\thinlines\vector(1,0){#3}}
\put(#1,#2){\makebox(#3,1.5)[b]{\sf\shortstack{#4\\\makebox(1,0.01){}}}\makebox(0,0)[l]{\hspace{0.1em}\sf #5}}}

\def\leftdataflow(#1,#2)#3#4#5{\put(#1,#2){\thinlines\vector(-1,0){#3}}
\stdx=#1
\advance \stdx -#3
\put(\stdx,#2){\makebox(#3,0)[b]{\sf\shortstack{#4\\\makebox(1,0.01){}}}\makebox(0,0)[l]{\hspace{0.1em}\sf #5}}}

\def\rightcontrolflow(#1,#2)#3#4#5{\put(#1,#2){\thicklines\vector(1,0){#3}}
\put(#1,#2){\makebox(#3,1.5)[b]{\sf\shortstack{#4\\\makebox(1,0.01){}}}\makebox(2,0){\sf #5}}}

%\def\entity(#1,#2)#3{\sf\thicklines\put(#1,#2){\framebox(8,4){\shortstack{#3}}}}

%\def\entity(#1,#2)#3{\sf\thicklines\put(#1,#2){\framebox(8,4){\shortstack{#3}}}}
\def\entity(#1,#2)#3{\colourentity(#1,#2){white}{black}{#3}}
\def\colourentity(#1,#2)#3#4#5{\sf\thicklines\putcolourframebox[c,i](#1,#2)(8,4){#3}{#4}{\shortstack{#5}}}

\def\cardattribute(#1,#2)(#3,#4)#5#6#7{%
\colourcardattribute(#1,#2)(#3,#4){white}{black}{#5}{#6}{#7}}

\def\colourcardattribute(#1,#2)(#3,#4)#5#6#7#8#9{\sf\thicklines%
\path(#1,#2)(#3,#4)%
\putcolourframecircle(#3,#4){#5}{#6}{1}{}%
\ifnum#1<#3\put(#3,#4){\makebox(0,0)[l]{~~\shortstack{#7}}}\else%
\ifnum#1>#3\put(#3,#4){\makebox(0,0)[r]{\shortstack{#7}~~}}\else%
\ifnum#2<#4\put(#3,#4){\makebox(0,0)[b]{\shortstack{~#7~\\\makebox(1,1){}}}}%
\else\put(#3,#4){\makebox(0,0)[t]{\shortstack{\makebox(1,1){}\\~#7~}}}\fi\fi\fi%
\ifnum#1<#3%
\ifnum#2<#4%
\put(#1,#2){\makebox(2.5,2.5){#8}}
\put(#3,#4){\makebox(-2.5,-2.5){#9}}\else%
\put(#1,#2){\makebox(2.5,-2.5){~#8}}
\put(#3,#4){\makebox(-2.5,2.5){#9~}}\fi\else%
\ifnum#2<#4%
\put(#1,#2.5){\makebox(-2.5,2.5){#8}}
\put(#3,#4){\makebox(2.5,-2.5){#9}}\else%
\put(#1,#2){\makebox(-2.5,-2.5){~#8~}}
\put(#3,#4){\makebox(2.5,2.5){~#9~}}\fi\fi}

\def\attribute(#1,#2)(#3,#4)#5{%
\colourcardattribute(#1,#2)(#3,#4){white}{black}{#5}{}{}}

\def\colourattribute(#1,#2)(#3,#4)#5#6#7{%
\colourcardattribute(#1,#2)(#3,#4){#5}{#6}{#7}{}{}}

\def\colourkeyattribute(#1,#2)(#3,#4)#5#6#7{%
\colourcardattribute(#1,#2)(#3,#4){#5}{#6}{\underline{#7}}{}{}}

\def\colournullattribute(#1,#2)(#3,#4)#5#6#7{%
\colourcardattribute(#1,#2)(#3,#4){#5}{#6}{#7\mbox{?}}{}{}}

\def\colourmanyattribute(#1,#2)(#3,#4)#5#6#7{%
\colourcardattribute(#1,#2)(#3,#4){#5}{#6}{#7*}{}{}}

\def\nullattribute(#1,#2)(#3,#4)#5{\attribute(#1,#2)(#3,#4){#5\mbox{?}}}

\def\manyattribute(#1,#2)(#3,#4)#5{\attribute(#1,#2)(#3,#4){#5\mbox{*}}}

\def\keyattribute(#1,#2)(#3,#4)#5{\attribute(#1,#2)(#3,#4){\underline{#5}}}

\def\relationship(#1,#2)(#3,#4)#5#6#7{%
\colourrelationship(#1,#2)(#3,#4){white}{black}{#5}{#6}{#7}}

\def\colourrelationship(#1,#2)(#3,#4)#5#6#7#8#9{\sf\thicklines
\path(#1,#2)(#3,#4)
\stdx=#3
\advance\stdx -#1
\stdy=#4
\advance\stdy -#2
\putbox(#1,#2)(\stdx,\stdy){\begin{picture}(6,4)
\shade\color{#5}\path(0,2)(3,4)(6,2)(3,0)(0,2)
\put(0,0){\makebox(6,4){\shortstack{#7}}}
\end{picture}}
\addcard(#1,#2)(#3,#4){#8}{#9}}

\def\addcard(#1,#2)(#3,#4)#5#6{\ifnum#1<#3%
\ifnum#2<#4\put(#1,#2){\makebox(2,2){~#5}}\put(#3,#4){\makebox(-2,-2){#6~}}\else%
\put(#1,#2){\makebox(2.5,-2){#5}}\put(#3,#4){\makebox(-2.5,2){#6}}\fi\else%
\ifnum#2<#4\put(#1,#2){\makebox(-2,2){#5~}}\put(#3,#4){\makebox(2,-2){~#6}}\else%
\put(#1,#2){\makebox(-2,-2){#5}}\put(#3,#4){\makebox(2,2){#6}}\fi\fi}



\def\generalisation(#1,#2)#3{\colourgeneralisation(#1,#2){white}{black}{#3}}

\def\colourgeneralisation(#1,#2)#3#4#5{\sf\thicklines
\put(#1,#2){\begin{picture}(6,0)
\textcolor{#4}{\shade\color{#3}\path(0,1)(1,2)(5,2)(6,1)(5,0)(1,0)(0,1)}
\put(0,0){\makebox(6,2){#5}}
\end{picture}}}
  

\def\isa(#1,#2)(#3,#4){\pathvector(#1,#2)(#3,#4)}

\def\smallpicsize{\unitlength=0.5em}
\def\mediumpicsize{\unitlength=0.60em}
\def\stdpicsize{\unitlength=0.75em}
\def\bigpicsize{\unitlength=1em}
\def\largepicsize{\unitlength=1.5em}
\def\hughpicsize{\unitlength=2em}

%\def\weakentity(#1,#2)#3{\sf\thicklines\put(#1,#2){\framebox(8,4){\shortstack{#3}}}
%\put(#1,#2){\makebox(8,4){\framebox(7.5,3.5){}}}}

\def\weakentity(#1,#2)#3{\entity(#1,#2){#3}
\put(#1,#2){\makebox(8,4){\framebox(7.1,3.1){}}}}

\def\qpic(#1,#2)#3{\begin{minipage}{\textwidth}
\begin{tabbing}
\begin{picture}(#1,#2)#3\end{picture}
\end{tabbing}
\end{minipage}}

\def\cqpic(#1,#2)#3#4{\begin{minipage}{\textwidth}
\stdx=#1
\stdy=#2
\advance\stdx 2
\advance\stdy 2
\begin{tabbing}
\begin{picture}(\stdx,\stdy)(-1,-1)
\putcolourbox(-1,-1)(\stdx,\stdy){#3}{}
#4\end{picture}
\end{tabbing}
\end{minipage}}

\def\card#1#2{\mbox{\textrm{\textsf{#1:#2}}}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def\relwidth{6}

\def\relattribute(#1,#2)#3#4{\Thicklines
\stdz=#1
\stdw=\relwidth
\multiply\stdw #3
\advance\stdz\stdw
\putcolourframebox[l,i](\stdz,#2)(\relwidth,2){white}{black}{\textsf{\textcolor{white}{j}#4}}}

\def\relname(#1,#2)#3{\putbox[l,i](#1,#2)(\relwidth,2){\textsf{~#3}}}

\def\relfk(#1,#2)(#3,#4){
\thinlines
% find half way
\stdv=#2
\advance\stdv #4
\divide \stdv 2
\stdx=#1
\multiply\stdx\relwidth
\advance\stdx 2
\stdu=#3
\multiply\stdu\relwidth
\advance\stdu 2
\dashpath(\stdx,#2)(\stdx,\stdv)
\dashpath(\stdx,\stdv)(\stdu,\stdv)
\dashpathvector(\stdu,\stdv)(\stdu,#4)}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\OptArgUMLC[#1](#2,#3)#4#5{{\sf\Thicklines
\stdw=#1
\putcolourframebox(#2,#3)(8,#1){white}{black}{}
\advance \stdw -2
\putbox[tl,i](#2,#3)(8,\stdw){~\\~\shortstack[l]{#5}}% 
\advance \stdw #3
\thinlines
\putframebox(#2,\stdw)(8,2){#4}}}

\def\MaybeOptArgUMLC{\ifx[\testchar \let\next\OptArgUMLC
                \else \let\next\NoOptArgUMLC \fi \next}

\def\NoOptArgUMLC(#1,#2)#3#4{\OptArgUMLC[6](#1,#2){#3}{#4}}

\def\umlclass{\futurelet\testchar\MaybeOptArgUMLC}

\def\umlgeneralisation(#1,#2){\put(#1,#2){\Thicklines
\begin{picture}(2,20)
\shade\color{white}\path(0,0)(1,2)(2,0)(0,0)
\end{picture}}}

