function tsg_preferences(hTsgGUI, app_name, DEFAULT_PATH_FILE)
% tsg_preferences(S1,S2) returns structure tsg saved in S1.mat file
% and with S2 internal version number.
% If S1.mat dosn't exist, call tsg_initialisation to create it in
% prefdir directory
%
% Input
% -----
% hTsgGUI    ............ Handle to the main user interface
% app_name   ............ application name
%
% Output
% ------
% none
%
% $Id$
%

% global variable VERSION, update revision number when tsg structure change
% -------------------------------------------------------------------------
global VERSION

% Construct config file path
% --------------------------
config_file = [prefdir, filesep, app_name, '.mat'];

% Open config file
% ----------------

% desactive la gestion des preferences, car la classe tsg.qc.hash (tsg_nc)
% est transformee en structure lors de l'ecriture, a verifier
% -----------------------------------------------------------
fid = fopen( config_file, 'r' );
%fid = -2;

% test fopen return value
% -----------------------
switch fid 
  
  % preference file is missing 
  % --------------------------
  case -1

    % create new tsg structure and save it to appdata
    % -----------------------------------------------
    new_config;

  % disactive the preference mode (for test or bug)
  % -----------------------------------------------
  case -2

    % call default tsg_initialisation
    % -------------------------------
    tsg_initialisation(hTsgGUI);
    
    return;

  % file exist and is open, fid > 2
  % -------------------------------
  otherwise

    % Pointer set to watch during loading preference file
    % ---------------------------------------------------
    set( hTsgGUI, 'Pointer', 'watch' );

    % Initialize loading preference file waitbar
    % ------------------------------------------
    wb = waitbar(0, 'Loading preference file. Please  wait...');

    % display waitbar
    % ---------------
    waitbar( 1/10, wb, 'loading structure root' );

    try

      % if file exist, load in workspace
      % --------------------------------
      load( config_file, 'root', 'tsg' );

    catch

      % display warning
      % ---------------
      warning('tsgqc_GUI:tsg_preferences', ...
        'Can''t load preference file ''%s''', config_file);

      % quit program
      % ------------
      quitProgram(hTsgGUI, DEFAULT_PATH_FILE);

    end

    % If there no field version or wrong version, initialize
    % -------------------------------------------------------
    if ~isfield( root, 'version') || ~strcmp(root.version, VERSION)

      % call new config private function
      % --------------------------------
      new_config;

    end
    
    % transforme filename saved in tsg.qc.hash to tsg_nc object
    % ---------------------------------------------------------
    tsg.qc.hash = tsg_nc(tsg.qc.hash);
      
    % display waitbar
    % ---------------
    waitbar( 1/2, wb, 'loading structure tsg' );

    % Close waitbar
    % -------------
    close(wb)

    % cursor back to normal
    % ---------------------
    set(hTsgGUI,'Pointer','arrow');

    try

      % set current preference autoload in submenu option/preference
      % ------------------------------------------------------------
      set(findobj('tag', 'TAG_UIMENU_OPTION_PREFERENCES', ...
        'checked', root.preference.autoload));

    catch
      warning('tsgqc_GUI:tsg_preferences', ...
        ['Preference file ''%s''\nis malformed\n' ...
        'delete it.'], config_file);
      quitProgram(hTsgGUI, DEFAULT_PATH_FILE);

    end  

end

% Save structure tsg
% ------------------
setappdata( hTsgGUI, 'tsg_data', tsg);

% save root in userdata property
% ------------------------------
set(0, 'userdata', root);


% ----------------------------------------------------------------------
% nested function new_config
% ----------------------------------------------------------------------
  function new_config
 
    % call default tsg_initialisation
    % -------------------------------
    tsg_initialisation(hTsgGUI);
  
    % Get the data from the application GUI
    % -------------------------------------
    tsg = getappdata( hTsgGUI, 'tsg_data');

    % save root and tsg to 'prefdir.mat' file
    % ---------------------------------------
    save(config_file, 'root', 'tsg');

    % save root in root object for next use
    % -------------------------------------
    set(0, 'userdata', root);

  end

end
