Setting up XFRX previewer
Default settings
A new objects-type property has been added to the XFCont, cntXFRXMultipage and frmMPPreviewer classes:
Name | Description |
---|---|
cLanguage | Language shortcut (csy, sk, de, fr, tr, it) |
cImageFolder | Folder with images for XFRX preview. Subfolder 32x32 contains icons 32x32 px. |
oDisplayDefaults | Display default options. |
oPrinterOptions | Print default options. |
oExportOptions | Export default options. |
oEmailOptions | E-mail default options. |
lVFP8 | Switch for backware compatibility with previous VFP versions in VFP 9.0. |
nDPIPreviewQuality | DPI preview quality. Default value is 300. |
iOpen | Controls the visibility "Open" item in shortcut popup, button in toolbar and embedded toolbar. |
CSS | Users's CSS file for styling bookmark's and search's list. |
CSSBase | Base XFRX CSS file for styling bookmark's and search's list. |
Object oDisplayDefaults has the following properties:
Name | Type | Description |
---|---|---|
StartingPage | integer | The 1st page to show in the previewer. |
DefaultOutputFileName | string | The default output file name when exporting from the previewer. |
PagesPerSheet | string | Encoded pages per sheet layout value. |
ZoomFactor | integer | The zoom factor. |
integer | Background color of searched text | |
aFindString | array | A array contains strings for highlight. |
array | A array contains strings which will be searched. | |
nOutlineType | integer | Outline type. |
nOutlineEngine | integer | Outline engine. |
number | Hyperlin decoration. |
Example:
m.loPreview = CREATEOBJECT("frmMPPreviewer") m.loPreview.oDisplayDefaults.StartingPage = 2 m.loPreview.oDisplayDefaults.DefaultOutputFileName = "invoice15_09" m.loPreview.oDisplayDefaults.ZoomFactor = -1 m.loPreview.oDisplayDefaults.PagesPerSheet = "1x1" m.loPreview.lVFP8=.T. && don't use XFRX#LISTENER m.loPreview.PreviewXFF(loXFF) m.loPreview.show(1)
Common methods and properties
Even though you can use different classes to provide the previewing capabilities in your application, all classes share most of the properties and methods you can use to control and customize them.
Controlling multi-tab preview features
The properties and methods described in this paragraph are implemented in cntXFRXMultiPage and frmMPPreviewer classes. The multi-tab features are not implemented in XFCont class.
Property / Method | Usage |
Specifies if page caption is visible for one report. | |
Call this method to preview the XFF file in the previewer. | |
Removes a page from the previewer. |
Registering an extension handler
The extension handler allows for extending the functionality of the basic classes without need of creating subclasses. All you need is to create a custom class, which implements certain methods. The custom class is registered with the XFRX previewer class (using SetExtensionHandler method) and the previewer calls the extension methods on appropriate events.
Currently supported event methods are:
Method | Usage |
---|---|
KeyPress | This method is called from KeyPress() method of xfcont class. |
ToolbarOnInit | This method is called from ShowToolbar() method of xfcont class. |
This method is called from PreviewXFF() method of cntXFRXMultiPage class. | |
This method is called from LastInited() method of xfcont class. | |
BeforeRenderPage | This method is called before rendering page of xfcont class. |
AfterRenderPage | This method is called after rendering page of xfcont class. |
USE demoreps\invoices ORDER customer LOCAL m.loSession, m.lnRetval, m.loXFF, m.loPreview, m.loScripts m.loSession=EVALUATE([xfrx("XFRX#LISTENER")]) m.lnRetVal = m.loSession.SetParams(,,,,,,"XFF") && no name = just in memory IF m.lnRetVal = 0 REPORT FORM demoreps\invoices OBJECT m.loSession * * the XFRX#DRAW object reference is stored in oxfDocument property * m.loXFF = m.loSession.oxfDocument * * initialize the previewer * SET PATH TO xfrxlib SET CLASSLIB TO xfrxlib ADDITIVE m.loPreview = CREATEOBJECT("frmMPPreviewer") * * setup the extension handler * m.loPreview.oExtensionHandler = CREATEOBJECT("SampleExtensionHandler") m.loPreview.windowtype = 1 m.loPreview.iTool = 2 && embedded toolbar m.loPreview.PreviewXFF(loXFF) m.loPreview.show(1) ENDIF DEFINE CLASS SampleExtensionHandler AS CUSTOM PROCEDURE KeyPress(m.loXFCont, m.nKeyCode, m.nShiftAltCtrl) * hotkey for print P (112-p, 80-P) IF INLIST(m.nKeyCode, 112, 80) m.loXFCont.Print() ENDIF ENDPROC ENDDEFINE
Showing / hiding left panel (bookmarks)
The left panel behavior is controlled by the iBook property:
Property | Usage |
Controls if the left panel should be displayed in the previewer. |
Showing / hiding previewer toolbars
There are two toolbars in the previewer control – one is placed at the bottom of the control, the other one is available as a floating toolbar panel, which by default docks at the top of the main window, or, alternatively, as an “embedded toolbar”. All three classes implement iTool and ShowStatus properties that control visibility of the toolbars:
Property | Usage |
The class name of the toolbar. The default value is “xfrxToolbar”. | |
ClassMainStatusBar | The class name of the status bar or embdded toolbar. The default value is “cntembeddedtoolbar”. |
Controls the visibility of the toolbar at the top. | |
Controls the visibility of the toolbar at the status bar of the previewer container. |
Displaying progress bar
Property | Usage |
oprogress | The object instance of XFRX progress bar |
USE demoreps\invoices ORDER customer LOCAL m.loSession, m.lnRetval, m.loXFF, m.loPreview, m.loScripts m.loSession=EVALUATE([xfrx("XFRX#LISTENER")]) m.lnRetVal = m.loSession.SetParams(,,,,,,"XFF") && no name = just in memory IF m.lnRetVal = 0 REPORT FORM demoreps\invoices OBJECT m.loSession * * the XFRX#DRAW object reference is stored in oxfDocument property * m.loXFF = m.loSession.oxfDocument * * initialize the previewer * SET PATH TO xfrxlib SET CLASSLIB TO xfrxlib ADDITIVE m.loPreview = CREATEOBJECT("frmMPPreviewer") * * setup the extension handler * m.loPreview.oExtensionHandler = CREATEOBJECT("SampleExtensionHandler") m.loPreview.oprogress=createobject("progress") m.loPreview.PreviewXFF(loXFF) m.loPreview.show(1) ENDIF DEFINE CLASS progress AS CUSTOM PROCEURE updateProgress LPARAM m.ta,m.tb, m.tc WAIT WINDOW NOWAIT "Page #: "+ALLT(STR(m.tb))+" Report #: "+ALLT(STR(m.ta))+" ("+ALLT(STR(m.tc))+"%)" ENDPROC ENDDEF
Using frmMPPreviewer class
This class serves as a standalone (fullscreen) previewer window. All you need to do to make it work is to pass it a reference to the XFF file to preview, using the previewXFF method, as described in Controlling multi-tab preview features paragraph above. (If you are not sure how to create a XFF file reference, please read chapters 17.0: Initializing the XFRX#DRAW class instance and 16.3: Creating temporary XFF files). Here is a very simple “Hello World” example:
LOCAL m.loPreview SET CLASSLIB TO XFRXLIB.VCX ADDITIVE m.loPreview = CREATEOBJECT("frmMPPreviewer") && create the previewer object m.loPreview.previewXFF(m.loXFF) && loXFF is XFF file reference m.loPreview.show(1) && show the form as modal
Make sure to set all properties (like iTool, ShowStatus, etc.) before you call PreviewXFF(…) otherwise they won’t be used.
Using cntXFRXMultiPage class
- Add an instance of cntXFRXMultiPage class (of XFRXLIB.VCX) into your form. Adjust the size of the cntXFRXMultiPage class object container as you need. The previewer, including the status bar, icons and scroll bars will be displayed in the container. If you resize the container in runtime, its content is automatically adjusted.
When the form is about to be released, the cntXFRXMultiPage class instance needs to do some cleanup. To enable that please call the class instance’s clearLink() method from form’s destroy method:
PROCEDURE Destroy Thisform.cntXFRX.clearLink() ENDPROC
When running the form, make sure the XFRXLIB.VCX class library is referenced in SET CLASSLIB command:
SET CLASSLIB TO XFRXLIB.VCX ADDITIVE
- Call the PreviewXFF method to preview a XFF file, as described in Controlling multi-tab preview features paragraph above.
- By default, cntXFRXMultiPage is using an instance of the XFCont class for each page. Should you like to make it use a different class (eg. a subclass of XFCont) put the class name to the ClassPreviewPage property of the cntXFRXMultiPage instance.
Using XFCont class
Add an instance of XFCONT class (of XFRXLIB.VCX) into your form. Adjust the size of the XFCONT class container as you need. The previewer, including the status bar, icons and scroll bars will be displayed in the container. If you resize the container in runtime, its content is automatically adjusted.
When the form is about to be released, the XFCONT class instance needs to do some cleanup. To enable that please call the XFCont class instance’s clearLink() method from form’s destroy method:
PROCEDURE
PROCEDURE Destroy Thisform.cntXFRX.clearLink() ENDPROC
When running the form, make sure the XFRXLIB.VCX class library is referenced in SET CLASSLIB command:
SET CLASSLIB TO XFRXLIB.VCX ADDITIVE
VFP 8.0 approach
In VFP 8.0, there are two options how to preview report in the previewer. The options differ in the calling mechanism, although internally they both work exactly the same.
Generating the “CNT” output type
The approach is using the standard syntax of calling XFRX, without explicitly using the XFRX#DRAW class (although it is used in the background). You cannot open an existing XFF file with this approach – you always need to run a report that will be previewed.
Do not send anything as the output file name
Use “CNT” as the output type parameter in the SetParams method call
Call Reset method of the previewer container class
Call SetOtherParams method of the XFRXSession class instance with the reference of XFCont instance as a parameter
Example:
LOCAL m.loSession, m.lnRetval loSession= xfrx("XFRX#INIT") m.lnRetVal = m.loSession.SetParams(,,,,,,"CNT") IF m.lnRetVal = 0 * * we are assuming the XFCont container is * available as thisform.cntXFRX * Thisform.cntXFRX.reset() m.loSession.setotherparams(Thisform.cntXFRX) m.loSession.ProcessReport("report") m.loSession.finalize() ENDIF
Using the XFRX#DRAW class
The advantage of this method is that you can preview an existing XFF file – the XFF file is opened and “converted” to “CNT” output type via the TransformReport method:
Example:
LOCAL m.loSession m.loSession= xfrx("XFRX#INIT") Thisform.oReport = xfrx("XFRX#DRAW") IF Thisform.oReport.openDocument("file.xff") Thisform.cntXFRX.reset() m.lnRetVal = m.loSession.SetParams(,,,,,,"CNT") IF m.lnRetVal = 0 m.loSession.setOtherParams(Thisform.cntXFRX) m.loSession.TransformReport(Thisform.oReport) ENDIF ENDIF
VFP 9.0 Approach
In VFP 9.0 the logic is the same, just the syntax is a little bit different – the reference to the XFCont object is copied to XFRXPreviewer property of the XFRXListener class instance and then previewReport method with the XFRX#DRAW reference as parameter is called:
LOCAL m.loSession m.loSession= xfrx("XFRX#LISTENER") Thisform.oReport = xfrx("XFRX#DRAW") IF Thisform.oReport.openDocument("file.xff") Thisform.cntXFRX.reset() m.loSession.XFRXPreviewer = Thisform.cntXFRX m.loSession.previewReport(Thisform.oReport) ENDIF
Hyperlink decoration
A new property has been added to the XFCont, cntXFRXMultipage and frmMPPreviewer classes: UnderlineHyperlinksOnPrint. You can use the following values:
0 - no decoration for hyperlinks
1 - display "normal" hyperlinks in blue, but do not decorate custom event hyperlinks (green)
2 - (default value) decorate both blue and green hyperlinks
To support this in the print output, the PrintDocument method of the XFRX#DRAW class has a new parameter, tnUnderlineHyperlinksOnPrint, with the same values and logic.
Custom buttons
This feature is implemented using the extension handler mechanism: A new method is now supported - ToolbarOnInit, which is invoked at the time the toolbar is initialized. In this method the extension handler can add new buttons to the previewer and their click events can be bound with other methods in the extension handler. A new property is now supported, too - oPreviewContainer. If it is available, the previewer will automatically fill it with the XFCont object reference for easier access to the previewer properties in the custom buttons click event methods.
Example:
USE demoreps\sales LOCAL m.loSession, m.lnRetval, m.loXFF, m.loPreview, m.loScripts m.loSession=EVALUATE([xfrx("XFRX#LISTENER")]) m.lnRetVal = m.loSession.SetParams(,,,,,,"XFF") && no name = just in memory IF m.lnRetVal = 0 REPORT FORM demoreps\sales OBJECT m.loSession * * the XFRX#DRAW object reference is stored in oxfDocument property * m.loXFF = m.loSession.oxfDocument * * initialize the previewer * SET PATH TO xfrxlib SET CLASSLIB TO xfrxlib ADDITIVE m.loPreview = CREATEOBJECT("frmMPPreviewer") * * setup the extension handler * m.loPreview.oExtensionHandler = CREATEOBJECT("SampleExtensionHandler") m.loPreview.windowtype = 1 m.loPreview.iTool = 2 && embedded toolbar *m.loPreview.iTool = 1 && standard toolbar m.loPreview.PreviewXFF(m.loXFF) m.loPreview.show(1) ENDIF DEFINE CLASS SampleExtensionHandler AS CUSTOM oPreviewContainer = .NULL. PROCEDURE ToolbarOnInit LPARAMETERS m.toToolbar LOCAL m.button IF m.toToolbar.AddObject("mybutton", "commandbutton") BINDEVENT(m.toToolbar.mybutton, "click" , This, "ButtonClicked") m.toToolbar.mybutton.tabindex = 1 m.toToolbar.mybutton.Visible = .t. IF UPPER(m.totoolbar.BaseClass)!="TOOLBAR" m.toToolbar.mybutton.left = m.toToolbar.cmdQuit.left m.toToolbar.cmdQuit.left = m.toToolbar.mybutton.left + m.toToolbar.mybutton.width ENDIF ENDIF ENDPROC PROCEDURE ButtonClicked LOCAL m.lcString m.lcString = "This.oPreviewContainer.Name: "+This.oPreviewContainer.Name+CHR(13) m.lcString = m.lcString + "current page: "+TRANSFORM(This.oPreviewContainer.nPageNo)+CHR(13) m.lcString = m.lcString + "XFRX#DRAW Object: "+This.oPreviewContainer.oXFRXWriter.Name+CHR(13) m.lcString = m.lcString + "Page count: "+TRANSFORM(This.oPreviewContainer.oXFRXWriter.PageCount)+CHR(13) WAIT WINDOW m.lcString *This.oPreviewContainer.oXFRXWriter.PrintDocument(...) *This.oPreviewContainer.oXFRXWriter.SavePicture(...) ENDPROC ENDDEFINE