% Part of the MetaUML manual.
% Copyright (C) 2005 Ovidiu Gheorghies
%
% This program is free software; you can redistribute it and/or
% modify it under the terms of the GNU General Public License
% as published by the Free Software Foundation; either version 2
% of the License, or (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

input metauml;

HumanInfoCopy.iDwarf(iHuman);
iDwarf.width := 60;
iDwarf.height :=  20;
iDwarf.foreColor := blue;
iDwarf.shadeColor := .8blue;

beginfig(1);
  Human.h;
  drawObject(h);
  draw objectBox(h);

  Human.h1;
  h1.n =  (35, 0);
  h1.info.foreColor := red;
  drawObject(h1);

  Human.h2;
  h2.info.height := 90;
  h2.nw = (50,0);
  drawObject(h2);
  draw objectBox(h2);

  EHuman.d(iDwarf);
  drawObjectAt(d)(d.s = (10,-50));

  EHuman.d2(iDwarf);
  d2.info.shadeColor := red;
  drawObjectAt(d2)(d2.s = (10,-80));
endfig;

beginfig(2);
  save a,b;

  Actor.a("foo");
  drawObject(a);

  Actor.b("Actor line one", "and line two");
  Actor_setDebugMode.b;
  b.n = (70,0);
  drawObject(b);
endfig;

beginfig(3);
  Usecase.u("foo");
  drawObject(u);

  draw objectBox(u) withpen pencircle scaled .1;

  draw u.n withpen pencircle scaled 2 withcolor red;
  draw u.s withpen pencircle scaled 2 withcolor red;
  draw u.e withpen pencircle scaled 2 withcolor red;
  draw u.w withpen pencircle scaled 2 withcolor red;

  draw u.ulft withpen pencircle scaled 2 withcolor blue;
  draw u.urt withpen pencircle scaled 2 withcolor blue;
  draw u.llft withpen pencircle scaled 2 withcolor blue;
  draw u.lrt withpen pencircle scaled 2 withcolor blue;

  Usecase.login("Log in for an eagerly", "awaiting user", "which spans well into a very long 3rd line.");
  login.s = (0, 5);
  drawObject(login);

  Usecase.t("Line 1 goo bar", "Line 2");
  t.s = login.n + (0,10);
  drawObject(t);

  Usecase.q("Line 1 abcdefg hij", "abcde", "Line 3 abc def ghe jkl", "Line 4 x");
  q.s = t.n + (0,10);
  drawObject(q);

endfig;

beginfig(4);
    Actor.userA("User A2", "line 2", "line 3 long long long");
    % Any Actor object is made of two sub-objects: nameStack and human.
    % Each individual picture in the nameStack can be configured individually.
    %
    % However, it is not possible to configure all the lines in the nameStack at
    % once now, saying something like:
    %
    % userA.nameStack.info.iPict.iFont.scale := 3;
    %
    % This happens because the information above is copied into the Picture objects
    % in the Actor constructor (and it is useless to modify it afterwards).
    %
    % If you do want to make such global modifications of the settings, see the
    % next two examples.

    userA.nameStack.pict[0].info.iFont.scale := 1.2;
    userA.nameStack.pict[1].info.iFont.scale := .7;
    userA.nameStack.info.borderColor := blue;
    userA.nameStack.info.boxed := 1;
    userA.nameStack.group.info.left := 30;
    userA.nameStack.group.info.right := 5;
    userA.human.info.foreColor := red;

    drawObject(userA);
    %draw objectBox(userA.nameStack);
    %draw objectBox(userA.human);
endfig;

beginfig(5);
    save userA;
    % If you want to have preset a info for specific objects

    ActorInfoCopy.iBig(iActor);

    % ActorInfo contains info-s for two objects
    % iNameStack: for the stack representing the actor's name
    % iHuman:     for the little human

    iBig.iNameStack.iPict.iFont.scale := 3;
    iBig.iNameStack.spacing := 25;
    iBig.iHuman.height := 25;

    EActor.userA(iBig)("User A", "Specifically configured");
    drawObject(userA);
endfig;

beginfig(6);
    save userA;

    iActor.iNameStack.iPict.iFont.scale := 2;
    iActor.iNameStack.spacing := 18;

    Actor.userA("User A", "Globally configured");
    drawObject(userA);
endfig;

beginfig(7);
  save usecaseA;
  Usecase.usecaseA("A highly customizable", "usecase. Foo bar!");
  usecaseA.info.iNameStack.iPict.iFont.scale := .5;
  drawObject(usecaseA);
endfig;

beginfig(8);
  save usecaseA;
  Usecase.usecaseA("A highly customizable", "usecase. Foo bar 2!");
  usecaseA.info.iNameStack.iPict.iFont.scale := 1.1;
  usecaseA.info.foreColor := red;
  usecaseA.info.borderColor := blue;
  usecaseA.info.iShade.background := green;
  usecaseA.info.iShade.shift := 4;
  drawObject(usecaseA);
endfig;

beginfig(9);
  save usecaseA;
  UsecaseInfoCopy.iMyUsecase(iUsecase);
  iMyUsecase.iNameStack.iPict.iFont.scale := .6;
  iMyUsecase.iNameStack.spacing := 5;
  iMyUsecase.foreColor := green;
  iMyUsecase.iShade.background := red;

  EUsecase.usecaseA(iMyUsecase)("A highly ", " customizable usecase.");
  EUsecase.usecaseB(iMyUsecase)("Another very ", " customizable usecase.");

  usecaseB.info.iShade.background := green;

  leftToRight(20)(usecaseA, usecaseB);
  drawObjects(usecaseA, usecaseB);
endfig;

end