123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- 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
|