Skip to content
Snippets Groups Projects
tsgqc.m 164 KiB
Newer Older
function tsgqc( varargin )
%TSGQC Thermosalinograph (TSG) Quality Control software
% TSGQC is a software for interactive analysis and validation of
% underway SST / SSS (Sea Surface Temperature and Sea Surface Salinity)
% measurements from a SeaBird Thermosalinograph (TSG). 
% It has been developed under Matlab.
% Usage:
%   tsgqc help
%
% See:
%   Documentation: http://www.ird.fr/us191/spip.php?article63
%   Source code: https://git.outils-is.ird.fr/grelet/TSG-QC
%

% Tips:
%  To get and check tsg structure anywhere during debug:
%  tsg = getappdata( findobj('Tag', 'TAG_TSG-QC_GUI'), 'tsg_data')
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed


%% COPYRIGHT & LICENSE
%  Copyright 2007-2018 - IRD US191, all rights reserved.
%  This file is part of tsgqc.
%    TSG-QC is free software; you can redistribute it and/or modify
%    it under the terms of the GNU General Public License as publDisplayished by
%    the Free Software Foundation; either version 2 of the License, or
%    (at your option) any later version.
%
%    tsgqc is distributed in the hope that it will be useful,
%    but WITHOUT ANY WARRANTY; without even the implied warranty of
%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%    GNU General Public License for more details.
%
%    You should have received a copy of the GNU General Public License
%    along with Datagui; if not, write to the Free Software
%    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
%% Define global variables for VERSIONING
% ---------------------------------------
global DATE_VERSION
global DEBUGGING
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
global DEFAULT_PATH_FILE

% version number, may be used to initialize some files when it change
% 0.90x -> 1.0RCx
% if you modify the tsgqc.preference structure, you need to increment 
% or modify the version number to load a new default structure
% -------------------------------------------------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
VERSION      = 1.50;  % -> 1.44
CHAR_VERSION = '1.50RC1';
DATE_VERSION = '12/05/2018';

% netcdf file version, see DATA FORMAT TSG document:
% CORTSG_format_gosud.doc
% --------------------------------------------------
%%  Initialization tasks
%   ********************

% Clear Command Window display, giving up a "clean screen."
% ---------------------------------------------------------
clc;

% Find program directory.
% functions (icons) should be store at a lower level
% add directories to Matlab search path, works on UNIX
% and Windows host
% ---------------------------------------------------
tsgqcname = mfilename;
fulltsgqcname = mfilename('fullpath');

% regular expression expr if it occurs at the end of the input string
% -------------------------------------------------------------------

% get pathname
% ------------
DEFAULT_PATH_FILE =  regexprep(fulltsgqcname, expr, '');

% update Matlab pathdef only for session
% addpath isn't mandatory and failed with compiled applications
% -------------------------------------------------------------
if (~isdeployed)
  p = [pathsep,...
    DEFAULT_PATH_FILE,[ 'tsg_util' pathsep],...
    DEFAULT_PATH_FILE,[ 'tsg_data' pathsep],...
    DEFAULT_PATH_FILE,[ 'tsg_icon' pathsep],...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
    DEFAULT_PATH_FILE,[ 'tsg_climato' pathsep],...    
    DEFAULT_PATH_FILE,[ 'tsg_map' pathsep]
    ];
  addpath( p, '-end' );
  rehash;

% define 'HandleVisibility' property for all objects
% --------------------------------------------------
handleVisibility = 'on';

% % get screen dimensions (pixels)
% % ------------------------------
% set(0,'Units','pixels');
% screenSize = get(0,'ScreenSize');
% % set default font size
% % ---------------------
% if screenSize(3) <= 1024
%   tsg.fontSize = 9;
% else
%   tsg.fontSize = 11;
% end

% Screen limits for the GUI
% -------------------------
if verLessThan('matlab','8.4')
  set(0,'Units','normalized');
  guiLimits = get(0,'ScreenSize');
else
  r = groot;
  r.Units = 'normalized';
  guiLimits = r.ScreenSize;
end

guiLimits(1) = guiLimits(1) + 0.01;
guiLimits(2) = guiLimits(2) + 0.05;
guiLimits(3) = guiLimits(3) - 0.02;
guiLimits(4) = guiLimits(4) - 0.15;

%% Optional arguments
% --------------------
inputFile  = '';
outputFile = '';
display    = false;
DEBUGGING  = false;
help       = false;

% parse and set optional arguments with couple 'property', 'value'
% -----------------------------------------------------------------
if length(varargin) == 1
  inputFile = varargin{1};
end
property_argin = varargin(1:end);
  property = property_argin{1};
  value    = property_argin{2};
  property_argin = property_argin(3:end);
  switch lower(property)
    case {'inputfile', 'input', 'file'}
      inputFile = value;
    case {'outputfile', 'output'}
      outputFile = value;
    case 'display'
      display = value;
    case 'debug'
      DEBUGGING = value;
    otherwise
      error('Unknow property: %s', property);
  end
end

% if property display is set to display, display them and quit
% -----------------------------------------------------------
if display
  fprintf('inputFile: %s\noutpuFile: %s\n', inputFile, outputFile);
  return;
end
% if property help is set to on, display help and quit
% -----------------------------------------------------------
if strcmp(help, 'on') || ~isempty(strfind(inputFile,'help'))
  fprintf('tsgqc usage:\n');
  fprintf('tsgqc(''<file>'')\n');
  fprintf('tsgqc(''inputfile'', <file>, ''outputfile'', <file>)\n');
  fprintf('tsgqc(''inputfile'', <file>, ''outputfile'', <file>),''display'',''true''\n');
  fprintf('tsgqc(''help'',''true'')\n');
  fprintf('tsgqc --help\n');
  fprintf('tsgqc(''<file>'', ''debug'', 1)\n');

%% Main TSGQC GUI
% ---------------

% Check if main TSGQC figure exist
% --------------------------------
hMainFig = findobj('Tag', 'TAG_TSG-QC_GUI');

% if TSGQC figure exist and still running, don't create a new instance
% --------------------------------------------------------------------
if ~isempty(hMainFig)
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  % display error dialog box and quit
  % ---------------------------------
  errordlg({'An instance of TSGQC is still running !!!', ...
    'Open it from you task bar'}, 'Warning TSGQC');
  return;
% Create and then hide the GUI as it is being constructed.
% --------------------------------------------------------
hMainFig = figure(...
  'Name', strcat('TSG Validation - v', CHAR_VERSION), ...
  'NumberTitle', 'off', ...
  'Resize', 'on', ...
  'Menubar', 'none', ...
  'Toolbar', 'none', ...
  'UserData', 'ButtonMotionOff', ...
  'WindowButtonMotionFcn', @MouseMotion, ...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  'HandleVisibility', handleVisibility,...
  'Visible','on',...
  'Tag','TAG_TSG-QC_GUI',...
  'Units', 'normalized',...
  'Position',guiLimits, ...
  'Color', get( 0, 'DefaultUIControlBackgroundColor' ));
%% Check Matlab version for use of KeyPressFcn and KeyReleaseFcn properties
% -------------------------------------------------------------------------
switch ( version('-release') )
  case { '11', '12', '13', '14', '2006a', '2006b' }
    % dont process KeyPressFcn and KeyReleaseFcn events
  otherwise
    
    % show crossline when shitf key is pressed, vertical bar when ctrl key
    % --------------------------------------------------------------------
    set( hMainFig, 'KeyPressFcn',   @keyPressFcnCallback,...
      'KeyReleaseFcn', @keyReleaseFcnCallback);
end

%% Initialize tsg structure with tsg_preference function
% -----------------------------------------------------
if ~tsg_preferences(hMainFig, tsgqcname, DEFAULT_PATH_FILE)
  quitProgram(DEFAULT_PATH_FILE, hMainFig, hMapFig);
end

% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');

%%  Menu File
%   -----------------------------------------------------------------------
hFileMenu = uimenu(...
  'Parent', hMainFig,...
  'HandleVisibility', handleVisibility,...
  'Label', 'File');
hOpenMenu = uimenu(...
  'Parent', hFileMenu,...
  'Label','Open',...
  'Accelerator','O',...
  'HandleVisibility', handleVisibility,...
  'UserData', 'off',...
  'Callback', @OpenMenuCallback);
hSaveMenu = uimenu(...
  'Parent', hFileMenu,...
  'Label','Save',...
  'Accelerator','S',...
  'Enable', 'off',...
  'UserData', 'off',...
  'HandleVisibility', handleVisibility,...
  'Callback',@SaveMenuCallback);
hExportMenu = uimenu(...
  'Parent', hFileMenu,...
  'Label','Export',...
  'Accelerator','E',...
  'Enable', 'off',...
  'UserData', 'off',...
  'HandleVisibility', handleVisibility);
hExportTSG = uimenu(...
  'Parent', hExportMenu,...
  'Label','Tsg ascii file',...
  'Enable', 'on',...
  'HandleVisibility', handleVisibility,...
  'Callback',@ExportTsgCallback);
hExportSAMPLE = uimenu(...
  'Parent', hExportMenu,...
  'Label','Sample ascii file',...
  'Enable', 'on',...
  'HandleVisibility', handleVisibility,...
  'Callback',@ExportSampleCallback);

hQuitMenu = uimenu(...
  'Parent',hFileMenu,...
  'Label','Quit',...
  'Separator','on',...
  'Accelerator','Q',...
  'HandleVisibility', handleVisibility,...
  'Callback',@QuitMenuCallback);

jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%%  Menu Edit with Undo/Redo submenu
% ---------------------------------
hEditMenu = uimenu(hMainFig,'Label','Edit');
uimenu(hEditMenu,'Label','Undo',...
  'Tag','UIMENU_UNDO',...
  'Enable', 'off',...
  'Callback',@UndoMenuCallback);
uimenu(hEditMenu,'Label','Redo',...
  'Tag','UIMENU_REDO',...
  'Enable', 'off',...
  'Callback',@RedoMenuCallback);

%%  Menu Climatology with Annual/Seasonal/Monthly submenu
% --------------------------------------------------------

% define structure s stored in userdata
% -------------------------------------
s = struct('type', 'annual', 'time', 1);

hClimatoMenu = uimenu(hMainFig,'Label','Climatology', ...
  'Tag', 'TAG_UIMENU_CLIMATO_MAIN', ...
  'UserData', s);

% by defautl at startup, select climatology to annual
% ---------------------------------------------------
uimenu(hClimatoMenu,'Label','Annual',...
  'Checked','on',...
  'Tag','TAG_UIMENU_CLIMATO_ANNUAL',...
  'Enable', 'on',...
  'Callback', {@ClimatoSelectMenuCallback, 'annual', 1});

% declare top-level seasonal menu
% -------------------------------
hClimatoSeasonalMenu = uimenu(hClimatoMenu,'Label','Seasonal');

% declare label for seasonal submenu
% ----------------------------------
label = {'jan-feb-mar','apr-may-jun','jul-aug-sept','oct-nov-dec'};

% loop over the four submenu
% --------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
for i = 1:4
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  uimenu(hClimatoSeasonalMenu,'Label',label{i},...
    'Checked','off',...
    'Tag',['TAG_UIMENU_CLIMATO_SEASONAL_' i],...
    'Enable', 'on',...
    'Callback',{@ClimatoSelectMenuCallback, 'seasonal', i});
end

% declare top-level monthly menu
% -------------------------------
hClimatoMonthlyMenu = uimenu(hClimatoMenu,'Label','Monthly');

% declare label for monthly submenu
% ----------------------------------
label = {'january','february','march','april','may','june','july','august',...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  'september','october','november','december'};

% loop over the four submenu
% --------------------------
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
for i = 1:12
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  uimenu(hClimatoMonthlyMenu,'Label',label{i},...
    'Checked','off',...
    'Tag',['TAG_UIMENU_CLIMATO_MONTHLY_' i],...
    'Enable', 'on',...
    'Callback',{@ClimatoSelectMenuCallback, 'monthly', i});
end

%%  Menu Option with Preferences submenu
% --------------------------------------------------------
hOptionMenu = uimenu(hMainFig,'Label','Option');
uimenu(hOptionMenu,'Label','Preferences',...
  'Tag','TAG_UIMENU_OPTION_PREFERENCES',...
  'Enable', 'on',...
  'Callback', {@PreferencesMenuCallback});

%%  Menu QC automatic
%   Dependent functions : preferenceForm.m; tsg_preference.m,
%   @QCMenuCallback
%   ----------------------------------------------------------
hQCMenu = uimenu(...
  'Parent', hMainFig, 'Enable', 'off', 'HandleVisibility', handleVisibility,...
  'Label', 'QCauto');
hFlowMenu = uimenu(...
  'Parent', hQCMenu, 'Label','Flow', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'Flow'});
hPressMenu = uimenu(...
  'Parent', hQCMenu, 'Label','Press', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'Press'});
hSpeedMenu = uimenu(...
  'Parent', hQCMenu, 'Label','Ship Speed', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'Speed'});
hSSPSminMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSPS min', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSPSmin'});
hSSPSmaxMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSPS max', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSPSmax'});
hSSJTminMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSJT min', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSJTmin'});
hSSJTmaxMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSJT max', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSJTmax'});
hSSTPminMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSTP min', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSTPmin'});
hSSTPmaxMenu = uimenu(...
  'Parent', hQCMenu, 'Label','SSTP max', 'HandleVisibility', handleVisibility,...
  'UserData', 'off', 'Callback', {@QCMenuCallback,'SSTPmax'});

jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
%%  Menu Help with F1 Help and About submenu
% --------------------------------------------------------
hOptionMenu = uimenu(hMainFig,'Label','Help');
uimenu(hOptionMenu,'Label','Help',...
  'Tag','TAG_UIMENU_HELP_HELP',...
  'Enable', 'on',...
  'Callback', {@HelpMenuCallback});
uimenu(hOptionMenu,'Label','About TSGQC',...
  'Tag','TAG_UIMENU_HELP_ABOUT',...
  'Enable', 'on',...
  'Callback', {@AboutMenuCallback});

%%  Toolbar pushbuttons
%   -----------------------------------------------------------------------
hToolbar       =   uitoolbar(...   % Toolbar for Open and Print buttons
  'Parent',hMainFig, ...
  'HandleVisibility','on');
hOpenPushtool  =   uipushtool(...   % Opendoc toolbar button
  'Parent',hToolbar,...
  'TooltipString','Open file',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_OPEN',...
  'UserData', 'off',...
  'Enable', 'on',...
  'ClickedCallback', @OpenMenuCallback);
hSavePushtool  =   uipushtool(...   % Open Save toolbar button
  'Parent',hToolbar,...
  'TooltipString','Save NetCDF file',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_SAVE',...
  'Enable', 'off',...
  'ClickedCallback', @SaveMenuCallback);
hPrintFigPushtool  =   uipushtool(...   % Open Save toolbar button
  'Parent',hToolbar,...
  'TooltipString','Print figures',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_PRINTFIG',...
  'visible', 'on', 'Enable', 'on',...
  'ClickedCallback', @PrintFigMenuCallback);
hZoomInToggletool = uitoggletool(...   % Open Zoom In (increase) toolbar button
  'Parent',hToolbar,...
  'Separator', 'on', ...
  'TooltipString','Zoom In (increase)',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_ZOOM_IN',...
  'OnCallback',  @ZoomIn_OnMenuCallback,...
  'OffCallback',  @ZoomIn_OffMenuCallback);
hZoomOutToggletool = uitoggletool(...   % Open Zoom Out (decrease) toolbar button
  'Parent',hToolbar,...
  'Separator', 'on', ...
  'TooltipString','Zoom Out (decrease)',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_ZOOM_OUT',...
  'OnCallback',  @ZoomOut_OnMenuCallback,...
  'OffCallback',  @ZoomOut_OffMenuCallback);
hPanToggletool  =   uitoggletool(...   % Open Pan toolbar button
  'Parent',hToolbar,...
  'TooltipString','Pan',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_PAN',...
  'Enable', 'off',...
  'OffCallback', @Pan_OffMenuCallback,...
  'OnCallback',  @Pan_OnMenuCallback);
hQCToggletool  =   uitoggletool(...   % Open QC toolbar button
  'Parent',hToolbar,...
  'TooltipString','Validation codes',...
  'Separator', 'on', ...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_QC',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @QC_OffMenuCallback,...
  'OnCallback',  @QC_OnMenuCallback);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
hTimelimitToggletool  = uitoggletool(...
  'Parent',hToolbar,...
  'TooltipString','Select time limit',...
  'HandleVisibility','on', ...
  'Tag', 'CORRECT_STARTTIME', ...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @SelectTime_OffMenuCallback,...
  'OnCallback',  @SelectTime_OnMenuCallback);
hMapToggletool  =   uitoggletool(...   % Open Map toolbar button
  'Parent',hToolbar,...
  'TooltipString','Display ship track with m_map',...
  'Separator', 'on', ...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_MAP',...
  'UserData', 'off', ...
  'Enable', 'off',...
  'OffCallback', @Map_OffMenuCallback,...
  'OnCallback',  @Map_OnMenuCallback);
hGoogleEarthPushtool  = uipushtool(...   % Open Google Earth and plot track
  'Parent',hToolbar,...
  'TooltipString','Display ship track with Google Earth',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_GOOGLEARTH',...
  'Enable', 'off',...
  'ClickedCallback', @GoogleEarthMenuCallback);
hClimToggletool  =   uitoggletool(...   % Open Climatology toolbar button
  'Parent',hToolbar,...
  'TooltipString','Climatology',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_CLIM',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Clim_OffMenuCallback,...
  'OnCallback',  @Clim_OnMenuCallback);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
hCalToggletool  =   uitoggletool(...   %
  'Parent',hToolbar,...
  'TooltipString','Calibration sensors',...
  'Separator', 'on', ...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_CAL',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Cal_OffMenuCallback,...
  'OnCallback',  @Cal_OnMenuCallback);
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
hInterpToggletool  =   uitoggletool(...   %
  'Parent',hToolbar,...
  'TooltipString','Interpolate missing position',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_INTERP',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Inter_OffMenuCallback,...
  'OnCallback',  @Inter_OnMenuCallback);
hBottleToggletool  = uitoggletool(...   % Correction module toolbar button
  'Parent',hToolbar,...
  'TooltipString','Correct the SSS TSG data',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_BOTTLE',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Bottle_OffMenuCallback,...
  'OnCallback',  @Bottle_OnMenuCallback);

hHeaderPushtool  = uipushtool(...   % Open headerForm button
  'Parent',hToolbar,...
  'TooltipString','Fill the header form',...
  'Separator', 'on', ...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_HEADER',...
  'Enable', 'off',...
  'ClickedCallback', @HeaderMenuCallback);

hReportPushtool  = uipushtool(...   % Open Report saving button
  'Parent',hToolbar,...
  'TooltipString','Save a report',...
  'HandleVisibility','on', ...
  'Tag','PUSHTOOL_REPORT',...
  'Enable', 'off',...
  'ClickedCallback', @ReportMenuCallback);

%% Dynamic text area
%   -----------------------------------------------------------------------
%  Dynamic text area that displays the loaded filename, date, position and
%  salinity, temperature
%  ------------------------------------------------------------------------

% Create an uipanel
% -----------------
hInfoPanel = uipanel( ...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'BorderType', 'none',...
  'Visible', 'on', ...
  'Position',[.01, .96, .98, .04]);

% Dynamic text area that displays the date
% ----------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.01, .25, .04, .6], ...
  'String', 'File:');
hInfoFileText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'No file loaded', ...
  'Position', [.05, .25, .1, .6]);

% Text area that displays the date
% --------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.15, .25, .04, .6], ...
  'String', 'Date:');
hInfoDateText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.20, .25, .13, .6]);

% Text area that displays the latitude
% ------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.33, .25, .06, .6], ...
  'String', 'Latitude:');
hInfoLatText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.4, .25, .9, .6]);

% Text area that displays the longitude
% -------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.495, .25, .08, .6], ...
  'String', 'Longitude:');
hInfoLongText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.585, .25, .09, .6]);

% Text area that display salinity and temperature
% -----------------------------------------------
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position', [.68, .25, .05, .6], ...
  'String', 'SSPS:');
hInfoSSPSText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.73, .25, .05, .6]);
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.785, .25, .05, .6], ...
  'String', 'SSJT:');
hInfoSSJTText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.835, .25, .05, .6]);
uicontrol(...
  'Parent', hInfoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize, ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.89, .25, .05, .6], ...
  'String', 'SSTP:');
hInfoSSTPText = uicontrol(...
  'Parent', hInfoPanel, ...
  'Style', 'text', ...
  'Fontsize', tsg.fontSize, ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...
  'Position', [.94, .25, .05, .6]);

%% Plot axes
%   -----------------------------------------------------------------------
% The axes 1,2 and 3 will be plot in a uipanel
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
% axe 1 as propertie 'HandleVisibility' set to 'on' to prevent hidden
% visibility when first plot is empty
%--------------------------------------------------------------------
hPlotsPanel = uipanel( ...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'BorderType', 'etchedin',...
  'Visible', 'on',...
hPlotAxes(1) = axes( 'Parent', hPlotsPanel, 'Visible', 'off', ...
  'box', 'on', 'Units', 'normalized','Tag', 'TAG_AXES_1', ...
  'HandleVisibility','on', 'Position',[.05, .64, .93, .35]);
hPlotAxes(2) = axes( 'Parent', hPlotsPanel, 'Visible', 'off',...
  'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_2', ...
  'HandleVisibility','on', 'Position',[.05, .33, .93, .27]);
hPlotAxes(3) = axes('Parent', hPlotsPanel, 'Visible', 'off',...
  'box', 'on', 'Units', 'normalized', 'Tag', 'TAG_AXES_3', ...
  'HandleVisibility','on', 'Position',[.05, .02, .93, .27]);

% ---------------------------------
hMapFig = figure(...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  'BackingStore','off',...
  'NumberTitle', 'off', ...
  'Resize', 'on', ...
  'Toolbar', 'none', ...
  'Tag', 'MAP_FIGURE', ...
  'Visible','off',...
  'WindowStyle', 'normal', ...
  'CloseRequestFcn', @QuitMapCallback,...
  'Units', 'normalized',...
  'Color', get(0, 'DefaultUIControlBackgroundColor'));
%  'Position',[0.17, 0.05, .8, .44],...
% display map menus
% -----------------
hMapResolutionMenu = uimenu(...
  'Parent', hMapFig,...
  'HandleVisibility', handleVisibility,...
  'Label', 'Map');

uimenu(hMapResolutionMenu,'Label','Low',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_RESOLUTION_1',...
  'Enable', 'on',...
  'Callback', {@mapResolutionCallback, 1});

uimenu(hMapResolutionMenu,'Label','Medium',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_RESOLUTION_2',...
  'Enable', 'on',...
  'Callback', {@mapResolutionCallback, 2});

uimenu(hMapResolutionMenu,'Label','Intermediate',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_RESOLUTION_3',...
  'Enable', 'on',...
  'Callback', {@mapResolutionCallback, 3});

uimenu(hMapResolutionMenu,'Label','High',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_RESOLUTION_4',...
  'Enable', 'on',...
  'Callback', {@mapResolutionCallback, 4});

% set 'checked' property to 'on' for current map resolution
% ------------------------------------------------------------
hdls = flipud(findobj( '-regexp', 'tag', 'TAG_UIMENU_MAP_RESOLUTION_'));
set(hdls(tsg.preference.map.resolution), 'checked', 'on');
% display map Type menu
% ---------------------
hMapPatchMenu = uimenu(hMapFig,'Label','Type', ...
  'Tag', 'TAG_UIMENU_MAP_PATCH');

% preset map patch menu from preference
if tsg.preference.map.patch_value == 2
  chk_with_patch = 'on';
  chk_without_patch = 'off';
else
  chk_with_patch = 'off';
  chk_without_patch = 'on';
end

uimenu(hMapPatchMenu,'Label','Map without patch (faster)',...
  'Checked',chk_without_patch,...
  'Tag','TAG_UIMENU_MAP_WITHOUT_PATCH',...
  'Enable', 'on',...
  'Callback', {@mapPatchMenuCallback, 0});

uimenu(hMapPatchMenu,'Label','Map with patch (slower)',...
  'Checked',chk_with_patch,...
  'Tag','TAG_UIMENU_MAP_WITH_PATCH',...
  'Enable', 'on',...
  'Callback', {@mapPatchMenuCallback, 1});

% display map Border menu
% ------------------------
hMapBorderMenu = uimenu(...
  'Parent', hMapFig,...
  'HandleVisibility', handleVisibility,...
  'Label', 'Border');

uimenu(hMapBorderMenu,'Label','0',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_1',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 0});

uimenu(hMapBorderMenu,'Label','1',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_2',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 1});

uimenu(hMapBorderMenu,'Label','2',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_3',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 2});

uimenu(hMapBorderMenu,'Label','5',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_4',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 5});

uimenu(hMapBorderMenu,'Label','10',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_5',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 10});

uimenu(hMapBorderMenu,'Label','15',...
  'Checked','off',...
  'Tag','TAG_UIMENU_MAP_BORDER_6',...
  'Enable', 'on',...
  'Callback', {@mapDynaBorderCallback, 15});

% set 'checked' property to 'on' for current map border menu
% ----------------------------------------------------------
hdls = flipud(findobj( '-regexp', 'tag', 'TAG_UIMENU_MAP_BORDER_'));
set(hdls(tsg.preference.map.border_value), 'checked', 'on');
% map Climatology menu
% --------------------
hMapClimatologyMenu = uimenu(hMapFig,'Label','Climatology', ...
  'Tag', 'TAG_UIMENU_MAP_CLIMATOLOGY');

uimenu(hMapClimatologyMenu,'Label','off',...
  'Checked', 'on',...
  'Tag','TAG_UIMENU_MAP_CLIMATOLOGY_WITH_NONE',...
  'Enable', 'on',...
  'Callback', {@mapClimatologyCallback, 'none'});

uimenu(hMapClimatologyMenu,'Label','pcolor',...
  'Checked', 'off',...
  'Tag','TAG_UIMENU_MAP_CLIMATOLOGY_WITH_PCOLOR',...
uimenu(hMapClimatologyMenu,'Label','contour',...
  'Checked', 'off',...
  'Tag','TAG_UIMENU_MAP_CLIMATOLOGY_WITH_CONTOURF',...
  'Callback', {@mapClimatologyCallback, 'contourf'});
% map Print menu
% --------------------
hMapPrintMenu = uimenu(hMapFig,'Label','Print', ...
  'Tag', 'TAG_UIMENU_MAP_PRINT');

uimenu(hMapPrintMenu,'Label','Print Preview',...
  'Tag','TAG_UIMENU_MAP_PRINT_PREVIEW',...
  'Callback', {@mapPrintPreviewCallback});

uimenu(hMapPrintMenu,'Label','Print',...
  'Tag','TAG_UIMENU_MAP_PRINT_PREVIEW',...
  'Accelerator','P',...
  'Callback', {@mapPrintCallback});

uimenu(hMapPrintMenu,'Label','Save as',...
  'Tag','TAG_UIMENU_MAP_PRINT_SAVEAS',...
  'Callback', {@mapSaveAsCallback});

% set uipanel for map axes and climato
% ------------------------------------
hMapAxesPanel = uipanel( ...
  'Parent', hMapFig, ...
  'Units', 'normalized', ...
  'Visible', 'on',...
  'tag', 'TAG_MAP_CLIMATO_AXES',...
  'Position',[0, 0, 1, 1]);
%   'BorderType', 'etchedin',...

hMapClimatoPanel = uipanel( ...
  'Parent', hMapFig, ...
  'Units', 'normalized', ...
  'Visible', 'off',...
  'tag', 'TAG_MAP_CLIMATO_UIPANEL',...
  'Position',[.8, 0, .2, 1]);

% set map axes
% ------------
hPlotAxes(4) = axes(...     % the axes for plotting ship track map
  'Units', 'normalized', ...
  'Visible', 'off', ...
jacques.grelet_ird.fr's avatar
jacques.grelet_ird.fr committed
  'Tag', 'TAG_AXES_4', ...
  'Color', 'none', ...
  'UserData', 'off', ...
  'HandleVisibility','on');

% display climatology control title
% ---------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', 'Fontsize', tsg.fontSize, 'FontWeight', 'bold',...
  'HorizontalAlignment', 'Center', ...
  'Position',[.1, .9, .8, .05],'String', 'Range');

% display climatology min value text
% ----------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize-2, ...
  'HorizontalAlignment', 'center', ...
  'Position',[.2, .85, .6, .05], ...
  'String', 'Min value');

% display climatology min value uicontrol
% ---------------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized',...
  'Style', 'Edit',...
  'BackgroundColor', 'w', ...
  'Fontsize', tsg.fontSize-2, 'HorizontalAlignment', 'right', ...
  'Position', [.2, .8, .6, .04], ...
  'String', '', ... 
  'TooltipString', 'climatology min value', ...
  'Tag', 'CLIMATO_MIN_VALUE',...
  'Callback', {@mapContourfCallback, 'min'});

% display climatology max value text
% ----------------------------------
uicontrol(...
  'Parent', hMapClimatoPanel, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontsize', tsg.fontSize-2, ...
  'HorizontalAlignment', 'center', ...
  'Position',[.2, .75, .6, .05], ...