function h=axisscroll(type);

% AXISSCROLL Creates scrollbar(s) for the current axes.
%    h=AXISSCROLL(TYPE) place a scrollbar according with the value of
%    TYPE: 'l' left axis, 'r' right axis, 't' top axis, or 'b' bottom
%    axis. If the axis limits are changed, like zooming in, a call to
%    AXISSCROLL without arguments will allow to move the window. When
%    zooming out to original limits the scrollbar(s) are hidden.
%
%    Figure resizing is handeled automatically.
%
%    Example:
%
%    pcolor(toeplitz(1:20))
%    axisscroll('t');
%    axisscroll('r');
%    xlim([3 6]);
%    ylim([3,6]);
%    axisscroll
%
% ashcherbina@ucsd.edu, 11/20/2001

TAG='AxisScroll';
if (nargin==0),                          % just update positions
  xx=findobj(gcf,'tag',TAG);
  if (isempty(xx)),
    return;
  end,
  for hh=xx',
    positionscroll(hh);
  end,
else,
  UD.type=type;
  UD.xlim=xlim;
  UD.ylim=ylim;
  xx=findobj(gcf,'tag',TAG);             % delete xx
  h=uicontrol('style','slider', ...
              'tag',TAG, ...
	      'userdata',UD);
  positionscroll(h);
  set(gcf,'resizefcn','axisscroll');
  if (nargout==0)
    clear;
  end,
end

function positionscroll(h)

dist=2;
width=12;
ud=get(h,'userdata');
type=ud.type;

ou=get(gca,'units');
set(gca,'units','points');
r=get(gca,'position');
set(gca,'units',ou);

% Horizontal scroll, bottom of the figure.

if (type(1)=='b'),
  set(h,'units','points', ...
        'position',[r(1) r(2)-dist-width r(3) width], ...
        'callback', ['xl=xlim; p=get(gcbo,''value'');' ...
                     'xlim([0 diff(xl)]+p);']);

% Horizontal scroll, top of the figure.

elseif (type(1)=='t'),

   set(h,'units','points', ...
         'position',[r(1) r(2)+r(4)+dist r(3) width], ...
         'callback', ['xl=xlim; p=get(gcbo,''value'');' ...
                      'xlim([0 diff(xl)]+p);']);

% Vertical scroll bar, left of the figure.

elseif (type=='l'),

  set(h,'units','points', ...
        'position',[r(1)-dist-width r(2) width r(4)], ...
        'callback',['yl=ylim;p=get(gcbo,''value'');' ...
                    'ylim([0 diff(yl)]+p);']);

% Vertical scroll bar, right of the figure.

elseif (type=='r'),

  set(h,'units','points', ...
         'position',[r(1)+r(3)+dist r(2) width r(4)], ...
         'callback',['yl=ylim; p=get(gcbo,''value'');' ...
                     'ylim([0 diff(yl)]+p);'] );
end,

% Set limits.

if (type=='l' | type=='r'),
  yl=ylim;
  yl0=ud.ylim;
  set(h,'min',min(yl0)-1e-5, ...
        'max',max(yl0)-diff(yl), ...
        'value',min(yl), ...
        'sliderstep',[.1 1]*diff(yl)./diff(yl0));
   if (all(yl==yl0)),
     set(h,'visible','off');
   else,
     set(h,'visible','on');
   end,
else,
  xl=xlim;
  xl0=ud.xlim;
  set(h,'min',min(xl0)-1e-5, ...
        'max',max(xl0)-diff(xl), ...
	'value',min(xl), ...
	'sliderstep',[.1 1]*diff(xl)./diff(xl0));
  if (all(xl==xl0)),
    set(h,'visible','off');
  else,
    set(h,'visible','on');
  end,
end,

return




