* Bug 15067 fixed: adds D&D of XMI files
[scilab.git] / scilab / modules / graphics / macros / datatips / datatipMove.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2010 - INRIA - Serge Steer <serge.steer@inria.fr>
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function datatipMove(tip_handle,ax)
14     //moves a datatip along the associated curve
15     // tip_handle : handle on the given datatip compound;
16     if argn(2)<1 then
17         error(msprintf(_("%s: Wrong number of input argument(s): At least %d expected.\n"),"datatipMove",1))
18     end
19
20     if type(tip_handle)<>9|size(tip_handle,"*")<>1|or(tip_handle.type<>"Datatip") then
21         error(msprintf(_("%s: Wrong type for input argument #%d: A ''%s'' handle expected.\n"),"datatipMove",1,"Datatip"))
22     end
23
24     if argn(2)==1 then
25         ax=tip_handle.parent
26         while ax.type<>"Axes" then ax=ax.parent,end
27     else
28         if type(ax)<>9|size(ax,"*")<>1|or(ax.type<>"Axes") then
29             error(msprintf(_( "%s: Wrong type for input argument #%d: A ''%s'' handle expected.\n"),"datatipMove",2,"Axes"))
30         end
31     end
32     curve_handle=tip_handle.children(1).user_data(1)
33     data=curve_handle.data //the curve data points
34     ud=datatipGetStruct(curve_handle);
35
36     if ax.view=="3d"&curve_handle.type=="Polyline" then
37         [xx,yy]=geom3d(data(:,1),data(:,2),data(:,3))
38         data=[xx,yy]
39     end
40
41     rep=[0 0 -1];
42     if ~ud.interpolate then //position restricted to knots
43         np=size(data,1)
44         while rep(3)==-1
45             rep=xgetmouse([%t %t])
46             //find data point which is at minimum distance to the pointer
47             [m,k]=min(sum((data-ones(np,1).*.rep(1:2)).^2,2))
48             datatipSetTipPosition(ud,tip_handle,curve_handle.data(k,:),k)
49         end
50     else //interpolated position
51         while rep(3)==-1
52             rep=xgetmouse([%t %t])
53             //find data point which is at minimum distance to the pointer
54             [d,pt,k,c]=orthProj(data,rep(1:2))
55             if pt<>[] then
56                 if ax.view=="3d"&curve_handle.type=="Polyline" then
57                     pt=curve_handle.data(k,:)+c*(curve_handle.data(k+1,:)-curve_handle.data(k,:))
58                 end
59                 datatipSetTipPosition(ud,tip_handle,pt,k)
60             end
61         end
62     end
63 endfunction