www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wavelet/mngmbtn.m

    function [out1,out2] = mngmbtn(option,fig,varargin)
%MNGMBTN Manage mouse buttons for the dynamical visualization tool.

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 01-May-96.
%   Last Revision: 11-Jul-2013.
%   Copyright 1995-2013 The MathWorks, Inc.
% $Revision: 1.13.4.20 $

msel_box  = 'n';
msel_trans = 'e';
msel_txt   = 'a';
msel_open  = 'o';

switch option
    case 'move'
        %**********************************************%
        %** OPTION = 'move' DEPLACEMENT DE LA SOURIS **%
        %**********************************************%
        %   DynV_Axe_Sel    = in3(1);
        %   Edi_PosX   = in3(2); (optional)
        %   Edi_PosY   = in3(3); (optional)
        %   mouseT = in4 (selection type)
        %-----------------------------------------
        if gcbf~=fig , return; end
        DynV_Axe_Sel = varargin{1}(1);
        if ~ishandle(DynV_Axe_Sel)
            return;
        end
        mouseT = varargin{2};
        
        [q,x,y] = waxecp(fig,DynV_Axe_Sel);
        if prod(x-q(1))>0 || prod(y-q(2))>0
            % set(fig,'WindowButtonMotionFcn','wtmotion','WindowButtonUpFcn','');
            set(fig,'Pointer','arrow');
            if ~isequal(mouseT,msel_box) , mngmbtn('delLines',fig,'V_H'); end

        %--- selection d'un rectangle ---%
        elseif isequal(mouseT,msel_box)
            dVTmemB = dynvtool('rmb',fig);
            DynV_Sel_Box = dVTmemB.DynV_Sel_Box;
            if ~isempty(DynV_Sel_Box) && ishandle(DynV_Sel_Box)
                pzbx = get(DynV_Sel_Box,'XData');
                pzby = get(DynV_Sel_Box,'YData');
                set(DynV_Sel_Box,...
                        'XData', [pzbx(1) q(1) q(1) pzbx(1) pzbx(1)],...
                        'YData', [pzby(1) pzby(1) q(2) q(2) pzby(1)]);
            end

        %--- ecriture de la position ---%
        elseif isequal(mouseT,msel_txt)
            dVTmemB = dynvtool('rmb',fig);
            DynV_Line_Hor = dVTmemB.DynV_Line_Hor;
            DynV_Line_Ver = dVTmemB.DynV_Line_Ver;
            if isempty(DynV_Line_Hor) , return; end
            set(DynV_Line_Hor,'YData',[q(2) q(2)]);
            set(DynV_Line_Ver,'XData',[q(1) q(1)]);
            if length(varargin{1})<3 , return; end
            Edi_PosX = varargin{1}(2);
            Edi_PosY = varargin{1}(3);
            mempos_coor = get(Edi_PosX,'UserData');
            fcn_wri   = wmemutil('get',mempos_coor,1);
            param_wri = wmemutil('get',mempos_coor,2);
            if isempty(param_wri)
               [sx,sy] = feval(fcn_wri,q(1),q(2),DynV_Axe_Sel);
            else
               [sx,sy] = feval(fcn_wri,q(1),q(2),DynV_Axe_Sel,param_wri);
            end
            set(Edi_PosX,'String',sx);
            set(Edi_PosY,'String',sy);
        
        %--- gestion des translations ---%
        elseif isequal(mouseT,msel_trans)
            dVTmemB = dynvtool('rmb',fig);
            DynV_Line_Hor = dVTmemB.DynV_Line_Hor;
            DynV_Line_Ver = dVTmemB.DynV_Line_Ver;
            if isempty(DynV_Line_Hor) , return; end
            x1 = get(DynV_Line_Hor,'XData');
            y1 = get(DynV_Line_Hor,'YData');
            rect = get(DynV_Axe_Sel,'Position');
            rx = abs((x1(2)-q(1))/(x(2)-x(1)));
            ry = abs((y1(2)-q(2))/(y(2)-y(1)));
            k  = rect(3)*rx-rect(4)*ry;
            if k>0
                set(DynV_Line_Hor,...
                        'XData',[x1(2) x1(2) x1(2)],...
                        'YData',[y(1)  y1(2) y(2) ] ...
                        );
                set(DynV_Line_Ver,...
                        'XData',[q(1) q(1) q(1)],   ...
                        'YData',[y(1) q(2) y(2)]    ...
                        );
                DynV_Flg_Trans = 1;
            elseif k<0
                set(DynV_Line_Hor,...
                        'XData',[x(1)  x1(2) x(2) ],...
                        'YData',[y1(2) y1(2) y1(2)] ...
                        );
                set(DynV_Line_Ver,...
                        'XData',[x(1) q(1) x(2)],   ...
                        'YData',[q(2) q(2) q(2)]    ...
                        );
                DynV_Flg_Trans = 2;
            else
                DynV_Flg_Trans = 0;
            end
            dVTmemB.flgTrans = DynV_Flg_Trans;
            dynvtool('wmb',fig,dVTmemB);
        end

    case 'down'
        %***************************************************%
        %** OPTION = 'down' UN BOUTON DE LA SOURIS APPUYE **%
        %***************************************************%
        if ~any(wfindobj('figure')==fig) , return; end
        if gcbf~=fig
            dVTmemB = mngmbtn('delLines',fig,'All');
        else
            dVTmemB = dynvtool('rmb',fig);
        end
        mouse  = get(fig,'SelectionType');
        mouseT = mouse(1);
        
        axe_hdls = dVTmemB.axeInd;
        if isequal(mouseT,msel_txt)
            % DynV_Axe_Act + DynV_Axe_Ind
            axe_hdls = [dVTmemB.axeAct , axe_hdls];

        else    
            % DynV_Axe_Cmd + DynV_Axe_Ind
            axe_hdls = [dVTmemB.axeCmd , axe_hdls];
        end
        axe_hdls = findobj(axe_hdls,'flat','Visible','on');
        par = get(axe_hdls,'Parent');
        if length(par)>1 , par = cat(1,par{:}); end
        idxVis = strncmp('on',get(par,'Visible'),2);
        axe_hdls = axe_hdls(idxVis);
        DynV_Axe_Sel = [];
        for i=1:length(axe_hdls)
            ax      = axe_hdls(i);
            [q,x,y] = waxecp(fig,ax);
            if  prod(x-q(1))<0 && prod(y-q(2))<0
                DynV_Axe_Sel = ax;
                break;
            end
        end
        dVTmemB.axeSel = DynV_Axe_Sel;
		dynvtool('wmb',fig,dVTmemB);
        dVTmemB = mngmbtn('delLines',fig,'Down',dVTmemB,DynV_Axe_Sel,mouseT);
		if isempty(DynV_Axe_Sel) , return; end

        wtbxappdata('new',fig,'save_WindowButtonUpFcn',get(fig,'WindowButtonUpFcn'));
		
        Edi_PosX = dVTmemB.handles.Edi_PosX;
        Edi_PosY = dVTmemB.handles.Edi_PosY;
        DynV_Col_Line = dVTmemB.linColor;

        %--- selection d'un rectangle ---%
        switch mouseT
            case msel_box
                set(fig,'Pointer','crosshair', ...
                        'CurrentAxes',DynV_Axe_Sel);
                if ~isempty(Edi_PosX)
                    set(Edi_PosX,'String','X = ');
                    set(Edi_PosY,'String','Y = ');
                end
                DynV_Sel_Box = line(...
                        'Color',DynV_Col_Line,...
                        'XData',[q(1) q(1) q(1) q(1) q(1)],...
                        'YData',[q(2) q(2) q(2) q(2) q(2)] ...
                        );
                dVTmemB.DynV_Sel_Box = DynV_Sel_Box;

        %--- ecriture de la position ---%
            case msel_txt
                set(fig,'Pointer','crosshair', ...
                        'CurrentAxes',DynV_Axe_Sel);
                DynV_Line_Hor = line(...
                        'Color',DynV_Col_Line,...
                        'XData',[x(1) x(2)],...
                        'YData',[q(2) q(2)] ...
                        );
                DynV_Line_Ver = line(...
                        'Color',DynV_Col_Line,...
                        'XData',[q(1) q(1)],...
                        'YData',[y(1) y(2)] ...
                        );
                dVTmemB.DynV_Line_Hor = DynV_Line_Hor;
                dVTmemB.DynV_Line_Ver = DynV_Line_Ver;

                if ~isempty(Edi_PosX)
                    mempos_coor = get(Edi_PosX,'UserData');
                    fcn_wri   = wmemutil('get',mempos_coor,1);
                    param_wri = wmemutil('get',mempos_coor,2);
                    if isempty(param_wri)
                       [sx,sy] = feval(fcn_wri,q(1),q(2),DynV_Axe_Sel);
                    else
                       [sx,sy] =  ...
                            feval(fcn_wri,q(1),q(2),DynV_Axe_Sel,param_wri);
                    end
					dynvtool('set_BtnOnOff',fig,'On','Info');
                    set(Edi_PosX,'String',sx);
                    set(Edi_PosY,'String',sy);
                end

        %--- gestion des translations ---%
            case msel_trans
                set(fig,'Pointer','crosshair','CurrentAxes',DynV_Axe_Sel);
                if ~isempty(Edi_PosX)
                    set(Edi_PosX,'String','X = ');
                    set(Edi_PosY,'String','Y = ');
                end
                DynV_Line_Hor = line(...
                        'LineStyle','--',...
                        'Color',DynV_Col_Line,...
                        'XData',[x(1) q(1) x(2)],...
                        'YData',[q(2) q(2) q(2)] ...
                        );
                DynV_Line_Ver = line(...
                        'LineStyle','--',...
                        'Color',DynV_Col_Line,...
                        'XData',[q(1) q(1) q(1)],...
                        'YData',[y(1) q(2) y(2)] ...
                        );
                dVTmemB.DynV_Line_Hor = DynV_Line_Hor;
                dVTmemB.DynV_Line_Ver = DynV_Line_Ver;
                dVTmemB.flgTrans = 0;

        %--- open ---%
            case msel_open
              set(fig,'Pointer','arrow');
              mempos_coor = get(Edi_PosX,'UserData');
              fcn_sel = wmemutil('get',mempos_coor,3);
              if ~isempty(fcn_sel)
                  param_sel = wmemutil('get',mempos_coor,4);
                  if isempty(param_sel)
                      [sx,sy] = feval(fcn_sel,q(1),q(2),DynV_Axe_Sel);
                  else
                      [sx,sy] = feval(fcn_sel,q(1),q(2),DynV_Axe_Sel,param_sel);
                  end
                  if ~isempty(sx)
                      DynV_Line_Hor = line(...
                          'Color',DynV_Col_Line,...
                          'XData',[x(1) x(2)],...
                          'YData',[q(2) q(2)] ...
                          );
                      DynV_Line_Ver = line(...
                          'Color',DynV_Col_Line,...
                          'XData',[q(1) q(1)],...
                          'YData',[y(1) y(2)] ...
                          );
                      if ~isempty(Edi_PosX)
                          set(Edi_PosX,'String',sx);
                          set(Edi_PosY,'String',sy);
                      end
                      dVTmemB.DynV_Line_Hor = DynV_Line_Hor;
                      dVTmemB.DynV_Line_Ver = DynV_Line_Ver;
                  end
              end
        end
		handles  = num2mstr(double([DynV_Axe_Sel,Edi_PosX,Edi_PosY]));
        strNumFig = handle2str(fig);
		endstr   = [strNumFig ',' handles ',''' mouseT ''');'];
		cba_move = [mfilename '(''move'',' endstr];
		cba_up   = [mfilename '(''up'',' endstr];
        
        WFB_Move_1 = get(fig,'WindowButtonMotionFcn');
        wtbxappdata('set',fig,'save_WindowButtonMotionFcn',WFB_Move_1);
        
		set(fig,'WindowButtonMotionFcn',cba_move,'WindowButtonUpFcn',cba_up);
		dynvtool('wmb',fig,dVTmemB);

    case 'up'
        %*************************************************%
        %** OPTION = 'up' UN BOUTON DE LA SOURIS APPUYE **%
        %*************************************************%
        %   mouseT = in4 (selection type)
        %-----------------------------------------
        DynV_Axe_Sel = varargin{1}(1);
        save_WindowButtonUpFcn = wtbxappdata('del',fig,'save_WindowButtonUpFcn');
		eval(save_WindowButtonUpFcn);
        WFB_Move_2 = wtbxappdata('get',fig,'save_WindowButtonMotionFcn');
        set(fig,'WindowButtonMotionFcn',WFB_Move_2,...
			    'WindowButtonUpFcn',save_WindowButtonUpFcn);

		set(fig,'Pointer','arrow');
        mouseT  = varargin{2};
		if isequal(mouseT,msel_open) ,  return; end
		
        dVTmemB = dynvtool('rmb',fig);

        %--- gestion des translations ---%
        if isequal(mouseT,msel_trans)
            DynV_Line_Hor = dVTmemB.DynV_Line_Hor;
            DynV_Line_Ver = dVTmemB.DynV_Line_Ver;
            DynV_Flg_Trans = dVTmemB.flgTrans;
            if DynV_Flg_Trans==1
                x1 = get(DynV_Line_Hor,'XData');
                x2 = get(DynV_Line_Ver,'XData');
                dx = x2(2)-x1(2);
            elseif DynV_Flg_Trans==2
                y1 = get(DynV_Line_Hor,'YData');
                y2 = get(DynV_Line_Ver,'YData');
                dy = y2(2)-y1(2);
            end
            dVTmemB = mngmbtn('delLines',fig,'V_H',dVTmemB);
            DynV_Axe_Ind = dVTmemB.axeInd;
            if ~isempty(DynV_Axe_Ind) && any(DynV_Axe_Sel==DynV_Axe_Ind)
                DynV_Axe_Act  = DynV_Axe_Sel;
                DynV_XY_Const = [0 0];
            else
                DynV_Axe_Act  = dVTmemB.axeAct;
                DynV_XY_Const = dVTmemB.xyConst;
            end
            if DynV_Flg_Trans==1
                x0 = get(DynV_Axe_Sel,'XLim');
                if DynV_XY_Const(1)~=0
                    set(DynV_Axe_Act,'XLim',x0-dx);
                else
                    set(DynV_Axe_Sel,'XLim',x0-dx);
                end
                dynvtool('put',fig);

            elseif DynV_Flg_Trans==2
                y0 = get(DynV_Axe_Sel,'YLim');
                if DynV_XY_Const(2)~=0
                    set(DynV_Axe_Act,'YLim',y0-dy);
                else
                    set(DynV_Axe_Sel,'YLim',y0-dy);
                end
                dynvtool('put',fig);
            end

        elseif isequal(mouseT,msel_box)
            DynV_Sel_Box = dVTmemB.DynV_Sel_Box;
            if ~ishandle(DynV_Sel_Box) , return; end
            xd = get(DynV_Sel_Box,'XData');
            yd = get(DynV_Sel_Box,'YData');
            if isempty(xd) || isempty(yd) , return; end
            xl = get(DynV_Axe_Sel,'XLim');
            yl = get(DynV_Axe_Sel,'YLim');
            tol = 0.01;
            if abs((max(xd)-min(xd))/(xl(2)-xl(1)))<tol  || ....
               abs((max(yd)-min(yd))/(yl(2)-yl(1)))<tol
                mngmbtn('delLines',fig,'Box',dVTmemB);
			else
				dynvtool('set_BtnOnOff',fig,'On','Zoom');
            end

        end

    case 'getbox'
        %****************************************************%
        %** OPTION = 'getbox' LECTURE DU RECTANGLE DE ZOOM **%
        %****************************************************%
        dVTmemB = dynvtool('rmb',fig);
        DynV_Sel_Box = dVTmemB.DynV_Sel_Box;
        if ~ishandle(DynV_Sel_Box) , 
            DynV_Sel_Box = [];
            dVTmemB.DynV_Sel_Box = DynV_Sel_Box;
            dynvtool('wmb',fig,dVTmemB);
        end
        if ~isempty(DynV_Sel_Box)
            out1 = get(DynV_Sel_Box,'XData');
            out2 = get(DynV_Sel_Box,'YData');
            if (min(out1)==max(out1)) || (min(out2)==max(out2))
                mngmbtn('delLines',fig,'Box',dVTmemB);
                out1 = [];
                out2 = [];
            end
        else
            out1 = [];
            out2 = [];
        end

    case 'delLines'
        if nargin<4 , 
            dVTmemB = dynvtool('rmb',fig);
        else
            dVTmemB = varargin{2};
        end
        linHDL = [];
        switch varargin{1}
          case 'Box' ,
            linHDL = dVTmemB.DynV_Sel_Box;
            dVTmemB.DynV_Sel_Box  = [];
			
          case {'V_H','H_V'}
            linHDL = [dVTmemB.DynV_Line_Hor,dVTmemB.DynV_Line_Ver];
            dVTmemB.DynV_Line_Hor = [];
            dVTmemB.DynV_Line_Ver = [];
			
          case {'All','Down'}
            if ~isempty(dVTmemB)
                linHDL = [dVTmemB.DynV_Sel_Box,...
                      dVTmemB.DynV_Line_Hor,dVTmemB.DynV_Line_Ver];
            else
            end
            dVTmemB.DynV_Sel_Box  = [];
            dVTmemB.DynV_Line_Hor = [];
            dVTmemB.DynV_Line_Ver = [];
        end
        delete(linHDL(ishandle(linHDL)));
        dynvtool('wmb',fig,dVTmemB);
	
		if ~isequal(varargin{1},'V_H') && ~isequal(varargin{1},'H_V')
			switch varargin{1}
			case 'All'  , typCall = 'All';
			case 'Box'  , typCall = 'Zoom';
			case 'Down'
				DynV_Axe_Sel = varargin{3};
				mouseT =  varargin{4};
				if ~isempty(DynV_Axe_Sel) && isequal(mouseT,msel_txt)
					typCall = 'All';
					% typCall = 'Zoom';
				else
					typCall = 'All';
				end
			end
			dynvtool('set_BtnOnOff',fig,'Off',typCall);
		end
        out1 = dVTmemB;

    case 'getLines'
        if nargin<4 , 
            dVTmemB = dynvtool('rmb',fig);
        else
            dVTmemB = varargin{2};
        end
        switch lower(varargin{1})
          case 'box' , out1  = dVTmemB.DynV_Sel_Box;
          case 'hor' , out1  = dVTmemB.DynV_Line_Hor;
          case 'ver' , out1  = dVTmemB.DynV_Line_Ver;
          case 'all' ,
            out1  = [dVTmemB.DynV_Sel_Box,dVTmemB.DynV_Line_Hor,dVTmemB.DynV_Line_Ver];
        end

    case 'cleanXYPos'
        handles = dynvtool('handles',fig);
        Edi_PosX = handles.Edi_PosX;
        Edi_PosY = handles.Edi_PosY;
        set(Edi_PosX,'String','X = ');
        set(Edi_PosY,'String','Y = ');

    otherwise
        errargt(mfilename,getWavMSG('Wavelet:moreMSGRF:Unknown_Opt'),'msg');
        error(message('Wavelet:FunctionArgVal:Invalid_Input'));
end