-
jacques.grelet_ird.fr authored
handleVisibility = 'on'; Check if main TSGQC figure exist MainFig = findobj('Tag', 'TAG_TSG-QC_GUI'); Reset pointer to arrow when invalid file extension is selected set( hMainFig, 'Pointer', 'arrow' );
jacques.grelet_ird.fr authoredhandleVisibility = 'on'; Check if main TSGQC figure exist MainFig = findobj('Tag', 'TAG_TSG-QC_GUI'); Reset pointer to arrow when invalid file extension is selected set( hMainFig, 'Pointer', 'arrow' );
tsgqc_GUI.m 104.09 KiB
function tsgqc_GUI
% tsgqc_GUI
%
% TSG (Thermosalinograph) Quality Control software
%
% $Id$
%
%% COPYRIGHT & LICENSE
% Copyright 2007 - IRD US191, all rights reserved.
%
% This file is part of tsgqc_GUI.
%
% Datagui is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% (at your option) any later version.
%
% tsgqc_GUI 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
%% Initialization tasks
% ********************
% Clear Command Window display, giving up a "clean screen."
% ---------------------------------------------------------
clc;
% Define global variable VERSION number
% -------------------------------------
global VERSION
VERSION = '0.2f';
% 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');
DEFAULT_PATH_FILE = strrep(fulltsgqcname, tsgqcname, '') ;
p = [pathsep,...
DEFAULT_PATH_FILE,[filesep 'tsg_util' pathsep],...
DEFAULT_PATH_FILE,[filesep 'tsg_data' pathsep],...
DEFAULT_PATH_FILE,[filesep 'tsg_io' 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');
% define default font size based on screen resolution
% ---------------------------------------------------
if screenSize(3) <= 1024
tsg.fontSize = 9;
end
% Screen limits for the GUI
% -------------------------
set(0,'Units','normalized');
guiLimits = get(0,'ScreenSize');
guiLimits(1) = guiLimits(1) + 0.01;
guiLimits(2) = guiLimits(2) + 0.05;
guiLimits(3) = guiLimits(3) - 0.02;
guiLimits(4) = guiLimits(4) - 0.15;
%% 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)
% display error dialog box and quit
% ---------------------------------
errordlg({'An instance of TSGQC is still running !!!', ...
'Open it from you task bar'}, 'Warning TSGQC');
return;
end
% Create and then hide the GUI as it is being constructed.
% --------------------------------------------------------
hMainFig = figure(...
'Name', 'TSG Validation', ...
'NumberTitle', 'off', ...
'Resize', 'on', ...
'Menubar','none', ...
'Toolbar', 'none', ...
'UserData', 'ButtonMotionOff', ...
'WindowButtonMotionFcn', @MouseMotion, ...
%{
CloseRequestFcn is remove at this time
use use block comments, see:
http://blogs.mathworks.com/loren/2006/08/30/commenting-code/
--------------------------------------
'CloseRequestFcn', @QuitMenuCallback,...
%}
'HandleVisibility', handleVisibility,...
'Visible','on',...
'Tag','TAG_TSG-QC_GUI',...
'Units', 'normalized',...
'Position',guiLimits, ...
'Color', get( 0, 'DefaultUIControlBackgroundColor' ));
%% Initialize tsg structure with tsg_preference function
% -----------------------------------------------------
tsg_preferences(hMainFig, tsgqcname, DEFAULT_PATH_FILE);
% 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,...
'Callback',@ExportMenuCallback);
hQuitMenu = uimenu(...
'Parent',hFileMenu,...
'Label','Quit',...
'Separator','on',...
'Accelerator','Q',...
'HandleVisibility', handleVisibility,...
'Callback',@QuitMenuCallback);
%% Menu Edit with Undo/Redo submenu
% ---------------------------------
hEditMenu = uimenu(hMainFig,'Label','Edit');
uimenu(hEditMenu,'Label','Undo',...
'Accelerator','Z',...
'Tag','UIMENU_UNDO',...
'Enable', 'off',...
'Callback',@UndoMenuCallback);
uimenu(hEditMenu,'Label','Redo',...
'Accelerator','R',...
'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
% --------------------------
for i=1:4
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',...
'september','october','november','december'};
% loop over the four submenu
% --------------------------
for i=1:12
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',...
'Checked', tsg.preference.autoload,...
'Tag','TAG_UIMENU_OPTION_PREFERENCES',...
'Enable', 'on',...
'Callback', {@PreferencesMenuCallback});
%% Toolbar pushbuttons
% -----------------------------------------------------------------------
hToolbar = uitoolbar(... % Toolbar for Open and Print buttons
'Parent',hMainFig, ...
'HandleVisibility','on');
hOpenPushtool = uipushtool(... % Opendoc toolbar button
'Parent',hToolbar,...
'TooltipString','Open file',...
'CData', iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/opendoc.mat')),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_OPEN',...
'UserData', 'off',...
'Enable', 'on',...
'ClickedCallback', @OpenMenuCallback);
hSavePushtool = uipushtool(... % Open Save toolbar button
'Parent',hToolbar,...
'TooltipString','Save NetCDF file',...
'CData',iconRead( ...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'savedoc.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_SAVE',...
'Enable', 'off',...
'ClickedCallback', @SaveMenuCallback);
hPrintFigPushtool = uipushtool(... % Open Save toolbar button
'Parent',hToolbar,...
'TooltipString','Print figures',...
'CData',iconRead( ...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'printdoc.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_PRINTFIG',...
'Enable', 'off',...
'ClickedCallback', @PrintFigMenuCallback);
hZoomToggletool = uitoggletool(... % Open Zoom toolbar button
'Parent',hToolbar,...
'Separator', 'on', ...
'TooltipString','Zoom',...
'CData', iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/zoom.mat')),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_ZOOM',...
'Enable', 'off',...
'OffCallback', @Zoom_OffMenuCallback,...
'ONCallback', @Zoom_OnMenuCallback);
hPanToggletool = uitoggletool(... % Open Pan toolbar button
'Parent',hToolbar,...
'TooltipString','Pan',...
'CData',iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/pan.mat')),...
'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', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_QC',...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @QC_OffMenuCallback,...
'OnCallback', @QC_OnMenuCallback);
hTimelimitToggletool = uitoggletool(...
'Parent',hToolbar,...
'TooltipString','Select time limit',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'selecttime.mat']),...
'HandleVisibility','on', ...
'Tag', 'CORRECT_STARTTIME', ...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @SelectTime_OffMenuCallback,...
'OnCallback', @SelectTime_OnMenuCallback);
hMapToggletool = uitoggletool(... % Open Map toolbar button
'Parent',hToolbar,...
'TooltipString','Map and ship track',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_MAP',...
'UserData', 'off', ...
'Enable', 'off',...
'OffCallback', @Map_OffMenuCallback,...
'OnCallback', @Map_OnMenuCallback);
hClimToggletool = uitoggletool(... % Open Climatology toolbar button
'Parent',hToolbar,...
'TooltipString','Climatology',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_CLIM',...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @Clim_OffMenuCallback,...
'OnCallback', @Clim_OnMenuCallback);
hCalToggletool = uitoggletool(... %
'Parent',hToolbar,...
'TooltipString','Calibration sensors',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'outils.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_CAL',...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @Cal_OffMenuCallback,...
'OnCallback', @Cal_OnMenuCallback);
hInterpToggletool = uitoggletool(... %
'Parent',hToolbar,...
'TooltipString','Interpolate missing position',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'interp.mat']),...
'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',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),...
'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', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'hdricon.mat']),...
'HandleVisibility','on', ...
'Tag','PUSHTOOL_HEADER',...
'Enable', 'off',...
'ClickedCallback', @HeaderMenuCallback);
hReportPushtool = uipushtool(... % Open Report saving button
'Parent',hToolbar,...
'TooltipString','Save a report',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'reporticon.mat']),...
'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
% 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',...
'Position',[0.15, 0.0, .85, .95]);
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]);
% The map will be plot in a uipanel
hMapPanel = uipanel( ...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'Position',[0.15, 0, .85, .58]);
hPlotAxes(4) = axes(... % the axes for plotting ship track map
'Parent', hMapPanel, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'Tag', 'TAG_AXES_MAP', ...
'Color', 'none', ...
'UserData', 'off', ...
'HandleVisibility','on', ...
'Position',[.05, .05, .9, .9]);
%% uipanel for Quality Control Buttons - uibutton group
% -----------------------------------------------------------------------
hbgQc = uibuttongroup(...
'Parent', hMainFig, ...
'Title', 'Validation Codes', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'tag', 'TAG_QC_DISPLAY_PANEL',...
'HandleVisibility','on',...
'Visible', 'off',...
'BorderType', 'etchedin',...
'Units', 'normalized', 'Position', [.0, .71, .15, .25]);
% Initialize CallBack for button group properties
% -----------------------------------------------
set(hbgQc,'SelectionChangeFcn',@RadiobuttonQc);
%% Context Menu and RadioButtons for Quality control
% -----------------------------------------------------------------------
hQcCmenu = uicontextmenu(...
'Parent', hMainFig, ...
'HandleVisibility','on' );
% get list of keys from hashtable tsg.qc.hash, defined inside
% tsg_initialisation.m
% -----------------------------------------------------------
qc_list = get(tsg.qc.hash);
% internal loop count with state to on
% ------------------------------------
count = 0;
% iterate (loop) on each key store inside hastable
% ------------------------------------------------
for i=1:numel(qc_list)
% get key and some values in hashtable
% ------------------------------------
key = qc_list{i};
label = get(tsg.qc.hash, key, 'label');
color = get(tsg.qc.hash, key, 'color');
state = get(tsg.qc.hash, key, 'state');
% construct context menu with only code set to 'on' (valid)
% ---------------------------------------------------------
if strcmp( state, 'on')
% add menu to hQcCmenu uicontextmenu
% ----------------------------------
uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','on', ...
'Label', label,...
'ForegroundColor', color,...
'Callback', {@Qc, key});
% add button QC to hbgQc uibuttongroup
% ------------------------------------
uicontrol(...
'Parent', hbgQc,...
'Style', 'radiobutton',...
'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
'HorizontalAlignment', 'left', ...
'HandleVisibility','on', ...
'String', label,...
'Tag', ['TAG_QC_RADIO_' key], ...
'Units', 'normalized', 'Position', [.01, .85-count*.12, .6, 0.09]);
% add text QC display statistic on hQcPanel
% -----------------------------------------
uicontrol(...
'Parent', hbgQc,...
'Style', 'text',...
'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
'HorizontalAlignment', 'right', ...
'HandleVisibility','on', ...
'String', 'N/A ',...
'Tag', ['TAG_QC_TEXT_' key],...
'Units', 'normalized', 'Position', [.61, .85-count*.12, .37, 0.09]);
% increment count
% ---------------
count = count + 1;
end
end
%% uibutton group panel - Choose the parameter (SSPS - SSTP - SSJT)
% -----------------------------------------------------------------------
hbgParameter = uibuttongroup(...
'Parent', hMainFig, ...
'Title', 'TSG Parameter', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'tag', 'TAG_PARA_DISPLAY_PANEL',...
'HandleVisibility','on',...
'Visible', 'off',...
'BorderType', 'etchedin',...
'Units', 'normalized', 'Position', [.0, .81, .15, .15]);
para = [ 'SSPS'; 'SSJT'; 'SSTP' ];
strPara = [ ['Salinity ' para(1,:) ' ']; ...
['Temperature ' para(2,:)]; ...
['Temperature ' para(3,:)] ];
for i = 1:3
% add button QC to hbgParameter uibuttongroup
% -------------------------------------------
uicontrol(...
'Parent', hbgParameter,...
'Style', 'radiobutton',...
'Fontsize', tsg.fontSize-1, 'ForegroundColor', color,...
'HorizontalAlignment', 'left', ...
'HandleVisibility','on', ...
'String', strPara(i, :),...
'Tag', ['TAG_PARA_RADIO_' para(i,:)], ...
'Units', 'normalized', 'Position', [.05, .8-(i-1)*.30, .90, 0.12]);
end
% Initialize CallBack for button group properties
% -----------------------------------------------
set(hbgParameter,'SelectionChangeFcn',@RadiobuttonParameter);
%% uiButtonGroup set to choose the Correction method
% -------------------------------------------------------------------------
% Create the button group
hbgCorMethod = uibuttongroup( ...
'Parent',hMainFig, ...
'Title','Correction Method', ...
'Units', 'normalized', ...
'FontSize',tsg.fontSize-1, 'Fontweight', 'bold',...
'Visible', 'off', ...
'Position',[.0, .25, .15, .18]);
% Create 2 radio buttons in the button group
hrbCorCancel = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Cancel the adjustment',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_CANCEL_PUSH', ...
'pos',[.05 .08 .9 .25],...
'HandleVisibility', handleVisibility, ...
'Callback', @CorCancelCallback);
hrbCorLinear = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Linear adjustment',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_LINEAR_PUSH', ...
'pos',[.05 .38 .9 .25], ...
'HandleVisibility', handleVisibility, ...
'Callback', @CorLinearCallback);
hrbCorMedian = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Running median filter',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_MEDIAN_PUSH', ...
'pos',[.05 .68 .9 .25], ...
'HandleVisibility', handleVisibility, ...
'Callback', @CorMedianCallback);
%% uiPanel for the Date limits used in the Correction module
% Choose the date limits for the correction
% --------------------------------------------------
% Create the uipanel
hpDateLimit = uipanel( ...
'Parent', hMainFig, ...
'Title', 'Date Limits', ...
'Units', 'normalized', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'Visible', 'off', ...
'Position', [.0, .46, .15, .18]);
htDateMin = uicontrol( ...
'Parent', hpDateLimit, ...
'Style', 'Text', ...
'String', 'Min : yyyy-mm-dd hh:mm:ss', ...
'HorizontalAlignment', 'left', ...
'Units', 'normalized', ...
'FontSize', tsg.fontSize-1, ...
'Position',[.01 .8 .95 .15]);
hetDateMin = uicontrol( ...
'Parent', hpDateLimit, ...
'Style', 'edit', ...
'Units', 'normalized', ...
'BackgroundColor', 'white',...
'FontSize', tsg.fontSize, ...
'Tag', 'CORRECT_DATEMIN_EDIT',...
'Position',[.01 .6 .95 .17]);
htDateMax = uicontrol( ...
'Parent', hpDateLimit, ...
'Style', 'Text', ...
'String', 'Max : yyyy-mm-dd hh:mm:ss', ...
'HorizontalAlignment', 'left', ...
'Units', 'normalized', ...
'FontSize', tsg.fontSize-1, ...
'Position',[.01 .35 .95 .15]);
hetDateMax = uicontrol( ...
'Parent', hpDateLimit, ...
'Style', 'edit', ...
'Units', 'normalized', ...
'BackgroundColor', 'white',...
'FontSize', tsg.fontSize, ...
'Tag', 'CORRECT_DATEMAX_EDIT',...
'Position',[.01 .15 .95 .17]);
%% uiPanel for the Calibration coefficient used the Correction module
% Create the uipanel
hpCalCoef = uipanel( ...
'Parent', hMainFig, ...
'Title', 'Calibration', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'Visible', 'off', ...
'Units', 'normalized','Position', [.0, .46, .15, .50]);
htCalCNDC1 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'Conductivity : C = A*C + B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .925 .95 .05]);
htCalCNDC2 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'A', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .85 .08 .05]);
hetCalCNDCSlope = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
'Tag', 'CORRECT_CAL_CNDC_A',...
'HandleVisibility','on', ...
'Units', 'normalized', 'Position',[.1 .85 .85 .05]);
htCalCNDC3 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .775 .08 .05]);
hetCalCNDCOffset = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
'HandleVisibility','on', ...
'Tag', 'CORRECT_CAL_CNDC_B',...
'Units', 'normalized', 'Position',[.1 .775 .85 .05]);
htCalSSJT1 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'SSJT : T = A*T + B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .675 .95 .05]);
htCalSSJT2 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'A', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .6 .08 .05]);
hetCalSSJTSlope = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'BackgroundColor', 'white',...
'FontSize', tsg.fontSize, ...
'HandleVisibility','on', ...
'Tag', 'CORRECT_CAL_SSJT_A',...
'Units', 'normalized', 'Position',[.1 .6 .85 .05]);
htCalSSJT3 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .525 .08 .05]);
hetCalSSJTOffset = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
'HandleVisibility','on', ...
'Tag', 'CORRECT_CAL_SSJT_B',...
'Units', 'normalized', 'Position',[.1 .525 .85 .05]);
htCalSSTP1 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'SSPT : T = A*T + B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .425 .95 .05]);
htCalSSTP2 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'A', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .35 .08 .05]);
hetCalSSTPSlope = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'BackgroundColor', 'white',...
'FontSize', tsg.fontSize, ...
'HandleVisibility','on', ...
'Tag', 'CORRECT_CAL_SSJT_A',...
'Units', 'normalized', 'Position',[.1 .35 .85 .05]);
htCalSSTP3 = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'Text', 'String', 'B', ...
'HorizontalAlignment', 'left', 'FontSize', tsg.fontSize-1, ...
'Units', 'normalized', 'Position',[.01 .275 .08 .05]);
hetCalSSTPOffset = uicontrol( ...
'Parent', hpCalCoef, ...
'Style', 'edit', ...
'FontSize', tsg.fontSize, 'BackgroundColor', 'white',...
'HandleVisibility','on', ...
'Tag', 'CORRECT_CAL_SSJT_B',...
'Units', 'normalized', 'Position',[.1 .275 .85 .05]);
hrbCal = uicontrol( ...
'Style','pushbutton', 'Parent',hpCalCoef, ...
'String','Calibrate',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_CAL_PUSH', ...
'Units', 'normalized','pos',[.05 .15 .9 .075], ...
'HandleVisibility', handleVisibility, ...
'Callback', @CalibrateCallback);
hrbCancelCal = uicontrol( ...
'Style','pushbutton', 'Parent',hpCalCoef, ...
'String','Cancel calibration',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_CAL_PUSH', ...
'Units', 'normalized','pos',[.05 .05 .9 .075], ...
'HandleVisibility', handleVisibility, ...
'Callback', @CancelCalibrationCallback);
%% uiPanel for Interpolation of position
% Create the uipanel
hpInterpPos = uipanel( ...
'Parent', hMainFig, ...
'Title', 'Lat-Lon interpolation', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'Visible', 'off', ...
'Units', 'normalized','Position', [.0, .75, .15, .21]);
hrbInterpLinear = uicontrol( ...
'Style','pushbutton', 'Parent',hpInterpPos, ...
'String','Linear interpolation',...
'FontSize',tsg.fontSize-1,...
'Tag', 'TAG_PUSH_INTERP_LINEAR', ...
'Units', 'normalized','pos',[.05 .65 .9 .25], ...
'HandleVisibility', handleVisibility, ...
'Callback', @InterpPosLinearCallback);
hrbInterpOther = uicontrol( ...
'Style','pushbutton', 'Parent',hpInterpPos, ...
'String','Other method',...
'FontSize',tsg.fontSize-1,...
'Tag', 'TAG_PUSH_INTERP_OTHER', ...
'Units', 'normalized','pos',[.05 .35 .9 .25], ...
'HandleVisibility', handleVisibility, ...
'Callback', @InterpPosOtherCallback);
hrbInterpCancel = uicontrol( ...
'Style','pushbutton', 'Parent',hpInterpPos, ...
'String','Cancel interpolation',...
'FontSize',tsg.fontSize-1,...
'Tag', 'TAG_PUSH_INTERP_CANCEL', ...
'Units', 'normalized','pos',[.05 .05 .9 .25], ...
'HandleVisibility', handleVisibility, ...
'Callback', @InterpPosCancelCallback);
%% test if user preference autoload field is checked (on)
% -------------------------------------------------------
if strcmp(tsg.preference.autoload, 'on')
% A TSG file has been open and read
% ---------------------------------
set( hOpenMenu, 'UserData', 'on' );
% Show handles marked as hidden with HandleVisibility property set to
% callback or off
% -------------------------------------------------------------------
set(0, 'ShowHiddenHandles', 'on');
% enable toolbar menu pushtool
% ----------------------------
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'on');
% enable Save menu
% ----------------
set(hSaveMenu, 'Enable', 'on');
% update the filename display
% ---------------------------
set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));
% update some fields in tsg structure
% -----------------------------------
updateTsgStruct( hMainFig );
% Get application data for the test
% ---------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Get the default parameter
% -------------------------
PARA = tsg.preference.parameter;
% The smooth TSG time series (tsg_moveaverage) is
% no more computed : too long
% We now computed a smooth value only at the position of the sample
% in diffTsgSample
% -----------------------------------------------------------------
%tsg_moveaverage( hMainFig, PARA );
% Merge sample from different origins : WS and EXT
% ------------------------------------------------
tsg_mergesample( hMainFig, PARA );
% Draw the 3 plots of the validation figure
% The plots need to be re-initialize because of a bug with
% the zoom function. When you open a new TSG file and you
% have used the zoom funtion with the preceding file.
% The zoom function keep the X and Y limits of the preceding file
% ---------------------------------------------------------------
delete( hPlotAxes(1) );
delete( hPlotAxes(2) );
delete( hPlotAxes(3) );
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]);
resetAxes( hMainFig, hPlotAxes );
plot_Validation( hMainFig, hPlotAxes, 1, PARA );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
% Draw the map with the ship track
% --------------------------------
plot_map( hMainFig, hPlotAxes);
% The callback to detect the mouse motion can be set to on
% --------------------------------------------------------
set( hMainFig, 'UserData', 'ButtonMotionOn');
% Hide handles marked as hidden with HandleVisibility property set to
% callback or off
% -------------------------------------------------------------------
set(0, 'ShowHiddenHandles', 'off');
end
%% *************************** CALLBACKS **********************************
%% OpenMenuCallback
%----------------------------------------------------------------------
% Callback function run when the Open menu item is selected
%----------------------------------------------------------------------
function OpenMenuCallback(hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hpDateLimit, 'Visible', 'off' );
set( hpInterpPos, 'Visible', 'off' );
% set( hbgParameter, 'Visible', 'off');
% Toggle button
% -------------
set( hBottleToggletool, 'state', 'off' );
set( hCalToggletool, 'state', 'off' );
set( hClimToggletool, 'state', 'off' );
set( hInterpToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
set( hZoomToggletool, 'state', 'off' );
set( hHeaderPushtool, 'enable', 'off' );
% Open standard dialog box for retrieving files
% ---------------------------------------------
[fileName, pathname, filterIndex] = uigetfile( ...
{'*.tsg';'*.xml';'*.nc';'*.lbv';'*.btl'; '*.arg'}, 'Pick a file');
% flushes the event queue and updates the closed uigetfile window
% ---------------------------------------------------------------
drawnow;
% if the user clicks the Cancel button or closes the dialog window,
% FileName and PathName are set to 0.
% -----------------------------------------------------------------
if ~isequal(fileName, 0)
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
% construct valid and full file path
% -----------------------------------
fullFileName = strcat(pathname, fileName);
% Read the data
% -------------
errTsg = -2;
errSpl = -2;
switch filterIndex
case 1 % read TSG text file *.txt
tsg_initialisation(hMainFig);
errTsg = readTsgDataTsg( hMainFig, fullFileName);
%errTsg = readTsgDataTxt( hMainFig, fullFileName );
case 2 % read TSG XML file *.xml
tsg_initialisation(hMainFig);
errTsg = readTsgDataXML( hMainFig, fullFileName );
case 3 % read TSG netcdf file *.nc
tsg_initialisation(hMainFig);
errTsg = readTsgDataNetCDF( hMainFig, fullFileName );
case 4 % read TSG labview file *.lbv
tsg_initialisation(hMainFig);
errTsg = readTsgDataLabview( hMainFig, fullFileName );
case 5 % Read bucket file *.btl
if ~isempty( tsg.SSPS )
errSpl = readBucketData( hMainFig, fullFileName );
else
msgbox( 'Load a TSG file before a Water sample file', 'Read Bucket');
end
case 6 % Read Argo file *.arg (G. Reverdin format)
if ~isempty( tsg.SSPS )
errSpl = readCoriolisData( hMainFig, fullFileName );
else
msgbox( 'Load a TSG file before a Water sample file', 'Read Bucket');
end
otherwise
% Reset pointer to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% diplay warning msgbox
% ---------------------
msgbox( {['Invalid TSG file: ' fileName],...
'Please select another file'},...
'Warning open file', 'warn', 'modal' );
return;
end % switch filterIndex
% Get the tsg structure
% ---------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Default parameter
% -----------------
PARA = tsg.preference.parameter;
% A TSG file has been read
% ------------------------
if errTsg > 0
% set WindowButtonMotionFcn on
% ----------------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
% A TSG file has been open and read
% ---------------------------------
set( hOpenMenu, 'UserData', 'on' );
% enable toolbar menu pushtool
% ----------------------------
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'on');
set( hbgParameter, 'Visible', 'on');
% Enable Save and Export menu
% ---------------------------
set(hSaveMenu, 'Enable', 'on');
set(hExportMenu, 'Enable', 'on');
% update some fields in tsg structure and restore tsg
% ---------------------------------------------------
updateTsgStruct(hMainFig );
% update the filename display
% ---------------------------
set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));
% The smooth TSG time series (tsg_moveaverage) is
% no more computed : too long
% We now computed a smooth value only at the position of the sample
% in diffTsgSample
% -----------------------------------------------------------------
%tsg_moveaverage(hMainFig, PARA);
% The callback to detect the mouse motion can be set to on
% --------------------------------------------------------
set( hMainFig, 'UserData', 'ButtonMotionOn');
% Update QC statistics
% --------------------
display_QC( hMainFig, hPlotAxes);
elseif errTsg > -2
% Problem to read the file or
% Choice of parameters for Labview file canceled by the user
% TSG structure has been reinitialize
% Disable toolbar menu pushtool except the open file button
% ----------------------------------------------------------
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'off');
set( hOpenPushtool, 'Enable', 'on' );
end %if errTsg > 0
% Merge sample from different origins : WS and EXT
% ------------------------------------------------
tsg_mergesample( hMainFig, PARA );
% Draw the 3 plots of the validation figure
% The plots need to be re-initialize because of a bug with
% the zoom function. When you open a new TSG file and you
% have used the zoom funtion with the preceding file.
% The zoom function keep the X and Y limits of the preceding file
% ---------------------------------------------------------------
delete( hPlotAxes(1) );
delete( hPlotAxes(2) );
delete( hPlotAxes(3) );
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]);
resetAxes( hMainFig, hPlotAxes )
plot_Validation( hMainFig, hPlotAxes, 1, PARA );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
end % if ~isequal(fileName, 0)
end
%% Inter_OnMenuCallback ................................... Interpolation
%----------------------------------------------------------------------
% Callback function run when
%
function Inter_OnMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpDateLimit, 'Visible', 'on' );
set( hpInterpPos, 'Visible', 'on' );
set( hpCalCoef, 'Visible', 'off');
set( hbgQc, 'Visible', 'off');
set( hbgParameter, 'Visible', 'off');
% Toggle button
% -------------
set( hBottleToggletool, 'state', 'off', 'enable', 'off');
set( hCalToggletool, 'state', 'off', 'enable', 'off');
set( hClimToggletool, 'state', 'off', 'enable', 'off');
set( hPanToggletool, 'state', 'off', 'enable', 'on' );
set( hQCToggletool, 'enable', 'off');
set( hTimelimitToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomToggletool, 'state', 'off', 'enable', 'on' );
set( hHeaderPushtool, 'enable', 'off' );
% Get application data TSG
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Get the information on time limits of the time series
% Write them in the uipanel
% -----------------------------------------------------
noNaN = tsg.DAYD(~isnan( tsg.DAYD ));
set( hetDateMin, 'String', datestr(noNaN(1), 31));
set( hetDateMax, 'String', datestr(noNaN(end), 31));
% Draw the 3 plots of the interpolation figure
% --------------------------------------------
plot_Interpolation( hMainFig, hPlotAxes, 1 );
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
end
%% Inter_OffMenuCallback .................................. Interpolation
%----------------------------------------------------------------------
% Callback function run when
%
function Inter_OffMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hpDateLimit, 'Visible', 'off' );
set( hpInterpPos, 'Visible', 'off' );
set( hbgParameter, 'Visible', 'on' );
% Enable Pushbuttons
% ------------------
set( hBottleToggletool, 'state', 'off', 'enable', 'on' );
set( hCalToggletool, 'state', 'off', 'enable', 'on' );
set( hClimToggletool, 'state', 'off', 'enable', 'on' );
set( hPanToggletool, 'state', 'off', 'enable', 'on' );
set( hQCToggletool, 'state', 'off', 'enable', 'on' );
set( hTimelimitToggletool, 'state', 'off', 'enable', 'off' );
set( hZoomToggletool, 'state', 'off', 'enable', 'on' );
set( hHeaderPushtool, 'enable', 'on' );
% Get tsg structure
% -----------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, tsg.preference.parameter );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
% Set the pointer
% ---------------
set( hMainFig, 'Pointer', 'arrow');
end
%% InterpLinearCallback ...............................Interpolation Linear
%------------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function InterpPosLinearCallback( hObject, eventdata)
% Get the time limits for the correction A TESTER
% --------------------------------------
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
error = interpPosLinear( hMainFig, dateMin, dateMax );
switch error
case 1
% Plot in the 3 axes
% ------------------
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
case -1
msgbox( 'Date limits are not correct',...
'Correction module', 'warn', 'modal');
end
end
%% InterpOtherCallback ...............................Interpolation OTher
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function InterpPosOtherCallback( hObject, eventdata)
msgbox( 'Method not yet implemented', ...
'Function InterpOtherCallback', ...
'warn',...
'modal' );
end
%% InterpPosCancelCallback ..........................Cancel Interpolation
%----------------------------------------------------------------------
function InterpPosCancelCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Get NO_CONTROL and INTERPOLATED_VALUE codes
% -------------------------------------------
NO_CONTROL = get(tsg.qc.hash, 'NO_CONTROL', 'code');
INTERPOLATED_VALUE = get(tsg.qc.hash, 'INTERPOLATED_VALUE', 'code');
if ~isempty( tsg.POSITION_QC )
iINTERP = find( tsg.POSITION_QC == INTERPOLATED_VALUE);
tsg.LATX( iINTERP ) = NaN * ones( size( iINTERP), 1 );
tsg.LONX( iINTERP ) = NaN * ones( size( iINTERP), 1 );
tsg.POSITION_QC = [];
end
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Refresh plots
% -------------
plot_Interpolation( hMainFig, hPlotAxes, 1 );
plot_Interpolation( hMainFig, hPlotAxes, 2 );
plot_Interpolation( hMainFig, hPlotAxes, 3 );
end
%% Cal_OnMenuCallback ..................................... Calibration
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function Cal_OnMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'on' );
set( hbgParameter, 'Visible', 'off');
set( hbgQc, 'Visible', 'off');
% Pushbutton
% ----------
set( hQCToggletool, 'enable', 'off' );
set( hClimToggletool, 'enable', 'off', 'state', 'off' );
set( hBottleToggletool, 'enable', 'off' );
set( hInterpToggletool, 'enable', 'off' );
set( hHeaderPushtool, 'enable', 'off' );
set( hPanToggletool, 'state', 'off', 'enable', 'on' );
set( hTimelimitToggletool, 'state', 'off', 'enable', 'off' );
set( hZoomToggletool, 'state', 'off', 'enable', 'on' );
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
% Write the Cal Coef in the Editable uicontrol
% --------------------------------------------
set( hetCalCNDCSlope, 'String', num2str(tsg.CNDC_LINCOEF(1)));
set( hetCalCNDCOffset, 'String', num2str(tsg.CNDC_LINCOEF(2)));
set( hetCalSSJTSlope, 'String', num2str(tsg.SSJT_LINCOEF(1)));
set( hetCalSSJTOffset, 'String', num2str(tsg.SSJT_LINCOEF(2)));
set( hetCalSSTPSlope, 'String', num2str(tsg.SSTP_LINCOEF(1)));
set( hetCalSSTPOffset, 'String', num2str(tsg.SSTP_LINCOEF(2)));
end
%% Cal_OffMenuCallback ..................................... Calibration
%----------------------------------------------------------------------
% Callback function run when
%----------------------------------------------------------------------
function Cal_OffMenuCallback( hObject, eventdata)
% Activate or desactivate uipanels
% --------------------------------
set( hpCalCoef, 'Visible', 'off' );
set( hbgParameter, 'Visible', 'on');
% Enable Pushbuttons
% ------------------
set( hClimToggletool, 'enable', 'on' );
set( hBottleToggletool, 'enable', 'on' );
set( hInterpToggletool, 'enable', 'on' );
set( hHeaderPushtool, 'enable', 'on' );
set( hQCToggletool, 'state', 'off', 'enable', 'on' );
set( hPanToggletool, 'state', 'off', 'enable', 'on' );
set( hTimelimitToggletool, 'state', 'off', 'enable', 'on' );
set( hZoomToggletool, 'state', 'off', 'enable', 'on' );
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Save the calibration coefficient
% --------------------------------
tsg.CNDC_LINCOEF(1) = str2num(get( hetCalCNDCSlope, 'String'));
tsg.CNDC_LINCOEF(2) = str2num(get( hetCalCNDCOffset, 'String'));
tsg.SSJT_LINCOEF(1) = str2num(get( hetCalSSJTSlope, 'String'));
tsg.SSJT_LINCOEF(2) = str2num(get( hetCalSSJTOffset, 'String'));
tsg.SSTP_LINCOEF(1) = str2num(get( hetCalSSTPSlope, 'String'));
tsg.SSTP_LINCOEF(2) = str2num(get( hetCalSSTPOffset, 'String'));
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, tsg.preference.parameter );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
end
%% CalibrateCallback .......................................... Calibration
function CalibrateCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Get the calibration coefficients.
% They will be used in the function calibration
% ---------------------------------------------
tsg.CNDC_LINCOEF(1) = str2num(get( hetCalCNDCSlope, 'String'));
tsg.CNDC_LINCOEF(2) = str2num(get( hetCalCNDCOffset, 'String'));
tsg.SSJT_LINCOEF(1) = str2num(get( hetCalSSJTSlope, 'String'));
tsg.SSJT_LINCOEF(2) = str2num(get( hetCalSSJTOffset, 'String'));
tsg.SSTP_LINCOEF(1) = str2num(get( hetCalSSTPSlope, 'String'));
tsg.SSTP_LINCOEF(2) = str2num(get( hetCalSSTPOffset, 'String'));
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Calibrate the sensors
% ---------------------
calibration( hMainFig );
% Update the Adjusted variables (SSPS - SSJT) with calibrated records
% -------------------------------------------------------------------
updateAdjustedVariable( hMainFig );
% Refresh plot #1
% ---------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );
end
%% CancelCalibrationCallback .................................. Calibration
function CancelCalibrationCallback(hObject, eventdata)
% Callback function run when
% Get tsg application data
% ------------------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Emptied the CAL variables
% -------------------------
tsg.CNDC_CAL = [];
tsg.SSPS_CAL = [];
tsg.SSJT_CAL = [];
tsg.SSTP_CAL = [];
% Save tsg application data
% --------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Update the Adjusted variables
% -----------------------------
updateAdjustedVariable( hMainFig );
% Refresh plot #1
% ---------------
plot_Calibration( hMainFig, hPlotAxes, 1, 'SSPS' );
plot_Calibration( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Calibration( hMainFig, hPlotAxes, 3, 'SSTP' );
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );
end
%% Zoom_OffMenuCallback
%----------------------------------------------------------------------
% Callback function run when the zoom toggle toolbar is released
%----------------------------------------------------------------------
function Zoom_OffMenuCallback(hObject, eventdata)
% turns interactive zooming off
% -----------------------------
zoom off;
% Set the right limit and interval to the 3 axes
% ----------------------------------------------
for iaxe = 1:3
set(hPlotAxes(iaxe),'XTickMode','auto')
datetick(hPlotAxes(iaxe),'x','keeplimits')
end
% Turns off the automatic adaptation of date ticks
% ------------------------------------------------
zoomAdaptiveDateTicks('off');
end
%% Zoom_OnMenuCallback
%----------------------------------------------------------------------
% Callback function run when the zoom toggle toolbar is released
%----------------------------------------------------------------------
function Zoom_OnMenuCallback(hObject, eventdata)
% cursor back to normal
% ---------------------
set(hMainFig,'Pointer','arrow');
% returns a zoom mode object for the figure hMainFig handle
% --------------------------------------------------------
hZoom = zoom(hMainFig);
% Disallows a zoom operation on the MAP axes objects
% --------------------------------------------------
setAllowAxesZoom(hZoom, hPlotAxes(4), false);
% turns on interactive zooming (same effect than zoom on) but prevent
% side effect on another figure
% -------------------------------------------------------------------
set(hZoom, 'enable', 'on');
%zoom on;
% Turns on the automatic adaptation of date ticks
% -----------------------------------------------
zoomAdaptiveDateTicks('on');
% Desactivate some toggle buttons
% -------------------------------
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
end
%% Pan_OffMenuCallback
%----------------------------------------------------------------------
% Callback function run when the pan toggle toolbar is released
%----------------------------------------------------------------------
function Pan_OffMenuCallback(hObject, eventdata)
% turns interactive pan off
% -------------------------
pan off;
% Set the right limit and interval to the 3 axes
% ----------------------------------------------
for iaxe = 1:3
set(hPlotAxes(iaxe), 'XTickMode', 'auto')
datetick(hPlotAxes(iaxe), 'x', 'keeplimits')
end
% Turns off the automatic adaptation of date ticks
% ------------------------------------------------
panAdaptiveDateTicks('off');
end
%% Pan_OnMenuCallback
%----------------------------------------------------------------------
% Callback function run when the pan toggle toolbar is selected
%----------------------------------------------------------------------
function Pan_OnMenuCallback(hObject, eventdata)
% cursor back to normal
% ---------------------
set(hMainFig, 'Pointer', 'arrow');
% Returns a pan mode object for the figure handle
% -----------------------------------------------
hPan = pan(hMainFig);
% Disallows a pan operation on the MAP axes objects
% --------------------------------------------------
setAllowAxesPan(hPan, hPlotAxes(4), false);
% turns on interactive pan (same effect than pan on) but prevent
% side effect on another figure
% --------------------------------------------------------------
set(hPan, 'enable', 'on');
% Turns on the automatic adaptation of date ticks
% -----------------------------------------------
panAdaptiveDateTicks('on');
% Desactivate some toggle buttons
% -------------------------------
set( hQCToggletool, 'state', 'off' );
set( hZoomToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
end
%% QC_OnMenuCallback ............................... Quality Control Module
%----------------------------------------------------------------------
% Callback function run when the QC toggle tool is pressed
%----------------------------------------------------------------------
function QC_OnMenuCallback(gcbo, eventdata)
PARA = tsg.preference.parameter;
% Make the QC code uipanel visible
% --------------------------------
set( hbgQc, 'Visible' ,'on');
set( hbgParameter, 'Visible', 'off');
% Desactivate toggletools.
% ------------------------
set( hZoomToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
set( hCalToggletool, 'state', 'off', 'enable', 'off' );
set( hInterpToggletool, 'state', 'off', 'enable', 'off' );
% Activate right clic context menu on first axes (salinity)
% ---------------------------------------------------------
set(hPlotAxes(1),'UIContextMenu', hQcCmenu);
% Activate clic mouse menu on first axes (salinity) for next rbbox
% ----------------------------------------------------------------
set(hPlotAxes(1),'ButtonDownFcn', @QC_SelectCallback);
% change cursor to crosshair aspect
% ---------------------------------
set( hMainFig, 'Pointer', 'crosshair');
% -------------------------------------------------------------
% nested function on mouse clic when QC toggle tool is selected
% -------------------------------------------------------------
function QC_SelectCallback(gcbo, eventdata)
% disable ButtonMotion on main fig during select
% prevent drawing to map
% ----------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', []);
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Selection of the data within the figure
% ---------------------------------------
point1 = get(gca,'CurrentPoint'); % button down detected
finalRect = rbbox; % return figure units
point2 = get(gca,'CurrentPoint'); % button up detected
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2);
p2 = max(point1,point2); % calculate locations
% The following code is only executed if the left mouse button is clicked.
% If the right mouse button is clicked, this code must not be
% executed as the variable 'ind' will be emptied. And this variable
% is used when the context menu (callback 'Qc') is called
% -----------------------------------------------------------------
if ~strcmp( get(gcf, 'SelectionType'), 'alt')
% The QC is applied either on TSG data either on Sample data.
% it depends if the Botte Toggle button has been cliked on
% -----------------------------------------------------------
if strcmp( get(hBottleToggletool, 'state'), 'on')
% get index on selected zone
% --------------------------
ind = find(tsg.DAYD_SPL > p1(1,1) &...
tsg.DAYD_SPL < p2(1,1) & ...
tsg.([PARA '_SPL_DIF']) > p1(1,2) &...
tsg.([PARA '_SPL_DIF']) < p2(1,2));
% Keep the information on the indices of the selected zone
% --------------------------------------------------------
tsg.rbboxind = ind .* ones(size(ind));
% Modifiy the QC
% --------------
tsg.([PARA '_SPL_QC'])(ind) = tsg.qc.active.Code;
% Save the modifications
% ----------------------
setappdata( hMainFig, 'tsg_data', tsg);
% Update sample QC in the _WS and _EXT records
% --------------------------------------------
updateSampleQC( hMainFig, PARA );
% plot selected data with selected code
% --------------------------------------
plot_Correction( hMainFig, hPlotAxes, PARA);
else
% get index on selected zone
% ---------------------------
ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ...
tsg.(PARA) > p1(1,2) & tsg.(PARA) < p2(1,2));
% Keep the information on the indices of the selected zone
% --------------------------------------------------------
tsg.rbboxind = ind .* ones(size(ind));
% Modifiy the QC
% --------------
tsg.([PARA '_QC'])(ind) = tsg.qc.active.Code;
% put last SSPS_QC in queue (Undo/Redo)
% -------------------------------------
tsg.queue = push( tsg.queue, tsg.([PARA '_QC']));
% store QC in queue object, for undo
% ----------------------------------
tsg.queue = push(tsg.queue, tsg.([PARA '_QC']));
% Save the modifications
% ----------------------
setappdata( hMainFig, 'tsg_data', tsg);
% Draw plot 1 of the validation figure
% ------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, PARA );
% refresh QC statistic panel
% --------------------------
display_QC( hMainFig, hPlotAxes );
% enable undo menu
% ----------------
set(findobj('tag','UIMENU_UNDO'),'enable','on');
end
% As soon as a modification took place the data should be saved
% -------------------------------------------------------------
set( hSaveMenu, 'UserData', 'on' );
end
% enable ButtonMotion on main fig after select QC area
% ----------------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
end
end
%% QC_OffMenuCallback .............................. Quality Control Module
%----------------------------------------------------------------------
% Callback function run when the QC toggle tool is released
%----------------------------------------------------------------------
function QC_OffMenuCallback(gcbo, eventdata)
% Desactive right clic menu on first axes (salinity)
% ---------------------------------------------------
set(hPlotAxes(1),'UIContextMenu', []);
% Desactive clic mouse menu (zoom) on first axes (salinity)
% ----------------------------------------------------------
set(hPlotAxes(1),'ButtonDownFcn', []);
% Uipanel visible or not
% -----------------------
set( hbgQc, 'Visible', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
set( hCalToggletool, 'state', 'off', 'enable', 'on' );
set( hInterpToggletool, 'state', 'off', 'enable', 'on' );
% uibuttongroup uipanel used to choose a parameter is set to
% on only if the Correction screen (bottle toggletool) is off
% -----------------------------------------------------------
if strcmp( get( hBottleToggletool, 'state'), 'off')
set( hbgParameter, 'Visible', 'on');
end
% cursor back to normal
% ---------------------
set(hMainFig,'Pointer','arrow');
end
%% Qc context menu selected ........................ Quality Control Module
%-----------------------------------------------------------
% Callback function run when the QC context menu is selected
%
% Context menu used to attribute a QC to the TSG time series
%
%-----------------------------------------------------------
function Qc(hObject, eventdata, key)
% Retrieve Default Quality Code and Color
% ---------------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Get the parameter (SSPS, SSJT or SSTP)
% --------------------------------------
PARA = tsg.preference.parameter;
% get key and some values in hashtable
% ------------------------------------
code = get(tsg.qc.hash, key, 'code');
color = get(tsg.qc.hash, key, 'color');
% set active code and color from selected context menu
% ----------------------------------------------------
tsg.qc.active.Code = code;
tsg.qc.active.Color = color;
% Modify and plot the last selected tsg data
% ------------------------------------------
if ~isempty( tsg.rbboxind )
if strcmp( get(hBottleToggletool, 'state'), 'on')
tsg.([PARA '_SPL_QC'])(tsg.rbboxind) = tsg.qc.active.Code;
% Save tsg.SSPS_QC and tsg.qc.active.Code
% in the application data
% ----------------------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Draw the 3 plots of the Correction figure
% -----------------------------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
else
tsg.([PARA '_QC'])(tsg.rbboxind) = tsg.qc.active.Code;
% Save tsg.SSPS_QC in the application data
% ----------------------------------------
setappdata( hMainFig, 'tsg_data', tsg );
% Draw plot 1 of the validation figure
% ------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, PARA );
end
end
% Update the radio button corresponding to the selected
% QC context menu (rbg : RadioButtonGroup)
% -----------------------------------------------------
radioTag = ['TAG_QC_RADIO_' key]; % Build the TAG of the CODE
hbgChildren = get(hbgQc,'Children'); % Get the handles of the rbg
hbgTagCell = get(hbgChildren, 'tag'); % get the TAG of the rbg
ind = strcmp(radioTag, hbgTagCell); % Compare the TAG
hRadioButton = hbgChildren( ind == 1 ); % Get the handle of the button
set(hbgQc, 'SelectedObject', hRadioButton); % Make this button active
setappdata( hMainFig, 'tsg_data', tsg );
end
%% Radiobutton Quality Control ..................... Quality Control Module
% ---------------------------------------------------------------
% Callback to select CODE and COLOR QC from the RadioButton Group
% ---------------------------------------------------------------
function RadiobuttonQc(source, eventdata)
% Retrieve Default Quality Code and Color
% ---------------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Retrieve the key from the active RadioButton
% --------------------------------------------
rbTag = get(eventdata.NewValue,'Tag');
key = strrep(rbTag, 'TAG_QC_RADIO_', '');
% store his handle to uibuttongroup userdata
% ------------------------------------------
set(hbgQc,'Userdata', eventdata.NewValue);
% get key and some values in hashtable
% ------------------------------------
code = get(tsg.qc.hash, key, 'code');
color = get(tsg.qc.hash, key, 'color');
% set active code and color from selected context menu
% ----------------------------------------------------
tsg.qc.active.Code = code;
tsg.qc.active.Color = color;
setappdata( hMainFig, 'tsg_data', tsg );
end
%% Radiobutton Parameter choice ..................... Parameter choice
% ---------------------------------------------------------------
% Callback to select CODE and COLOR QC from the RadioButton Group
% ---------------------------------------------------------------
function RadiobuttonParameter(source, eventdata)
% If the map is visible, hide it
% ------------------------------
set( hMapPanel, 'visible', 'off' );
set( hMapToggletool, 'state', 'off');
set( hClimToggletool, 'state', 'off');
% Retrieve Default Quality Code and Color
% ---------------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Retrieve the key from the active RadioButton
% --------------------------------------------
rbTag_Old = get(eventdata.OldValue,'Tag');
rbTag = get(eventdata.NewValue,'Tag');
PARA = strrep(rbTag, 'TAG_PARA_RADIO_', '');
% Test if PARA exists
% -------------------
ind = find( isnan(tsg.(PARA)) == 0 );
if ~isempty( tsg.(PARA) ) & ~isempty (ind )
% store his handle to uibuttongroup userdata
% ------------------------------------------
set(hbgParameter,'Userdata', eventdata.NewValue);
tsg.preference.parameter = PARA;
setappdata( hMainFig, 'tsg_data', tsg );
% Get sample data
% ---------------
tsg_mergesample( hMainFig, PARA );
% The smooth TSG time series (tsg_moveaverage) is
% no more computed : too long
% We now computed a smooth value only at the position of the sample
% in diffTsgSample
% -----------------------------------------------------------------
%tsg_moveaverage(hMainFig, PARA);
% Draw the 3 plots of the validation figure
% -----------------------------------------
resetAxes( hMainFig, hPlotAxes )
plot_Validation( hMainFig, hPlotAxes, 1, PARA );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
else
msgbox( ['No ' PARA ' data in the file'], 'Parameter choice', 'warn', 'modal');
% Set the old radio-button active
% -------------------------------
hbgChildren = get(hbgParameter,'Children'); % Get the handles of the rbg
hbgTagCell = get(hbgChildren, 'tag'); % get the TAG of the rbg
ind = strcmp(rbTag_Old, hbgTagCell); % Compare the TAG
hRadioButton = hbgChildren( ind == 1 ); % Get the handle of the button
set(hbgParameter, 'SelectedObject', hRadioButton); % Make this button active
end
end
%% preQcPanCallback .................................Quality Control Module
% ---------------------------------------------------------------
% Callback function ... to be completed
% ---------------------------------------------------------------
function preQcPanCallback(obj, evd)
set(hQCToggletool, 'state', 'off' );
end
%% postQcPanCallback ............................... Quality Control Module
% ---------------------------------------------------------------
% Callback function ... to be completed
% ---------------------------------------------------------------
function postQcPanCallback(obj, evd)
set(hQCToggletool, 'state', 'on' );
% Set the right limit and interval to the 3 axes
% ----------------------------------------------
for iaxe = 1:3
set(hPlotAxes(iaxe),'XTickMode','auto')
datetick(hPlotAxes(iaxe),'x','keeplimits')
end
end
%% MouseMotion
%---------------------------------------------------------------------
% Callback function run when mouse pointer is moving on temperature plot
% draw corresponding measurement position on map
%---------------------------------------------------------------------
function MouseMotion(hObject, eventdata)
% Test if the callback can be activated
% -------------------------------------
if strcmp( get( hMainFig, 'UserData'), 'ButtonMotionOn')
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Get current position of cusor and return its coordinates in
% axes with handle h_axes
% -----------------------------------------------------------
a = get(hPlotAxes(1), 'CurrentPoint');
x = a(2,1);
y = a(2,2);
% Get the Limits of axes 1
% ------------------------
limx = get(hPlotAxes(1), 'XLim');
limy = get(hPlotAxes(1), 'YLim');
% Code to Activate the PAN function when QC mode is active
% A PAN zone is defined in the bottom (10%) of PlotAxes(1)
% 2 callback are needed :
% 1 - one to desactivate QC when Pan is set to on.
% 2 - one to reactivate QC once the pan has been used.
% ---------------------------------------------------------
qcState = get(hQCToggletool, 'state' );
if strcmp(qcState, 'on' );
% Suppose that Y axes is increasing from the bottom to the top
% ------------------------------------------------------------
limy2 = limy(1) + (limy(2)-limy(1)) * 0.10;
if x > limx(1) && x < limx(2) && y <= limy2 && y >= limy(1)
hPan = pan(hMainFig);
set(hPan,'ActionPreCallback', @preQcPanCallback);
set(hPan,'ActionPostCallback', @postQcPanCallback);
set(hPan,'Enable','on');
else
pan off
end
end
% Dynamically display data in uicontrol
% -------------------------------------
if x > tsg.DAYD(1) && x < tsg.DAYD(end)
%if x > limx(1) && x < limx(2)
indCursor = find( tsg.DAYD > x);
set( hInfoDateText, 'String',...
datestr(tsg.DAYD(indCursor(1)),'dd/mm/yyyy HH:MM'));
set( hInfoLatText, 'String', dd2dm(tsg.LATX(indCursor(1)),0));
set( hInfoLongText, 'String', dd2dm(tsg.LONX(indCursor(1)),1));
set( hInfoSSPSText, 'String', tsg.SSPS(indCursor(1)));
set( hInfoSSJTText, 'String', tsg.SSJT(indCursor(1)));
if ~isempty(tsg.SSTP)
set( hInfoSSTPText, 'String', tsg.SSTP(indCursor(1)));
end
% Plot the position on the map if this one is active
% --------------------------------------------------
if strcmp( get(hMapPanel, 'Visible'), 'on')
% Select the map axes
% -------------------
axes( hPlotAxes(4));
if isempty( get(hMapPanel, 'UserData'))
if ~isnan( tsg.LONX(indCursor(1)) )
hMarker = m_line( tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),...
'Marker','o','MarkerSize',5, ...
'Color','r', 'MarkerFaceColor','r');
set(hMapPanel, 'UserData', hMarker);
end
else
if ~isnan( tsg.LONX(indCursor(1)) )
delete(get(hMapPanel, 'UserData'));
hMarker = m_line( ...
tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),...
'Marker','o','MarkerSize',5, ...
'Color','r', 'MarkerFaceColor','r');
set(hMapPanel, 'UserData', hMarker);
end
end
end
end
end
end
%% Map_OffMenuCallback
%---------------------------------------------------------------------
% Callback function run when the Map tool bar item is unselected
%---------------------------------------------------------------------
function Map_OffMenuCallback(hObject, eventdata)
% Make the earth map invisible
% ----------------------------
set(hMapPanel, 'Visible', 'off' );
end
%% Map_OnMenuCallback
%---------------------------------------------------------------------
% Callback function run when the Map tool bar item is selected
%---------------------------------------------------------------------
function Map_OnMenuCallback(hObject, eventdata)
% Desactivate Zoom and Pan toggle buttons
% may be change in the futur ...
% ---------------------------------------
set(hZoomToggletool, 'state', 'off' );
set(hPanToggletool, 'state', 'off' );
% Make the earth map visible
% --------------------------
set(hMapPanel, 'Visible', 'on' );
erase_Line( hPlotAxes, 4 );
plot_map( hMainFig, hPlotAxes)
end
%% Bottle_OnMenuCallback ................................ Correction Module
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected
%---------------------------------------------------------------------
function Bottle_OnMenuCallback(hObject, eventdata)
% Callback function run when the Bottle tool bar item is selected
% Get the tsg structure
% ---------------------
tsg = getappdata(hMainFig, 'tsg_data');
% Get the parameter we are working on (SSPS, SSJT, SSTP)
% ------------------------------------------------------
PARA = tsg.preference.parameter;
% Switch somme buttons
% --------------------
set( hZoomToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hMapToggletool, 'state', 'off' );
set( hClimToggletool, 'state', 'off', 'enable', 'off');
set( hCalToggletool, 'enable', 'off' );
set( hInterpToggletool, 'enable', 'off' );
set( hTimelimitToggletool, 'enable', 'on' );
% Activate ord desactivate uipanels
% ---------------------------------
set( hpDateLimit, 'Visible', 'on' );
set( hbgCorMethod, 'Visible', 'on' );
set( hbgParameter, 'Visible', 'off');
set( hbgQc, 'Visible', 'off');
% Test if tsg and sample data have been loaded
% --------------------------------------------
if ~isempty( tsg.([PARA '_SPL']) )
% % Running average of TSG time series
% % ----------------------------------
% tsg_moveaverage(hMainFig, PARA);
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig, PARA );
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
% Get the information on time limits of the time series
% Write them in the uipanel
% -----------------------------------------------------
noNaN = tsg.DAYD(~isnan( tsg.DAYD ));
set( hetDateMin, 'String', datestr(noNaN(1), 31));
set( hetDateMax, 'String', datestr(noNaN(end), 31));
else
% Desactivate the corretion module
% --------------------------------
set( hBottleToggletool, 'state', 'off' );
msgbox('Sample data not loaded in the program', 'modal');
end
end
%% Bottle_OffMenuCallback ............................... Correction module
%---------------------------------------------------------------------
% Callback function run when the bootle push tool is selected
%---------------------------------------------------------------------
function Bottle_OffMenuCallback(hObject, eventdata)
% If necessary toggle off some buttons
% ------------------------------------
set( hZoomToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hMapToggletool, 'state', 'off' );
set( hClimToggletool, 'enable', 'on');
set( hCalToggletool, 'enable', 'on' );
set( hInterpToggletool, 'enable', 'on' );
set( hTimelimitToggletool, 'enable', 'off' );
% Activate or Desactivate uipanel
% --------------------------------
set( hpDateLimit, 'Visible', 'off' );
set( hbgCorMethod, 'Visible', 'off' );
set( hbgParameter, 'Visible', 'on');
% Desactivate Click Mouse on figure
% ---------------------------------
set( hMainFig, 'WindowButtonDownFcn', []);
% Get tsg structure
% -----------------
tsg = getappdata( hMainFig, 'tsg_data' );
% Get the parameter (SSPS, SSJT, SSTP)
% ------------------------------------
PARA = tsg.preference.parameter;
% Drawing only necessary if the Correction moduel has been activated
% ------------------------------------------------------------------
if ~isempty( tsg.([PARA '_SPL']) )
% Draw the 3 plots of the validation figure
% -----------------------------------------
plot_Validation( hMainFig, hPlotAxes, 1, PARA );
plot_Validation( hMainFig, hPlotAxes, 2, 'SSJT' );
plot_Validation( hMainFig, hPlotAxes, 3, 'SPDC' );
end
% Set the pointer
% ---------------
set( hMainFig, 'Pointer', 'arrow');
end
%% CorCancelCallback .................................... Correction Module
function CorCancelCallback(hObject, eventdata)
% Callback function run when ...
% Desactivate somme Toggle button
% -------------------------------
set( hZoomToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Get tsg application data
% ------------------------
tsg = getappdata(hMainFig, 'tsg_data');
% Get parameter we are working on (SSPS, SSJT, SSTP)
% --------------------------------------------------
PARA = tsg.preference.parameter;
% To cancel the correction set the ERROR to [] then
% call updateAdjustedVariable.
% --------------------------------------------------
tsg.([PARA '_ADJUSTED_ERROR']) = [];
% Save tsg data
% -------------
setappdata(hMainFig, 'tsg_data', tsg);
% Set the ADJUSTED variable either to the raw variable or to
% the calibrated variable
% ----------------------------------------------------------
updateAdjustedVariable( hMainFig );
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
end
%% CorLinearCallback .................................... Correction Module
function CorLinearCallback(hObject, eventdata)
% Callback function run when
% Desactivate somme Toggle button
% -------------------------------
set( hZoomToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Get the time limits for the correction A TESTER
% -----------------------------------------------
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
% Get the parameter (SSPS, SSJT, or SSTP)
% ---------------------------------------
tsg = getappdata(hMainFig, 'tsg_data');
PARA = tsg.preference.parameter;
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig, PARA );
% Correction
% ----------
error = corTsgLinear(hMainFig, PARA, dateMin, dateMax);
switch error
case 1
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
case -1
msgbox( 'Date limits are not correct',...
'Correction module', 'warn', 'modal');
end
end
%% CorMedianCallback .................................... Correction Module
function CorMedianCallback(hObject, eventdata)
% Callback function run when
% Desactivate somme Toggle button
% -------------------------------
set( hZoomToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hTimelimitToggletool, 'state', 'off' );
% Get the time limits for the correction A TESTER
% --------------------------------------
dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS');
dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS');
% Get the parameter (SSPS, SSJT, or SSTP)
% ---------------------------------------
tsg = getappdata(hMainFig, 'tsg_data');
PARA = tsg.preference.parameter;
% Compute the sample-TSG differences
% ----------------------------------
diffTsgSample( hMainFig, PARA );
% Correction
% ----------
error = corTsgMedian(hMainFig, PARA, dateMin, dateMax);
switch error
case 1
% Plot in the 3 axes
% ------------------
plot_Correction( hMainFig, hPlotAxes, PARA );
case -1
msgbox( 'Date limits are not correct',...
'Correction module', 'warn', 'modal');
end
end
%% SelectTime_OnMenuCallback
%---------------------------
function SelectTime_OnMenuCallback(hObject, eventdata)
% Callback function run when the ....
% Desactivate Zoom and Pan functions.
% ----------------------------------
set( hZoomToggletool, 'state', 'off' );
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
% Create a pointer to select the time limits
% ------------------------------------------
selTimePointer = ones(16)+1;
selTimePointer(1,:) = 1; selTimePointer(16,:) = 1;
selTimePointer(:,1) = 1; selTimePointer(:,16) = 1;
selTimePointer(1:4,8:9) = 1; selTimePointer(13:16,8:9) = 1;
selTimePointer(8:9,1:4) = 1; selTimePointer(8:9,13:16) = 1;
selTimePointer(5:12,5:12) = NaN; % Create a transparent region in the center
% Activate clic mouse menu on second axes (salinity) for next rbbox
% ----------------------------------------------------------------
set(hMainFig,'WindowButtonDownFcn', @Time_SelectCallback);
% change cursor
% ---------------
set( hMainFig, 'Pointer', 'custom',...
'PointerShapeCData', selTimePointer, 'PointerShapeHotSpot',[9 9]);
% ----------------------------------------------------------------------
% nested function on mouse clic when Select Time toggle tool is selected
% ----------------------------------------------------------------------
function Time_SelectCallback(gcbo, eventdata)
% disable ButtonMotion on main fig during select
% prevent drawing to map
% ----------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', []);
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% Selection of the data within the figure
% ---------------------------------------
point1 = get(gca,'CurrentPoint'); % button down detected
finalRect = rbbox; % return figure units
point2 = get(gca,'CurrentPoint'); % button up detected
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2);
p2 = max(point1,point2); % calculate locations
% get index on selected zone - Only on X axes (time)
% --------------------------------------------------
ind = find(tsg.DAYD >= p1(1,1) & tsg.DAYD <= p2(1,1));
% Write the date in the Editable uicontrol
% ----------------------------------------
set( hetDateMin, 'String', datestr(tsg.DAYD(ind(1)), 31));
set( hetDateMax, 'String', datestr(tsg.DAYD(ind(end)), 31));
% enable ButtonMotion on main fig after select QC area
% ----------------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
end
end
%% SelectTime_OffMenuCallback
%----------------------------
function SelectTime_OffMenuCallback(hObject, eventdata)
% Callback function run when the ....
% Desactivate time limit buttons
% ------------------------------
set( hTimelimitToggletool, 'state', 'off');
set( hMainFig, 'WindowButtonDownFcn', []);
set( hMainFig, 'Pointer', 'arrow');
end
%% Clim_OffMenuCallback
%------------------------------------------------------------------------
% Callback function run when the Levitus climatology toolbar is unselected
%------------------------------------------------------------------------
function Clim_OffMenuCallback(hObject, eventdata)
% Get lines handles from tag
% --------------------------
hLines = findobj('-regexp', 'Tag', 'TAG_LINE_CLIMATO_');
% Delete climatology lines on axes
% ---------------------------------
delete(hLines);
end
%% Clim_OnMenuCallback
%------------------------------------------------------------------------
% Callback function run when the Levitus climatology toolbar is unselected
%------------------------------------------------------------------------
function Clim_OnMenuCallback(hObject, eventdata)
% Test if the TSG and bucket files have been read
% -----------------------------------------------
if strcmp( get(hOpenMenu, 'UserData'), 'on' )
% plot climatology
% ----------------
plot_Climatology(hMainFig, hPlotAxes);
end
end
%% ClimatoSelectMenuCallback
% -------------------------------------------------------------------
% Callback function run when climato submenu is selected
% -------------------------------------------------------------------
function ClimatoSelectMenuCallback(hObject, eventdata, climato, time)
% find all climato submenu and set 'checked' property to 'off'
% ------------------------------------------------------------
hdl = findobj( '-regexp', 'tag', 'TAG_UIMENU_CLIMATO');
set(hdl, 'checked', 'off');
% set current climato submenu checked
% -----------------------------------
set(hObject, 'checked', 'on');
% memorize action on climatology menu for next use
% ------------------------------------------------
s.type = climato;
s.time = time;
set(hClimatoMenu, 'userdata', s);
% check if climatology toggle button is set
% -----------------------------------------
if strcmp(get(hClimToggletool, 'state'), 'on')
% clear last plotted climatology
% ------------------------------
Clim_OffMenuCallback;
% plot and read (eventually) new climatology
% ------------------------------------------
plot_Climatology(hMainFig, hPlotAxes);
end
end
%% PreferencesMenuCallback
% -------------------------------------------------------------------
% Callback function run when Option/Preference is selected
% -------------------------------------------------------------------
function PreferencesMenuCallback(hObject, eventdata)
% Test if the preference menu is allready checked
% -----------------------------------------------
if strcmp( get(hObject, 'checked'), 'on' )
% set preference autoload off (unchecked)
% ---------------------------------------
tsg.preference.autoload = 'off';
else
% set preference autoload on (checked)
% ------------------------------------
tsg.preference.autoload = 'on';
end
% set current option/preference submenu state
% -------------------------------------------
set(hObject, 'checked', tsg.preference.autoload);
end
%% HeaderMenuCallback
% -------------------------------------------------------------------
% Callback function run when the headerForm tool bar item is selected
% -------------------------------------------------------------------
function HeaderMenuCallback(hObject, eventdata)
% call header form function
% -------------------------
headerForm(hMainFig);
end
%% PrintFigMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Report tool bar item is selected
% -------------------------------------------------------------------
function PrintFigMenuCallback(hObject, eventdata)
% disable ButtonMotion on main fig during select
% prevent drawing to map
% ----------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', []);
msgbox( 'Function not yet implemented', 'warn', 'modal');
% printpreview(hMainFig);
%printdlg;
%dlg = pagesetupdlg(hMainFig);
%waitfor(dlg)
% enable ButtonMotion on main fig after select QC area
% ----------------------------------------------------
set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
end
%% ReportMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Report tool bar item is selected
% -------------------------------------------------------------------
function ReportMenuCallback(hObject, eventdata)
% call report function
% --------------------
saveReport(hMainFig);
end
%% SaveMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Save menu item is selected
% -------------------------------------------------------------------
function SaveMenuCallback(hObject, eventdata)
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
% fill or append header form
% -------------------------
error = headerForm(hMainFig);
% if user press continue button, ask for netcdf file
% ------------------------------------------------
if error ~= -1
[fileName, pathName, filterindex] = uiputfile('*.nc', ...
'Save file name', strcat(tsg.file.name, '.nc'));
% if user press cancel button, all var are set to zero
% ----------------------------------------------------
if filterindex == 0
return;
end
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
% flushes the event queue and updates the closed uiputfile window
% ---------------------------------------------------------------
drawnow;
% write netcdf file
% -----------------
error = writeTSGDataNetCDF(hMainFig, strcat(pathName, fileName));
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% Check for NetCDF writing error
% must to be rewriting
% ------------------------------
if error == -1
warning('tsgqc_GUI:SaveMenuCallback', ...
'NetCDF writing error: %s %s', pathName, fileName);
return;
end
% update the display
% ------------------
set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));
% Write a TXT file
% ----------------
fileName = strcat(tsg.file.name, '_w.txt');
error = writeTsgDataTxt(hMainFig, strcat(pathName, fileName));
% Check for TxT writing error - must to be rewriting
% --------------------------------------------------
if error == -1
warning('tsgqc_GUI:SaveMenuCallback', ...
'TxT writing error: %s %s', pathName, fileName);
return;
end
% enable Quality Control mode
% ---------------------------
hdl_pushtool = findobj('Tag', 'QC');
set(hdl_pushtool, 'Enable', 'on');
end
end
%% ExportMenuCallback
% -------------------------------------------------------------------
% Callback function run when the Export menu item is selected
% -------------------------------------------------------------------
function ExportMenuCallback(hObject, eventdata)
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
%
% ------------------------------------------------
[fileName, pathName, filterindex] = uiputfile('*.tsg', ...
'Save file name', strcat(tsg.file.name, '.tsg'));
% if user press cancel button, all var are set to zero
% ----------------------------------------------------
if filterindex == 0
return;
end
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
% update the display
% ------------------
set( hInfoFileText, 'String', strcat(tsg.file.name, tsg.file.ext));
% Write a .TSG (ascii) file
% --------------------------
error = writeTsgDataTsg(hMainFig, strcat(pathName, fileName));
% Check for .TSG writing error - must to be rewriting
% --------------------------------------------------
if error == -1
warning('tsgqc_GUI:SaveMenuCallback', ...
'TSG writing error: %s %s', pathName, fileName);
return;
end
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
% enable Quality Control mode
% ---------------------------
hdl_pushtool = findobj('Tag', 'QC');
set(hdl_pushtool, 'Enable', 'on');
end
%% UndoMenuCallback
% -----------------------------------------------------------------------
% Callback function run when the Edit/Undo menu item is selected (Ctrl+Z)
% -----------------------------------------------------------------------
function UndoMenuCallback(hObject, eventdata)
% Undo module not yet implemented
% -------------------------------
% msgbox('Undo module not yet implemented', 'modal');
tsg.queue = undo(tsg.queue);
tsg.SSPS_QC = get(tsg.queue);
% Make the Salinity, temperature and velocity plot
% ------------------------------------------------
plot_SalTempVel( hMainFig, hPlotAxes );
end
%% RedoMenuCallback
% -----------------------------------------------------------------------
% Callback function run when the Edit/Redo menu item is selected (Ctrl+R)
% -----------------------------------------------------------------------
function RedoMenuCallback(hObject, eventdata)
% Redo module not yet implemented
% -------------------------------
msgbox('Redo module not yet implemented', 'modal');
end
%% QuitMenuCallback
% -----------------------------------------------------------------
% Callback function run when the Quit menu item is selected
% -----------------------------------------------------------------
function QuitMenuCallback(hObject, eventdata)
% save config mat file in prefdir
% -------------------------------
config_file = [prefdir, filesep, tsgqcname, '.mat'];
% set tsg.levitus empty before save preferences in mat file
% ---------------------------------------------------------
tsg.levitus = [];
% save preference mat file
% ------------------------
save( config_file, 'tsg');
% If the data have been modified and not save, the program
% ask to save the data
% --------------------------------------------------------
if strcmp( get( hSaveMenu, 'UserData' ), 'on')
selection = ...
questdlg('The file has been modified. Do you want to save it ?',...
'Save before Quit?',...
'Yes', 'No', 'Yes');
if strcmp(selection, 'Yes')
% call File/Save Menu Callback before before quit
% -----------------------------------------------
SaveMenuCallback;
end
% quit program
% ------------
quitProgram(hMainFig, DEFAULT_PATH_FILE);
else
selection = ...
questdlg(['Quit ' get(hMainFig, 'Name') '?'],...
['Quit ' get(hMainFig, 'Name') '?'],...
'Yes', 'No', 'Yes');
if strcmp(selection, 'No')
return;
else
quitProgram(hMainFig, DEFAULT_PATH_FILE);
end
end
end
% end of tsgqc_GUI
% ----------------
end