Skip to content
Snippets Groups Projects
tsgqc_GUI.m 42.7 KiB
Newer Older
% 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
%   ********************
clc

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

% Screen limits for the GUI
% -------------------------
set(0,'Units','normalized');
guiLimits = get(0,'ScreenSize');
guiLimits(1) = guiLimits(1) + 0.05;
guiLimits(2) = guiLimits(2) + 0.1;
guiLimits(3) = guiLimits(3) - 0.1;
guiLimits(4) = guiLimits(4) - 0.2;

%% 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', @QuitProgram,...
  'HandleVisibility','callback',...
  'Visible','on',...
  'Units', 'normalized',...
  'Position',guiLimits, ...
  'Color', get( 0, 'DefaultUIControlBackgroundColor' ));

%%  Construct the Menu
%   -----------------
hFileMenu = uimenu(...
  'Parent', hMainFig,...
  'HandleVisibility','callback',...
  'Label', 'File');
hOpenMenu = uimenu(...
  'Parent', hFileMenu,...
  'UserData', 'off', ...
  'Label','Open',...
  'Accelerator','O',...
  'HandleVisibility','callback',...
  'Callback', @OpenMenuCallback);
hSaveMenu = uimenu(...
  'Parent', hFileMenu,...
  'Label','Save',...
  'Accelerator','S',...
  'UserData', 'off', ...
  'HandleVisibility','callback',...
  'Callback',@SaveMenuCallback);
hQuitMenu = uimenu(...
  'Parent',hFileMenu,...
  'Label','Quit',...
  'Separator','on',...
  'Accelerator','Q',...
  'HandleVisibility','callback',...
  'Callback',@QuitMenuCallback);

%%  Construct the Toolbar
%   -----------------
hToolbar       =   uitoolbar(...   % Toolbar for Open and Print buttons
  'Parent',hMainFig, ...
  'HandleVisibility','callback');
hOpenPushtool  =   uipushtool(...   % Opendoc toolbar button
  'Parent',hToolbar,...
  'TooltipString','Open file',...
  'CData', iconRead(fullfile(matlabroot, ...
  '/toolbox/matlab/icons/opendoc.mat')),...
  'HandleVisibility','callback', ...
  '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','callback', ...
  'Tag','PUSHTOOL_SAVE',...
  'Enable', 'off',...
  'ClickedCallback', @SaveMenuCallback);
hZoomPushtool  =   uipushtool(...   % Open Zoom toolbar button
  'Parent',hToolbar,...
  'Separator', 'on', ...
  'TooltipString','Zoom',...
  'CData', iconRead(fullfile(matlabroot, ...
  '/toolbox/matlab/icons/zoom.mat')),...
  'HandleVisibility','callback', ...
  'Tag','PUSHTOOL_ZOOM',...
  'Enable', 'off',...
  'ClickedCallback', @ZoomMenuCallback);
hPanPushtool  =   uipushtool(...   % Open Pan toolbar button
  'Parent',hToolbar,...
  'TooltipString','Pan',...
  'CData',iconRead(fullfile(matlabroot, ...
  '/toolbox/matlab/icons/pan.mat')),...
  'HandleVisibility','callback', ...
  'Tag','PUSHTOOL_PAN',...
  'Enable', 'off',...
  'ClickedCallback', @PanMenuCallback);
hQCToggletool  =   uitoggletool(...   % Open QC toolbar button
  'Parent',hToolbar,...
  'TooltipString','Validation codes',...
  'Separator', 'on', ...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'qcicon.mat']),...
  'HandleVisibility','callback', ...
  'Tag','PUSHTOOL_QC',...
  'OffCallback', @QC_OffMenuCallback,...
  'ONCallback',  @QC_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','callback', ...
  'Tag','PUSHTOOL_MAP',...
  'UserData', 'off', ...
  'Enable', 'off',...
  'OffCallback', @Map_OffMenuCallback,...
  'ONCallback',  @Map_OnMenuCallback);
hClimToggletool  =   uitoggletool(...   % Open Climatology toolbar button
  'Parent',hToolbar,...
  'TooltipString','Climatology',...
  'Separator', 'on', ...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'climicon.mat']),...
  'HandleVisibility','callback', ...
  'Tag','PUSHTOOL_CLIM',...
  'UserData', 'off',...
  'Enable', 'off',...
  'OffCallback', @Clim_OffMenuCallback,...
  'ONCallback',  @Clim_OnMenuCallback);
hBottlePushtool  = uipushtool(...   % Open toolbar button
  'Parent',hToolbar,...
  'TooltipString','Plot the Samples',...
  'Separator', 'on', ...
  'CData',iconRead(...
  [DEFAULT_PATH_FILE 'tsg_icon' filesep 'bottleicon.mat']),...
  'HandleVisibility','callback', ...
  'Tag','PUSHTOOL_BOTTLE',...
  'Enable', 'off',...
  'ClickedCallback', @BottleMenuCallback);
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','callback', ...
  'Tag','PUSHTOOL_HEADER',...
  'Enable', 'off',...
  'ClickedCallback', @HeaderMenuCallback);

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

% Dynamic text area that displays the date
% ----------------------------------------
uicontrol(...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'Position',[.02, .95, .03, .03], ...
  'String', 'File:');

hInfoFileText = uicontrol(...
  'Parent', hMainFig, ...
  'Style', 'text', ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'No file loaded', ...
  'Position', [.05, .95, .10, .03]);

% Text area that displays the date
% --------------------------------
uicontrol(...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'String', 'Date:');

hInfoDateText = uicontrol(...
  'Parent', hMainFig, ...
  'Style', 'text', ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...

% Text area that displays the latitude
% ------------------------------------
uicontrol(...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'String', 'Latitude:');

hInfoLatText = uicontrol(...
  'Parent', hMainFig, ...
  'Style', 'text', ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...

% Text area that displays the longitude
% -------------------------------------
uicontrol(...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'String', 'Longitude:');

hInfoLongText = uicontrol(...
  'Parent', hMainFig, ...
  'Style', 'text', ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...

% Text area that display salinity and temperature
% -----------------------------------------------
uicontrol(...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'String', 'SSPS:');

hInfoSSPSText = uicontrol(...
  'Parent', hMainFig, ...
  'Style', 'text', ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...

uicontrol(...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'String', 'SSJT:');

hInfoSSJTText = uicontrol(...
  'Parent', hMainFig, ...
  'Style', 'text', ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...

uicontrol(...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'Style', 'Text', ...
  'Fontweight', 'bold', ...
  'HorizontalAlignment', 'left', ...
  'String', 'SSTP:');

hInfoSSTPText = uicontrol(...
  'Parent', hMainFig, ...
  'Style', 'text', ...
  'Visible','on',...
  'Units', 'normalized',...
  'HorizontalAlignment', 'left', ...
  'String', 'N/A', ...

%% Construct the plot axes
% -----------------------
hPlotAxes(1) = axes(...     % the axes for plotting Salinity
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'Visible', 'off', ...
  'HandleVisibility','callback', ...
  'Position',[.05, .6, .9, .32]);

% The second and third axes will be plot in a uipanel
hPlotsPanel = uipanel( ...
  'BorderType', 'none',...
  'Visible', 'on', ...
  'Position',[0, 0, 1, .57]);

hPlotAxes(2) = axes(...     % the axes for plotting temperature
  'Parent', hPlotsPanel, ...
  'Units', 'normalized', ...
  'Visible', 'off', ...
  'HandleVisibility','callback', ...
hPlotAxes(3) = axes(...     % the axes for plotting ship velocity
  'Units', 'normalized', ...
  'Visible', 'off', ...
  'HandleVisibility','callback', ...

% The map will be plot in a uipanel
hMapPanel = uipanel( ...
  'Parent', hMainFig, ...
  'Units', 'normalized', ...
  'Visible', 'off', ...
  'Position',[0, 0, 1, .57]);

hPlotAxes(4) = axes(...     % the axes for plotting ship track map
  'Parent', hMapPanel, ...
  'Units', 'normalized', ...
  'Visible', 'off', ...
  'Color', 'none', ...
  'UserData', 'off', ...
  'HandleVisibility','callback', ...
  'Position',[.05, .05, .9, .9]);


%% Construct the context menu for the Quality control codes
% -------------------------------------------------------
hQcCmenu = uicontextmenu(...
  'Parent', hMainFig, ...
  'HandleVisibility','callback' );
hQcCmenuNocontrol = uimenu(...
  'Parent', hQcCmenu,...
  'HandleVisibility','off', ...
  'Label', 'No control',...
  'ForegroundColor', 'k',...
  'Callback', @Qc);
hQcCmenuGood      = uimenu(...
  'Parent', hQcCmenu,...
  'HandleVisibility','off', ...
  'Label', 'Good',...
  'ForegroundColor', 'b',...
  'Callback', @Qc);
hQcCmenuProbGood  = uimenu(...
  'Parent', hQcCmenu,...
  'HandleVisibility','off', ...
  'Label', 'Probably Good',...
  'Callback', @Qc,...
  'ForegroundColor', 'g');
hQcCmenuProbBad   = uimenu(...
  'Parent', hQcCmenu,...
  'HandleVisibility','off', ...
  'Label', 'Probably bad',...
  'ForegroundColor', 'm',...
  'Callback', @Qc);
hQcCmenuBad       = uimenu(...
  'Parent', hQcCmenu,...
  'HandleVisibility','off', ...
  'Label', 'Bad',...
  'ForegroundColor', 'r',...
  'Callback', @Qc);


% Initialisation
% --------------
tsg_initialisation(hMainFig, hQcCmenu)

%  Callbacks for tsgcqc_GUI
  %----------------------------------------------------------------------
  % Callback function run when the Open menu item is selected
  %----------------------------------------------------------------------
    % Pointer set to watch during reading and plotting
    % ------------------------------------------------
    set( hMainFig, 'Pointer', 'watch' );
    % ATTENTION : function OpenMenuCallback(hObject, eventdata)
    % This has to be made general for UNIX and WINDOWS system
    % ---------------------------------------------------------
    [fileName, pathname, filterIndex] = uigetfile( ...
      {'*.txt';'*.xml';'*.nc';'*.lbv';'*.btl'}, 'Pick a file');
          error1 = readTsgDataTxt( hMainFig, fileName );
          error1 = readTsgDataXML( hMainFig, fileName );
          error1 = readTsgDataNetCDF( hMainFig, fileName );       
          error1 = readTsgDataLabview( hMainFig, fileName );  
        case 5
          error2 = readBucketData(hMainFig, fileName );
      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' );
        hdl_pushtool = findobj('-regexp','Tag', 'PUSHTOOL_');
        set(hdl_pushtool, 'Enable', 'on');

        % update the filename display
        % ---------------------------
        
        % update some fields in tsg structure
        % -----------------------------------
        updateTsgStruct(hMainFig);

        % The callback to detect the mouse motion can be set to on
        % --------------------------------------------------------
        set( hMainFig, 'UserData', 'ButtonMotionOn');

        % Make the Salinity, temperature and velocity plot
        % ------------------------------------------------
        plot_SalTempVel( hMainFig, hPlotAxes );

        % Plot the Map with the ship trackline
        % ------------------------------------
        plotmap( hMainFig, hPlotAxes)
    % 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
    %@[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
    % -------------------------------------------------------
    if error2 ~= -1
      plot_SalTsgSample( hMainFig, hPlotAxes );
    end
    % Pointer reset to arrow
    % ----------------------
    set( hMainFig, 'Pointer', 'arrow' );

  end

  %----------------------------------------------------------------------
  %----------------------------------------------------------------------
  function ZoomMenuCallback(hObject, eventdata)
    % Callback function run when the Open menu item is selected

    % Returns a zoom mode object for the figure handle
    hZoom = zoom(hMainFig);
    % Specifies whether this mode is currently enabled on the figure
    zoomOnOff = get(hZoom, 'Enable' );
    switch zoomOnOff
      case 'on'
        zoom off
        zoomAdaptiveDateTicks('off');
      case 'off'
        pan off
        % Desactivate the QC toggle button
        % --------------------------------
        set(hQCPushtool, 'state', 'off' );
    %  zoomColor = get(hZoomPushtool,'CData');
    % set(hZoomplusPushtool,'CData', zoomColor);
  end

  %----------------------------------------------------------------------
  %----------------------------------------------------------------------
  function PanMenuCallback(hObject, eventdata)
    % Callback function run when the Open menu item is selected

    % Returns a pan mode object for the figure handle
    hPan = pan(hMainFig);
    % Specifies whether this mode is currently enabled on the figure
    panOnOff = get(hPan, 'Enable' );
    switch panOnOff
      case 'on'
        pan off
        panAdaptiveDateTicks('off');
      case 'off'
        zoom off
        % Desactivate the QC toggle button
        % --------------------------------
        set(hQCPushtool, 'state', 'off' );
  %----------------------------------------------------------------------
  %----------------------------------------------------------------------
  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', []);
    
    % cursor back to normal
    % ---------------------
    set(hMainFig,'Pointer','arrow');
  end
  %----------------------------------------------------------------------
  %----------------------------------------------------------------------
  function QC_OnMenuCallback(gcbo, eventdata)
    
    % Desactivate the Zoom and Pan functions.
    % ---------------------------------------
    zoom off; pan off
    panAdaptiveDateTicks('off');zoomAdaptiveDateTicks('off');
    
    % Activate right clic context menu on first axes (salinity)
    % ---------------------------------------------------------
    set(hPlotAxes(1),'UIContextMenu', hQcCmenu);
    % Activate clic mouse menu on first axes (salinity)
    % -------------------------------------------------
    set(hPlotAxes(1),'ButtonDownFcn', @QC_SelectCallback);

    % Try to make visible the context menu a the top of
    % the figure. DOESN'T WORK
    %oldUnits = get(hMainFig,'units' );
    %set(hMainFig,'units', 'pixels');
    %figPos = get(hMainFig,'Position');
    %set(hQcCmenu, 'Visible', 'on', 'Position', [figPos(1) figPos(4)]);
    %set(hMainFig,'units', oldUnits);
    
    % change cursor to crosshai aspect
    % --------------------------------
    set( hMainFig, 'Pointer', 'crosshair');
    
    % -------------------------------------------------------------
    % nested function on mouse clic
    % -------------------------------------------------------------
    function QC_SelectCallback(gcbo, eventdata)
      % disable ButtonMotion on main fig during select
      % ----------------------------------------------
      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
      % ---------------------------
      ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ...
        tsg.SSPS > p1(1,2) & tsg.SSPS < p2(1,2));

      tsg.SSPS_QC(ind) = tsg.qc.Code.ACTIVE;

      % set current axes and plot
      % -------------------------
      axes(hPlotAxes(1));
      hold on
      color = ['.' tsg.qc.Color.ACTIVE];
      plot(tsg.DAYD(ind), tsg.SSPS(ind), color );
      hold off

      % As soon as a modification took place the data should be saved
      % -------------------------------------------------------------
      set( hSaveMenu, 'UserData', 'on' );
      
      % Save the modifications
      % ----------------------
      setappdata( hMainFig, 'tsg_data', tsg);
      
      % disable ButtonMotion on main fig during select
      % ----------------------------------------------
      set( hMainFig, 'WindowButtonMotionFcn', @MouseMotion);
% %----------------------------------------------------------------------
%   function QCMenuCallback_old(gcbo, eventdata,handles)
%     % Callback function run when the QC pushbutton is selected
% 
%     % Desactivate the Zoom and Pan functions.
%     % ---------------------------------------
%     zoom off; pan off
%     panAdaptiveDateTicks('off');zoomAdaptiveDateTicks('off');
% 
%     % Toggle the tag of the Qc pushbutton to 'on' or 'off'
%     % ----------------------------------------------------
%     switch get(hQCToggletool, 'UserData');
%         set(hQCToggletool, 'UserData', 'on' );
%         set(hPlotAxes(1),'UIContextMenu', hQcCmenu);
%         set( hMainFig, 'Pointer', 'crosshair');
%       case 'on'
%         set(hQCToggletool, 'UserData', 'off' );
%         set(hPlotAxes(1),'UIContextMenu', []);
%         set(hMainFig,'Pointer','arrow');
%     end
% 
%     qualityCode = -1;
%     ind = [];
%     while strcmp( get(hQCToggletool, 'UserData'),'on')
% 
%       k = waitforbuttonpress;
% 
%       % If the QC pushbutton is pressed we quit the callback
%       % ----------------------------------------------------
%       if strcmp( get(hQCToggletool, 'UserData'),'off')
% 
%         % Desactivate the context menu use to choose the Quality Codes
%         % ------------------------------------------------------------
%         set(hQcCmenu, 'Visible', 'off');
%         break
%       end
% 
%       % Test if the right mouse button is clicked
%       % -----------------------------------------
%       if strcmp(get(hMainFig, 'SelectionType'), 'alt') && ~isempty(ind)
%         % Wait for a QC Context Menu choice : The user choose the
%         % quality code
%         % -------------------------------------------------------
%         uiwait
%         qualityCode = 1;
% 
%       else
% 
%         % Mouse motion callback desactivated when a selection is made.
%         % Otherwise there is a conflict with the map if it is activated
%         % -------------------------------------------------------------
%         set( hMainFig, 'UserData', 'ButtonMotionOff');
% 
%         % 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
% 
%         % Retrieve named application data
%         % -------------------------------
%         tsg = getappdata( hMainFig, 'tsg_data');
% 
%         ind = find(tsg.DAYD > p1(1,1) & tsg.DAYD < p2(1,1) & ...
%           tsg.SSPS > p1(1,2) & tsg.SSPS < p2(1,2));
% 
%         % As soon as a modification took place the data should be saved
%         % -------------------------------------------------------------
%         set( hSaveMenu, 'UserData', 'on' );
% 
%         % Selection made : Mouse motion callback re-activated
%         % --------------------------------------------------
%         set( hMainFig, 'UserData', 'ButtonMotionOn');
% 
%       end
% 
%       % Plot the data with the color of the chosen quality Code.
%       % Is it the right place for this source code ????
%       % --------------------------------------------------------
%       if qualityCode ~= -1
% 
%         % Retrieve named application data - Code could have been changed
%         % --------------------------------------------------------------
%         tsg = getappdata( hMainFig, 'tsg_data');
% 
%         tsg.SSPS_QC(ind) = tsg.qc.Code.ACTIVE;
% 
%         % Save the modifications
%         % ----------------------
%         setappdata( hMainFig, 'tsg_data', tsg);
% 
%         axes(hPlotAxes(1));
%         hold on
%         color = ['.' tsg.qc.Color.ACTIVE];
%         plot(tsg.DAYD(ind), tsg.SSPS(ind), color );
%         hold off
% 
%       end
%     end
%   end

  %----------------------------------------------------------------------
  % Callback function run when the QC context menu is selected
  %---------------------------------------------------------------------
  function Qc(hObject, eventdata)  
    
      % Retrieve Default Quality Code and Color
      % ---------------------------------------
      tsg = getappdata( hMainFig, 'tsg_data');
      
      switch hObject
        case hQcCmenuNocontrol
          tsg.qc.Code.ACTIVE   = tsg.qc.Code.NO_CONTROL;
          tsg.qc.Color.ACTIVE  = tsg.qc.Color.NO_CONTROL;
        case hQcCmenuGood
          tsg.qc.Code.ACTIVE   = tsg.qc.Code.GOOD;
          tsg.qc.Color.ACTIVE  = tsg.qc.Color.GOOD;
        case hQcCmenuProbGood
          tsg.qc.Code.ACTIVE   = tsg.qc.Code.PROBABLY_GOOD;
          tsg.qc.Color.ACTIVE  = tsg.qc.Color.PROBABLY_GOOD;
        case hQcCmenuProbBad
          tsg.qc.Code.ACTIVE   = tsg.qc.Code.PROBABLY_BAD;
          tsg.qc.Color.ACTIVE  = tsg.qc.Color.PROBABLY_BAD;
        case hQcCmenuBad
          tsg.qc.Code.ACTIVE   = tsg.qc.Code.BAD;
          tsg.qc.Color.ACTIVE  = tsg.qc.Color.BAD;
      end
      setappdata( hMainFig, 'tsg_data', tsg );
      
      % uiwait in the QCMenuCallback function
      % -------------------------------------
  %---------------------------------------------------------------------
  %---------------------------------------------------------------------
  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 the mouse position
      % ----------------------
      point = get(gcf,'CurrentPoint');

      if point(1) > .05 && point(2) > .6 && point(1) < .95 && point(2) < .92

        % Get current position of cusor and return its coordinates in
        % axes with handle h_axes
        % -----------------------------------------------------------
        [x, y] = gpos(hPlotAxes(1));

        % Dynamically display data in uicontrol
        % -------------------------------------
        if x > tsg.DAYD(1) && x < tsg.DAYD(end)
          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'))
              hMarker = m_line( ...
                tsg.LONX(indCursor(1)), tsg.LATX(indCursor(1)),...
                'Marker','o','MarkerSize',5, ...
                'Color','r', 'MarkerFaceColor','r');
              set(hMapPanel, 'UserData', hMarker)
            else
              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);
  %---------------------------------------------------------------------
  % 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
  %---------------------------------------------------------------------
  % Callback function run when the Map tool bar item is selected
  %---------------------------------------------------------------------
  function Map_OnMenuCallback(hObject, eventdata)
     
    % Make the earth map visible
    % --------------------------
         set(hMapPanel, 'Visible', 'on' );
  %---------------------------------------------------------------------
  %---------------------------------------------------------------------
    % Callback function run when the Bottle tool bar item is selected

    % Get the tsg data structure
    % --------------------------
    tsg = getappdata( hMainFig, 'tsg_data');
    
    % Test if tsg and sample data have been loaded
    % --------------------------------------------
    if ~isempty( tsg.SSPS_WS ) || ~isempty( tsg.SSPS_EXT )
      
      % Call the GUI for tsg correction
      % -------------------------------
      msgbox('Correction module not yet implemented', 'modal');
      % tsgcor_GUI( hMainFig );    
    else
      msgbox('TSG or Sample data not loaded in the program', 'modal');
    end

    % Vieux bout de code pour le trace et la suppression des bouteilles
    % Plot or Delete the buckets measurements on the Salinity graph
    %
    % Need to read them right now - but they will be soon in the NetCdf
    % file
Yves Gouriou's avatar
Yves Gouriou committed
    % Test if the sample Push button has been pressed
    % -----------------------------------------------
    % if strcmp( get(hBottlePushtool, 'UserData'), 'off')
     
      % Sample Push button - UserData set to 'on'
      % ------------------------------------
      % set( hBottlePushtool, 'UserData', 'on' );

      % Plot the samples if the TSG file has been read
      % ----------------------------------------------
      %            if strcmp( get(hOpenMenu, 'UserData'), 'on' ) && ~isempty( sample )
      %                axes( hPlotAxes(1) );
      %                hLine.Sample = line( ...
      %                    sample.TIME, sample.PSAL,...
      %                    'Linestyle', 'none', 'Marker','o','MarkerSize',5, ...
      %                    'Color','r', 'MarkerFaceColor','r');

      % Store the handle of the bucketline
      % ----------------------------------
      %                set( hPlotAxes(1), 'UserData', hLine );
      %            end

      %        else

      % set( hBottlePushtool, 'UserData', 'off' );

      % The bucket pushbutton has been pressed again :
      % Delete the bucket on figure
      % ----------------------------------------------
      %            hLine = get( hPlotAxes(1), 'UserData');
      %            if ~isempty( hLine ) && ishandle( hLine.Sample )
      %                delete(hLine.Sample);
      %           end
  end
  %------------------------------------------------------------------------
  % Callback function run when the Levitus climatology toolbar is unselected
  %------------------------------------------------------------------------
  function Clim_OffMenuCallback(hObject, eventdata)