**BRegieAB.prg   -  Regie-Zentrum: alternativer Thread (soll zum Standard werden)
//                  scannt, sowie zeigt und druckt gescannte Bilder (Ausweise, Dokumente, etc)

#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  xbeDS_DirChanged           xbeP_User + 100
#define  xbeFS_FileMarked           xbeP_User + 101
#define  xbeFS_FileSelected         xbeP_User + 102

/* siehe:   #define xbeP_User                      134217728 */

STATIC S_cStartDir
STATIC S_aFileMark
STATIC aPos
STATIC ASize

//------------------------------------------
/* 24.06.2008 17:47 neue Thread-Klasse  fr ein alternatives Fenster: */
      CLASS ScanThrd FROM Thread
         EXPORTED:
         VAR producerID
         VAR terminated
         VAR nRec
//         VAR cBildDateiName
         
         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,g,h)
            Scannen(a,b,c,d,e,f,g,h)
         RETURN self
         
         INLINE METHOD atStart()
            nRec := RecNo()
         RETURN self
         
         INLINE METHOD atEnd()
            nRec := RecNo()
            DbCloseAll()
            CurDir(cDatver)           //+04.11.2008 19:55
            aThrdFenster[2]:destroy()  //+06.10.2008 12:19
         RETURN self
      ENDCLASS
//------------------------------------------

/*25.06.2008 09:10 wird durch ::execute() im Scan-Thread ausgefhrt 
                     und von F2 aus Thread1 heraus gestartet
                     --> aPos und aSize werden unten ohnehin neu gesetzt!  */
FUNCTION Scannen( oDlg1, a2Pos, a2Size, nRec, cDateiName, cS_s, nAnf, nEnd )  //+02.11.2008 11:33
   LOCAL oDlg, nEvent, mp1, mp2, oXbp, oBrowse
   LOCAL oCtrl, oFocus := SetAppFocus(), aEditControls := {}, lFlucht
   LOCAL oHelp, oVideo    //*11.07.2008 14:44
//   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 } }
   DEFAULT a2Pos TO {300*nH,300*nV}, a2Size TO {300*nH,300*nV}
   DEFAULT cS_s TO "S_SCAN", nAnf TO 0, nEnd TO 199      //+02.11.2008 11:33 
   aBC := IIf(ValType(cDateiName)=="A",cDateiName[1],aBC)   // fr wechselnde Farben des Fensters
   cDateiName := IIf(ValType(cDateiName)=="A",cDateiName[2],cDateiName)
   PRIVATE oCB, oABDA, oEdit, cVariable, cS := " ", nFontR := cBFont //*09.07.2008 15:10
   PRIVATE cBriefkopf := "", nAnz := 1, cAnz := "1"   // fr die Vorschau 
   PRIVATE cBildDateiName := cDateiName //+05.08.2008 09:36
   PRIVATE cZeimax := "70", cZweiseitjn := "1", nSeitNr := 1
   PRIVATE aSeitZ:={}      //+25.11.2008 14:48
   PRIVATE oFocSle
   PRIVATE nH := nHur, nV := nVur      //+06.10.2008 15:33
   DEFAULT cBFont TO "10.Arial"  //+29.09.2008 14:17
//+ist in Eurov: PUBLIC P_aFileMark, P_aFileExt      //+31.07.2008 16:08, damit markierte Files markiert bleiben
   
   ErrorBlock( {|e| FehlerBehandlung(e) } )     // e = Error-Objekt

      //+19.10.2008 13:50   Position am rechten Rand oben: */
            aPos := {AppDeskTop():currentsize()[1]-a2Size[1]-10*nH, ;
                        AppDeskTop():currentsize()[2]-a2Size[2]-10*nV} //+19.10.2008 13:48
            ASize := AClone(a2Size)    //+19.10.2008 13:49
      /**/

DO WHILE cS == " "
   //+28.09.2008 11:21 damit auf den aktuellen Auftrag positioniert/zugegriffen werden kann:
      DbSelectArea(1)
      DbUseArea( , , "Best", , .T. )
      OrdListAdd( "xauftrnr" )
      cVariable := "auftrnr"
      DbGoto( nRec )

//   oHelp := MagicHelp():New()

//   oDlg := AKDialog():new( oDlg1, oDlg1:setparent() )
   oDlg := AKDialog():new( AppDeskTop(),  )
/**/
//////   oDlg:oHelp := MagicHelp():New()     //+06.10.2008 12:17
   oDlg:tasklist := .T.
//+ verhindert leider weitere Arbeiten in der Hauptmaske:
//   oDlg:alwaysontop := .T.    //+06.10.2008 10:25 undokumentiert, in Clickdate+Calculator gefunden
//++//
//   oDlg:titlebar := .F.
   oDlg:title := IIf(nAnf<300,"Scanner und Grafikbetrachter/drucker","Dokumenten-Manager")
//   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 )
   oDlg:drawingArea:setColorBG( GRA_CLR_YELLOW )
   oCB := oDlg:drawingArea // fr alle F„lle
   oABDA := oDlg:drawingArea
   oABDA:cargo := oDlg
   aThrdFenster[2] := oDlg

   nBz := 23*nV  //+31.07.2008 13:54
// jetzt folgt die Erzeugung der Eingabefelder
   oScan := AScanFF():new( oABDA,oABDA:cargo, {,}, {,},,, nBz, cS_s , nAnf, nEnd, 1)
  /* jetzt ist oScan:BEArea[1] == oABDA , also ist oScan:BEArea[1]:cargo == oDlg !! */
   oEdit := oScan  /* brauchen wir, weil oEdit in einigen Routinen steht... */
   oScan:CREATE( oABDA,oABDA:cargo, {,}, {,},,, nBz, cS_s , nAnf, nEnd, 1)
   AEval( oScan:editControls, {|x| oDlg:addEditControl( x ) } )
// bis hierhin geht die Erzeugung der Eingabefelder

   oCtrl := XbpGetController():new( oDlg )
   oCtrl:create()
   oCtrl:READ( 1, .F. )
   * Shortcuts initialisieren
   oDlg:InitShortCuts( oDlg )
//   oHelp:start()
//////   oDlg:oHelp:start()      //+06.10.2008 12:18

//   oDlg:lockUpdate(.F.)
   oDlg:invalidateRect()
   oFocSle := SetAppFocus()   //+28.09.2008 17:32 fr alle F„lle: PRIVATE in diesem Thread!
//+28.09.2008 11:23 beobachten ob dieser Abschnitt berhaupt gebraucht werden kann:
//+ dabei hat sich gezeigt, dass die Event-Loop der Vorschau im Thread 1 ist !!!! wieso??? :
   IF cBildDateiName == "_VORSCHAU_"      //+22.07.2008 23:12
      oScan:ABDrucken(oScan:BEArea[1],"A" ,, )
      cBildDateiName := StrX(1->auftrnr,6)
   ELSEIF cBildDateiName == "_DRUCKEN_"      //+22.07.2008 23:12
      oScan:ABDrucken(oScan:BEArea[1],"AB" ,, )
      cBildDateiName := StrX(1->auftrnr,6)
   ENDIF
//++//

   nEvent := xbe_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Close .AND. oXbp = oScan:oVorDlg
         oScan:oVorDlg:destroy()
         oScan:ABVorschau := NIL
         nEvent := xbe_None
         SetAppFocus(oFocSle)
         LOOP
      ENDIF
      IF ThreadObject():terminated == .T.    // mal sehen, ob das klappt...
         ThreadObject():atEnd()
         ThreadObject():QUIT()
      ENDIF
      IF nEvent == xbeU_RefreshScan
         IF ValType(mp1)=="N" .AND. mp1 > 0 .AND. mp1 <= LastRec() //.AND. ValType(mp2)=="C"   //!Empty( mp2 )
            cS := " "
            nRec := mp1
            DbGoto(nRec)                              //+23.07.2008 18:03
            IF ValType(mp2)=="C"
               cBildDateiName := oScan:cScan := mp2
            ELSEIF ValType(mp2)=="A"
               aBC := mp2[1]
               cBildDateiName := oScan:cScan := mp2[2]
            ELSE
               oDlg:invalidateRect()
               LOOP
            ENDIF
            PostAppEvent( 1048632 ,,, aThrdFenster[2] )
            LOOP
         ELSE
            oDlg:invalidateRect()
            LOOP
         ENDIF
      ENDIF
////////      IF nEvent == xbeM_LbDblClick
////////         PostAppEvent( xbeU_RefreshAnlief, RecNo(),, aThrdFenster[1])
////////      ENDIF
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_RETURN
            PostAppEvent( xbeP_Activate,,, oXbp)
         CASE mp1 == xbeK_ESC
            IF oXbp:setparent() = oScan:oVorDlg
               oScan:oVorDlg:destroy()
               oScan:ABVorschau := NIL
               SetAppFocus(oFocSle)
               LOOP
            ELSE
               PostAppEvent( xbeP_Close,,,aThrdFenster[2])
            ENDIF
//            cS := "X"            //+23.07.2008 17:40 damit es zu Ende geht
//               IF ValType(oVideo) == "O"
//                  oVideo:stop()
//                  oVideo:cargo:destroy()
//                  oVideo := NIL
//                  mp1 := 0
//                  LOOP
//               ENDIF
//            nFlucht := ConfirmBox( oASDA, IIf(SET(43)==0,ConvToAnsiCP("gefunden:<JA> / zurck:<NEIN>"), ;
//                        "gefunden:<JA> / zurck:<NEIN>"), ;
//                        "SUCHE 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_F12 ...war nur zum Testen...
//////            fileview()
         CASE mp1 == xbeK_CTRL_DEL .AND. ValType(oEdit:oView) == "O"     //+29.01.2009 14:52
            oFoc := SetAppFocus()
            IF ConfirmBox( oCB, IIf(SET(43)==0,ConvToAnsiCP("Soll die markiert Datei wirklich gel”scht werden?"), ;
                                 "Soll die markierte Datei wirklich gel”scht werden?"), ;
                                 IIf(SET(43)==0,ConvToAnsiCP("Datei l”schen!"), ;
                                 "Datei l”schen!"), ;
                                 XBPMB_YESNO, ;
                                 XBPMB_QUESTION, ;
                                 XBPMB_DEFBUTTON2 ) == XBPMB_RET_YES
               FErase( oEdit:oView:FILE )
               PostAppEvent( xbeDS_DirChanged, oEdit:oDirs:CurDir(),.T., oDlg )   
            ENDIF
            SetAppFocus(oFoc)
         CASE mp1 == xbeK_F1
            ModalDialog( (cDatver+"f1_AB.dbf"), "Bedienungshinweise", oABDA, 680*nH, 460*nV )
         CASE mp1 == xbeK_F10
            lEinfg := .F.
            PostAppEvent( xbeP_Activate,,, oScan:DruckKnopf[oScan:XbpNummer(oScan:DruckKnopf,"ENDE")] )
//            PostAppEvent( xbeP_Close,,,oDlg)
      ENDCASE
      ENDIF
//+21.07.2008 20:31 fr DirSelector+FileSelector:
      IF nEvent == xbeDS_DirChanged
         oScan:oFiles:setFilesTo( mp1 )
//+21.07.2008 20:32 fr Grafik-Vorschau:
      ELSEIF nEvent == xbeFS_FileMarked
         IF ValType(mp1) == "C"     //+11.01.2009 09:54
            IF !".HTM"$Upper(mp1)
               oScan:oView:load( mp1 )
               oScan:oView:display()
               P_aFileMark := oScan:oFiles:FileList:getData()     //+31.07.2008 16:08
               P_aFileExt  := oScan:oFiles:ExtList:getData()      //+31.07.2008 16:08
            ELSE
   //+ braucht zu viele pi~.ch
               WinApiOpen(mp1)
   //            file2open := "url.dll,FileProtocolHandler " + mp1
   //            RunShell( file2open, 'Rundll32.exe' )
            ENDIF
         ELSE
            oScan:oView:killdisplay()
         ENDIF
      ELSEIF nEvent == xbeFS_FileSelected
         oScan:ABDrucken(oScan:BEArea[1],"A" ,,,"bl_grb2" )
//+ normaler EventHandler:
      ELSE
         oXbp:handleEvent( nEvent, mp1, mp2 )
      ENDIF
   ENDDO

   aPos := oDlg:currentpos()
   ASize := oDlg:currentsize()
   oDlg:setModalState( XBP_DISP_MODELESS )
   DbDeRegisterClient()                    // 20.5.2004, damit kein Painttip mehr durch :notify()
//////   oDlg:oHelp:terminate()
   oScan:destroy()
   oDlg:destroy()
//   oHelp:terminate()
   DbCloseArea()
      DO WHILE nEvent <> xbe_None
         nEvent := AppEvent( @mp1, @mp2, @oXbp, 10 )     //leert die Event-Loop !! wichtig!!
      ENDDO 
ENDDO

   IF lFlucht == .F.               // ESC-Taste: lFlucht = .T.
   ELSE
   ENDIF
// berflssig wegen quit?        ThreadObject():atEnd()
         ThreadObject():QUIT()

//+09.10.2008 13:52:
   CurDir( cDatver )        // damit die Befehle wie "COPY" etc. dort wirken
   SetAppFocus( oFocus )

RETURN .T.


CLASS AScanFF FROM DialogFF
   EXPORTED:
//+28.09.2008 11:26 ist doch alles schon in DialogFF:
//   VAR VArea
//   VAR cScan            // Feld zur Anzeige des Bild-Dateinamens
//   VAR cScan2           //+22.07.2008 09:44 Feld zur Eingabe des Scan-Dateinamens fr SonderScans
//   VAR ABVorschau       //* Objekt, das die XbpPreview-Vorschau h„lt
//   VAR oVorDlg          //* Fenster fr die Vorschau
//   VAR oDirs            //+ DirTree          fr FileView
//   VAR oFiles           //+ FileTree         fr FileView
//   VAR oView            //+ Vorschaufenster  fr FileView

   METHOD INIT
   METHOD CREATE
   METHOD notify
   METHOD destroy       //+30.07.2008 15:03
//+28.09.2008 11:27 wird doch nicht gebraucht, oder?
//   METHOD ABSuch        //* Anlieferer+Bilder-Suche
//+28.09.2008 11:26 ist doch alles schon in DialogFF:
//   METHOD ABDrucken     //* Anlieferer+Bilder-Druck
//   METHOD ABVorschau    //* Anlieferer+Bilder Druck-Vorschau
//   METHOD FileView      //+ Vorschau+Druck zus„tzlicher Bilder
ENDCLASS

METHOD AScanFF: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 := ""
   ::VArea := nA
   ::cScan := cBildDateiName
   ::cScan2 := ""
   ::aStructure := (nA)->(DbStruct())
   AEval( ::aStructure, {|a| AAdd( ::aFelder, a[1] ) } )
   ::BEArea := {}
   AAdd( ::BEArea, oParent )
   ::BENr := Len( ::BEArea )
RETURN self

METHOD AScanFF: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 AScanFF: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 AScanFF:destroy()
   S_cStartDir := ::oDirs:CurDir()
   ::oDirs := NIL
   ::oFiles := NIL
   ::oView := NIL
   ::ABVorschau := NIL
   ::oVorDlg := NIL
RETURN ::DialogFF:destroy()

////////////////////////////
//*09.07.2008 18:42 beim Scannen muss das wohl total umgebaut werden...
//* vielleicht mit den Suchfenstern in EZScan.prg ?
//////////////////////////
//////METHOD AScanFF:ABSuch( 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

/*28.09.2008 11:33 ist in DialogFF
METHOD AScanFF:ABDrucken( oDlg1, cArt, nAnz, nOrient, cBlDatei )  //* 10.07.2008 11:54
   LOCAL cTitle
   LOCAL aPos := {0,30}, ASize := {1,1}, aPP := {}
   DEFAULT cArt TO "A", nAnz TO 1, nOrient TO 1  //* cArt = "AD" druckt auf den Drucker
   DEFAULT cBlDatei TO "bl_anl"     //*11.07.2008 10:57

   IF ValType(::oVorDlg) == "O"
      ::oVorDlg:hide()
   ENDIF
   IF Empty(cDruckerName)  // 10.04.2006
      cDruckerName := DruckerWahl(1)      //+25.07.2008 18:46 Standarddrucker
   ENDIF
   cTitle := cDruckerName + " - " + ;
                                 Trim(21->name)+", "+Trim(21->vorname)+" - "+21->anummer
   
   IF cArt == "A"
      ASize := {SetAppWindow():currentsize()[1]/2,SetAppWindow():currentsize()[2]-80}
   ENDIF
   ::oVorDlg := AKDialog():new(  AppDeskTop(), oDlg1:setParent(), {0,30}, ;
            ASize, aPP, .F.) //24.03.2008 14:37
   ::oVorDlg:border    := XBPDLG_RAISEDBORDERTHICK_FIXED
   
   ::oVorDlg:title     := cTitle
   ::oVorDlg:title := IIf(SET(43)==0,ConvToAnsiCP(::oVorDlg:title),::oVorDlg:title)   //03.12.2006 18:02
   ::oVorDlg:minButton := .F.
   ::oVorDlg:maxButton := .F.
   ::oVorDlg:taskList  := .T.
   ::oVorDlg:create()
   ::oVorDlg:show()

   BlattDRG( cBlDatei,, ::oVorDlg:drawingArea,,,cArt,"A",@nAnz,,nOrient)     //* @nt war nach @nAnz
RETURN self
*/

//* 10.07.2008 11:54
/*
// nOrientierung = 1 (Portrait) oder = 2 (Landscape):
METHOD AScanFF:ABVorschau( aBlattG, oDlg1, cCP, aSchrift, aParamG, nOrientierung )
   LOCAL oDlg  //, oXbpD1, oXbpDA, oXbpEoD, oXbpU, oXbpE, oXbpG, oXbpK
   LOCAL oVorSchau  //, oFocus := SetAppFocus()
   LOCAL hp := 1, vp := 1, nBo, nBz := 20*nV, aVOSize
   LOCAL aPos := {10,30*nV}, ASize := {790*nH,570*nV}
//   LOCAL aZoom := IIf(cDruckerName!="Microsoft" .OR. !"."$cZoom,&cZoom,{ 1.13, 40, 50 }) // damit beim Start die Vorschau vergr”áert wird
   LOCAL aZoom := IIf(ValType(aAusschnitt)="A".AND.len(aAusschnitt)=4, ;
                           ADel(AClone(aAusschnitt),1),{1,0,0})   //20.10.2007 18:19
   PRIVATE oFocSle, oVODA  //, cBriefkopf := ""
   IF Len(aParamG) = 0
      aParamG := { {"P","t","Anzahl Drucke:","1",0,"","cAnz",0,1,0} }
   ENDIF
   IF ::ABVorschau != NIL     //22.10.2006 18:33
      ::ABVorschau:destroy()
   ENDIF

   oVODA := oDlg1
   oDlg := oVODA:setParent()     //* weil in :cargo schon mal was Anderes steht!
   aVOSize := oVODA:currentSize()
   
   ::ABVorschau := XbpPreview():new( oVODA, oDlg, {0,0}, {aVOSize[1],aVOSize[2]},,, nOrientierung )
   ::ABVorschau:aBlatt := aBlattG
   ::ABVorschau:aParam := aParamG
   ::ABVorschau:cCP := cCP
   ::ABVorschau:aSchrift := aSchrift
      ::ABVorschau:drawBlock := {|oPS, nPageNo, nNumRows, aSegment, aBlatt, cCP, aSchrift, nO| ;
                              Vorschau_Ausgabe( oPS, aSegment, aBlatt, cCP, aSchrift, nO )}
   ::ABVorschau:create()
      ::ABVorschau:zoomfactor := aZoom[1]
      ::ABVorschau:hScroll:setData( aZoom[2] )
      ::ABVorschau:vScroll:setData( aZoom[3] )
      ::ABVorschau:zoom( ::ABVorschau:zoomfactor )
RETURN self
*/

//+ aus EzScan DirSelector..., Klassen DirWahl, FileWahl, BitView in AKDialogVHs: ImageView in EzScan
/*
METHOD AScanFF:fileview( oDlg1, cStartDir )
   LOCAL ASize, cAnl := 21->anummer
   DEFAULT oDlg1 TO ::BEArea[::BENr], cStartDir TO CurDrive()+":\"+CurDir()
   S_cStartDir := IIf(Empty(S_cStartDir),cStartDir,S_cStartDir)
   ASize := oDlg1:currentsize()
   CurDir(S_cStartDir)

   oDlg1:setFontCompoundName(Stuff(cBFont,1,At(".",cBFont)-1,Str(Val(Left(cBFont,At(".",cBFont)-1))-2,2) ) )

   ::oDirs  := DirWahl():new ( oDlg1, , {5 ,5}, {aSize[1]*0.3,aSize[2]-10} )
   ::oDirs:tabStop := .T.
   ::oDirs:startDir := curdrive()+":\"+curdir() //cDatver+"Scans2"    //+ 
//   ::oDirs:startDir := curdrive()+":\"+curdir()+"\Scans2"    //+ 
   ::oDirs:create()

   ::oFiles := FileWahl():new( oDlg1, , {aSize[1]*0.3+10,5}, {aSize[1]*0.3,aSize[2]-10} )
   ::oFiles:tabStop := .T.
   ::oFiles:create()

   ::oFiles:setFilesTo( ::oDirs:curDir(), { cAnl+"*.BMP", cAnl+"*.JPG", cAnl+"*.EMF", cAnl+"*.GIF", cAnl+"*.PNG", "*.BMP *.EMF *.GIF *.JPG *.PNG"  } )
   ::oView := ImageView():new( oDlg1, , {aSize[1]*0.6+15,aSize[2]*0.3}, {aSize[1]*0.4-20,aSize[2]*0.7-5} ):create()

   SetAppFocus( ::oDirs:dirTree )
RETURN self
*/


#include "common.ch"
#include "\bestatt\aaa\prgx\printerapi.ch"
#include "\bestatt\aaa\prgx\piCommon.ch"
#include "dll.ch"
#include "os.ch"
#include "\bestatt\aaa\prgx\bap.ch"

Function WinAPIOpen(cFile, cParms, cDirectory, nOpenMode )
   DEFAULT nOpenMode to SW_SHOWNORMAL,;    // SW_HIDE,;
           cDirectory TO CurDir()

//   Return wapiShellExecute( oABDA:cargo:GetHWND(), "open", cFile, cParms, CurDir(), nOpenMode ) > 32
   Return wapiShellExecute( AppDesktop():GetHWND(), "open", cFile, cParms, CurDir(), nOpenMode ) > 32

DLLFUNCTION wapiShellExecute( nHWND, cOperation, cFile, cParms, cDirectory, nOpenMode  );
            ALIAS ShellExecuteA USING OSAPI FROM SHELL32.DLL
