3bb74cc1235a469df57dc577db8586f6ebaa1ce9
[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 options_names=["in_upper_right";"in_upper_left";"in_lower_left";
11                "in_lower_right";"by_coordinates";"out_upper_right";
12                "out_upper_left";"out_lower_left";"out_lower_right";
13                "upper_caption";"lower_caption"];
14 options_codes=[1;2;3;
15                4;5;-1;
16                -2;-3;-4;
17                -5;-6];
18   f        = gcf();
19   vis      = f.immediate_drawing;
20   narg     = size(varargin);
21   k0       = 1;
22   H        = [];
23   leg      = [];
24   Acur     = gca();
25   A        = Acur;
26   opt      = 1;
27   with_box = %T;
28
29
30
31   while type(varargin(k0))==9 then //a handle that could be an Axes, Agreg. or Polyline handle.
32     tmpH=varargin(k0)
33     if tmpH.type=='Axes' then
34       A = tmpH;
35     end
36     H=[H;getvalidchildren(tmpH)'];
37     k0 = k0+1;
38   end
39
40   if H==[] then
41     //walk subtree to get all proper children
42     H=getvalidchildren(A)
43   end
44
45   //get all labels
46   for k=k0:size(varargin)
47     if type(varargin(k))<>10 then break,end
48     vk=varargin(k)
49     leg=[leg;vk(:)]
50   end
51   nleg=size(leg,'*')
52
53   k0=k
54   if k0<=narg&type(varargin(k0))==1 then opt=varargin(k0);k0=k0+1,end
55   if k0<=narg&type(varargin(k0))==4 then with_box=varargin(k0);k0=k0+1,end
56
57   //upper left coordinates
58   if size(opt,'*')>1 then
59     bnds=get(gca(),'axes_bounds');
60     as=get(gcf(),'axes_size');
61     [x1,y1,rect]=xchange(opt(1),opt(2),'f2i')
62     x1=x1-as(1)*bnds(1)
63     y1=y1-as(2)*bnds(2)
64     pos=[x1/(as(1)*bnds(3)), y1/(as(2)*bnds(4))]
65     opt=5
66   elseif opt==5 then
67     pos=[]
68   elseif opt<-6|opt>4 then
69     error('opt can take value in -6:4')
70   end
71
72   kopt=find(options_codes==opt)
73   if kopt==[] then error('invalid positionning option'),end
74   
75   // the number of labels might be lower than the number of polylines
76   nbLeg = min(size(H, '*'), size(leg, '*'));
77   H = H(1:nbLeg);
78   leg = leg(1:nbLeg);
79   
80   
81   drawlater()
82   c=captions(H,leg)
83   if with_box then c.line_mode='on',else c.line_mode='off',end
84   c.legend_location=options_names(kopt)
85   if opt==5 then
86     if pos<>[] then
87       c.position=pos;
88     else
89       drawnow()
90       bnds=get(gca(),'axes_bounds');
91       as=get(gcf(),'axes_size');
92       while %t
93         rep=xgetmouse()
94         if rep(3)<> -1 then break,end
95         [x1,y1,rect]=xchange(rep(1),rep(2),'f2i')
96         x1=x1-as(1)*bnds(1)
97         y1=y1-as(2)*bnds(2)
98         pos=[x1/(as(1)*bnds(3)), y1/(as(2)*bnds(4))]
99         c.position=pos;
100       end
101     end
102   end
103   drawnow()
104 endfunction
105
106 function h=getvalidchildren(A)
107   h=[]
108   for k=1:size(A,'*')
109     a=A(k)
110     select a.type
111     case "Polyline" then
112       h=[h;a]
113      case 'Axes'
114       ax=a.children
115       h=[h;getvalidchildren(ax($:-1:1))]
116     case 'Compound'
117       for k=size(a.children,'*'):-1:1
118         h=[h;getvalidchildren(a.children(k))]
119
120       end
121     end
122   end
123 endfunction