// Best4f.prg  - Funktionen zu Best4p.prg

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"

#define   xbeUser_FileMarked       xbeP_User + 1
#define   xbeUser_FileSelected     xbeP_User + 2


PROCEDURE AppQuit()
   LOCAL nButton, oXbp := SetAppFocus()

   nButton := ConfirmBox( , ;
   "Wollen Sie das Programm beenden ?", ;
            "Beenden", ;
            XBPMB_YESNO , ;
            XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_MOVEABLE )
   IF nButton == XBPMB_RET_YES
      CLOSE ALL
      QUIT
   ENDIF

   SetAppFocus( oXbp )
RETURN

FUNCTION IsIndexUnique( nOrder, xIndexValue )
   LOCAL nOldOrder := OrdNumber()
   LOCAL nRecno    := Recno()
   LOCAL lUnique   := .F.

   OrdSetFocus( nOrder )

   lUnique := ! DbSeek( xIndexValue )

   OrdSetFocus( nOldOrder )
   DbGoTo( nRecno )

RETURN lUnique

FUNCTION Satzsp()
      IF DbRlock(Recno())
      ELSE
         MsgBox( "Datensatz ist zur Zeit gesperrt!" )
      ENDIF
RETURN (.T.)

FUNCTION VorSkip()
      IF ! Eof()
         DbSkip(1)
         IF Eof()
            DbSuspendNotifications()
            DbSkip(-1)           // Append-Situation vermeiden
            DbResetNotifications()
            DbGobottom()               // Notification ausl”sen
         ENDIF
      ENDIF
RETURN (.T.)


PROCEDURE HiliteSle( oXbpSle )
   LOCAL aPP := { { XBP_PP_FGCLR       , GRA_CLR_WHITE       } , ;
                  { XBP_PP_BGCLR       , GRA_CLR_RED        } }
//                  { XBP_PP_COMPOUNDNAME, FONT_TIMES_MEDIUM + FONT_STYLE_BOLD } }
   oXbpSle:setPresParam( aPP )
RETURN


PROCEDURE DeHiliteSle( oXbpSle )
  LOCAL aPP := { { XBP_PP_FGCLR       , GRA_CLR_BLACK        } , ;
                  { XBP_PP_BGCLR       , GRA_CLR_WHITE       } }
//                  { XBP_PP_COMPOUNDNAME, FONT_TIMES_MEDIUM + FONT_STYLE_BOLD } }
   oXbpSle:setPresParam( aPP )
RETURN

/*
 * Prozedur, die Daten aus einem modalen Dialog abfragt
 */
//PROCEDURE Modal()
PROCEDURE Suchen( oDlg1 )
   LOCAL cAuf := Space(6)
   LOCAL cTitle := "Auftrag-Nr. eingeben :"
   DO WHILE .T.
      cAuf := ModalDialog( cAuf, cTitle, oDlg1 )
      FIND &cAuf
      IF val(cAuf) == best->Auftrnr .or. cAuf == ""
         EXIT
      ELSE
         cAuf := Space(6)
         cTitle := "Andere Auftrag-Nr. :"
      ENDIF
   ENDDO
   SetAppFocus( oDlg1 )
RETURN


/*
 * Die Funktion zeigt, wie ein modaler Dialog genutzt wird. 
 * Da der Dialog modal ist, kann die Funktion Daten zurckgeben.
 */
FUNCTION Modaldialog( cString, cTitle, drawingArea )
   LOCAL nEvent, mp1, mp2, oXbp, lExit
   LOCAL oDlg, oSle, oFocus, aPos, aSize  //, drawingArea
   LOCAL nXsize := 240
   LOCAL nYsize := 180

  /*
   * Gr”áe des Desktop Fensters
   */
//   aSize := AppDeskTop():currentSize()
   aSize := drawingArea:currentSize()

  /*
   * Position fr zentrierte Anzeige des Dialogfensters berechnen
   */
   aPos  := { ( aSize[1]-nXsize )/2, ( aSize[2]-nYsize+20 ) / 2 }

  /*
   * Dialogfenster mit unterschiedlichem Parent und Owner erzeugen
   */
//   oDlg           := XbpDialog():new( AppDesktop(), SetAppWindow(), aPos, {nXsize,nYsize} )
   oDlg           := XbpDialog():new( drawingArea, SetAppWindow(), aPos, {nXsize,nYsize} )
   oDlg:title     := cTitle
   oDlg:taskList  := .T.
   oDlg:minButton := .F.
   oDlg:maxButton := .F.
   oDlg:create()
   oDlg:drawingArea:setFontCompoundName( FONT_HELV_SMALL )
   oDlg:Close    := {|| lExit := .T. }

   SetAppFocus( oDlg )

  /*
   * Gr”áe der drawing area
   */
   aSize := oDlg:drawingArea:currentSize()
   
  /*
   * Zentrierte Position fr SLE berechnen und SLE erzeugen
   *   48 = Abstand von unten
   *   20 = H”he des SLE
   */
   aPos := { 12, ( aSize[2] - 20 ) / 2 }
   oSle := XbpSle():new( oDlg:drawingArea,, aPos, { aSize[1] - 24, 20 } )
   oSle:TabStop  := .T.
   oSle:create()
   oSle:setData( cString )

  /*
   * Berechne zentrierte Position fr Pushbutton und erzeuge ihn
   */
   aPos          := { ( aSize[1]-72 ) / 2, 12 }
   oXbpBok          := XbpPushbutton():new( oDlg:drawingArea, , aPos, {72,24} )
   oXbpBok:caption  := "OK"
   oXbpBok:activate := {|| lExit := .T. }
   oXbpBok:TabStop  := .T.
   oXbpBok:create()
   
  /*
   * XBP der gerade Fokus hat sichern und Fokus auf Sle setzen
   */
   oFocus := SetAppFocus( oSle )

  /*
   * Dialogfenster modal schalten.
   * WICHTIG: Dadurch wird das Owner Fenster gesperrt -> SetAppWindow()
   */
   oDlg:setModalState( XBP_DISP_APPMODAL )

  /*
   * Eine Event-Loop muá jetzt verwendet werden, da die 
   * Funktion einen Rckgabewert hat.
   */
   lExit := .F.
   DO WHILE ! lExit 
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Keyboard
         DO CASE
            CASE mp1 == xbeK_RETURN
               PostAppEvent( xbeP_Activate,,, oXbpBok )
         ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

  /*
   * Dialogfenster nicht-modal schalten.
   * WICHTIG: Dadurch wird das Owner Fenster entsperrt 
   */
   oDlg:setModalState( XBP_DISP_MODELESS )

  /*
   * Daten vom Sle holen, Dialogfenster freigeben und 
   * Fokus auf vorherigen XBP setzen
   */
   cString := oSle:getData()
   oDlg:destroy()
   SetAppFocus( oFocus )

RETURN cString

FUNCTION Neu( oDlg1 )
   LOCAL cAuf := Space(6)
   LOCAL cTitle := "Neue Auftrag-Nr. eingeben :"
   IIF( best->Auftrnr>0, , DbDelete())
   DO WHILE .T.
      cAuf := ModalDialog( cAuf, cTitle, oDlg1 )
      FIND &cAuf
      IF val(cAuf) == best->Auftrnr .AND. VAL( cAuf ) > 0
         cAuf := Space(6)
         cTitle := "Schon belegt! Neue Auftrag-Nr. :"
      ELSEIF VAL( cAuf ) < 1000000
         EXIT
      ELSE
         cAuf := Space(6)
         cTitle := "Zu lang! Neue Auftrag-Nr. :"
      ENDIF
   ENDDO
   IF VAL( cAuf ) > 0
     best->(DbAppend())
     REPLACE best->AUFTRNR WITH Val( cAuf )
     REPLACE todesurs with "natrlicher Tod"
     REPLACE staatsan with "deutsch"
   ENDIF
   SetAppFocus ( oDlg1 )
RETURN .T.

FUNCTION Ehe( oDlg1, aEditcontrols )
   LOCAL aEhe[7]
   LOCAL cTitle := "Ehe-Partner :"

   aEhe := IIf( best->EH_NAME = " " , ;
                { best->NAME," "," ",best->STRASSE,best->PLZ_ORT, ;
                  CtoD(" "),CtoD(" ") } , ;
                { best->EH_NAME,best->EH_VNAME,best->EH_GEBN, ;
                  best->EH_STR,best->EH_ORT,best->EH_GEBD,best->EH_GEST } )
   aEditcontrols := EheDialog( aEhe, cTitle, oDlg1, aEditcontrols )

   SetAppFocus ( oDlg1 )
RETURN aEditcontrols


FUNCTION Ehedialog( aEhe, cTitle, drawingArea, aEditcontrols )
   LOCAL nEvent, mp1, mp2, oXbp, lExit
   LOCAL oDlg, oSle, oFocus, aPos, aSize  //, drawingArea
   LOCAL nXsize := 250
   LOCAL nYsize := 250 , nBo := 200
// tats„chliche Bildschirmaufl”sung:
   LOCAL aSizeDesktop := AppDesktop():currentSize()
   LOCAL nBSb := aSizeDesktop[1]
   LOCAL nBSh := aSizeDesktop[2]
// folgende Zahlen-Werte basieren auf 800x600:
   LOCAL nV := nBSb/800         // Korrekturfaktor fr tats„chliche Aufl”sung
   LOCAL n5 := 5*nV
   LOCAL n10 := 10*nV
   LOCAL nBl1 := int(60*nV)      // L„nge des Bezeichnungsfeldes
   LOCAL nBl2 := int(50*nV)      // L„nge des Bezeichnungsfeldes
   LOCAL nBl3 := int(30*nV)      // L„nge des Bezeichnungsfeldes
   LOCAL nBl4 := int(20*nV)      // L„nge des Bezeichnungsfeldes
   LOCAL nBh := int(20*nV)      // H”he des Bezeichnungsfeldes =20
   LOCAL nBz := int(25*nV)      // Zeilenh”he des Bezeichnungsfeldes =25

   LOCAL nR1 := 5       // linker Rand Bezeichnungsfeld
   LOCAL nR2 := int(70*nV)       // linker Rand EingabeFeld
   LOCAL nFl1 := int(170*nV)    // L„nge des Eingabefeldes
   LOCAL nFl2 := int(120*nV)    // L„nge des Eingabefeldes
   LOCAL nFl3 := int(80*nV)    // L„nge des Eingabefeldes
   LOCAL nFl4 := int(60*nV)    // L„nge des Eingabefeldes
   LOCAL nFl5 := int(30*nV)    // L„nge des Eingabefeldes
   LOCAL nFa := 0
   LOCAL nT1 := int(200*nV)     // Linker Rand Taste
   LOCAL nT2 := int(430*nV)     // Linker Rand Taste
   LOCAL nT3 := int(490*nV)     // Linker Rand Taste
   LOCAL nT4 := int(550*nV)     // Linker Rand Taste
   LOCAL nT5 := int(610*nV)     // Linker Rand Taste
   LOCAL nT6 := int(670*nV)     // Linker Rand Taste
   LOCAL nT7 := int(730*nV)     // Linker Rand Taste
   LOCAL nTl := int(40*nV)     // Linker Rand Taste

   aSize := drawingArea:currentSize()

   aPos  := { ( aSize[1]-nXsize )/2, ( aSize[2]-nYsize+20 ) / 2 }

   oDlg           := XbpDialog():new( drawingArea,SetAppWindow() , aPos, {nXsize,nYsize} )
   oDlg:title     := cTitle
   oDlg:taskList  := .T.
   oDlg:minButton := .F.
   oDlg:maxButton := .F.
   oDlg:create()
//   oDlg:drawingArea:setFontCompoundName( FONT_HELV_SMALL )
   oDlg:Close    := {|| lExit := .T. }

   drawingArea := oDlg:drawingArea

//   oFocus := SetAppFocus( drawingArea )

   oXbp := XbpStatic():new( drawingarea, , {nR1-n5,nR1-n5}, {nXSize-n10,nYSize-nBl3},)
   oXbp:clipSiblings := .T.
   oXbp:type := XBPSTATIC_TYPE_GROUPBOX
   oXbp:create()

   nBo := nBo-nBz
   oSle := XbpStatic():new( drawingarea, , {nR1,nBo}, {nBl1,nBh} )
   oSle:caption := "Name:"
   oSle:clipSiblings := .T.
   oSle:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oSle:create()
   nFa := 28 ; nFl := nFa*6
   oSle := XbpSLE():new( drawingarea, , {nR2,nBo}, {nFl1,nBh}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle:bufferLength := nFa
   oSle:TabStop  := .T.
   oSle:clipSiblings := .T.
   oSle:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oSle:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oSle:group := XBP_WITHIN_GROUP
   oSle:dataLink := {|x| IIf( PCOUNT()==0, Trim( best->EH_NAME ), best->EH_NAME := x ) }
   oSle:create():setData( TRIM(aEhe[1]) )
   AAdd ( aEditControls, oSle )

   nBo := nBo-nBz
   oXbp := XbpStatic():new( drawingarea, , {nR1,nBo}, {nBl1,nBh} )
   oXbp:caption := "Vorname:"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   nFa := 28 ; nFl := nFa*6
   oXbp := XbpSLE():new( drawingarea, , {nR2,nBo}, {nFl1,nBh}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oXbp:bufferLength := nFa
   oXbp:clipSiblings := .T.
   oXbp:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oXbp:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oXbp:group := XBP_WITHIN_GROUP
   oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( best->EH_VNAME ), best->EH_VNAME := x ) }
   oXbp:create():setData( TRIM(aEhe[2]) )
   AAdd ( aEditControls, oXbp )

   nBo := nBo-nBz
   oXbp := XbpStatic():new( drawingarea, , {nR1,nBo}, {nBl1,nBh} )
   oXbp:caption := "Geb.-Name:"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   nFa := 28 ; nFl := nFa*6
   oXbp := XbpSLE():new( drawingarea, , {nR2,nBo}, {nFl1,nBh}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oXbp:bufferLength := nFa
   oXbp:clipSiblings := .T.
   oXbp:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oXbp:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oXbp:group := XBP_WITHIN_GROUP
   oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( best->EH_GEBN ), best->EH_GEBN := x ) }
   oXbp:create():setData( TRIM(aEhe[3]) )
   AAdd ( aEditControls, oXbp )

   nBo := nBo-nBz
   oXbp := XbpStatic():new( drawingarea, , {nR1,nBo}, {nBl1,nBh} )
   oXbp:caption := "Straáe:"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   nFa := 28 ; nFl := nFa*6
   oXbp := XbpSLE():new( drawingarea, , {nR2,nBo}, {nFl1,nBh}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oXbp:bufferLength := nFa
   oXbp:clipSiblings := .T.
   oXbp:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oXbp:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oXbp:group := XBP_WITHIN_GROUP
   oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( best->EH_STR ), best->EH_STR := x ) }
   oXbp:create():setData( TRIM(aEhe[4]) )
   AAdd ( aEditControls, oXbp )

   nBo := nBo-nBz
   oXbp := XbpStatic():new( drawingarea, , {nR1,nBo}, {nBl1,nBh} )
   oXbp:caption := "PLZ/Ort:"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   nFa := 28 ; nFl := nFa*6
   oXbp := XbpSLE():new( drawingarea, , {nR2,nBo}, {nFl1,nBh}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oXbp:bufferLength := nFa
   oXbp:clipSiblings := .T.
   oXbp:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oXbp:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oXbp:group := XBP_WITHIN_GROUP
   oXbp:dataLink := {|x| IIf( PCOUNT()==0, Trim( best->EH_ORT ), best->EH_ORT := x ) }
   oXbp:create():setData( TRIM(aEhe[5]) )
   AAdd ( aEditControls, oXbp )

   nBo := nBo-nBz
   oXbp := XbpStatic():new( drawingarea, , {nR1,nBo}, {nBl1,nBh} )
   oXbp:caption := "geb/gest:"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   nFa := 10 ; nFl := nFa*7
   oXbp := XbpSLE():new( drawingarea, , {nR2,nBo}, {nFl3,nBh}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oXbp:bufferLength := nFa
   oXbp:clipSiblings := .T.
   oXbp:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oXbp:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oXbp:group := XBP_WITHIN_GROUP
   oXbp:dataLink := {|x| IIf( PCOUNT()==0, ;
                        IIf( DtoC( best->EH_GEBD )=" ", trim(" "), DtoC( best->EH_GEBD )), ;
                        IIf( len(x)<7, best->EH_GEBD := CtoD(x+str(year(date(),4,0))), ;
                        best->EH_GEBD := CtoD(x) ) ) }
   oXbp:create():setData( IIf( ValType(aEhe[6])=="D", ;
                          IIf( DtoC(aEhe[6])=" ", TRIM(" "), DtoC(aEhe[6])), ) )
   AAdd ( aEditControls, oXbp )

   nFa := 10 ; nFl := nFa*7
   oXbp := XbpSLE():new( drawingarea, , {nR2+nFl1-nFl3,nBo}, {nFl3,nBh}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oXbp:bufferLength := nFa
   oXbp:clipSiblings := .T.
   oXbp:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oXbp:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oXbp:group := XBP_WITHIN_GROUP
   oXbp:dataLink := {|x| IIf( PCOUNT()==0, ;
                        IIf( DtoC( best->EH_GEST )=" ", trim(" "), DtoC( best->EH_GEST )), ;
                        IIf( len(x)<7, best->EH_GEST := CtoD(x+str(year(date(),4,0))), ;
                        best->EH_GEST := CtoD(x) ) ) }
   oXbp:create():setData( IIf( ValType(aEhe[7])=="D", ;
                          IIf( DtoC(aEhe[7])=" ", TRIM(" "), DtoC(aEhe[7])), ) )
   AAdd ( aEditControls, oXbp )


   aPos          := { ( aSize[1]-72 ) / 2, 12 }
   oXbpBok          := XbpPushbutton():new( oDlg:drawingArea, , aPos, {72,24} )
//   oXbpBok          := XbpPushbutton():new( drawingarea, , {50,20}, {72,24} )
   oXbpBok:caption  := "OK"
   oXbpBok:activate := {|| lExit := .T. }
   oXbpBok:TabStop  := .T.
   oXbpBok:group := XBP_WITHIN_GROUP
   oXbpBok:create()

   oDlg:show()
   oFocus := SetAppFocus( oSle )
//   oFocus := SetAppFocus( oDlg )

   oDlg:setModalState( XBP_DISP_APPMODAL )

   lExit := .F.
   DO WHILE ! lExit 
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Keyboard
         DO CASE
            CASE mp1 == xbeK_RETURN .AND. oXbp == oXbpBok
               PostAppEvent( xbeP_Activate,,, oXbpBok )
            CASE mp1 == xbeK_ESC .OR. mp1 == xbeK_F10 .OR. mp1 == xbeK_PGDN
               PostAppEvent( xbeP_Activate,,, oXbpBok )
         ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

   oDlg:setModalState( XBP_DISP_MODELESS )

//   aEhe := oSle:getData()
   oDlg:destroy()
   SetAppFocus( oFocus )

RETURN aEditcontrols



FUNCTION ZumAnfang()
   IIF( best->Auftrnr>0, , DbDelete())
   best->(DbGoTop())
RETURN .T.

FUNCTION Zurueck()
   IIF( best->Auftrnr>0, , DbDelete())
   best->(DbSkip(-1))
RETURN .T.
   
FUNCTION Vorwaerts()
   IIF( best->Auftrnr>0, , DbDelete())
   VorSkip()
RETURN .T.

FUNCTION ZumEnde()
   IIF( best->Auftrnr>0, , DbDelete())
   best->(DbGoBottom())
RETURN .T.

