**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

/* 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
////////------------------------------------------
//////

/*04.08.2008 12:38 wird von Historie-Thread aufgerufen, ist plaziert auf einem TAB von Thread1
                     und steuert diesen TAB in Thread1 beim Beenden.
                     nAnf und nEnd mssen nicht gesetzt werden, wenn DEFAULT.
                     --> aPos und aSize werden unten gesetzt!  
                     sp„tere Planung: diese FUNCTION als METHOD in BRegieAHo*/
FUNCTION AnliefHistorie2( 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 lEditierbar := .F.   // wenn .T., dann kann man die Hist_Notiz „ndern
//   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 300, nEnd TO 599         //+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()

   /*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 )
/**/

//   oHelp := MagicHelp():New()

/**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[3] := oDlg

   nBz := 21*nV  //+31.07.2008 13:54
// jetzt folgt die Erzeugung der Eingabefelder
   oEdit := HistorieFF():new( oAHDA,oAHDA:cargo, {}, {},,, nBz, "s_hist2" , 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... */
   oEdit:CREATE( oAHDA,oAHDA:cargo, {}, {},,, nBz, "s_hist2" , nAnf, nEnd, 2 )
   AEval( oEdit:editControls, {|x| oDlg:addEditControl( x ) } )
   AEval( oEdit:editControls, {|a,i| IIf(a:cargo!="hist_notiz",a:editable := .F.,) } )
//   oHist:XbpObjekt(oHist:multiZeile,"hist_notiz"):editable := .T.
// 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 )
//   oHelp:start()

//   oDlg:lockUpdate(.F.)
   oDlg:invalidateRect()

//   ZumAnfang(2)      //*13.07.2008 10:25
//   oEdit:cSuche := 2->anummer
   IF Len(oEdit:BrowseFeld) > 0
      oEdit:BrowseFeld[1]:refreshAll()
   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
//////            oHist:BrowseFeld[1]:refreshAll()
//////         ENDIF
//////         oDlg:invalidateRect()
//////      ENDIF
//////      IF nEvent == xbeM_LbDblClick
////////         oHist:ShowZeile(oDlg2)       //*13.07.2008 21:38
//////         AnliefHistorie( oDlg2, cAnlNr, nRec, oDlg2 )
////////         PostAppEvent( xbeU_RefreshAnlief,, 2->anummer, aThrdFenster[1])
//////      ENDIF
      IF nEvent == xbeP_Keyboard
// Buchstaben-Tasten wirken nur, wenn der Auftrag als editierbar markiert ist:
         IF (mp1=xbeK_BS .OR. mp1=xbeK_DEL .OR. (mp1>31 .AND. mp1<128)) ;
                                 .AND. lEditierbar == .F.   //+03.08.2008 19:07
            IF AlertBox( , "<NEIN> = Abbrechen;"        + ;
                       ";", ;
                       { "JA" , "_NEIN" }  , ;
                       XBPSTATIC_SYSICON_ICONWARNING    , ;
                       "Notizen eingeben/„ndern?" ) = 1     //+13.11.2009 19:04
//            IF ConfirmBox( oAHDA, "Abbrechen mit <NEIN>", ;
//                        IIf(SET(43)==0,ConvToAnsiCP("Notizen eingeben/„ndern?"), ;
//                        "Notizen eingeben/„ndern?"), ;
//                        XBPMB_YESNO, ;
//                        XBPMB_WARNING, ;
//                        XBPMB_DEFBUTTON2 ) ;
//                        =  XBPMB_RET_YES
               mp1 := 0          //02.07.2006 11:47
               lEditierbar := .T.
               SetAppFocus(oXbp)     // klappt nicht 04.08.2008 12:50
               LOOP
            ELSE
               LOOP
            ENDIF
         ENDIF
         IF lEditierbar == .T. .AND. oXbp:editable == .F.   //+04.08.2008 13:07
            LOOP
         ENDIF
      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_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()
//   oHelp:terminate()
   PostAppEvent( xbeU_ShowHistDaten,1, 2->anummer, aThrdFenster[1])  //[1], weil dort die TabPage ist
   SetAppFocus( oFocus )

   IF lFlucht == .F.               // ESC-Taste: lFlucht = .T.
//      USE
   ELSE
//      USE                 // schlieáen der TEMP-Datei
   ENDIF
   PostAppEvent( xbeU_ShowHistDaten,1,, 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)
//////      ::BrowseFeld[i]:refreshAll()
//////   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
//////   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[1]:drawingArea:ChildList()):currentsize()[2]+30 }
////////      ASize := { aThrdFenster[1]:drawingArea:currentsize()[1], aThrdFenster[1]:drawingArea:currentsize()[2] - ATail(aThrdFenster[1]: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_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)
//////      IIf(Len(::BrowseFeld)>0,::BrowseFeld[1]:refreshAll(),)   //13.12.2007 11:55
//////      SetAppFocus( oFocus )
//////
//////RETURN self
