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

    function varargout = cbanapar(option,fig,varargin)
%CBANAPAR Callbacks for wavelet analysis parameters.
%   VARARGOUT = CBANAPAR(OPTION,VARARGIN)

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 04-May-98.
%   Last Revision: 12-Dec-2013.
%   Copyright 1995-2013 The MathWorks, Inc.
%   $Revision: 1.7.4.17.4.1 $  $Date: 2014/01/04 07:40:05 $

option = lower(option);
switch option
    case 'no_pop'
        pop_liste  = varargin{1};
        [Pop_Wav_Fam,Pop_Wav_Num,Pop_Lev] = utanapar('handles',fig,'pop');
        ind = wcommon(pop_liste,[Pop_Wav_Fam,Pop_Wav_Num,Pop_Lev]);
        pop_liste(ind) = [];
        if nargout>0 , varargout{1} = pop_liste; end

    case 'cba_fam'
        if nargin>3   % VERSION 3: Inputs = (option , fig, eventdata, handles)
            handles = varargin{2};
            Pop_Wav_Fam = handles.Pop_Wav_Fam;
            Pop_Wav_Num = handles.Pop_Wav_Num;
        else          % VERSION 2 & 3: Inputs = (option , fig, [Pop_Wav_Fam, Pop_Wav_Num])
            Pop_Wav_Fam = varargin{1}(1);
            Pop_Wav_Num = varargin{1}(2);
            if ~ishandle(Pop_Wav_Fam) || ~ishandle(Pop_Wav_Num)
                handles = guihandles(gcbf);
                Pop_Wav_Fam = handles.Pop_Wav_Fam;
                Pop_Wav_Num = handles.Pop_Wav_Num;                
            end
        end
        numf = get(Pop_Wav_Fam,'Value');
        strf = get(Pop_Wav_Fam,'String');
        if iscell(strf)
            strf = noblank(strf{numf});
        else
            strf = noblank(strf(numf,:));
        end
        tab  = wavemngr('fields',{'fsn',strf},'tabNums');
        nbNUM = size(tab,1);
        vis = 'on';
        switch  nbNUM;
            case 0 , vis = 'off';
            case 1 , if strcmp(noblank(tab(1,:)),'no') , vis = 'off'; end
        end
        if strcmp(vis,'off')
            set(Pop_Wav_Num,'Visible',vis,'String',tab,'Value',1);
        else
            set(Pop_Wav_Num,'String',tab,'Value',1,'Visible',vis);
        end

    case 'set'
        nbarg = length(varargin);
        if nbarg<1 , return; end
        [Txt_Data_NS,Edi_Data_NS,Pop_Wav_Fam,Pop_Wav_Num,Pop_Lev] = ...
                utanapar('handles',fig); 
        for k = 1:2:nbarg
           argType = varargin{k};
           argVal  = varargin{k+1};
           switch argType
             case 'typ'
                set(Txt_Data_NS,'String',[argVal '  (Size)']);

             case 'n_s' ,
                siz = argVal{2};
                dim = length(siz);
                n_s = [argVal{1} '  (' ];
                if   dim==1
                  n_s = [n_s,int2str(siz) ')']; 
                else
                  n_s = [n_s,int2str(siz(2)) 'x' int2str(siz(1)) ')']; 
                end
                set(Edi_Data_NS,'String',n_s);                
             case 'nam' , set(Edi_Data_NS,'String',argVal);
             case 'fam' , setProperties(Pop_Wav_Fam,argVal);
             case 'num' , setProperties(Pop_Wav_Num,argVal);
             case 'wav' , setWname(Pop_Wav_Fam,Pop_Wav_Num,argVal);
             case 'lev' , setProperties(Pop_Lev,argVal);
           end
        end

    case 'get'
        nbarg = length(varargin);
        if nbarg<1 , return; end
        [Txt_Data_NS,Edi_Data_NS,Pop_Wav_Fam,Pop_Wav_Num,Pop_Lev] = ...
            utanapar('handles',fig); %#ok<ASGLU>
        for k = 1:nbarg
           outType = varargin{k};
           switch outType
             case 'wav'
                 wf   = get(Pop_Wav_Fam,{'Style','String','Value'});
                 if isequal(wf{1},'edit')
                    fam  = wf{2};
                 else
                    fam  = wf{2}(wf{3},:);
                 end
                 fam = noblank(fam);
                 wf = get(Pop_Wav_Num,{'Style','String','Value'});
                 if ~isequal(wf{1},'edit')
                     strn = wf{2};                    
                     if ~isempty(strn)
                         strn = noblank(strn(wf{3},:));
                         if strcmp(strn,'no') , strn = ''; end
                     else
                         strn = '';
                     end
                else
                    strn = noblank(wf{2});
                    if strcmp(strn,'no') , strn = ''; end
                end                
                varargout{k} = [fam strn]; %#ok<*AGROW>

             case 'lev'
                 levPar = get(Pop_Lev,{'Style','String','Value'});
                 if ~isequal(levPar{1},'edit')
                     levMAX = length(levPar{2});
                     if levPar{3}>levMAX
                         set(Pop_Lev,'Value',levMAX);
                         levPar{3} = levMAX;
                     end
                     varargout{k} = wstr2num(levPar{2}(levPar{3},:));
                 else
                     varargout{k} = wstr2num(levPar{2});
                 end
 
             case 'levmax' ,  varargout{k} = size(get(Pop_Lev,'String'),1);
             
             case 'nam'
                varargout{k} = get(Edi_Data_NS,'String');
           end
        end

    case 'enable'
        ena = varargin{1};
        [Pop_Wav_Fam,Pop_Wav_Num,Pop_Lev] = ...
                utanapar('handles',fig,'fam','num','lev');
        handles = double([Pop_Wav_Fam,Pop_Wav_Num,Pop_Lev]);
        handles = handles(handles~=0);
        set(handles(ishandle(handles)),'Enable',ena);

    case 'cba_num'
        switch nargin
            case {3,5}    % VERSION 2 & 3: Inputs = (option , fig, [Pop_Wav_Fam, Pop_Wav_Num])
                Pop_Wav_Fam = varargin{1}(1);
                Pop_Wav_Num = varargin{1}(2);                
                if length(varargin)>1 , % varargin{2} NOT USED
                    ena_hdl = handle(varargin{3});
                else
                    ena_hdl = [];
                end
                if ~ishandle(Pop_Wav_Fam) || ~ishandle(Pop_Wav_Num)
                    handles = guihandles(gcbf);
                    Pop_Wav_Fam = handles.Pop_Wav_Fam;
                    Pop_Wav_Num = handles.Pop_Wav_Num;
                end
                
            case 4   % VERSION 3: Inputs = (option , fig, eventdata, handles)
                handles = varargin{2};
                Pop_Wav_Fam = handles.Pop_Wav_Fam;
                Pop_Wav_Num = handles.Pop_Wav_Num;           
        end
        lst  = get(Pop_Wav_Num,'String');
        val  = get(Pop_Wav_Num,'Value');
        if iscell(lst)
            item = deblankl(lst{val});
        else
            item = deblankl(lst(val,:));
        end
        if strcmp(item,'**')
            pos = get(Pop_Wav_Num,'Position');
            uni = get(Pop_Wav_Num,'Units');
            if ~isempty(ena_hdl)
                ena_hdl = findobj(ena_hdl,'flat','Enable','on');
                set(ena_hdl,'Enable','off');
            end
            set(Pop_Wav_Fam,'Enable','off');
            set(Pop_Wav_Num,'Visible','off');
            edi_num = uicontrol(...
                        'Parent',get(Pop_Wav_Num,'Parent'), ...
                        'Style','edit',         ...
                        'Units',uni,            ...
                        'Position',pos,         ...
                        'BackgroundColor','w',  ...
                        'Interruptible','Off',  ...
                        'String',[]             ...
                        );
            hdl_str = num2mstr([Pop_Wav_Fam;Pop_Wav_Num;edi_num;ena_hdl]);
            cba = [mfilename '(''ok_num'',' num2mstr(fig) ',' hdl_str  ');'];
            set(edi_num,'Callback',cba);
            
            to_Ena_OFF_Edi_Num = wfindobj(fig,'Enable','on');
            to_Ena_OFF_Edi_Num = setdiff(to_Ena_OFF_Edi_Num,edi_num);
            wtbxappdata('set',fig,'to_Ena_OFF_Edi_Num',to_Ena_OFF_Edi_Num);
            set(to_Ena_OFF_Edi_Num,'Enable','Off');

        end

    case 'ok_num'
        Pop_Wav_Fam = varargin{1}(1);
        Pop_Wav_Num = varargin{1}(2);
        edi     = varargin{1}(3);
        if length(varargin{1})>3 , 
            ena_hdl = varargin{1}(4:end);
        else
            ena_hdl = [];
        end
        rmax  = 16;
        nmax  = 45;
        tmp   = get(Pop_Wav_Fam,{'String','Value'});
        if iscell(tmp{1})
            w_fam = deblankl(tmp{1}{tmp{2}});
        else
            w_fam = deblankl(tmp{1}(tmp{2},:));
        end

        [typNums,w_fileName] ...
            = wavemngr('fields',{'fsn',w_fam}, 'typNums','file');
        [dummy,filename,ext] = fileparts(w_fileName);         %#ok<ASGLU>
      
        item = deblank(get(edi,'String'));        
        err = 0; ok = 1; val = 0;
        switch typNums
          case {'integer','real'}
            if isempty(ext)
               try
                 maxNum = feval(filename);
                 if length(maxNum)==1 , nmax = maxNum; end
               catch %#ok<*CTCH>
               end
            end
            num = wstr2num(item);
            if isempty(num) || (num<1) || (num>nmax) , err = 1; end
            if ~err
                if isequal(typNums,'integer') , err = num~=fix(num); end
            end          
            if err , ok = 0; val = 1; end
          case 'string'
            try
              bounds = wavemngr('fields',{'fsn',w_fam}, 'bounds');
              nbpoints = 10;
              wname  = [w_fam,item];
              feval(filename,bounds(1),bounds(2),nbpoints,wname);
            catch
              err = 1; ok = 0; val = 1;
            end          
        end
        if ~err
            lst = get(Pop_Wav_Num,'String');
            r = size(lst,1);
            if iscell(lst)
                lst = char(lst{:});
            end
            switch typNums
              case {'integer','real'}
                for k=1:r-1
                    num_k = wstr2num(lst(k,:));
                    if num==num_k
                      ok  = 0;
                      val = k;
                      break;
                    elseif  num<num_k
                      ok  = 1;
                      val = k;
                      item = getItem(num,typNums);
                      if k==1 , lst_beg = item;
                      else      lst_beg = char(lst(1:k-1,:),item); 
                      end
                      if r<rmax ,    middleLST = lst(k:r-1,:);
                      elseif k<r-1 , middleLST = lst(k:r-2,:);
                      else           middleLST = '';
                      end
                      lst = char(lst_beg,middleLST,lst(r,:));
                      break;
                    end
                end
                if val==0 ,
                    ok  = 1;
                    val = r;
                    item = getItem(num,typNums);
                    if r==rmax , r = r-1; end
                    lst = char(lst(1:r-1,:),item,lst(r,:)); 
                end

              case 'string'
                TMP = num2cell(lst,2);
                k = find(strncmp(item,TMP,length(item)));
                if ~isempty(k)
                    ok  = 0;
                    val = k;
                else
                    ok  = 1;
                    val = r;
                    if r==rmax , r = r-1; end
                    lst = char(lst(1:r-1,:),item,lst(r,:)); 
                end
            end
        end
        if ok
            set(Pop_Wav_Num,'String',lst,'Value',val,'Visible','on');
        else
            set(Pop_Wav_Num,'Value',val,'Visible','on');
        end
        delete(edi)
        set(Pop_Wav_Fam,'Enable','on');
        if ~isempty(ena_hdl) , set(ena_hdl,'Enable','on'); end
        if err
           wwarndlg(getWavMSG('Wavelet:moreMSGRF:Select_WavNum'), ...
               getWavMSG('Wavelet:moreMSGRF:Unknown_Opt'),'modal');
        end
        to_Ena_OFF_Edi_Num = wtbxappdata('get',fig,'to_Ena_OFF_Edi_Num');
        set(to_Ena_OFF_Edi_Num,'Enable','On');

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


%---------------------------------------%
% Internal Function(s)                  %
%---------------------------------------%
function s = noblank(x)
if ~isempty(x)
    s = x(x~=' ' & x~=0);
else
    s = '';
end
%---------------------------------------%
function item = getItem(num,typNums)

switch typNums
    case 'integer'
      item = sprintf('%.0f',num);

    case 'real'
      item = sprintf('%.15f',num);
      while item(end)=='0' , item(end) = []; end
      if ~isempty(item) && item(end)=='.'
          item = [item '0'];
      end
end
%---------------------------------------%
function setProperties(h,argVal)

if iscell(argVal)
    set(h,argVal{:});
else
    set(h,'Value',argVal);
end
%----------------------------------------------------------------------%
function varargout = setWname(Pop_Wav_Fam,Pop_Wav_Num,wname)

[i_fam,i_num,wav_fam,num_str,tab_num,add_num] = wavemngr('indw',wname);
tabfam_loc = get(Pop_Wav_Fam,'String');
for k = 1:size(tabfam_loc,1);
    if strcmp(wav_fam,deblank(tabfam_loc(k,:)))
        i_fam_loc = k;
        break
    end
end
lnum = size(tab_num,1);
if lnum==1 && isempty(num_str) , tab_num = ''; end
if add_num
    if lnum==1
        tab_num = num_str;
    else
        tab_num = char(tab_num(1:lnum-1,:),num_str,tab_num(lnum,:));
    end
end
if isempty(tab_num)
    tab_num = 'no'; vis  = 'off';
else
    vis  = 'on';
end

%%% MiMi : BUG MATLAB %%%
tmp = get(Pop_Wav_Fam,'String');
rrr = size(tmp,1);
set(Pop_Wav_Fam,'Value',rrr);
pause(0.01)

set(Pop_Wav_Fam,'Value',i_fam_loc);
set(Pop_Wav_Num,'Visible',vis,'String',tab_num,'Value',i_num);

if nargout>0
    varargout = {wav_fam,tab_num,i_fam,i_num,i_fam_loc};
end
%----------------------------------------------------------------------%