**BRegieAH.prg   -  Regie-Zentrum
//                  Verwaltung der Anlieferer-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"

//xbeP_User = 134217728
   #define  xbeU_RefreshHist  xbeP_User + 1 
   #define  xbeU_RefreshSuch xbeP_User + 2 
   #define  xbeU_RefreshAnlief xbeP_User + 3
   #define  xbeU_RefreshScan xbeP_User + 4
   #define  xbeU_ShowHistDaten xbeP_User + 5
   #define  xbeU_ShowScan xbeP_User + 6
   #define  xbeU_RefreshPLZ xbeP_User + 7

   #define  xbeU_RefreshApp xbeP_User + 31
   #define  xbeU_ShowAnlief xbeP_User + 32
   #define  xbeU_RefreshRechng xbeP_User + 33

/* siehe:   #define xbeP_User                      134217728 */

//------------------------------------------
/* 24.06.2008 17:47 neue Thread-Klasse  fr die Historientabelle: */
      CLASS HistThrd FROM Thread
         EXPORTED:
         VAR producerID
         VAR terminated
         
         INLINE METHOD init()
           ::thread:init()
           ::producerID := ThreadID()
           ::terminated := .F.
         RETURN
         
         INLINE METHOD terminate()
         RETURN ::terminated := .T.
         
         EXPORTED:
         INLINE METHOD execute(a,b,c,d,e,f)
            AnliefHistorie(a,b,c,d,e,f)
         RETURN self
         
         INLINE METHOD atStart()
         RETURN self
         
         INLINE METHOD atEnd()
//            Tone(750,9)
            DbCloseAll()
         RETURN .T.
      ENDCLASS
//------------------------------------------


/*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 AnliefHistorie( oDlg1, cAnlNr, nRec, oDlg2, nAnf, nEnd )    //+02.08.2008 22:10 oDlg2 = DatenArea oben
   LOCAL oDlg, nEvent, mp1, mp2, oXbp, oBrowse
   LOCAL oCtrl, oFocus := SetAppFocus(), aEditControls := {}, lFlucht
   LOCAL oHelp, oVideo    //*11.07.2008 14:44
   LOCAL aPos, ASize, nB := nBz  //+03.08.2008 17:49
   LOCAL nRecH       //+26.03.2009 10:02 HilfsVariable fr refreshall()
//   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, oAHDA, oEdit, nFontR := cBFont
   PRIVATE DUM0, DUM1, DUM2, DUM3, DUM4, DUM5:=0, DUM6:=0, DUM7:=0, DUM8, DUM9, cStadt //30.04.2007 17:56
   DEFAULT nAnf TO 0, nEnd TO 299         //+03.08.2008 14:20
/* 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()

   ErrorBlock( {|e| FehlerBehandlung(e) } )     // e = Error-Objekt

   /*29.06.2008 10:40 von :atstart() nach hierher verschoben: (Anlaufphase von oScrap abwarten!) */
      DbSelectArea(2)
      DbUseArea( , "FOXCDX", "Historie", , .T. )
      OrdListAdd( "Historie" )
      OrdSetFocus( "an" )           /* kontrollierender Index */
      DbSetScope( SCOPE_BOTH, cAnlNr )
/**/

   Sleep(10)               //+31.07.2009 17:14

//+++03.06.2009 13:35   oHelp := MagicHelp():New()    //+04.12.2008 10:28 reaktiviert wg. tooltip.original

/**08.07.2008 10:12 msste berflssig sein, weil oDlg bereits im aufrufenden Thread ist **/
      /*14.04.2008 19:25 nH, nV ver„ndert wegen Resize */
            aPos := {oDlg1:currentpos()[1],oDlg1:currentpos()[2]} //14.04.2008 14:28 unten wie Hauptmaske
            ASize := {oDlg1:currentsize()[1],oDlg1:currentsize()[2] - ;
                        IIf( oDlg1:isderivedfrom("XbpTabPage"), oDlg1:tabheight, 0 ) }  //08.07.2008 18:19
      /**/
/**/
   oDlg := AKDialog():new( oDlg1, oDlg1:setparent() )
   oDlg:tasklist := .T.
   oDlg:titlebar := .F.
   oDlg:sysmenu  := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, aPos, ASize )
//   oDlg:tofront()
//   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( XBPSYSCLR_TRANSPARENT )
   oCB := oDlg:drawingArea // fr alle F„lle
   oAHDA := oDlg:drawingArea
   oAHDA:cargo := oDlg
   aThrdFenster[4] := oDlg //+01.06.2009 09:25 4 statt 3

   nBz := 23*nV  //+31.07.2008 13:54
// jetzt folgt die Erzeugung der Eingabefelder
   oHist := HistorieFF():new( oAHDA,oAHDA:cargo, {}, {},,, nBz, "s_hist" , nAnf, nEnd, 2 )
/* jetzt ist oHist:BEArea[1] == oAHDA , also ist oHist:BEArea[1]:cargo == oDlg !! */
   oEdit := oHist //* brauchen wir, weil oEdit in einigen Routinen steht... */
   oHist:CREATE( oAHDA,oAHDA:cargo, {}, {},,, nBz, "s_hist" , nAnf, nEnd, 2 )
   AEval( oHist:editControls, {|x| oDlg:addEditControl( x ) } )
// bis hierhin geht die Erzeugung der Eingabefelder
   nBz := nB
//   oDlg:setModalState( XBP_DISP_APPMODAL )

   oCtrl := XbpGetController():new( oDlg )
   oCtrl:create()
   oCtrl:READ( 1, .F. )
   * Shortcuts initialisieren
   oDlg:InitShortCuts( oDlg )
//+++03.06.2009 13:35   oHelp:start()    //+04.12.2008 10:28 reaktiviert wg. tooltip.original

//   oDlg:lockUpdate(.F.)
   oDlg:invalidateRect()

   ZumAnfang(2)      //*13.07.2008 10:25
   oHist:cSuche := 2->anummer
   IF Len(oHist:BrowseFeld) > 0
      nRecH := RecNo()      //+26.03.2009 10:01
      oHist:BrowseFeld[1]:refreshAll()
      DbGoto(nRecH)         //+26.03.2009 10:01
   ENDIF
 
   nEvent := xbe_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF ThreadObject():terminated == .T.    // mal sehen, ob das klappt...
         IF ThreadObject():atEnd()
            ThreadObject():QUIT()
         ENDIF
      ENDIF
      IF nEvent == xbeU_RefreshHist
         DbClearScope( SCOPE_BOTH )
         DbSetScope( SCOPE_BOTH, mp1 )
         ZumAnfang(2)
         IF Len(oHist:BrowseFeld) > 0
            nRecH := RecNo()     //+26.03.2009 10:03
            oHist:BrowseFeld[1]:refreshAll()
            DbGoto(nRecH)        //+26.03.2009 10:03
         ENDIF
         oHist:XbpObjektSet(,"csuche",oHist:csuche := 2->anummer)  //+02.03.2010 18:45
         oDlg:invalidateRect()
         LOOP
      ENDIF
       //+26.09.2009 11:08 macht das Histfenster zwangsweise modal:
//////      IF !IstTeilVonOwner(oDlg1:setparent():setparent(),oXbp)
//////         nEvent := xbeP_None
//////         LOOP
//////      ENDIF
      IF nEvent == xbeM_LbDblClick
//         oHist:ShowZeile(oDlg2)       //*13.07.2008 21:38
//         PostAppEvent( xbeU_RefreshAnlief,, 2->anummer, aThrdFenster[2])
         PostAppEvent( xbeU_ShowHistDaten,3, 2->anummer, aThrdFenster[2])  //[2], weil dort die TabPage ist01.06.2009 09:25
         AnliefHistorie2( oDlg2, cAnlNr, nRec, oDlg1, 300, 599 )
         IF Len(oHist:BrowseFeld) > 0
            nRecH := RecNo()
            oHist:BrowseFeld[1]:refreshAll()
            DbGoto(nRecH)
         ENDIF
         LOOP
      ENDIF
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_RETURN
            IF oXbp:IsderivedFrom("XbpSle") .AND. "SUCH"$Upper(oXbp:cargo)
               PostAppEvent( xbeP_Activate,,, oHist:XbpObjekt(oHist:DruckKnopf,"HistSuch"))
            ELSE
               PostAppEvent( xbeP_Activate,,, oXbp)
            ENDIF
//         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_CTRL_F2      //+27.06.2009 18:45 ScreenDump
               Win_Clip_File(AppDeskTop(),cDatver+"CLIPS\S_"+Left(Time(),2)+SubStr(Time(),4,2)+Right(Time(),2) )
               LOOP
         CASE mp1 == xbeK_F1
            ModalDialog( (cDatver+"f1_AS.dbf"), "Bedienungshinweise", oAHDA, 680*nH, 460*nV )
//         CASE mp1 == xbeK_F10
//            lEinfg := .F.
//            PostAppEvent( xbeP_Activate,,, oHist:DruckKnopf[oHist:XbpNummer(oHist:DruckKnopf,"ENDE")] )
////            PostAppEvent( xbeP_Close,,,oDlg)
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

   oDlg:setModalState( XBP_DISP_MODELESS )
   DbDeRegisterClient()                    // 20.5.2004, damit kein Painttip mehr durch :notify()
//   oHist:destroy()
   oDlg:destroy()
//+++03.06.2009 13:35   oHelp:terminate()    //+04.12.2008 10:28 reaktiviert wg. tooltip.original
   SetAppFocus( oFocus )

   IF lFlucht == .F.               // ESC-Taste: lFlucht = .T.
      USE
   ELSE
      USE                 // schlieáen der TEMP-Datei
   ENDIF
   THREADOBJECT():setinterval(NIL)    //+13.01.2011 16:39
   PostAppEvent( xbeU_RefreshAnlief,, cAnlnr, aThrdFenster[2]) //+06.06.2009 16:53

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 HistorieFF FROM DialogFF
   EXPORTED:
   VAR VArea
   VAR cSuche        //*10.07.2008 16:47 auf Vorrat, um einmal selbst„ndig in der Historie zu bl„ttern...

   METHOD INIT
   METHOD CREATE
   METHOD notify
   METHOD AHSuch
   METHOD ShowZeile  //*13.07.2008 21:35
ENDCLASS

METHOD HistorieFF: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 := ""  //* 12.07.2008 12:50 cSerieBM
   ::VArea := nA
   ::cSuche := ""
   ::BEArea := {}
   AAdd( ::BEArea, oParent )
   ::BENr := Len( ::BEArea )
RETURN self

METHOD HistorieFF: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 HistorieFF: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 HistorieFF:AHSuch( )
   LOCAL nRec := RecNo(), cAnlNr := (::VArea)->anummer
   DbClearScope()
   DbGotop()
   DbSeek( ::cSuche, .F., "an" )
   IF !Found()
      DbSetScope( SCOPE_BOTH, cAnlNr )
      DbGoto(nRec)
   ELSE
      DbSetScope( SCOPE_BOTH, ::cSuche )
      DbGotop()
   ENDIF   
   FOR i := 1 TO Len(::BrowseFeld)
      nRec := RecNo()
      ::BrowseFeld[i]:refreshAll()
      DbGoto(nRec)
   NEXT
RETURN self

//* 13.07.2008 13:42 zeigt eine Zeile der Historientabelle oben detailliert im Editor (ohne Editm”glichkeit)
METHOD HistorieFF:ShowZeile( oDlg1, nAnf, nEnd )
   LOCAL oDlg, nEvent, mp1, mp2, nRecH    //+26.03.2009 10:04
   LOCAL oFocus := SetAppFocus(), oFoc
   LOCAL lFlucht := .F.
   LOCAL nBEL := ::BENr, nLBL := ::LBNr, nTZL := ::TZNr, nSZL := ::SZNr  //23.10.2007 15:16 zwischenspeichern L„nge von ::singleZeile/::textZeile
   LOCAL nECL := Len(::editControls), nKCL := Len(::keyControls)    //24.10.2007 11:02
   PRIVATE oCB    //23.10.2007 13:35 , oEdit   
   DEFAULT nAnf TO 300, nEnd TO 599
   
//      aPos := { 0, ATail(aThrdFenster[2]:drawingArea:ChildList()):currentsize()[2]+30 }
//      ASize := { aThrdFenster[2]:drawingArea:currentsize()[1], aThrdFenster[2]:drawingArea:currentsize()[2] - ATail(aThrdFenster[2]:drawingArea:ChildList()):currentsize()[2]+50 }
      aPos := { oDlg1:cargo:currentpos()[1], oDlg1:cargo:currentpos()[2] }
      ASize := { oDlg1:currentsize()[1], oDlg1:currentsize()[2] }
      
      oDlg := AKDialog():new( AppDeskTop(), oDlg1:cargo )
      oDlg:tasklist := .T.
      oDlg:sysmenu  := .F.
      oDlg:titlebar := .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_DARKCYAN )
      oCB := oDlg:drawingArea
      oCB:cargo := oDlg
   
   // jetzt folgt die Erzeugung der Eingabefelder
//////      oEdit := TrauDrFF():new( oCB,oDlg, , ,,, nBz, cProg, nAnf, nEnd, nA )
//////      oEdit:Fancy := ""
//////      oEdit:VArea := nA
//////      oEdit:BEArea := {}
      AAdd( ::BEArea, oCB )
      ::BENr := Len( ::BEArea )
      ::CREATE( oCB,oDlg, , ,,, nBz, "s_hist", nAnf, nEnd, 2 )
   // bis hierhin geht die Erzeugung der Eingabefelder
      AEval( ::editControls, {|x| oDlg:addEditControl( x ) } ) // 28.02.2006
   
      oDlg:setModalState( XBP_DISP_APPMODAL )

         oCtrl := XbpGetController():new( oDlg )
         oCtrl:create()
         oCtrl:READ( 6, .F. )
   
      * Shortcuts initialisieren
      oDlg:InitShortCuts( oDlg )
      oDlg:lockUpdate(.F.)
      oDlg:invalidateRect()
   
      nEvent := xbeP_None
      DO WHILE nEvent <> xbeP_Close
         nEvent := AppEvent( @mp1, @mp2, @oXbp )
         IF nEvent == xbeP_Keyboard
            DO CASE
//               CASE mp1 == xbeK_F10
//                  PostAppEvent( xbeP_Close)
            CASE mp1 == xbeK_CTRL_F2      //+27.06.2009 18:45 ScreenDump
               Win_Clip_File(AppDeskTop(),cDatver+"CLIPS\S_"+Left(Time(),2)+SubStr(Time(),4,2)+Right(Time(),2) )
               LOOP
               CASE mp1 == xbeK_ESC
                  lFlucht := .T.
                  PostAppEvent( xbeP_Close)
            ENDCASE
         ENDIF
         oXbp:handleEvent( nEvent, mp1, mp2 )
      ENDDO

      oDlg:setModalState( XBP_DISP_MODELESS )
      oDlg:destroy()    ///
      ASize( ::BEArea, nBEL)         //23.10.2007 13:35
      ASize( ::Listbox, nLBL)       //24.10.2007 09:39
      ASize( ::SingleZeile, nSZL)    //23.10.2007 13:35
      ASize( ::TextZeile, nTZL)    //23.10.2007 13:35
      ASize( ::editControls, nECL)  //24.10.2007 11:02
      ASize( ::keyControls, nKCL)  //24.10.2007 11:02
      ::BENr := nBEL                //23.10.2007 15:30
      ::LBNr := nLBL                //24.10.2007 09:39
      ::SZNr := nSZL                //23.10.2007 15:30
      ::TZNr := nTZL                //23.10.2007 15:31
      DbSkip(0)
      nRecH := RecNo()      //+26.03.2009 10:00
      IIf(Len(::BrowseFeld)>0,::BrowseFeld[1]:refreshAll(),)   //13.12.2007 11:55
      DbGoto(nRecH)         //+26.03.2009 10:01
      SetAppFocus( oFocus )

RETURN self
