Files
sibo-playground/docs/4-03 XADD Reference 2.11_djvu.txt
2026-07-06 18:30:29 +01:00

4599 lines
120 KiB
Plaintext
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
SIBO 'C' Software Development Kit
XADD REFERENCE
Version 2.11
February 3, 1995
(C) Copyright Psion PLC 1990-95
All rights reserved. This manual and the programs referred to herein are copyrighted works of Psion PLC,
London, England. Reproduction in whole or in part, including utilization in machines capable of
reproduction or retrieval, without express written permission of Psion PLC, is prohibited. Reverse
engineering is also prohibited.
The information in this document is subject to change without notice.
Psion and the Psion logo are registered trademarks, and Psion, Psion MC, Psion HC, Psion Series 3, Psion
Series 3a amd Psion Workabout are trademarks of Psion PLC.
TopSpeed is a registered trademark of Clarion Software Corporation. Intel 8086 and 80286 are registered
trademarks of Intel Corporation. IBM, IBM XT and IBM AT are registered trademarks of International
Business Machines Corp. Microsoft and MS-DOS are registered trademarks of Microsoft Corporation.
Apple and Macintosh are registered trademarks of Apple Computer Inc. VAX and VMS are registered
trademarks of Digital Equipment Corporation. Brief is a registered trademark of Underware Inc. Psion PLC
acknowledges that some other names referred to are registered trademarks.
CONTENTS
M Van CeO ue tO an seis a sccazg oS vos ca casa sanseacssiccatceases oattesostveisavdesaatesciseens tee Sctacdin ieee ES 1-1
MISIN ADDClasSes teseic:t 9 cbasats tec cores Aad Oi cciea sth ohaals eae cect cg mee ee 1-1
DOTA Ns 5 8222s gest GE Neots te cue, Senses ics aoa ged dees Mae he get cace anita, SOR ct 1-2
INAMIES 5 sus ctaresranesss tsspasteesacttat scoala 2 tawileet vases tesa eee aMie et m 1-2
Method fumetion prototypes . sccc.censiniedsccceavseasovcteeoesiasdvatdeaveee nl Oe aA cs >. 1-2
Tile MOP edvie- SYM x. 2202: cs, sors cyeue bndiacnaeachcoreeavees SUA weld, ote ke MN 1-2
CTBSS eA TATE costs cys cainaageedes op uacshuesses tony es outesdena leans aa RN NM, 1-3
GlASS METAL CW an acssseineqerbiascne ss Gverciiisanasiusesyecdc ee ac ee 1-3
Siuichuredse ror Recovery 271... 2065 see tvssts da cdsssnd ce eestlonesiniaseteeseoteteedene: Galen cach, samtecks 1-4
Use: of theip leave mechamisinn...5- cic) ccndssscscoecsksstetvacsccectuseatvitvessecsscaceecisatgestiasievevescs 1-4
FPBIVIC TOMI daeg tae gaatn sscec ance uae vaesrt va acd inseie tacts aha RON ee 1-4
SO OO eo
2 Brant Preview CLASSES secs neaisesonsseeosccctssenscasine yuseati cases besa satesivesestosehtisesies tina Ae 2-1
BPE CUT GOS acs overs p tin cds toc Shar peeissst cousin 'eatedib Gattasos see Anan coun tase eae Ne oc 2-1
Classidid gram «0... icics tects ances sxereetireicerestrstee eet oNo TTC e aT 2-2
TS PPRUIN TER oes feet insect ils acd docu rin de vrueha canes tery seta oot tis cc nae oe ets eo 2-2
ELAS 5 CEPT OM 36s sasisiived Ae cosstcatans wp eagencesst AG dees Maced tcciaadesiwea orivatiene atone See 2-3
PRODGMY cxdis cactstaas sass Phissn atau ca naceectinns es ited vpicas viaabccsiilings tla piece hag d MME es otis 2-3
PIE V DGG eno dS scictecc ht iatie eects gis Manes tere alee chat ce tren Beeee pace fs 2-3
DGS TROY ida ante carta Irenaita ac tesa abet ee Mat cl tac eh to A Eh oa eh, OG 2-3
TIWELGNS sc Sietateestczisiguse sean sayac sonicated luli a ticked ecas edithnss pdag athe amie ah oxo eRe ea a 2-3
BRYN UE Wide setcay oy ccutatstd tedtteiesssccsesa ee enn Mya lol Ne Gioia a ene ee eet on. 3 2-4
PASS He Mtg ENON 35st co eta ncadeseeitrlcd vines Mecsas Shag AON AMRE ets 2-5
ROBT eh oieta Secenh et tncasctaista ctukate cS ENG sik vaste pieat shes dotoga cei tealuieie: cone pula ng 2-6
ESOMICES uta nec ee ee ete ann tt iettiiiae 2-10
TPIS V VEE Ws OV CUA aon tn chans Ove ase Se vasdistt nas cucusasac ch aod easier imcacteanvstvar tive Machen, 2-10
WD OSOY 9 erase BRITE se oak erate es caldulet Mth ita can Lah Sayan ha le ek te St ete 2-10
Wann ese RES Sse c2etac a at oa cetera sade cas cevadicssdenabsad Mee teats etl che clacton 2-11
TOGA cs cnthatacwcst ist oll wages eases less, wena ta Mei lava elaohd pubs enceasan aaa es AO 2-12
SEE GISPIAY MOE fe :caa2, Fete teciasccncisaats stop dan aves goth saa settee anes due MO ROE ke 2-12
PAVED MTS a sass ah aan eua les taal cae abavaittandinetAosaete cata saeuennrenican mavcsooce ith cite aeeics 2-12
COMPpleMOn Cal DACK: occa jcsdvusns-cishsesseaeayieoneodivins nanan sie aaumncanlas Sc ilecieso state 2-14
CoOninpletroni:c all DAC 2.65 cata ncn-se-ecgst cogent pyseed sonata si avdovpactseestecustuation at actibeacssale hes 2-15
MiG Geman S:5728. 6 Stata oaise Nata es OI i eco ee eth Mae Pe ete a 2-15
MOVE TODA vcev certs cecasts Gist dint orks hateraua oa obtain Bias tdi Gnas dan teed amieade ee eae 2-15
Tine oy fees wes. pees tpesnatesasr vacate catego tastier, Slabs echo sheteetatiaiad SR eam sco otis! 2-15
RS VAINE Ostet nese ac so aad a OT a asuhsbat oud oa ee ie ta ce oe een 2-16
TASS GEMMA OM rates vis Haste sat on dstah oes ctec ceacna hance adel aaah oa teh teak 2-16
TOP GIy eM sere cardiandclabinttidnatharwntieae we eai cuca ada Ravinia eA ein CER, DARA 2-17
WRESO MICO Sin aScrascreeecesce dite ve pctasates vy tail cas eae eater ae tatiana eV: 2-17
RW DINE O iC BO sas inch Best tuebts casesaiancauva ioe ao decteaiviatiloalown taba sco aes tacengee 2-17
1 Ly) C DES aren y A oN ean RPE ND EOE OO rte ERR RED Anas aaa 2-17
DOUUIMDER OF PARES sa: erat crscatce leacivocnatsravcioer Denso vidas tawdddnslaeseotatkoon ec ookeosnacde atdes 2-17
DNA W ie, cress scan ek Mts MEAT, Muiiabe gee vii sc oe ta et ne maa 2-17
CEVASS se TIME ON cata tts os Mana ben aragthGoindicls luo dessMndsleniessased adenec' ei, We ee gk oer 2-19
PMO PUL cose estat: d2s hu panies ed cupetoenee pesevte vise testnasicedce sant ccxah sees cea ae aa 2-19
BROLIN CES 5c cs races auasatgeiaussrs isan acacidet mncsrauvittalaacat toa emia ae ae ee 2-19
PRY PAGE re MOds izle 2 bic cetenesd, At teacd cde UB aa eaeTks vecige nari eee helenae 2-20
MNO TANG EE Ws Siesta te tees ache th ce EN Peres iti io ee a Serre Leesa NEDEIR Sj oatrh 2-20
Ma Week sscessevaisittd tee ine peas intense eGcieeatent a Mh a een ee Re Re eta 2-20
PROMI S Gots si cseeho Meche tacraasetes canadtyaaulscees nadeasaat halted cabs ae adocsisnc ee le Peaks 2-21
PUTA LIN Seca cs ccs ie cast wig cpdcanbsean ee a eitaa ab atactase ie css nenassd hese Rude heist ananete 2-21
RVC OMIM 4 sucess cesessuniy puashaclultee ts ite was aasete statue tans Rlgettee repceatne ala wsia cas wy, uate 2-21
Ae TSS yA CHIMAENONE dc ccc tesa cides a osece ah das Oavncl otis viandrascaus meee each ee edhe. Deed 2-22
PU OI Scrat cs Ua vianntencl aida hh ae GAC atigets on ot Sees Mua cchins tact stasuese meals 2-22
FPSO COS enuf wwszrns Mo buvanuacens Pics sts We azas neuicna tenant sees aa ep can ee 2-22
PRY COMM Methods 2 tannins Aamo atid nese cea uti esata 2-22
Ta pet LIS 6 25 scarce soe: castndaess ende var tae Soceses sei rsniienlnidinchceseed deem: Oe ok ee ee 2-22
GL MGM EMD LENE 22h caida loca savant sins vores waclvcssaate eesti adatercied meee. 2-22
ERIE OPPMCAUOM 9g soya sets ccttcskatteetes attiss edd ads heal oe ee ss 2-23
IPA ses sak Bi hiantea cai nap cans hoe bugiasstityase vedas ce ayers krack oe OI eM fe OR 2-23
MOG BLE MAR SANS 5s Soveiyb ts siecose ice ywlgssayegiahyacasvencescaTsanaviiotsa lac ckvs ciel SR oes 2-23
Launch Preview options dialog ............cessscsssssssesesssssssssessecssesesesssessesesucsessssesssecscseasans 2-23
Launch Jumip to. page lala sc. aiesos2dcass: doAaiasasnlus tavensreotpaaseaavane@ccost tatecteesa ns 2-23
ERIDPMIME PLEVIEW sncceh et ieestc ctor esate anal Gotti tease os sentence akc lars 2-24
PR VOR TIOINS TOG ics cas couse bspeshaet sta sign telecastaxcRiaresasadsiatdh dist os desae eee ROO teers 2-24
TASS GE LIM EMOM cts s5, dese x vacua loc ecoacuseonavteSea cvedtaecds cui vaoahne ecgetices A Peecvede nas esecee, , b 2-24
PL ODOREY Seccrscsaiee hiserbscpssbcvon tr tases arstaslavertvsonlecous seeing basmeianee tent ie Gawain a 2-25
FR SOUE COS cae saccneit canes rst re eggs nat are sassy. <t-esgics sn facuessanconseatasclssdeapsitvsk are ae Oe 2-25
PRVORTIONS: DEG mretnOds:. i ssc.is 26 Shieh canst eaenetesan in aatacetae et ius 2-25
ID Yrarnic ally ANITA MSE sets. ccicsadirsec aden aeds aust eotsaioieh et eae ket eee ehaes 2-25
TAN GIG Key WAU is ccas oc eivciascacatsta yh iaiee x scsavhctateNerauiivaviens bed aceerareae adore te eee. 2-25
EY TONE SUES fo ecpedesabsttvatec ee scaeis caer eaten ear aarateed, solccieie e Aceot caeite acthc 2-26
CRASS AG PAINTED css er eea dca as tvac esky teaas ye sas alee sass wre duct twet cues ie twee Re ors Manes 2-26
PROP RUEY <ccaustshd Gators tease evs ia suablanssn Stele 85h ivnerna fcainateeatbedagieeests tice keene Mt aie 2-26
PRES OUNCES 4.02 aeciia nist dopants taster int cater, cainrs aia tanusaics Sattar Ca ivaashvetign Semen a8 2-27
PROV JIMIP aI 1SG Meth OGS asi ciias hretvesninas a ade dete oluind tee sen Sidharth eb 2-27
Dyribraric ally Waa MSC acess puyacdtarsdechaaceseuscutziianien- dacisbeasieacn ds aecacinadeds wiekecu Maceo 2-27
Plan le Key iam sista laisse Gas daguetect Vent ne pieaih ees atic Dia eet pa eee tely, mao 2-27
5, Calendar Glasses 23,202.25. aictcpinccctiastores-ueasossgesadinons nates auachtoaR tclasiithaed. vi evckodaaw el hic ee 3-]
PTS CUPS OLS itis cain iaa delet atoasctaedsais ai taaadalesntloarncatea Wau Mteu as iedehcuad awe eetahees 3-1
MLAS Ciaran Acsloraiee svat et Ata caves ac au Wecesleantad a grea nceialce micas mites: 3-1
ROPING WIN eaten satis case taste reettanuataatteea tivity Reed neha a meme ) SOME 3-2
RVASS AST UEON 9 22 ccesnacs Seed ecas evans peta stitaaddualip tiatinanids Ha eteadladoc a ate ero aot eae 3-2
IPO POLY ces cep coeds ci iasnicev casi cataean tacit naa dus euwtusivecaateaiietanes wan ane uieh Uae ae Ae 3-2
CAE TIVUG WIN SOS is epktsas spd ost as acs saedsn stele ucts t Rs patee desks ooh at, Deane RAE MENG ecco 3-2
Rednaw the: calendar sisibctcscis tao: tcscctsccdss cious reluiasescsavlactugpianatenietasee vind we haces 3-2
PTL WING 2 sacha snceuh apt ctl t icra tea tae tc cian ae Ld cca a ete See oe 3-3
CTS She TRAIN la Ssctete Pa ceieies a Ooh ane oth es scat acetal edMievcasouctn oe Mom nla 3-4
EEO PETRY, 525 ta cosine eahacdoch sss sane haben aista tet tu aan ad ti apheh ad dt Racal tee tn 3-4
SAIL WIIN SEN OGS: coh actirassnanatesnupietnte ila Ai chatsacs nea Rn ee ea de 3-4
Diestysoy thtecal etna toy isi ce sedcc ected te sovaeatacyeolinsgesoesch oe pute so oe es see 3-4
MCIANSE the ealen dat seco h atescscaticl io latsecdemeravat wtruransscnniodeleagesmaccatinst teak 3-5
Plane a Rey ress: coisa ligt ecicgcnexsactonsaien ee ettasesgch dhdessresush iecebeneciee ten Mate ngtthak Mocc 0S 3-7
SETS CUNO mnt Mabe S51 tas anwies oltelsucdh abu tbawdavog cisaiybin cia aise Vere aeiadiidennsd RR Mee 3-9
BP WASIS Os fess Avegeasvices eater cstyd seasteausencoioty picts nda cal eaten immu MEMS ee wcts 3-9
Examplescr oss Mee Aiact tit sa ak eo hte kee hy) ae Ce 3-10
Creating. a CAL WIN Componentii.3 tue aedatesviadiea cts earn ick icudhilee abe. 3-10
Plandlinprkeypr esses: 26 c.ieMees octet che hans ies ren essa eae ga ale 3-10
or eee
4
Altoniatic Test System Classes isescdise.cc:sisscsdeavechucissinanectastioessitnuasssciacresdeincisien le hon 4-1
PTE CUIS ODS sccrcsres Cue, Cactl any esteet esad enw Baca Sed ie eA cotta 4-1]
NMG AI Fe ssc, eat cs Durie te orcipatctoeadsM s ttsnck OY me oe na stg 4-]
POLSON ee Natit A tase ha bene a betes Eat at eats (eatin Meee a le oe 4-2
CS NaSSAEAMEOM Fe secectaccoapatort ces telat ae tohiocas a ek tel ce cen OG oe Ue ate Manee 4-2
PLOY RC Cie ty all od nthe hati tee Le ons, Sam Ost eA ola!) seaman hans Meg 4-3
URINE Y SIMU CLUES jedcesitint eM cals OR A oe re. ct Wee, et Ve ee als 4-3
POTS S Vette OS 26 2dr todays Zadenaaca dia auto chee Maca Meena ees 4-4
EMCI ALIS iaseeeh ots os ac aceon eae Masten dial et iene ea eee ea eae 4-4
PIOCESSra A TS ESSERE i. .cin, cee saystytetcacecapus exis voskesandssutsd tsedien @racialseivaba thee dee ace 4-4
BY OCOSS GR ERDOR 0B sMaitti rah sti telicvasustect ct eens rctkactr aon ita cnet ape ee dette 4-6
Bree Miter Process MieSSa Ber. 5-24 c.suis ccsiertt.teivecssovsrvnay auelss cvansdoveosaiadousica ion ces Meboacaats 4-6
RGDONt a KEV PEESS 03 ciccicc-c cuasieecrenientas asvasrntion aiefidiereth alee noah oesttenabnecad, eee 4-6
OT SS BUI M ss Sis cttecatas Sensei segtita tt anv Me cM Ati ite on tem Gh eS eo a ie NUS 4-7
TASS A CTUNT ON fio css dearespastanid cesta: dubale cores cocaabivyaeiioit dudwpeatslastaecd Lat ticren tu inte ton, 4-7
PORE LUY 28-080 sap Oconee aladieales Mavcace etal st dngite tar Me al, ian iihee yee rar. 4-7
PT eM ane GOS Be Gite. cree ienitettba, ttre te OE son nlp as aidodsae amen iatee tol oe oes 4-7
ANGLAIS rs eco ae aati nets ra nc te ome, Pita ace anccadle 4-7
BIGCeSS COMPIENON 2 5: ituavact ce tesitca Mantes ue pied cd cieice -apschaas Noclon, Suatrctoriosacctyee, 4-7
5 Additional Active Object Classes
ovsavensoosesessoneasentnassnssovescsasseussvosscsusssesessacnsacsarscsscocssnssccenseacescensas 5-1
PRCCUPSORS M ciacese conti tia ISM ates sans iatlincte dnd Untualinincide: wcslstiatnaddecgedinee 5-1
4. CIS LC UE Toa: eRe ear Peo na SOO RE 5-1
TO OTN sry con ae avis alse sk Rat consol Meets wea dea ba a al easih Sc tanta 5-2
FASS AC MANION y oe caecesit eo uncenteren cine erased robe de eesti eq tot bea hdc eons 5-2
TENOR eee Fa cee bac a dancer ted pau ohsghiav is OSs ob boos Homhoc 5-2
LOGONA Methods sccraccsine faiad aps Ate cuca d basalt Ridhadedope vscllRa doedec tua eceaantameecteatle 5-2
PGI © cease vactseechi teas S atrssreib aaa eee teas Ocak iad Maa ieg MpcStar At ean tn 5-2
NS Be RS INES a cas wiasecaaacha sas ok ana alnencenat tee eee ea dtad ca sunnier corto tegtacsed he ache 5-3
CANCEL TeQ US tit hais sec sctinn taei satiate, Wala dees eet os pes geno chi tgs 5-3
Report process temmimation .c.sscssssancueveasssunchacivssevataslouessbives dseedechaeuvscacscssolccicescaccecy 5-3
TINT OBI ree ei le acon snarls Dale Ai eckson Meche alalancleS cs Bien auton asst 8 5-3
CASS LOMO 53 dons yodassc As caeasgsdasgend eiivececst nach caarsetuaadell ail ahid rcessia tieccae aca Mt 5-4
BY GPE UEY seis cits crates savcawscastavasediehccaueae eitina unit deo hlag cates IM ie ck eects iM att acne 5-4
WIND OAD tise Od Sica ccssscseniacesteiclen abot aianh tte a Sates e Soice ola an MT 5-4
eS) 5-4
NOMS estas Pte ten nk salinsesctidaas ace epesanonesicasd sscesaex taki payeatesack ie tabaoudteecsdatea ts eceton sed 5-4
PROCESS COMIPIE TION ia, cirssietd stabs aca Suadh ccstsaacsth cbcasatgnou deta hiutesaoeostss Shee devel faldatnachet 5-4
CHAPTER 1
INTRODUCTION
This manual is a reference document for Psion's XKADD library. It provides a guide to the library and
documents the classes, methods, properties, inheritance hierarchies and other information essential for
understanding and using the library.
It assumes familiarity with the concepts of Object Oriented Programming.
The Object Oriented Programming Guide is a useful pre-requisite as it provides the necessary background
to Object Oriented Programming as implemented at Psion. It can, of course, be read in conjunction with the
XADD Reference manual.
The XADD library is supplied as the xadd.dy/ dynamic link library in the ROM of the Series 3a and
Workabout machines. It is not present on Series 3 machines.
Because of their different screen sizes, the Series 3a and Workabout machines contain slightly differing
versions of the XADD library. The only difference, however, is in the implementation of the cawin
calendar window class. On the Series 3a , this can be set to display one, three or twelve months, but on the
Workabout the display is restricted to a single month.
XADD contains classes that extend the functionality of the HWIM and FORM user interface, notably to
provide print preview facilities.
Some classes in the XADD library are designed solely for internal use by system code and are not
documented in this manual. The undocumented classes are:
OPRINTER Implements WDR printing for OPL.
OHELPDLG Implements Help dialogs for OPL.
RUNMEMO Implements Memo editing from the Agenda application.
IPCSTAT Used for inter-process communicaton of status data during Memo editing.
Some of the documented XADD classes contain features that are intended only to be used by system code.
Any feature that is not explicitly documented as being usable by application programmers should be
considered to be for system use and should not be accessed by application code.
Using XADD classes
An application (or DYL) that either subclasses or creates an instance of an XADD class must declare an
external reference to the XADD library (and the OLIB library) in its category file. If, for example, an
application's category file has the name myprog.cat, the content of this category file must start with the
following lines:
IMAGE myprog
EXTERNAL olib
EXTERNAL xadd
This ensures that, amongst other things, the defined constants representing the external category numbers
for the XADD and OLIB categories (in this case, caT_MyAPP_xapp and CAT_MYAPP_OLIB, respectively) are
available to application code.
XADD REFERENCE
eS eee
Since the XADD library contains extensions to FORM and HWIM, it is likely that access will also be
needed to these libraries, so the category file will also need to contain exrERNAL references to one or both
of the FORM and HWIM libraries.
In the source code of the MYPROG application, an instance of an XADD class - say, of Locona - would be
created with p_new (or £_new) as follows:
p_new(CAT_MYPROG_HWIM, C_LOGONA) ;
-If myprog.cat defines a subclass of an XADD class (say, the class susLocona) this would exist in the local
category. An instance is created using the local category number caT_myproc_myprRoe, as follows:
P_new(CAT_MYPROG_MYPROG, C_SUBLOGONA) ;
Similar consideratons apply to instances created by means of £_newsend.
a SS a ee ee a aaa
Notation
Names
Except in class diagrams, a class name is always given in upper case, for example PRvvIEW.
The method name in the title line of the description of each method is the defined symbol for the method
number, without its leading o_. In the body of the text this name, in lower case letters, is used to refer to the
method function (or more simply, the method) whereas the upper case name refers to the corresponding
message. Thus, an object's destroy method is executed when the object receives a DESTROY message.
Method function prototypes
The description of each method contains a function prototype that specifies the nature of any return value
and the parameters with which the method is called. The parameters exclude the object handle and the
method number.
For example, a method for the class prvview with the title line:
and prototyped as:
INT pvv_done (INT event) ;
would be invoked by, for example:
p_send3 (hand, 0_PVV_DONE, PAGES _DONE_PAGE) ;
where hand is the handle of an object of the class in question.
This corresponds to a method function declared in C source code as:
METHOD INT prvview_pvv_done (PR_WSERV *self, INT event)
{
The © symbol
The enter and leave mechanism (which uses p_enter and p_leave) is commonly used to implement
structured error recovery. See the Error Handling and Error Recovery chapter of the Object Oriented
Programming Guide and the Error Handling chapter of the PLIB Reference manual.
Some methods (the vast majority of destroy methods, for example) can never fail and will therefore never
call p_leave. The title line of a number of the more significant methods of this type are marked with a
leading © symbol.
With the enter and leave mechanism, a call to p_leave should only occur within the protection of a
p_enter harness. If p_1eave is called outside a p_enter harness, the process will be panicked with panic
number 47,
The p_1leave mechanism and its use in method functions is discussed briefly in the section on Structured
Error Recovery later in this chapter.
SSS
1-2
1 INTRODUCTION
___, eee oh — Ne a aa
Class diagrams
To illustrate the inheritance and using relationships between classes, most chapters will contain at least one
class diagram.
The notation is a subset of that used by Grady Booch and described in his book Object-oriented Analysis
and Design with applications (2nd edition) with two minor changes;
e classes which are referenced, but not described, within a chapter (i.e. classes whose full
description lies in other chapters of this manual or in a different manual), are underlined,
¢ the diagrams do not distinguish between has' (aggregation) and using (client/supplier)
relationships.
Also note that ultimate inheritance from the root class is assumed and is not shown.
Class hierarchy
In understanding the structure of a specific class, remember that methods and property are often inherited
from a superclass (or superclasses).
While a class may contain new methods and property, it may also re-define methods inherited from a
superclass (or superclasses). Note that methods in a superclass can be what are known as deferred methods.
To help illustrate these relationships, each class description in this manual is accompanied by a diagram
which shows that class and its superclass(es) in hierarchical order. This diagram is placed at the beginning
of the class description.
The diagram consists of a series of adjacent columns. The rightmost column represents the class being
described and will be marked by a double line border while the column to its left represents its immediate
superclass (if any) marked by a single line border and so on up the hierarchy. Each column is headed by
the class name followed by two boxes; the first lists that class's property and the second lists its methods.
Deferred methods are separated from the preceding methods by a blank line and are printed in italics. If a
class re-defines an inherited method, the method name in the appropriate superclass is written with a line
through it.
For example, the following diagram would be included in a description of class cccc subclassed from BBBB
which itself is subclasses aaaa.
a ieee 4
property 4
property 5
property _1 property _3
property 2
method_a methed—b
methed—b methed—e
method_d
method_e
In this illustration, method_a is supplied by the superclass aaaa, while method_b is replaced in class BBBB
and further replaced in class cccc. Another method, method_c, is introduced in class pass but replaced in
cece, and so on. Note that method_u is a deferred method.
The roor class from which all classes are derived is assumed and will not be shown in the diagrams.
Methods and property inherited from a superclass will be described in the appropriate class description.
XADD REFERENCE
Structured Error Recovery
As mentioned earlier, the enter and leave mechanism is commonly used to implement structured error
recovery.
Use of the p_leave mechanism
In general, you should assume that all methods NOT marked with the & symbol (as discussed in the
section on Notation) are capable of calling p_leave, even if this is not explicitly mentioned in the method
description. In some cases, such as where a method calls, directly or indirectly, a deferred method (which is
supplied by a subclasser) it is not possible to specify whether the method may result in p_1eave being
called.
In the event of an error (such as out of system memory) occurring a method may:
© call p_leave, passing the (negative) error number,
e return the error number,
e either call p_leave or return an error number, depending on the nature of the error.
Some methods call p_leave (0), which has the effect of returning from the p_enter harness (with the
retum value zero) without signalling an error. This is used, for example, to provide a normal exit from a
deeply nested function call, without the need for a zero return value to be passed back through the chain of
calls. Intermediate functions in the chain may then be declared as vorp.
Some method functions that may call p_leave are declared as vorp. One reason for this may be that the
method forms part of a chain, as described in the preceding paragraph. If user code were to send such a
message within a p_enter harness, the value returned from p_enter would be indeterminate if no error
arose. The solution is to construct a shell function which sends the message and then returns zero, and call
this shell within a p_enter harness. The call to p_enter will then return either zero (if the method calls
p_leave(0) or it executes to completion) or a negative error number.
Panic numbers
See the Error Handling and Error Recovery chapter of the Object Oriented Programming Guide and the
Error Handling chapter of the PLIB Reference manual for a discussion of panics and panic numbers.
XADD does not have its own unique panic numbers, but panics a client that attempts an illegal operation
using PLIB, OLIB and Window Server panic numbers, defined in the respective SDK manuals.
CHAPTER 2
PRINT PREVIEW CLASSES
The classes described in this chapter are as follows:
the xPRINTER Class which provides the basic framework for both printing and print preview
operations. The xpRINTER class must be subclassed to be useful.
the pRvview class which implements print preview operations. A PRVvIEw object is used as a
component by the xprintER class.
the prvinro class which implements an information window indicating the number of pages being
print previewed. A prvINFo object is used as a component by the prvvzew class.
the prvpace class which decompresses a page image stored in an external memory segment and
then draws the page image in a print preview window. Multiple prvpace objects are used as
components by the prvvrew class.
the pRvcomm class which provides the print preview command manager. The print preview
command manager is installed by the prvvzew class.
the PRvopTIons_puc class which implements the Preview options dialog: this allows the user to
select the number of pages displayed during the print preview operation. A Preview options dialog
is used by the prvcomm class.
the prvsumPp_puc class which implements the Jump to page dialog: this allows the user to select
the first page displayed on screen during the print preview operation. A Jump to page dialog is
used by the prvcomm class.
Note that an application would normally only create an instance of the xPRInTER class (and perhaps
exceptionally, of the prvvzew class): the other component classes are intimately associated with the
PRVVIEW Class and are thus not expected to be either directly instanced or subclassed.
Precursors
Familiarity with the following topics will aid the understanding of this chapter:
the LPRinTER Class described in the Print Classes chapter of the HWIM Reference manual.
the paces class described in the Document Printing Classes chapter of the FORM Reference
manual.
the pRvppr class described in the Print Preview Class chapter of the FORM Reference manual.
the pi¢sox class described in the Dialog Boxes chapter of the HWIM Reference manual.
XADD REFERENCE
Class diagram
: rvoptions
dig: Ce pcdigics uf
oe Pees ae oe pod, i eal!
a — xprinter ; ¥, peeomin: ake a
XPRINTER
defer
wtab
lheight
width
subsqind
destroy
lpr_init
lpr_read
lpr_sense_buf_width
lpr_sense_text
The xpRInTER Class provides the basic framework that allows an application to perform both printing and
print preview operations using the services provided by the prrwrer and paces classes.
The xpRINTER Class provides a deferred method - the 1pr_sense_text method - which is supplied as a call-
back to the pacgs active object: this method must be replaced so that it obtains the next fragment of text to
print.
For further details of printing see the prinTer class in the Print Classes chapter of the HWIM Reference
manual and the Printing chapter in the Object Oriented Programming manual.
2 PRINT PREVIEW CLASSES
ee ENINT PREVIEW CLASSES |
Class definition
Defined in sub-category file xprinter.cl (generated header file xprinter.g).
CLASS xprinter lprinter
{
REPLACE destroy
REPLACE lpr_init
PROPERTY
{
WORD locked;
}
}
Property
xprinter.locked TRUE if an extra level of locking has been added to the application by tbe xPRINTER
object, otherwise raLse.
eae Se a ee eee
XPRINTER methods
Destroy
VOID destroy (VOID) ;
Destroy the xPRINTER object.
If xprinter . locked is non-zero, removes one level of locking by sending a ws_Lock message to w_ws with
an argument of FALSE.
Supersends a DESTROY message.
Initialise
VOID lpr_init (INT commid) ;
Initialise the xPRINTER component and, if commid is zero, start a printing operation, otherwise start a print
preview operation.
If commid is zero, adds a level of locking by sending a ws_Locx message to w_ws with an argument of TRUE
and then writing TRUE to xprinter. locked.
Either starts a printing operation, or initialises a print preview operation, by writing commid to
lprinter.subsqind and then supersending an LPR_INIT message.
If commid is zero, returns.
Otherwise creates an instance of the prvvrew class and initialises the pRvvrew object by sending a pvv_init
message with an argument of self, commid and the address of iprinter. pages:
¢ the se1f argument specifies that the 1pr_read call-back method required by the pacEs active
object is to be supplied by the xPrrnTER object.
® the commid argument should specify the method number of a print method in the current
application manager.
e the address of 1printer. pages is supplied so that it may receive the handle of the paces active
object which is handling the print preview.
XADD REFERENCE
PRVVIEW
wn_calc_position
wn_connect
wn_dodraw
wn_position
wn_redraw
wn—-sense—heip
wn_visible
pPages
pPrviInfo
pPageView
pOldMenu
pOldComman
Started
PrintMethod
hdone
mdone
NoPageViews
MaxNoPageViews
ScrollArea
Pv
destroy
wn_key
wn_draw
wn_set
wn_init
wn_sense_help
pvv_done
pvv_pages_done
pvv_new_page
pvv_Margins
pvv_init
pvv_false
The prvview class supports the print preview of one or more pages in a document. An example print
preview display is shown in the following picture:
The number of pages that may be displayed is determined by the dimensions of the screen up to a limit of
PVV_MAX_PAGEVIEWwS. The page images are drawn to the screen by an array of PRVPAGE components.
The text in the top left of the screen is an information window that indicates the number of pages in the
preview range. This information window is provided by a prvINFo component.
The print preview is carried out by means of paces and prvepr objects. These treat the pages as a sequence
of fragments or print elements each of which contains no more than one line of text.
The print elements are passed to the paces object by means of a so-called read-call-back: when the pacEs
object requires the next print element it sends an LPR_READ message to the supplier object. The handle of
the supplier object is passed to the paces object on initialisation and in turn must be passed to the PRVVIEW
object on its initialisation. This object is usually an instance of an xpRINTER subclass.
The prvview object is notified by the paces object of the completion of each stage of the print preview by
means of a so-called completion call-back: when the next stage is complete the pacss object simply sends a
2-4
2 PRINT PREVIEW CLASSES
RIN PREVIEW CLASSES
PVV_PAGES_DONE message to the prvvrEw object. This message is only significant when the preview is
about to terminate.
The prvvrew object is also notified by the prvppr object of the completion of each stage of the print
preview by means of a completion call-back: when the next stage is complete the PRvPDR object simply
sends pvv_DONE messages to the pRvvrew object. In this case the message updates the page count and then
updates the display to include any newly created page image.
The paces class is described in the Document Printing Classes chapter of the FORM Reference manual.
The prvppr class is described in the Print Preview Class chapter of the FORM Reference manual.
It is assumed that the global variable patcate specifies the handle of an instance of the cars class. In the
description of the methods this cars instance is simply referred to as the caTz object.
It is also assumed that w->am.appman.spare1 contains the handle of an instance of the printer class: the
PRINTER Class automatically writes its handle to w->am. appman. spare1 on initialisation.
Class definition
Defined in sub-category file prev.cl (generated header file prev.g).
CLASS prvview digchain
{
REPLACE destroy
REPLACE wn_key
REPLACE wn_draw
REPLACE wn_set
REPLACE wn_init
REPLACE wn_sense_help
ADD pvv_done
ADD pvv_pages_done
ADD pvv_new_page
ADD pvv_margins
ADD pvv_init
ADD pvv_false=p_ false
CONSTANTS
{
PVV_INTERPAGE_GAP 6
PVV_TOP_GAP 4
PVV_FOOTER_GAP 12
PVV_PAGE_SHADOW 1
PVV_SIDE_GAP 12
PVV_PAGENO_DISP GAP 60
PVV_DISP_FACING 0
PVV_DISP1 1
PVV_DISP2 2
PVV_DISP3 3
PVV_DISP4 4
PVV_MARGINS_ON 0x01
PVV_PREVIEW_SET 0x80
PVV_VIEW_MAX PAGEVIEWS 4
}
XADD REFERENCE
—— ee SSSSSSSSSSSSSsSssssssSSSSSSSsssssssssesssesee
TYPES
{
typedef struct
{
PAGES_CALLS Calls;
WORD PrintMethod;
WORD Sparel;
WORD Spare2;
} IN_PRVVIEW;
typedef struct
{
P_RECT Margins; Margin area
INT HeadTop;
INT HeadBot;
P_RECT Border; area in which to draw greeked page
P_RECT Footer; area in which to print page number
} PVV_PAGE_DATA;
typedef struct
{
PR_ROOT *pArray; varray containing page index into preview segment
INT NoPages; number of pages (so far)
INT FirstPage; zero for FACING PAGES, one otherwise
INT LastPage; =NoPages if not FACING _PAGES, or rounded up to odd number
INT PageOffset; page number of first page displayed
INT PageNo; current page no
PVV_DISPLAY Disp;
INT UseGrey;
INT LeftOffset;
INT PageViewWidth; width of PageView (pixels)
PVV_PAGE_DATA Page;
! Following are scratch areas used by all pageviews
UBYTE *pBitRow; current row from bitmap
UBYTE *pLastRow; previous row from bitmap
BMP_RASTER_ROW_REC *pRowRec; compressed data from preview segment
HANDLE PrvSegHandle; handle of preveiw segment
PRV_BITMAP Bmp; bitmap, loaded from preview segment
} PVV_PAGEVIEW_DATA;
}
PROPERTY 6
{
PR_PAGES *pPages; Pages active object, destroy on error
PR_PRVINFO *pPrvinfo; Info window
PR_ROOT *pPageView[PVV_VIEW_MAX PAGEVIEWS]; PageView objects
WSERV_INFO *pOQldMenu; holds ptr of old Menu when in preview mode
PR_COMMAN *pOldComman ; holds ptr of old Comman when in preview mode
WORD Started; set if am_start called
WORD PrintMethod; command manager print method
VOID *hdone; Callback handle for tdone & completion
WORD mdone; Callback method for %done & completion
INT NoPageViews; number of PageViews on display
INT MaxNoPageViews; max no of PageViews that will fit in view
P_RECT ScrollArea; area in which pages are displayed
PVV_PAGEVIEW_DATA Pv; property that can be peeked by constituent pageviews
}
}
Property
prvview.pPages The handle of a paces active object, used to create compressed page images
for all pages in the print preview range. For details see the Document
Printing Classes chapter of the FORM Reference manual.
prvview.pPrvinfo The handle of a prvinro object that provides an information window
indicating the total number of pages in the print preview range.
2 PRINT PREVIEW CLASSES
—.——S eS PREVIEW CLASSES
prvview.pPageView An array of up to Pvv_MAX_PAGEVIEWs elements, each of which may be a
PRVPAGE object handle. The prvpace objects are used to draw the page
images in the print preview window - the page images are read from an
external memory segment whose handle is stored in
prvview. Pv. PrvSegHandle
On initialisation of each prvpacE object:
the win. id property is set to that of the parent prvvrew object,
the prvpage .init.Pos property is set to the index of the object in
the prvview.pPageView alTay,
the prvpage. init .pPrvview property is set to the handle of the
parent pRvvieEw object.
prvview.pOldMenu The address of a memory cell containing the original command manager
menu data: this is organised as a WSERV_INFo resource struct.
prvview.pOldcomman The handle of the original command manager of the application: the
PRVVIEW Class installs a print preview command manager on initialisation.
prvview.Started Set to TRUE if an AM_START message was sent to w_am on initialisation.
prvview.PrintMethod The method number of a print method in the original command manager: it
is used to allow printing during print preview operations.
prvview.hdone The handle of the object to which the pvv_pacEs_pone method sends a
prvview.hdone message on completion of either a page or the document.
prvview.mdone The method number of the message sent by the pvv_pacEs_pong method on
completion of either a page or the document.
prvview.NoPageViews The number of page images displayed in the print preview window.
prvview.MaxNoPageViews The maximum number of page images that may be displayed in the print
preview window. It is set to four on initialisation.
prvview.ScrollArea Specifies a rectangle enclosing the page views and the page numbers.
prvview. Pv Contains information about the page views, as described below.
The pvv_PAGEVIEW_para struct is defined as follows:
typedef struct
{
PR_ROOT *pArray;
INT NoPages;
INT FirstPage;
INT LastPage;
INT PageOffset;
INT PageNo;
PVV_DISPLAY Disp;
INT UseGrey;
INT LeftOffset;
INT PageViewWidth;
PVV_PAGE_DATA Page;
UBYTE *pBitRow;
UBYTE *pLastRow;
BMP_RASTER_ROW_REC *pRowRec;
HANDLE PrvSegHandle;
PRV_BITMAP Bmp;
} PVV_PAGEVIEW_DATA;
The significance of the members of the pvv_pacEvIew_ pata struct is as follows:
pArray The handle of a variar object, used to store the offsets in an external memory
segment of the compressed page images: the memory segment handle is stored in
prvview.Pv.PrvSegHandle
Each offset is stored as Lone data.
OOO rr SSS
XADD REFERENCE
NoPages The number of pages in the print preview range: may be less than the number of
pages in the document.
FirstPage For internal use only.
LastPage For internal use only.
PageOffset The page offset of the first page in the print preview range. It is zero when the
preview range starts from the first page in the document.
PageNo The page offset of the first page displayed in the print preview window. The offset is
with respect to the first page in the preview range and is thus zero when the first
page is visible.
Disp The current print preview settings.
The pvv_pisp.ay struct is defined as follows:
typedef struct
{
UBYTE Mode;
UBYTE Flags;
} PVV_DISPLAY;
the Mode member may contain one of the following:
PVV_DISP_FACING specifies that an odd page is to be displayed first followed by
an even page.
PVV_DISP1 specifies that one page is to be displayed.
PVV_DISP2 specifies that two pages are to be displayed.
PVV_DISP3 specifies that three pages are to be displayed.
PVV_DISP4 specifies that four pages are to be displayed.
the Flags member may contain:
PVV_MARGINS_ON specifies that margins are to be visible during print preview
operations.
UseGrey set to TRUE to specify that the grey plane may be used, set to rauss otherwise.
Leftoffset specifies the horizontal separation of the left edge of the first page view from the left
edge of the window.
PageViewWidth — specifies the width of a page view in units of pixels.
2 PRINT PREVIEW CLASSES
——————_—. $$ Na eee ERINT PREVIEW CLASSES
Page specifies the layout of a generic page view on the screen: this generic page view has
zero horizontal offset from the left edge of the main window.
The pvv_pace_pata struct is defined as follows:
typedef struct
{
P_RECT Margins;
INT HeadTop;
INT HeadBot;
P_RECT Border;
P_RECT Footer;
} PVV_PAGE_DATA;
Margins - specifies the rectangle that is enclosed by the page margins.
HeadTop - specifies the distance of the header text from the top margin.
HeadBot - specifies the distance of the footer text from the bottom margin.
Border - specifies a rectangle enclosing the page view i.e. the physical page
border.
Footer ~- specifies a rectangle enclosing the page number.
Note: in all cases the units are pixels.
pBitRow for internal use.
pLastRow for internal use.
pRowRec for internal use.
PrvSegHandle specifies the handle of an external memory segment that is used to store compressed
page images.
The memory segment is created and written to by pR_PREVIEW_START and
PR_PREVIEW messages that are sent on initialisation.
Bmp contains information about an external bitmap that is used internally when
transferring compressed page images to the print preview window.
The prv_Brrmap struct is defined as follows:
typedef struct
{
INT Id;
HANDLE SegHandle;
UPOINT Size;
UWORD ByteWidth;
UWORD BitWidth;
} PRV_BITMAP;
The significance of the members of the above struct is as follows:
Id specifies the ID of the bitmap.
SegHandle specifies the handle of a memory segment that contains the bitmap.
Size the x member specifies the width of the bitmap in units of pixels.
the y member specifies the height of the bitmap in units of pixels.
ByteWidth specifies the number of bytes required to store one horizontal line from the bitmap i.e.
size.x divided by eight, plus one.
BitWidth specifies the number of horizontal bits needed to draw a page in the correct proportion.
XADD REFERENCE
eee
Resources
Defined in the system resource file sx_.ra.
RESOURCE WSERV_INFO sys_preview_acc
{
menbar_id=sys_preview_menubar;
first_com=0_PVC_PREVIEW_PRINT;
accel=
{
p', /* Print */
'm', /* Margins */
'a', /* Pages to display */
'j', /* Jump to page */
ter /* Exit preview */
};
BS a ee a, a
PRVVIEW methods
ow
INT wn_sense_help (VOID) ;
Sense print help resource
Sense the ID of the print help resource.
The method simply returns -sys HELP PRINT.
Destroy
VOID destroy (VOID) ;
Free any resources and destroy the prvvrew object.
Cancels any busy messages.
If prvview.poldMenu is non-zero, resets the application's menu bar by sending a ws_RESET_MENUBAR
message to w_ws specifying an argument of prvview.oldmenu.
If prvview.pOldcomman, destroys the print preview command manager by sending a pEsTRoy message to
w_ws->wserv.com and then writes prvview.pOldComman to w_ws->wserv.com.
Terminates the print preview by sending a pR_PREVIEW_END message to w_am->appman.sparel.
Frees the bitmap specified by prvview.Pv.Bmp.Id.
If prwview. Pv. Bmp.SegHandle is non-zero, closes the memory segment with handle
prvview.Pv.Bmp.SegHandle.
Frees the memory cell at address prvview.Pv.pBitRow.
If prvwview. Pv.parray is non-zero, sends a DESTROY message to prvview. Pv.pArray.
If win. flags contains PR_WIN_INITIALISED, sends a WS_REMOVE_DIAL message to w_ws.
If prvview. Started is non-zero:
e sends self a DESTROY message.
e sends an AM_sToP message to w_am.
Otherwise:
® sends self a DESTROY message.
2 PRINT PREVIEW CLASSES
WN KEY >
INT wn_key (INT keycode, INT modifiers) ;
Handle a keypress that might terminate the print preview, or scroll the page view.
If keycode is W_KEY_ESCAPE:
¢ ifprvview.pPages is non-zero, sends a DESTROY message to prvview.pPages.
® writes NULL tO prvview.pPages.
e returns TRUE.
If keycode is W_KEY_UP:
¢ attempts to scroll backwards prvview.NoPageViews pages by sending self a PVV_NEW_PAGE
message with as argument prvview.Pv.PageNo minus prvview.NoPageViews.
If keycode is W_KEY_DOWN:
¢ attempts to scroll forwards prvview.NoPageViews pages by sending self a PVV_NEW_PAGE
message with as argument prvview.Pv.PageNo plus prvview.NoPageViews.
If keycode iS W_KEY_PAGE_DOWN:
¢ ifmodifiers contains W_CTRL MODIFIER, attempts to display the last pages in the allowed preview
range by sending self a Pvv_NEW_PAGE message with as argument prvview. Pv.LastPage minus
prvview.NoPageViews plus one.
e otherwise, if prvview. Pv.Disp.Mode contains Pvv_DISP_FACING, attempts to move forwards by
prvview.Pv.PageNo pages by sending self a PVV_NEW_PAGE message with as argument
prvview.Pv.PageNo plus prvview.NoPageViews.
¢ otherwise, attempts to moves forward one page by sending self a pvv_NEW_PAGE message with as
argument prvview. Pv. PageNo plus one.
If keycode iS W_KEY_RIGHT:
¢ ifprvview.Pv.Disp.Mode contains Pvv_DISP_FACING, attempts to move forwards by
prvview.Pv.PageNo pages by sending self a Pvv_NEW_PAGE message with as argument
prvview.Pv.PageNo plus prvview.NoPageViews.
¢ otherwise, attempts to moves forward one page by sending self a Pvv_NEW_PAGE message with as
argument prvview. Pv. PageNo plus one.
If keycode iS W_KEY_PAGE_UP:
¢ ifmodifiers contains w_CTRL_MODIFTER, attempts to display the first pages in the allowed preview
range by sending self a pvv_NEW_PAGE message with as argument zero.
e otherwise, if prvview.Pv.Disp.Mode contains Pvv_DISP_FACING, attempts to move forwards by
prvview.Pv.PageNo pages by sending self a PVV_NEW_PAGE message with as argument
prvview.Pv.PageNo minus prvview.NoPageViews.
¢ otherwise, attempts to moves backwards one page by sending self a PvV_NEW_PAGE message with
as argument prvview.Pv.PageNo minus one.
If keycode is W_KEY_LEFT:
¢ if prvview.Pv.Disp.Mode contains Pvv_DISP_FACING, attempts to move forwards by
prvview.Pv.PageNo pages by sending self a pvv_NEW_PAGE message with as argument
prvview.Pv.PageNo minus prvview.NoPageViews.
¢ otherwise, attempts to moves backwards one page by sending self a Pvv_NEW_PAGE message with
as argument prvview.Pv.PageNo minus one.
If keycode is W_KEY_HOME:
¢ moves to the first page(s) in the preview range by sending self a Pvv_NEW_PAGE message with as
argument zero.
XADD REFERENCE
If keycode is W_KEY_END:
* moves to the last pages in the preview range by sending self a Pvv_NEW_PAGE message with as
argument prvview. Pv. LastPage minuUS prvwview.NoPageViews plus one.
Retums FALSE.
VOID wn_draw(VOID) ;
Draw
Draw the page views on screen.
Draws a border by calling gsorder with as argument win. flags.
Sends a wN_pRaw message to each pRvpacE object - the handles of the prvpacE objects are stored in the first
prvview.NoPageViews elements of prvview -pPageView.
Set display made
VOID wn_set (INT mode) ;
Set the number of pages to display during the print preview as specified by mode.
The allowed values of mode are as follows:
PVV_DISP_FACING specifies that two facing pages are to be displayed i.e. the first page must always
have and odd page number.
PVV_DISP1 specifies that one page is to be displayed.
PVV_DISP2 specifies that two pages are to be displayed.
PVV_DISP3 specifies that three pages are to be displayed.
PVV_DISP4 specifies that four pages are to be displayed.
If mode is equal to prvview.Pv.Disp.Mode, and thus the display mode is already set, returns.
Writes appropriate values into property including prvview.NoPageviews: note that if mode specifies more
pages than can be displayed, mode is reset to the limit.
Writes mode to prvview. Pv.Disp.Mode.
Sets Pvv_PREVIEW_SET in prvview.Pv.Disp.Flags.
Writes prvview.Pv.Disp tO DatGate->gate.prevdisp.
If necessary the print preview window is resized whilst ensuring that it remains centred on screen.
Si te
_ Initialise
VOID wn_init(IN_PRVVIEW *pIn, INT DoAmStart) ;
Initialise the pRvvrew object and then start the print preview operation.
The In_PRVvIEw struct is defined as follows:
typedef struct
{
PAGES_CALLS Calls;
WORD PrintMethod;
WORD Sparel;
WORD Spare2;
} IN_PRVVIEW;
The members of the 1n_pRvview struct have the following significance:
Calls .hread specifies the handle of an object that is to be sent read call-back messages by the
PAGES active object when it requires the next print element.
2 PRINT PREVIEW CLASSES
——_— eee RINT PREVIEW CLASSES
Calls.mread specifies the read call-back message that is sent by the paczs active object when it
requires the next print element.
Calls .hdone specifies the value that is written to prvview.hdone.
Calls.mdone specifies the value that is written to prvview.mdone.
PrintMethod specifies the value that is written to prvview. PrintMethod.
Sparel this member is not used.
Spare2 this member is not used.
If the gate. prevdisp.Flags property of the cars object is non-zero, writes the gate .prevdisp property to
prvview.Pv.Disp.
Writes a default display mode to prvview. Pv.Disp .Mode: the default is PVV_DISP2,
If the psp environment variable exists - this environment variable is four bytes long:
¢ — subtracts '0' from the value in the first byte and writes the result to prvview. pv.Disp .Mode.
e if prvview.Pv.Disp.Mode is greater than pvv_prsp4, resets prvview. Pv.Disp.Mode to
PVV_DISP_FACING.
e if the second byte contains '1', writes pvv_MARGINS_oN to prvview.Pv.Disp.Flags.
e otherwise writes zero to prvview.Pv.Disp. Flags.
Writes TRUE to prvview.Pv.UseGrey and then connects to the window server by sending self a
WN_CONNECT message. Sets the dimensions of the print preview window ensuring that it is centred on
screen.
Creates an instance of the prvinro class and writes its handle to prvview.pPrvinfo. Connects the PRVINFO
object to the window server and then initialises it.
Sets various items of property as follows:
© — sets property associated with the page range: this property is prvview. Pv. PageOffset,
prvview.MaxNoPageViews, prvview.NoPageViews and prvview.Pv.FirstPage.
© — sets property associated with the layout of the page views: this property is
prvview.Pv.Page.Border, prvview.Pv.Page.Header, prvview.Pv. Page .Footer,
prvview.Pv.Page.Margins, prvview.Pv.Page.HeadTop, prvview.Pv. Page .HeadBot,
prvview.Pv.Scrollarea and prvview.ScrollaArea.
e sets the content of the prvview. Pv. Bmp property.
Creates an instance of the variar class and writes its handle to prvview.Pv.parray. Initialises and sets the
capacity of the varLar component.
Initialises the current printer object for a print preview operation by sending a PR_PREVIEW_START message
tO w_am->appman.sparei with as argument the address of a PREVIEW_INIT struct initialised as follows:
pSegName _— specifies a pointer to a buffer containing the name to be given to an external memory
segment that will contain the page images. The name supplied is "PRV.ext" where the ext
component is the extension in the name of the current process.
pArray this is set to prvview. Pv. pArray.
PrvSize set tO prvview.Pv.Bmp.Size.
BitwWidth set to prvview.Pv.Bmp.BitWidth.
hPrvDone _ set to sel £: specifies the handle of the object to which the prvepr object sends mprvDone
messages after the completion of each stage of the print preview operation.
mPrvDone —_ Set to O_Pvv_DONE: specifies the message to be sent by the prvppr object after completion
of each stage of the print preview.
Writes the return value from the pr_PREVIEW_START message to to prvview. Pv. PrvSegHandle.
Installs the print preview command manager as follows:
XADD REFERENCE
eee
e sends a Ws_sET_MENUBAR message to w_ws with an argument of -sys_PREVIEW_ACC system
resource and writes the address of the original menu to prvview.poldMenu.
¢ creates an instance of the prvcomm class and writes its handle to w_ws->wserv.com and writes the
handle of the original command manager to prvview.pOldComman.
¢ — initialises the print preview command manager by sending a com_1nIT message to
w_ws->wserv.com with an argument of self.
Initialises the page images as follows:
e creates and initialises pvv_vIEW_MAX_PAGEVIEWS instances of the prvpace class and writes the
handles to the prvview.pPageView array.
e draws the page images in the print preview window by sending a wn_popraw message to each
element of prvview. pPageView.
Starts the print preview operation by sending a PR_PREVIEW Message to w_am->appman.spare1 with as
argument the address of a PAGES_cCALLs struct initialised as follows:
hread set to pIn->Calls.hread: specifies the handle of an object that is to be sent read call-back
messages by the paczs active object when it requires the next print element.
mread set to pIn->Calls.mread: specifies the read call-back message that is sent by the pacEs
active object when it requires the next print element.
hdone this is set to se1£: specifies the handle of an object that is to be sent an mdone message by
the pacgs active object after the completion of each stage of the print preview operation.
mdone this is set to pvv_PAGES_pons. specifies the message that is to be sent the paces active object
after the completion of each stage of the print preview operation.
Writes the handle of the current paczs active object - i.e. the return value from the pR_pREVIEW message -
to prvview. pPages.
Makes the print preview window visible by sending self a wN_INITVIS message.
Displays an information message containing the text in the sys_susy system resource: on English
language machines this is "Busy".
Adds the preview object as a dialog with an associated menu by sending a ws_app DIAL message to w_ws
with an argument of self.
Sets PR_WIN_INITIALISED, DLGCHAIN_WIH_MENU and PR_WIN_NO_ppP in win. flags.
If DoAmstart is non-zero:
e writes TRUE to prvview.Started.
¢ allows queued active objects to run by sending an aM_sTART message to w_am.
Completion call-back
INT pvv_done (INT event) ;
Complete procesing of the current stage in the print preview operation: this call-back method is called by
the prvpprR object.
If event is PAGES_DONE_PAGE indicating that the current page image has been completed:
* increments the page count i.e. prvview. Pv.NoPages and updates prvview. Pv. LastPage.
¢ updates the number of pages in the preview display by sending a w_sET message to
prvview.pPrvinfo with an argument of prvview. Pv .NoPages.
e if the page is visible, then draws the page by sending a wn_DoDRAw message to the appropriate
element of the prvview.pPageView altay.
Otherwise if event is either PAGES_DONE_ERROR OF PAGES_DONE_END, cancels any busy message and writes
NULL tO prvview.pPages.
2-14
2 PRINT PREVIEW CLASSES
Returns TRUE.
PVV_PAGES Di
INT pvv_pages_done (PAGES_DONE *d,PAGES_INIT *par) ;
étion call-back
Complete processing of the current stage in the print preview operation: this call-back method is called by
the pacss active object.
If d->event is either PAGES_DONE_ERROR OF PAGES_DONE_END, the method simply cancels any busy message
and then writes NULL to prvview.pPages since the pags active object is about to destroy itself.
Otherwise if prvview.hdone is non-zero, the method sends a prvview.mdone message to prvview.hdone
with as arguments d and par and then returns the return value.
Otherwise the method returns FALSE.
Note: when d->event is equal to PAGES_DONE_PaGE indicating completion of the current page, it is not
guaranteed that the page image is complete.
“margins
VOID pvv_margins (VOID) ;
Toggle the visibility of the margins in the print preview display.
If prvview.Pv.Disp.Flags contains Pvv_MARGINS_oN, clears Pvv_MARGINS_oN in prvview.Pv.Disp. Flags.
Otherwise sets pvv_MARGINS_ON in prvview.Pv.Disp.Flags.
Sends a PvP_MARGINS message to each of the prvpace objects specified in the prvview. ppageView array.
to page
VOID pvv_new_page (INT NewPage) ;
Move to page offset Newpage in the print preview range: a page offset of zero corresponds to the first page
in the print preview range.
Draws the pages on screen using scrolling whenever possible to ensure speed.
If necessary, rounds NewPage down, or up, to ensure that the pages on screen do not extend beyond the
allowed range and then writes the possibly modified value of newPage to prvview. Pv.PageNo.
VOID pvv_INIT(VOID *xp,INT commid, VOID **ppages) ;
Initialise the pRvview object.
Initialises the pRvv1Ew object and starts the print preview operation by sending self a wN_INIT message
with as argument the address of an In_PRvvIEw Struct and FaLsE: the IN_PRVvVIEW struct is set as follows:
Calls. hread specifies the handle of an object that is to be sent read call-back messages by the paces
active object when it requires the next print element: set to xp.
Calls.mread specifies the read call-back message that is sent by the pacgs active object when it
requires the next print element: set to 0 LPR_READ.
Calls.hdone specifies the value that is written to prvview.hdone: set to self.
Calls.mdone specifies the value that is written to prvview.mdone: set to 0_PVV_FALSE.
PrintMethod specifies the value that is written to prvview. PrintMethod: set to commid.
Sparel this is set to zero.
Spare2 this is set to zero.
Writes the handle of the pacgs active object i.e. prvview.pPages tO *ppages.
XADD REFERENCE
Indicates that an aM_sTART message has been sent by writing TRUE to prvview. Started.
Allows queued active objects to run by sending an am_sTaRT message to w_am.
PRVINFO
PRVINFO
NoPages
FontHeight
FontAscent
destroy
wn_calc_position
wn_connect
wn_dodraw
wn_emphasise
wn_key
wn_position
wn_redraw
wn_sense_help
wn_visible
The prvinro class provides a borderless window containing the page number and either "page" or "pages"
as appropriate. An example of such a window is shown in the following picture:
4
pages
The class is normally used as a component in a print preview window as shown in the following picture:
Class definition
Defined in sub-category file prev.c/ (generated header file prev.g).
CLASS prvinfo win
{
REPLACE wn_draw
REPLACE wn_set
REPLACE wn_init
PROPERTY
{
INT NoPages;
UWORD FontHeight;
UWORD FontAscent;
2 PRINT PREVIEW CLASSES
Property
prvinfo.NoPages specifies the number of pages: a textual representation of this value is displayed
in the information window.
prvinfo.FontHeight specifies the height of the boxes in which the page number and associated text
is drawn.
prvinfo.FontAscent specifies the ascent used when drawing text in the boxes.
Resources
Defined in the system resource file.
RESOURCE STRING sys_page
{
str="page";
RESOURCE STRING sys_pages
{
str="pages";
}
BS ee ee a ee ee Ee
PRVINFO methods
VOID wn_init (VOID) ;
Initialise property.
Obtains the height and ascent of the font specified by ID ronr_rp_swrss_13 and style c_sTy_NoRMAL.
Writes the height of the font to prvinfo.FontHeight.
Writes the ascent of the font to prvinfo.FontAscent.
of pages
VOID wn_set (INT NoPages) ;
Set the number of pages.
The method simply writes nopages to prvinfo.NoPages and then forces a redraw by invalidating the entire
content of the window.
ee Draw
VOID wn_draw (VOID) ;
Draw the entire display.
Draws a textual representation of the decimal value in prvinfo.NoPages in a box in the top left corner of
the window.
Draws text in a box immediately beneath the first one. If prvinfo.NoPages is one, the text is loaded from
the sys_PaGE system resource: on English language machines this is "page". Otherwise the text is loaded
from the sys_PacEs system resource: on English language machines this is "pages".
The width and height of each box are pvv_PAGENo_DIsP_cap and prvinfo.FontHeight respectively.
In both cases the text is centre aligned with an ascent of prvinfo.FontAscent.
XADD REFERENCE
PRVPAGE
destroy
wn_calc_position
wn_connect
wn—dedzraw
wn_emphasise
wn_key
wn_position
wn_redraw
wn_sense_help
Pvp_margins
wn_visible
wn_set
wn_sense
The prvpace draws an image of a page and the associated page number. An example page view is shown in
the following picture:
Notice the margins and the header and footer text. Page views are used as components in the print preview
window as shown in the following picture:
In the above picture two prvpace objects were used as components in order to create and maintain the two
page images.
In normal use the prvpacE object shares the window ID of the main print preview window. The owning
object is responsible for supplying the prvpacE object with the window ID and its position on screen.
A PRVPAGE object loads the page image from an external memory segment the address of which is read
from the property of the parent prvview object.
Similarly the rectangles that define the layout of the page image are read from the property of the parent
PRVVIEW object.
2 PRINT PREVIEW CLASSES
SSeS TERINE PREVIEW CLASSES |
Class definition
Defined in sub-category file prev.c/ (generated header file prev.g).
CLASS prvpage win
REPLACE wn_dodraw
REPLACE wn_draw
REPLACE wn_init
ADD pvp_margins
TYPES
{
typedef struct
{
PR_PRVVIEW *pPrvView;
INT Pos;
UWORD wid;
} IN_PRVPAGE;
}
PROPERTY
{
IN_PRVPAGE init;;
}
}
Property
prvpage.init this is an IN_PRvPAGE struct which is passed on initialisation of the PRVPAGE
object i.e. by sending it a ww_InrT message.
The IN_PRVPAGE struct is defined as follows:
typedef struct
{
PR_PRVVIEW *pPrvView;
INT Pos;
UWORD wid;
} IN_PRVPAGE;
the significance of the members of the 1n_prvpacz struct is as follows:
pPrvView this is the handle of a parent prvvrew object.
Pos this is an index which determines the offset of the page image in the main window.
The offset, in pixels, is equal to the sum of the prvview. Pv.Leftoffset property of
the PRVVIEw object and the product of prvpage. Pos and the
prvview. Pv. PageViewWidth property of the prvvrew object.
wid this specifies the ID of the main window in which the page view and the page number
are drawn.
Resources
Defined in the system resource file.
RESOURCE STRING sys_page
{
str="page";
RESOURCE STRING sys_pages
{
str="pages";
XADD REFERENCE
PRV
Dodraw
VOID wn_dodraw (VOID) ;
Create an appropriate graphics context and then draw the page view and the page number.
Validates the rectangles enclosing the page image and the page number.
Creates a temporary graphics context.
Draws the page view by sending self a WN_DRAW message.
Releases the temporary graphics context.
=~ Draw
VOID wn_draw(VOID) ;
Draw on screen the current page view and the associated page number.
If the prvview. Pv.NoPages property of the prvview object - i.e. the number of pages to preview - is zero,
clears the rectangle enclosing the page view and the page number.
If the current page number is out of the preview range, clears the retangle enclosing the page view and the
page number.
The layout of page views is shown schematically in the following picture.
page offset of page 2
left offset
page view width
The quantities of relevance to the prvpacs class are as follows:
left offset specified by the prwview. Pv.Leftoffset property of the parent PRvVIEW object.
page view width _ specified by the prvview. pv. Pageviewwidth property of the parent pRvvIEw object.
page offset equal to the sum of the left offset and prvpage.Pos multiplied by the page view
width.
page number equal to the sum of prvpage.init.Pos and the prvview. Pv. PageNo and
prvview.Pv.PageOffset property of the parent prvview object.
Draws the page number in the rectangle specified by the prvview. pv. Page. Footer property of the parent
PRVVIEW object offset horizontally by the page offset.
Draws the page image in the rectangle specified by the prvview. Pv. Page .Border property of the parent
PRVVIEW object offset horizontally by the page offset.
If the prvview. Pv. Disp. Flags property of the prvview object contains pvv_MARGINS_ON:
2-20
2 PRINT PREVIEW CLASSES
e draws the margins as specified by the prvview. Pv. Page .Margins property of the parent PRVVIEW
object offset by the page offset.
Special note: the page image is loaded from an external memory segment - the handle of this memory
segment is read from the prvview. Pv. PrvSegHandle property of the parent pRvVIEw object.
WNLINIT oo Initiatise
VOID wn_init (IN_PRVPAGE *pinit) ;
Initialise the pRvpaGE object.
Writes *pinit to prvpage. init.
Writes pinit->wid tO win.id.
PVP{MARGINS _ ) : Margins
VOID pvp_margins (INT flag) ;
Create a graphics context and the draw the page view and the page number.
Sends self a WN_DODRAW message.
PRVCOMM
PRVCOMM
com_init
com_menu
com_file_ change
com_statwin
com_accl_check
Commend
com_mode_change
com_exit
pvc_preview_print
pvc_preview_margins
pvc_preview_options
pvc_preview_jump
pvc_preview_exit
The prvcomm class provides the print preview command manager. An example print preview menu is
shown in the following picture:
eae (Print
Show margins
Pages to display
Jump to page S
Exit preview Pe
The menu items supplied are as follows:
¢ Print - this allows the user to print during print preview operations: this option uses the print
command in the original command manager of the application.
° Show margins/Hide margins - this allows the user to simply toggle the display of margins during
print preview operations.
XADD REFERENCE
eee
¢ Pages to display - this allows the user to set the total number of pages displayed during print
preview operations: this is a system wide setting stored in the psp environment variable.
¢ Jump to page - this allows the user to simply set the first page displayed during the print preview
operation. This is a local, i.e. not system wide, setting.
e Exit preview - this allows the user to terminate the print preview operation thus restoring the
original command manager.
Class definition
Defined in sub-category file prev.cl (generated header file prev.g).
CLASS prvcomm comman
{
REPLACE com_init
REPLACE com_menu
REPLACE com_file_change
REPLACE com_exit
ADD pvc_preview_print
ADD pvc_preview_margins
ADD pvc_preview_options
ADD pvc_preview_jump
ADD pvc_preview_exit
PROPERTY
{
PR_PRVVIEW *pPrvView
}
}
Property
prvcomm.pPrvView this stores the handle of a prvvrew object.
Resources
Defined in the system resource file.
RESOURCE WSERV_INFO sys_preview_acc
{
menbar_id=sys_preview_menubar;
first_com=0_PVC_PREVIEW_PRINT;
accel=
{
'p', /* Print */
'm', /* Margins */
'd', /* Pages to display */
'j', /* Jump to page */
tet /* Exit preview */
};
a a a a eal
PRVCOMM methods
Initialise
VOID com_init (PR_PRVVIEW *pPreView) ;
Initialise the prvviEw object.
The method simply writes pprvview to prvcomm. pPrwView.
Set menu item text
VOID com_menu(WORD menunum, VOID *pArray) ;
Set appropriate text for the Margins menu item.
If the prevview. Pv.Disp.Flags property of the prvview object contains pvv_MARGINS_ON:
2-22
2 PRINT PREVIEW CLASSES
eee NNT PREVIEW CLASSES |
¢ sets the text in the Margins menu item from the sys_HIDE_MARGINs system resource: on English
language machines this is "Hide margins".
Otherwise:
e sets the text in the Margins menu item from the sys_DISPLAY_MARGINs system resource: on
English language machines this is "Show margins".
Note: this method is called immediately before the menu is displayed.
Edt application
INT com_exit (VOID) ;
Exit the print preview and the application.
Destroys the current prvview object by sending a pestroy message to prvcomm. pPrvView.
Sends a com_EXIT message to w_ws->wserv.com.
Print
VOID pvc_preview_print (WORD menunum, VOID *pArray) ;
Print all of the pages in the print preview range.
If the prvview.pPages property of the pRvviEw object specified by prvcomm. pPrvview is non-zero:
e displays an information message containing the text in the sys_PREVIEW_BUSY system resource: on
English language machines this is "Busy, cannot print yet".
Otherwise:
¢ — it is assumed that the message number of an appropriate print method is specified by the
prvview.PrintMethod property of the prvvrew object.
* it is also assumed that the handle of the original command manager is specified by the
prvview.pOldComman property of the prvvieEw object.
e — starts a printing operation by sending the appropriate print message to the original command
manager.
Toggle margins
VOID pvc_preview_margins (VOID) ;
Toggle the visibility of margins in the print preview window.
The method simply sends a pvv_marcins message to the pRvvIEw object i.e. prvcomm. pPrvview.
PVGEPRI
VOID pvc_preview_options (VOID) ;
IEW_OPTIONS —_—_—s Launch Preview options dialog
Launch a Preview options dialog allowing the user to edit the current print preview display mode. The
dialog is passed prvcomm. pPrvView as data.
For details of the Preview options dialog see the description of the prvoprions_puc class.
Laur
h Jump to page dialog
VOID pvc_preview_jump (VOID) ;
Launch a Jump to page dialog allowing the user to select the number of the current page in the print
preview operation. The dialog is passed prvcomm. pPrvview as data.
For details of the Jump to page dialog see the description of the prvsump_puc class.
XADD REFERENCE
PYC PREVIEW EXIT” : Exit print preview
VOID pvc_preview_exit (VOID) ;
Exit the print preview operation.
Sends a DEsTRoy message to prvcomm. pPrvView.
PRVOPTIONS_DLG
flags next item count
id rbuf current
dimrid underline
helprid absorb
changed
destroy wrh—dzaw
destroy dl_item_replace
wn_key dl_item_append
wn_emphasise dl_init
wn_sense_ help dl_dimmed_message
wn_set dal_item_add
wn_sense dl_set_size
wn_draw dl_ing minsize
dl_item_lock di—dyn—init
dl_item_dim di—-key
dl_set_item_flags
dl_set_prompt dl_changed
dl_take_focus dl_focus
dl_handle_to_index dl_launch_sub
dl_index_to_handle dl_item_new
PRVOPTIONS_DLG
wn_position
wn_redraw
wa—sense—heip
wn_visible
The pRvoptTions_pic implements the Preview options dialog which allows the user to select the number of
pages that are displayed during a print preview operation. An example Preview options dialog is shown in
the following picture:
i Display
¢2 pages
The allowed options are shown in the following picture:
A
The Facing pages option allows the display of two pages whereby the first page has an odd page number.
The Preview options dialog is used by the prvcomm print preview command manager described in the
present chapter.
Class definition
Defined in sub-category file prvdigs.cl (generated header file prvdlgs.g).
CLASS prvoptions_dlg dlgbox
REPLACE dl_dyn_init
REPLACE dl_key
2 PRINT PREVIEW CLASSES
Property
There is no property associated with the pRvopTIoNs_puG class.
Resources
Defined in the system resource file.
RESOURCE MENU sys_preview_options_chlist
{
items=
{
CHOICE_ITEM {str="Facing pages";},
CHOICE_ITEM {str="1 page";},
CHOICE _ITEM {str="2 pages";},
CHOICE_ITEM {str="3 pages";},
CHOICE_ITEM {str="4 pages"; }
be
}
RESOURCE DIALOG sys_preview_options_dialog
{
title="Display";
f£lags=DLGBOX_NOTIFY_ENTER |DLGBOX_RBUF_FILLED|DLGBOX_NO_DDP;
controls=
{
CONTROL
{
class=C_CHLIST;
prompt= ti ;
info=CHLIST{rid=sys_preview_options_chlist;};
}
PRVOPTIONS_DLG methods
Initialise
VOID dl_dyn_init (VOID) ;
Dynamically initialise the content of the dialog: it is assumed that algbox. rbuf contains the handle of a
PRVVIEW object.
Reads the maximum number of pages from the prvview.MaxNoPageViews property of the prvvrEw object
and if the maximum number of pages is less than pvv_vIEW_MAX_PAGEVIEWS:
e deletes the items from the data for the Mode control that specify more than the maximum number
of pages.
e — sets the index of the item selected in the Mode control to the smaller of the
prvview.Pv.Disp.Mode property of the prvview object and the maximum number of pages.
Otherwise:
© — sets the index of the item selected in the Mode control to the prvview.Pv.Disp.Mode property of
the pRvview object.
DEKEY Handle key input
INT dl_key (VOID) ;
Save the content of the dialog: it is assumed that aigbox. rbuf contains the handle of a prvvrew print
preview object.
Sets the number of pages displayed in the print preview by sending a w_seT message to dlgbox.rbuf with
as argument the index of the item selected in the Mode control.
Returns WN_KEY_CHANGED.
XADD REFERENCE
PRVJUMP_DLG
flags next item count
id rbuf current
dimrid underline
helprid absorb
changed
destrey wh—draw
PRVOPTIONS_DLG
destroy dl_item_replace
wn_key dl_item_append
wn_emphasise dl_init
wn_sense_help dl_dimmed_message
wn_set dl_item_add
wn_sense dl_set_size
wn_draw dl_ing_ minsize
dl_item_lock di—dyn—init
dl_item_dim di—key
di_set_item_flags
dl_set_prompt dl_changed
dl_take_focus dl_focus
dl_handle_to_index dl_launch_sub
dl_index_to_handle dl_item_new
wn_position
wn_redraw
wa-sencse—heip
wn_visible
The prvsump_puc class implements the Jump to page dialog which allows the user to select the first page
on the screen during the print preview operation. An example Jump to page dialog is shown in the
following picture:
Jump to page
[Page number iE]
The Jump to page dialog is used by the prvcomm print preview command manager described in the present
chapter.
Class definition
Defined in sub-category file prvdigs.cl (generated header file prvdlgs.g).
CLASS prvjump_dlg dlgbox
REPLACE dl_dyn_init
REPLACE dl_key
}
Property
There is no property associated with the prvgump_puc class.
2 PRINT PREVIEW CLASSES
SSeS RINT PREVIEW CLASSES ©
Resources
Defined in the system resource file.
RESOURCE DIALOG sys_preview_jump_dialog
{
title="Jump to page";
flags=DLGBOX_NOTIFY_ENTER |DLGBOX_RBUF_FILLED |DLGBOX_NO_DDP;
controls=
{
CONTROL
{
class=C_NCEDIT;
prompt="Page number";
infosNCEDIT
{
low=1;
high=9999;
i
ae re ee ae ey
PRVJUMP_DLG methods
VOID dl_dyn_init (VOID) ;
Dynamically initialise the content of the dialog: it is assumed that digbox.rbuf contains the handle of a
PRVVIEW object.
Sets the page number of the first page in the preview range as the minimum value in the Page number
control: this is equal to one plus the prvview. Pv. PageOffset property of the PRvvzEw object:
Sets the page number of the first page on screen as the current value in the Page number control: this is
equal to the sum of the prvview.Pv.Pagecffset and prvview. Pv. PageNo property of the pRvv1ew object
INT dl_key(VOID) ;
_ Handie key input
Save the content of the dialog: it is assumed that digbox. rbuf contains the handle of a prvvrew object.
If the current value in the Page number control exceeds the number of the last page in the preview range:
® — sets the current value in the Page number control to the number of the last page in the preview
range: this is equal to the sum of the prwiew. Pv. PageOffset and prvview. Pv.NoPages property
of the prvvrew object.
e displays an information message containing text from the sys_RANGE_RESET system resource: on
English language machines this is "Out of range - reset to limit".
© returns WN_KEY_NO_CHANGE.
Otherwise:
¢ — sets the first page displayed on screen by sending a pvv_NEW_PAGE message tO digbox.rbuf with
as argument the current value in the Page number control minus the page offset i.e. the
prvview.Pv.PageOffset property of the prvvrew object.
e returms WN_KEY_ CHANGED.
o—
CHAPTER 3
CALENDAR CLASSES
This chapter describes the following two classes:
e the canimewn class which is designed to be used with the canwzn class.
e the canwrn class which provides a convenient means to create and use a graphical calendar view.
Note that both the ca.tmewn and canwin classes are included in the xapp category and thus an instance of
each class should be created as follows:
self->demo.calwin=f_new(CAT_MYAPP_XADD,C_CALWIN) ;
self->demo.calimgwn=f_new(CAT_MYAPP_XADD,C_CALIMGWN) ;
It is expected that applications that wish to display a calendar window are more likely to create an instance
of cauwrn, rather than the more primitive caLIMGwIN.
Since caLWIN's component cALIMGWIN expects to receive redraw message, an instance of caLwrn is not
suited to being created from OPL or HWIF programs.
Precursors
An understanding of the caLwrn and caLImGwn classes will be helped by a knowledge of:
e the graphical calendar display in the Series 3a Agenda application.
e the cauime class described in The Calendar Image Class chapter of the FORM Reference manual.
e the wn and Bwzrn classes.
Class diagram
calwin
XADD REFERENCE
CALIMGWN
destroy
wn_calic_ position
wn_connect
wn_dodraw
wn_emphasise
wn_key
wn_position
wncredzaw
wn_sense_help
wn_visible
wn_set
wn_sense
wn_draw
wn_init
The caLimewn class is intended to be used by the catwrn class described in the next section. It does no
more than provide a borderless window suitable for holding a calendar view drawn by an instance of the
CALIMG class.
Class definition
The caLincwn class subclasses win and is defined in the sub-category file calwin.cl (with generated header
file calimgwn.g).
CLASS calimgwn win
{
REPLACE wn_redraw
PROPERTY 1
{
VOID *calimg;
}
}
Property
calimgwn.calimg an instance of the canrme class responsible for drawing and maintaining a calendar
view. A description of the cauime class may be found in the FORM Reference
manual.
a a ee
CALIMGWN methods
WN_REDRAW Redraw
VOID wn_redraw(P_RECT *prect);
Redraw the part of the calendar view which overlaps the region defined by the p_REct struct pointed to by
prect.
The code is as follows:
wBeginRedrawGCo (self->win.id,prect) ;
p_send3 (self->calimgwn.calimg,O_CI_REDRAW,prect) ;
wEndRedraw () ;
3 CALENDAR CLASSES
CALWIN
wn_init
wn_emphasise
wn_position
wn_redraw
wn_sense_help
wn_visible
wn_set
The canwin class provides a bordered and shadowed window containing a graphical calendar view. An
example caLwin display is shown in the following diagram, which indicates some of the components of the
window:
month title calendar title
days of the week title
Note that today's date - i.e. the fourteenth - is indicated in a bold font.
On the Series 3a, the calendar also supports multiple rows and columns of months, as illustrated in the
following picture:
7
3
16
GON) =
= fw
An owning object may allow the canwrn class to determine approriate fonts, font styles and spacings in
which case the calendar view may contain either one, three or twelve months. Alternatively the owning
object may explicitly specify the fonts, font styles, spacings and the number of rows and columns. Clearly
the first mode of use is the simplest and is thus recommended.
XADD REFERENCE
ee
Note that, on the Workabout, a calendar window may only display a single month.
Class definition
The canwrn class subclasses bwin and is defined in the sub-category file calwin.cl (with generated header
file calwin.g).
CLASS calwin bwin
{
REPLACE destroy
REPLACE wn_init initialise to 1 of 3 types of calendar window
REPLACE wn_emphasise deals with cursor drawing & erasing
REPLACE wn_key
REPLACE wn_sense
CONSTANTS
{
IN_CALWIN_1_ MONTH 0x0001
IN_CALWIN_3_MONTH 0x0002
IN_CALWIN_12 MONTH 0x0004
IN_CALWIN_STD_FLAGS 0x0007 above three ORed together
IN_CALWIN_USER_SPEC 0x0010 none of the above but user specified
PR_CALWIN TODAY _HOOKED 0x0020
}
TYPES (
{
typedef struct
{
UWORD flags;
ULONG days;
P_POINT pos;
VOID *calimg; in_calimg struct (see calimg.cl)
VOID **self ptr; where to write self to (in owner's property)
} IN_CALWIN;
}
PROPERTY 1
{
PR_CALIMGWN *calimgwn;
VOID *calimg; allows direct call to calimg eg goto_date() etc
UWORD flags;
VOID **self ptr;
}
}
Property
calwin.calimgwn the handle of an instance of the cau rmewn class described in the first section of the current chapter.
calwin.calimg the handle of an instance of the canine class described in The Calendar Image Classes chapter of
the FORM Reference manual.
calwin.flags contains an ored combination of flags as described for the wn_init method.
calimg.self ptr assumed to point to the address at which the owning application stores the canwrn object handle.
Se eee ee ee a a ee
CALWIN methods
DESTROY sit a Destroy
VOID destroy (VOID) ;
Destroy the caLwin instance.
If calwin. flags contains PR_CALWIN_TODAY_HOOKEn, the method sends a WS_HOOK_TODAY_CHANGED message
to the wsErv object.
The method then supersends a pestroy message.
3 CALENDAR CLASSES
Initialise
VOID wn_init (IN_CALWIN *init);
Initialise the instance of caLwin according to the content of the 1n_canwrn struct pointed to by init.
If w_ws->wserv. flags does not contain PR_WSERV_FULLSCREEN, the method calls p leave with an
argument of RUN_ACTIVE_CLEANUP_NONOTIFY.
Otherwise the method creates, initialises and displays a calendar view.
The appearance of the calendar view is specified by means of an 1n_caLIne struct defined as follows:
typedef struct
{
UWORD flags;
ULONG days;
P_POINT pos;
VOID *calimg;
VOID **self ptr;
} IN_CALWIN;
The significance of the members of the in_ca.wrn struct is as follows:
flags the allowed values are:
IN_CALWIN_USER_SPEC in which case the initialisation data for the caLrmc instance is read
from init->calimg. Note that this flags takes precedence over the remaining three.
IN_CALWIN_12_MoNnTH in which case appropriate initialisation data is created for a calendar
view containing twelve months arranged in two rows of six months each. On the
Workabout, this flag, if present, will be removed from the initialisation data.
IN_CALWIN_3 MONTH in which case appropriate initialisation data is created for a calendar
view containing three months arranged as one row of three months. On the Workabout, this
flag, if present, will be removed from the initialisation data.
IN_CALWIN_1_MonTH in which case appropriate initialisation data is created for a calendar
view containing one month. On the Workabout, this flag will be forced to be present in the
initialisation data.
days specifies the initial value for the current date and is expressed as the number of days elapsed
since 1/1/1900.
pos specifies the initial position of the main bordered window and is modified if necessary to
ensure that the calendar is not clipped by the edges of the screen. In the latter case the
modified value is such that the calendar view is centred in the window.
calimg the address of an In_cALIMe struct containing initialisation data for the caLIMe instance.
This is ignored unless the flags member contains IN_CALWIN_USER_SPEC. The IN_CALIMG
struct is described in The Calendar Image Class chapter of the FORM Reference manual.
self ptr specifies an address in the owning application where the handle of the canwin instance is
stored.
Writes init->flags to calwin. flags and writes init->self->ptr tO calwin.self->ptr.
On the Workadour, the flags IN_CALWIN_3_MONTH and IN_CALWIN_12_MONTH are cleared from the
initialisation data and the flag 1n_caLwin_1_MonTH is forced to be set. before the data is copied to
calwin. flags. Note that this also automatically guarantees that Iv_CALWIN_USER_SPEC is not present.
Unless init->flags contains IN_CALWIN_USER_SPEC, an IN_CALIMG Struct is created and initialised with
appropriate values for the required calendar view. These values are as follows:
wid specifies the window ID of the borderless window: this is set to calwin. calimgwn->win.id.
width specifies the width of the borderless window corresponding to the caLrimcwn component.
This window is of the exact size required to hold the calendar view. If the calendar view is
too wide for the screen the method calls p_leave with an argument of E_GEN_TOOwIDE.
XADD REFERENCE
EEE
tl specifies the gutter dimensions. The x member specifies the width of the left and right
gutters and is set to seven. The y member specifies the height of the top and bottom gutters.
If init->flags contains IN_CALWIN_12_monTus, the y member is set to five. Otherwise it is
set to seven,
mrow specifies the number of rows. If init->£1ags contains IN_CALWIN_12 MONTHS, mrow is set to
two, otherwise it is set to one.
mcol specifies the number of columns. If init->£1ags contains IN_CALWIN_12_ MONTHS, mcol is
set to six, or if init->flags contains IN_CALWIN_3_MONTHS, mcol is set to three, otherwise it
is set to one.
flags set to zero.
title specifies the font characteristics of the main title. The leading, style and f£id members are
set to one, G_STY_NORMAL and FoNT_ID_13_s respectively (on the Workabour, the title font
ID is set to Font_1D_S3BOLD).
month specifies the font characteristics of the month title. The 1eading and style members are set
to one and G_sTy_norat respectively. If init->£1ags contains IN_CALWIN_12_monTus, the
£id member is set to FoNT_ID_s3BOLD, otherwise it is set to FONT_ID_11B Ss
(FONT_ID_s3BoLD on the Workabout).
dow specifies the font characteristics of the days of the week title. The leading and style
members are set to one and G_sTy_Normat respectively. If init->flags contains
IN_CALWIN_12_MonTuS, the fid member is set to FonT_1p_s3, otherwise it is set to
FONT_ID_11_S (FONT_ID_s3 on the Workabou?).
day specifies the font characteristics of the day of the month numbers. The leading and style
members are set to one and G_sTy_NorMat respectively. If init->f£1ags contains
IN_CALWIN_12_MONTHS, the fid member is set to FonT_ID_pIGITs_s*4, otherwise it is set to
FONT_ID_11_S (FonT_zD_s3 on the Workabout).
daygap specifies a character the width of which in the day number font and style defines the
spacing between the day numbers and is set to osPacE.
mthgapx specifies the horizontal pixel separation between adjacent months. If init->£lags contains
IN_CALWIN_12_MONTHS, mthgapx is set to six, otherwise it is set to twelve.
hserlm specifies the default granularity for scrolling horizontally by month. If init->flags
contains IN_CALWIN_12_ MONTHS, hscr1m is set to six, otherwise it is set to one.
startm specifies the month number of the first month in the calendar view. If init->£1ags contains
IN_CALWIN_12_MONTHS, startm is set to zero, otherwise it is determined from the value
implicitly specified in init->days.
days specifies the current date expressed as days elapsed since 1/1/1990 and is set to init->days.
font specifies additional font information for the month, day of week, title and day text. For
example, the ascent of the month text, which is font -mth_ascent, is calculated from the
font ID and the style specified in month. fia and month. style respectively.
Otherwise (i.e. if init->£1ags contains IN_CALWIN_USER_SPEC) it is assumed that init->calimg points to
an IN_CALING struct initialised by the owner.
Creates the main bordered window by sending se1¢ a wn_connecT message with appropriate arguments.
The position is set to the pos member of the 1n_ca.wrn struct as described above. The width is set to the
width of the calendar plus the width of the left and right gutters, and similarly the height is set to the height
of the calendar plus the height of the top and bottom gutters. On the Series 3a, but not on the Workabout, if
the window is too large to fit on the screen, the method calls p_leave(E_GEN_TOOWIDE).
Creates an instance of the caLImGwn class and writes the handle to calwin.calimgwn. Creates the calendar
window by sending a wN_ConnEcT message to calwin.calimgwn with a background attribute of
W_WIN_BACK_NoNnE. The window dimensions are set to those of the calendar view.
Creates an instance of the cane class and writes the handle to both calwin. calimg and
calwin.calimgwn->calimgwn.calimg.
a.
3 CALENDAR CLASSES
If init->flags contains IN_CALWIN_USER_SPEC, initialises the caLimc instance by sending a c1_INIT
message to calwin.calimg with init->calimg as argument.
Otherwise initialises the caLzMc instance by sending a c1_INIT message to calwin.calimg with the
address of an appropriately set 1n_ca.zne struct as described above.
If init->flags contains IN_CALWIN_12_ MONTHS:
e loads the resource with ID sys_catenpar and sets this as the calendar title by sending a
CI_SET_TITLE message to calwin.calimg.
Sends a ws_HOOK_TODAY_CHANGED message to w_ws with arguments of calwin.calimg and
O_CI_TODAY_CHANGED.
Sets PR_CALWIN_TODAY_HOOKED in calwin. flags.
Makes the calendar view visible by calling the htnitvis utility routine with an argument of se.
INT wn_key(UINT keycode, UINT modifiers) ;
Handle a keypress.
If keycode is W_KEY_ESCAPE:
e returns WN_KEY_CANCELLED.
If keycode is W_KEY_RETURN:
e returms WN_KEY_CHANGED.
If keycode is W_KEY_TAB:
e ifcalwin.flags contains IN_CALWIN_USER_SPEC, the method returns wN_KEY_NO_CHANGE.
e ifmodifiers contains W_CTRL_MODIFIER and calwin.flags contains IN_CALWIN_12_ MONTH, the
method returns WN_KEY_NO_CHANGE.
e otherwise the method creates a new caLwin object and initialises it as described for the wn_init
method. If modifiers contains w_CTRL_mMopIFIER, the new calendar contains twelve months.
Otherwise if modifiers contains W_SHIFT_MODIFIER, and calwin. flags contains
IN_CALWIN_1_MONTH, the new calendar contains twelve months. Otherwise if modifiers contains
W_SHIFT_MODIFIER, the new calendar calendar contains half the current number of months.
Otherwise if calwin. flags contains IN. CALWIN_12_MontTH, the new calendar contains one month.
Otherwise, the new calendar contains twice the current number of months.
e de-emphasises the current calendar view by sending self a WN_EMPHASISE message and
emphasises the new calendar view by sending a wN_EMPHASISE message to the new CALWIN object.
* writes the handle of the new cawrn object to the location pointed to by calwin.self_ptr and
then destroys the current calendar view by sending self a DESTROY message.
@ retums WN_KEY_NO_CHANGE.
If keycode is less than ox100 and corresponds to either the special keycode stored at address
&W_ws->wserv.sc[H_SC_ILEss] or the special keycode stored at address ew_ws->wserv.sc [H_SC_ICOMMA]
(on English language machines these are the less than symbol and the comma respectively):
¢ ifmodifers contains W_CTRL_MODIFIER, moves the cursor backwards in time by seven days by
sending a CI_MOVE_CURSOR message to calwin.calimg with an argument of CALIMG_PREV_WEEK.
e otherwise, moves the cursor backwards in time one day by sending a c1_movE_cuRsoR message to
calwin.calimg with an argument of cALIMG PREV_DAY.
If keycode is less than ox100 and corresponds to either the special keycode stored at address
&w_ws->wserv.sc [H_SC_IMORE] or the special keycode stored at addess ew_ws->wserv.sc{H_SC_IDOT] (on
English language machines these are the greater than symbol and the full stop respectively):
XADD REFERENCE
eee eee
¢ ifmodifers contains W_CTRL_MODIFIER, moves the cursor forwards in time seven days by sending
a CI_MOVE_CURSOR message to calwin.calimg with an argument of CALIMG_NEXT_WEEK.
¢ otherwise, moves the cursor forwards in time one day by sending a cr_move_cursor message to
calwin.calimg with an argument of CALIMG_NEXT_DAY.
If keycode is W_KEY_UP and calwin. flags contains IN CALWIN_1_MONTH:
* moves the cursor backwards in time one week - i.e. seven days - by sending a cl_MOVE_CURSOR
message to calwin.calimg with an argument of cALIMG_PREV_WEEX and then returns
WN_KEY_NO_CHANGE.
If keycode is W_KEY_RIGHT and calwin. flags contains IN_CALWIN_1_MONTH:
* moves the cursor forwards in time one day by sending a cr_mov=E_curRsoR message to
calwin.calimg with an argument of caLIMc_NExT_pay and then returns wN_KEY_NO_CHANGE.
If keycode is W_KEY_LEFT and modifiers contains W_SHIFT MODIFIER:
¢ moves the cursor backwards in time one day by sending a cr_MovE_cURSOR message to
calwin.calimg with an argument of cALIMG_PREV_pay and then returns WN_KEY_NO_CHANGE.
If keycode is W_KEY_LEFT and modifiers contains W_CTRL_MODIFIER:
¢ moves the cursor backwards in time one month by sending a c1_Move_cuRsoR message to
calwin.calimg with an argument of caLIMG_PREV_pay and then returns wN_KEY_NO_CHANGE.
Otherwise, if keycode is W_KEY_LEFT:
¢ moves the cursor to the left by one day in the calendar view by sending a ct_mMovE_cURSOR
message to calwin.calimg with an argument of caLImG_LeFr and then returns
WN_KEY_NO_CHANGE.
If keycode is W_KEY_RIGHT and modifiers contains W_SHIFT_ MODIFIER:
¢ moves the cursor forwards in time one day by sending a cr_move_cuRsoR message to
calwin.calimg with an argument of caLIMG_wexT_pay and then returns wN_KEY_NO_CHANGE.
If keycode is W_KEY_RIGHT and modifiers contains W_CTRL_MODIFIER:
* moves the cursor forwards in time one month by sending a cr_MovE_cURSOR message to
calwin.calimg with an argument of CALIMG_NEXT_MONTH and then returns WN_KEY_NO_CHANGE.
If keycode is W_KEY_RIGHT:
¢ moves the cursor to the right one day in the calendar view by sending a cr_Move_cuRSOR message
to calwin.calimg with an argument of caLimc_RiGHT and then returns wN_KEY_NO_CHANGE.
If keycode is W_KEY_uP and modifiers contains W_SHIFT_MODIFIER:
* moves the cursor backwards in time one week by sending a c1_MovE_cursoR message to
calwin.calimg with an argument of cALIMG_PREV_WEEK and then returns wN_KEY_NO_CHANGE.
If keycode is W_KEY_UP and modifiers contains W_CTRL_MODIFIER:
¢ moves the cursor backwards in time one year by sending a cI_MOVE_CURSOR message to
calwin.calimg with an argument of caLIMG_PREV_yEaR and then returns wN_KEY_NO_CHANGE.
If keycode is w_KEY_UP:
° moves the cursor upwards in the calendar view by one day by sending a cr_Move_cURSOR message
to calwin.calimg with an argument of caLimc_up.
e retumms WN_KEY_NO_CHANGE.
If keycode is W_KEY_DowN and modifiers contains W_SHIFT_MODIFIER:
¢ moves the cursor forwards in time one week - i.e. seven days - by sending a cr_MOVE_CURSOR
message to calwin.calimg with an argument of caLimG_NEX?T_weExK and then returns
WN_KEY_NO_ CHANGE.
If keycode is W_KEY_DOWN and modifiers contains W_CTRL_MODIFIER:
ee ee
3-8
3 CALENDAR CLASSES
e moves the cursor forwards in time one year by sending a c1_MovE_cURSOR message to
calwin.calimg with an argument of caLIMG_NEXT_YEAR and then returns wN_KEY_NO_ CHANGE.
If keycode is w_KEY DOWN:
e moves the cursor downwards one day in the calendar view by sending a cr_MovE_CURSOR message
to calwin.calimg with an argument of caLIMG_pown and then returns wN_KEY_NO_CHANGE.
If keycode iS W_KEY_SPACE:
e moves the cursor to today's date by sending a cr_MovE_cuRSoR message to calwin.calimg with an
argument of caLIMG_GoTO_Topay and then returns wN_KEY_NO_CHANGE.
If keycode iS W_KEY_PAGE_UP:
e moves the cursor to the previous calendar page by sending a c1_MovE_cursoR message to
calwin.calimg with an argument of cALIMG_PAGEUP.
If keycode is W_KEY_PAGE_DOWN:
e moves the cursor to the next calendar page by sending a cr_Move_cursor message to
calwin.calimg with an argument of CALIMG_PAGEDN.
If keycode is W_KEY_HOME:
e moves the cursor horizontally to the left edge of the calendar view by sending a cr_mMovE_cuURSOR
message tO calwin.calimg with an argument of caLIMG_HomE and then returns
WN_KEY_NO_CHANGE.
If keycode is w_KEY_END:
© moves the cursor horizontally to the right edge of the calendar view by sending a cI_MoVE_CURSOR
message to calwin.calimg with an argument of caLIMGc_snp and then returns wN_KEY_NO_CHANGE.
Otherwise the method returns wN_KEY_NO_CHANGE.
& WN_SENS
VOID wn_sense(ULONG *psense) ;
rent date
Write the current date expressed as days elapsed since 1/1/1900 to the uLonc pointed to by psense.
Sends a cI_SENSE message to calwin.calimg.
hasise
VOID wn_emphasise(UINT flag) ;
Emphasise the display if £1ag is TRUE, otherwise de-emphasise the display.
Sets the emphasis of the calendar view by sending a c1_EMPHASISE message to calwin.calimg With an
argument of f1ag and then sets the emphasis of the bordered window by supersending a wN_EMPHASISE
message with an argument of flag.
XADD REFERENCE
es eee SSSSSeSSSSSSSSSSSSSSSSSNSe
EE SS ee SS aay
Examples
The following section provides some useful information on using the cazwrn class as a component in an
application.
Creating a CALWIN component
A CALWIN object may be created and initialised as follows:
IN_CALWIN init;
init .flags=IN_CALWIN_1_ MONTH;
p_send (self->kalwin.time,O_TO_SENSE,SENSE_TIME_DAYSEC, &ds) ;
init.days=ds.day;
init .pos.x=400;
init.pos.y=180;
init .calimg=NULL;
init.self_ptr=&self->kalwin.calwin;
self->kalwin.calwin=f_newsend(CAT_KAL_XADD,C_CALWIN,O_WN_INIT, &init) ;
p_send(self->kalwin.calwin,O WN_EMPHASISE, TRUE) ;
The above code creates a calendar view containing one month with the current date set to the date stored in
a TIME object. Note that large values are specified for the x and y screen coordinates to force centering of
the image.
A description of the rrme class may be found in the OLIB Reference manual.
Handling keypresses
The following wn_key method is suitable for an application that wishes to use a CALWIN component. It
carries out the following operations:
e if the keypress is a Tab key, and a calendar view is not present, the method launches a calendar
window and disables the Menu and accelerator keys by writing self to w_ws->wserv. filter.
e otherwise the method sends the keypress directly to the calendar view and the return value
determines the next action.
e if the return value is ww_xey_canceLLED the method destroys the catwrn object and re-enables the
Menu and accelerator keys by writing NULL to w_ws->wserv. filter.
e if the return value is ww_key_cHaNncep the method senses the current date is sensed and stores it in
the TIME object. The method then destroys the canwrn object and re-enables the Menu and
accelerator keys by writing NULL to w_ws->wserv. filter.
3 CALENDAR CLASSES
LOCAL_C VOID DestroyCalwin(PR_KALWIN *self)
{
w_ws->wserv.filter=NULL;
hDestroy(self->kalwin.calwin) ;
self->kalwin.calwin=NULL;
}
#pragma METHOD _CALL
METHOD INT kalwin_wn_key(PR_KALWIN *self,UINT keycode,UINT modifiers)
{
IN_CALWIN init;
P_DAYSEC ds;
INT ret;
if (self->kalwin.calwin)
{
ret=p_send4 (self->kalwin.calwin,O_WN_KEY, keycode,modifiers) ;
if (ret==WN_KEY_CANCELLED)
{
DestroyCalwin (self) ;
}
else if (ret==WN_KEY_CHANGED)
{
ds.sec=0;
p_send3 (self->kalwin.calwin,O_WN_SENSE, &ds.day) ;
if ((ret=p_send4 (self->kalwin.time,O_TO_SET,SET_TIME_DAYSEC, &ds) ) <0}
p_exit (ret);
DestroyCalwin (self) ;
}
}
else if (keycode==W_KEY TAB)
{
init .flags=IN_CALWIN_1_MONTH;
if ((ret=p_send(self->kalwin.time,O_TO_SENSE,SENSE_TIME_DAYSEC, &ds) ) <0)
p_exit (ret) ;
init.days=ds.day;
init .pos.x=400;
init.pos.y=180;
init .calimg=NULL;
init.self_ptr=&self->kalwin.calwin;
self->kalwin.calwin=f_newsend(CAT_KAL XADD,C_CALWIN,O WN_INIT, &init) ;
p_send(self->kalwin.calwin,O_WN_EMPHASISE, TRUE) ;
w_ws->wserv.filter=(PR_WIN *)self;
}
return (WN_KEY CHANGED) ;
}
CHAPTER 4
AUTOMATIC TEST SYSTEM CLASSES
This chapter documents the arssv and atst1m classes that are used to provide Series 3a automatic
application test mechanisms, driven from another process.
Although primarily designed for application testing, the mechanism can be used for other purposes. An
example is its use by the Series 3a Agenda application, when using the Word application to edit a memo, to
force Word to display the dialog shown in the following illustration:
Appointment
ar Normal
This is a memo Outline
Change memo of repeating item
Change which occurrencesRwig
Thu 23
For examples of the use of the ATS mechanism, see the Series 3a Automatic Test System chapter of the
Object Oriented Programming Guide. See also the description of the arsptat class in the Dialog Boxes
chapter of the HWIM Reference manual.
Precursors
Familiarity with the following topics will aid the understanding of this chapter:
¢ inter-process messaging, as described in the Processes and Inter-process Messaging chapter of the
PLIB Reference manual
e the pcs and server classes, described in the Inter-process Communication chapter of the OLIB
Reference manual
e the timer class, described in the Timer Active Object Classes chapter of the OLIB Reference
manual.
Class diagram
/ atssv ae a Bae
> atstim >
XADD REFERENCE
ATSSV
sv_init
sv_run
sv_abrun
sv_free
sv_key
The arssv class subclasses server to provide an application with the ability to respond to inter-process
messages with message types in the range Ty_ATS START_RANGE (0x30) to TY_ATS_END_RANGE (0x3f)
inclusive. The following ATS inter-process message types are defined in the header file ats. h:
TY_ATS_CLIENT_POS ox30 A ClientPos message, to set the application's client position in the task
order.
TY_ATS KEY ox31 A Key message, to send a keypress to the application.
TY_ATS PAUSE 0x32 A Pause message, to pause the application for a specified period of
time.
TY_ATS_ MESSAGE ox33 An InfoPrint message, to cause the application to display
informational text.
TY_ATS_ DIALOG ox34 A Dialog message, to cause the application to run a specified dialog.
TY_ATS_SELF_CHECK ox35 A SelfCheck message, to cause the application to run a self-
consistency check.
TY_ATS_WINDOW_xSUM 0x36 = A Checksum message, to run a checksum on the application's display.
TY_ATS_RECORD ox37 A Record message, to start or stop external recording of keypresses
received by the application.
TY_ATS_GET_KEY ox38 A GetKey message, used with Record, to request notification of the
next keypress received by the application.
TY_ATS_ALLCOUNT ox39 An AllocCheck message, to walk the allocated cells in application's
heap and report on the results.
Class definition
Defined in sub-category file atssv.cl (generated header file atssv.g).
CLASS atssv server
{
REPLACE sv_init
REPLACE sv_run
REPLACE sv_abrun
ADD sv_free
ADD sv_key
PROPERTY 1
{
PR_TIMER *timer;
VOID *pm;
WORD freed;
VOID *pm_key;
4 AUTOMATIC TEST SYSTEM CLASSES
Property
atssv.timer Either nuut or the handle of an instance of the arst1m timer class, used to implement the
pause facility.
atssv.pm A pointer to an ars_MEss struct, containing the current ATS message data.
atssv.freed Set to FALSE on receipt of an inter-process ATS message, and only set to rRuE when the
ATS message buffer is freed (by a call to p_mfree).
atssv.pm_key Ifnot NULL, a pointer to the ATS message data for a Getkey message.
Auxiliary structures
As well as the ATS inter-process message types given earlier in this chapter, the header file ats.h contains
the declarations of the following structures, used to construct the message buffer for an ATS inter-process
message. An application (referred to here as the controlling process) can include azts.h to allow it to use the
ATS mechanism, without having to have any knowledge of the ATS classes themselves (such as would be
given by including atssv.g).
The ats_DIAL_DEF struct is used to specify a dialog to be run:
typedef struct
{
UWORD main;
UWORD mainlen;
UWORD buts;
WORD butslen;
} ATS_DIAL_DEF;
The meanings of the members of this struct are as follows:
main The offset within the controlling process to a buffer containing the loaded resource for
the dialog.
mainlen The length of the main resource.
buts Either nuuu or the offset within the controlling process to a buffer containing data for
one of the dialog's controls. The data may be a choice list resource, a action list
resource or a text string (up to 256 characters, including the terminating zero) for an
edit box.
butslen The length of the buts resource.
See the Series 3a Automatic Test System chapter of the Object Oriented Programming Guide and the
description of the arspzat class in the Dialog Boxes chapter of the HWIM Reference manual for further
information on the ars_DIAL_DEF struct.
The ats_key_per struct contains the keycode and the modifier flags for a keypress sent by means of a
TY_ATS_KEY inter-process message:
typedef struct
{
UWORD key;
UWORD mod;
} ATS_KEY_DEF;
The data of an ATS inter-process message is contained in an ats_MESS_Bopy struct:
typedef union
{
UWORD position; /* used for TY_ATS_CLIENT_POS messages */
ATS_KEY_DEF k; /* used for TY_ATS_KEY messages */
ATS_DIAL_DEF d; /* used for TY_ATS_ DIALOG messages */
UWORD delay; /* used for TY_ATS PAUSE messages */
VOID toffs; /* used for TY_ATS_MESSAGE messages */
WORD par; /* used for TY_ATS_SELF_CHECK and TY_ATS RECORD messages */
UWORD wid; /* used for TY_ATS_WINDOW_XSUM messages */
} ATS_MESS_BODY;
XADD REFERENCE
ae eee SSS
and the ATS inter-process message buffer is an ars_mess struct:
typedef struct
{
E_MESSAGE mess;
ATS_MESS_ BODY u;
} ATS_MESS;
See the following description of the sv_run method for the usage of the various message buffer members.
When ATS is being used to record keypresses the data for each keypress, in response to a TY_ATS_GET_KEY
message, is contained in an ats_xevy struct:
typedef struct
{
UWORD time;
UWORD keycode;
UBYTE modifiers;
UBYTE count;
} ATS_KEY;
This struct corresponds to the keypress event part of a window server ws_EvENT_x struct, defined in wiib. h,
starting with its time member (that is, omitting its leading handle member).
SSS SS EE SS ey
ATSSV methods
Initialise
VOID sv_init (VOID) ;
Initialise the arssv object.
Supersends the sv_inz7r message, passing the start and end of the range of acceptable message types as
TY_ATS_START_RANGE and Ty_ATS_END_RANGE respectively.
Note that the superclass method sends an 1P_app_sERvER to the instance of (a subclass of) the OLIB recs
class whose handle is stored in w_am->appman.ipces. This object must therefore have been created before
the instance of arssv is initialised. On the Series 3a an instance of rpcs and an instance of arssv are
always created and initialised during the initialisation of the wrmman application manager.
Process an
ino sssage
VOID sv_run(ATS MESS *pm) ;
Process the ATS inter-process message whose message buffer is pointed to by pm.
The value of atssv. freed is set to FALSE and the pointer pm is copied to atssv.pm. Further processing
depends on the inter-process message type, stored in pm->mess.type:
TY_ATS_CLIENT_POS
Sets the application's client position by calling:
wClientPosition(pm->u.position, 0) ;
and then frees the ATS inter-process message by sending itself an sv_FREE message, with a return value of
zero.
TY_ATS_KEY
Processes a keypress received from another process.
The ATS inter-process message is first freed by means of an sv_FREE message, with a return value of zero.
The method then sends w_ws a Ws_PROCESS_KEY message, with a keycode of pm->u.key keycode and a
modifiers value of pm->u.k.mod.
4 AUTOMATIC TEST SYSTEM CLASSES
—— OEE PE OP STS TEM CLASSES |
TY_ATS_PAUSE
Pauses the application.
If pm->u.delay is zero the method sends w_am an AM_YIELD message and then frees the ATS inter-process
message by sending itself an sv_FREE message, with a return value of zero.
If pm->u.delay is non-zero, atssv.timer (an instance of atsTiM) is sent an AO_QUEUE message to generate
a relative timeout with a time interval of pm->u.delay tenths of a second. If atssv.timer is NULL, an
instance of arst1m is created and initialised, and its handle is written to atssv. timer, before the ao_QuEvE
message is sent. If the creation or initialisation fails, p_1eave is called, resulting in atssv receiving an
SV_ABRUN message. Otherwise, the freeing of the ATS inter-process message is handled by arstxm, at the
completion of the pause.
TY_ATS_MESSAGE
Displays an information message copied from another process.
The message to be displayed is copied from offset pm->u.of¢s in the process with process ID
pm->mess.pid. This message should be a zero terminated string and may be up to 128 bytes in length,
including the terminating zero. Before being displayed in the top left corner of the screen, by means of a
call to the window server function winfoMsgcorner, the message is padded with two leading and two
trailing spaces.
The method finally frees the ATS inter-process message by sending itself an sv_FREE message, with a
retum value of zero.
TY_ATS_DIALOG
Runs an ATS dialog.
Creates an instance of arsprat (see the Dialog Boxes chapter of the HWIM Reference manual). If the
creation fails, the method frees the ATS inter-process message by sending itself an SV_FREE message, with
a return value of &_GEN_NOMEMORY.
Otherwise the dialog is sent, under the protection of p_enter, a DL_DYN_INIT message, passing the pointer
pm and the handle, seif, of this instance of arssv. If the return value from the DL_DYN_INIT message is
non-zero (indicating that p_leave was called) the return value is copied into the dialog's atsdial.ret
property and the dialog is sent an o_DESTRoy message.
In all cases where the instance of arspza was successfully created, the freeing of the ATS inter-process
message is handled by arsprat on destruction of the dialog.
TY_ATS_SELF_CHECK
Performs an application-specific self-consistency check.
Sends w_ws a WS_SELF_CHECK message, passing pm->u.par and then frees the ATS inter-process message
by sending itself an sv_FREE message, with a return value of the result returned by the WS_SELF_CHECK
message.
It is the responsibility of the application's subclass of wseRv to provide a meaningful ws_self_check
method.
TY_ATS_WINDOW_XSUM
Performs a checksum on a specific window or on the whole screen.
Calls the window server function ginquirechecksum for the window with ID pm->u.wid (an ID of zero
performs a checksum on the whole screen).
The method finally frees the ATS inter-process message by sending itself an SV_FREE message, with a
return value containing the result of the checksum calculation.
TY_ATS_RECORD
Starts (if pm->u.par is non-zero) or stops (if pm->u.par is FALSE) Keypress recording.
If attempting to start keypress recording when recording is already in progress, the method simply frees the
ATS inter-process message by sending itself an sv_FREE message, with a return value of E_GEN_INUSE.
Otherwise the method sets the keypress recording state (by storing the handle of this instance of arssv in
DatGate->gate.getkeys) and sends itself an sv_FREE message, with a return value of zero.
rs er ee
4-5
XADD REFERENCE
a ss SSS
If stopping keypress recording the keypress recording state is cleared (by clearing
DatGate->gate.getkeys). If atssv.pm_key is non-zero, indicating that a Ty_ATS_GET_KEY inter-process
message is outstanding, that message is freed by a call to p_mfree, passing a return value of
E_FILE_CANCEL and atssv.pm_key is set to NULL. regardless of the initial value of atssv.pm_key, the
method finally frees the Ty_ars_Recorp inter-process message by sending itself an sv_FREE message, with
a return value of zero.
TY_ATS_GET_KEY
Transmits the next keypress to another process when in the keypress recording state.
It is a programming error if an inter-process message of this type is received when the application is not in
the keypress recording state, as set by the earlier receipt of a ry_ars_REcorD inter-process message.
If atssv.pm_key is not wuLL, indicating that an inter-process message of this type is already waiting to be
processed, the method frees the ry_ars_RECoRD inter-process message by sending itself an SV_FREE
message, with a return value of E_GEN_INUSE.
Otherwise the method simply copies the message pointer pm to atssv.pm_key. The message will be freed
by the execution of the sv_key method, when the application next receives a keypress.
TY_ATS_ALLCOUNT
Checks the application's heap.
Sends w_ws a WS_GET_ALLOC_INFo message, which walks the application's heap and displays an
information message showing the number of allocated cells and the total number of bytes of allocated
memory. The method then frees the ATS inter-process message by sending itself an sv_FREE message, with
a return value of zero.
an error
VOID sv_abrun(ATS_MESS *pm, INT ret) ;
Provide additional, specific, error processing.
If atssv. freed is FALSE, indicating that the ATS inter-process message has not yet been freed, the method
frees the message by calling:
p_mfree (pm, ret) ;
VOID sv_free(INT ret);
Provide the normal means of freeing an ATS inter-process message after its processing.
Sets atssv. freed tO TRUE, Calls:
p_mfree (self->atssv.pm, ret) ;
and then sends w_am->appman.ipcs aN AO_QUEUE message to queue a read for the next ATS inter-process
message.
ypress
VOID sv_key(ATS_KEY *pkey) ;
Report a keypress to the process that has previously registered an interest by sending an ATS inter-process
message of type Ty_ATS_RECORD. An sv_kEy message is received from the ao_run method of the
application's instance of a subclass of wsERv.
If atssv.pm_key is NULL, the method simply returns. Otherwise, the ATS_KEY struct pointed to by pkey is
copied to the offset atssv.pm_key->u.offs in the process with process ID atssv.pm_key->mess. pid.
Following this, the current ATS inter-process message is freed by calling:
p_mfree (self->atssv.pm_key, 0);
and atssv.pm_key is set to NULL.
4-6
4 AUTOMATIC TEST SYSTEM CLASSES
ATSTIM
priority
isactive
pcb
stat
destroy ae—tadte
ao_init
ao_run
ae init ao_queue
ao_cancel tm_qabsolute
ao_abrun
ao—quere
ae—sen
The atstim class is specifically designed for use by arssv to implement its Pause function. It is not
expected that application code will explicitly create an instance or send messages to any instance.
Class definition
Defined in sub-category file atssv.cl (generated header file atssv.g).
CLASS atstim timer
{
REPLACE ao_init
REPLACE ao_run
PROPERTY
{
VOID *owner;
}
}
Property
atstim.owner The handle of the owning instance of arssv.
ATSTIM methods
AQINT 28 x
VOID ao_init(VOID *owner) ;
Initialise the ATS timer.
Supersends the ao_inrT message to open a channel to the Tm: device and then copies owner, the handle of
the owning instnce of arssv to atstim.owner. The final action is to add itself to the application manager's
task list, with priority zero, by sending w_am an AM_ADD_TASK message.
CORRE ; Pr
INT ao_run(VOID) ;
mpletion
Process completion of the timer interval.
Frees the ATS inter-process message by sending atstim.ownex an SV_FREE message, with a return value of
zero.
CHAPTER 5
ADDITIONAL ACTIVE OBJECT CLASSES
This chapter documents the tocona and unLoap active object classes.
Precursors
Familiarity with the following topics will aid the understanding of this chapter:
e the active class described in the ACTIVE Class and Active Objects chapter of the OLIB Reference
manual.
e the p_logona and p_logoffa PLIB routines described in the Error Handling chapter of the PLIB
Reference manual.
e the use of dynamic link libraries: see for example the Object Oriented Programming chapter in the
PLIB Reference manual and the Building a Dynamic Library chapter in the Object Oriented
Programming Guide.
Class diagram
si active” ;
v tb faye
7 a
logona > ” unload >
XADD REFERENCE
LOGONA
q
priority
isactive
pcb
stat
destroy ao_init
ind ao_cancel
ao_queue
ao_run
The Locona class is used to queue a request for the termination of a process to be reported. The report is
implemented by sending a specified message to a specified owning object.
Locona adds value to the PLIB p_1ogona routine by packaging the mechanism into an active object,
thereby simplifying the detection of the completion of the asynchronous request.
Class definition
Defined in sub-category file xactive.cl (generated header file xactive.g).
CLASS logona active
{
REPLACE ao_init
REPLACE ao_queue
REPLACE ao_cancel
REPLACE ao_run
PROPERTY
{
UWORD pid;
VOID *owner;
UWORD mess;
}
}
Property
logona.pid The process ID of the process whose termination is to be reported.
legona.owner The handle of the object to which a message should be sent on termination of the
process.
legona.mess | The method number of the message that is to be sent to logona. owner.
i ee SS ee Se ee eS ee SS EE Ee
LOGONA methods
lnitialise
VOID ao_init(UWORD pid, VOID *owner,UWORD mess};
Initialise the Locona object.
Initialises property by writing pid to logona. pid, writing owner to logona.owner and writing mess to
logona.mess.
Adds se1£ to the task queue by sending an am_app_TAsK message to w_am.
> eS
§-2
5 THE LOGONA AND UNLOADA CLASSES
Queues a request by sending self an Ao_QUEUE message.
AO_QUEUE
VOID ao_queue (VOID) ;
tuest
Queue a request for a report of process termination.
Queues the request by calling the p_logona PLIB routine with as arguments logona.pid and the address of
active.stat. The call is made under the protection of the f_1eave PLIB routine.
AQ_CANCEL |
VOID ao_cancel (VOID) ;
Cancel a queued request.
If active .isactive is non-zero indicating that a request is active:
° cancels the request by calling the p_logoffa PLIB routine with an argument of logona.pid.
¢ — ensures that the cancel has completed by calling the p_waitstat PLIB routine with, as argument,
the address of active. stat. :
e — indicates that no request is now outstanding, by writing FALSE to active. stat.
Note: this method may safely be called if no requests are outstanding.
AQ_
INT ao_xrun (VOID) ;
Report process.termination
Report process termination.
Reports process termination as follows:
p_send2 (logona.owner, logona.mess) ;
Indicates that the event has been consumed by returning RuN_ACTIVE_USED.
UNLOAD
UNLOAD
cathand
gq
priority
isactive
peb
stat
destroy
ao_init
ao_run
ao_cancel
ao_abrun
ao_queue
BO—FR
The untoap class is used to queue a request to unload a dynamic library. It provides a convenient means of
ensuring that a dynamic library is not unloaded until completion of the current task - or until the next
AM_START message is sent to the application manager.
An UNLOAD object automatically assigns itself a very high priority in order to ensure rapid completion of the
request.
SSE
5-3
XADD REFERENCE
eee
The unzoap class is intended to be used in a DYL that is loaded by a mechanism such as that provided by
the WSERV ws_launch_dy1 method - that is, where an instance of a single class in the DYL is created and
initialised immediately after the DYL is loaded. The untoan class should be made a component of the class
in the DYL that is created and initialised and should receive a pesTRoy message when that class is
destroyed. Since initialisation failures are handled by the mechanism of the ws_1launch_ay1 method, the
instance of unLoap should not be created and initialised until all other initialisation is complete. Doing this
ensures that the instance of untoap will only receive a pesTRoy message in circumstances where unloading
the DYL is a valid operation.
Class definition
Defined in sub-category file xactive.cl (generated header file xactive.g).
CLASS unload active
REPLACE destroy
REPLACE ao_init
REPLACE ao_run
PROPERTY
HANDLE cathand;
}
}
Property
unload.cathand The handle of the category to be unloaded.
UNLOAD methods
_ Destroy
VOID destroy (VOID) ;
Destroy the untoap object.
If unload. cathand is non-zero, sends self an AO_QUEUE message.
Otherwise sends self a DESTROY message.
VOID ao_init (HANDLE cathand) ;
Initialise the untoap object.
Writes cathana, the handle of the category to be unloaded, to unload. cathand.
Assigns itself a high priority by writing pRIORITY_ACTIVE_POSTER tO active.priority and then adds itself
to the application manager's task queue by sending w_am an AM_ADD_TASK message.
A
VOID ao_run(VOID) ;
Process completion
Unload the target category.
Unloads the category specified by unload. cathand by calling the p_unloadiib PLIB routine and then
sends self a DESTROY message.
The method returns RUN_ACTIVE_USED.
INDEX
AO_CANCEL, 5-3
AO_INIT, 4-7, 5-2, 5-4
AO_QUEUE, 5-3
AO_RUN, 4-7, 5-3, 5-4
COM _EXIT, 2-23
COM_INIT, 2-22
COM_MENU, 2-22
DESTROY, 2-3, 2-10, 3-4, 5-4
DL_DYN_INIT, 2-25, 2-27
DL_KEY, 2-25, 2-27
LPR_INIT, 2-3
PVC_PREVIEW EXIT, 2-24
PVC_PREVIEW_JUMP, 2-23
PVC_PREVIEW_MARGINS, 2-23
PVC_PREVIEW_ OPTIONS, 2-23
PVC_PREVIEW PRINT, 2-23
PVV_DONE, 2-14
PVV_INIT, 2-15
PVV_MARGINS, 2-15
PVV_NEW_PAGE, 2-15
PVV_PAGES DONE, 2-15
SV_ABRUN, 4-6
SV_FREE, 4-6
SV_INIT, 4-4
SV_KEY, 4-6
SV_RUN, 4-4
WN_DODRAW, 2-20
WN_DRAW, 2-12, 2-17, 2-20
WN_EMPHASISE, 3-9
WN_INIT,-2-12, 2-17, 2-21, 3-5
WN_KEY, 2-11, 3-7
WN_REDRAW, 3-2
WN_SENSE, 3-9
WN_SENSE_HELP, 2-10
WN_SET, 2-12, 2-17
kab
|
ee
ss cemeel heron
b « BP Bhs ia,
EP Te MOT A
; 2Pe PO |! Wa
; She Tih wax
ese Ata a2
fe fe hear MC fee gn
7a TE TAL ON eS |
fet HE NA io
Get f
bf, 1 RNS oe ©
tes an WAR V4
T eat AM WarzaaT ov
re £. Slag we v4
£1 VEN a re
Ab AM
> e Sans
fe ee
we 77 *
ph gilt