0001 function varargout = select_xrange(key, varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078 switch key
0079
0080
0081
0082
0083 case 'init'
0084
0085
0086 h = varargin{1};
0087 if ~ishandle(h) | ~strcmp( get(h,'Type'), 'axes' )
0088 disp( 'error in select_xrange: invalid axes handle' );
0089 return;
0090 end
0091
0092
0093 if mod( size(varargin,2), 2 ) ~= 1
0094 disp( 'invalid arguments for select_xrange( ''set'', ... )' );
0095 return;
0096 end
0097 i = 2;
0098 while i < size(varargin,2)
0099 switch varargin{i}
0100 case 'BoxColor'
0101 boxcolor = varargin{i+1};
0102 case 'ReturnVariable'
0103 retvar = varargin{i+1};
0104 case 'ButtonUpFcn'
0105 upfcn = varargin{i+1};
0106 case 'InitialRange'
0107 xrange = varargin{i+1};
0108 otherwise
0109 disp( 'invalid arguments for select_xrange( ''set'', ... )' );
0110 return;
0111 end
0112 i = i + 2;
0113 end
0114
0115
0116
0117 if ~exist('boxcolor'); boxcolor = [0.6,0.6,0.6]; end
0118 if ~exist('retvar'); retvar = []; end
0119 if ~exist('upfcn'); upfcn = []; end
0120 if ~exist('xrange'); xrange = []; end
0121
0122
0123 set( h, 'ButtonDownFcn',...
0124 [ 'select_xrange(''down'',''' retvar ''',''' upfcn ''');' ] );
0125
0126
0127 boxhandle = findobj( gca, 'Tag', 'SelX_BOX' );
0128 if ~isempty( boxhandle );
0129 delete( boxhandle );
0130 end
0131
0132 boxhandle = findobj( gca, 'Tag', 'SelXY_BOX' );
0133 if ~isempty( boxhandle );
0134 delete( boxhandle );
0135 end
0136
0137
0138 ylim = get( h, 'YLim' );
0139 if isempty(xrange)
0140 xlim = get( h, 'XLim' );
0141 xinf = xlim(1);
0142 xsup = xlim(2);
0143 else
0144 xinf = xrange(1);
0145 xsup = xrange(2);
0146 end
0147 boxhandle = ...
0148 patch( [ xinf, xsup, xsup, xinf ],...
0149 [ ylim(1), ylim(1), ylim(2), ylim(2) ], ...
0150 boxcolor, 'HitTest', 'off', 'Visible', 'off',...
0151 'EraseMode', 'xor', 'Tag', 'SelX_BOX' );
0152 if ~isempty(xrange)
0153 set( boxhandle, 'Visible', 'on' );
0154 end
0155
0156
0157
0158
0159
0160
0161
0162 case 'delete'
0163
0164
0165 h = varargin{1};
0166 if ~ishandle(h) | ~strcmp( get(h,'Type'), 'axes' )
0167 disp( 'error in select_xrange: invalid axes handle' );
0168 return;
0169 end
0170
0171
0172 boxhandle = findobj( gca, 'Tag', 'SelX_BOX' );
0173 if ~isempty( boxhandle );
0174 delete( boxhandle );
0175 set( h, 'ButtonDownFcn', [] );
0176 end
0177
0178 boxhandle = findobj( gca, 'Tag', 'SelXY_BOX' );
0179 if ~isempty( boxhandle );
0180 delete( boxhandle );
0181 set( h, 'ButtonDownFcn', [] );
0182 end
0183
0184
0185
0186
0187
0188
0189 case 'down'
0190
0191
0192
0193
0194 retvar = varargin{1};
0195 upfcn = varargin{2};
0196
0197
0198 if strcmp( get( gcf, 'SelectionType' ), 'normal' ) == 0
0199 return;
0200 end
0201
0202
0203 acpt = get( gca, 'CurrentPoint' );
0204 xlim = get( gca, 'XLim' );
0205 ylim = get( gca, 'YLim' );
0206 xini = max( xlim(1), acpt(1) );
0207 xini = min( xlim(2), xini );
0208 boxhandle = findobj( gca, 'Tag', 'SelX_BOX' );
0209 set( boxhandle, 'XData', [ xini, xini, xini, xini ],...
0210 'Visible', 'on' );
0211
0212
0213 set( gcf, 'WindowButtonMotionFcn', 'select_xrange(''move'')' );
0214 if isempty( retvar )
0215 set( gcf, 'WindowButtonUpFcn',...
0216 [ 'select_xrange(''up'',''' upfcn ''');' ] );
0217 else
0218 set( gcf, 'WindowButtonUpFcn',...
0219 [ retvar ' = select_xrange(''up'',''' upfcn ''');' ] );
0220 end
0221
0222
0223
0224
0225
0226
0227 case 'move'
0228
0229
0230 acpt = get( gca, 'CurrentPoint' );
0231 xlim = get( gca, 'XLim' );
0232 xcur = max( xlim(1), acpt(1) );
0233 xcur = min( xlim(2), xcur );
0234 boxhandle = findobj( gca, 'Tag', 'SelX_BOX' );
0235 temp = get( boxhandle, 'XData' );
0236 xini = temp(1);
0237 set( boxhandle, 'XData', [ xini, xcur, xcur, xini ] );
0238
0239
0240
0241
0242
0243
0244 case 'up'
0245
0246
0247 upfcn = varargin{1};
0248
0249
0250 set( gcf, 'WindowButtonMotionFcn', [] );
0251 set( gcf, 'WindowButtonUpFcn', [] );
0252
0253
0254 acpt = get( gca, 'CurrentPoint' );
0255 xlim = get( gca, 'XLim' );
0256 xcur = max( xlim(1), acpt(1) );
0257 xcur = min( xlim(2), xcur );
0258 boxhandle = findobj( gca, 'Tag', 'SelX_BOX' );
0259 temp = get( boxhandle, 'XData' );
0260 xini = temp(1);
0261 set( boxhandle, 'XData', [ xini, xcur, xcur, xini ] );
0262
0263
0264 xrange = sort( [ xini, xcur ] );
0265
0266
0267 if ~isempty( upfcn )
0268 eval( upfcn );
0269 end
0270
0271
0272 varargout{1} = xrange;
0273
0274
0275
0276
0277
0278
0279 case 'get'
0280
0281
0282 h = varargin{1};
0283 if ~ishandle(h) | ~strcmp( get(h,'Type'), 'axes' )
0284 disp( 'error in select_xrange: invalid axes handle' );
0285 varargout{1} = [];
0286 return;
0287 end
0288
0289
0290 boxhandle = findobj( h, 'Tag', 'SelX_BOX' );
0291 if ~isempty(boxhandle) &...
0292 strcmp( get( boxhandle, 'Visible' ), 'on' ) == 1;
0293 xdat = get( boxhandle, 'XData' );
0294 xrange = sort( [ xdat(1), xdat(2) ] );
0295 varargout{1} = xrange;
0296 else
0297 varargout{1} = [];
0298 end
0299
0300
0301
0302
0303
0304
0305 case 'clear'
0306
0307
0308 h = varargin{1};
0309 if ~ishandle(h) | ~strcmp( get(h,'Type'), 'axes' )
0310 disp( 'error in select_xrange: invalid axes handle' );
0311 return;
0312 end
0313
0314
0315 boxhandle = findobj( h, 'Tag', 'SelX_BOX' );
0316 if ~isempty(boxhandle)
0317 xlim = get( h, 'XLim' );
0318 set( boxhandle, 'Visible', 'off' );
0319 end
0320
0321
0322
0323
0324
0325
0326 case 'SetBoxColor'
0327
0328
0329 h = varargin{1};
0330 if ~ishandle(h) | ~strcmp( get(h,'Type'), 'axes' )
0331 disp( 'error in select_xrange: invalid axes handle' );
0332 return;
0333 end
0334
0335
0336 boxcolor = varargin{2};
0337
0338
0339 boxhandle = findobj( h, 'Tag', 'SelX_BOX' );
0340 if ~isempty(boxhandle)
0341 set( boxhandle, 'FaceVertexCData', boxcolor );
0342 end
0343
0344
0345
0346
0347
0348
0349 case 'SetReturnVariable'
0350
0351
0352
0353 h = varargin{1};
0354 if ~ishandle(h) | ~strcmp( get(h,'Type'), 'axes' )
0355 disp( 'error in select_xrange: invalid axes handle' );
0356 return;
0357 end
0358
0359
0360 retvar = varargin{2};
0361
0362
0363 bdf = get( h, 'ButtonDownFcn' );
0364 i = findstr( bdf, 'select_xrange' );
0365 if ~isempty( i )
0366 c = findstr( bdf, ',' );
0367 set( h, 'ButtonDownFcn',...
0368 [ bdf(1:c(1)+1), retvar, bdf(c(2)-1:size(bdf,2)) ] );
0369 end
0370
0371
0372
0373
0374
0375
0376 case 'SetButtonUpFcn'
0377
0378
0379 h = varargin{1};
0380 if ~ishandle(h) | ~strcmp( get(h,'Type'), 'axes' )
0381 disp( 'error in select_xrange: invalid axes handle' );
0382 return;
0383 end
0384
0385
0386 upfcn = varargin{2};
0387
0388
0389 bdf = get( h, 'ButtonDownFcn' );
0390 i = findstr( bdf, 'select_xrange' );
0391 if ~isempty( i )
0392 c = findstr( bdf, ',' );
0393 set( h, 'ButtonDownFcn',...
0394 [ bdf(1:c(2)+1), upfcn, ''');' ] );
0395 end
0396
0397
0398
0399
0400
0401 case 'SetInitialRange'
0402
0403
0404 h = varargin{1};
0405 if ~ishandle(h) | ~strcmp( get(h,'Type'), 'axes' )
0406 disp( 'error in select_xrange: invalid axes handle' );
0407 return;
0408 end
0409
0410
0411 xrange = varargin{2};
0412
0413
0414 boxhandle = findobj( h, 'Tag', 'SelX_BOX' );
0415 if ~isempty(boxhandle)
0416 set( boxhandle, 'XData', [xrange(1),xrange(2),xrange(2),xrange(1)],...
0417 'Visible', 'on');
0418 end
0419
0420
0421
0422
0423
0424
0425 otherwise
0426 disp( 'Invalid key for select_xrange()' );
0427
0428
0429
0430 end
0431