%-----------------------------   show_unused_fcn      --------------------------
% filter from mlint unused fuction but defined in gui 
% input :  (char)   filename
% output:  (struct)mlint struct with two additional fields FcnName and FcnFound 
% usage :  show_unused_fcn('my_fig_file.m')
%-------------------------------------------------------------------------------
function ms                  = show_unused_fcn(filename)

[fpath,fname,ext] = fileparts(filename);
if isempty(ext)
   ext   ='.m';
end
ext      = regexprep(ext,'\.fig','.m');
filename = fullfile(fpath,[fname,ext]); 
try
%    [ms]                      = mlint(filename,'-struct');   
%    ms                        = getmlintfcn(ms);  
   fcn_list                  = get_fig_fcn_list(filename);
   ms                        = compare_fcn(ms,fcn_list);
   display_msg(ms, filename)
catch ME
  throw(ME)
end





%-----------------------------   display_msg       -----------------------------
%
% input :
% output:
%-------------------------------------------------------------------------------
function display_msg(ms,filename)

filename = regexptranslate('escape',which(filename));
nffpos  = find(~[ms.FcnFound]);

msg = '';
for k = nffpos
   if length(ms(k).column)==1
      tmsg=sprintf('L %d (C %d): %s\n',ms(k).line, ms(k).column, ms(k).message);
   else
      tmsg=sprintf('L %d (C %d-%d): %s\n',ms(k).line,ms(k).column,ms(k).message);
   end
   msg = sprintf('%s',msg,tmsg);
end


exp      = sprintf('<a href="matlab: opentoline(''%s'',$1)">L $1</a>', filename);
msg      = regexprep(msg,'L (\d+)', exp);

disp(msg)


%-----------------------------   compare_fcn       -----------------------------
%
% input :
% output:
%-------------------------------------------------------------------------------
function ms = compare_fcn(ms,fcn_list)
fcn_field  = fieldnames(fcn_list);
fcns       = squeeze(struct2cell(fcn_list));
fcns       = fcns(~strcmpi(fcn_field,'tag'),:);
fcns       = fcns(~cellfun('isempty',fcns));
fcn_pos    = find([ms.FcnFound]);


for k = fcn_pos
   isfound    = regexpi(fcns,ms(k).FcnName);
   isfound    = [isfound{:}];
   if isempty(isfound)
      ms(k).FcnFound = false;
   end
   
end

%-----------------------------   getfcn            -----------------------------
%
% input :
% output:
%-------------------------------------------------------------------------------
function ms   = getmlintfcn(ms)
fieldms                     = fieldnames(ms);
fieldms                     = vertcat(fieldms,{'FcnFound';'FcnName'});
cellms                      = struct2cell(ms);
ncellms                     = cell(length(fieldms),length(ms));
ncellms(1:size(cellms,1),:) = cellms;

msg                         = ncellms(strcmpi(fieldms,'message'),:); 

fpos                        = find_nempty_cells(msg,'^the function');
fcnname                     = cell(1,length(ms));
pattern                     = '[Tt]he\sfunction\s''|''\smight\sbe\sunused.';
fcnname(fpos)               = regexprep(msg(fpos),pattern,'')';
ncellms(strcmpi(fieldms,'FcnFound'),:) = num2cell(fpos);
ncellms(strcmpi(fieldms,'FcnName'),:)  = fcnname;
ms                        = cell2struct(ncellms,fieldms);
ms                        = ms(fpos);

%-----------------------------   find_nempty_cells   ---------------------------
%
% input :
% output:
%-------------------------------------------------------------------------------
function fpos = find_nempty_cells(varargin)
fpos          = regexpi(varargin{:});
fpos          = ~cellfun('isempty',fpos);


%-----------------------------   get_fig_fcn_list  -----------------------------
%
% input :
% output:
%-------------------------------------------------------------------------------
function fcn_list = get_fig_fcn_list(filename)
figname             = regexprep(filename,'\.m','.fig');
hFig                = openfig(figname,'new','invisible');
root                = get(hFig);
rfnames             = fieldnames(root);
fpos                = find_nempty_cells(rfnames,'fcn');
% fpos                = ~cellfun('isempty',fpos);
fcn_names           = rfnames(fpos);
fcn_names           = vertcat(fcn_names,{'Tag';'Callback'});

struct_names        = cell(length(fcn_names),2);
struct_names(:,1)   = fcn_names;
obj_list            = findobj(hFig);
struct_names{end,2} = cell(1,length(obj_list));
struct_names        = struct_names';
fcn_list            = struct(struct_names{:});
for k = 1:length(obj_list)
   
   obj = get(obj_list(k));
   
   for f = 1:length(fcn_names)
      if isfield(obj,fcn_names{f})
         if isa(obj.(fcn_names{f}),'function_handle')
            fcn_list(k).(fcn_names{f}) = func2str(obj.(fcn_names{f}));
         else
            fcn_list(k).(fcn_names{f}) = obj.(fcn_names{f});
         end
      end
   end
   
end
delete(hFig);