Newer
Older

jacques.grelet_ird.fr
committed
% 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
% ********************

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

jacques.grelet_ird.fr
committed
% Define global variable VERSION number
% -------------------------------------
global VERSION
VERSION = '0.2a';

jacques.grelet_ird.fr
committed
% 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;

jacques.grelet_ird.fr
committed
% get screen dimensions (pixels)
% ------------------------------
set(0,'Units','pixels');
screenSize = get(0,'ScreenSize');
% define default font size based on screen resolution
% ---------------------------------------------------
if screenSize(3) <= 1024

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
% 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;

jacques.grelet_ird.fr
committed
%% Main GUI
% Create and then hide the GUI as it is being constructed.

jacques.grelet_ird.fr
committed
% --------------------------------------------------------
hMainFig = figure(...
'Name', 'TSG Validation', ...
'NumberTitle', 'off', ...
'Resize', 'on', ...
'Menubar','none', ...
'Toolbar', 'none', ...
'UserData', 'ButtonMotionOff', ...
'WindowButtonMotionFcn', @MouseMotion, ...
'CloseRequestFcn', @QuitProgram,...
'HandleVisibility','callback',...
'Visible','on',...

jacques.grelet_ird.fr
committed
'Tag','TAG_TSG-QC_GUI',...

jacques.grelet_ird.fr
committed
'Units', 'normalized',...
'Position',guiLimits, ...
'Color', get( 0, 'DefaultUIControlBackgroundColor' ));

jacques.grelet_ird.fr
committed
% Initialize tsg structure
% ------------------------
%tsg_initialisation(hMainFig)
%% Initialize tsg structure with tsg_preference function
% -----------------------------------------------------
tsg_preferences(hMainFig, tsgqcname);
% get root struct from root object
% --------------------------------
root = get(0,'Userdata');

jacques.grelet_ird.fr
committed
% Retrieve named application data
% -------------------------------
tsg = getappdata( hMainFig, 'tsg_data');
%% Menu File
% -----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
hFileMenu = uimenu(...
'Parent', hMainFig,...
'HandleVisibility','callback',...
'Label', 'File');
hOpenMenu = uimenu(...
'Parent', hFileMenu,...
'Label','Open',...
'Accelerator','O',...
'HandleVisibility','callback',...
'UserData', 'off',...

jacques.grelet_ird.fr
committed
'Callback', @OpenMenuCallback);
hSaveMenu = uimenu(...
'Parent', hFileMenu,...
'Label','Save',...
'Accelerator','S',...
'Enable', 'off',...
'UserData', 'off',...

jacques.grelet_ird.fr
committed
'HandleVisibility','callback',...
'Callback',@SaveMenuCallback);
hQuitMenu = uimenu(...
'Parent',hFileMenu,...
'Label','Quit',...
'Separator','on',...
'Accelerator','Q',...
'HandleVisibility','callback',...
'Callback',@QuitMenuCallback);

jacques.grelet_ird.fr
committed
%% 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);

jacques.grelet_ird.fr
committed
%% 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);

jacques.grelet_ird.fr
committed
% by defautl at startup, select climatology to annual
% ---------------------------------------------------
uimenu(hClimatoMenu,'Label','Annual',...

jacques.grelet_ird.fr
committed
'Checked','on',...

jacques.grelet_ird.fr
committed
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
'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',...

jacques.grelet_ird.fr
committed
'Callback',{@ClimatoSelectMenuCallback, 'monthly', i});
end
%% Menu Option with Preferences submenu
% --------------------------------------------------------
hOptionMenu = uimenu(hMainFig,'Label','Option');
uimenu(hOptionMenu,'Label','Preferences',...
'Checked', root.preference.autoload,...

jacques.grelet_ird.fr
committed
'Tag','TAG_UIMENU_OPTION_PREFERENCES',...

jacques.grelet_ird.fr
committed
'Callback', {@PreferencesMenuCallback});
%% Toolbar
% -----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
hToolbar = uitoolbar(... % Toolbar for Open and Print buttons
'Parent',hMainFig, ...

jacques.grelet_ird.fr
committed
'HandleVisibility','on');

jacques.grelet_ird.fr
committed
hOpenPushtool = uipushtool(... % Opendoc toolbar button
'Parent',hToolbar,...
'TooltipString','Open file',...
'CData', iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/opendoc.mat')),...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'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', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_SAVE',...
'Enable', 'off',...
'ClickedCallback', @SaveMenuCallback);

jacques.grelet_ird.fr
committed
hZoomToggletool = uitoggletool(... % Open Zoom toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'Separator', 'on', ...
'TooltipString','Zoom',...
'CData', iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/zoom.mat')),...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_ZOOM',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Zoom_OffMenuCallback,...
'ONCallback', @Zoom_OnMenuCallback);
hPanToggletool = uitoggletool(... % Open Pan toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Pan',...
'CData',iconRead(fullfile(matlabroot, ...
'/toolbox/matlab/icons/pan.mat')),...

jacques.grelet_ird.fr
committed
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_PAN',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Pan_OffMenuCallback,...
'OnCallback', @Pan_OnMenuCallback);
hQCToggletool = uitoggletool(... % Open QC toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Validation codes',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),...

jacques.grelet_ird.fr
committed
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'UserData', 'off',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @QC_OffMenuCallback,...
'OnCallback', @QC_OnMenuCallback);
hMapToggletool = uitoggletool(... % Open Map toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Map and ship track',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'mapicon.mat']),...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_MAP',...
'UserData', 'off', ...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Map_OffMenuCallback,...
'OnCallback', @Map_OnMenuCallback);
hClimToggletool = uitoggletool(... % Open Climatology toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Climatology',...
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_CLIM',...
'UserData', 'off',...
'Enable', 'off',...

jacques.grelet_ird.fr
committed
'OffCallback', @Clim_OffMenuCallback,...
'OnCallback', @Clim_OnMenuCallback);
hBottleToggletool = uitoggletool(... % Correction module toolbar button

jacques.grelet_ird.fr
committed
'Parent',hToolbar,...
'TooltipString','Correct the SSS TSG data',...

jacques.grelet_ird.fr
committed
'Separator', 'on', ...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),...
'HandleVisibility','on', ...
'UserData', 'off',...

jacques.grelet_ird.fr
committed
'Enable', 'off',...
'OffCallback', @Bottle_OffMenuCallback,...
'OnCallback', @Bottle_OnMenuCallback);
hStartlimitToggletool = uitoggletool(... % Select beginning of time series toolbar button
'Parent',hToolbar,...
'TooltipString','Select start time',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'startlimit.mat']),...
'HandleVisibility','on', ...
'Tag', 'CORRECT_STARTTIME', ...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @SelectTime_OffMenuCallback,...
'OnCallback', @SelectTime_OnMenuCallback);
hEndlimitToggletool = uitoggletool(... % Select end of time series
'Parent',hToolbar,...
'TooltipString','Select end time',...
'CData',iconRead(...
[DEFAULT_PATH_FILE 'tsg_icon' filesep 'endlimit.mat']),...
'HandleVisibility','on', ...
'Tag', 'CORRECT_ENDTIME', ...
'UserData', 'off',...
'Enable', 'off',...
'OffCallback', @SelectTime_OffMenuCallback,...
'OnCallback', @SelectTime_OnMenuCallback);

jacques.grelet_ird.fr
committed
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', ...

jacques.grelet_ird.fr
committed
'Tag','PUSHTOOL_HEADER',...
'Enable', 'off',...
'ClickedCallback', @HeaderMenuCallback);
%% Dynamic text area
% -----------------------------------------------------------------------
% Dynamic text area that displays the loaded filename, date, position and

jacques.grelet_ird.fr
committed
% salinity, temperature
% ------------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Create an uipanel

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

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Dynamic text area that displays the date
% ----------------------------------------
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.01, .25, .04, .6], ...

jacques.grelet_ird.fr
committed
'String', 'File:');
hInfoFileText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'No file loaded', ...
'Position', [.05, .25, .1, .6]);

jacques.grelet_ird.fr
committed
% Text area that displays the date
% --------------------------------
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.15, .25, .04, .6], ...

jacques.grelet_ird.fr
committed
'String', 'Date:');
hInfoDateText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.20, .25, .13, .6]);

jacques.grelet_ird.fr
committed
% Text area that displays the latitude
% ------------------------------------
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.33, .25, .06, .6], ...

jacques.grelet_ird.fr
committed
'String', 'Latitude:');
hInfoLatText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.4, .25, .9, .6]);

jacques.grelet_ird.fr
committed
% Text area that displays the longitude
% -------------------------------------
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.495, .25, .08, .6], ...

jacques.grelet_ird.fr
committed
'String', 'Longitude:');
hInfoLongText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.585, .25, .09, .6]);

jacques.grelet_ird.fr
committed
% Text area that display salinity and temperature
% -----------------------------------------------
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position', [.68, .25, .05, .6], ...

jacques.grelet_ird.fr
committed
'String', 'SSPS:');
hInfoSSPSText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.73, .25, .05, .6]);

jacques.grelet_ird.fr
committed
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.785, .25, .05, .6], ...

jacques.grelet_ird.fr
committed
'String', 'SSJT:');
hInfoSSJTText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.835, .25, .05, .6]);

jacques.grelet_ird.fr
committed
uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Style', 'Text', ...

jacques.grelet_ird.fr
committed
'Fontweight', 'bold', ...
'HorizontalAlignment', 'left', ...
'Position',[.89, .25, .05, .6], ...

jacques.grelet_ird.fr
committed
'String', 'SSTP:');
hInfoSSTPText = uicontrol(...

jacques.grelet_ird.fr
committed
'Parent', hInfoPanel, ...

jacques.grelet_ird.fr
committed
'Style', 'text', ...

jacques.grelet_ird.fr
committed
'Visible','on',...
'Units', 'normalized',...
'HorizontalAlignment', 'left', ...
'String', 'N/A', ...
'Position', [.94, .25, .05, .6]);

jacques.grelet_ird.fr
committed
%% 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
%--------------------------------------------------------------------

jacques.grelet_ird.fr
committed
hPlotsPanel = uipanel( ...

jacques.grelet_ird.fr
committed
'Parent', hMainFig, ...
'Units', 'normalized', ...
'BorderType', 'etchedin',...

jacques.grelet_ird.fr
committed
'Visible', 'on', ...
'Position',[0.15, 0.0, .85, .95]);

jacques.grelet_ird.fr
committed
hPlotAxes(1) = axes(... % the axes for plotting Salinity
'Parent', hPlotsPanel, ...
'Units', 'normalized', ...
'Visible', 'off', ...

jacques.grelet_ird.fr
committed
'HandleVisibility','on', ... % set to callback after first plot
'Position',[.05, .64, .93, .35]);

jacques.grelet_ird.fr
committed
hPlotAxes(2) = axes(... % the axes for plotting temperature
'Parent', hPlotsPanel, ...
'Units', 'normalized', ...

jacques.grelet_ird.fr
committed
'Visible', 'off', ...
'Tag', 'TAG_AXES_2', ...
'HandleVisibility','on', ...
'Position',[.05, .33, .93, .27]);

jacques.grelet_ird.fr
committed
hPlotAxes(3) = axes(... % the axes for plotting ship velocity

jacques.grelet_ird.fr
committed
'Parent', hPlotsPanel, ...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Visible', 'off', ...
'Tag', 'TAG_AXES_3', ...
'HandleVisibility','on', ...
'Position',[.05, .02, .93, .27]);

jacques.grelet_ird.fr
committed
% The map will be plot in a uipanel
hMapPanel = uipanel( ...
'Parent', hMainFig, ...
'Units', 'normalized', ...
'Visible', 'off', ...
'Position',[0.15, 0, .85, .58]);

jacques.grelet_ird.fr
committed
hPlotAxes(4) = axes(... % the axes for plotting ship track map
'Parent', hMapPanel, ...
'Units', 'normalized', ...
'Visible', 'off', ...

jacques.grelet_ird.fr
committed
'Color', 'none', ...
'UserData', 'off', ...

jacques.grelet_ird.fr
committed
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'Position',[.05, .05, .9, .9]);
%% Quality Control Button Group panel
% -----------------------------------------------------------------------
hbgQc = uibuttongroup(...
'Parent', hMainFig, ...
'Title', 'Validation Codes', ...
'FontSize', tsg.fontSize-1, 'Fontweight', 'bold', ...
'tag', 'TAG_QC_DISPLAY_PANEL',...
Yves Gouriou
committed
'HandleVisibility','on',...

jacques.grelet_ird.fr
committed
'Visible', 'on',...
'BorderType', 'etchedin',...
'Position', [.0, .71, .15, .25]);
% Initialize CallBack for button group properties
% -----------------------------------------------
set(hbgQc,'SelectionChangeFcn',@RadiobuttonQc);
%% Context Menu and RadioButtons for Quality control
% -----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
hQcCmenu = uicontextmenu(...
'Parent', hMainFig, ...

jacques.grelet_ird.fr
committed
'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;

jacques.grelet_ird.fr
committed
% 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
% ----------------------------------

jacques.grelet_ird.fr
committed
uimenu(...
'Parent', hQcCmenu,...
'HandleVisibility','on', ...
'Label', label,...
'ForegroundColor', color,...
'Callback', {@Qc, key});

jacques.grelet_ird.fr
committed
% add button QC to hbgQc uibuttongroup
% ------------------------------------

jacques.grelet_ird.fr
committed
uicontrol(...
'Parent', hbgQc,...
'Style', 'radiobutton',...

jacques.grelet_ird.fr
committed
'Units', 'normalized', ...
'Fontsize', tsg.fontSize-1, ...

jacques.grelet_ird.fr
committed
'HorizontalAlignment', 'left', ...
'HandleVisibility','on', ...
'String', label,...
'Tag', ['TAG_QC_RADIO_' key], ...

jacques.grelet_ird.fr
committed
'ForegroundColor', color,...
'Position', [.01, .85-count*.12, .6, 0.08]);

jacques.grelet_ird.fr
committed
% add text QC display statistic on hQcPanel
% -----------------------------------------

jacques.grelet_ird.fr
committed
uicontrol(...
'Parent', hbgQc,...

jacques.grelet_ird.fr
committed
'Style', 'text',...
'Units', 'normalized', ...
'Fontsize', tsg.fontSize-1, ...

jacques.grelet_ird.fr
committed
'HorizontalAlignment', 'right', ...
'HandleVisibility','on', ...

jacques.grelet_ird.fr
committed
'ForegroundColor', color,...
'Tag', ['TAG_QC_TEXT_' key],...
'Position', [.61, .85-count*.12, .37, 0.08]);
% increment count
% ---------------
count = count + 1;

jacques.grelet_ird.fr
committed
end
end
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
%% 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',...
'Position',[.0, .3, .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', ...
'Enable', 'off',...
'pos',[.05 .68 .9 .25], ...
'HandleVisibility','callback', ...
'Callback', @CorCancelCallback);
hrbCorLinear = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Linear adjustment',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_LINEAR_PUSH', ...
'Enable', 'off',...
'pos',[.05 .38 .9 .25], ...
'HandleVisibility','callback', ...
'Callback', @CorLinearCallback);
hrbCorMedian = uicontrol( ...
'Style','pushbutton', ...
'Parent',hbgCorMethod, ...
'Units', 'normalized', ...
'String','Running median filter',...
'FontSize',tsg.fontSize-1,...
'Tag', 'CORRECT_MEDIAN_PUSH', ...
'Enable', 'off',...
'pos',[.05 .08 .9 .25],...
'HandleVisibility','callback', ...
'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', ...
'Position', [.0, .51, .15, .18]);
% 'BackgroundColor', 'white',...
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',...
'Enable', 'off', ...
'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',...
'Enable', 'off', ...
'Position',[.01 .15 .95 .17]);
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
%% test if user preference autoload field is checked (on)
% -------------------------------------------------------
if strcmp(root.preference.autoload, 'on')
% this code need to be fatorized file/open menu
% ---------------------------------------------
% 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', tsg.file.name);
% update some fields in tsg structure
% -----------------------------------
updateTsgStruct(hMainFig);
% Running average of TSG time series
% ----------------------------------
tsg_moveaverage(hMainFig);
% The callback to detect the mouse motion can be set to on
% --------------------------------------------------------
set( hMainFig, 'UserData', 'ButtonMotionOn');
% yes, plot the Salinity, temperature and velocity
% ------------------------------------------------
plot_SalTempVel( hMainFig, hPlotAxes );
plotmap( hMainFig, hPlotAxes);
plot_WS( hMainFig, hPlotAxes );
plot_EXT( hMainFig, hPlotAxes );
% Hide handles marked as hidden with HandleVisibility property set to
% callback or off
% -------------------------------------------------------------------
set(0, 'ShowHiddenHandles', 'off');
end
% wait for user input (callback)
% ------------------------------
%% *************************** CALLBACKS **********************************
%% OpenMenuCallback

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
% Callback function run when the Open menu item is selected
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
function OpenMenuCallback(hObject, eventdata)

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Pointer set to watch during reading and plotting
% ------------------------------------------------
set( hMainFig, 'Pointer', 'watch' );
Yves Gouriou
committed

jacques.grelet_ird.fr
committed
% Open standard dialog box for retrieving files
% ---------------------------------------------

jacques.grelet_ird.fr
committed
[fileName, pathname, filterIndex] = uigetfile( ...
{'*.txt';'*.xml';'*.nc';'*.lbv';'*.btl'}, 'Pick a file');

jacques.grelet_ird.fr
committed
error1 = -1;
error2 = -1;

jacques.grelet_ird.fr
committed
% 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.
% -----------------------------------------------------------------

jacques.grelet_ird.fr
committed
if ~isequal(fileName, 0)

jacques.grelet_ird.fr
committed
% Read the data
% -------------
switch filterIndex
case 1

jacques.grelet_ird.fr
committed
error1 = readTsgDataTxt( hMainFig, fileName );

jacques.grelet_ird.fr
committed
case 2

jacques.grelet_ird.fr
committed
error1 = readTsgDataXML( hMainFig, fileName );

jacques.grelet_ird.fr
committed
case 3

jacques.grelet_ird.fr
committed
error1 = readTsgDataNetCDF( hMainFig, fileName );

jacques.grelet_ird.fr
committed
%# a modifier
if error1 == 1
error2 = error1;
end
case 4
error1 = readTsgDataLabview( hMainFig, fileName );
case 5

jacques.grelet_ird.fr
committed
error2 = readBucketData(hMainFig, fileName );

jacques.grelet_ird.fr
committed
otherwise
return;

jacques.grelet_ird.fr
committed
end
% A TSG file has been read. Plot the data.
% ----------------------------------------
if error1 ~= -1
% A TSG file has been open and read
% ---------------------------------
set( hOpenMenu, 'UserData', 'on' );

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% enable toolbar menu pushtool
% ----------------------------

jacques.grelet_ird.fr
committed
hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
set(hdl_pushtool, 'Enable', 'on');
% enable Save menu
% ----------------
set(hSaveMenu, 'Enable', 'on');

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% update the filename display
% ---------------------------

jacques.grelet_ird.fr
committed
set( hInfoFileText, 'String', fileName);

jacques.grelet_ird.fr
committed
% update some fields in tsg structure
% -----------------------------------
updateTsgStruct(hMainFig);
Yves Gouriou
committed
% Running average of TSG time series
% ----------------------------------
tsg_moveaverage(hMainFig);

jacques.grelet_ird.fr
committed
% The callback to detect the mouse motion can be set to on
% --------------------------------------------------------
set( hMainFig, 'UserData', 'ButtonMotionOn');
% Make the Salinity, temperature and velocity plot
% ------------------------------------------------

jacques.grelet_ird.fr
committed
plot_SalTempVel( hMainFig, hPlotAxes );
% Plot the Map with the ship trackline
% ------------------------------------
plotmap( hMainFig, hPlotAxes)

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
% Merge the different water sample (NetCdf or ASCII files) in
% a unique structure : 'sample'
% -----------------------------------------------------------
%@ desactive le merge pour l'instant en attente d'une structure de

jacques.grelet_ird.fr
committed
%donn�es validee

jacques.grelet_ird.fr
committed
%@[sample] = tsg_mergesample( hMainFig );
%@ Save the 'sample' struct. as an application data
% ------------------------------------------------
%if ~isempty( sample )
% setappdata( hMainFig, 'sample', sample );
%end
% Plot Salinity bucket
% NOT at that step. It will interfere with the QC process
% Maybe use a new pushbutton to draw or delete the bucket
% -------------------------------------------------------

jacques.grelet_ird.fr
committed
if error2 ~= -1

jacques.grelet_ird.fr
committed
plot_WS( hMainFig, hPlotAxes );
plot_EXT( hMainFig, hPlotAxes );

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Pointer reset to arrow
% ----------------------
set( hMainFig, 'Pointer', 'arrow' );
end
%% Zoom_OffMenuCallback
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when the zoom toggle toolbar is released

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
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

jacques.grelet_ird.fr
committed

jacques.grelet_ird.fr
committed
% Turns off the automatic adaptation of date ticks
% ------------------------------------------------
zoomAdaptiveDateTicks('off');

jacques.grelet_ird.fr
committed
end

jacques.grelet_ird.fr
committed
%% Zoom_OnMenuCallback

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------
% Callback function run when the zoom toggle toolbar is released
%----------------------------------------------------------------------
function Zoom_OnMenuCallback(hObject, eventdata)
% cursor back to normal
% ---------------------
set(hMainFig,'Pointer','arrow');

jacques.grelet_ird.fr
committed
% returns a zoom mode object for the figure hMainFig handle
% --------------------------------------------------------

jacques.grelet_ird.fr
committed
hZoom = zoom(hMainFig);

jacques.grelet_ird.fr
committed
% Disallows a zoom operation on the MAP axes objects
% --------------------------------------------------
setAllowAxesZoom(hZoom, hPlotAxes(4), false);

jacques.grelet_ird.fr
committed
% turns on interactive zooming (same effect than zoom on) but prevent
% side effect on another figure
% -------------------------------------------------------------------
set(hZoom,'enable', 'on');

jacques.grelet_ird.fr
committed
%zoom on;

jacques.grelet_ird.fr
committed
% Turns on the automatic adaptation of date ticks
% -----------------------------------------------
zoomAdaptiveDateTicks('on');
% Desactivate some toggle buttons
% -------------------------------
set( hQCToggletool, 'state', 'off' );
set( hPanToggletool, 'state', 'off' );
set( hStartlimitToggletool, 'State', 'off' );
set( hEndlimitToggletool, 'State', 'off' );

jacques.grelet_ird.fr
committed
end
%% Pan_OffMenuCallback

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
% Callback function run when the pan toggle toolbar is released

jacques.grelet_ird.fr
committed
%----------------------------------------------------------------------

jacques.grelet_ird.fr
committed
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