Fix bug 4658 for xinfo,xsave,sd2sci,graduate,graypolarplot,legend,legends,nf3d ...
[scilab.git] / scilab / modules / graphics / macros / legend.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // This file must be used under the terms of the CeCILL.
4 // This source file is licensed as described in the file COPYING, which
5 // you should have received as part of this distribution.  The terms
6 // are also available at
7 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
8
9 function c=legend(varargin)
10
11   if size(varargin)<1 then
12     error(msprintf(gettext("%s: Wrong number of input argument(s): At least %d expected.\n"), "legend", 1));
13   end
14
15 options_names=["in_upper_right";"in_upper_left";"in_lower_left";
16                "in_lower_right";"by_coordinates";"out_upper_right";
17                "out_upper_left";"out_lower_left";"out_lower_right";
18                "upper_caption";"lower_caption"];
19 options_codes=[1;2;3;
20                4;5;-1;
21                -2;-3;-4;
22                -5;-6];
23   f        = gcf();
24   vis      = f.immediate_drawing;
25   narg     = size(varargin);
26   k0       = 1;
27   H        = [];
28   leg      = [];
29   Acur     = gca();
30   A        = Acur;
31   opt      = 1;
32   with_box = %T;
33
34
35   while type(varargin(k0))==9 then //a handle that could be an Axes, Agreg. or Polyline handle.
36     tmpH=varargin(k0)
37     if tmpH.type=='Axes' then
38       A = tmpH;
39     end
40     H=[H;getvalidchildren(tmpH)'];
41     k0 = k0+1;
42   end
43
44   if H==[] then
45     //walk subtree to get all proper children
46     H=getvalidchildren(A)
47   end
48
49   //get all labels
50   for k=k0:size(varargin)
51     if type(varargin(k))<>10 then break,end
52     vk=varargin(k)
53     leg=[leg;vk(:)]
54   end
55   nleg=size(leg,'*')
56
57   k0=k
58   if k0<=narg&type(varargin(k0))==1 then opt=varargin(k0);k0=k0+1,end
59   if k0<=narg&type(varargin(k0))==4 then with_box=varargin(k0);k0=k0+1,end
60
61   //upper left coordinates
62   if size(opt,'*')>1 then
63     bnds=get(gca(),'axes_bounds');
64     as=get(gcf(),'axes_size');
65     [x1,y1,rect]=xchange(opt(1),opt(2),'f2i')
66     x1=x1-as(1)*bnds(1)
67     y1=y1-as(2)*bnds(2)
68     pos=[x1/(as(1)*bnds(3)), y1/(as(2)*bnds(4))]
69     opt=5
70   elseif opt==5 then
71     pos=[]
72   elseif opt<-6|opt>4 then
73     error('opt can take value in -6:4')
74   end
75
76   kopt=find(options_codes==opt)
77   if kopt==[] then error('invalid positionning option'),end
78   
79   // the number of labels might be lower than the number of polylines
80   nbLeg = min(size(H, '*'), size(leg, '*'));
81   H = H(1:nbLeg);
82   leg = leg(1:nbLeg);
83   
84   
85   drawlater()
86   c=captions(H,leg)
87   if with_box then c.line_mode='on',else c.line_mode='off',end
88   c.legend_location=options_names(kopt)
89   if opt==5 then
90     if pos<>[] then
91       c.position=pos;
92     else
93       drawnow()
94       bnds=get(gca(),'axes_bounds');
95       as=get(gcf(),'axes_size');
96       while %t
97         rep=xgetmouse()
98         if rep(3)<> -1 then break,end
99         [x1,y1,rect]=xchange(rep(1),rep(2),'f2i')
100         x1=x1-as(1)*bnds(1)
101         y1=y1-as(2)*bnds(2)
102         pos=[x1/(as(1)*bnds(3)), y1/(as(2)*bnds(4))]
103         c.position=pos;
104       end
105     end
106   end
107   drawnow()
108 endfunction
109
110 function h=getvalidchildren(A)
111   h=[]
112   for k=1:size(A,'*')
113     a=A(k)
114     select a.type
115     case "Polyline" then
116       h=[h;a]
117      case 'Axes'
118       ax=a.children
119       h=[h;getvalidchildren(ax($:-1:1))]
120     case 'Compound'
121       for k=size(a.children,'*'):-1:1
122         h=[h;getvalidchildren(a.children(k))]
123
124       end
125     end
126   end
127 endfunction