% CB_QUERY queries an LTPDA repository
%
% CALL: workspaceBrowser.cb_query
%
% M Hewitson 13-11-08
%
% $Id: cb_query.m,v 1.12 2010/07/23 15:09:45 ingo Exp $
%
function cb_query(varargin)
  
  wb = getappdata(0, 'WorkspaceBrowser');
    
  % Get a connection from the database connection manager
  conn = LTPDADatabaseConnectionManager().connect();

  % Get submission info from the user
  rqd = awtcreate('mpipeline.repository.RepositoryQueryDialog', 'Lmpipeline.main.MainWindow;ZLjava.sql.Connection;Z', [], false, conn, false);
  awtinvoke(rqd, 'setVisible', 'true');
    
  hExec = handle(rqd.getExecuteBtn(),'callbackproperties');
  hExec.ActionPerformedCallback = @cb_executeQuery;
  
  hGuiCloses1 = handle(rqd, 'callbackproperties');
  hGuiCloses1.WindowClosedCallback = @cb_guiClosed1;
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  function cb_guiClosed1(varargin)
    % Delete callback handles
    if ishandle(hExec)
      delete(hExec)
    end
    if ishandle(hGuiCloses1)
      delete(hGuiCloses1)
    end
    
    % Delete all variables
    wb   = [];
    rm   = [];
    conn = [];
    rqd  = [];
  end
  
  function cb_executeQuery(varargin)
    
    jQueryTextField = awtinvoke(rqd, 'getQueryTxtField()');
    jQuery = awtinvoke(jQueryTextField, 'getText()');
    
    jStmt = awtinvoke(conn, 'createStatement()');
      
    try
        
      jResult = awtinvoke(jStmt, 'executeQuery(Ljava.lang.String;)', jQuery);
      
      % pass to query results table
      qrt = awtcreate('mpipeline.repository.QueryResultsTableDialog', 'Lmpipeline.main.MainWindow;ZLjava.sql.ResultSet;Ljava.lang.String;Z', [], false, jResult, jQuery, false);
      awtinvoke(qrt, 'setUsedConn(Ljava.sql.Connection;)', conn);
      awtinvoke(qrt, 'setVisible(Z)', 'true');
      
      hRetrieve = handle(qrt.getCreateConstructors,'callbackproperties');
      hRetrieve.ActionPerformedCallback = @cb_retrieveObjectsFromTable;
      
      hGuiCloses2 = handle(qrt, 'callbackproperties');
      hGuiCloses2.WindowClosedCallback = @cb_guiClosed2;
      
    catch err
      fprintf(2, [err.message, '\n']);
    end
      
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    function cb_guiClosed2(varargin)
      % Delete callback handles
      if ishandle(hRetrieve)
        delete(hRetrieve)
      end
      if ishandle(hGuiCloses2)
        delete(hGuiCloses2)
      end
      
      % Delete all variables
      jQueryTextField = [];
      jQuery          = [];
      jStmt           = [];
      jResult         = [];
      qrt             = [];
    end
    
    function cb_retrieveObjectsFromTable(varargin)
      
      try
        jResultTable = awtinvoke(qrt, 'getResultsTable()');
        jColNames    = awtinvoke(qrt, 'getColNames()');
        jObj_id_col  = awtinvoke(jColNames, 'indexOf(Ljava.lang.Object;)', 'obj_id');
        
        if (jObj_id_col == -1)
          msg = 'The results must contain the field ''obj_id'' in order to create constructor blocks.';
          utils.helper.errorDlg(msg, 'Fields error');
          jResultTable = [];
          jColNames    = [];
          jObj_id_col  = [];
          error(msg);
        end
        
        numberStr = '';
        jRows = double(awtinvoke(jResultTable, 'getSelectedRows()'));
        
        jModel = [];
        if numel(jRows) >= 1
          jModel = awtinvoke(jResultTable, 'getModel()');
          numberStr = num2str(awtinvoke(jModel, 'getValueAt(II), ', jRows(1), jObj_id_col));
        end
        
        for kk = 2:numel(jRows)
          jModel = awtinvoke(jResultTable, 'getModel()');
          
          objIDstr = num2str( awtinvoke(jModel, 'getValueAt(II)', jRows(kk), jObj_id_col));
          numberStr = [numberStr, ' ', objIDstr];
        end
        
        rrd = awtcreate('mpipeline.repository.RepositoryRetrieveDialog', 'Ljava.awt.Frame;Z', [], true);
        
        jObjIDTextField = awtinvoke(rrd, 'getObjectIDsTextField()');
        awtinvoke(jObjIDTextField, 'setText(Ljava.lang.String;)', numberStr);
        awtinvoke(rrd, 'setVisible(Z)', true);
        
        hGuiCloses3 = handle(rrd, 'callbackproperties');
        hGuiCloses3.WindowClosedCallback = @cb_guiClosed3;
        
      catch err
        fprintf(2, [err.message, '\n']);
      end
      
      function cb_guiClosed3(varargin)
        % Delete callback handles
        if ishandle(hGuiCloses3)
          delete(hGuiCloses3)
        end
        
        if ~rrd.isCancelled
          workspaceBrowser.retrieveObjectsFromDialog(rrd, conn);
        end
        
        % Delete all variables
        jResultTable    = [];
        jColNames       = [];
        jObj_id_col     = [];
        jRows           = [];
        jModel          = [];
        rrd             = [];
        jObjIDTextField = [];
      end
      
    end % cb_retrieveObjectsFromTable
    
  end % cb_executeQuery
  
end % cb_query


