function theResult = doupdate(self, needsUpdate)

% seagrid/doupdate -- Update a "seagrid" object.
%  doupdate(self) updates self, a "seagrid" object.
%   If the "itNeedsUpdate" flag of self is logically
%   true, the grid is recomputed as part of the
%   updating protocol.
%  update(self, needsUpdate) uses the given flag
%   to override the 'itNeedsUpdate' flag in self.
 
% Copyright (C) 1999 Dr. Charles R. Denham, ZYDECO.
%  All Rights Reserved.
%   Disclosure without explicit written consent from the
%    copyright owner does not constitute publication.
 
% Version of 07-Apr-1999 21:19:19.
% Updated    23-Apr-2001 16:00:02.

theProjection = psget(self, 'itsProjection');
theProjectionCenter = psget(self, 'itsProjectionCenter');
sg_proj(theProjection, theProjectionCenter)

theFigure = ps(self);
setsafe(0, 'CurrentFigure', theFigure)

theAxes = findobj(theFigure, 'Type', 'axes', 'Tag', 'seagrid');
if isempty(theAxes)
	theAxes = gca;
end
setsafe(theAxes, 'Tag', 'seagrid')
setsafe(theFigure, 'CurrentAxes', theAxes)

theTitle = get(theAxes, 'Title');
setsafe(theTitle, 'String', [theProjection ' Projection'])

thePoints = psget(self, 'itsPoints');
if length(thePoints) < 4
	doticks(self)
	setsafe(theFigure, 'Pointer', 'crosshair')
	if nargout > 0, theResult = self; end
	return
end

busy

if nargin < 2
	needsUpdate = psget(self, 'itNeedsUpdate');
else
	psset(self, 'itNeedsUpdate', needsUpdate)
end

if verbose(self)
	disp([' ## ' mfilename ' ' int2str(needsUpdate)])
end

theOrthogonalityFlag = psget(self, 'itsOrthogonalityFlag');
theBathymetryFlag = psget(self, 'itsBathymetryFlag');
theMaskingFlag = psget(self, 'itsMaskingFlag');
theMaskTool = psget(self, 'itsMaskTool');
theMaskToolFlag = psget(self, 'itsMaskToolFlag');

if any(theMaskTool)
	domasktool(self)   % Turn it off.
end

h = findobj(theFigure, 'Tag', 'masktool');
if any(h), delete(h), end

h = findobj(theFigure, 'Tag', 'grid2mask');
if any(h), delete(h), end

psset(self, 'itsMaskTool', []);
theMaskTool = psget(self, 'itsMaskTool');

dospacings(self);   % <== Step #1 <==

h = findobj(theFigure, 'Tag', 'orthogonality');
if any(h), delete(h), end
h = findobj(theFigure, 'Tag', 'gridded-bathymetry');
if any(h), delete(h), end
h = findobj(theFigure, 'Tag', 'contoured-bathymetry');
if any(h), delete(h), end
h = findobj(theFigure, 'Tag', 'mask');
if any(h), delete(h), end
h = findobj(theFigure, 'Type', 'line', 'Tag', 'grid-line');
if any(h), delete(h), end
h = findobj(theFigure, 'Type', 'line', 'Tag', 'edge');
if any(h), delete(h), end
h = findobj(theFigure, 'Type', 'line', 'Tag', 'spacer');
if any(h), delete(h), end

dogrid(self, needsUpdate);   % <== Step #2 <==

f = findobj(theFigure, 'Tag', 'Colorbar');
if any(f), delete(f), end

theAxes = gca;

theColorBarFlag = 0;
if any(theOrthogonalityFlag)
	self = doorthogonality(self);   % <== Step #3 <==
	theColorBarFlag = 0;   % Does its own colorbar.
else
	if any(theMaskingFlag)
		needsMask = 1;
		self = domask(self, needsMask);   % <== Step #4 <==
	end
	if any(theBathymetryFlag)
		needsBathymetry = 1;
		self = dobathymetry(self, needsBathymetry);   % <== Step #5 <==
	end
	if any(theMaskToolFlag)
		theMaskTool = psget(self, 'itsMaskTool');
		if any(theMaskTool)
			domasktool(self)   % Delete it.
		end
		self = domasktool(self);   % <== Step #6 <==
		theColorBarFlag = 1;
		psset(self, 'itsMaskingFlag', 0)
		psset(self, 'itsBathymetryFlag', 0)
	end
end

setsafe(0, 'CurrentFigure', theFigure)

doedges(self);   % <== Step #7 <==
dospacers(self);   % <== Step #8 <==
dopoints(self);   % <== Step #9 <==
doticks(self);   % <== Step #10 <==

% We have to activate the colorbar here
%  whenever we use the masktool.

if any(theColorBarFlag)
	setsafe(gca, 'CLimMode', 'auto')
	colorbar
end

if any(theColorBarFlag) & any(theMaskToolFlag) & ...
		~any(theOrthogonalityFlag)
	h = colorbar;
	setsafe(get(h, 'Ylabel'), 'String', 'Depth')
end

axes(theAxes)

theWBDF = ...
	'if zoomsafe(''down''), doticks(ps(gcf), 1), end';
	
setsafe(theFigure, 'WindowButtonDownFcn', theWBDF)

needsUpdate = 0;
psset(self, 'itNeedsUpdate', needsUpdate)

idle

if nargout > 0, theResult = self; end
