--- a +++ b/functions/adminfunc/eeglab_execmenu.m @@ -0,0 +1,101 @@ +% EEGLAB_EXECMENU - function called to execute EEGLAB menu +% +% Usage: +% eeglab_execmenu(label, func, parameter); +% +% Inputs: +% label - [string] label of the menu +% func - [string] name of the pop function. The function extract the +% callback from the menu, find the function and add the +% parameters below before executing the callback. +% parameter - [cell] parameter to the function (in addition to existing +% parameters. +% +% Output: the command is executed in the global workspace. Usually the +% EEG structure is affected. +% +% Author: Arnaud Delorme, SCCN/INC/UCSD, 2022 +% +% See also: EEGLAB + +% Copyright (C) 2022 Arnaud Delorme +% +% This file is part of EEGLAB, see http://www.eeglab.org +% for the documentation and details. +% +% Redistribution and use in source and binary forms, with or without +% modification, are permitted provided that the following conditions are met: +% +% 1. Redistributions of source code must retain the above copyright notice, +% this list of conditions and the following disclaimer. +% +% 2. Redistributions in binary form must reproduce the above copyright notice, +% this list of conditions and the following disclaimer in the documentation +% and/or other materials provided with the distribution. +% +% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +% THE POSSIBILITY OF SUCH DAMAGE. + +function eeglab_execmenu(label, func, parameters) + +if nargin < 3 + fprintf(2, 'This function requires 3 inputs\n') + help eeglab_execmenu; + return +end + +% find figure +W_MAIN = findobj('tag', 'EEGLAB'); +if isempty(W_MAIN) + error('EEGLAB figure not found'); +end + +% find menu +menuhandle = findobj(W_MAIN, 'Label', label); +if isempty(menuhandle) + error('Could not find menu with label ''%s''', label); +end + +% check if menu contains command +cb = get(menuhandle, 'callback'); +if iscell(cb) + if contains(cb{1}, func) + cb = cb{1}; + else + cb = cb{end}; + end +end +ind = strfind(cb, func); +if length(ind) ~= 1 + fprintf(2, 'Menu with label ''%s'' found, but the callback does not contain the string ''%s''\n', label, func); + ind = ind(end); +end + +% extract callback and add parameters +if ~isempty(parameters) + if cb(ind+length(func)) == ';' + cb = [ cb(1:ind+length(func)-1) '()' cb(ind+length(func):end) ]; + end + indEnd = find(cb(ind:end) == ')'); + indEnd = indEnd(1); + if cb(ind+indEnd-2) == '(' % no parameter before + addDelim = ''; + else + addDelim = ','; + end + cb = [cb(1:ind+indEnd-2) addDelim vararg2str(parameters) cb(ind+indEnd-1) cb(ind+indEnd:end)]; +end + +% execute in global workspace (as menu would) +evalin('base', 'DEBUG_EEGLAB_MENUS = true;'); +evalin('base', cb); +evalin('base', 'clear DEBUG_EEGLAB_MENUS;');