373 lines
12 KiB
Matlab
Executable File
373 lines
12 KiB
Matlab
Executable File
function ButtonName=questdlg(Question,Title,Btn1,Btn2,Btn3,Default)
|
|
% QUESTDLG Question dialog box.
|
|
% ButtonName=QUESTDLG(Question) creates a modal dialog box that
|
|
% automatically wraps the cell array or string (vector or matrix)
|
|
% Question to fit an appropriately sized window. The name of the
|
|
% button that is pressed is returned in ButtonName. The Title of
|
|
% the figure may be specified by adding a second string argument:
|
|
%
|
|
% ButtonName=questdlg(Question, Title)
|
|
%
|
|
% Question will be interpreted as a normal string.
|
|
%
|
|
% QUESTDLG uses UIWAIT to suspend execution until the user responds.
|
|
%
|
|
% The default set of buttons names for QUESTDLG are 'Yes','No' and
|
|
% 'Cancel'. The default answer for the above calling syntax is 'Yes'.
|
|
% This can be changed by adding a third argument which specifies the
|
|
% default Button:
|
|
%
|
|
% ButtonName=questdlg(Question, Title, 'No')
|
|
%
|
|
% Up to 3 custom button names may be specified by entering
|
|
% the button string name(s) as additional arguments to the function
|
|
% call. If custom button names are entered, the default button
|
|
% must be specified by adding an extra argument, DEFAULT, and
|
|
% setting DEFAULT to the same string name as the button you want
|
|
% to use as the default button:
|
|
%
|
|
% ButtonName=questdlg(Question, Title, Btn1, Btn2, DEFAULT);
|
|
%
|
|
% where DEFAULT is set to Btn1. This makes Btn1 the default answer.
|
|
% If the DEFAULT string does not match any of the button string names,
|
|
% a warning message is displayed.
|
|
%
|
|
% To use TeX interpretation for the Question string, a data
|
|
% structure must be used for the last argument, i.e.
|
|
%
|
|
% ButtonName=questdlg(Question, Title, Btn1, Btn2, OPTIONS);
|
|
%
|
|
% The OPTIONS structure must include the fields Default and Interpreter.
|
|
% Interpreter may be 'none' or 'tex' and Default is the default button
|
|
% name to be used.
|
|
%
|
|
% If the dialog is closed without a valid selection, the return value
|
|
% is empty.
|
|
%
|
|
% Example:
|
|
%
|
|
% ButtonName=questdlg('What is your favorite color?', ...
|
|
% 'Color Question', ...
|
|
% 'Red', 'Green', 'Blue', 'Green');
|
|
% switch ButtonName,
|
|
% case 'Red',
|
|
% disp('Your favorite color is Red');
|
|
% case 'Blue',
|
|
% disp('Your favorite color is Blue.')
|
|
% case 'Green',
|
|
% disp('Your favorite color is Green.');
|
|
% end % switch
|
|
%
|
|
% See also DIALOG, ERRORDLG, HELPDLG, INPUTDLG, LISTDLG,
|
|
% MSGBOX, WARNDLG, FIGURE, TEXTWRAP, UIWAIT, UIRESUME.
|
|
% Copyright 1984-2010 The MathWorks, Inc.
|
|
% $Revision: 5.55.4.17 $
|
|
|
|
if nargin<1
|
|
error('MATLAB:questdlg:TooFewArguments', 'Too few arguments for QUESTDLG');
|
|
end
|
|
|
|
Interpreter='none';
|
|
Question=dialogCellstrHelper(Question);
|
|
|
|
% General Information
|
|
Black =[0 0 0 ]/255;
|
|
% LightGray =[192 192 192 ]/255;
|
|
% LightGray2 =[160 160 164 ]/255;
|
|
% MediumGray =[128 128 128 ]/255;
|
|
% White =[255 255 255 ]/255;
|
|
|
|
% Nargin Check
|
|
if nargout>1
|
|
error('MATLAB:questdlg:WrongNumberOutputs', 'Wrong number of output arguments for QUESTDLG');
|
|
end
|
|
|
|
if nargin==1,Title=' ';end
|
|
if nargin<=2, Default='Yes';end
|
|
if nargin==3, Default=Btn1 ;end
|
|
if nargin<=3, Btn1='Yes'; Btn2='No'; Btn3='Cancel';NumButtons=3;end
|
|
if nargin==4, Default=Btn2;Btn2=[];Btn3=[];NumButtons=1;end
|
|
if nargin==5, Default=Btn3;Btn3=[];NumButtons=2;end
|
|
if nargin==6, NumButtons=3;end
|
|
if nargin>6
|
|
error('MATLAB:questdlg:TooManyInputs', 'Too many input arguments');NumButtons=3; %#ok
|
|
end
|
|
|
|
if isstruct(Default),
|
|
Interpreter=Default.Interpreter;
|
|
Default=Default.Default;
|
|
end
|
|
|
|
% Create QuestFig
|
|
FigPos=get(0,'DefaultFigurePosition');
|
|
FigPos(3)=267;
|
|
FigPos(4)=70;
|
|
FigPos=getnicedialoglocation(FigPos, get(0,'DefaultFigureUnits'));
|
|
|
|
QuestFig=dialog(...
|
|
'Visible' ,'off', ...
|
|
'Name' ,Title, ...
|
|
'Pointer' ,'arrow', ...
|
|
'Position' ,FigPos, ...
|
|
'KeyPressFcn' ,@doFigureKeyPress, ...
|
|
'IntegerHandle' ,'off', ...
|
|
'WindowStyle' ,'normal', ...
|
|
'HandleVisibility','callback', ...
|
|
'CloseRequestFcn' ,@doDelete, ...
|
|
'Tag' ,Title ...
|
|
);
|
|
|
|
% Set Positions
|
|
DefOffset =10;
|
|
IconWidth =54;
|
|
IconHeight =54;
|
|
IconXOffset=DefOffset;
|
|
IconYOffset=FigPos(4)-DefOffset-IconHeight; %#ok
|
|
IconCMap=[Black;get(QuestFig,'Color')]; %#ok
|
|
DefBtnWidth =56;
|
|
BtnHeight =22;
|
|
BtnYOffset=DefOffset;
|
|
BtnWidth=DefBtnWidth;
|
|
ExtControl=uicontrol(...
|
|
QuestFig , ...
|
|
'Style' ,'pushbutton', ...
|
|
'String' ,' ' ...
|
|
);
|
|
btnMargin=1.4;
|
|
set(ExtControl,'String',Btn1);
|
|
BtnExtent=get(ExtControl,'Extent');
|
|
BtnWidth=max(BtnWidth,BtnExtent(3)+8);
|
|
if NumButtons > 1
|
|
set(ExtControl,'String',Btn2);
|
|
BtnExtent=get(ExtControl,'Extent');
|
|
BtnWidth=max(BtnWidth,BtnExtent(3)+8);
|
|
if NumButtons > 2
|
|
set(ExtControl,'String',Btn3);
|
|
BtnExtent=get(ExtControl,'Extent');
|
|
BtnWidth=max(BtnWidth,BtnExtent(3)*btnMargin);
|
|
end
|
|
end
|
|
BtnHeight=max(BtnHeight,BtnExtent(4)*btnMargin);
|
|
delete(ExtControl);
|
|
MsgTxtXOffset=IconXOffset+IconWidth;
|
|
FigPos(3)=max(FigPos(3),MsgTxtXOffset+NumButtons*(BtnWidth+2*DefOffset));
|
|
set(QuestFig,'Position',FigPos);
|
|
BtnXOffset=zeros(NumButtons,1);
|
|
if NumButtons==1,
|
|
BtnXOffset=(FigPos(3)-BtnWidth)/2;
|
|
elseif NumButtons==2,
|
|
BtnXOffset=[MsgTxtXOffset FigPos(3)-DefOffset-BtnWidth];
|
|
elseif NumButtons==3,
|
|
BtnXOffset=[MsgTxtXOffset 0 FigPos(3)-DefOffset-BtnWidth];
|
|
BtnXOffset(2)=(BtnXOffset(1)+BtnXOffset(3))/2;
|
|
end
|
|
MsgTxtYOffset=DefOffset+BtnYOffset+BtnHeight;
|
|
|
|
% Calculate current msg text width and height. If negative,
|
|
% clamp it to 1 since its going to be recalculated/corrected later
|
|
% based on the actual msg string
|
|
MsgTxtWidth=max(1, FigPos(3)-DefOffset-MsgTxtXOffset-IconWidth);
|
|
MsgTxtHeight=max(1, FigPos(4)-DefOffset-MsgTxtYOffset);
|
|
MsgTxtForeClr=Black;
|
|
MsgTxtBackClr=get(QuestFig,'Color');
|
|
CBString='uiresume(gcbf)';
|
|
DefaultValid=false;
|
|
DefaultWasPressed=false;
|
|
BtnHandle=cell(NumButtons, 1);
|
|
DefaultButton=0;
|
|
|
|
% Check to see if the Default string passed does match one of the
|
|
% strings on the buttons in the dialog. If not, throw a warning.
|
|
for i=1:NumButtons
|
|
switch i
|
|
case 1
|
|
ButtonString=Btn1;
|
|
ButtonTag='Btn1';
|
|
if strcmp(ButtonString, Default)
|
|
DefaultValid=true;
|
|
DefaultButton=1;
|
|
end
|
|
case 2
|
|
ButtonString=Btn2;
|
|
ButtonTag='Btn2';
|
|
if strcmp(ButtonString, Default)
|
|
DefaultValid=true;
|
|
DefaultButton=2;
|
|
end
|
|
case 3
|
|
ButtonString=Btn3;
|
|
ButtonTag='Btn3';
|
|
if strcmp(ButtonString, Default)
|
|
DefaultValid=true;
|
|
DefaultButton=3;
|
|
end
|
|
end
|
|
|
|
BtnHandle{i}=uicontrol(QuestFig, ...
|
|
'Style' ,'pushbutton', ...
|
|
'Position' ,[ BtnXOffset(1) BtnYOffset BtnWidth BtnHeight ], ...
|
|
'KeyPressFcn' ,@doControlKeyPress, ...
|
|
'Callback' ,CBString, ...
|
|
'String' ,ButtonString, ...
|
|
'HorizontalAlignment','center', ...
|
|
'Tag' ,ButtonTag...
|
|
);
|
|
end
|
|
|
|
if ~DefaultValid
|
|
warnstate=warning('backtrace','off');
|
|
warning('MATLAB:QUESTDLG:stringMismatch','Default string does not match any button string name.');
|
|
warning(warnstate);
|
|
end
|
|
|
|
MsgHandle=uicontrol(QuestFig, ...
|
|
'Style' ,'text', ...
|
|
'Position' ,[MsgTxtXOffset MsgTxtYOffset 0.95*MsgTxtWidth MsgTxtHeight ], ...
|
|
'String' ,{' '}, ...
|
|
'Tag' ,'Question', ...
|
|
'HorizontalAlignment','left', ...
|
|
'FontWeight' ,'bold', ...
|
|
'BackgroundColor' ,MsgTxtBackClr, ...
|
|
'ForegroundColor' ,MsgTxtForeClr ...
|
|
);
|
|
|
|
[WrapString,NewMsgTxtPos]=textwrap(MsgHandle,Question,75);
|
|
% NumLines=size(WrapString,1);
|
|
AxesHandle=axes('Parent',QuestFig,'Position',[0 0 1 1],'Visible','off');
|
|
texthandle=text( ...
|
|
'Parent' ,AxesHandle , ...
|
|
'Units' ,'pixels' , ...
|
|
'Color' ,get(BtnHandle{1},'ForegroundColor') , ...
|
|
'HorizontalAlignment' ,'left' , ...
|
|
'FontName' ,get(BtnHandle{1},'FontName') , ...
|
|
'FontSize' ,get(BtnHandle{1},'FontSize') , ...
|
|
'VerticalAlignment' ,'bottom' , ...
|
|
'String' ,WrapString , ...
|
|
'Interpreter' ,Interpreter , ...
|
|
'Tag' ,'Question' ...
|
|
);
|
|
|
|
textExtent=get(texthandle, 'Extent');
|
|
% (g357851)textExtent and extent from uicontrol are not the same. For window, extent from uicontrol is larger
|
|
% than textExtent. But on Mac, it is reverse. Pick the max value.
|
|
MsgTxtWidth=max([MsgTxtWidth NewMsgTxtPos(3)+2 textExtent(3)]);
|
|
MsgTxtHeight=max([MsgTxtHeight NewMsgTxtPos(4)+2 textExtent(4)]);
|
|
MsgTxtXOffset=IconXOffset+IconWidth+DefOffset;
|
|
FigPos(3)=max(NumButtons*(BtnWidth+DefOffset)+DefOffset, ...
|
|
MsgTxtXOffset+MsgTxtWidth+DefOffset);
|
|
% Center Vertically around icon
|
|
if IconHeight>MsgTxtHeight,
|
|
IconYOffset=BtnYOffset+BtnHeight+DefOffset;
|
|
MsgTxtYOffset=IconYOffset+(IconHeight-MsgTxtHeight)/2;
|
|
FigPos(4)=IconYOffset+IconHeight+DefOffset;
|
|
% Center around text
|
|
else
|
|
MsgTxtYOffset=BtnYOffset+BtnHeight+DefOffset;
|
|
IconYOffset=MsgTxtYOffset+(MsgTxtHeight-IconHeight)/2;
|
|
FigPos(4)=MsgTxtYOffset+MsgTxtHeight+DefOffset;
|
|
end
|
|
|
|
if NumButtons==1
|
|
BtnXOffset=(FigPos(3)-BtnWidth)/2;
|
|
elseif NumButtons==2
|
|
BtnXOffset=[(FigPos(3)-DefOffset)/2-BtnWidth (FigPos(3)+DefOffset)/2];
|
|
elseif NumButtons==3
|
|
BtnXOffset(2)=(FigPos(3)-BtnWidth)/2;
|
|
BtnXOffset=[BtnXOffset(2)-DefOffset-BtnWidth BtnXOffset(2) BtnXOffset(2)+BtnWidth+DefOffset];
|
|
end
|
|
|
|
set(QuestFig ,'Position',getnicedialoglocation(FigPos, get(QuestFig,'Units')));
|
|
assert(iscell(BtnHandle));
|
|
BtnPos=cellfun(@(bh)get(bh,'Position'), BtnHandle, 'UniformOutput', false);
|
|
BtnPos=cat(1,BtnPos{:});
|
|
BtnPos(:,1)=BtnXOffset;
|
|
BtnPos=num2cell(BtnPos,2);
|
|
assert(iscell(BtnPos));
|
|
cellfun(@(bh,pos)set(bh, 'Position', pos), BtnHandle, BtnPos, 'UniformOutput', false);
|
|
|
|
if DefaultValid
|
|
setdefaultbutton(QuestFig, BtnHandle{DefaultButton});
|
|
end
|
|
|
|
delete(MsgHandle);
|
|
set(texthandle, 'Position',[MsgTxtXOffset MsgTxtYOffset 0]);
|
|
|
|
IconAxes=axes(...
|
|
'Parent' ,QuestFig , ...
|
|
'Units' ,'Pixels' , ...
|
|
'Position' ,[IconXOffset IconYOffset IconWidth IconHeight], ...
|
|
'NextPlot' ,'replace' , ...
|
|
'Tag' ,'IconAxes' ...
|
|
);
|
|
|
|
set(QuestFig ,'NextPlot','add');
|
|
load dialogicons.mat questIconData questIconMap;
|
|
IconData=questIconData;
|
|
questIconMap(256,:)=get(QuestFig,'Color');
|
|
IconCMap=questIconMap;
|
|
Img=image('CData',IconData,'Parent',IconAxes);
|
|
set(QuestFig, 'Colormap', IconCMap);
|
|
set(IconAxes, ...
|
|
'Visible','off' , ...
|
|
'YDir' ,'reverse' , ...
|
|
'XLim' ,get(Img,'XData'), ...
|
|
'YLim' ,get(Img,'YData') ...
|
|
);
|
|
|
|
% Make sure we are on screen
|
|
movegui(QuestFig)
|
|
set(QuestFig ,'WindowStyle','modal','Visible','on');
|
|
drawnow;
|
|
|
|
if DefaultButton ~=0
|
|
uicontrol(BtnHandle{DefaultButton});
|
|
end
|
|
|
|
if ishghandle(QuestFig)
|
|
% Go into uiwait if the figure handle is still valid.
|
|
% This is mostly the case during regular use.
|
|
uiwait(QuestFig);
|
|
end
|
|
|
|
% Check handle validity again since we may be out of uiwait because the
|
|
% figure was deleted.
|
|
if ishghandle(QuestFig)
|
|
if DefaultWasPressed
|
|
ButtonName=Default;
|
|
else
|
|
ButtonName=get(get(QuestFig,'CurrentObject'),'String');
|
|
end
|
|
doDelete;
|
|
else
|
|
ButtonName='';
|
|
end
|
|
|
|
function doFigureKeyPress(obj, evd) %#ok
|
|
switch(evd.Key)
|
|
case {'return','space'}
|
|
if DefaultValid
|
|
DefaultWasPressed=true;
|
|
uiresume(gcbf);
|
|
end
|
|
case 'escape'
|
|
doDelete
|
|
end
|
|
end
|
|
|
|
function doControlKeyPress(obj, evd) %#ok
|
|
switch(evd.Key)
|
|
case {'return'}
|
|
if DefaultValid
|
|
DefaultWasPressed=true;
|
|
uiresume(gcbf);
|
|
end
|
|
case 'escape'
|
|
doDelete
|
|
end
|
|
end
|
|
|
|
function doDelete(varargin)
|
|
delete(QuestFig);
|
|
end
|
|
end
|