**BRegieKSo.prg   -  Regie-Zentrum fr Bestattungsverwaltung
//                      Verwaltung der Kassen-Texten
// 06.11.2005 Auftrnr statt 6 jetzt 7-stellig bei MengX
// 06.11.2005: E ersetzt 6: aus StrX(1->auftrnr,6,0) wird StrX(1->auftrnr,E,0)

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Appedit.ch"
#include "Appbrow.ch"
#include "Font.ch"
#include "Dmlb.ch"
#include "Common.ch"

FUNCTION KassenTextEingabe( oDlg1, cDruck, aPos, ASize, nAnf, nEnd )
   LOCAL oDlg, nEvent, mp1, mp2, oXbp, oBrowse
   LOCAL oCtrl, oFocus := SetAppFocus(), aEditControls := {}
   LOCAL aPP := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                  { XBP_PP_BGCLR       , GRA_CLR_WHITE    } }
   LOCAL aPPSle := { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } }
   LOCAL aPPTxt := { { XBP_PP_FGCLR       , GRA_CLR_BLACK    } , ;
                     { XBP_PP_BGCLR       , XBPSYSCLR_DIALOGBACKGROUND } }
   LOCAL nOldArea := Select()
   LOCAL lFlucht := .F., nFlucht, lEinfg:= .F.  //28.01.2007 22:23
//   PRIVATE nBezZeil := 1
   PRIVATE bezZ1 := "bez" , bezZ2 := "bez2"     // Artikel in Art->
   PRIVATE bZ1 := "b1" , bZ2 := "b2"     // Artikel in Serie->
   PRIVATE oCB, oKSDA, oSle0, oSle, oEdit, cTxNr := Trim(" "), cTx := Trim(" ")
   aPos := IIf(Empty(aPos),{10,30*nV},aPos)
   ASize:= IIf(Empty(ASize),{770*nH,500*nV},ASize)
   DEFAULT nAnf TO -100
   DEFAULT nEnd TO 299

   cSertemp := "se8"+LTrim(Str(Int(Seconds()/10)))
   cXsertemp := "se8X"+LTrim(Str(Int(Seconds()/10)))

//   SELECT 18
//   IF Upper(cDruck) == "BL_KAS"
//      USE kbtext index xkbtext
//      COPY TO (cSertemp)
//      USE (cSertemp) EXCLUSIVE
//      INDEX ON txnr TO (cXsertemp)
//   ELSEIF Upper(cDruck) == "BL_KOG"
//      USE ogtext index xogtext
//      COPY TO (cSertemp)
//      USE (cSertemp) EXCLUSIVE
//      INDEX ON txnr TO (cXsertemp)
//   ENDIF
   SELECT 8
   COPY TO (cSertemp)
   SELECT 18
   USE (cSertemp) EXCLUSIVE
   INDEX ON txnr TO (cXsertemp)
   GO TOP

   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := "Eingabe/Žnderung von Standardtexten fr die Kasse"
   oDlg:title := IIf(SET(43)==0,ConvToAnsiCP(oDlg:title),oDlg:title)   //03.12.2006 18:02
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, aPos, ASize )
   SetAppFocus(oDlg)       // Fenster muá den Focus haben, damit Parts ihn dann kriegen k”nnen!
   oDlg:lockUpdate(.T.)    // damit der Bildaufbau unsichtbar bleibt

//   oDlg:drawingArea:setColorBG( GRA_CLR_CYAN )
   oDlg:drawingArea:setColorBG( XBPSYSCLR_TRANSPARENT )
   oCB := oDlg:drawingArea
   oKSDA := oDlg:drawingArea
   oKSDA:cargo := oDlg

      nBo := Int(255*nV)          // Lage des Mittelstreifens
      nSBy := 45
      nSEy := 45

   cTxNr := Space(6); cTx := Space(10)
   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(5*nH),nBo}, {int(50*nH),int(25*nV)})
   oXbp:caption := "Bezeichn.:"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   oSle0 := XbpGet():new( oDlg:drawingArea, ,  {int(60*nH),nBo}, {int(80*nH),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle0:bufferLength := 10
   oSle0:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oSle0:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oSle0:group := XBP_WITHIN_GROUP
   oSle0:dataLink := {|x| IIf( PCOUNT()==0, cTx, cTx := x ) }
   oSle0:create():setData()
   oDlg:addEditControl( oSle0 )

   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(150*nH),nBo}, {int(50*nH),int(25*nV)})
   oXbp:caption := "Text-Nr:"
   oXbp:clipSiblings := .T.
   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oXbp:create()
   oSle := XbpGet():new( oDlg:drawingArea, ,  {int(210*nH),nBo}, {int(80*nH),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle:bufferLength := 6
   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, cTxNr, cTxNr := x ) }
   oSle:create():setData()
   oDlg:addEditControl( oSle )

// jetzt folgt die Erzeugung der Eingabefelder
   oEdit := KassTextFF():new( oKSDA,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, "s_kast", nAnf, nEnd, 18 )
   oEdit:CREATE( oKSDA,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, "s_kast", nAnf, nEnd, 18 )
   AEval( oEdit:editControls, {|x| oDlg:addEditControl( x ) } )
//   AEval( oEdit:appendControls, {|x| oDlg:addAppendControl( x ) } )
// bis hierhin geht die Erzeugung der Eingabefelder

//   oFocus := SetAppFocus( oSle0 )
   oDlg:setModalState( XBP_DISP_APPMODAL )
//   oDlg:show()

   oCtrl := XbpGetController():new( oDlg )
   oCtrl:create()
   oCtrl:READ( 1, .F. )
   * Shortcuts initialisieren
   oDlg:InitShortCuts( oDlg )
   oDlg:lockUpdate(.F.)
   oDlg:invalidateRect()

   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_RETURN
            IF oXbp == oSle0
               PostAppEvent( xbeP_Activate,,, oEdit:DruckKnopf[9])
            ENDIF
            IF oXbp == oSle
               PostAppEvent( xbeP_Activate,,, oEdit:DruckKnopf[8])
            ENDIF
            PostAppEvent( xbeP_Activate,,, oXbp)
         CASE mp1 == xbeK_ESC
            nFlucht := ConfirmBox( oCB, IIf(SET(43)==0,ConvToAnsiCP("Žnderungen speichern?"), ;
                        "Žnderungen speichern?"), ;
                        "Standardtexte fr Kasse beenden.", ;
                        XBPMB_YESNOCANCEL, ;
                        XBPMB_QUESTION )
            IF nFlucht == XBPMB_RET_YES
               lEinfg := .T.
               lFlucht := .F.
               PostAppEvent( xbeP_Close)
            ELSEIF nFlucht == XBPMB_RET_NO
               lEinfg := .F.
               lFlucht := .T.
               PostAppEvent( xbeP_Close)
            ELSE
               LOOP
            ENDIF
         CASE mp1 == xbeK_F1
            ModalDialog( (cDatver+"f1_AS.dbf"), "Bedienungshinweise", oASDA, 680*nH, 460*nV )
         CASE mp1 == xbeK_F10
            lEinfg := .T.
            PostAppEvent( xbeP_Activate,,, oEdit:DruckKnopf[oEdit:XbpNummer(oEdit:DruckKnopf,"ENDE")] )
//            PostAppEvent( xbeP_Close,,,oDlg)
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

   oDlg:setModalState( XBP_DISP_MODELESS )
//   DbDeRegisterClient(oEdit)
   oEdit:destroy()
   oDlg:destroy()
   SetAppFocus( oFocus )

   SELECT 18
   IF lFlucht == .F.               // ESC-Taste: lFlucht = .T.
      GO TOP
   //   DELETE ALL FOR Empty( 18->zeile )
      PACK
      USE                 // schlieáen der TEMP-Datei
      SELECT 8
      IF Upper(cDruck) == "BL_KAS"
         USE kbtext EXCLUSIVE
         SET INDEX TO xkbtext
      ELSEIF Upper(cDruck) == "BL_KOG"
         USE ogtext EXCLUSIVE
         SET INDEX TO xogtext
      ENDIF
      ZAP
      APPEND FROM (cSertemp)
   ELSE
      USE                 // schlieáen der TEMP-Datei
   ENDIF
   FErase( cDatver+cSertemp+".dbf" )
   FErase( cDatver+cXSertemp+".ntx" )
   Select &nOldArea
RETURN lEinfg

FUNCTION KassTextNeu(oDlg1)
   18->(DbAppend())
   18->(DbGotop())
   18->(DbSkip(0))
   SetAppFocus( oDlg1:setParent():childFromName( 18->(FieldPos( "txnr" )) ) )
RETURN .T.

FUNCTION KassTextEntf(oDlg1)
   IF ConfirmBox( oDlg1, IIf(SET(43)==0,ConvToAnsiCP("Soll der Datensatz gel”scht werden?"), ;
                        "Soll der Datensatz gel”scht werden?"), ;
                        IIf(SET(43)==0,ConvToAnsiCP("Datensatz l”schen"),"Datensatz l”schen"), ;
                        XBPMB_YESNO, ;
                        XBPMB_QUESTION ) == XBPMB_RET_YES
      Satzsp( oCB )
      18->(DbDelete())
      18->(DbSkip(0))
      RETURN .T.
   ENDIF
RETURN .T.

FUNCTION KassTextSuch( oDlg1, cSuchFeld )
   LOCAL oDlg, nEvent, mp1, mp2, oBrowse, cTxNr := Trim(" ")
   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 nOldArea := Select(), oFocus := SetAppFocus()
   LOCAL lFlucht := .F., nRec := RecNo()
   PRIVATE oCB

   (nOldArea)->(DbSuspendNotifications())
   SELECT 18

   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := "Kassentexte suchen"
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, {10,30*nV}, {int(330*nH),int(250*nV)} )

   oDlg:drawingArea:setColorBG( GRA_CLR_DARKCYAN )
   oCB := oDlg:drawingArea
   oCB:cargo := oDlg

   18->(DbSuspendNotifications())

   IF Upper(cSuchFeld) == "TX"
      cSuchFeld := oDlg1:childFromName( 18->(FieldPos( cSuchFeld ))):getData()
      cSuchFeld := IIf(!Empty(oSle0:getData()),oSle0:getData(),cSuchFeld)
      18->(DbSetFilter( {|| IIf( !Empty(cSuchFeld),Trim(cSuchFeld)," " )$18->tx } ))
      IIf( !(18)->(Bof()), 18->(DbGotop()), )
   ELSEIF Upper(cSuchFeld) == "TXNR"
      cTxNr := Trim( oDlg1:childFromName( 18->(FieldPos( cSuchFeld )) ):getData() )
      cTxNr := IIf(!Empty(Trim(oSle:getData())),Trim( oSle:getData() ),cTxNr)
      18->(DbSeek( cTxNr, .T. ))
   ELSE
      oDlg:destroy()
      (18)->(DbResetNotifications())
      Select &nOldArea
      (nOldArea)->(DbResetNotifications())
      (nOldArea)->(DbSkip(0) )
      SetAppFocus( oFocus )
      RETURN .F.
   ENDIF

// jetzt folgt die Erzeugung der Eingabefelder
   oBrowse := KassTextFF():new( oCB,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, "s_kast",300,399, 18 )
   oBrowse:CREATE( oCB,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, "s_kast",300,399, 18 )
// bis hierhin geht die Erzeugung der Eingabefelder

   oDlg:setModalState( XBP_DISP_APPMODAL )
   oDlg:show()
   SetAppFocus( oBrowse:BrowseFeld[1] )

   nEvent := xbeP_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
//      IF nEvent == xbeM_LbDblClick .AND. SetAppFocus():isDerivedFrom( "XbpBrowse" )
//      IF nEvent == xbeM_LbDblClick .AND. oXbp:isDerivedFrom( "XbpColumn" )
      IF nEvent == xbeBRW_ItemSelected
            PostAppEvent( xbeP_Close)
      ENDIF
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_RETURN .or. mp1 == xbeK_F10
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_ESC
            lFlucht := .T.
            PostAppEvent( xbeP_Close)
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
   18->(DbResetNotifications())
   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()    ///
   18->(DbClearFilter())
   Select &nOldArea
   (nOldArea)->(DbResetNotifications())
   IF lFlucht = .T.
      (nOldArea)->(DbGoto(nRec))
   ENDIF
   (nOldArea)->(DbSkip(0))
   SET ORDER TO 1
   SetAppFocus( oFocus )
RETURN .T.

FUNCTION KassTextDruck( oDlg1 )
   LOCAL nZei := 6
   SET DEVICE TO PRINTW
   18->(DbGotop())
   @ 2,8 SAY "Liste der Standardtexte fr die Kasse:"
   @ 4,8 SAY "Tx-Nr.  Text                                  Einn.  Ausg."
   DO WHILE !Eof()
      @ nZei,6 SAY 18->txnr
      @ nZei,10 SAY 18->tx
      @ nZei,50 SAY 18->&e_n
      @ nZei,60 SAY 18->&a_g
      SKIP
      nZei := IIf( nZei>60, 6, ++nZei )
   ENDDO
   EJECT
   SET DEVICE TO SCREEN
   18->(DbGotop())
   18->(DbSkip(0))
RETURN .T.

CLASS KassTextFF FROM DialogFF
   EXPORTED:
   VAR VArea
   METHOD INIT
   METHOD CREATE
   METHOD notify
ENDCLASS

METHOD KassTextFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::DialogFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::Fancy := cSerieBM
   ::VArea := nA
   ::BEArea := {}
   AAdd( ::BEArea, oParent )
   ::BENr := Len( ::BEArea )
RETURN self

METHOD KassTextFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::DialogFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   (nA)->(DbRegisterClient(self))     // reicht es, wenn das Fenster als Ganzes registriert ist??
RETURN self

METHOD KassTextFF:notify( nEvent, mp1, mp2 )
   LOCAL nRec, oFocus, i
      IF nEvent == xbeDBO_Notify             // Notify-Ereignis
         IF mp1 == DBO_MOVE_DONE             // Skip ist beendet
            IF !SetAppFocus():isDerivedFrom( "XbpBrowse" ) .AND. Len(::BrowseFeld) > 0
               (::VArea)->(DbSuspendNotifications())
               nRec := (::VArea)->(RecNo())
               FOR i := 1 TO Len(::BrowseFeld)
                  ::BrowseFeld[i]:refreshAll()
               NEXT
               (::VArea)->(DbGoto( nRec ))
               (::VArea)->(DbResetNotifications())
            ENDIF
         ENDIF
      ENDIF
RETURN self
