/*********************************************************************
* Copyright (C) 2000 by Progress Software Corporation ("PSC"),       *
* 14 Oak Park, Bedford, MA 01730, and other contributors as listed   *
* below.  All Rights Reserved.                                       *
*                                                                    *
* The Initial Developer of the Original Code is PSC.  The Original   *
* Code is Progress IDE code released to open source December 1, 2000.*
*                                                                    *
* The contents of this file are subject to the Possenet Public       *
* License Version 1.0 (the "License"); you may not use this file     *
* except in compliance with the License.  A copy of the License is   *
* available as of the date of this notice at                         *
* http://www.possenet.org/license.html                               *
*                                                                    *
* Software distributed under the License is distributed on an "AS IS"*
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. You*
* should refer to the License for the specific language governing    *
* rights and limitations under the License.                          *
*                                                                    *
* Contributors:                                                      *
*                                                                    *
*********************************************************************/
/*

Procedure:    adetran/vt/_gloss.p
Author:       R. Ryan/F. Chang
Created:      1/95 
Updated:      9/95
		01/97 SLK Bug#97-01-07-018 Increased length browser columns
Purpose:      Visual Translator's Glossary Tab folder
Background:   This is a persistent procedure that is run from
              vt/_main.p *only* after a database is connected.
              Once connected, this procedure has the browser
              associated with the glossary functions.
Procedures:   key procedures include:

                InsertRow     adds a row - called by insert button 
                              in hMain
                DeleteRow     deletes a row(s) - called by delete
                              button in hMain
                CreateOrdList dynamically builds a list of the 
                              columns in the browser that the 
                              'Order Columns' menu-item/button in
                              hMain uses.
                OrderColumn   Runs the 'Order Columns' dialog.
                Repo          Repositions the cursor at the last
                              row when a find/goto is made.
                Ref           Refreshes the browser when a replace
                              is made in hReplace
                                              
Includes:     none 
Called by:    vt/_main.p 
Calls to:     SetSensitivity in hMain
*/


{ adetran/vt/vthlp.i } /* definitions for help context strings */  
/* Temporary files generated by _sort.w and _order.w.                */
/* If these are blank then the regular OpenQuery internal procedures */
/* are run, otherwise these will be run                              */
DEFINE SHARED VARIABLE TmpFl_VT_Gl  AS CHARACTER              NO-UNDO.
DEFINE SHARED VARIABLE ConfirmAdds  AS LOGICAL                NO-UNDO.
DEFINE SHARED VARIABLE CurrentTool  AS CHARACTER              NO-UNDO.
DEFINE SHARED VARIABLE hGloss       AS HANDLE                 NO-UNDO.
DEFINE SHARED VARIABLE hLKup        AS HANDLE                 NO-UNDO.
DEFINE SHARED VARIABLE hLongStr     AS HANDLE                 NO-UNDO.
DEFINE SHARED VARIABLE hMain        AS HANDLE                 NO-UNDO.
DEFINE SHARED VARIABLE hSort        AS HANDLE                 NO-UNDO.
DEFINE SHARED VARIABLE MainWindow   AS WIDGET-HANDLE          NO-UNDO.
DEFINE SHARED VARIABLE OrdMode3     AS CHARACTER              NO-UNDO.
DEFINE SHARED VARIABLE Priv1        AS LOGICAL                NO-UNDO.
DEFINE SHARED VARIABLE Priv2        AS LOGICAL                NO-UNDO.
DEFINE SHARED VARIABLE Priv3        AS LOGICAL                NO-UNDO.
DEFINE SHARED VARIABLE tGlssRec     AS RECID                  NO-UNDO.  
DEFINE SHARED VARIABLE tModFlag     AS LOGICAL                NO-UNDO.  
DEFINE SHARED VARIABLE tPrevh       AS WIDGET-HANDLE          NO-UNDO.
DEFINE SHARED VARIABLE hFind        AS HANDLE                 NO-UNDO.
DEFINE SHARED VARIABLE hReplace     AS HANDLE                 NO-UNDO.

DEFINE BUFFER bufGloss FOR kit.XL_GlossEntry.

DEFINE VARIABLE ResetQuery      AS LOGICAL                    NO-UNDO.
DEFINE VARIABLE ThisMessage     AS CHARACTER                  NO-UNDO.   
DEFINE VARIABLE ErrorStatus     AS LOGICAL                    NO-UNDO.
DEFINE VARIABLE result          AS LOGICAL                    NO-UNDO.
DEFINE VARIABLE tLog            AS LOGICAL                    NO-UNDO.
DEFINE VARIABLE i               AS INTEGER                    NO-UNDO.
DEFINE VARIABLE tRec            AS RECID                      NO-UNDO.
DEFINE VARIABLE ss              AS CHARACTER                  NO-UNDO.
DEFINE VARIABLE st              AS CHARACTER                  NO-UNDO.
DEFINE VARIABLE iLastGlossCount AS INTEGER                    NO-UNDO.


DEFINE TEMP-TABLE tmp-order
        FIELD OrdCol AS CHARACTER
        FIELD OldNum AS INTEGER
        FIELD NewNum AS INTEGER.

&Scoped-define FRAME-NAME  GlossFrame
&Scoped-define BROWSE-NAME Glossbrowser

DEFINE NEW SHARED BUFFER Glossary FOR kit.XL_GlossEntry.
DEFINE NEW SHARED QUERY  Glossbrowser FOR Glossary SCROLLING.
 
DEFINE BROWSE Glossbrowser QUERY Glossbrowser
  DISPLAY
      Glossary.SourcePhrase WIDTH 40 FORMAT "X(256)":U
      Glossary.TargetPhrase WIDTH 54 FORMAT "X(256)":U
      Glossary.ModifiedByTranslator COLUMN-LABEL "Modified By!Translator?"
      Glossary.GlossaryType COLUMN-LABEL "!Type"  WIDTH 6
  ENABLE
     Glossary.SourcePhrase 
     Glossary.TargetPhrase 
  with NO-ASSIGN EXPANDABLE separators multiple size-p 602 by 299 font 4.

define frame GlossFrame
  Glossbrowser AT ROW 1 COL 1 
  WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY SIDE-LABELS NO-UNDERLINE THREE-D 
  AT X 14 Y 52 SIZE-P 602 BY 299 FONT 4.

/* **********************  Triggers  *********************** */

on help of frame GlossFrame do:
  run adecomm/_adehelp.p ("vt":U,"context":U,{&VT_Glossaries_Tab_Folder}, ?).    
END.

                       
on value-changed of Glossbrowser in frame {&Frame-Name} do: 
  IF AVAILABLE Glossary THEN DO:
    tGlssRec = recid(Glossary).
    RUN Refresh IN hLongStr (INPUT Glossary.SourcePhrase,
                             INPUT Glossary.TargetPhrase,
                             INPUT hGloss).
    IF AVAILABLE kit.XL_Project THEN
      FIND CURRENT kit.XL_Project NO-LOCK.
    ELSE
      FIND FIRST kit.XL_Project NO-LOCK NO-ERROR.
    IF AVAILABLE kit.XL_Project AND kit.XL_Project.GlossaryCount ne iLastGlossCount THEN
    DO:
      RUN OpenQuery.  /* Record(s) have been added/deleted - reopen to refresh browser */
      RUN Repo(INPUT tGlssRec, INPUT ?).
      iLastGlossCount = kit.XL_Project.GlossaryCount.
    END.
    /* Tell Find Dialog to reposition itself */
    IF VALID-HANDLE(hFind) THEN
      RUN FndRec IN hFind (INPUT ROWID(Glossary), INPUT "kit.XL_GlossEntry").
    /* Tell Replace Dialog to reposition itself */
    IF VALID-HANDLE(hReplace) THEN
      RUN FndRec IN hReplace (INPUT ROWID(Glossary), INPUT "kit.XL_GlossEntry").
  END.
END.


ON ROW-ENTRY OF GlossBrowser DO:
  RUN disableUpdate in hMain.  /* Disable Add/Delete buttons */
  /* Record may have been changed by another user in multi-user mode... */
  FIND CURRENT Glossary NO-LOCK NO-ERROR.              
  IF AVAILABLE Glossary AND GlossBrowser:NUM-SELECTED-ROWS GT 0 THEN
    DISPLAY Glossary.SourcePhrase Glossary.TargetPhrase
      WITH BROWSE Glossbrowser.
END.

           
on row-leave of Glossbrowser do:
  ASSIGN ss = TRIM(Glossary.SourcePhrase:screen-value in browse GlossBrowser)
         st = TRIM(Glossary.TargetPhrase:screen-value in browse GlossBrowser).
  IF LENGTH(ss,"RAW":U) > 63 THEN ss = SUBSTRING(ss, 1, 63, "RAW":U).
  IF LENGTH(st,"RAW":U) > 63 THEN st = SUBSTRING(st, 1, 63, "RAW":U).

  /* if this is a new row then before adding, insure that it doesn't already exists. */  
  if GlossBrowser:new-row then do:
    find Glossary where
        Glossary.ShortSrc     BEGINS ss AND
        Glossary.ShortTarg    BEGINS st AND
        COMPARE(Glossary.SourcePhrase, "=":U, 
                Glossary.SourcePhrase:screen-value in browse GlossBrowser, "CAPS":U) and
        COMPARE(Glossary.TargetPhrase, "=":U, 
                Glossary.TargetPhrase:screen-value in browse GlossBrowser, "CAPS":U)
       no-lock no-error.
    if available Glossary then do:
      ThisMessage = '"':U + Glossary.SourcePhrase + '"^':U + 
                    '"':U + Glossary.TargetPhrase + '"^^':U + 
                    "Exists and won't be entered.".
      run adecomm/_s-alert.p (input-output ErrorStatus, "w":U, "ok":U, ThisMessage).   
      RUN OpenQuery. 
      RUN SetSensitivity IN hMain.  /* Re-enable Add/Delete buttons */
      RETURN.
    end.
    else do:
      if ConfirmAdds then do:
        ThisMessage = "Do you want to update the glossary?".
        run adecomm/_s-alert.p (input-output Result, "q":U, "yes-no":U, ThisMessage).    
      end.
      else Result = true.    

      if Result then do TRANSACTION:
        create Glossary no-error.
        assign Glossary.GlossaryType         = "C":U
               Glossary.ModifiedByTranslator = true    
               Glossary.ShortSrc             = ss
               Glossary.ShortTarg            = st
               Glossary.SourcePhrase         = Glossary.SourcePhrase:screen-value in browse GlossBrowser
               Glossary.TargetPhrase         = Glossary.TargetPhrase:screen-value in browse GlossBrowser
               ResetQuery                    = true
               iLastGlossCount               = iLastGlossCount + 1
               tRec                          = RECID(Glossary)
               tModFlag                      = yes.
        tLog = GlossBrowser:CREATE-RESULT-LIST-ENTRY().
        RUN OpenQuery. 
        RUN Ref (INPUT tRec).
      END.  /* If Results */
    END.  /* Else do */
  END.  /* If New-row */
  ELSE IF SELF:CURRENT-ROW-MODIFIED THEN 
  DO TRANSACTION:
    GET CURRENT GlossBrowser EXCLUSIVE-LOCK NO-WAIT.
    IF NOT AVAILABLE Glossary THEN DO:
      ThisMessage = "This entry has been deleted since you began working on it.". 
      RUN adecomm/_s-alert.p (INPUT-OUTPUT ErrorStatus, "w":U, "ok":U, ThisMessage).   
      RUN OpenQuery. 
    END.  /* Record has been deleted */
    ELSE IF LOCKED Glossary THEN DO:
      ThisMessage = "This entry is locked by another user":U.

      GET CURRENT GlossBrowser NO-LOCK.
      RUN adecomm/_setcurs.p ("WAIT":U).
      FIND FIRST kit._Lock WHERE _Lock-RecID = INTEGER(RECID(Glossary)) 
                         AND (_Lock-Flags = "X":U OR  /* Exclusive-lock */
                              _Lock-Flags = "S":U OR  /* Share-lock     */
                              _Lock-Flags = "U":U)    /* Upgraded lock  */
        NO-LOCK NO-ERROR.
      IF AVAILABLE kit._Lock THEN DO:
        ASSIGN ThisMessage = REPLACE(ThisMessage, "another user":U, _Lock-Name).
        FIND FIRST kit._Connect WHERE _Connect-Usr = _Lock-Usr NO-LOCK NO-ERROR.
        IF AVAILABLE kit._Connect THEN
          ThisMessage = ThisMessage + " on device: ":U + _Connect-Device.
      END.

      RUN adecomm/_setcurs.p ("":U).
      RUN adecomm/_s-alert.p (INPUT-OUTPUT ErrorStatus, "w*":U, "ok":U, ThisMessage). 
    END.  /* Glossary is locked */
    ELSE IF CURRENT-CHANGED(Glossary) THEN DO:
      ThisMessage = REPLACE("The Glossary entry has been changed since you began working on it:^^  Source Phrase is ~"&1~"^  Target Phrase is ~"&2~"^^Do you still want to save your changes?":U, "&1":U, Glossary.SourcePhrase).
      ThisMessage = REPLACE(ThisMessage, "&2", Glossary.TargetPhrase).
      RUN adecomm/_s-alert.p (INPUT-OUTPUT ErrorStatus, "q":U, "yes-no":U, ThisMessage). 
      IF ErrorStatus /* i.e., user selected "yes" */ THEN DO:
        ASSIGN INPUT BROWSE GlossBrowser
          Glossary.SourcePhrase
          Glossary.TargetPhrase.
        ASSIGN Glossary.ModifiedByTranslator              = yes
               Glossary.ModifiedByTranslator:SCREEN-VALUE = "yes":U
               Glossary.ShortSrc                          = ss
               Glossary.ShortTarg                         = st.
      END.  /* Save changes */
      ELSE DISPLAY Glossary.SourcePhrase
                   Glossary.TargetPhrase 
             WITH BROWSE GlossBrowser.  /* Update browser row */
    END.  /* Record was changed by another user */
    ELSE DO:
      ASSIGN INPUT BROWSE GlossBrowser
        Glossary.SourcePhrase
        Glossary.TargetPhrase.
      ASSIGN Glossary.ModifiedByTranslator              = yes
             Glossary.ModifiedByTranslator:SCREEN-VALUE = "yes":U
             Glossary.ShortSrc                          = ss
             Glossary.ShortTarg                         = st.
    END.  /* Record was locked successfully */
  END.  /* TRANSACTION */

  GET CURRENT GlossBrowser NO-LOCK.  /* Downgrade locks */
  run SetSensitivity in hMain.  /* Re-enable Add/Delete buttons */
END. 


on leave of Glossbrowser in frame {&frame-name}
do:                               
    tPrevh = last-event:widget-leave.
END.  

                               
on entry of browse Glossbrowser
do:
   run CustSensi in hMain(Glossbrowser:handle in frame {&frame-name}).
END.


ON MOUSE-SELECT-DBLCLICK OF BROWSE GlossBrowser, Glossary.SourcePhrase,
                         Glossary.TargetPhrase DO:
  IF AVAILABLE Glossary THEN
    RUN Realize IN hLongStr (INPUT Glossary.SourcePhrase,
                             INPUT Glossary.TargetPhrase,
                             INPUT hGloss).
END.
     
/* ***************************  Main Block  *************************** */

/*
** Note: all the close stuff has been excluded from processing
*/

{adetran/common/noscroll.i}

PAUSE 0 BEFORE-HIDE.

MAIN-BLOCK:
DO ON ERROR   UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK
   ON end-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK:

  FIND FIRST kit.XL_Project NO-LOCK NO-ERROR.
  IF AVAILABLE kit.XL_Project THEN
    iLastGlossCount = kit.XL_Project.GlossaryCount.

  GlossBrowser:num-locked-columns = 1.
  run openquery.       

  IF NOT THIS-procedure:PERSISTENT THEN
    WAIT-FOR CLOSE OF THIS-procedure.
END.
{adecomm/_adetool.i}

/* **********************  Internal procedures  *********************** */

procedure DeleteRow :  
  if GlossBrowser:num-selected-rows in frame {&frame-name} < 1 then do:
    ThisMessage = "You must select a row first.".
    run adecomm/_s-alert.p (input-output ErrorStatus, "w*":U, "ok":U, ThisMessage). 
    return.   
  END.

  IF VALID-HANDLE(hLKup) THEN RUN HideMe in hLKUP.
  ThisMessage = "Delete selected rows?".        
  run adecomm/_s-alert.p (input-output ErrorStatus, "q*":U, "yes-no":U, ThisMessage).    
  if not ErrorStatus then return.

  run adecomm/_setcurs.p ("WAIT":U).
  do with frame {&frame-name} TRANSACTION:
    DO i = Glossbrowser:num-selected-rows TO 1 BY -1:    
      result = Glossbrowser:fetch-selected-row(i).        

      GET CURRENT GlossBrowser EXCLUSIVE-LOCK NO-WAIT.
      IF LOCKED Glossary THEN DO:
        ThisMessage = "This entry is locked by another user":U.

        GET CURRENT GlossBrowser NO-LOCK.
        RUN adecomm/_setcurs.p ("WAIT":U).
        FIND FIRST kit._Lock WHERE _Lock-RecID = INTEGER(RECID(Glossary)) 
                           AND (_Lock-Flags = "X":U OR  /* Exclusive-lock */
                                _Lock-Flags = "S":U OR  /* Share-lock     */
                                _Lock-Flags = "U":U)    /* Upgraded lock  */
          NO-LOCK NO-ERROR.
        IF AVAILABLE kit._Lock THEN DO:
          ASSIGN ThisMessage = REPLACE(ThisMessage, "another user":U, _Lock-Name).
          FIND FIRST kit._Connect WHERE _Connect-Usr = _Lock-Usr NO-LOCK NO-ERROR.
          IF AVAILABLE kit._Connect THEN
            ThisMessage = ThisMessage + " on device: ":U + _Connect-Device.
        END.

        RUN adecomm/_setcurs.p ("":U).
        RUN adecomm/_s-alert.p (INPUT-OUTPUT ErrorStatus, "w*":U, "ok":U, ThisMessage). 
        UNDO, RETURN.  /* Abort all deletes */
      END.  /* Glossary is locked */
      ELSE DO:
        DELETE Glossary.
        iLastGlossCount = iLastGlossCount - 1.
      END. /* IF AVAIL Glossary */ 
    END. /* DO i = 1 to num-selected */

    result = Glossbrowser:delete-selected-rows().              
    tModFlag = true.
  END. /* Do with frame {&frame-name} TRANSACTION */  

  run SetSensitivity in hMain.
  run adecomm/_setcurs.p ("":U).
end procedure.


procedure disable_UI :
  hide frame GlossFrame.
  if this-procedure:PERSISTENT then delete procedure this-procedure.
end procedure.


procedure HideMe :
  frame GlossFrame:hidden = true.
end procedure.


procedure insertRow :
  DO WITH FRAME {&FRAME-NAME}:
    IF NOT CAN-FIND(FIRST Glossary) THEN DO:          
      /* This is an empty browse and a dummy record is created;
         Later, the row-leave trigger will modify this record.  */
      Project-Trans:
      DO TRANSACTION:
        CREATE Glossary.
        ASSIGN                      
          Glossary.SourcePhrase         = "":U
          Glossary.TargetPhrase         = "":U
          Glossary.GlossaryType         = "C":U
          Glossary.ModifiedByTranslator = true.
      END.  /* Project-Trans */
      /*
      ** The empty row has been created so by opening the query, you can start typing
      ** into this dummy row.  APPLY "ENTRY" positions the user to the first cell.
      */
      RUN OpenQuery.   
      APPLY "ENTRY":U TO Glossary.SourcePhrase IN BROWSE GlossBrowser.
      RUN SetSensitivity IN hMain.
    END. 
    ELSE DO:  
      /*
      ** Ok, there are some records in the table, but is there a record in the
      ** buffer?  If not, produce an error and get out.
      */
      IF GlossBrowser:NUM-SELECTED-ROWS < 1 THEN DO:
        ThisMessage = "You must select a row first.".
        RUN adecomm/_s-alert.p (INPUT-OUTPUT ErrorStatus, "w":U, "ok":U, ThisMessage).    
        RETURN.
      END.        
      ELSE DO: 
        result = GlossBrowser:INSERT-ROW("AFTER":U).
      END.
    END.
  END.
end procedure.


procedure OpenQuery :
  do with frame {&frame-name}:
    IF TmpFl_VT_Gl NE "":U THEN RUN VALUE(TmpFl_VT_Gl).
    ELSE open query Glossbrowser for each Glossary NO-LOCK. 
  
    find first kit.XL_Project NO-LOCK no-error. 
    if available kit.XL_Project and kit.XL_Project.GlossaryCount > 0 then
      GlossBrowser:max-data-guess = kit.XL_Project.GlossaryCount.
  
   if OrdMode3 = "":U then run CreateOrdList.
  END.
end procedure.


procedure Realize : 
  enable all with frame GlossFrame in window MainWindow.  
  
  if Priv1 then assign /* MuseUseGlossary */
    Glossary.SourcePhrase:read-only in browse GlossBrowser = true
    Glossary.TargetPhrase:read-only in browse GlossBrowser = true.
  else if not priv2 then assign  /* SupersedeGlossary */
    Glossary.SourcePhrase:read-only in browse GlossBrowser = true
    Glossary.TargetPhrase:read-only in browse GlossBrowser = true.

  if ResetQuery then do:
    run OpenQuery.
    ResetQuery = false.
  END.
  
  frame GlossFrame:hidden = false.            
end procedure.


procedure Ref :
  define input parameter pRecid AS RECID NO-UNDO.
   
  tLog = Glossbrowser:REFRESH() IN FRAME {&Frame-Name}.
  IF pRecid <> ? THEN DO: 
    tlog = Glossbrowser:set-repositioned-row(INTEGER(Glossbrowser:num-iterations / 2),
                                                     "CONDITIONAL":U) in frame {&frame-name}.
    REPOSITION Glossbrowser TO RECID pRecid NO-ERROR.
  END.   

  /* Tell Find Dialog to reposition itself */
  IF VALID-HANDLE(hFind) THEN
    RUN FndRec IN hFind (INPUT ROWID(Glossary), INPUT "kit.XL_GlossEntry").
  /* Tell Replace Dialog to reposition itself */
  IF VALID-HANDLE(hReplace) THEN
    RUN FndRec IN hReplace (INPUT ROWID(Glossary), INPUT "kit.XL_GlossEntry").
end procedure.


procedure Repo :
  define input parameter pRecid AS RECID NO-UNDO.
  define input parameter pRow as integer NO-UNDO.
  
  IF pRecid = ? THEN                  
     REPOSITION Glossbrowser TO ROW pRow NO-ERROR.
  ELSE do:
    tlog = Glossbrowser:set-repositioned-row(INTEGER(Glossbrowser:num-iterations / 2),
                                                     "CONDITIONAL":U) in frame {&frame-name}.
    REPOSITION Glossbrowser TO RECID pRECID NO-ERROR.
  END.   

  /* Tell Find Dialog to reposition itself */
  IF VALID-HANDLE(hFind) THEN
    RUN FndRec IN hFind (INPUT ROWID(Glossary), INPUT "kit.XL_GlossEntry").
  /* Tell Replace Dialog to reposition itself */
  IF VALID-HANDLE(hReplace) THEN
    RUN FndRec IN hReplace (INPUT ROWID(Glossary), INPUT "kit.XL_GlossEntry").
end procedure.


procedure SortQuery :
  define input parameter pTempFile AS CHARACTER NO-UNDO.
  DEFINE VARIABLE hBrCol AS HANDLE NO-UNDO.
  
  IF pTempFile NE TmpFl_VT_Gl THEN DO:
    IF TmpFl_VT_Gl NE "":U THEN OS-DELETE VALUE(TmpFl_VT_Gl).
    TmpFl_VT_Gl = pTempFile.
  END.

  /* In case we are updating the browse, commit the change before reopening query */
  hBrCol = Glossbrowser:CURRENT-COLUMN IN FRAME {&FRAME-NAME}.
  IF VALID-HANDLE(hBrCol) THEN DO:
    APPLY "LEAVE" TO hBrCol.
    APPLY "ROW-LEAVE" TO Glossbrowser IN FRAME {&FRAME-NAME}.
  END.

  if valid-handle(hSort) then delete procedure hSort.  
  run value(pTempFile) persistent set hSort. 
  if valid-handle(hSort) then hSort:private-data = CurrentTool.
  find first kit.XL_Project NO-LOCK no-error. 
  if available kit.XL_Project and kit.XL_Project.GlossaryCount > 0 then
    GlossBrowser:max-data-guess IN FRAME {&FRAME-NAME} = kit.XL_Project.GlossaryCount.

  /* Tell Find Dialog to reposition itself */
  IF VALID-HANDLE(hFind) THEN
    RUN FndRec IN hFind (INPUT ROWID(Glossary), INPUT "kit.XL_GlossEntry").
  /* Tell Replace Dialog to reposition itself */
  IF VALID-HANDLE(hReplace) THEN
    RUN FndRec IN hReplace (INPUT ROWID(Glossary), INPUT "kit.XL_GlossEntry").
end procedure.


procedure OrderColumn :
  {adetran/common/_order.i Glossbrowser}    
end procedure.


procedure CreateOrdList :
  do with frame {&frame-name}:
   DEFINE VARIABLE tBrColWH     AS WIDGET-HANDLE NO-UNDO.
   DEFINE VARIABLE tListItems   AS CHARACTER NO-UNDO.

   assign tBrColWH = GlossBrowser:First-Column
          tListItems = "":U.
                   
       do while tBrColWH <> ?:  
          assign tListItems = tListItems + ",":U +  tBrColWh:Label                                   
                 tBrColWH = tBrColWH:Next-Column.
       END.
               
      Assign tListItems = trim(tListItems,",":U)
              tListItems = replace(tListItems,"!":U,"":U)
              OrdMode3 = tListItems.
   END.     
end procedure.                                                          


PROCEDURE Store-Long-String:
  DEFINE INPUT PARAMETER src AS CHARACTER               NO-UNDO.
  DEFINE INPUT PARAMETER trg AS CHARACTER               NO-UNDO.

  /* First make sure that we are still on the correct row of the browse  */
  IF NOT AVAILABLE (Glossary) THEN RETURN.
  IF Glossary.SourcePhrase NE src THEN RETURN.
  IF trg = ? THEN RETURN.

  DO TRANSACTION:
    GET CURRENT GlossBrowser EXCLUSIVE-LOCK NO-WAIT.
    IF NOT AVAILABLE Glossary THEN DO:
      ThisMessage = "This entry has been deleted since you began working on it.". 
      RUN adecomm/_s-alert.p (INPUT-OUTPUT ErrorStatus, "w":U, "ok":U, ThisMessage).   
      RUN OpenQuery. 
    END.  /* Record has been deleted */
    ELSE IF LOCKED Glossary THEN DO:
      ThisMessage = "This entry is locked by another user":U.

      GET CURRENT GlossBrowser NO-LOCK.
      RUN adecomm/_setcurs.p ("WAIT":U).
      FIND FIRST kit._Lock WHERE _Lock-RecID = INTEGER(RECID(Glossary)) 
                         AND (_Lock-Flags = "X":U OR  /* Exclusive-lock */
                              _Lock-Flags = "S":U OR  /* Share-lock     */
                              _Lock-Flags = "U":U)    /* Upgraded lock  */
        NO-LOCK NO-ERROR.
      IF AVAILABLE kit._Lock THEN DO:
        ASSIGN ThisMessage = REPLACE(ThisMessage, "another user":U, _Lock-Name).
        FIND FIRST kit._Connect WHERE _Connect-Usr = _Lock-Usr NO-LOCK NO-ERROR.
        IF AVAILABLE kit._Connect THEN
          ThisMessage = ThisMessage + " on device: ":U + _Connect-Device.
      END.

      RUN adecomm/_setcurs.p ("":U).
      RUN adecomm/_s-alert.p (INPUT-OUTPUT ErrorStatus, "w*":U, "ok":U, ThisMessage). 
    END.  /* Glossary is locked */
    ELSE IF CURRENT-CHANGED(Glossary) THEN DO:
      ThisMessage = REPLACE("The Glossary entry has been changed since you began working on it:^^  Source Phrase is ~"&1~"^  Target Phrase is ~"&2~"^^Do you still want to save your changes?":U, "&1":U, Glossary.SourcePhrase).
      ThisMessage = REPLACE(ThisMessage, "&2", Glossary.TargetPhrase).
      RUN adecomm/_s-alert.p (INPUT-OUTPUT ErrorStatus, "q":U, "yes-no":U, ThisMessage). 
      IF ErrorStatus /* i.e., user selected "yes" */ THEN DO:
        ASSIGN Glossary.ModifiedByTranslator = yes
               Glossary.ModifiedByTranslator:SCREEN-VALUE IN BROWSE GlossBrowser  = "yes":U
               Glossary.TargetPhrase         = trg
               Glossary.TargetPhrase:SCREEN-VALUE IN BROWSE GlossBrowser = trg
               Glossary.ShortTarg            = SUBSTRING(TRIM(trg), 1, 63, "RAW":U).
      END.  /* Save changes */
      ELSE DISPLAY Glossary.SourcePhrase
                   Glossary.TargetPhrase 
             WITH BROWSE GlossBrowser.  /* Update browser row */
    END.  /* Record was changed by another user */
    ELSE DO:
      ASSIGN Glossary.ModifiedByTranslator = yes
             Glossary.ModifiedByTranslator:SCREEN-VALUE IN BROWSE GlossBrowser  = "yes":U
             Glossary.TargetPhrase         = trg
             Glossary.TargetPhrase:SCREEN-VALUE IN BROWSE GlossBrowser = trg
             Glossary.ShortTarg            = SUBSTRING(TRIM(trg), 1, 63, "RAW":U).
    END.  /* Record was locked successfully */
  END.  /* TRANSACTION */

  GET CURRENT GlossBrowser NO-LOCK.  /* Downgrade locks */
  FIND CURRENT kit.XL_Project NO-LOCK NO-ERROR.  
END PROCEDURE. /* Store-Long-String */



