**BRegieAF.prg   -  Regie-Zentrum
//                  Verwaltung der Historie

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Appedit.ch"
#include "Appbrow.ch"
#include "Font.ch"
#include "Dmlb.ch"
#include "Common.ch"

/*25.06.2008 09:10 wird durch ::execute() im Historie-Thread ausgefhrt 
                     und von oSignal aus Thread1 heraus gesteuert
                     --> aPos und aSize werden unten ohnehin neu gesetzt!  */
FUNCTION AnliefFolge( oDlg1, aPos, ASize, oSignal )
   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
//   PRIVATE nBezZeil := 1
   PRIVATE bezZ1 := "bez" , bezZ2 := "bez2"     // Artikel in Art->
   PRIVATE bZ1 := "b1" , bZ2 := "b2"     // Artikel in Serie->
   PRIVATE oCB, oASDA, oEdit, cArtLei := Trim(" "), cArtBez := Trim(" ")
/* 25.06.2008 09:12 hier wird erst einmal gewartet, bis Thread1 das Signal ausl”st,
                     d.h. bis die Eingabemaske dort komplett aufgebaut ist: */
   oSignal:WAIT()
/**/
/* wird ohnehin direkt dahinter neu gesetzt:
   aPos := IIf(Empty(aPos),{10,30*nV},aPos)
   ASize:= IIf(Empty(ASize),{770*nH,500*nV},ASize)
*/
/*14.04.2008 19:25 nH, nV ver„ndert wegen Resize */
      aPos := {oDlg1:cargo:currentpos()[1]+4,oDlg1:cargo:currentpos()[2]} //14.04.2008 14:28 unten wie Hauptmaske
      ASize := {oDlg1:currentsize()[1],oDlg1:cargo:currentsize()[2]}  //14.04.2008 14:22 H”he wie Hauptmaske
/**/

//////   cSertemp := "se8"    // +LTrim(Str(Int(Seconds()/10)))
//////   cXsertemp := "se8X"  // +LTrim(Str(Int(Seconds()/10)))
//////
//////   SELECT 14
//////   USE serie index xserie
//////   COPY TO (cSertemp)
//////   USE (cSertemp) EXCLUSIVE
//////   INDEX ON Str(zeile,3) TO (cXsertemp)
//////   INDEX ON art TO (cXsertemp+"2")
//////   SET INDEX TO (cXsertemp),(cXsertemp+"2")
//////   GO TOP

//////   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
//////   oDlg:tasklist := .T.
//////   oDlg:title := "Verlauf der Historie fr diesen Anlieferer"
//////   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
//////   oASDA := oDlg:drawingArea
//////   oASDA:cargo := oDlg
/* 24.06.2008 19:33 neu aus oBEDA -> oDlg1: */
   oASDA := oDlg1
   oDlg := oASDA:cargo
// jetzt folgt die Erzeugung der Eingabefelder
   oEdit := SerieFF():new( oASDA,oASDA:cargo, {330*nH,0}, {440*nH,475*nV},,, nBz, "s_hist" , -100, 299, 2 )
   oEdit:CREATE( oASDA,oASDA:cargo, {330*nH,0}, {440*nH,475*nV},,, nBz, "s_hist" , -100, 299, 2 )
   // sorgt fr einen eindeutigen Index: (field->Zeile hat die L„nge 3)
//////   oEdit:SingleZeile[1]:postblock := {|o| oDlg:isIndexUnique( 1, PadL(Trim( ;
//////                  IIf( Val(o:editBuffer())=0, "999", o:editBuffer() )),3) ) }   //12.02.2007 10:57
//////   oEdit:SingleZeile[1]:validate := oEdit:SingleZeile[1]:postblock
   AEval( oEdit:editControls, {|x| oDlg:addEditControl( x ) } )
//   AEval( oEdit:appendControls, {|x| oDlg:addAppendControl( x ) } )
// bis hierhin geht die Erzeugung der Eingabefelder

/* 24.06.2008 19:38 geREMt:
//   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()
*/
/* 25.06.2008 18:24 hier ist das Signal fr den Hauptthread, dass das Historie-Bild aufgebaut ist: */
   oSignal:signal()
/**/
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_RETURN
            PostAppEvent( xbeP_Activate,,, oXbp)
         CASE mp1 == xbeK_ESC
               IF ValType(oVideo) == "O"
                  oVideo:stop()
                  oVideo:cargo:destroy()
                  oVideo := NIL
                  mp1 := 0
                  LOOP
               ENDIF
            nFlucht := ConfirmBox( oCB, IIf(SET(43)==0,ConvToAnsiCP("Žnderungen speichern?"), ;
                        "Žnderungen speichern?"), ;
                        "SERIE fr RECHNUNG beenden.", ;
                        XBPMB_YESNOCANCEL, ;
                        XBPMB_QUESTION )
            IF nFlucht == XBPMB_RET_YES
               lFlucht := .F.
               PostAppEvent( xbeP_Close)
            ELSEIF nFlucht == XBPMB_RET_NO
               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 := .F.
            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 )
   oEdit:destroy()
   oDlg:destroy()
   SetAppFocus( oFocus )

   SELECT 14
   IF lFlucht == .F.               // ESC-Taste: lFlucht = .T.
      GO TOP
   //   DELETE ALL FOR Empty( 14->zeile )
      PACK
      USE
      SELECT 14
      USE serie EXCLUSIVE
      SET INDEX TO xserie
      ZAP
      APPEND FROM (cSertemp)
      USE
   ELSE
      USE                 // schlieáen der TEMP-Datei
   ENDIF
   FErase( cDatver+cSertemp+".dbf" )
   FErase( cDatver+cXSertemp+".ntx" )
   Select &nOldArea
RETURN .T.


FUNCTION SerieDruck( oDlg1 )
   LOCAL nZei := 6
   SET DEVICE TO PRINTW
   14->(DbGotop())
   @ 2,8 SAY "Liste der Serien-Leistungen:"
   @ 4,8 SAY "Nr  Art/Lstg Leistung                                  VK-Preis/"+w_g
   DO WHILE !Eof()
      @ nZei,6 SAY 14->Zeile
      @ nZei,10 SAY 14->art
      @ nZei,18 SAY 14->&bZ1
      IF nBezZeil = 2 .AND. 14->(IsFieldVar("&bZ2"))
         @ ++nZei,18 SAY 14->&bZ2
      ENDIF
      @ nZei,65 SAY 14->(&v_p)
      SKIP
      nZei := IIf( nZei>60, 6, ++nZei )
   ENDDO
//   EJECT
   SET DEVICE TO SCREEN
   14->(DbGotop())
   14->(DbSkip(0))
RETURN .T.

CLASS SerieFF FROM DialogFF
   EXPORTED:
   VAR VArea
   METHOD INIT
   METHOD CREATE
   METHOD notify
   METHOD AFSuch
ENDCLASS

METHOD SerieFF: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 SerieFF: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 SerieFF: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

METHOD SerieFF:AFSuch( oDlg1, cSuchFeld, oXbp1, aPos, ASize )
   LOCAL oDlg, nEvent, mp1, mp2, oBrowse, cArtLei := Trim(" "), nRec
   LOCAL nOldArea := Select(), oFocus := SetAppFocus()
   LOCAL cVorigerWert := oXbp1:editbuffer()  // 14.03.2007 14:12
   LOCAL lFlucht := .F., nRet
// Suche entweder in der Seriendatei (=14) oder in der Artikeldatei (=6):
// durch Eingabe in den Suchfeldern links (cArtBez,cArtlei) wird in der Seriendatei gesucht
// durch Klick auf die Suchkn”pfe (A-Such,B-Such) wird in der Artikeldatei gesucht
// Neu-Eingabe in der Art-Nr. sollte auch in der Artikeldatei suchen...
   LOCAL nA := IIf( Upper(oXbp1:cargo)$"ART B1", 6, 14 )     // 11.02.2007 15:28: Umbau auf nA=6/14
   LOCAL nAnf := IIf( nA=14, 310, 300 ), nEnd := IIf( nA=14, 319, 309 ) //11.02.2007 15:28 ~
   PRIVATE oCB
   DEFAULT aPos TO {10,30*nV} , ASize TO {330*nH,265*nV}

   SELECT (nA)

   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := IIf( nA=14, "Serien-Eintrag suchen", "Artikel suchen" )
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, aPos, ASize )

   oDlg:drawingArea:setColorBG( GRA_CLR_DARKCYAN )
   oCB := oDlg:drawingArea
   oCB:cargo := oDlg

   IF Upper(cSuchFeld) = "B1"
      cSuchFeld := oXbp1:getData()
      cSuchFeld := IIf( !Empty(cSuchFeld),Upper(Trim(cSuchFeld))," " )
      (nA)->(DbSetFilter( {|| cSuchFeld$Upper(IIf(nA=14,(nA)->b1,(nA)->bez)) } ))
      IIf( !(nA)->(Bof()), (nA)->(DbGotop()), )
   ELSEIF Upper(cSuchFeld) = "ART"
      cArtLei := IIf(!Empty(Trim(oXbp1:getData())),Trim( oXbp1:getData() ),cArtLei)
      IF nA=14    // d.h. wenn ArtikelNr in der Seriendatei gesucht wird 
         OrdSetFocus(2)
         (nA)->(DbSeek( cArtLei, .T. ))
      ELSE     // d.h. wenn ArtikelNr in der Artikeldatei gesucht wird
         (nA)->(DbSeek( cArtLei, .T. ))
      ENDIF
   ELSE
      oDlg:destroy()
      Select &nOldArea
      (nOldArea)->(DbSkip(0) )
      SetAppFocus( oFocus )
      RETURN .F.
   ENDIF
//////
//////// jetzt folgt die Erzeugung der Eingabefelder
//////   oBrowse := VersFF():new( oCB,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, "s_Serie",nAnf,nEnd, nA )
//////   oBrowse:CREATE( oCB,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, "s_serie",nAnf,nEnd, nA )
//////// 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 == 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
   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()    ///
   SELECT 14
         nRec := RecNo()
         OrdSetFocus(1)
         DbGoto(nRec)
   IF lFlucht = .F. .AND. nA!=14  // ESC-Taste: lFlucht = .T.
      IF 14->art <> "     " .AND. 14->art <>"LEER" .AND. 14->art <> "----"
         nRet := ConfirmBox( oDlg1, IIf(SET(43)==0,ConvToAnsiCP("ersetzen: <Ja> / abbrechen: <nein>"), ;
                        "ersetzen: <Ja> / abbrechen: <Nein>"), ;
                        "Serieneintrag ...", ;
                        XBPMB_YESNO, ;
                        XBPMB_WARNING, ;
                        XBPMB_DEFBUTTON1 )
         IF nRet ==  XBPMB_RET_YES
//         ELSEIF nRet ==  XBPMB_RET_NO
//            LOCATE FOR Empty(14->zeile)
//            IF Eof()
//               APPEND BLANK
//            ENDIF
         ELSE
            oXbp1:setData( cVorigerWert ) // 16.12.2004
            oXbp1:getData()               // 16.12.2004
            Select &nOldArea
            (nOldArea)->(DbSkip(0) )
            SetAppFocus( oFocus )
            RETURN .F.
         ENDIF
      ENDIF
      REPLACE 14->art WITH (nA)->art_lei
      REPLACE 14->b1 WITH (nA)->bez
      IF Upper(AppName())$"RAGUSEX.EXE RAGUSEY.EXE-HANDEL.EXE"
         REPLACE 14->vk_pr WITH (nA)->vk_preis1
      ELSE
         REPLACE 14->vk_preu WITH (nA)->vk_preiseu
      ENDIF
   ELSEIF lFlucht == .T.
            IF oXbp1:cargo = "art"
               IF 14->zeile < 1
                  oXbp1:setData(14->art := "")
                  oXbp1:getData()
               ELSE
                  oXbp1:setData(14->art := cVorigerwert )
                  oXbp1:getData()
               ENDIF
            ELSEIF oXbp1:cargo = "b1"
               IF 14->zeile < 1
                  oXbp1:setData(14->b1 := "")
                  oXbp1:getData()
               ELSE
                  oXbp1:setData(14->b1 := cVorigerwert )
                  oXbp1:getData()
               ENDIF
            ENDIF
   ENDIF
   (nA)->(DbClearFilter())
   Select &nOldArea
   (nOldArea)->(DbSkip(0) )
   SetAppFocus( oFocus )
RETURN self
