function theResult = guido(theStruct, theFigureName, isModal, thePrecision)
% guido -- Get info via Matlab struct.
% guido('demo') demonstrates itself, using the commands
% given below.
% guido(theStruct, 'theFigureName') presents a dialog
% representing the fieldnames and values of theStruct,
% a Matlab "struct" which must be compatible with
% "getinfo" and "setinfo". If theStruct contains
% embedded structs, nested dialogs are produced for
% them as needed. The empty-matrix [] is returned
% if the main "Cancel" button is pressed. Also, use
% "Cancel" to escape a sub-dialog without saving its
% most recent changes. Fields named "help_..." are
% shown in a separate dialog. If theFigureName is
% not given or is empty, the external name of
% theStruct will be used.
% guido(theStruct, 'theFigureName', isModal) uses modal
% dialogs on non-PCWIN machines if "isModal" evaluates
% to logical(1) TRUE. The default is to use non-modal
% dialogs, which allows interactions with other windows,
% except the Matlab command window. In either case, the
% the routine prevents dialogs from being dismissed out
% of sequence.
% guido(theStruct, 'theFigureName', isModal, thePrecision)
% uses thePrecision (default = 4) when displaying numbers
% in an "edit" control.
%
% Commands used in the demonstration:
%
% s.help = help(mfilename);
% s.anEdit = 'some text';
% s.aNumber = pi;
% s.aCheckbox = {'checkbox' 0};
% s.aRadiobutton = {'radiobutton' 0};
% s.aPopupmenu = {{'red', 'blue', 'green'}, 1};
% s.aSubdialog.aPopupmenu = {{10 20 30}, 1};
% guido(s, [mfilename ' demo'])
% Note: the present m-file can be renamed without
% requiring any changes to the Matlab code itself.
% Copyright (C) 1999 Dr. Charles R. Denham, ZYDECO.
% All Rights Reserved.
% Disclosure without explicit written consent from the
% copyright owner does not constitute publication.
% Version of 15-Dec-1999 13:39:54.
% Updated 25-Jan-2000 11:47:42.
persistent CURRENT_STRUCT
persistent CURRENT_FIGURES
LF = char(10);
CR = char(13);
CRLF = [CR LF];
BABY_BLUE = [8 10 10]/10;
if nargout > 0, theResult = []; end
% Launch a demo if this is not a callback.
if nargin < 1 & isempty(gcbo)
help(mfilename)
ans = feval(mfilename, 'demo');
if nargout > 0
theResult = CURRENT_STRUCT;
else
assignin('caller', 'ans', CURRENT_STRUCT)
end
return
end
% Do the demo.
if nargin > 0 & isequal(theStruct, 'demo')
if nargin < 2, theFigureName = [mfilename ' demo']; end
s = [];
s.help = help(mfilename);
s.anEdit = 'some text';
s.aNumber = pi;
s.aCheckbox = {'checkbox' 0};
s.aRadiobutton = {'radiobutton' 0};
s.aPopupmenu = {{'red', 'blue', 'green'}, 1};
s.aSubdialog.aPopupmenu = {{10 20 30}, 1};
% s.aSubdialog.bSubdialog.bPopupmenu = {{100 200 300}, 1};
disp(s)
assign([mfilename '_demo'], s)
result = feval(mfilename, eval([mfilename '_demo']), '', 0);
assign([mfilename '_result'], result)
if ~isempty(eval([mfilename '_result']))
result = feval(mfilename, eval([mfilename '_result']), '', 0);
assign([mfilename '_result'], result)
end
if nargout > 0
assign('theResult', [mfilename '_result'])
end
return
end
if nargin > 0 & ischar(theStruct)
theCommand = lower(theStruct);
end
if 0 & nargin > 0 & ischar(theStruct)
switch theCommand
case '_keypress_'
theKey = get(gcbf, 'CurrentCharacter');
if any(abs(theKey) < 32)
theCommand = '_okay_';
end
end
end
% Dismiss dialogs in sequence.
if nargin > 0 & ischar(theStruct)
switch theCommand
case {'_okay_', '_cancel_'}
CURRENT_FIGURES(~ishandle(CURRENT_FIGURES)) = [];
if ~isempty(CURRENT_FIGURES) & gcbf ~= CURRENT_FIGURES(end)
figure(CURRENT_FIGURES(end))
h = helpdlg('Dismiss dialogs in sequence.', 'Please...');
tic
while ishandle(h) & toc < 3
drawnow
end
if ishandle(h), delete(h), end
return
end
end
end
% Process a command: okay or cancel.
if nargin > 0 & ischar(theStruct)
switch theCommand
case '_okay_'
CURRENT_STRUCT = get(gcbf, 'UserData');
theControls = findobj(gcbf, 'Type', 'uicontrol', 'Tag', mfilename);
theControls = sort(theControls);
for i = 2:2:length(theControls)
theField = get(theControls(i-1), 'String');
theControl = theControls(i);
theStyle = get(theControl, 'Style');
switch theStyle
case 'pushbutton'
okay = 0;
case 'checkbox'
theValue = get(theControl, 'Value');
okay = 1;
case 'radiobutton'
theValue = get(theControl, 'Value');
okay = 1;
case 'edit'
if isequal(theField, 'help')
okay = 0;
else
theValue = eval(get(theControl, 'String'));
okay = 1;
end
case 'popupmenu'
theValue = get(theControl, 'Value');
okay = 1;
otherwise
okay = 0;
warning([' ## Unsupported control style: ' theStyle])
end
if okay
CURRENT_STRUCT = setinfo(CURRENT_STRUCT, theField, theValue);
end
end
if ~isempty(CURRENT_FIGURES) & any(CURRENT_FIGURES == gcbf)
CURRENT_FIGURES(CURRENT_FIGURES == gcbf) = [];
end
delete(gcbf)
case '_cancel_'
CURRENT_STRUCT = [];
if ~isempty(CURRENT_FIGURES) & any(CURRENT_FIGURES == gcbf)
CURRENT_FIGURES(CURRENT_FIGURES == gcbf) = [];
end
delete(gcbf)
otherwise
disp([' ## Unknown command: ' theCommand])
end
return
end
% Build the dialog if it does not already exist.
if nargin > 0 & isstruct(theStruct)
theStruct = setinfo(theStruct);
if nargin < 2 | isempty(theFigureName)
theFigureName = inputname(1);
if isempty(theFigureName)
theFigureName = 'unnamed';
end
end
if isempty(theFigureName), theFigureName = mfilename; end
f = findobj('Type', 'figure', 'Name', theFigureName, 'Tag', mfilename);
if any(f)
figure(f)
return
end
if nargin < 3, isModal = 0; end
if nargin < 4, thePrecision = 4; end
if all(isModal(:)) & ~any(findstr(computer, 'PCWIN'))
theWindowStyle = 'modal';
else
theWindowStyle = 'normal';
end
theFigures = findobj('Type', 'figure', 'Tag', mfilename);
theFigure = figure( ...
'Name', theFigureName, ...
'WindowStyle', theWindowStyle, ...
'Visible', 'off', ...
'KeyPressFcn', [mfilename ' _keypress_'], ...
'CloseRequestFcn', [mfilename ' _cancel_'], ...
'Tag', mfilename);
if any(theFigures)
pos = get(theFigures(1), 'Position');
left = pos(1);
top = pos(2) + pos(4);
for i = 2:length(theFigures)
p = get(theFigures(i), 'Position');
left = max(pos(1), p(1));
top = min(top, p(2) + p(4));
end
thePosition = get(theFigure, 'Position');
thePosition(1) = left + 20;
thePosition(2) = top - thePosition(4) - 20;
set(theFigure, 'Position', thePosition)
end
theFrame = uicontrol( ...
'Style', 'frame', ...
'Units', 'normalized', ...
'Position', [0 0 1 1], ...
'BackgroundColor', BABY_BLUE);
theControls = [];
theStruct = setinfo(theStruct); % Canonical form.
theFields = fieldnames(theStruct);
for i = 1:length(theFields)
theField = theFields{i};
theValue = getfield(theStruct, theField);
switch class(theValue)
case 'cell'
switch class(theValue{1})
case 'cell'
if length(theValue) > 1
theSetting = theValue{2};
else
theSetting = 1;
theValue = {theValue, theSetting};
theStruct = setfield(theStruct, theField, theValue);
end
theStyle = 'popupmenu';
case 'char'
switch theValue{1}
case 'checkbox'
theStyle = 'checkbox';
if length(theValue) > 1
theSetting = theValue{2};
else
theSetting = 0;
end
case 'radiobutton'
theStyle = 'radiobutton';
if length(theValue) > 1
theSetting = theValue{2};
else
theSetting = 0;
end
otherwise
error([' ## Incompatible control style: ' theValue{1}])
end
end
theControls(end+1) = uicontrol( ...
'Style', 'text', ...
'String', theField);
theControls(end+1) = uicontrol( ...
'Style', theStyle, ...
'String', theValue{1}, ...
'Value', theSetting);
case 'char'
f = findstr(theField, 'help_');
if ~any(f) | f(1) ~= 1
theControls(end+1) = uicontrol( ...
'Style', 'text', ...
'String', theField);
theControls(end+1) = uicontrol( ...
'Style', 'edit', ...
'Max', 1000, ...
'String', ['''' theValue '''']);
else
theHintName = [theField ' ' theFigureName];
theCallback = ...
['hint(get(gcbo, ''UserData''), ''' theHintName ''')'];
theControls(end+1) = uicontrol( ...
'Style', 'text', ...
'String', theField);
theControls(end+1) = uicontrol( ...
'Style', 'pushbutton', ...
'Callback', theCallback, ...
'UserData', theValue, ...
'String', 'Help...');
end
case 'double'
theControls(end+1) = uicontrol( ...
'Style', 'text', ...
'String', theField);
theControls(end+1) = uicontrol( ...
'Style', 'edit', ...
'Max', 1000, ...
'String', mat2str(theValue, thePrecision));
case 'struct'
theCallback = ...
[mfilename '(get(gcbo, ''UserData''), ''' theField ''')'];
theControls(end+1) = uicontrol( ...
'Style', 'text', ...
'String', theField);
theControls(end+1) = uicontrol( ...
'Style', 'pushbutton', ...
'String', 'More...', ...
'Callback', theCallback, ...
'UserData', theValue);
otherwise
disp(class(theValue))
error([' ## Incompatible data type. ' class(theValue)])
end
end
set(theControls(1:2:end), ...
'HorizontalAlignment', 'right', ...
'BackgroundColor', BABY_BLUE)
theControls(end+1) = uicontrol( ...
'Style', 'pushbutton', ...
'String', 'Cancel', ...
'BackgroundColor', [10 2 2]/10, ...
'Callback', [mfilename ' _cancel_']);
theControls(end+1) = uicontrol( ...
'Style', 'pushbutton', ...
'String', 'Okay', ...
'BackgroundColor', [2 10 2]/10, ...
'Callback', [mfilename ' _okay_']);
set(theControls, 'Tag', mfilename)
theLayout = [];
for i = 1:length(theControls)/2
theLayout = [(1:2:length(theControls));
(2:2:length(theControls))].';
end
theLayout = theLayout(:, [1 2 2]);
uilayout(theControls, theLayout, [1 1 18 18]/20)
pos = get(0, 'DefaultUIControlPosition');
width = pos(3) * 6;
height = 0.5 * length(theControls) * pos(4) * 20 / 15;
thePosition = get(theFigure, 'Position');
thePosition(2) = thePosition(2) + thePosition(4) - height;
thePosition(3) = width;
thePosition(4) = height;
set(theFigure, 'Position', thePosition, 'Visible', 'on', ...
'UserData', theStruct)
if any(CURRENT_FIGURES)
CURRENT_FIGURES(~ishandle(CURRENT_FIGURES)) = [];
end
CURRENT_FIGURES(end+1) = theFigure;
% Wait here for the new figure to be deleted. By then, it will
% already have placed its contents in the persistent CURRENT_STRUCT
% item.
waitfor(theFigure)
% Now get the new info from CURRENT_STRUCT and update.
theNewStruct = CURRENT_STRUCT;
theFieldName = theFigureName;
if length(theFigures) < 1
theStruct = theNewStruct;
else
theFigure = gcf;
theStruct = get(theFigure, 'UserData');
if ~isfield(theStruct, theFieldName) & ~isequal(theField, 'help')
disp([' ## No such field: ' theField])
elseif ~isempty(theNewStruct)
theStruct = setfield(theStruct, theFieldName, theNewStruct);
set(theFigure, 'UserData', theStruct)
f = findobj(theFigure, 'Type', 'uicontrol', 'Tag', mfilename);
f = sort(f);
for i = 2:2:length(f)
theField = get(f(i-1), 'String');
if isequal(theField, theFieldName)
set(f(i), 'UserData', theNewStruct)
break
end
end
end
end
if nargout > 0
theResult = theStruct;
else
assignin('caller', 'ans', theStruct);
end
end
% ---------- assign ----------%
function assign(theName, theValue)
% assign -- Assign a value to a name.
% assign('theName', theValue) assigns theValue
% to 'theName' in the caller's workspace. It
% avoids the need to construct an explicit
% assignment statement to be eval-ed.
% Copyright (C) 1997 Dr. Charles R. Denham, ZYDECO.
% All Rights Reserved.
% Disclosure without explicit written consent from the
% copyright owner does not constitute publication.
% Version of 28-May-1998 00:43:58.
if nargin < 2, help(mfilename), return, end
% The following scheme permits the assignment
% of items that have complicated subscripts,
% such as "a{1}(2).b{3}.c = pi".
hasAns = (evalin('caller', 'exist(''ans'', ''var'')') == 1);
if hasAns
ans = evalin('caller', 'ans'); % Save.
end
assignin('caller', 'ans', theValue)
evalin('caller', [theName ' = ans;'])
evalin('caller', 'clear(''ans'')')
if hasAns
assignin('caller', 'ans', ans) % Restore.
end
% ---------- getinfo ----------%
function [theResult, isOkay] = getinfo(theInfo, theField)
% getinfo -- Get field value from an "Info" struct.
% getinfo(theInfo, 'theField') returns the current
% value of 'theField' in theInfo, a struct that
% is compatible with the "uigetinfo" function.
% Non-existent fields return the empty-matrix.
% [theResult, isOkay] = ... returns isOkay = 0
% if an error occurred; otherwise, non-zero.
% getinfo(theInfo) returns a struct containing
% the fields and current selections of theInfo.
% Copyright (C) 1997 Dr. Charles R. Denham, ZYDECO.
% All Rights Reserved.
% Disclosure without explicit written consent from the
% copyright owner does not constitute publication.
% Version of 07-Feb-1998 09:45:56.
% Updated 14-Nov-2001 15:07:51.
if nargout > 0, theResult = []; end
if nargin < 1, help(mfilename), return, end
% Get current selections, recursively if needed.
if nargin < 2
result = theInfo;
theFields = fieldnames(result);
isOkay = 1;
for i = 1:length(theFields)
[theValue, okay] = getinfo(theInfo, theFields{i});
isOkay = isOkay & okay;
switch class(theValue)
case 'struct'
[res, okay] = getinfo(theValue);
isOkay = isOkay & okay;
result = setfield(result, theFields{i}, res);
otherwise
result = setfield(result, theFields{i}, theValue);
end
end
if nargout > 0
theResult = result;
else
disp(result)
end
return
end
% Note: Matlab 6+ does not allow "getfield(a, 'b.c')",
% unlike previous versions. We need to parse the
% 'b.c' ourselves, then call "getfield(a, 'b', 'c')".
if ischar(theField) & any(theField == '.')
theField = [theField '.'];
f = find(theField == '.');
theParts = cell(1, length(f));
k = 0;
for i = 1:length(f)
theParts{i} = theField(k+1:f(i)-1);
k = f(i);
end
theField = theParts;
elseif ~iscell(theField)
theField = {theField};
end
theValue = [];
isOkay = 1;
% eval('theValue = getfield(theInfo, theField);', 'isOkay = 0;');
eval('theValue = getfield(theInfo, theField{:});', 'isOkay = 0;');
result = theValue;
if all(isOkay)
switch class(theValue)
case 'cell'
if isequal(theValue{1}, 'checkbox') | ...
isequal(theValue{1}, 'radiobutton')
if length(theValue) < 2, theValue{2} = 0; end
result = theValue{2};
else
if ~iscell(theValue{1}), theValue = {theValue{1}}; end
if length(theValue) < 2, theValue{2} = 1; end
result = theValue{1}{theValue{2}};
end
otherwise
result = theValue;
end
end
if nargout > 0
theResult = result;
else
disp(result)
end
% ---------- setinfo ----------%
function [theResult, isOkay] = setinfo(theInfo, theField, theValue)
% setinfo -- Set field value in an "Info" struct.
% setinfo(theInfo, 'theField', theValue) updates
% 'theField' to theValue in theInfo, a struct
% that is compatible with the "uigetinfo" function.
% If 'theField' does not exist, it will be created
% to receive theValue.
% [theResult, isOkay] = ... returns isOkay = 0
% if an error occurred; otherwise, non-zero.
% setinfo(theInfo, 'theField') invokes "getinfo".
% setinfo(theInfo) adjusts theInfo to canonical
% form.
% Copyright (C) 1997 Dr. Charles R. Denham, ZYDECO.
% All Rights Reserved.
% Disclosure without explicit written consent from the
% copyright owner does not constitute publication.
% Version of 07-Feb-1998 09:45:56.
% Updated 14-Nov-2001 15:21:24.
if nargout > 0, theResult = []; end
if nargin < 1, help(mfilename), return, end
% Put all fields into canonical form.
if nargin < 2
result = theInfo;
theFields = fieldnames(result);
isOkay = 1;
for i = 1:length(theFields)
theValue = getfield(result, theFields{i});
switch class(theValue)
case 'struct'
[res, okay] = setinfo(theValue);
isOkay = isOkay & okay;
result = setfield(result, theFields{i}, res);
case 'cell'
if length(theValue) == 1 & ...
(isequal(theValue{1}, 'radiobutton') | ...
isequal(theValue{1}, 'checkbox'))
theValue{2} = 0;
result = setfield(result, theFields{i}, theValue);
elseif length(theValue) == 1 & iscell(theValue{1})
theValue{2} = 1;
result = setfield(result, theFields{i}, theValue);
elseif ~isequal(theValue{1}, 'radiobutton') & ...
~isequal(theValue{1}, 'checkbox')
theValue{1} = {theValue{1}};
theValue{2} = 1;
else
theValue;
end
otherwise
end
end
if nargout > 0, theResult = result; end
return
end
[theVal, isOkay] = getinfo(theInfo, theField);
if nargin == 2
if nargout > 0
theResult = theVal;
else
disp(theVal)
end
return
end
if ischar(theField) & any(theField == '.')
theField = [theField '.'];
f = find(theField == '.');
theParts = cell(1, length(f));
k = 0;
for i = 1:length(f)
theParts{i} = theField(k+1:f(i)-1);
k = f(i);
end
theField = theParts;
elseif ~iscell(theField)
theField = {theField};
end
result = theInfo;
if ~all(isOkay) % Create a new field.
isOkay = 1;
% eval('result = setfield(theInfo, theField, theValue);', 'isOkay = 0;');
eval('result = setfield(theInfo, theField{:}, theValue);', 'isOkay = 0;');
else % Update an existing field.
isokay = 1;
% eval('theVal = getfield(theInfo, theField);', 'isOkay = 0;');
eval('theVal = getfield(theInfo, theField{:});', 'isOkay = 0;');
if ~isOkay, theVal = []; end
switch class(theVal)
case 'cell'
if isequal(theVal{1}, 'checkbox') | isequal(theVal{1}, 'radiobutton')
% Do nothing.
elseif ~iscell(theVal{1})
theVal{1} = {theVal{1}};
theVal{2} = 1;
end
end
switch class(theVal)
case 'cell'
if isequal(theVal{1}, 'checkbox') | isequal(theVal{1}, 'radiobutton')
theVal{2} = any(any(theValue));
else
switch class(theValue)
case 'double'
if theValue > 0 & theValue <= length(theVal{1})
theVal{2} = theValue;
end
otherwise
flag = 0;
for i = 1:length(theVal{1})
if isequal(theVal{1}{i}, theValue)
theVal{2} = i;
flag = 1
end
end
if ~any(flag) % Append.
theVal{1} = [theVal(:); {theValue}];
theVal{2} = length(theVal{1});
end
end
% else
% theVal{1} = [{theValue}; theVal(:)];
end
otherwise
theVal = theValue;
end
isOkay = 1;
% eval('result = setfield(theInfo, theField, theVal);', 'isOkay = 0;');
eval('result = setfield(theInfo, theField{:}, theVal);', 'isOkay = 0;');
end
if nargout > 0
theResult = result;
else
disp(result)
end
% ---------- uilayout ----------%
function theResult = uilayout(theControls, theLayout, thePosition)
% uilayout -- Layout for ui controls.
% uilayout(theControls, theLayout) positions theControls
% according to theLayout, an array whose entries, taken
% in sorted order, define the rectangular extents occupied
% by each control. TheLayout defaults to a simple vertical
% arrangement of theControls. A one-percent margin is
% imposed between controls. To define a layout region
% containing no control, use Inf.
% uilayout(..., thePosition) confines the controls to the
% given normalized position of the figure. This syntax
% is useful for embedding controls within a frame.
% uilayout (no argument) demonstrates itself.
% Copyright (C) 1997 Dr. Charles R. Denham, ZYDECO.
% All Rights Reserved.
% Disclosure without explicit written consent from the
% copyright owner does not constitute publication.
% Version of 18-Apr-1997 08:07:54.
% Updated 27-Dec-1999 06:03:57.
if nargin < 1, theControls = 'demo'; help(mfilename), end
if strcmp(theControls, 'demo')
theLayout = [1 2;
3 4;
5 Inf;
5 6;
5 Inf;
7 8;
9 10;
11 12;
13 14];
[m, n] = size(theLayout);
thePos = get(0, 'DefaultUIControlPosition');
theSize = [n+2 m+2] .* thePos(3:4);
theFigure = figure('Name', 'UILayout', ...
'NumberTitle', 'off', ...
'Resize', 'off', ...
'Units', 'pixels');
thePos = get(theFigure, 'Position');
theTop = thePos(2) + thePos(4);
thePos = thePos .* [1 1 0 0] + [0 0 theSize];
thePos(2) = theTop - (thePos(2) + thePos(4));
set(theFigure, 'Position', thePos);
theFrame = uicontrol('Style', 'frame', ...
'Units', 'normalized', ...
'Position', [0 0 1 1], ...
'BackgroundColor', [0.5 1 1]);
theStyles = {'checkbox'; 'text'; ...
'edit'; 'text'; ...
'listbox'; 'text'; ...
'popupmenu'; 'text'; ...
'pushbutton'; 'text'; ...
'radiobutton'; 'text'; ...
'text'; 'text'};
theStrings = {'Anchovies?', '<-- CheckBox --', ...
'Hello World!', '<-- Edit --', ...
{'Now', 'Is', 'The' 'Time' 'For' 'All' 'Good', ...
'Men', 'To', 'Come' 'To' 'The' 'Aid' 'Of', ...
'Their' 'Country'}, ...
'<-- ListBox --', ...
{'Cheetah', 'Leopard', 'Lion', 'Tiger', 'Wildcat'}, ...
'<-- PopupMenu --', ...
'Okay', '<-- PushButton --', ...
'Cream?', '<-- RadioButton --', ...
'UILayout', '<-- Text --'};
theControls = zeros(size(theStyles));
for i = 1:length(theStyles)
theControls(i) = uicontrol('Style', theStyles{i}, ...
'String', theStrings{i}, ...
'Callback', ...
'disp(int2str(get(gcbo, ''Value'')))');
end
set(theControls(1:2:length(theControls)), 'BackGroundColor', [1 1 0.5])
set(theControls(2:2:length(theControls)), 'BackGroundColor', [0.5 1 1])
thePosition = [1 1 98 98] ./ 100;
uilayout(theControls, theLayout, thePosition)
set(theFrame, 'UserData', theControls)
theStyles, theLayout, thePosition
if nargout > 0, theResult = theFrame; end
return
end
if nargin < 2, theLayout = (1:length(theControls)).'; end
if nargin < 3, thePosition = [0 0 1 1]; end
a = theLayout(:);
a = a(finite(a));
a = sort(a);
a(diff(a) == 0) = [];
b = zeros(size(theLayout));
for k = 1:length(a)
b(theLayout == a(k)) = k;
end
[m, n] = size(theLayout);
set(theControls, 'Units', 'Normalized')
theMargin = [1 1 -2 -2] ./ 100;
for k = 1:min(length(theControls), length(a))
[i, j] = find(b == k);
xmin = (min(j) - 1) ./ n;
xmax = max(j) ./ n;
ymin = 1 - max(i) ./ m;
ymax = 1 - (min(i) - 1) ./ m;
thePos = [xmin ymin (xmax-xmin) (ymax-ymin)] + theMargin;
thePos = thePos .* thePosition([3 4 3 4]);
thePos(1:2) = thePos(1:2) + thePosition(1:2);
set(theControls(k), 'Position', thePos);
end
if nargout > 0, theResult = theControls; end
% ---------- hint ----------%
function theResult = hint(theText, theFigureName)
% hint -- Post a message.
% hint('theText', 'theFigureName') posts 'theText' in the
% figure named 'theFigureName', which will be created if
% it does not already exist. The text can be a string
% separated by newlines, or a cell of strings.
% hint('demo') demonstrates itself.
% Copyright (C) 1999 Dr. Charles R. Denham, ZYDECO.
% All Rights Reserved.
% Disclosure without explicit written consent from the
% copyright owner does not constitute publication.
% Version of 17-Dec-1999 11:31:03.
% Updated 04-Jan-2000 13:40:41.
if nargin < 1, theText = 'demo'; end
if isequal(theText, 'demo')
hint(help(mfilename), 'Hint Hint')
return
end
CR = char(13);
LF = char(10);
CRLF = [CR LF];
if nargout > 0, theResult = []; end
if nargin < 1
help(mfilename)
theText = help(mfilename);
for i = 1:3
theText = [theText theText];
end
end
if nargin < 2, theFigureName = 'Help'; end
if min(size(theText)) == 1
theText = theText(:).';
end
if ischar(theText) & size(theText, 1) == 1
theText = strrep(theText, CRLF, CR);
theText = strrep(theText, LF, CR);
if theText(end) ~= CR, theText(end+1) = CR; end
if theText(1) ~= CR, theText = [CR theText]; end
f = find(theText == CR);
if any(f)
s = cell(length(f)-1, 1);
for i = 1:length(f)-1
if f(i)+1 < f(i+1)-1
s{i} = theText(f(i)+1:f(i+1)-1);
else
s{i} = ' ';
end
end
theText = s;
end
end
theLineCount = size(theText, 1);
theFigure = findobj( ...
'Type', 'figure', ...
'Name', theFigureName, ...
'Tag', [mfilename ' hint'] ...
);
if isempty(theFigure)
theFigures = findobj('Type', 'figure');
if any(theFigures)
thePosition = get(gcf, 'Position');
left = thePosition(1);
top = thePosition(2) + thePosition(4);
end
theFigure = figure( ...
'Name', theFigureName, ...
'Tag', mfilename, ...
'Visible', 'off' ...
);
if any(theFigures)
set(theFigure, 'Position', thePosition + [20 -20 0 0])
end
end
delete(get(theFigure, 'Children'))
theColor = [9 9 9]/10;
theFontName = 'Courier';
if any(findstr(lower(computer), 'mac'))
theFontName = 'Monaco';
end
theFontSize = 12;
theListBox = uicontrol( ...
theFigure, ...
'Style', 'listbox', ...
'String', theText, ...
'FontName', theFontName, ...
'FontSize', theFontSize, ...
'HorizontalAlignment', 'left', ...
'BackgroundColor', theColor ...
);
uilayout(theListBox, 1)
set(theFigure, 'Visible', 'on')
figure(theFigure)
if nargout > 0
theResult = theFigure;
end