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 


