function zoomfixticks_rev(fig,method,varargin)
%ZOOMFIXTICKS allows zoom to work on a figure whose AXES tick labels are manually set
%   ZOOMFIXTICKS(FIG) operates on the figure with handle FIG.
%   ZOOMFIXTICKS(AX) operates on the figure with child AXES handle AX.
%   ZOOMFIXTICKS with no arguments operates on the current figure.
%
%   Note that when using this function, you will need to modify the FIXTICKS
%   subfunction to meet your application needs.  Alternatively, you can comment
%   out the function and supply it as an M-file function on the MATLAB path.  
%   If you supply your own, make sure that the M-file is named "fixticks.m", and
%   it takes a single input argument, the handle to an AXES object.
%
%   Example:
%       hf = figure;
%       xdata = [0:.01:1];
%       ydata = 100000*sin(2*pi*5*xdata);
%       plot(xdata,ydata);
%       zoomfixticks(hf)

%   Greg Aloe
%   8-8-2002
%   Copyright 2002-2004 The MathWorks, Inc.

%   Edited by Alex Taylor, 09-01-2004, to handle change to zoom button tag
%   between version 6 and 7

% Set up the figure if there are less than 2 arguments
if nargin < 2
    % Make sure the input is a handle to an AXES or FIGURE
    if nargin==0
        % If no arguments, assume the current figure
        fig = gcf;
    elseif ishandle(fig) & ~strcmp(lower(get(fig,'type')),'figure')
        % If FIG is a handle, but not to a figure, assume it's an axes and get its parent
        fig = get(fig,'parent');
    end

    % Error out if the input is not a handle, or not a handle to a figure or axes
    if ~ishandle(fig) | (ishandle(fig) & ~strcmp(lower(get(fig,'type')),'figure'))
        error('Input argument must be a handle to an AXES or FIGURE object.')
    end
    
    % Initialize the setup of the figure
    init(fig)
else
    % if 2 or more arguments, perform the desired operation
    feval(method,varargin{:})
end
    

%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function init(fig)
% This function sets up the figure so that zooms will work even when the AXES
% ticklabels are set manually
 
%detect version
v=version;

%Get proper handles to zoom in and zoom out uitoggletool buttons.  Account
%for difference in tag names between version 6 and version 7

if (str2num(v(1))<7)
    hin = findall(fig,'tag','figToolZoomIn');
    hout = findall(fig,'tag','figToolZoomOut');
else
    hin = findall(fig,'tag','Exploration.ZoomIn');
    hout = findall(fig,'tag','Exploration.ZoomOut');
end

% Change the callback for the "Zoom In" toolbar button
set(hin,'ClickedCallback','zoomfixticks(gcbf,''zoomInCallback'',gcbo,gcbf)')

% Change the callback for the "Zoom Out" toolbar button
set(hout,'ClickedCallback','zoomfixticks(gcbf,''zoomOutCallback'',gcbo,gcbf)')

% Fix the ticks on initialization
fixticks(gca(fig))

%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function zoomInCallback(hcbo,fig)
% Callback for the "Zoom In" button

% First call what is normally called during a zoom in
putdowntext('zoomin',hcbo)

% If the button is depressed, force WindowButtonDownFcn to call the DOWNFCN subfunction
if strcmp(get(hcbo,'state'),'on')
    set(fig,'WindowButtonDownFcn','zoomfixticks(gcbf,''downFcn'',gcbf)')
end


%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function zoomOutCallback(hcbo,fig)
% Callback for the "Zoom Out" button

% First call what is normally called during a zoom out
putdowntext('zoomout',hcbo)

% If the button is depressed, force WindowButtonDownFcn to call the DOWNFCN subfunction
if strcmp(get(hcbo,'state'),'on')
    set(fig,'WindowButtonDownFcn','zoomfixticks(gcbf,''downFcn'',gcbf)')
end


%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function downFcn(fig)
% Since the button was pressed, tell the figure that we are starting a zoom
zoom(fig,'down');

% After the zoom, fix the ticks
fixticks(gca(fig))


%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function fixticks(ax)
% This function will perform the desired ticklabel fixing
% This is the function you will want to modify to meet your application needs
% Alternatively, you can comment out this function to call an M-file function
% in its place.

% EXAMPLE:
% First update the axes so the ticks are as expected
drawnow
% Get the ticks
tick=get(ax,'ytick');
% Convert ticks to a string of the desired format
tickstr=num2str(tick',7);
% Reset the labels to the new format
set(ax,'yticklabel',tickstr);

