home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 June / PCWorld_2002-06_cd.bin / Software / Komercni / xbase / express / exd17208.r04 / exp17 / Samples / Xclipdoc.prg < prev    next >
Text File  |  2002-01-30  |  20KB  |  771 lines

  1. #INCLUDE "dcdialog.ch"
  2. #INCLUDE "dcprint.ch"
  3. #INCLUDE "appevent.ch"
  4. #INCLUDE "dcbitmap.ch"
  5. #include 'dmlb.ch'
  6. #include "fileio.ch"
  7.  
  8.  
  9. #DEFINE cDocName             aApp[1]
  10. #DEFINE dDocDate             aApp[2]
  11. #DEFINE cDesc                aApp[3]
  12. #DEFINE cComments            aApp[5]
  13. #DEFINE oToolBar             aApp[6]
  14. #DEFINE oBrowse              aApp[7]
  15. #DEFINE lAddMode             aApp[8]
  16. #DEFINE oDocName             aApp[9]
  17. #DEFINE aGetList             aApp[10]
  18. #DEFINE aPres                aApp[11]
  19. #DEFINE lCaptureMode         aApp[12]
  20. #DEFINE xBuffer              aApp[13]
  21. #DEFINE aTimerEvent          aApp[14]
  22. #DEFINE oDlg                 aApp[15]
  23. #DEFINE oStatic1             aApp[16]
  24. #DEFINE oBitMap1             aApp[17]
  25. #DEFINE oStatic2             aApp[18]
  26. #DEFINE oText2               aApp[19]
  27. #DEFINE xBitMap              aApp[20]
  28. #DEFINE cDocType             aApp[21]
  29. #DEFINE cSavedDocType        aApp[22]
  30. #DEFINE oAddButton           aApp[23]
  31. #DEFINE oStatic3             aApp[24]
  32. #DEFINE oDocSay              aApp[25]
  33. #DEFINE oDlgWindow           aApp[26]
  34. #DEFINE lMDIApp              aApp[27]
  35. #DEFINE cTitle               aApp[28]
  36. #DEFINE oDialogWindow        aApp[29]
  37.  
  38. FIELD DOC_NAME, DOC_DATE, DESC
  39.  
  40. FUNCTION XClipDoc( oDialog )
  41.  
  42. LOCAL GetList := {}, aStru, aApp[30], GetOptions, aCoords
  43.  
  44. SET PATH TO ..\DATA
  45.  
  46. aGetList := GetList
  47. IF !File('CLIPDOC.DBF')
  48.   aStru := { ;
  49.    { 'DOC_NAME'  , 'C',  30, 0 }, ;
  50.    { 'DOC_DATE'  , 'D',   8, 0 }, ;
  51.    { 'DESC'      , 'C',  50, 0 }, ;
  52.    { 'COMMENTS'  , 'C', 100, 0 }, ;
  53.    { 'DOC_TYPE'  , 'C',   1, 0 }, ;
  54.    { 'BITMAP'    , 'V',   4, 0 } }
  55.  
  56.   dbCreate('CLIPDOC.DBF',aStru,'FOXCDX')
  57. ENDIF
  58.  
  59. SET DELETED ON
  60. USE CLIPDOC VIA "FOXCDX" SHARED
  61.  
  62. IF !File('CLIPDOC.CDX')
  63.   INDEX ON DOC_NAME TAG 'DOC_NAME' TO CLIPDOC.CDX
  64.   INDEX ON DOC_DATE TAG 'DOC_DATE' TO CLIPDOC.CDX
  65.   INDEX ON DESC TAG 'DESC' TO CLIPDOC.CDX
  66. ENDIF
  67.  
  68. SET INDEX TO CLIPDOC.CDX
  69. OrdSetFocus('DOC_NAME')
  70.  
  71. SET DATE FORMAT TO 'mm/dd/yyyy'
  72. LoadFields(aApp,.f.)
  73. cDocType := ' '
  74. lAddMode := .f.
  75. lCaptureMode := .f.
  76. aTimerEvent := SetTimerEvent()
  77. cTitle := 'ClipBoard Document Capture Utility'
  78.  
  79. aPres := ;
  80.   { { XBP_PP_COL_HA_FGCLR, GRA_CLR_WHITE },    /*  Header FG Color  */     ;
  81.     { XBP_PP_COL_HA_BGCLR, GRA_CLR_DARKGRAY }, /*  Header BG Color  */     ;
  82.     { XBP_PP_COL_DA_ROWSEPARATOR, XBPCOL_SEP_DOTTED }, /* Row Sep  */      ;
  83.     { XBP_PP_COL_DA_COLSEPARATOR, XBPCOL_SEP_DOTTED }, /* Col Sep  */      ;
  84.     { XBP_PP_COL_DA_FGCLR, GRA_CLR_BLACK },       /* Row FG Color  */      ;
  85.     { XBP_PP_COL_DA_BGCLR, GRA_CLR_WHITE }        /* Row BG Color  */      ;
  86.   }
  87.  
  88. @ 1,2 DCBROWSE oBrowse ALIAS 'CLIPDOC' SIZE 44,10 ;
  89.   ITEMMARKED {||LoadFields(aApp,.t.,.f.)} ;
  90.   PRESENTATION aPres ;
  91.   WHEN {||!lAddMode}
  92.  
  93. DCBROWSECOL FIELD CLIPDOC->DOC_NAME PARENT oBrowse ;
  94.    HEADER 'Doc Name' WIDTH 9 ;
  95.    SORT {||OrdSetFocus('DOC_NAME')}
  96.  
  97. DCBROWSECOL FIELD CLIPDOC->DOC_DATE PARENT oBrowse ;
  98.    HEADER 'Date' WIDTH 6 ;
  99.    SORT {||OrdSetFocus('DOC_DATE')}
  100.  
  101. DCBROWSECOL FIELD CLIPDOC->DESC PARENT oBrowse ;
  102.    HEADER 'Description' WIDTH 20 ;
  103.    SORT {||OrdSetFocus('DESC')}
  104.  
  105. @ 1, 47 DCSTATIC TYPE XBPSTATIC_TYPE_RAISEDBOX ;
  106.    OBJECT oStatic1  SIZE 25,10 ;
  107.    HIDE {||!(cDocType='B' .OR. cSavedDocType='B')} ;
  108.    EVAL {|o|o:lbdown := {||PrintDocument(aApp,2)}}
  109.  
  110. DCBITMAP CLIPDOC->bitmap PARENT oStatic1 AUTOSCALE
  111.  
  112. @ 1, 47 DCSTATIC TYPE XBPSTATIC_TYPE_RAISEDBOX ;
  113.    OBJECT oStatic2  SIZE 25,10 ;
  114.    HIDE {||!(cDocType='T' .OR. cSavedDocType='T')}
  115.  
  116. @ 0,0 DCMULTILINE xBitMap PARENT oStatic2 ;
  117.   SIZE 25,10 ;
  118.   NOWORDWRAP ;
  119.   NOVERTSCROLL ;
  120.   NOHORIZSCROLL ;
  121.   EVAL {|o|o:lbdown := {||PrintDocument(aApp,2)}}
  122.  
  123. @ 11.5,2 DCSTATIC TYPE XBPSTATIC_TYPE_RAISEDBOX ;
  124.   SIZE 70, 9 OBJECT oStatic3
  125.  
  126. @ .5,2 DCSAY 'Document Name' GET cDocName ;
  127.   PICT '@!' ;
  128.   PARENT oStatic3 ;
  129.   SAYSIZE 14 SAYRIGHT ;
  130.   SAYOBJECT oDocSay ;
  131.   GETOBJECT oDocName ;
  132.   VALID {||Validate(aApp,1)}
  133.  
  134. @ 1,0 DCSAY 'Document Date' GET dDocDate ;
  135.   SAYSIZE 14 SAYRIGHT ;
  136.   RELATIVE oDocSay ;
  137.   PARENT oStatic3 ;
  138.   POPUP {|d|DC_PopDate(d)} ;
  139.   VAlID {||!Empty(dDocDate)}
  140.  
  141. @ 2,0 DCSAY 'Description' GET cDesc ;
  142.   PARENT oStatic3 ;
  143.   RELATIVE oDocSay ;
  144.   SAYSIZE 14 SAYRIGHT GETSIZE 40
  145.  
  146. @ 3,0 DCSAY 'Comments:' PARENT oStatic3 ;
  147.   RELATIVE oDocSay
  148.  
  149. @ 4,0 DCMULTILINE cComments SIZE 66,4 PARENT oStatic3 ;
  150.   RELATIVE oDocSay
  151.  
  152. /* ----- Toolbar ----- */
  153.  
  154. @ 1, 74 DCTOOLBAR oToolBar SIZE 9,18.3 ;
  155.   BUTTONSIZE 9,1.2 ;
  156.   TYPE XBPSTATIC_TYPE_TEXT
  157.  
  158. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  159.             SIZE 9,.1 PARENT oToolBar
  160.  
  161. DCADDBUTTON CAPTION '&Top' ;
  162.    PARENT oToolBar ;
  163.    ACCELKEY xbeK_ALT_T ;
  164.    ACTION {||dbGoTop(),LoadFields(aApp)} ;
  165.    WHEN {||!lAddMode}
  166.  
  167. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  168.             SIZE 9,.1 PARENT oToolBar
  169.  
  170. DCADDBUTTON CAPTION '&Previous' ;
  171.    PARENT oToolBar ;
  172.    ACCELKEY xbeK_ALT_P ;
  173.    ACTION {||dbSkip(-1),LoadFields(aApp)} ;
  174.    WHEN {||!lAddMode}
  175.  
  176. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  177.             SIZE 9,.1 PARENT oToolBar
  178.  
  179. DCADDBUTTON CAPTION '&Next' ;
  180.    PARENT oToolBar ;
  181.    ACCELKEY xbeK_ALT_N ;
  182.    ACTION {||dbSkip(1),LoadFields(aApp)} ;
  183.    WHEN {||!lAddMode}
  184.  
  185. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  186.             SIZE 9,.1 PARENT oToolBar
  187.  
  188. DCADDBUTTON CAPTION '&Bottom' ;
  189.    PARENT oToolBar ;
  190.    ACCELKEY xbeK_ALT_B ;
  191.    ACTION {||dbGoBottom(),LoadFields(aApp)} ;
  192.    WHEN {||!lAddMode}
  193.  
  194. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  195.             SIZE 9,.1 PARENT oToolBar
  196.  
  197. DCADDBUTTON CAPTION '&Save' ;
  198.    TOOLTIP 'Save Changes ; to file' ;
  199.    PARENT oToolBar ;
  200.    ACCELKEY xbeK_ALT_S ;
  201.    ACTION {||SaveFields(aApp)} ;
  202.    WHEN {||TestChanged(aApp)}
  203.  
  204. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  205.             SIZE 9,.1 PARENT oToolBar
  206.  
  207. DCADDBUTTON CAPTION '&Add' ;
  208.    TOOLTIP 'Add a new Docment Record' ;
  209.    OBJECT oAddButton ;
  210.    PARENT oToolBar ;
  211.    ACCELKEY xbeK_ALT_A ;
  212.    ACTION {||AddMode(aApp)}
  213.  
  214. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  215.             SIZE 9,.1 PARENT oToolBar
  216.  
  217. DCADDBUTTON CAPTION '&Delete' ;
  218.    TOOLTIP 'Delete Selected Docment' ;
  219.    PARENT oToolBar ;
  220.    ACCELKEY xbeK_ALT_A ;
  221.    ACTION {||_Delete(aApp)}
  222.  
  223. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  224.             SIZE 9,.1 PARENT oToolBar
  225.  
  226. DCADDBUTTON CAPTION 'Pac&k' ;
  227.    TOOLTIP 'Pack the file;Permanently Remove;all Deleted Docments' ;
  228.    PARENT oToolBar ;
  229.    ACCELKEY xbeK_ALT_K ;
  230.    ACTION {||_Pack(aApp)}
  231.  
  232. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  233.             SIZE 9,.1 PARENT oToolBar
  234.  
  235. DCADDBUTTON CAPTION '&Clip' ;
  236.    PARENT oToolBar ;
  237.    TOOLTIP 'Capture Clipboard bitmap to Selected record' ;
  238.    ACTION {||MonitorClipboard(aApp)} ;
  239.    WHEN {||!lAddMode} ;
  240.    ACCELKEY xbeK_ALT_C
  241.  
  242. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  243.             SIZE 9,.1 PARENT oToolBar
  244.  
  245. DCADDBUTTON CAPTION 'Pr&int' ;
  246.    PARENT oToolBar ;
  247.    TOOLTIP 'Print the document' ;
  248.    ACTION {||PrintDocument(aApp,1)} ;
  249.    WHEN {||!lAddMode} ;
  250.    ACCELKEY xbeK_ALT_I
  251.  
  252. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  253.             SIZE 9,.1 PARENT oToolBar
  254.  
  255. DCADDBUTTON CAPTION 'Pre&view' ;
  256.    PARENT oToolBar ;
  257.    ACTION {||PrintDocument(aApp,2)} ;
  258.    TOOLTIP 'Preview the document on the screen' ;
  259.    WHEN {||!lAddMode} ;
  260.    ACCELKEY xbeK_ALT_V
  261.  
  262. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  263.             SIZE 9,.1 PARENT oToolBar
  264.  
  265. DCADDBUTTON CAPTION 'Captu&re' ;
  266.    PARENT oToolBar ;
  267.    TOOLTIP {||IIF(lCaptureMode,'Turn off Capture',;
  268.                   'Enable Capture Mode (grab images from Clipboard)')} ;
  269.    ACTION {||SetCaptureMode(aApp)} ;
  270.    WHEN {||!lAddMode} ;
  271.    ACCELKEY xbeK_ALT_R
  272.  
  273. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  274.             SIZE 9,.1 PARENT oToolBar
  275.  
  276. DCADDBUTTON CAPTION '&Help' ;
  277.    PARENT oToolBar ;
  278.    ACCELKEY xbeK_ALT_H ;
  279.    ACTION {||_Help(aApp)}
  280.  
  281. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  282.             SIZE 9,.1 PARENT oToolBar
  283.  
  284. DCADDBUTTON CAPTION 'E&xit' ;
  285.    PARENT oToolBar ;
  286.    ACCELKEY xbeK_ALT_X ;
  287.    ACTION {||PostAppEvent(xbeP_Close,,,oDialogWindow)}
  288.  
  289. DCADDBUTTON TYPE XBPSTATIC_TYPE_RAISEDRECT ;
  290.             SIZE 9,.1 PARENT oToolBar
  291.  
  292. DCGETOPTIONS ;
  293.    BITMAP BITMAP_PINSTRIPE ;
  294.    CASCADE
  295.  
  296. DCREAD GUI ;
  297.    APPWINDOW oDialog ;
  298.    TITLE cTitle ;
  299.    HANDLER DlgHandler REFERENCE aApp ;
  300.    OPTIONS GetOptions ;
  301.    EVAL {|o|oDialogWindow:=o} ;
  302.    FIT
  303.  
  304. CLOSE DATABASES
  305.  
  306. RETURN nil
  307.  
  308. /* ------------------------- */
  309.  
  310. STATIC FUNCTION ;
  311.   DlgHandler ( nEvent, mp1, mp2, oXbp, oDialog, GetList, aApp )
  312.  
  313. IF !Empty(xBuffer) .AND. !lAddMode .AND. lCaptureMode
  314.   AddMode(aApp)
  315. ENDIF
  316.  
  317. RETURN DCGUI_NONE
  318.  
  319. /* -------------------- */
  320.  
  321. STATIC FUNCTION AddMode( aApp )
  322.  
  323. LOCAL nSaveRec, oDialog
  324.  
  325. IF !lAddMode
  326.   lAddMode := .t.
  327.   nSaveRec := RecNo()
  328.   dbGoBottom()
  329.   dbSkip()
  330.   LoadFields(aApp,.t.)
  331.   dbGoto(nSaveRec)
  332.   oAddButton:setCaption('C&ancel')
  333.   DC_GetRefresh(aGetList)
  334.   SetAppFocus(oDocName)
  335.   DC_ClearEvents()
  336.   IF cSavedDocType = 'B'
  337.     DC_BitMapDraw(oStatic1,xBuffer)
  338.   ENDIF
  339. ELSE
  340.   xBuffer := nil
  341.   lAddMode := .f.
  342.   oAddButton:setCaption('&Add')
  343.   LoadFields(aApp)
  344.   IF lCaptureMode
  345.     oDialog := _DialogWindow(aApp)
  346.     oDialog:setFrameState(XBPDLG_FRAMESTAT_MINIMIZED)
  347.   ENDIF
  348. ENDIF
  349.  
  350. RETURN nil
  351.  
  352. /* --------------------- */
  353.  
  354. STATIC FUNCTION Validate ( aApp, nMode )
  355.  
  356. LOCAL nEvent, oNextXbp
  357.  
  358. nEvent := DC_NextAppEvent(nil,nil,@oNextXbp)
  359. IF nEvent = xbeP_SetInputFocus .AND. Valtype(oNextXbp) = 'O' .AND. ;
  360.    oNextXbp == oAddButton
  361.    RETURN .t.
  362. ENDIF
  363.  
  364. IF nMode = 1  // validate doc name
  365.  
  366.   IF Empty(cDocName)
  367.      DC_WinAlert('Name cannot be empty!')
  368.      RETURN .f.
  369.   ENDIF
  370.   RETURN .t.
  371.  
  372. ENDIF
  373.  
  374. RETURN .t.
  375.  
  376. /* -------------------- */
  377.  
  378. STATIC FUNCTION LoadFields( aApp, lRefresh, lRefreshBrowse )
  379.  
  380. DEFAULT lRefresh := .t., ;
  381.         lRefreshBrowse := .t.
  382.  
  383. cDocName      := CLIPDOC->doc_name
  384. dDocDate      := CLIPDOC->doc_date
  385. cDesc         := CLIPDOC->desc
  386. cComments     := CLIPDOC->comments
  387. xBitMap       := CLIPDOC->bitmap
  388. cDocType      := CLIPDOC->doc_type
  389.  
  390. IF Empty(dDocDate)
  391.    dDocDate := Date()
  392. ENDIF
  393. IF lRefresh
  394.   IF lRefreshBrowse
  395.     DC_GetRefresh(aGetList)
  396.   ELSE
  397.     DC_GetRefresh(aGetList,nil,DCGETREFRESH_TYPE_EXCLUDE,{GETLIST_BROWSE})
  398.   ENDIF
  399.   IF cDocType = 'B'
  400.     DC_BitMapDraw(oStatic1,CLIPDOC->bitmap)
  401.   ENDIF
  402. ENDIF
  403.  
  404. RETURN nil
  405.  
  406. /* -------------------- */
  407.  
  408. STATIC FUNCTION SaveFields( aApp )
  409.  
  410. LOCAL oDialog
  411.  
  412. IF lAddMode
  413.   IF !AddRec()
  414.     RETURN .f.
  415.   ENDIF
  416. ELSE
  417.   IF !RecLock()
  418.     RETURN .f.
  419.   ENDIF
  420. ENDIF
  421.  
  422. REPL CLIPDOC->doc_name WITH cDocName
  423. REPL CLIPDOC->doc_date WITH dDocDate
  424. REPL CLIPDOC->desc     WITH cDesc
  425. REPL CLIPDOC->comments WITH cComments
  426. IF !Empty(xBuffer)
  427.   REPL CLIPDOC->bitmap   WITH xBuffer
  428.   REPL CLIPDOC->doc_type WITH cSavedDocType
  429. ENDIF
  430.  
  431. cSavedDocType := ' '
  432. xBuffer := nil
  433. dbRUnlock()
  434.  
  435. lAddMode := .f.
  436. DC_GetRefresh(aGetList)
  437.  
  438. IF lCaptureMode
  439.   oDialog := _DialogWindow(aApp)
  440.   oDialog:setFrameState(XBPDLG_FRAMESTAT_MINIMIZED)
  441. ENDIF
  442.  
  443. RETURN nil
  444.  
  445. /* -------------------- */
  446.  
  447. STATIC FUNCTION TestChanged( aApp )
  448.  
  449. RETURN ;
  450. cDocName      # CLIPDOC->doc_name   .OR. ;
  451. dDocDate      # CLIPDOC->doc_date   .OR. ;
  452. cDesc         # CLIPDOC->desc       .OR. ;
  453. cComments     # CLIPDOC->comments
  454.  
  455. /* ----------------- */
  456.  
  457. FUNCTION addrec ()
  458.  
  459. APPEND BLANK
  460. IF !NETERR()
  461.    RETURN (.T.)
  462. ENDIF
  463. DC_Winalert('File is in use. Try again later!')
  464. RETURN .F.
  465.  
  466. /* ----------------- */
  467.  
  468. FUNCTION reclock ()
  469.  
  470. IF dbRLock()
  471.    RETURN .t.
  472. ENDIF
  473. DC_Winalert('Record is in use. Try again later!')
  474. RETURN .F.
  475.  
  476. /* --------------- */
  477.  
  478. STATIC PROCEDURE SetCaptureMode( aApp )
  479.  
  480. LOCAL bTimerEvent, oDialog
  481.  
  482. bTimerEvent := {|| CaptureClipBoard( aApp )}
  483. lCaptureMode := !lCaptureMode
  484. DC_WinAlert('Capture Mode is ' + IIF(lCaptureMode,'ON','OFF'))
  485. IF lCaptureMode
  486.   SetTimerEvent( 100, bTimerEvent )
  487.   oDialog := _DialogWindow(aApp)
  488.   oDialog:setFrameState(XBPDLG_FRAMESTAT_MINIMIZED)
  489. ELSE
  490.   SetTimerEvent( aTimerEvent[1], aTimerEvent[2] )
  491. ENDIF
  492.  
  493. RETURN
  494.  
  495. /* ---------------*/
  496.  
  497. STATIC PROCEDURE CaptureClipBoard( aApp )
  498.  
  499. LOCAL oBitMap, aFormats, oClipBoard, oDialog
  500.  
  501. // Open clipboard and determine the data formats contained in it
  502. IF !Empty(xBuffer)
  503.    RETURN
  504. ENDIF
  505.  
  506. oClipBoard := XbpClipBoard():new():Create()
  507. oClipBoard:open()
  508. aFormats := oClipBoard:queryFormats()
  509. oDialog := _DialogWindow(aApp)
  510. IF AScan( aFormats, XBPCLPBRD_BITMAP ) > 0
  511.   oBitMap := oClipBoard:getBuffer( XBPCLPBRD_BITMAP )
  512.   xBuffer := oBitMap:setBuffer()
  513.   cSavedDocType := 'B'
  514.   DC_BitmapDraw(oStatic1,xBuffer)
  515.   oClipBoard:clear()
  516.   oDialog:setFrameState(XBPDLG_FRAMESTAT_NORMALIZED)
  517. ELSEIF AScan( aFormats, XBPCLPBRD_TEXT ) > 0
  518.   xBuffer := oClipBoard:getBuffer( XBPCLPBRD_TEXT )
  519.   cSavedDocType := 'T'
  520.   oClipBoard:clear()
  521.   oDialog:setFrameState(XBPDLG_FRAMESTAT_NORMALIZED)
  522.   xBitMap := xBuffer
  523. ENDIF
  524. oClipBoard:close()
  525. oClipBoard:Destroy()
  526.  
  527. RETURN
  528.  
  529. /* --------------- */
  530.  
  531. STATIC PROCEDURE MonitorClipBoard( aApp )
  532.  
  533. LOCAL aFormats, oClipBoard, oBitMap
  534.  
  535. // Open clipboard and determine the data formats contained in it
  536.  
  537. IF !RecLock()
  538.   RETURN
  539. ENDIF
  540. oClipBoard := XbpClipBoard():new():Create()
  541. oClipBoard:open()
  542. aFormats := oClipBoard:queryFormats()
  543. IF AScan( aFormats, XBPCLPBRD_BITMAP ) > 0
  544.   oBitMap := oClipBoard:getBuffer( XBPCLPBRD_BITMAP )
  545.   oClipBoard:clear()
  546.   REPL CLIPDOC->doc_type WITH 'B'
  547.   REPL CLIPDOC->bitmap WITH oBitMap:setBuffer()
  548.   oBitMap:SetBuffer(oBitMap:SetBuffer())
  549.   DC_WinAlert('BitMap has been saved!')
  550.   DC_BitmapDraw(oStatic1,CLIPDOC->bitmap)
  551. ELSEIF AScan( aFormats, XBPCLPBRD_TEXT ) > 0
  552.   xBuffer := oClipBoard:getBuffer( XBPCLPBRD_TEXT )
  553.   oClipBoard:clear()
  554.   REPL CLIPDOC->doc_type WITH 'T'
  555.   REPL CLIPDOC->bitmap WITH xBuffer
  556.   DC_WinAlert('Text has been saved!')
  557. ELSEIF AScan( aFormats, XBPCLPBRD_METAFILE ) > 0
  558.   xBuffer := oClipBoard:getBuffer( XBPCLPBRD_METAFILE )
  559.   oClipBoard:clear()
  560.   DC_WinAlert('Metafile was retrieved!')
  561. ELSE
  562.   DC_WinAlert('Nothing in Clipboard to Save!')
  563. ENDIF
  564. oClipBoard:close()
  565. oClipBoard:Destroy()
  566. xBuffer := nil
  567. UNLOCK
  568. DC_GetRefresh(aGetList)
  569.  
  570. RETURN
  571.  
  572. /* ------------------------- */
  573.  
  574. STATIC FUNCTION PrintDocument( aApp, nPrintMode )
  575.  
  576. LOCAL oPrinter, cScrn, i, cMemo, nLineCount, cMemoLine, nRow
  577.  
  578. DC_ClearEvents()
  579. IF nPrintMode = 1  // Standard Print
  580.   DCPRINT ON SIZE 60,100 TO oPrinter FONT '14.Arial'
  581. ELSEIF nPrintMode = 2 // Preview
  582.   DCPRINT ON SIZE 60,100 TO oPrinter PREVIEW FONT '14.Arial' HIDE
  583. ENDIF
  584.  
  585. BEGIN SEQUENCE
  586.  
  587. IF Valtype(oPrinter) # 'O' .OR. !oPrinter:lActive
  588.   BREAK
  589. ENDIF
  590.  
  591. IF nPrintMode # 2
  592.   cScrn := DC_WaitOn()
  593. ENDIF
  594.  
  595. @ 3,1 DCPRINT SAY 'Document Name: ' FONT '12.Courier'
  596. @ DC_PrinterRow(oPrinter), DC_PrinterCol(oPrinter) ;
  597.    DCPRINT SAY CLIPDOC->doc_name PRINTER oPrinter
  598.  
  599. @ 4.5,1 DCPRINT SAY 'Document Date: ' FONT '12.Courier'
  600. @ DC_PrinterRow(oPrinter), DC_PrinterCol(oPrinter) ;
  601.    DCPRINT SAY CLIPDOC->doc_date PRINTER oPrinter
  602.  
  603. @ 6,1 DCPRINT SAY 'Document Desc: ' FONT '12.Courier'
  604. @ DC_PrinterRow(oPrinter), DC_PrinterCol(oPrinter) ;
  605.    DCPRINT SAY CLIPDOC->desc PRINTER oPrinter
  606.  
  607. IF cDocType = 'B'
  608.   @ 8,1,59,98 DCPRINT BITMAP CLIPDOC->bitmap ;
  609.    PRINTER oPrinter NOAUTOSCALE
  610. ELSEIF cDocType = 'T'
  611.   nRow := 9
  612.   DCPRINT FONT '12.Terminal' PRINTER oPrinter
  613.   cMemo := CLIPDOC->bitmap
  614.   nLineCount := MLCount(cMemo)
  615.   FOR i := 1 TO nLineCount
  616.     cMemoLine := MemoLine( cMemo, nil, i )
  617.     @ nRow,1 DCPRINT SAY cMemoLine PRINTER oPrinter
  618.     nRow += 1.5
  619.     IF nRow >= 59
  620.       nRow := 1
  621.       DCPRINT EJECT PRINTER oPrinter
  622.     ENDIF
  623.   NEXT
  624.   DCPRINT EJECT PRINTER oPrinter
  625. ENDIF
  626.  
  627. IF nPrintMode # 2
  628.   DC_Impl(cScrn)
  629. ENDIF
  630.  
  631. END SEQUENCE
  632.  
  633. DCPRINT OFF PRINTER oPrinter
  634.  
  635. RETURN nil
  636.  
  637. /* ----------------- */
  638.  
  639. STATIC FUNCTION AutoSeek( a, b, o, oBrow )
  640.  
  641. SEEK AllTrim(o:EditBuffer())
  642. oBrow:refreshAll()
  643.  
  644. RETURN nil
  645.  
  646. /* ----------------------- */
  647.  
  648. STATIC FUNCTION _Help(aApp)
  649.  
  650. LOCAL GetList := {}, GetOptions
  651.  
  652. @ 0,0 DCSAY 'CLIPDOC is an application that captures either Text or BitMap images'
  653. @ 1,0 DCSAY 'that were saved to the Clipboard by any other application and stores'
  654. @ 2,0 DCSAY 'them into a database name CLIPDOC.DBF.  The documents can later be'
  655. @ 3,0 DCSAY 'browsed, previewed and/or printed.'
  656.  
  657. @ 5,0 DCSAY 'Pressing the CLIP button grabs the ClipBoard and saves the document'
  658. @ 6,0 DCSAY 'Pressing the CAPTURE button enables "automatic capture" mode and '
  659. @ 7,0 DCSAY 'minimizes the application on the taskbar.  The application constantly'
  660. @ 8,0 DCSAY 'monitors the Clipboard and automatically pops up when something has'
  661. @ 9,0 DCSAY 'been captured by another program.'
  662.  
  663. @11,0 DCSAY 'Use CLIPDOC for scanning documents and storing them to a database.'
  664. @12,0 DCSAY 'Press CAPTURE, then scan the document with your scanning software and'
  665. @13,0 DCSAY 'save it to the Clipboard.  It is recommended that text-only documents'
  666. @14,0 DCSAY 'be scanned as 2-color B/W bitmaps before saving to the Clipboard.'
  667. @15,0 DCSAY 'It will be saved as a much smaller bitmap.'
  668.  
  669. @17,0 DCSAY 'Use CLIPDOC for capturing screen images for slide-shows and storing'
  670. @18,0 DCSAY 'them to a database.  Press CAPTURE, then highlight the desired window'
  671. @19,0 DCSAY 'and press Alt-Print-Scrn to capture to the clipboard'
  672.  
  673. DCGETOPTIONS SAYWIDTH 560 SAYFONT '12.Helv'
  674.  
  675. DCREAD GUI ;
  676.    FIT ;
  677.    BUTTONS DCGUI_BUTTON_EXIT ;
  678.    OPTIONS GetOptions  ;
  679.    TITLE 'ClipBoard Document Capture Utility'
  680.  
  681. RETURN nil
  682.  
  683. /* ------------------- */
  684.  
  685. STATIC FUNCTION _Delete(aApp)
  686.  
  687. IF DC_MsgBox(,,{'Are you sure you want to delete the selected document?'},,,,.t.)
  688.   IF RecLock()
  689.      DELETE
  690.      UNLOCK
  691.      dbSkip(-1)
  692.      LoadFields(aApp)
  693.   ENDIF
  694. ENDIF
  695. RETURN nil
  696.  
  697. /* -------------------- */
  698.  
  699. STATIC FUNCTION _Pack( aApp )
  700.  
  701. LOCAL lIsShared := dbInfo( DBO_SHARED ), GetList := {}, lOk, ;
  702.       nPackMode := 1, cAlias, cScrn, aStru
  703.  
  704. IF lIsShared
  705.   IF DC_MsgBox(,,{'The file must be opened exclusive to Pack.',;
  706.                       'Close file and reopen exclusive?'},,,,.t.)
  707.     dbCloseArea()
  708.     USE CLIPDOC VIA 'FOXCDX' NEW EXCLUSIVE
  709.     SET INDEX TO CLIPDOC.CDX
  710.   ENDIF
  711. ENDIF
  712. lIsShared := dbInfo( DBO_SHARED )
  713. IF !lIsShared
  714.   @ 1,1 DCRADIO nPackMode VALUE 1 PROMPT 'Fast Pack'
  715.   @ 2,1 DCRADIO nPackMode VALUE 2 PROMPT 'Slow Pack (compress memo fields)'
  716.   DCREAD GUI TO lOk FIT ADDBUTTONS ;
  717.      TITLE 'Pack Database'
  718.   IF !lOk
  719.     RETURN nil
  720.   ELSEIF nPackMode = 1
  721.     dbPack()
  722.     dbGoTop()
  723.     LoadFields( aApp )
  724.     DC_MsgBox('Done!')
  725.   ELSEIF nPackMode = 2
  726.     IF File('BAKDATA.DBF') .OR. File('BAKDATA.FPT')
  727.        IF !DC_MsgBox(,,{'BAKDATA.* file exist.  Erase and continue?'},,,,.t.)
  728.           RETURN .f.
  729.        ENDIF
  730.        FErase('BAKDATA.DBF')
  731.        FErase('BAKDATA.FPT')
  732.     ENDIF
  733.     CLOSE
  734.     FRename('CLIPDOC.DBF','BAKDATA.DBF')
  735.     FRename('CLIPDOC.FPT','BAKDATA.FPT')
  736.     USE BAKDATA VIA 'FOXCDX' NEW EXCLUSIVE
  737.     aStru := dbStruct()
  738.     dbCreate('CLIPDOC.DBF',aStru,'FOXCDX')
  739.     CLOSE
  740.     USE CLIPDOC VIA 'FOXCDX' NEW EXCLUSIVE
  741.     ZAP
  742.     Ferase('CLIPDOC.CDX')
  743.     cScrn := DC_WaitOn()
  744.     APPEND FROM BAKDATA FOR !Deleted() VIA 'FOXCDX'
  745.     INDEX ON DOC_NAME TAG 'DOC_NAME' TO CLIPDOC.CDX
  746.     INDEX ON DOC_DATE TAG 'DOC_DATE' TO CLIPDOC.CDX
  747.     INDEX ON DESC TAG 'DESC' TO CLIPDOC.CDX
  748.     DC_Impl(cScrn)
  749.     LoadFields( aApp )
  750.     DC_MsgBox('Done!')
  751.   ENDIF
  752.  
  753. ENDIF
  754. oBrowse:refreshAll()
  755.  
  756. RETURN nil
  757.  
  758. /* --------------------- */
  759.  
  760. STATIC FUNCTION _DialogWindow( aApp )
  761.  
  762. LOCAL oDialog
  763.  
  764. IF Valtype(oDialogWindow) = 'O' .AND. oDialogWindow:isderivedFrom('XbpDialog')
  765.   oDialog := oDialogWindow
  766. ELSEIF Valtype(oDlgWindow) = 'O' .AND. oDlgWindow:isderivedFrom('XbpDialog')
  767.   oDialog := oDlgWindow
  768. ENDIF
  769. RETURN oDialog
  770.  
  771.