SIBO 'C' Software Development Kit 


FORM REFERENCE 


Version 2.20 


March 1, 1999 


(C) Copyright Psion PLC 1990-97 


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, Psion Series 3c, Psion Siena and 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. 


6102 0026 01 (v2.10 SIBO C SDK Bound) + sheets from 6102 0050 01 (v2.20 SIBO C SDK Update Pack) 


CONTENTS 


1 Introduction.............ccsccsssssrsssssssrssersssreeseeeeseseesseesseesseesseesseesseesseesseessesssesscesscesscsesessseseseesseees 1-1 
Using FORMsClasses: cscs, fect Seg. eed ede iasbedegecdannpbantstesiectoceeiantstett eeloeepbantseeiecbonpiactees 1-1 
Measurement Units... cic. ccctessecaiestcaiseesuadevaeancasvesabacovduarcdsvdsetccsvdcancdevacebedevacancdevecsoceuvanes 1-2 
IN ATI OM ade oat ceeded be eet ated alee dante chsh al ctedes thee Ah ab Madivte shan lhe aver atone cece 1-2 
NAMM eS 5 scesveesdeecccda cise cesvaes betan res edes vaceiceneteavduancouacessseevdvasecst cesaduevdvancaatceseaeeviassiancteeens 1-2 
Method function prototypes ...........ccccccceeeecccecesececeeeeeeeceesaeeeeseeeeeeseaeeeceeeaeeeseeneeeeeeeas 1-2 
The. ‘no leave symbol-...:1:5.avesaegepdeet egustest ipiasbedes desedegdesd oder besdegiblesbeds eibdeydeeb diated 1-3 
LONG: Parameters ose. vcs e5 Gansta sees eth vanes coe oUheoee (oratoaisotegestverseods ssangens deestouussavesst raed ats 1-3 
Class: diagtams: sss:2.0hidseivncid eisai evil en eaves nee Rasa 1-3 
Class Hier ar hiys fst. diessetedptatecegeted sii tentecesets dante nanterevedetodteaintecdedetoctpnieh esse etetoaeptanhats 1-3 
Structured Error RECOVELy :..:s.5:c.yscsbeuiyiesdeseyseeneainbesteseyoivacaiyhs eshylesbegsyoeb beavaes gape dedaoeey 1-4 
Use of the p_leave mechanism...........e ee eeeeceseecsseeceseeeesseecsaeesseecsseecesaeeesaeessaeeseeeeens 1-4 
Panic NUMBERS oi si..cccvises cess scka cea cctecevs ccae cee edcaacenvecaa sua vdcda cuaucdaadeandesveeaeceanevandeaeevasceaetens 1-4 
Gall-back: tmieth OdSvoiscacsaivedeassodesstavedeatcadeces deduce ve daeutevseedutashgniatecedolath ddsintecssatete Maacatetearts 1-5 
MU xi ClasS@Sivicsceieescciedestedesdenuedeadescdevivatsdoedval cdovdsabecondssledovdshbedosdeatcdovdcabddevecdocdevcdeesenceds 1-5 
2 The Formatted Document Content Classes..............cssssssssersssrsserscssscereserssssssssssssesssessessseees 2-1 
The FORMDOC mixin class ...........ccecescccceeenceeeeenceeeeeeaceececesneeceseaeeeeesnaeeesseaeeecensaeeeeseanees 2-2 
Class diagram «: $1; 2th is Sakic HE eee ed ie ee a ce ees 2-2 
Class etinitiOnsccrei. detects deccdiaseestéiaess cabin scvugaieasessainsseutscvacnatbiaaceusscuacvasgianiadesdessetzanys 2-2 
PLOPELY es5 sess2ehs cess ivesch lune cast cevstessonnssushctvons duie suv bauvedun Saves Cob bauvadan dees CaVtsuvseunldevs cubs Pex 2-2 
FORMBDOC methods isis ucresdsecdercaiecdendan cdarcathelaadaiedaaaginecaadaniadaacathateadaniedeadescoudentoaneatcs 2-3 
Scan to start of paragraph... eee eeeeeseecesneecsseeceseeceseecesaeeesaeecsseecseecsseeeesseesseeenes 2-3 
Provide:characters:..i) Jc. ieniciitdn cin daadiaidtedetad acseeidad teas hasheacetenedh Ateoiacebvin ieee 2-3 
Sense paragraph layout data ....... eee eeeeeessecesseecseessscecscecsseeessaeessaeecsaeessseeessaeessaes 2-4 
Sense-paragraph labelesssiccesssusscssgsisceesasvetsasaassteehatues soe sasasnsagued susacasdeasacusonbecasooetagass 2-4 
Returiiva:page number 25:4 fui Gokul ea iia eh ea ee 2-5 
EPDOG so aviesi vais. bseiuscssetioel stespdenties) A avtesssanhoni | Socereuapiael Asuras abtaoes Anoneas Aerie Aaprass 2-5 
Class dia Sr arin os. civs2.i5 28 cecys codsccvn pul secns cova ehbeseh savas eas csbaded Sanne pevtedes ded stubs nettesbsied sausea state 2-6 
Pa Sit Ati Oni y.525.ssectsscacauedslaoestasiasantasbentaciasoendasstentactaguentattsstanswonendaseesieg asneadateasteniss 2-6 
Document filter ise iiss science cheat becheactSs opeuck cuneach Secnavetceetones tens Mentevende ce eeerhonesea tenes 2-6 
Class: definitiOt.t ssc: ae Bintnitto Bhd Rais dia dena atatie nie 2-7 
PLOPOLly suces cvs dee ssuseteass es ussvbatevss sta teva feeedevss Uacees seadeossots See peietvoss 3 seeneeadeess Gatevae shee 2-8 
EPDOG method sis. leutisiac coucsiveeasea ne cas aisocaiegng cata usteaieaancca saa eceaaaenestacansoannaaingsuacginaaeaaaies 2-8 
Tittle’. cscs eo sat cess ctieeesencicacsecetoeseaneecsenaces orevenenasstacveeass teseonen eavannoetauonenersioresteuntiee ins 2-8 
Sense:document len Sthyis.siss.ceet 8 Asta. cael Aatiesecetp ies dapteisushasedugheteoses podeenhass 2-8 
Serise: characters forwards sz cscvesei ceeescusacuvetes sdiescudaavve teh sbuus cudasuwedessdnecedbsubedessankesesadne 2-8 
Sense characters backwatds...........cccsscccessssceeeeeseceeeeeneeeceesneeeeseneeeeeseaeeeceenaeeeeeenneeeesees 2-9 

TiVS]rt CHATACTERS 3565.5. ci55 Seeecd kos eadovbs dnsonts Seva coessanbened reve Guess deuesen ceeseuane dus eves Sovsgeunaccbe¥l Sous 2-10 

Copy: charactersissssiswssh sot nsidoeindsehaieenB deinen ainsi bAdansi anatase 2-10 

Delete: Characters’: ciiosc cts asestathorsctsdeebentetuvssetsahwaeadstees saves setenasselaauonsabsleessvladwerswyilaveds 2-11 

Glear the doctimenit, 27333: .ci.scsvasesscatieanidaeiteucnesoenscaeaoounatavoracaas soategieoveneais nvtesueeseed ess 2-11 

Compress'allocated: stora se... scis05 Succ sihctge dosed choco bests hub da shdcebostbesebbestaedesbetsiowsicee 2-11 

Set (or clear) the page: list....::.5.asti6 Mohs aie Asis one Anite a Mente Mattei aes 2-11 

REtuIma: Page NUMBER 4.2.5.2: 52. heck aces teshevee teh deve seitedbetalddeondeag ceesaehedenscuitcuvedea hdevedensPee 2-12 

Get position at the start Of @ Page... ee eeseesseecsseecsseecsseeeesaeeesaeecsaeecsaeesseeessaeeesaee 2-12 

Set (or clear) the filter list... ccccccscscccccccsssssseeceececesseesneeeeeeceesseesseeeeeeeeeesesssaeeeees 2-12 


Getunfiltered position. s 355.chci Ahi Aah edted ss Mache siitessades nasetedessnostuanscs 2-12 


FORM REFERENCE 


EPDOE call-back methods i0..::.:2.ssiss.2cecdenstens sshcdeesadeeeiensduvedeesdevesudedupeteusuevecta sdvectessivescea sy 2-13 
Scan.to start.of parderaphis.s.ic:.scctaccssdauseasteaisceaadesdoastaniocsesdashovelgaieceoudaaseeenatestdaeieanass 2-13 
Provide characters x: hssc.cidiistectaeisdhisies Seieeh isha dtieionhusiad Nboshicindl eaibebeiodensts 2-13 

BPEDOG 7a stots aries ibis BA haiac hb Ashsenhsuhalen hs Asie Sasha amas 2-14 
Class dia Sram. bors says eces2h osc Fash suestewses a bases tiwssiba tues cos tawss Daahie eavatsosechs Hees seisteeseds sede 2-15 
Class:defnitiomissiscciiscicesseaiioesnasuspeasdaninestasespesngataceatasagesteauioeatanageeheatazeatsdoeone Motes 2-15 
PLOPOrey. « soesieccveibsshcees Sevakosk sieheaess iuedovbadabdecbudutdowboduhtaesodca gostadghivstedeadestodesiesyolengevboegtees 2-15 

EPFDOG-call= back Methods: ae :csi2, Sisssostiesscpeodoss osetieshceveossedussdeseiehs atdoe, peasdapiousedereceseds 2-15 
Scan: to-start of para sraphy sic. css dosce cause seosehveteh shveesvdsdevetes ins tvibdevedeeseesaiaduvedebsadea se 2-15 
Provade:characters:...:civoisctsiteestagiaceadaosstsssavesndaiaosatacisossntahecusanidosendaeeantancaosendais ens 2-15 

3 The Document Layout Classes...............ccscccsssssssssscsscccsscssccsssccesssscsessssssesssscscesssscsesssssesessssees 3-1 
PLECULSOLS secs seeserats tis soutsssetsehpoanteceessneeveystuscnnysiuberepstebeaspsdebeavestaCesedniutecveedutuseendassvecnde 3-1 
Class. didertatn .t.c:5.cc:.gccthened asians etpissdgaebes te plant eth ds eeigdant ens edagibiten el atibee 3-1 

SCRICA Yio. dcr ete eh ot eh ie tet nat eet ne Mit Aa eat eesti a oat ome sth Diet canvhitesh aed 3-2 
Class: definition j:iessshehiitieinnd aren ean dn ieee aia 3-2 
PLOPCEEYe cei. ccess iy evatoctpewetshgecatoreges ores satorbipstabedepainteruvetathdeyaiatedtestatedushatedesseseacvede 3-6 
DatasStructures-siceccvascaive dtesivtieaigotitesitisechastebde tesa este arecee dare beardee eda pheseds 3-7 
Special Character ssc. ie cees26asscecbus oes aM eveveacs ses cabctorevtuetettabeess hace sanedutenss Lact scnasuceemes leek es 3-7 
Font-width ‘tables... 2:/scsgiini gi tavis het cilia aaiieeeiaeth bi ced aiadainy 3-8 

SERA Yomethods yo. t..adaco gates ceewasesite gates saueadetezey oltneespaeet bees sdanevecaesthtes tdnavepbestedepeteae eee 3-8 
Initialise: 3322.s532 she ieiyit anak eet aie la eee 3-8 
Setslobal: layout Style cosy. At ses sites aves sesvasatows oust sa stite a ouas saviouateal ouaton tate sted 3-9 
Sense global layout style... cee eeseesecceseeceseeesneecsseecscecsseeceseeessaeessaeecsaeesseeessaeeesaes 3-10 
DESILOV oy ssessces ctessens easisee pstessvte sth ovepstviovegstubonepsanteaspsuunedepeluaeerpeuuiuevesSuceeesndunseepsdessesvent 3-10 
Convert position to line number and pixel Offset... eeeeecesseeeeseeeeneeeeseeseseeeesaes 3-10 
Convert line number and pixel offset to POSitiON ............eeeeeeeeeeseeeeseeceneeeeteeseseeeesaes 3-11 
Get horizontal pixel offsets of start & end Of LINe..... ee eee eeeeeeneeeeneeeeseeesneeeeseeeesaes 3-11 
Prépare:towtead line: datars so. sticscct cee, achpeseteecsegetennds int venpecesotepsins sespedesstepsceh vesgsustodeynant ss 3-11 
Read: lin e:data's.es3.cyssiectoaned eeytekgeipaust (gach sed paaid ge ep UB Ge aise 3-12 
Foriniat the next line... ise. bees cae shade shied cae totes east he eehad etait ant eat aie 3-12 
Scroll the layout:.ccuss.vieieieinn tn invests herein ati eee 3-12 
View position On given Line... eee eeeeceseecsseecesseeeseecscecseeecesseecseecseeseseeeesaeessaeers 3-12 
Discard layout’.2:3. hc ntecpene chee eee eey aides eigenen einen Rye 3-13 
Adjust screen/printer scaling ...........eesceescecsseecsseecesseeesseecsseecsaceceeeessaeeesaeessaeesseeeee 3-13 
Set number6f littes.i:)syicsitiens hari Aires Ai een Miah aani ati 3-13 
Discard lines from PoSitiOn..........eeeceeseeceeseecesseeeseecsseecsseecesaeeesaeecsaeecseeseseeeeseessaeers 3-13 

WRAP cic cg uetcetegupigsieke Szi Deny dae dba Bei Dede pben Ganda DRL Ug Pa RE ep EIT 3-14 
Class: definition». 2 svt an. se Beet eA eR het eA eR esl ie ae 3-14 
PLOPCLly. Sdinc tase Bi Nee ea Se A EE MG a es 3-14 

WRAP methods) o...2.55c:¢3 ssp edisets datey bank thd ete godess ateshg evetedepscetethy otatedeyacet ests etebedesbeetaceg etetedeber’ 3-14 
Tri tal se wicca: cece teeiyacs bees beh Lec yoesedandesdecoyonee intel Teeoydevs iva Degavoese egal eaapoesk epheidemrte 3-14 
Queue a line format request... eee eeesseeeeeeceeeseeseeeceeesesseeeceessesaeeaeeeseeeaes 3-15 
Format a lin@ seis ssactelcn tas eevee alavin ina tas aivtere oar ain teen een eee 3-15 

SS RII Gress fives aden aaeet oh atte vaca sotatag oft cacbeatbne ott eres Ot adeno eat te, eltne ee eet ats sana eal 3-15 
Class. definition: 2: .cgiterireetgiedehetinaat give bettas aoe eigasd eave and eee 3-16 
PHOPOUUY. Seas sou. stateas save egssseeesh Yo wet sus hbedeve cotet sau rsivesat Vouet sano alutscnsbuetomsnasuvec Ueustcteastusernests 3-17 

SCRIMG methods s:) eset veel nein eh eh Behl eave ie Beh eda! 3-19 
DEST OY si ees Seachde pote peacoat pe tet satis ee0s skp ede seduya Cobadey eds Sante aeehechy Pa tledde sdetedh p eSetoaepss@becegetecerny ost 3-19 
Tri ta lise iiss 35.5 octet cccev teal bese coysivedbindes Deeovone i phustesaytows Qigaas Deeaehese Revdeibe seh eediyi beste 3-20 
Seb Views and layout o o.5. cts fetes ons abcde tetoes Rist cats teat owe Sheba tiad ene hae tet en Reet 3-20 
Sense Window information .......... ce eeeseessecsseecsseeceseeeesseecsaeecseeseneesesaeeesaeesseeseneeeees 3-22 
Seb Emphasis OiOL: OFF. axes se geeec ite paven hc beat eee oven ety seat otep odes Bea adet Ar tees eeysio ay eee 3-22 
Get select TES OM si52.s52:stescrehe edi beel ai eee ep a eee 3-22 
Scroll the image horizontally... eeseeeseecsseecssceeesseecseecseeceseeeesaeessaeessneeesteeeesaes 3-22 
Scroll the image vertically .............cesecesssecsesessseesessereneetonsnessonevensenensetensnessosertosenenens 3-23 
Show position on Given line....... ee esse seseecsscecsseeeseecseecsseecsscesesaeecseessseeseseeeesaeeees 3-23 
Set the Cursor: positiOn yvos3i552teceyeee gays ek egavaesk cdepeel buss deecdaplelbussreesvehepiasseneeeiyoabeety 3-23 
Draw to: S1ven: TéCtam ol Oy. ooh sis sat oot eetbee ah ai eakttesl ae eeind oi tet ok ae ete AO 3-25 
Discard screen layout, view and redraw..........eeeesceeseecsseecssceeeseecseecsseeessaeeesaeeesaeers 3-25 
Discard layout and redraw.........eseesecescccsseecesseecseecseecsseecsscecesaeecsacecseecsseeeesaeeesaeers 3-25 
Prepare for-a left delete. :.s::c:.cc2vait apcetigivis ded platen vesdehpoalin iia evinces 3-26 


ii 


CONTENTS 


Draw paragraph to echo content Change .......... ec eeeeeeeeeseecceesseeeceeeeesesseeeeeeseeesensaeees 3-26 
Redraw to echo a style Change ........e ee eeeseseeesseecsseeceeecescecseecsseeessaeecsaeesaeessaeesseeeees 3-26 
Redraw for a change after the CUrSOF POSItION ......... cee eeeeeeeeseeseeeeeeeetsaeeceeeeeseeeeeeensaee 3-27 
4 The Document Printing Classes...............csccccsssssscsssssssscssccssscseecssccsesssssesssscsssssscesessssccsessssseeees 4-1 
PECULSOLS canadien tie hipi eats Mana haat arena tea 4-1 
Class Cider arms: 2essesiet ok abst eae A PA BR Ae OL as a a tat on 4-2 
Measurement units <.. 523) savauiichiiei aie aii ciel einai ane aeinovaiate 4-2 
PRINTER 1 6 pect te cot Sad cst edasd tet dandatet dis tesbertd eset tue t coteanyedahctugaeetonvs ates step teeteandedetedeptentedes 4-2 
Class:definition:. ssi: acsinsan een oias ile a aaron ein aa ie 4-3 
PLOPORby foci Soci cae dai ese shis Sok va entiv sunt ius siesta s Mut ies oaltessta ul des al ttece saben den Gade eauvaust ows 4-5 
ENVITONMENt VarIAbles ........... eee ceseecsseeeeseecesceecsseecseecsseecesaeeesseecsseecseecsseeeesaeeesaeers 4-5 
PRINTER meth O85 et se 2 essciee coces soup since ves bces deg suns eve cecebete p tone deeavetbeagaletn paeetetes ateue es eeten ss 4-6 
Destroy the print Manage ...........eeeeeeeccesseeesneecsseeceseeeesaeeessececssaeessaeecsaeersaeeesseeeesaes 4-6 
Initialise printer & set default ValUeS 0.0... eee eeeeeeseeesseeceneecsnceceteeeesaeecsaeersaeesseeeees 4-6 
Set serial port Characteristics .........eceesecsseecsscecsseeeesseecsseecseecsseeeesseessaeesseessneeeesaes 4-6 
Set print file:spect Cat On w..e.c..ecssetsche vet ese usnhsvte svete depsentanhs edetedephceterds detedesbiebentsetetes 4-6 
Setitype of printer Port: .ssi2.s.scc08s.peeidegayeeheaesiasdesbedesbgephasded end. masdenededceepoebianies 4-7 
Set printer model no. & WDR file name... eee eeeeesseeeeneeceseeeesseecsseeeseessseeeesaes 4-7 
Sense printer port information ........... cee eeseesseecsseeeeseeeesseesseeceseecesseecseesseessseeessaes 4-7 
Sense current printer port device information ...........cceeseeeeseeceseeeeeeeseeerseeceteeeesaes 4-8 
Sense printer model number & WDR file name... cee eeseeeeseeeeneeeeneeteneeseseeeesaes 4-9 
Fetch address of printer parameters ............ccceesceesseecsseeceseeceseeeesneecsaeecseesseeesseeeesaes 4-9 
Set top or bottom header text... eee eeseessecsseeceseeesseecseecsseecsseeeesaeessaeesseessneeeesaes 4-9 
Get address of top or bottom header text... eeeeeseseeceseceseeseeecsseesseessseeeeseeeesaes 4-10 
Create: WDR ‘Object is227..ecicc2.55: teeiaideeteain apie Teese ied pie evel. pie eeaedobd pa ees 4-10 
Destroy WiIDR: Ob]eCt .ss6.222. Setect asics ccketeet cee cade coseteet ooh att ockt tant cas bth stet ce ai vente 4-10 
Open printer port device s..2icseiee ates avast esi eeaistei es ineeince enone ieee. 4-10 
PEIN E data SOULCE 0) ef ssns cevacec ite kote fees cesotey ate eter edatb tes alta te bles Lay otnnanh poet ate pldaeverranteaes 4-11 
Paginate data SOUTCEcc.scc..c.cccicesseieseedundesbevandeseedandeveevendesed ior devvedendcavidandcousdendersacaadens 4-11 
Initialise: Preview ...2 0:2. et ce atedseeversdce otietemsctectorechebumsace de distumeredtemeieeterdeeecteestt 4-12 
PerfGrit preview #i.s5:38. eine thi eal ai ce Te si al a ie 4-13 
P@LTMn Ate: PEC VIEW: Py encodes oct cedetebyspetedepstet slp aeutedesgadeer es idutedeetegstlpnsstaveseseesreph Sievert: 4-13 
Return handle of preview data ............cccccecsesscceesenceeeesneeeeeeeeeeeessaeeecseseeeeeseneeeeesneeeees 4-14 
AGES | tess nat Sects sak hele ect oat seed ceutical cet alt cata tiiet ooh aoa heel deh Cal acictat cat alone ces 4-14 
Class -definition:.3:.sse cat essergestat an cargitel assae aisle iavainel ainda alleat 4-15 
PLOPOLbyh it ccvecevoacitetovasivevacatete detauase aden ogee atausch codes etecstagncegbceteten aiacoweebees en gakace ch bees eis 4-17 
Pape dimemSiOns?..3:.2.20;c5.2c2.e3esbegepeasd caey des bedigasd daavee bagi paael eeeyheibedepate) asdesdeepanebemaaaesy 4-20 
PAGES iii eth od 8rses os cot Sse sth ies cen tte est saa ER het oes A Gt eee ER eat cesses Wee 4-21 
Initialise and Queue... cscvcccecescccdivesecdiaecseccssecdecdscevas ccaeveas ccsescatecessete cenvadnecesveese couveaavens 4-21 
Fetch text pritit Clement :.0-20:.22¢ ssh ede; test etegetapethe seshetes ade b sate seebedepedesoatp eset edepetetenteravbeded 4-23 
Handléserror stig sa re tities Batihenr eerie nl arise eats tsb atareaede 4-24 
Translate the print element and print data ...........ceeccceeeessceeeseeeceeeseeeeeeeeeeeeesneeeeeeees 4-24 
WDR.eicsasesesteiteaiy hi wanes Si snes aa etenir baarseey duties tas saedhsiee vonssaedsieave nes 4-25 
Glass de finrtronis rag fates Se adeeae toes ieee ote kt aca lat ch eet wena beet te otageveprentedg 4-26 
Property sist matin ase eat ei ein aaah dha tdiadey 4-28 
WD Rettieth ods sic fos sic cocthhe tock atin seus stat ech Vue oe aude ch vsned auth oetsah Vorut ct ath feeesoust anna tutes least oat 4-29 
DEST Orisa ch seest i eR ioe ti eve CO hd St VR Pd UR a ot 4-29 
Tmittalise WIDR os. ics fest eden acteg sceesnee seh ede pate tsatp esate dogadessnepidutedeyeten sulpnautadesesesuephStavevers 4-29 
Return the number of models............eeceeesessseecsseeesseeceseeeesaeecsseecsseesesaeessaeeessseeeesaes 4-30 
Get model name from model NUMDET..............eeeeeseeceseeseseeceseeeesaeecsaeerseessseeesseeeesaes 4-30 
Set: the current model wisi: auceeseds nt ass havent savant sh mail Aiea wearin) 4-30 
Sense:current MOdel datas, .cccce., 21s svocest dey ose set alec evepedeeschys iets aeede peiae eg eteeetegeatsty 4-30 
Get typeface by index s..c:.t.c.ys.despeedeeeseibaaigtis deere badges deevieibeds pated dandesbeepane beta oes 4-30 
Get typeface by typeface NUMDET........... ee eeeeessecsseecsseeesseeeesaeeesseecsaeecsseeceseeeesaeessaeers 4-31 
Get font height by typeface & height indexes... eee eeseceesseeesneecsseecsneeseseeeeseeeesaes 4-31 
Get font index given height 0.0.0.0... eeeeeeseecssneessseecsseecsseecesaeeesaeecsaeecseessseeeesaeessaeers 4-32 
Get a requested font width table... ee eesecsseeceseecsseecesseessaeecsaeecsseeceseeeesaeessneers 4-32 
Get printed: Width Of text,..0.655 02h ccketedt oak vad ees het seh aides taeh ah cides at ah aie et ees 4-33 
Convert twips to primter UNItS 0.00... eee lee eeeeeeesneeeseecssceceseeeesaeessaeecsaeesseesseesesaeeesaes 4-33 
Create a PDR for printer OUtPUE........ eee eeeeceneeceneeeeseecesaeeesaeeceaeecsseecstaeeesaeeseaeers 4-33 
Load resource record's). Jsicses3 sh. bsedediate she aehbedigdasd ceseeelbadigdn esa epdeed eee apda ezine 4-34 


iii 


FORM REFERENCE 


PIR sins ss s2uv5i0s Yai an abe suts dens dos Sevke devs 2evetbs sQube covetebsdts Raves favpeesdia stvie eladeoseuv Dues fubadeustonstebesd 4-34 
Class: detnitiOn: sc etiatactiatatedescsticaradeteteacaieseadaisedaveainoeutastoatassnoontassosuug antaeoeetens 4-35 
PLOPOUEY: 6s decks Hiis chewed ca eacbeis ondgweh Seoaeackb eedense ce sdgnchecsdewshceshousie evbuveacegoauetecedgnuh ocessouhe sevens 4-36 

PDR methods’: pth cindncnidce Bhindi Biba ena nadis leaded aeheadaahe eae woesee ces 4-37 
DGStOY 6. ck sas nseets chug peta tioes os hadeea tees svbs chu osvaateos svesdevassuadevs selaceoasevadvos sts Deeaeessbeesecdsdevaed 4-37 
MnitialiSe: PIR sic. Messtes ssa tistassates ouatesenaates iozeatea ecules aaeateseeates aGcatesaecatesieeeatess 4-37 
Translate print: command ..:. 2.0205 56: shag idisioces ecklgi Seed oegs ehh Posh ocestoekien Podesta ade 4-38 
Add: command to butter: is. asises deseties oesacacssesatdassuseiassovsstcasovasdaandunsdbavsentvanssvancianses 4-41 
Destroy method, subclassable by DYL.............c::cccessssceeeeeeeeeeenceeeeeeeeeeeseneeeeesneeeeesees 4-42 
Start: Prim tim Os; :32.6c0stestas.sidseseeuneaiacestizskedsteasapageaveataanscaeabaissstaaieeerelavaeetasisaeudawdoestasy 4-42 
FmaShs print Seine 235 casts cecveks doe eas ceeseuche den enck ceeesechecesetuncasheustegebetuicevneuet cession covsasel cbevene 4-42 
Stata New pages: esis sinsieohAshsaaisl hina adohiasie haan As 4-43 
Print text at CUFFENt POSITION... eee eeeeceseeesseeeesceeesneecsaeersseeceeecesseecsaeessaeessneeeesaes 4-43 
Stara Mew lanes: wcasceessestesiiaesteaiaavatdeiiosetesiiorsweceateass teancaenesaneaeaeaaaaneeanaaaeoeusasenoannesy 4-43 
Position to the right ............c:ceeesccccessseceeesseeeceeneeeeeeeeenneeeeseaeeeeeseaeeceesneeeeensneeeeeseeeeess 4-44 
SeUthefont.. othe vecpeasnetiees Mecteasseetiees dadias vaeuis Arvadves Svasbues Araeheka veves ca deeebees uveaeaaes 4-44 
Set-the font Style seccicegssiset stews sesesthe eetsceuscipbehe delsceuseuvscts ful sceescavssbead dewseuvtsieendeveuees 4-45 

‘Ehe;PAGELA Y-mixaniClass's..2:iiesstcsiaesadelines basing aseee teens at banteasteaeats aateausaaiaceutlanteartacs 4-46 
Class: dias r aris of 5esig isch sedis seh eocd vated sotewud Moveved gekes th caus eek Seneend aubabebsdehge th esubebebelevrs 4-46 
Class definition cic ahciiioBAhic ad hiainiaseh fhsanei Assn Asenatharti Rivka koetiaacteeds 4-46 
PLOPOLUY.4 de ccvssapsavehietedeons ods dean seteteusscds cevaseeduvs cous dave seid dese rodsckvasvadustscdadevs snesduetscds Gevedn 4-46 

PAGELAY call-back methods............cccscccecessceeeseeceeeesnneeeeesneeeeesneeeseeeeeeeeeseaeeessenneeeeeeas 4-46 
Get next WDR_PRINT element.............c cece cccccessseecccccececaeseeecccesesaueeecccesssaaaeeeeeees 4-46 
Handle stattis Messages ..........cseccccesssecceeeenceceeeesececeseececseeeeceeeaeeecsenneeeseeeeceeseeeeeeess 4-47 

PRINLAY , eissscattebit ceed astinedst deus eet ehtevexg cavhsledel fave eos h¥eied piven cavbebbeded Sante eavtedneed Saetes 4-49 
Class detinitiOnser-40cssschaccustavtcessaatacswstevieasicg eco eatantesnteatieawttiaveaieanooundinsoouageantateaateny 4-49 
PLOPOLbY. 5 sos secictes de cigoui oa caceeisecaeses Seeacevie covewsh cosvguvaceuvensa coup aust eveaseiog goguete egsanes oessgeehedeeaee 4-50 

PRNLAY methods ici so: nstdccie Mains Biaiiaen in dada hla a naonas. 4-52 
Read text fOr primtin 8. foic$5 205 fesstiost ts bal eviedeeseds he deviiteess bes ntedonreigeerededeera desea te 4-52 
Set'start:position: for Prints s.-..s25..255hsackcvesds laps iisehceptahasestasacesteasseahdispesteaateatsctase 4-52 

SeTES 3 a/SETIES BS NOCES 5-66 och acek | Festes Mee vdoed ba sh ctahegvesaeioeseetesedeusechos seeten sovadeenoustetes Saewaenristess 4-53 

5 The Print Preview Class ..............cccscccsssssssssscssccsscsecsscssesssscssesssscsesssscscesssscsessssccseessscssessssees 5-1 
PLECULSOES 33.5353 ct Rae hyde ERE DER ea oats eve Gera ee eS ace 5-1 
CASS AA STATI Fe sae Soe sah kN as Sak GR eae Se AUR cas ER Ea A cee See A ee Soc eset 5-1 

PRV PDR bixaisiiteetes Givaraiinin etalon cai an Se a rain ian aTAL 5-2 
Class: definiti Ottis... ee saycenteveceesdt. sedate coset deteneeadoensetecolucede Geintede deluth cides deletedieses 5-2 
PrOPCrlycosies stses FeMee te eee piso Sis ai eee 5-3 

PRVPDRotes st eh ee at et ee at te had Aa eA i heat el eh nee ae ha 5-5 
Initialise .:33sh.cbsl svar dies avi aia aveil nie aad ted eae 5-5 
Interpret print COMMANA.............eececeeeeeeeeeeenceeeeeeeeeeeseaeeeeeeneeeeceeeeeeeesaeeeceeneeeeeseneeeess 5-6 
DESthOY i i2ite octdead cis tohitcaeyis teat edst eye Re a eda Roar ben eee ee 5-7 
Start: printins (drawing) asc. seive ek inde ht es ail dst teve olathe et see elds latent ates 5-7 
Slart AMCW Pale sisi ch stsont ai ea vent As isards irate venvaa moneda cyan eau aeetouan lesa 5-8 
SOE ME TON tie. ccceavine canst d otegete doses ete s canna ve Cointedeselieees Point elioesssacs deintedeaateededadelededadiledseras 5-8 

The PRNTPRYV mixin Class ...........cccccccessscceeesececeseneeecseeeeceesaeeecesneeeessaeeeeeesaeeceesessneeeensas 5-9 
Cl aSS Gia Sram. sec is 8 Sets i cet abe sitoek Laeist sce g sues cake stones sbageeh Covetomes sited. Gustaseestatediats 5-9 
Class definition j.cccccsactaecadiecccicsec tas cedevvanceatucevccsescarcevescanceds senecenvecndessscceucesvadauesaeeates 5-9 
PLOPCUby voc sil seats euseet su cset stave cobs egede dea Uracobsnudegs Getty acosscts efetects eestechs esetedtgpestberegesstoaepess 5-9 

PRNTPRV call-back methods.............cecccccceesecceeeesceeeeeeeeeceeneeeceseaeeeceseaeeeessaeeeeestaeeeeseanees 5-9 
Han dle:status messages vc. civices cab abet ook cesta esitt ede ist oh altho dice oh Ah nee ae 5-9 

6 The Calendar Image Class................ssccssssscssscsseccsscssecsssssescsscssesssscscessssescssssssesssscsssessscsssesscees 6-1 
BLO CUTSOM Se: 335 2051 Lacie sxigseus cnchosetales oavbeucde souesuncyabenche seiebuncaoeanehs gueevenceueousteseeetuscostenetsaesere 6-1 

CALIMG ei:8 sou ica ae Aiad oi win AAait aoe uiiaretphst siti ends Aaya etait 6-1 
Class definition: 2.30032. esas teeth eteeen hs Mebalh tees nies Madevsdtexeribbeiabadeostata deed bas ceased 6-2 
PLOPOrey a szisseecsss sass as lawss aadsiiaceassihe vandanssoabacascestastioassazaapestasassestaganaestesisoeenaaiaasatasevsene 6-4 

CATEIM Gr imeth ods ie cies cack cde deck des danke Sendesdeceniucke denaned eduvanehedeedoheauvavenndeaguehonueenenedenaeescaveess 6-5 
Destroy: the Calendars: :::./scs2ctc.aisbesarisesAsstusicsavdocecessdiasscasdossestuaseesebissseenbeascesedisbshe 6-5 
Initialise: the:calen dat: si.c5ccckacecessseks cas vaihe cot sehen cTaebed oh cache res sdebs eck daebecetadebsitlcess a00ecebs 6-5 


iv 


CONTENTS 


Set the: ttle ssc ses eis Ms saves cevsghbs Peektws favs tebstee steko cedibs fea dee sveadivsie Sivbesethtevsres toes wastes 6-7 

Empliasise the: views sisisvcietcseaceandascasteslasesndathenstes sseandackea teatveandadeas tea aoensdsoaieatee 6-7 

Move the Cursorisss sscasi hectic Shetaocks csdeoss Heeignsht culevssSasvouebessbenehoguoceuhe iuteses Sigtesvbecuteava cage 6-8 

Move the: cursor by:date.cs(stssicaseAsphsr tb dsiisi eh idarhal tee sdaehai ate bans 6-9 

Adjust the current date «a. :2c0:20.008 sis tevscdevsestachessctativcedesdivssasddvestolschvastbadvestdieteesevbatss 6-9 
Redraw patt-of the viewss2..i2:.sssesisiicastcsiagcsidanieoatiaapcauatsgesteavgeahasusgesteasnpeasathnestaasss 6-10 
Sense the current: dates ssciscsseei gh Sik aoa Seek nego see oak dunched Mee den esha eee 6-10 
Dra with e: View. ecaisviess sted: sf cose hesssrsebiek avsphisssraioss heidissecasbond sattiassaeeisedaciesscnsibenb annus 6-10 
Move the cursor by POSitiONn.......... ee eesecssecsseecsseeceseeeesseecsaeessseeseseeessaeeesaeesseeseeeenes 6-10 
Update-today.s:datevis.tiscccstesiassandaihctssenianssadathensteaiaseandacseastea woeenaisea teaiaoeasioasedeteaise 6-11 

7 The Polytext Classes.............ccsscccsscssscssscsccsssscccsscscesssscscesssssesssscscesssccssesssscsesssscssesssscssesssoesors 7-1 

PLECULSOLS wes desssuc tess esecs eustatsvelesehtevvedes sieeodeseaevsteseveporet teuetebs tipedetswuedegusecebauteesesiaty 7-1 

Class:diagtaim's:...yiscscyiast etal api nied oad nie ig sent en alain aed 7-2 

PT ROOT stesso 5 tig seh ted oe a te Gl ea ete i a i te ae 7-2 

Class definition i::3:3.vhsinivkis erie eee evi eave ae hie ay hier avei eee 7-2 

PHOPOIEY. do fas sR saet ocedess Sects cute vids Setedupa swtece pete Gete'sssteceveStedust eters dade odds debedededeh tuvacetedes 7-3 

PTROOT imethods..2.c:si.: arcitneak aise kp eeneei eis yae iyi lesyoee inten eehb eens 7-4 

Add phtase-to:butfer sc). cciesc ok aces Auk oak aU ech intia auton Aue deh aM eta dead ode Ge eed 7-4 

Wrap the text 2,.csstscctessiest as cavieievent aaecea sees oes eaatian dei ssuauceps tavdeave st ccuadeaveeisimteaaaces 7-4 

Draw aime Ob texte, veins vecetls2egsioceveceees ote gaiete Mpstetotegssenevegeest cages etgutsbevesotes setpstatevsy se 7-5 

Set font UD sissies cote hseaepsest gibi d osepaaad an bes eda dead een ged spas seb HA aaa eh aaa 7-5 

Set font ID and style by phrase .0...... eee eeseeceseceseeeseecssceceeeceseesesaeeesaeessaeesseeenes 7-6 

Set font ID and style by attribute... eee eceseeceseeesseeeeseeeesaeecsseecseeceseeeesaeessaeers 7-7 

Find phrase by attribute ...........ececcceceesecceesencceeeeeneeecseceeeeseaeeeceseaeeeeeenaeeeeeeneeeeeeeeeeess 7-7 

Find information about a phrase..........eeeeeseessecesseeceseeceseecesaeeesaeecsaeesseessseesssaeeesaes 7-8 

PT ROOM deferred: Methods 35 e.oc¢ cas sct eels tact ote csvet cake beet ote shns aeksaast ote tulnds da taut devsbededds iets 7-8 

Initialise:.ics.cedeasdishiecmbaitinl siete ai alinteihin ah erent nialineeai ati ate 7-8 

RESO isi. feat suv erand esas ete gsdit vag suntbaepsdutenspstuceaypsluseavpsiateaey statues prtbedssdutee paces svessdehevsvadeseaey 7-8 

Append @ record 53:5 caccestcgiggesdesepdest dey ashe digdend cdoydesbadagduel cdoydeibedepdssb dandesbedepdved eda heby 7-8 

Store line-lensth table:.:.2. c.2ht.eet lee ie ea Aina 7-9 

Get address of phrasés:) icainiihi reich arisen laa 7-9 

DPT SAT coteahs snt ceeds casledas wea tedtes cet scedatat feet cobs ede tee coca date tes tote tedatetlsea ehededetet de Talend 7-9 
Class definition. syisien silt nein iy ielienp eee aise epan ieee ema ep es 7-10 
PHOPORby cess ek eek sek sah ovat ook valid ene s Sua iok vas ess Suh ek wahtows oBhut deh wal oe vate ee dabnt eoe unt eat 7-10 
PTFUA Tmethods) ietscisscesiiettisnevanist Gitergiiat au cavaiisicsieauaieel aimee aie 7-10 
Destroy them stance: sz. vocedzegeioer deus cos tegeianis coder hte alate iegecetedegadentve peeat ide dete teerestetey 7-10 
Initialise ..ces.ecnieiapi si eet eisai opie i yi aa ape epibeeie 7-10 
RESCE: gu. tues coca iets nt eat tithe Males cee acts aad can sate ae Pala dau nuk Baa sev alah eas Sev sete Vout sas 7-11 
Append a phrases. iccesseeis cates cesecssvevacidacesdeceesevacadeuevaa deveevaadeveccda cess scatedevsctacenvecaedees 7-11 
Store line-len sth table: yg. s ect cces szesy sue evavesesereesantevepetosenes tanhevsdedesoeustonteabeeverecussenteney 8 7-11 
Get‘address of phrase: s.::..c.c..:s4 0ytesesipa edges tiieae ieee pdsedeydevbee pac lecteabbenepae beans 7-11 
PY SEG ees aie atin an chet ti aoe att Me a ti a Arta ak Aleit ih alate ea 7-12 
Class :definition.::.sstastvncaiiieienhatahapiiniincavai eles aie cumdaneieies 7-12 
PLOPOreys. oiscs cee cat ete eleul ve gained pstaec ve peen sete geseue sh palette oalatn de vatutedvgscupade dade teesdagnveeacaseaey 7-13 
PT SEG methods sis.25;50:3 gincestegigdeidedordestgis eidediptead eaves bedi paes deeb dipieel daebbetepd aay 7-13 
Mind 1 ALT SO) toes Bes ot ween sa seh. Poaat ea tea aaah cde estates shed cau vatetesbtaesb ate saiete eusteeestieesantont wate 7-13 
RESClaiaiienauietuBin vel ai oad eats Ph ene Sad eat ee a ed eae 7-13 
Append a: phrases, sso: fee esleicctscedesnt ecupsceteceg ode pate acetetegsdh tesug teste dagedeseitpeeubededetetesterestecey 7-13 
Store line-lensth ‘table w.2.: cc.cs.cscepseltesiptediyecibeshedesdaeyoesbactpdesd caeyoeibasnediel Goyhelbesiydnedets 7-13 
Get-dddress: Of Phrase: fo de sase sk esiht cake has cee shag ah hak ae etek ae lnte ae ea es 7-14 


CHAPTER 1 


INTRODUCTION 


This manual is a reference document for Psion's FORM library. It provides a comprehensive 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 useful pre-requisite reading as it provides the necessary 
background to Object Oriented Programming as implemented at Psion. It can, of course, be read in 
conjunction with the FORM Reference manual. 


The FORM library is a collection of classes which provide a range of document formatting and printing 
services that are independent of the user interface used by an application. The object classes it contains 
can be used directly or can be subclassed by any application code. Many of the classes inherit methods and 
property from classes in the OLIB library; the OLIB Reference manual is, therefore, a useful pre-requisite. 


Use of the FORM library allows complex applications to be built quickly and reliably. 


Each chapter in this manual contains a description of a number of closely related classes. For example, the 
document layout chapter discusses all classes related to the laying out of text on the screen. 


The description of each class follows the same format. It includes the purpose of the class, the hierarchical 
relationship of the class to other classes, the actual class definition, a description of the property and a 
complete list and discussion of the methods. References to relevant manuals are included where necessary. 


The FORM library is supplied as the form.dyl dynamic link library in the ROM of all SIBO machines. 


All classes in the FORM library are ultimately derived from the Root class which is described in the 
OLIB Reference manual. It is, therefore, a required component of all object oriented programs. ! 


The content of this manual describes the version of FORM as it exists on the Series 3a and Workabout (it 
is identical on these two machines). In general, this is also applicable to the Series 3. However, where 
behaviour on the Series 3 differs or where certain features, methods or property are not available on the 
Series 3, then this will be noted at the appropriate points in the text. 


Using FORM classes 


An application (or DYL) that either subclasses or creates an instance of a FORM class must declare an 
external reference to the FORM 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 form 


This ensures that, amongst other things, the defined constants representing the external category numbers 
for the FORM and OLIB categories (in this case, cAT_MYAPP_FORM and CAT_MYAPP_OLIB, respectively) are 
available to application code. 


! Tt is, however, permissible for a category that has no intrinsic dependence on other OLIB and FORM 
classes to define its own root class and thereby eliminate all dependency on OLIB and FORM. See, for 
example, the Building a Dynamic Library chapter of the Object Oriented Programming Guide. 


1-1 


FORM REFERENCE 


In the source code of the MYPROG application, an instance of an FORM class - say, of ptszc - would be 
created with p_new (or £_new) as follows: 


p_new (CAT_MYPROG_FORM, C_PTSEG) ; 


.If myprog.cat defines a subclass of a FORM class (say, the class susptsEc) this would exist in the local 
category. An instance is created using the local category number cat_mypRoG_MypPRoG, as follows: 


p_new (CAT_MYPROG_MYPROG, C_SUBPTSEG) ; 


Similar consideratons apply to instances created by means of £_newsend. 


Measurement units 


Measurements are generally presented to the user in inches, centimetres or points (there are 72 points 
per inch). 


Internally, these measurements are stored either in twips or printer units. A twip is a twentieth of a point, 
so that there are 1440 twips per inch. 


Printer units are defined to be the natural units associated with a particular printer. The size of the unit 
thus varies from printer to printer and is defined in the printer driver file (see WDR Printing in the 
Additional System Information manual). The unit may be one tenth of an inch for a printer that has a 
single monospaced font, whereas a typical value for a laser printer is one three hundredth of an inch 
(corresponding to a printer resolution of 300 dots per inch). The war_twips_to_xy method of the wor 
class, described later in this manual, converts a measurement in twips to the equivalent in printer units for 
a particular printer. 


Notation 


Throughout this manual, all references to the Series 3 should be taken to refer to the Series 3a, unless 
otherwise explicitly stated. 


Names 
Except in class diagrams a class name is always given in upper case, for example scriay. 


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 dest roy method function 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 Eppoc with the title line: 


EP_ SENSE CHARS Sense characters forwards 


and prototyped as: 
UINT ep_sense_chars (TEXT **pbuf, UINT pos, UINT n); 
would be invoked by, for example: 


UINT n,pos; 
TEXT *buf; /* to take pointer to buffer */ 


n=40; 
pos=400; 
n=p_send4 (hand, O_EP_SENSE_CHARS, &buf,pos,n) ; 


1 INTRODUCTION 


where hand is the handle of an instance of the Eppoc class. 
This corresponds to a method function declared in C source code as: 


METHOD UINT epdoc_ep_sense_chars(PR_EPDOC *self,TEXT **pbuf,UINT pos,UINT n) 
{ 


} 
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 dest roy 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_leave is called outside a p_enter harness, the process will be panicked with panic 
number 47. 


The p_leave mechanism and its use in method functions is discussed briefly in the section on Structured 
Error Recovery later in this chapter. 


Long parameters 


A small number of FORM class methods require a Lone or a ULONG parameter. For the reasons explained 
in the Introduction chapter of the Object Oriented Programming Guide, the message-sending mechanism 
in TopSpeed C does not support such parameters and they should be passed as two tnt (or UINT) 
parameters, where the first is the least significant word and the second is the most significant word of the 
data. In such a case the actual method prototype is always followed by a conceptual form, illustrating the 
intent of the parameters. 


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, 


e 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. 


FORM REFERENCE 


For example, the following diagram would be included in a description of class cccc subclassed from BBBB 
which itself is subclasses aaaa. 


property_1 property_4 
property_2 property_5 


method_a method_b 
methed_—b method_c 
method_d method_x 


method_e method_y 
method_z 


method_u 


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 ppp but replaced in 
cccc, and so on. Note that method_u is a deferred method. 


The root 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. 


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_1eave, 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_leave being 
called. 


In the event of an error (such as out of system memory) occurring a method may: 
e call p_leave, passing the (negative) error number, 
e return the error number, 
e either call p_1eave 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 
return 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 voip. 


Some method functions that may call p_1leave 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. 


1 INTRODUCTION 


Call-back methods 


In general, an object passes a message to another object by calling the appropriate method using the 
relevant method number. Within the code, the method number is usually a symbolic constant generated at 
category translation time. 


However, an alternative is to define suitable property within the calling object and set the property to 
contain the method number. The code can then be constructed to use the value in the property, rather than 
use the symbolic constant. For example, in a class asc, a call to such a method would take the form: 


p_send(self-—>abc.handle, self—>abc.methnum,...); 


where the object's handle is assumed to have been written to self->abc. handle and self->abc.methnum 
has been previously set by, say: 


self->abc.methnum = O_METHOD_NUMBER; 


Clearly this is slightly less efficient, both in terms of memory usage and speed of execution, than the more 
usual: 


p_send(self-—>abc.handle, O_METHOD_NUMBER,...); 
It does, however, offer a number of advantages that, in certain circumstances, can prove to be of use: 


e it allows the message being sent to be changed dynamically during the lifetime of the calling 
object 


e the method number can be passed to the calling object, avoiding the need for the calling object to 
have any knowledge of the class to which the message is being sent - this can be of value in terms 
of design 


e it allows the service to be supplied by any class that supports a suitable method function 


e it effectively provides a multiple inheritance mechanism for the inheritance of class behaviour 
(but not of class property) 


Mixin classes 


A mixin class is a class that is defined for the sole purpose of being combined (or mixed in) with other 
classes to provide more sophisticated behaviour. Such a class encapsulates a single aspect of behaviour for 
the inheriting class and is not intended to be instantiated in its own right. The following figure illustrates 
a typical situation and shows that mixin classes are associated with multiple inheritance. 


~ ~ 


- mixint =) mixin2 — 
< as ( 
\ \ \ pet 
ae ca 
‘a ggreg / 


\ Ae 


—_ 


For further discussion of mixin classes see, for example, Object Oriented Analysis and Design with 
Applications by Grady Booch, published by The Benjamin/Cummings Publishing Company, Inc. 


Although Psion's object oriented programming system does not support multiple inheritance, a mixin class 
is an ideal way of formally specifying the required functionality of call-back methods. In application code 
terms the mixin class itself has no physical existence, but its method functions will be implemented as 
part of some other 'real' class. 


This manual contains formal descriptions of three mixin classes: 
e =the rFormpoc mixin class, described in the Formatted Document Content Classes chapter; 
e the pacELay mixin class, described in the Document Printing Classes chapter; 
e = the prnTPRv mixin class, described in the Print Preview Class chapter. 


Each of the chapters referred to above contain 'real' classes which implement the respective mixin class 
method functions. 


CHAPTER 2 


THE FORMATTED DOCUMENT CONTENT CLASSES 


A window that is to display formatted editable text will own a class that contains the document text. The 
display of the text is managed by a further two classes - an imager class (for example, scrimc) and a 
layout class (for example, scrLay). These two additional classes (described in the Document Layout 
Classes chapter of this manual) are both formally owned by the window, but interact with each other and 
the document content class to provide displayable formatted text. 


l c Window / f scrimg - 
“s ) ™~ ) 
Ne X 
Document _ ) scrlay = / 
C content. ——__& 
x ) = ) 
ee C- 


During its initialisation, an instance of either the scrtay class (described in the Document Layout Classes 
chapter) or the prnuay class (used when preparing printable output, and described in the Document 
Printing Classes chapter) must be provided with the handle of an instance of a suitable document 

content class. 


The document content class must support up to five specific services (two of which are mandatory) by 
means of up to five call-back methods, whose method numbers are also passed to scRLAY Or PRNLAY. 


This chapter specifies the nature of the services that must be supported and describes the document 
content classes that are supplied in the FORM library. 


FORM REFERENCE 


The FORMDOC mixin class 


para_start 
sense_chars 


sense_plabel 


sense_pdata 
enq_page 


The rormpoc mixin class provides the formal specification for the call-back methods that must be 
supported by any class that provides access to the text content of a formatted document. These methods 
may be called by the scriay and prntay document layout classes. 


For a general discussion on call-back methods and mixin classes, see the Introduction chapter in this 
manual. 


The rormpoc class does not appear in the FORM library and an instance of rormpoc will never be created. 
The FORM library supplies the two classes EPppoc and EPFpoc to encapsulate document text and provide the 
behaviour to manipulate and query it. These two classes, described later in this chapter, supply the 
minimum set of rormpoc call-back methods required by scriay and pRNuay. 


Application programmers are, however, free to supply the methods in either a separate user-defined class, 
or by subclassing Eppoc or (more rarely) EPrpoc; any such methods must follow the general specification 
prescribed by this description of the rormpoc class. 


Class diagram 


The following class diagram formally illustrates the relationship between the rormpoc mixin class and the 
scRLay layout class (see the Document Layout Classes chapter in this manual). Exceptionally, this 
diagram shows the root class in order to emphasise the multiple inheritance aspect of mixin classes. 


~~ or oa oe 
nec, f — 
C root / C formdoc / 
~ es ) 
es Sa ee 
a a 
C scrlay / 
~ ) 
Ser 
Class definition 
CLASS formdoc root 
{ 
DEFER para_start scan to start of paragraph, mandatory 
DEFER sense_chars sense character content, mandatory 
DEFER sense_plabel sense paragraph 'label', optional 
DEFER sense_pdata sense layout data for paragraph optional 
DEFER enq_page sense a page number optional 


} 
Property 


None. 


2 THE FORMATTED DOCUMENT CONTENT CLASSES 


FORMDOC methods 
FORMDOC_PARA_START Scan to start of paragraph 


VOID formdoc_para_start (UWORD *ppos) ; 
Find the position of the start of a paragraph. 


The parameter ppos should point to a uworp value which specifies a character position within the 
document text; the method should scan the text to find the position of the start of the paragraph 
containing the specified position. 


The position of the start of the paragraph should be written back to *ppos. 


A method that performs this function is mandatory; it must be supplied by the object designated to be the 
supplier of document text to an instance of scRLay or PRNLAY. Versions of this method are supplied by the 
EPpoc and Eprpoc classes. 


FORMDOC SENSE CHARS Provide characters 


INT formdoc_sense_chars (SCRLAY_SENSECHARS *sense, SCRLAY_FONT **pf, UBYTE **pfw); 


Sense a block of up to ws_MAx_PRINT_BOX_TEXT_LEN contiguous characters of data of the same style from 
the document text. 


The parameter sense must point to a data structure of type scnLAY_sENSECHARS. This structure, which is 
included as part of the scriay class definition, is as follows: 


typedef struct 
{ 


UWORD pos; document position to sense 

WORD printer; TRUE for printer data, FALSE for screen data 
TEXT *buf; address of character block 

WORD blen; length of character block 


} SCRLAY_SENSECHARS; 


The value in sense->pos specifies the document position where sensing is to start. The address of a buffer 
containing the first character should be written to sense->buf and the number of contiguous characters 
available in this buffer should be written to sense->blen. 


The value written to sense->blen must be less than or equal to ws_Max_PRINT_BOX_TEXT_LEN, even if a 
greater number of contiguous characters are actually present in the buffer. There are two reasons why 
fewer than this number of characters may be available: 


e the characters terminate at a physical boundary within a segmented buffer, that is, at the edge of 
an individual buffer segment 


e the characters terminate at a logical boundary where, for example, there is a change of font or of 
text attributes 


If content-specific layout (i.e. line segments with individual font and style information) is not supported, 
the parameters pf and pfw may be ignored and the method should return rausz. This is the case with the 
document classes Eppoc and EPFDoc. 


If content-specific layout is supported, the parameters pf and pfw should not be ignored. 


If pf is not NuLL, the method should write into pt the address of a pointer to a scnLAy_Font data structure. 
This structure, which is included as part of the scruay class definition, is as follows: 


typedef struct 
{ 


UWORD fid; font ID for screen or typeface no.for printer 
UWORD style; font style (e.g. bold) 
UWORD height; height of printer font 


} SCRLAY_FONT; 


This data structure contains information that describes the font to be applied to the sensed characters. 
The font descriptor should relate to either a printer font or the corresponding screen font, depending on 
whether sense->printer 1S TRUE Of FALSE. 


FORM REFERENCE 


If pfw is not NuLL, the method should write into pfw the address of a pointer to a font width table for the 
font that is to be applied to the sensed characters. The font width table should relate to either a printer font 
or the corresponding screen font, depending on whether sense->printer 1S TRUE Of FALSE. 


The method should return tTrRuz, if the characters terminate at a logical boundary, otherwise it should 
return FALSE. 


A method that performs this function is mandatory; it must be supplied by the object designated to be the 
supplier of document text to an instance of scRLAy or PRNLAY. Versions of this method (which do not 
support content-specific layout) are supplied by the Eppoc and Eprpoc classes. 


FORMDOC_SENSE_PDATA Sense paragraph layout data 


VOID formdoc_sense_pdata(UINT pos, INT printer, SCRLAY_PDATA *p); 
Sense layout data for a specific paragraph. 
The paragraph is that which contains the character position specified by the parameter pos. 


The parameter p should point to a data structure of type scrLay_ppata. The structure, which is included 
as part of the scriay class definition, is as follows: 


typedef struct 
{ 


SCRLAY_MARGINS *margins; Paragraph margins 
SCRLAY_TABS *tabs; Paragraph tabs 
SCRLAY_SPACING *spacing; Paragraph spacing 


} SCRLAY_PDATA; 


If the parameter printer contains the value TrRuz, the method should write the address of three data 
structures of type SCRLAY_MARGINS, SCRLAY_TABS and SCRLAY_SPACING Into p->margins, p->tabs and 
p->spacing respectively. The information in the three data structures will describe the printer layout for 
the paragraph. 


If the parameter printer contains the value ratsez, the method should write the address of two data 
structures of type scRLAY_MARGINS and SCRLAY_TABS into p->margins and p->tabs respectively. The 
information in the two data structures will describe the screen layout for the paragraph. Since vertical 
spacing is not represented on the screen, p->spacing can be ignored. 


A method that performs this function is optional and need not be supplied if there is no paragraph-specific 
layout. If, however, it is supplied, it must be by the object designated to be the supplier of document text to 
an instance of SsCRLAY or PRNLAY. 


FORMDOC_SENSE_ PLABEL Sense paragraph label 


VOID formdoc_sense_plabel(UINT pos, INT printer, PRNLAY_PLABEL **p); 
Sense the label data for a specific paragraph. 
The paragraph is that which contains the character position specified by the parameter pos. 


The method should write into the parameter p, the address of a pointer to a PRNLAY_PLABEL data structure. 
This structure, which is included as part of the prnuay class definition, is as follows: 


typedef struct 
{ 


SCRLAY_PLABEL s; as for the screen 

UBYTE *wid; the font width table 

UWORD margin; margin for paragraph labels in printer units 
UWORD gutter; gutter between label and para margin 


} PRNLAY_PLABEL; 


If the parameter printer contains the value TRuz, the method must specify all members of this data 
structure. 


If the parameter printer contains the value raussz, the method need only specify the first (i.e. the 
SCRLAY_PLABEL) member. 


A method that performs this function is optional and need not be supplied if paragraph labels are not 
supported. If, however, it is supplied, it must be by the object designated to be the supplier of document 
text to an instance of scRLAY or PRNLAY. 


2-4 


2 THE FORMATTED DOCUMENT CONTENT CLASSES 


FORMDOC_ENQ_ PAGE 


INT formdoc_enq_page(UINT pos, UINT len); 


Return a page number 


Return a page number. 
The method should expect the following two parameters: 
© pos, specifies a character position within the document text. 


¢ en, specifies a character count, defining the number of contiguous characters starting at 
position pos. 


If 1en is zero, the method should return the page number of the page that contains character position pos. 


If 1en is non-zero and there is no page break between character position pos and the character position 
postlen, then the method should return a zero. 


If 1en is non-zero and there is at least one page break between character position pos and the character 
position pos+len, then the method should return the page number of the page that follows the first page 
break in the range pos tO pos+ien. 


In any event, the method should always return zero if no page information is currently available. 


It is worth noting that page numbers start from one; in other words, the first page is designated as page 1 
and not as page 0. 


A method that performs this function is optional and need not be supplied if the display of page breaks is 
not supported. If, however, it is supplied, it must be by the object designated to be the supplier of 
document text to an instance of scRLAY or PRNLAY. 


EPDOC 


EPROOT 


maxlen 


ep_set_text 
ep_scan_word 
ep_word_count 
ep_scan_para 
ep_para_count 
ep_scan_block 
ep_add_para 
ep_copy_indent 
ep_copy_to_front 
ep_copy_to_back 
ep_paste 
ep_mod_chars 
ep_sense_text 


ep_capacity 


EPDOC 


pages 
filter 


ep_init 
ep_sense_len 
ep_sense_chars 
ep_back_chars 
ep_insert 
ep_extract 
ep_delete 
ep_clear 
ep_compress 
epdoc_para_start 
epdoc_sense_chars 
epdoc_set_pages 
epdoc_enq_page 
epdoc_goto_page 
epdoc_set_filter 
epdoc_pos_filter 


FORM REFERENCE 


The eppoc class encapsulates formatted document text. It provides the property for storing and the 
methods for manipulating the text and is referenced by instances of the scrLay and scrime classes. 
Further, it supplies the two mandatory call-back methods: the 'scan to start of paragraph' method and 'the 
sense character content’ method (also known as 'the provide characters’ method). 


The fundamental characteristics and behaviour of editable documents are described in the Editable 
Documents chapter of the OLIB Reference manual. The Eppoc class is designed for the efficient storage 
and manipulation of large quantities of dynamically changing text. The text itself is contained in an scBur 
segmented buffer component. 


For small quantities of text, the class Eprpoc, described later, is more efficient. 


Class diagram 


The following class diagram shows the relationship between the document content class zppoc and other 
classes. The underlined classes are imported from o118 and they are all discussed in the OLIB Reference 
manual. 


fo MALOOL: 7 ( eproot / 
Pes tee es acs 
y Nafix / ¢ epdec / 
my ) ~ ) 
wo 
le ee S22: 
C vaflat / y § buf / 
y sl N ae 
ee i oe 


Pagination 
Within its property, EPpoc contains pagination information on the document. 


This information is held in the form of a uworp array. The array itself is a varLat object whose handle is 
held in the property epdoc. pages. 


Each entry in the array represents a single page and contains a count of the number of characters fitting 
into that page. It is worth pointing out that the first entry in the array represents the first page and this is 
deemed to be page | (not page 0). The array itself is built by an instance of the paczs active object, not by 
EPpoc (the pagination process is relatively time consuming and is best done as a low priority background 
task). 


A number of Eppoc's methods change the content of the document text, for example ep_insert and 
ep_delete. To avoid the overhead of re-paginating the document every time text is inserted or deleted, 
EPpoc modifies the character count of the appropriate page (or pages) in such a way that the position of 
the page break relative to the existing text remains unchanged. 


Clearly, following any insertion or deletion, the calculated position of a page break may no longer be 
strictly accurate. This situation can only be corrected when the owning application schedules a 
re-pagination operation by sending a pR_PAGINATE message to the PRINTER Class. 


Document filter 


Very often, there is a need to work with a subset of the whole document text. The precise meaning of a 
subset varies from application to application. A situation that is very common occurs in word processor 
applications where, often, only outline text needs to be displayed and manipulated. For example, outline 
text may consist simply of the headings in the document. In other words, text which is not part of the 
outline must be logically deleted. 


To handle this kind of situation, zppoc embraces the concept of a document filter. 


In essence, a filter is a map of the document indicating which sections of text are included in the subset 
and which sections are excluded (or logically deleted). When the map exists, the document is said to be 
filtered. 


The document filter is implemented by means of a uworp array. The array itself is a varLat object whose 
handle is held in the property epdoc. filter. 


2 THE FORMATTED DOCUMENT CONTENT CLASSES 


The entries in the array are logically grouped into consecutive pairs. 


Starting from the first position in the document, the first entry in the array contains a count of the number 
of characters which are to be excluded or logically deleted from the document; the second entry contains a 
count of the number of following characters which are to be included in the filtered document. This 
pattern is repeated for rest of the document. 


The idea is more easily understood by looking at the schematic diagram below. The horizontal bar 
represents document text where the shaded sections represent text which is to be excluded or logically 
deleted from the document while the non-shaded sections represent text which is to be included as part of 
the filtered document. Position zero is on the left hand side. The vertical column represents the filter array 
with the individual elements marked each containing the length of the corresponding section of text. 


Filter array 


| Document text 


Position 0 


The sum of the values contained in each element of the array should be the same as the length of the 
unfiltered document. 


It should also be noted that both the first and the last entries in the array are often zero. 


Class definition 


The Eppoc class subclasses the OLIB class zproot and is defined in the sub-category file epdoc.cl (with 
generated header file epdoc.g). 


CLASS epdoc eproot 
{ 
REPLACE ep_init 
REPLACE ep_sense_len 
REPLACE ep_sense_chars 
REPLACE ep_back_chars 
REPLACE ep_insert 
REPLACE ep_extract 
REPLACE ep_delete 
REPLACE ep_clear 
REPLACE ep_compress 


ADD epdoc_para_start Scan to start of paragraph 
ADD epdoc_sense_chars Provide characters 
ADD epdoc_set_pages Set the page list 
ADD epdoc_enq_page Enquire page break position 
ADD epdoc_goto_page Get pos at start of specified page 
ADD epdoc_set_filter Set (or clear) the filter list 
ADD epdoc_pos_filter Convert filtered pos to unfiltered pos 
PROPERTY 3 
{ 
PR_SGBUF *b; handle of buffers data 
PR_VAFLAT *pages; number of characters in each page 
PR_VAFLAT *filter; filter (e.g for outline mode) 


} 


FORM REFERENCE 


Property 

epdoc.b The handle of an instance of scpur containing the document text; this is a 
component of EPDoc. 

epdoc.pages The handle of an instance of varLat, containing a uworp array. Each 
consecutive entry in the array contains a value giving the number of 
characters in consecutive pages. The first entry in the array refers to page 1. 
See the Pagination section above. 

epdoc. filter The handle of an instance of varLat, containing a uworp array. The array 


contains the document filter information as described in the Document filter 
section above. 


EPDOC methods 
EP_INIT Initialise 


VOID ep_init (UINT maxlen) ; 
Initialise the instance of EPpoc. 


The maximum length of the document (the superclass property eproot .maxlen) is set to the value 
contained in the parameter maxien. Note that this length includes the terminating nNuLL. 


An instance of the segmented buffer scpur is created and its handle stored in the property epdoc.b. At the 
same time, the instance is initialised by sending a sn_1nrT message specifying a segment length of 128 
bytes. 


The buffer itself is seeded with a single nuiu character. This is the delimiter which marks the end of the 
text and, in effect, creates an empty document. 


EP_ SENSE LEN Sense document length 


UINT ep_sense_len (VOID) ; 
Sense the current length of the document text. 
The method returns the number of bytes of text stored; note that this excludes the terminating NULL. 


If the document is filtered (i.e. epdoc. filter 1s not NULL), the reported length is that of the filtered 
document; again the length excludes the terminating nNuLL. 


EP_SENSE CHARS Sense characters forwards 


UINT ep_sense_chars (TEXT **pbuf, UINT pos, UINT n); 


Find the address of the character within the segmented buffer (containing the document) whose position 
within the document is given by the parameter pos. 


The method places the address of the character into an area whose address is passed in the parameter 
pbuf; i.e. the address of the character is set into *pbuf. 


In addition, it returns either the value in the parameter n or the number of characters stored contiguously 
at *pbuf, whichever is the smaller. As the document text is contained in a segmented buffer, the number 
of contiguous characters at the given position will never be greater than the maximum number of 
characters within a data segment. The number of contiguous characters will include the nu that 
terminates the document, if it happens to be in that particular segment. 


2 THE FORMATTED DOCUMENT CONTENT CLASSES 


The following figure illustrates the situation for a non-filtered document. 


(previous) (next) 
buffer buffer buffer 
segment segment segment 


Character corresponding to 
to document position POS 


contiguous characters 


*PBUF 


If the document is filtered (i.e. epdoc. filter is not NULL), the character position, address and character 
count are all with respect to the filtered document. 


More information on segmented buffers can be found in The SGBUF Segmented Buffer Class chapter in 
the Olib Reference manual. 


EP _BACK_CHARS Sense characters backwards 


UINT ep_back_chars (TEXT **pbuf, UINT pos, UINT n); 


Find the address of a character within the segmented buffer (containing the document) which is a number 
of bytes in front of the character whose position is specified by the parameter pos. The method places the 
required address into an area whose address is passed in the parameter pbuf; i.e. the required address is 
set into *pbuf. 


In general, the required address is calculated by taking the address of the character whose position is 
given by pos and subtracting either the value in the parameter n or the number of contiguous characters 
stored in front of that character, whichever is the smaller. 


If the character specified by pos lies at the very beginning of a buffer, then the required address will lie in 
the previous buffer segment. 


In addition, the method returns either the value in the parameter n or the number of contiguous characters 
stored in front of that character, whichever is the smaller. 


As the document text is contained in a segmented buffer, the number of contiguous characters will never 
be greater than the maximum number of characters which can be fitted in a data segment. 


The following figure illustrates the situation for a non-filtered document where the character 
corresponding to document position pos lies wholly within the buffer segment. *pbuf is shown pointing to 
the lowest possible address in the buffer segment (a situation when n > number of contiguous characters). 


(previous) (next) 
buffer buffer buffer 
segment segment segment 


Character corresponding 
to document position POS 


t contiguous characters 


*PBUF (n >=no.contiguous characters) 


FORM REFERENCE 


The following figure illustrates the situation for a non-filtered document where the character 
corresponding to document position pos lies at the begining of the buffer segment. *pbuf is shown 
pointing to the lowest possible address in the previous buffer segment (a situation when n > number of 
contiguous characters). 


(previous) (next) 
buffer buffer buffer 
segment segment segment 


Character corresponding 
to document position POS 


contiguous characters 


*“PBUF (n >=no.contiguous characters) 


In both cases, if n < number of contiguous characters, then *pbuf will point to a position which is 
(number of contiguous characters - n) bytes higher than (to the right of) that shown. 


If the document is filtered (i.e. epdoc. filter is not NULL), the character position, address and character 
count are all with respect to the filtered document. 


More information on segmented buffers can be found in The SGBUF Segmented Buffer Class chapter in 
the Olib Reference manual. 


EP_INSERT Insert characters 


INT ep_insert (UINT pos, VOID *buf, UINT len); 
Insert characters into the (assumed unfiltered) document. 


The source for the characters is the buffer whose address is passed in the parameter but. The parameter 
len specifies the number of characters, while the parameter pos indicates the position within the 
document where the characters are to be inserted. 


If an attempt to insert the characters were to cause the size of the document to exceed its maximum 
permitted length (i.e. the value in the property eproot .maxlen), then no insertion would be attempted and 
p_leave would be called with an £_GEN_ovER error. 


If the document has been paginated, the character count for the page containing document position pos is 
incremented by 1en, so that page break positions, relative to the document text, do not move. This is 
achieved by incrementing the appropriate array entry in the component object epdoc. pages. 
Re-pagination may well be desirable after the insertion of text but is not done here. 


If there is insufficient memory to perform the insertion p_leave is called with an &_GEN_NOMEMoRY error. 


The method returns zero if the insertion is successful, and is thus suitable for being called under the 
protection of p_enter. 


EP_EXTRACT Copy characters 


VOID ep_extract (UINT pos, TEXT *buf, UINT len); 
Copy characters from the document into a buffer. 


The parameter pos specifies the position within the document from where copying is to start. The 
parameter buf points to a buffer supplied by the caller into which the characters are to be placed while the 
parameter 1en specifies how many characters are to be copied. 


The caller is responsible for supplying a buffer of sufficient length to contain the copied text. 


The document may be filtered or unfiltered. If it is filtered, the position and extracted characters are with 
respect to the filtered document. 


2 THE FORMATTED DOCUMENT CONTENT CLASSES 


EP DELETE Delete characters 


VOID ep_delete(UINT posl, UINT pos2); 
Delete characters lying between two specified positions within the (assumed unfiltered) document. 


The parameter pos1 specifies the start document position while the parameter pos2 specifies the end 
document position. 


All characters starting at (and including) posi and ending at (but excluding) pos2, are to be deleted. The 
method deletes (pos2 - posi) characters beginning with the character at pos1 by sending a sB_DELETE 
message to the scpur object containing the document text. The following figure illustrates the situation; in 
this example, the characters in lower case are the ones which are deleted. 


XXxXxXxXxXxXXXXXXX 
pos1 pos2 


Recall that the last addressable position lies immediately before the final paragraph delimiter (often 
referred to as the terminating nuLL); consequently, the final paragraph delimiter cannot be deleted. 


If the document is paginated (i.e. epdoc->pages is not NULL), the character count for the page containing 
position posi (and, if necessary, subsequent pages) is decremented by an amount equal to pos2-pos1. This 
may result in one or more pages containing zero characters. Page break positions for the remaining 
characters, from pos2 onwards, occur between the same characters as before. 


Re-pagination may well be desirable after the deletion of text but is not done here. 


EP CLEAR Clear the document 


VOID ep_clear (VOID) ; 
Delete the entire document content. 


The method deletes all of the text but leaves the terminating nuLL which marks the end of the document 
by sending a sB_DELETE message to the scBur object containing the text. 


Any existing document filter is destroyed by calling the epdoc_set_filter method, directly. 


EP_COMPRESS Compress allocated storage 


VOID ep_compress (VOID) ; 
Compress the allocated storage containing the document text. 


The text itself is held in the scpur (segmented buffer) component of zPppoc whose handle is held in the 
property epdoc.b. The segmented buffer is compressed by sending it a ss_comPRESS message. 


The buffer always contains at least one cell and guarantees sufficient space to contain, as a minimum, the 
document's terminating NULL. 


EPDOC SET PAGES Set (or clear) the page list 


VOID epdoc_set_pages(PR_VAFLAT *pages) ; 
Clear an exsiting page list and/or set a new one. 


The method destroys the current epdoc.pages component, if it exists, and resets the property epdoc. pages 
to NULL. 


The parameter pages is expected to be either nuLu or the handle of a variat object containing page 
information (as described in the section on EPpoc property) and is copied into epdoc. pages. 


FORM REFERENCE 


EPDOC_ENQ PAGE Return a page number 


INT epdoc_enq_page(UINT pos, UINT len); 
Return a page number. 


The parameter pos specifies a document position while the parameter 1en specifies the number of 
characters starting at pos. 


If the parameter 1en is zero, the method returns the page number of the page that contains the character at 
position pos; recall that page numbers start at one. 


If 1en is non-zero, the method returns: 


e the page number of the page that contains the character at pos, if there is a page break between 
positions pos and pos+len. 


e zero, if there is no page break between positions pos and pos+len. 
e = zero, if pos is zero 


The method always returns zero if there is no epdoc. pages component (i.e. the property epdoc. pages IS 
NULL). 


EPDOC_ GOTO PAGE Get position at the start of a page 


UINT epdoc_goto_page (UINT num); 
Return the document character position corresponding to the start of a given page. 
The parameter num specifies the page number. 


Page numbers always start at one. If num is zero, a value of one will be assumed. If num is greater than the 
maximum number of pages, the maximum value wil be assumed. 


The method always returns zero if there is no epdoc. pages component (i.e. the property epdoc. pages IS 
NULL). 


EPDOC SET FILTER Set (or clear) the filter list 


VOID epdoc_set_filter(PR_VAFLAT *filter); 
Clear an exsiting filter list and/or set a new one. 
The method destroys the current epdoc. filter component, if it exists, and sets the property to NULL. 


The parameter filter is expected to be either nuut or the handle of a varzat object containing filter 
information (as described in the Document filter section) and is copied into the property epdoc. filter. 


Because it is no longer valid, the current epdoc.pages component, if it exists, is also destroyed, setting its 
property to NULL. 


EPDOC POS FILTER Get unfiltered position 


UINT epdoc_pos_filter(UINT pos); 
Retrieve the unfiltered document position corresponding to a filtered document position. 


The parameter pos is assumed to contain the position within the filtered document. The method converts 
this position into the corresponding position in the unfiltered document. 


If no filter exists (1.e. the property epdoc. filter 1S NULL), the value in pos is returned. 


2 THE FORMATTED DOCUMENT CONTENT CLASSES 


EPDOC call-back methods 


EPDoc supplies the two mandatory call-back methods required to implement the rormpoc mixin class. It 
does not supply the other three optional call-back methods. 


EPDOC_PARA_START Scan to start of paragraph 


VOID epdoc_para_start (UWORD *ppos) ; 
Find the position of the start of a paragraph. 


The parameter ppos points to a uworD value which specifies an (unfiltered) position within the document 
text; the method scans backwards to find the start of the paragraph which contains this position by 
sending an EP_SCAN_PaARA message (see the description of EPRoot in the Olib Reference manual). The 
position of the start of the paragraph is written back to *ppos. 


If *ppos is already at the start of a paragraph boundary, no scanning will be done. 


EPDOC SENSE CHARS Provide characters 


INT epdoc_sense_chars (SCRLAY_SENSECHARS *sense, SCRLAY_FONT **pf, UBYTE **pfw); 


Sense a block of up ws_MAx_PRINT_BOX_TEXT_LEN contiguous characters from the document text. 


The parameter sense must point to a data structure of type scRLAY_SENSECHARS. The structure, which is 
included as part of the scriay class definition, is as follows: 


typedef struct 
{ 


UWORD pos; document position to sense 

WORD printer; TRUE for printer data, FALSE for screen data 
TEXT *buf; address of character block 

WORD blen; length of character block 


} SCRLAY_SENSECHARS; 


The value in sense->pos specifies the document position where sensing is to start. The address of the first 
character is written to sense->buf and the number of contiguous characters available is written to 
sense->blen. The content of sense->printer 1s not used by this method and its value is, therefore, 
irrelevant. 


The number of contiguous characters available will be less than or equal to ws_Max_PRINT_BOX_TEXT_LEN 
for reasons stated in the description of the ep_sense_chars method. The sensing is done by sending this 
instance of Eppoc (i.e. itself) an EP_SENSE_CHARS Message. 


The method always returns a value of FALSE. 


The parameters pf and pfw are not relevant here and can be ignored. They are included in the function 
prototype because this method is a special case of a more general design. 


In calling this method, the scriay object passes the parameters pf and pfw which, in general, the call- 
back method could modify in order to provide font and style information for a line segment. 


EPpDoc, however, does not support line segments with individual font and style information and, therefore, 
has no need to reference the parameters pf and pfw - which is why they can be safely ignored. 


For the same reason, the method always returns the value ratsz to indicate that there is no change of font 
or style in the characters sensed. 


FORM REFERENCE 


EPFDOC 


ep_set_text 
ep_scan_word 
ep_word_count 
ep_scan_para 
ep_para_count 
ep_scan_block 
ep_add_para 
ep_copy_indent 
ep_copy_to_front 
ep_copy_to_back 
ep_paste 
ep_mod_chars 
ep_sense_text 


EPFDOC 


destroy epfdoc_para_start 


ep_init epfdoc_sense_chars 
ep_sense_len 
ep_sense_chars 
ep_back_chars 
ep_insert 
ep_extract 
ep_delete 
ep_clear 
ep_compress 
ep_capacity 
ef_granularity 
ef_sense_buf 


The eprpoc class is, in many ways, similar to Eppoc. However, it is useful and indeed more efficient for 
very small documents such as those containing the text for edit boxes in dialogs. 


In contrast to the Eppoc class, the text is held contiguously in a single allocated cell. 


The methods and property provided by its superclass(es) EPpFLaAT and EpRoot are sufficient for the 
behaviour required of Eppoc, although the class makes use of EPpFDoc's epfdoc_para_start and 
epfdoc_sense_chars as the mandatory call-back methods (as required by instances of scruay). 


Because the class is designed for handling small amounts of text, no methods comparable to Eppoc's 
epdoc_set_pages method, for example, are needed. 


2 THE FORMATTED DOCUMENT CONTENT CLASSES 


Class diagram 


The following class diagram shows the relationship between the document content class Eprpoc and other 
classes. The underlined classes are imported from o118 and they are all discussed in the OLIB Reference 
manual. 


l eproot 
= ) 


al 
Yk aes 
¢ epflat / 


) 


f 


M4 ‘. epfdoc 


ms a 


Wa 
Class definition 


The eprpoc class subclasses the OLIB class epriat and is defined in the sub-category file epdoc.cl 
(with generated header file epdoc.g). 


CLASS epfdoc epflat 
{ 
ADD epfdoc_para_start=epdoc_epdoc_para_start 
ADD epfdoc_sense_chars=epdoc_epdoc_sense_chars 


} 
Property 


None. 


EPFDOC call-back methods 


EPFDOC supplies only the two mandatory call-back methods required to implement the rormpoc mixin 
class. It does not supply the other three optional call-back methods. 


EPFDOC_PARA_START Scan to start of paragraph 


VOID epfdoc_para_start (UWORD *ppos) ; 


This method is exactly the same as the epdoc_para_start call-back method discussed in the Eppoc class 
description. 


EPFDOC_SENSE CHARS Provide characters 


INT epfdoc_sense_chars (SCRLAY_SENSECHARS *sense, SCRLAY_FONT **pf, UBYTE **pfw); 


This method is exactly the same as the epdoc_sense_chars call-back method discussed in the Eppoc class 


CHAPTER 3 


THE DOCUMENT LAYOUT CLASSES 


The document layout classes supply a flexible means to display formatted text. On the Series 3, the range 
of applications using or subclassing these classes varies from simple edit boxes to the Data, Agenda and 
Word applications. 


An application must supply an instance of a (machine-specific) window class that supplies the user 
interface for text editing and in which is to appear a view of the text. This edit window will create and 
initialise document layout class components. The Epwin edit windows class as described in the HWIM 
Reference manual is a good example and is included in the class diagram below. 


Precursors 

An understanding of the document layout classes will be helped by a knowledge of: 
e the p_enter and p_leave error handling services 
e =the OLIB editable document classes, EPROoT and EPFLAT 
e the OLIB active object class, AcTIVE 

Class diagram 


The following diagram shows the relationships between the classes involved in document layout and are 
discussed in detail in this chapter. The active class is imported from OLIB and is discussed in the OLIB 
Reference manual while Epw1n is the HWIM window class mentioned in the introduction. 


“~~ 


fo ~ 
Z lodger / 
~ a) 

J 

/° edwin) 
S A 

art Ae 

y serimg / ae ) 


( Settay oo 
/ scrlay ae oe - 

Be ) ae a 
oe doe _ y wrap) 


~ ) 
~N _) _— 


FORM REFERENCE 


SCRLAY 


paras 
first 
nomemory 
adjust 
scan 

rd 

fmt 

doc 
slines 


spadjust 


l_sense 
1_line_ends 
1l_pos_to_xl 
1_xl_to_pos 


1_begin_read 


l_read 
1_format_line 

I <serodd: 

l_view 
1_discard_layout 
1_set_lines 
1_para_changed 


l_rescale 


The scriay class provides services to lay out paragraphs, lines and line segments for display on the 
screen, from a document that is composed of a sequence of paragraphs. 


In effect, scrLay provides property and structures which model the layout of a document on the screen. 
The methods supplied by this class allow the layout model to be manipulated. 


An instance of scriay is normally referenced by two other objects: its creator (normally a window class) 
and a scRIMG screen imaging class. scrLay itself references a document object which contains the 
character data to be formatted and supplies any content-specific layout data. 


SCRLAY may be used to lay out the text for display in a window in two modes: 


¢ screen layout, where text is word-wrapped to the window boundary. Page break and margin 
positions and the effects of tabs are shown only approximately but the display is well suited to 
document editing. 


¢ printer layout, where line breaks and page breaks occur in the exact positions that they will occur 
in the printed document, and the effects of margin indents and tabs are shown with greater 
accuracy. The positioning of text is calculated in terms of the widths of characters in the current 
printer's fonts but is, of course, drawn on the screen in the corresponding screen fonts. Queries 
to the document content class, therefore, request a mixture of screen- and printer-related data 
(see also the rormpoc notional class and the idea of call-back methods). 


Class definition 


The scriay class subclasses root and is defined in the sub-category file scriay.cl (with generated header 
scrlay.g) 


CLASS scrlay root 
{ 
REPLACE destroy 
ADD sl_init 
ADD sl_set 
ADD sl_sense 
ADD sl_line_ends 
ADD sl_pos_to_xl 
ADD sl_xl_to_pos 
ADD sl_begin_read 
ADD sl_read 
ADD sl_format_line 
ADD sl_scroll 
ADD sl_view 
ADD sl_discard_layout 
ADD sl_set_lines 
ADD sl_para_changed 
ADD sl_rescale 


CONSTANTS 
{ 
SCRLAY_SYM_HARD_HYPHEN 
SCRLAY_SYM_SOFT_HYPHEN 
SCRLAY_SYM_HARD_SPACE 
SCRLAY_SYM_SHOW_SPACE 


SCRLAY_SHOW_TABS 0x0 
SCRLAY_SHOW_SPACES 0x0 
SCRLAY_SHOW_CRS 0x0 
SCRLAY_SHOW_HYPHENS 0x0 
SCRLAY_SHOW_LFS Ox1 


SCRLAY_WIDOW_ORPHAN 0x2 


SCRLAY_ALIGN_LEFT 
SCRLAY_ALIGN_RIGHT 
SCRLAY_ALIGN_CENTRE 
SCRLAY_ALIGN_JUSTIFY 


SCRLAY_REPEAT_TAB 
SCRLAY_NTABS_MAX 
SCRLAY_SCAN_POS 0 
SCRLAY_SCAN_XY al 
SCRLAY_SCAN_LINE 2 


SCRLAY_SPACING_KEEP_NEXT 
SCRLAY_SPACING_KEEP_TOGE 
SCRLAY_SPACING_NEW_PAGE 


SCRLAY_TBOX_TAB 
SCRLAY_TBOX_TAB_USED 
SCRLAY_TBOX_TAB_LEFT 
SCRLAY_TBOX_NO_STYLE 
SCRLAY_TBOX_MASK_LEN 
} 


TYPES 
{ 
typedef struct 


UWORD x; t 
UWORD type; i 
SCRLAY_TABSTOP; 


typedef struct 


UWORD ntab; 
SCRLAY_TABSTOP tab[S 
SCRLAY_TABS; 


3 THE DOCUMENT LAYOUT CLASSES 


Set document and initial global layout style 
Set global layout style 

Sense global layout style 

Get x positions of line ends 

Convert document pos to line number & horizontal 
pixel offset 

Convert line number & horizontal pixel offset 
to document position 

Set up for a read of line data 

Read line data 

Format a line from a given pos 

Scroll the layout by lines 

View document position on specified line 
Discard layout 

Set number of lines 

Cause lines from pos to be discarded 

Adjust screen/printer scaling 


7 Not a word delimiter 
14 Also called potential hyphen 
ules) Not a word delimiter 
8 A visible space 
d 
2 
4 
8 Show optional hyphens 
0 
0 Set to enable widow & orphan suppression 
0 
1 
2 
3 
3 
8 
0x01 
THER 0x02 
0x04 
0x8000 
0x4000 
0x2000 
0x1000 
Oxfft 


ab position 
ab type (left, right, centre or repeated) 


number of tabs 
CRLAY_NTABS_MAX]; 


FORM REFERENCE 


typedef struct 


{ 

UWORD left; 

UWORD right; 
UWORD indent; 
UWORD align; 

} SCRLAY_MARGINS; 


typedef struct 


{ 

UWORD line; 
UWORD above; 
UWORD below; 
UWORD flags; 


Left margin 
Right margin 
Left margin of first line in para 


Alignment (left, right, 


Space between paragraph lines 

Space above paragraph 

Space below paragraph 

Keep together/next and start new page 


centre or justified) 


} SCRLAY_SPACING; 


typedef struct 
{ 
UWORD fid; 
UWORD style; 
UWORD height; 
SCRLAY_FONT; 


font ID for wserv or typeface for printer 
font style (eg bold) 
height of printer font 


typedef struct 


UWORD pos; document position to sense 

WORD printer; TRUE for printer data else screen data 
TEXT *buf; address of character block 

WORD blen; length of character block 


SCRLAY_SENSECHARS; 


typedef struct 


Paragraph margins 
Paragraph tabs 
Paragraph spacing 


SCRLAY_MARGINS *margins; 
SCRLAY_TABS *tabs; 
SCRLAY_SPACING *spacing; 
} SCRLAY_PDATA; 


typedef struct 


{ 


SCRLAY_FONT font; and style 


font ID, height (printer only) 


UWORD align; 
TEXT *buf; 

WORD blen; 

} SCRLAY_PLABEL; 


typedef struct 


{ 

UWORD len; 

VOID *content; 
WORD sensechars; 
WORD sensepdata; 
WORD senseplabel; 
WORD toparst; 
WORD enqpage; 

} SCRLAY_DOC; 


typedef struct que_tbox 


{ 


alignment 
address of character block 
length of character block 


Length of doc 
Object containing document content 
Method to sense character segments 
Method to sense paragraph layout data 
Method to sense paragraph label 
Method to scan start of paragraph 
Method to enquire for a page break 


struct scrlay_tbox *next; 
struct scrlay_tbox *prev; 


} QUE_TBOX; 


{ 

QUE_TBOX hd; 
WORD width; 
UWORD tlen; 

} SCRLAY_TBOX; 


typedef struct scrlay_tbox 


width of box in pixels 


number of doc positions, with mask info 


(one greater than max position) 


3 THE DOCUMENT LAYOUT CLASSES 


typedef struct que_line 
{ 
struct scrlay_line *next; 
struct scrlay_line *prev; 
} QUE_LINE; 


typedef struct scrlay_line 
{ 
QUE_LINE hd; 
QUE_TBOX tboxs; 


WORD indent; x pixel position of left of lst tbox 
UWORD len; number of addressible content positions 
UBYTE islast; TRUE if last line in paragraph 

UBYTE new_page; TRUE if start of page 


SCRLAY_LINE; 


typedef struct que_para 


struct scrlay_para *next; 
struct scrlay_para *prev; 
QUE_PARA; 


typedef struct scrlay_para 
QUE_PARA hd; 
QUE_LINE lines; 


SCRLAY_PARA,; 


typedef struct 


UWORD pos; document position 
WORD line; line number 
WORD x; x offset 


} SCRLAY_PLX; 


typedef struct 
{ 
WORD scan; Criterion for scan 
SCRLAY_PLX test; Test position for scan 
SCRLAY_PLX pbeg; Beginning of para from scan 
SCRLAY_PLX lbeg; Beginning of line from scan 
SCRLAY_PLX tbeg; Beginning of tbox from scan 
SCRLAY_TBOX *pt; Current TBOX from scan 
SCRLAY_LINE *pl; Current LINE from scan 
SCRLAY_PARA *pp; Current PARA from scan 
} SCRLAY_SCAN; 


typedef struct 
{ 
SCRLAY_PLABEL *label; To write in label margin 


SCRLAY_FONT f; Font data for TBOX 

UWORD width; Pixel width of TBOX 

UWORD indent; ndent in pixels before tbox 

UBYTE blen; Length of text written to buf 
(See sl_read method) 

UBYTE isfirst; TRUE if first TBOX in line 

UBYTE islast; TRUE if last TBOX in line 


UBYTE new_page; 
} SCRLAY_READ; 


typedef struct 
{ 


SCRLAY_PARA *pp; The next paragraph to read 
SCRLAY_LINE *pl; The next line to read 
SCRLAY_TBOX *pt; The next tbhox to read 

UWORD pos; The next document pos to read 


} SCRLAY_RD; 


[TRUE if page break before line 


FORM REFERENCE 


type 


def struct 

{ 

SCRLAY_PARA *pp; 
UWORD pos; 

WORD line; 
UWORD pend; 


The 
The 
The 
Pos 


next paragraph to format 

next document pos to format 
next line to format 

at beginning of existing layout 


when background formatting 


WORD lend; 
} SCRLAY_FMT; 


typedef struct 
{ 
UBYTE options; 
UBYTE printer; 
SCRLAY_PDATA pd; 
SCRLAY_FONT *font; 
UBYTE *fwtab; 
UWORD scrpwidth; 
SCRLAY_FONT *sfont; 
} SCRLAY_STYLE; 


PROPERTY 


{ 
QUE_PARA paras; 


Line number of beginning of existing layout 


Layout options 

TRUE if printer layout 

Global margins, tabs, spacing 

Global font ID and style 

Global font table or NULL 

Width of screen (240 pixls) in printer units 
Global screen font ID and style 


List of paragraphs 


SCRLAY_PLX first; 
UBYTE nomemory; 
UBYTE adjust; 


SCRLAY_SCAN *scan; 


SCRLAY_RD rd; 
SCRLAY_FMT fmt; 
SCRLAY_DOC doc; 
WORD slines; 
WORD spadjust; 
SCRLAY_STYLE st; 


Screen/document position of 1st SCRLAY_TBOX 
TRUE if failed to allocate memory 

TRUE if spadjust has been changed 

Scan context 

Read context 

Format line context 

Describes document object 

Number of lines in screen or height of page 
Adjustment to scrpwidth 

Global layout style 


} 
} 


Property 


scrlay.paras 


scrlay.first 


scriay.nomemory 


scrlay.adjust 


scriay.scan 


scrlay.rd 


The head of a list (a doubly-linked queue) of items representing the layout of 
the data. 


Each data item in the list represents a paragraph; from each of these is 
queued a list of data items representing lines within the paragraph; from 
each of these is queued a list of data items representing individual phrases 
within the line (i.e. sections of text with a different font or with different 
attributes from its neighbours). 


See the figure in the section titled Data structures for more detail. 


The position of the first text box. This is described in terms of both a 
document position and a screen position (the line number and the horizontal 
pixel offset from the beginning of the line). 


It is important to note that the line number can be negative; in a situation 
where only part of a paragraph is visible at the top of the screen, layout will 
have been generated for the whole paragraph. Consequently, those lines 
which are not visible (i.e. above the screen) will have negative line numbers. 


Used to indicate an out of memory error. Set to TRUE if an out of memory 
condition occurs. 


Used to indicate whether the property scrlay.spadjust has been changed. 
Set to TRuE if it has been changed. 


Used to keep track of the current scan position and the general context when 
scanning. 


This is a SCRLAY_RD data structure wich is used to record the current read 
context when reading through the layout. 


3 THE DOCUMENT LAYOUT CLASSES 


scrlay. fmt Used to keep track of format data when generating layout. 


scrlay.doc Document content information. This data structure holds the call-back 
methods and the handle of the document object; this property is set on 
initialisation by the su_inztT method. 


scrlay.slines The number of lines in screen or height of page. 


scrlay.spadjust Adjustment to the scrpwidth member of the global layout style data in the 
scrlay.structure property. The scrpwidth member contains the width of 
the screen in printer units. 


scrlay.st A data structure that contains the global font ID, style information etc, set 
during initialisation. In general, this information applies to the whole 
document unless "overriden" by content specific information. This data may 
subsequently be set using the s1_set method and sensed using the s1_sense 
method. 


Data structures 


The data structure of prime importance to scruay is that which is anchored in the property 
scrlay.paras. It is a model of the layout of that part of the document text which is visible. It contains 
sufficient information to allow the text to be drawn correctly. 


The figure below illustrates the situation. scrlay.paras points to the head of a queue of scrLAy_para type 
data structures each of which corresponds to a paragraph in the layout. From each of these is queued a 
number of scRLAY_LINE type data structures each of which corresponds to an individual line on the screen. 


A displayed line may be drawn using one or more text boxes. Typically, more than one textbox is used 
when a section of text within the line is displayed with a different font, emphasis or style to the 
neighbouring text in the line. Data structures of type scrLAy_TBox are used to represent these textboxes 
and are queued from the scrLay_Line data structures. 


It is important to note that the layout is built in whole paragraphs. Thus, where a paragraph is only partly 
on the screen, some of the corresponding scrLAY_LINE and scrLaAy_TBox data structures will represent 
lines and text boxes which are not visible. 


In general, the methods of this class build or modify this data structure. For example, the sLh_scroLu 
method can have the effect of removing scrLAaY_PaRa items from the queue at one end and adding new 
SCRLAY_PARA items at the other (depending on the direction of the scroll). 


QUE_PARA 


SCRLAY_PARA 


SCRLAY_TBOX 
Special characters 
SCRLAY treats certain characters in the content as special: 
e character 0 marks a paragraph end. 


e character 7 (ScRLAY_SYM_HARD_HYPHEN) represents a ‘hard' hyphen, that is not treated as a word 
delimiter. 


FORM REFERENCE 


e character 9 (w_kEY_TAB) represents a tab character. 

e character 10 (LF) represents a forced line break. 

e character 14 (scRLAY_SyM_SOFT_HYPHEN) represents a 'soft' hyphen (or potential hyphen). 

e character 15 (scRLAY_SYM_HARD_SPACE) represents a space that is not treated as a word delimiter. 


To support the display of special symbols, all screen fonts must include distinctive graphics for the 
following characters: 


e character 0 as a paragraph end symbol. 
e character 7 as a hard hyphen symbol. 
e character 8 (scRLAY_SYM_SHOW_SPACE) as a 'shown' space (the same width as character 32) 
e character 9 as a tab symbol. 
e character 10 as a forced line break symbol. 
e character 14 as a soft hyphen symbol. 
Font-width tables 
Font width tables are required when scruay is in printer layout mode. There are two types of table: 
¢ monospace fonts 
e proportional fonts 


A table for a monospace font just consists of two bytes - the first byte is nuLL while the second contains 
the width of each character. 


A table for proportional fonts contains 256 bytes; the first contains the valuel, to distinguish the table 
from a monospace font width table, while the remaining 255 bytes contain the widths of each of the 
255 possible characters 


SCRLAY methods 


Most of these methods are used by an associated instance of the scrime class. Instances of the scruay and 
scrim Classes work in close co-operation. It is not expected that the creator of an instance of scriay will 
directly access any methods other than s1_init, sl1_set and s1_sense. 


SL_INIT Initialise 


VOID sl_init (SCRLAY_DOC *doc, SCRLAY_STYLE *pstyle); 


Initialise a newly created instance of scrLay by copying the supplied document content information and 
the global layout style data into scriay.doc and scrilay.st respectively. 


scrlay.paras which is the anchor point for a list (a doubly linked queue) of data items representing the 
layout of the data, is initialised. 


The document content information is specified by the parameter doc, a pointer to a structure of type 
SCRLAY_Doc. The structure which is included as part of the scruay class definition, is as follows: 


typedef struct 
{ 
UWORD len; 
VOID *content; 
WORD sensechars; 
WORD sensepdata; 
WORD senseplabel; 
WORD toparst; 
WORD enqpage; 
} SCRLAY_DOC; 


3 THE DOCUMENT LAYOUT CLASSES 


The individual fields in the scrLuay_poc structure have the following meaning: 
@ doc->ien is the length of the document in characters, including the terminating zero byte. 


@ doc->content is the handle of the object that contains the text - typically an instance of (or a 
subclass of) EPDoc or EPFDOC. 


e the remaining fields specify the method numbers of call-back methods used to query the 
document content. Two of these methods - doc->sensechars and doc->toparst - are mandatory 
and are supplied by both eppoc and EPFpoc. 


The remaining three methods are optional. If they are not supplied, the corresponding fields of 
the scrLAY_Doc structure (i.e. doc->sensepdata, doc->senseplabel and doc->engpage) should 
be set to zero. 


The requirements of all five of these methods are specified in the rormpoc notional mixin class, described 
in The Formatted Document Classes chapter of this manual. 


The global layout style is specified by the parameter pstyle, a pointer to a structure of type 
SCRLAY_STYLE. 


The global layout style is the style applied to the whole document in the absence of any content-specific 
style supplied by the document content call-back methods. See the description of the s1_set method for a 
fuller discussion. 


Finally, the method sets the pena member of the scriay.fmt property to the highest possible value, i.e. the 
value Oxffff. 


SL_SET Set global layout style 


VOID sl_set (SCRLAY_STYLE *pstyle) ; 


Set the global layout style (i.e. the style that is applied to the whole document in the absence of any 
content-specific style supplied by the document content call-back methods) and reset the property 
scrlay.adjust to zero. 


The style is specified by the parameter psty1e, a pointer to a structure of type scRLAY_STYLE. 
The entire content of this data structure is copied into the object's scrlay.st property. 
The scRLAY_STYLE structure which is included as part of the scruay class definition, is as follows: 


typedef struct 
{ 
UBYTE options; 
UBYTE printer; 
SCRLAY_PDATA pd; 
SCRLAY_FONT *font; 
UBYTE *fwtab; 
UWORD scrpwidth; 
SCRLAY_FONT *sfont; 
} SCRLAY_STYLE; 


pstyle->options contains a set of flags which control whether certain optional features are to be 
included. Amongst these are flags which control whether special symbols, such as paragraph ends, are to 
be displayed. 


The flags (which can be ored together) and their meaning are as follows: 


SCRLAY_SHOW_TABS if set, display tabs on screen 
SCRLAY_SHOW_SPACES if set, display spaces on screen 

SCRLAY_SHOW_CRS if set, show paragraph ends on screen 
SCRLAY_SHOW_HYPHENS if set, show all soft (potential) hyphens on screen 
SCRLAY_SHOW_LFS if set, show forced line breaks on screen 
SCRLAY_WIDOW_ORPHAN if set, enable widow and orphan suppression 


FORM REFERENCE 


The value of pstyle->printer is used to decide whether screen or printer layout is to be generated: 
¢ TRUE generates printer layout 
¢ FALSE generates screen layout 


The pstyle->pa structure specifies global values for paragraph margins, tab positions and spacing. 

The three pointers pstyle->pd.margins, pstyle->pd.tabs and pstyle->pd. spacing must point to data 
structures of type SCRLAY_MARGINS, SCRLAY_TABS and scRLAY_SPACING respectively. These data structures 
must remain in existence while being referenced by an instance of scruay. Typically, this is for the 
lifetime of the scriay object and it is common for the three data structures to form part of the property of 
the creator of the scriay object. 


The global settings can be overriden for any individual paragraph by content-specific paragraph layout 
specified by the optional call-back method whose method number can be found in the document content 
information, i.e scrlay.doc->sensepdata 


The three pointers may be set to nuut if all of the corresponding paragraph layout is content-specific. 


Each of pstyle->font and pstyle->sfont contain pointers to scRLAY_FonT data structures that 
respectively specify the global printer font and the corresponding global screen font. If pst yle->printer 
is FALSE, both pointers may indicate the global screen font. The global settings can be overriden for any 
individual line segment by means of the scrlay.doc->sensechars Call-back method. 


If pstyle->printer iS TRUE, pstyle->fwtab must contain a pointer to a global printer font width table. 
This only needs to be set in printer layout mode. The global setting can be overriden for any individual 
line segment by means of the scrlay.doc->sensechars Call-back method. 


The content of pst yle->scrpwidth is relevant only when generating printer layout, that is, when 
pstyle->printer is TRUE. In this case it defines the basis for the accurate on-screen representation of 
printer tab positions. 


SL_SENSE Sense global layout style 


VOID sl_sense(SCRLAY_STYLE *pstyle); 


Sense the global layout style, i.e. the style that is applied to the whole document in the absence of any 
content-specific style supplied by the document content call-back methods. 


The global layout style data is written to a data structure of type scRLAY_STYLE pointed to by the parameter 
pstyle and supplied by the caller. 


DESTROY Destroy 


VOID destroy (VOID) ; 
Destroy the instance. 


The method destroys the instance by sending an sit_p1scarp message to free all memory used by the 
layout model before supersending a DEsTRoy message. 


SL_POS_TO_XL Convert position to line number and pixel offset 


INT sl_pos_to_x1l(SCRLAY_PLX *p1x); 


Convert a character position within a document to the corresponding line number on the screen and the 
horizontal pixel offset of that character position within the line. 


A data structure of type scrLAy_pLx pointed to by the parameter p1x is supplied by the caller; p1x->pos 
contains the character position. The corresponding line number is written to p1x->1line and the 
corresponding horizontal pixel offset of that character within the line is written to p1x->x. 


If the character position is on the screen, the method returns 0. 


If the character position is above the screen, the method writes a value of -30000 to p1x->1ine and 
returns -1. 


3 THE DOCUMENT LAYOUT CLASSES 


If the character position is below the screen or beyond the end of the document, the method writes a value 
of +30000 to p1x->1ine and returns +1. 


This method is used by the screen image class scrime, and is not normally accessed directly by users of 
FORM. 


SL_XL_TO_POS Convert line number and pixel offset to position 
VOID sl_xl_to_pos (SCRLAY_PLX *p1x); 


Convert a screen line number and the horizontal pixel offset within that line to the nearest matching 
character position within a document and then adjust the screen line number and the horizontal pixel 
offset to match the character position exactly. 


A data structure of type scRLAY_PLx pointed to by the parameter p1x is supplied by the caller; p1x->1ine 
contains the screen line number and p1x->x the horizontal pixel offset within that line. The nearest 
matching character position is written to p1x->pos while the updated line number and the horizontal pixel 
offset are written back to p1x->line and p1x->x respectively, overwriting the supplied values . 


This method is only intended to be called with a line number in the range 0 to nlines-1, where nlines is 
the number of lines of text that can be displayed on the screen. 


This method is used by the screen image class scrime, and is not normally accessed directly by users of 
FORM. 


SL_LINE_ENDS Get horizontal pixel offsets of start & end of line 


INT sl_line_ends(INT line,WORD *xb,WORD *xe); 


Determine the horizontal pixel offsets of the start and the end of a line whose number is passed in the 
parameter line. 


Provided xb is not Nutt, the horizontal pixel offset of the start of the line is written to the word pointed to 
by xb and, again, provided xe is not nut, the horizontal pixel offset of the end of the the line is written to 
the word pointed to by xe. 


Note, to be absolutely precise about definitions, the value for the end of the line gives the offset of the first 
pixel beyond the end of the line. In other words, the first pixel is inside the line while the last pixel is 
outside the line. 


The method returns true if successful. 


If the line is not within the currently generated layout, the method writes nothing to *xb and *xe and 
returns FALSE. 


This method is used by the screen image class scrime, and is not normally accessed directly by users of 
FORM. 


SL_BEGIN READ Prepare to read line data 


VOID sl_begin_read(INT line); 


Prepare for one or more following sit_READ messages, to read data from the line specified by the parameter 


line. 


The method prepares the read context information held in the property scriay.rd ready for subsequent 
SL_READ messages. 


Note, if the line lies outside the currently generated layout, the first subsequent s__REaD message will do 
nothing but return FALSE. 


This method is used by the screen image class scrime, and is not expected to be accessed directly by users 
of FORM. 


FORM REFERENCE 


SL_READ Read line data 


INT sl_read(SCRLAY_READ *pr, TEXT *buf); 


Read a line or part of a line from the currently generated layout and write information about it to a 
structure of type scRLAY_READ pointed by the parameter *pr. 


The first call to this method will have been preceded by a call to the s1_begin_read method to identify the 
line. 


If the parameter buf is not NULL, up to WS_MAX_PRINT_BOX_TEXT_LEN bytes of text are written to the buffer 
pointed to by buf. The actual number of bytes of text read by this method can be found in pr->blen. 


When the method reads the first tbox in the line, its sets pr->isfirst to TRUE and sets the appropriate 
value into pr->indent, otherwise pr->isfirst is set to FALSE and pr->indent is set to zero. Similarly, 
when the last text box in the line is read, pr->islast is set to TRUE. 


If there is more data to read, the method returns TRuE, otherwise it returns FALSE. 


This method is used by the screen image class scrimce, and is not expected to be accessed directly by users 
of FORM. 


SL_FORMAT_LINE Format the next line 


INT sl_format_line(UWORD *ppos) ; 


Format the next line using the document text belonging to the document object whose handle can be found 
in the property scrlay.doc. The status of the current format position is maintained in the property 
scrlay.fmt. 


Provided ppos is not nu, the character position at the start of this next line is written to the uworp 
pointed to by ppos. 


The method returns True if there are more lines to format, otherwise it returns FALSE. 


This method is used by the screen image class scrime, and is not expected to be accessed directly by users 
of FORM. 


SL_SCROLL Scroll the layout 


INT sl_scroll(INT dl); 
Scroll the screen layout by the number of lines specified by the parameter a1. 


If a1 > 0 then the data moves down the screen, possibly generating additional layout for previous 
paragraphs and deleting layout for complete paragraphs which are now "below" the screen. 


If a1 < 0 then the data moves up the screen, possibly generating additional layout for following 
paragraphs and deleting layout for complete paragraphs which are now "above" the screen. 


This method should only be called when the absolute value of a1 is Jess than the number of lines displayed 
on the screen. 


The method returns the actual number of lines by which the screen has scrolled (as limited by the bounds 
of the document). Note that the return value is signed; a value > 0 for the number of lines scrolled down 
the screen and a value < 0 for the number of lines scrolled up the screen. 


This method is used by the screen image class scrimce, and is not expected to be accessed directly by users 
of FORM. 


SL_VIEW View position on given line 


INT sl_view(UINT pos, INT line); 


Generate layout for sufficient paragraphs to enable document position pos to appear on the specified 
screen line. 


The screen layout may be scrolled if the position is already on the screen; new layout will be generated as 
required. 


Returns either the number of lines to scroll, or ox7££+4 if the screen should be completely redrawn. 


This method is used by the screen image class scrime, and is not expected to be accessed directly by users 
of FORM. 


3 THE DOCUMENT LAYOUT CLASSES 


SL_DISCARD_LAYOUT Discard layout 


VOID sl_discard_layout (UINT doclen); 
Set new document length and discard the whole layout. 


If the parameter docien is non-zero, then this is the new document length to be recorded. This value is set 
into the property scrlay.doc.1en. If docien is zero, the existing document length is not to be changed 
and scrlay.doc.len remains unaltered. 


All currently generated layout is discarded by freeing all data items in the list anchored in the property 


scrlay.paras. 


This method is used by the screen image class scrime, and is not expected to be accessed directly by users 
of FORM. 


SL_RESCALE Adjust screen/printer scaling 
INT sl_rescale (VOID) ; 
Adjust the screen/printer scaling. 


If the property scrlay.adjust iS FALSE, indicating no change to the width of the screen/printer, then the 
method does nothing but returns raLse. 


If the property scrlay.adjust 1S TRUE, indicating a change to the width of the screen: 
e = The existing layout is discarded and the document length is left unchanged. 


e = The layout is re-built so that the document position defined by first .pos will appear on the line 
defined by first .1ine. 


e The method returns TRUE. 


This method is used to rescale the screen layout as necessary to ensure that printer tab positions are 
displayed accurately, despite differences between the screen and printer fonts. It is called by the screen 
image class scrim, and is not expected to be accessed directly by users of FORM. 


SL_SET_LINES Set number of lines 


VOID sl_set_lines (INT slines); 
Set the number of displayable lines in the layout to the value in the parameter slines. 
The method simply takes the value in the parameter s1ines and sets it into the property scriay.slines. 


This method is used by the screen image class scrime, and is not expected to be accessed directly by users 
of FORM. 


SL_PARA_CHANGED Discard lines from position 


INT sl_para_changed(INT code, SCRLAY_PLX *plx, WORD *lgood) ; 


Discard one or more lines of layout as a result of the change in the document content specified by the 
parameter code at document position p1x->pos. 


The change may be a left delete of one character (code is W_KEY_DELETE_LEFT) a right delete of one 
character (code 1S W_KEY_DELETE_RIGHT) or the insertion of a single content character, for which code is 
one of : 


e a printable character code 
e zero (paragraph end) 

@ W_KEY_TAB 

e ‘\n 


The value of code is used to infer the new document length. 


FORM REFERENCE 


In preparation for a following sequence of calls to scrlay_s1_format_line, the method updates 
plx->line to the line number of the first line that needs to be reformatted and sets p1x->pos to the 
character position at the start of this line. The line number of the first following line that does not need to 
be reformatted is written to the word pointed to by the parameter 1good. 


Returns True if a paragraph end was deleted, otherwise returns FaLsE. 


This method is used by the screen image class scrime, and is not expected to be accessed directly by users 
of FORM. 


WRAP 


scrimg 
priority 
isactive 
pcb 
stat 


destroy ao_init 


ao_init ao_queue 
ao_cancel ao_run 
ao_abrun 

ao_queue 


ao_run 


An instance of the wrap active object class is created and initialised by scrime, which uses it to reformat 
lines of text in background. 


Background formatting is restarted (from the scrIMG si_para_changed method) each time a key is 
pressed to insert or delete a character, but the reformatted text is only redrawn when such formatting runs 
to completion. This means that the response to keypresses is not degraded by the whole of the affected text 
being redrawn for each keypress. 


The expectation is that wrap will not be subclassed, and that it will only be used by scrime. 


Class definition 


wrap subclasses the OLIB class active and is defined in the sub-category file scrimg.cl (with generated 
header file scrimg.g). 


CLASS wrap active 
{ 
REPLACE ao_init 
REPLACE ao_queue 
REPLACE ao_run 
PROPERTY 
{ 
VOID *scrimg; 
} 
} 


Property 


wrap.scrimg The handle of the owning instance of the scrime class. 


3 THE DOCUMENT LAYOUT CLASSES 


WRAP methods 


AO_INIT Initialise 


VOID ao_init (VOID *scrimg) ; 
Initialise this instance of wrap. 


The method takes one parameter; scrimg contains the handle of the instance of the scrime class which 
has created this wrap object. 


The method does the following: 
e Sets the handle of the creating instance of the scrime class into the property wrap.scrimg. 


e Adds the wrap object to the active object task queue with a priority of PRIORITY_ACTIVE_COMPUTE. 
This is a low priority so that the it will only run if there are no higher priority tasks ready to run. 


AO_QUEUE Queue a line format request 


VOID ao_queue (VOID) ; 


If the wrap object is not currently active, it supersends an ao_QuEUE message to queue a request to format a 
line. 


AO_RUN Format a line 


INT ao_run(VOID) ; 
Re-format a line. 


The method limits itself to re-formatting a single line. If there are more lines to be formatted, an ao_QuzUE 
message is sent to schedule the re-format of the next line. By doing this, the wrap object allows other 
(higher priority) active objects to run. 


Once formatting has finished, all reformatted lines are re-drawn and no further ao_QUEUE messages are sent. 


SCRIMG 


SCRIMG 


wrap select 

lay formatting 
win isredraw 
anc GCcreated 
crs emphasised 
oldcrs plabchange 
txwidth nopan 
mrwidth flags 
xleft lfmt 
xright lgood 
lcowidth xO 

lcline gc 


updownx 


destroy si_move_cursor 


si_init si_redraw 

si_set si_doc_changed 
si_sense si_doc_reset 
si_emphasize si_para_changed 
si_get_select si_style_changed 
si_pan si_delprep 
Si_isorol], si_fwd_change 


si_view 


FORM REFERENCE 


The scrime class provides the means of displaying formatted, editable text in a window. The class 
provides methods that manipulate the screen display including methods to perform scrolling and 
re-drawing. 


scRimcG works in close co-operation with an instance of the scriay class, which formats the text that 
SCRIMG Is to display. 


Although scrime relies on the presence of a document content object - generally an instance of 
(a subclass of) EPDoc or EPFDoc - it has no direct knowledge whatsoever about the nature or interpretation 
of the document content that is being displayed. 


In particular, scrrmc has no concept that the whole of the document may be already divided up into 

lines - lines for scrrmc mean nothing more than lines within the screen area that scrime draws to. In 
illustration of this point, it is worth noting that in the Word application, formatting information - 
including the locations of line breaks - only exists for the portion of the document that is displayed on the 
screen. Formatting information for other regions of the document is discarded as soon as it is no longer 
required for display purposes. 


The area drawn to by scrim is divided into three vertical regions: 
e an optional label margin 
e an optional line cursor region 
e an area for formatted text; this includes the text cursor 


This division of the drawing area is illustrated in the figure shown after the description of the property, 
below. 


The Series 3a built-in word processor provides a good illustration of this. Setting the "Show style bar" 
option in the "Set preferences" menu item of the "Special" menu to ves shows the word processor window 
divided into the three vertical regions. 


Class definition 


The scrime class subclasses root and is defined in the sub-category file scrimg.cl (with generated header 
file scrimg.g). 


CLASS scrimg root 
{ 


REPLACE destroy Remove any text cursor 


ADD si_init Optional set then builds layout 
ADD si_set Set win and layout 
ADD si_sense Sense win setup data 
ADD si_emphasize Set emphasis on/off 
ADD si_get_select Return selection as pos,len 
ADD si_pan Horizontally scroll the image by pixels 
ADD si_scroll Scroll the image by lines 
ADD si_view Show pos on specified line 
ADD si_move_cursor Set the cursor position 
ADD si_redraw Draw to given rectangle 
ADD si_doc_changed Discard layout, cancel select and redraw 
ADD si_doc_reset Discard layout, cancel select, view and redraw 
ADD si_para_changed Background reformat of para from cursor pos 
ADD si_style_changed Re-evaluate layout 
ADD si_delprep Prepare for a left delete 
ADD si_fwd_change Like si_doc_changed except pivot from screen top 
CONSTANTS 
{ 
! si_move_cursor actions 
SCRIMG_LINEDN 0x00 
SCRIMG_LINEUP Ox01 
SCRIMG_PAGEDN 0x02 
SCRIMG_PAGEUP 0x03 
SCRIMG_LINBEG 0x04 
SCRIMG_LINEND 0x05 
SCRIMG_SETPOS 0x06 


3 THE DOCUMENT LAYOUT CLASSES 


! States for background formatting 


SCRI 


MG_FORMAT_DELETE_LEFT 


1 


SCRI 


MG_FORMAT_DELETE_RIGHT 


2 


SCRI 


! si_pan horizontal scroll 
| SETNOPAN 
| DELTA 

| ABS 


SCRI 
SCRI 
SCRI 


MG_PAN 
MG_PAN 
MG_PAN 


MG_FORMAT_TYPING 


3 


(panning) modes 
0 
1 
2 


! si_style_changed qualifiers 


SCRIMG_STCHNG_DOC 0 Reformat whole document 
SCRIMG_STCHNG_PARA nl Reformat from paragraph 
SCRIMG_STCHNG_LINE 2 Reformat from previous line 
SCRIMG_FLAGS_PAGEBREAK 0x01 

SCRIMG_FLAGS_S3_COMPAT 0x02 


} 


TYPES 


{ 

typedef st 
{ 
UWORD 
P_POIN 
WORD n 
UBYTE 
UBYTE 
WOR 
WORD m 
WORD 1 
UBYTE 
UBYTE 
UBYTE 
UBYTE 
UBYTE 
UBYTE 
} SCRI 


D w 


PROPERTY 1 


{ 
PR_WRAP *w 
PR_SCRLAY 

SCRIMG_WIN 
SCRLAY_PLX 
SCRLAY_PLX 
SCRLAY_PLX 
WORD txwid 
WORD mrwid 
WORD xleft 
WORD xrigh 
UBYTE lcwi 
UBYTE lcli 
WORD updow 
UBYTE 


R 
R 
R 
R 
R 
R 


sele 


ruct 


wid; 

T tl; 
lines; 
lheight; 
lascent; 
idth; 
argin; 
cfont; 
cwidth; 
lestyle; 
1lccode; 
hscrlx; 
hscrlm; 
drawplabs; 
MG_WIN; 


rap; 
*lay; 
win; 
anc; 
ens; 
oldcrs; 
th; 
th; 

, 

t; 
dth; 
ne; 
nx; 
(oh ee 


UBYTE 
UBYTE 
UBYTE 
UBYTE 
UBYTE 
UBYTE 
UBYTE 
WORD 
WORD 
WORD 
G_GC 
} 


formatting; 
isredraw; 
GCcreated; 
emphasised; 
plabchange; 
nopan; 
flags; 

lfmt; 

lgood; 

xO; 

gc; 


window ID 

top left corner of area being drawn to 
number of text lines to display 

line height in pixels 

distance from top of line to text base line 
total width in pixels (margin,line cursor,text) 


width of label margin in pixels 


line cursor font (or zero for no line cursor) 
text cursor width 

line cursor style 

line cursor character code 


horizontal scroll x jump 
horizontal scroll margin 
draw trailing para labels after formatting if set 


background word wrap active object 
the document screen layout 

describes the window to be drawn to 
select anchor position 

text cursor position 

old text cursor position 

width of text area in pixels 

width of margin plus line cursor 
left clip margin 

right clip margin 

width of line cursor area 

current line for line cursor 

latent x for cursor up/down movement 
TRUE if 
TRUE if 
TRUE if 
TRUE if 
TRUE if 
TRUE if 
don't pan to expose cursor if TRUE 
SCRIMG_FLAGS_PAGEBREAK, SCRIMG_FLAGS_S3_COMPAT 
Next line to be replaced by background format 


there is a selection 
backgound formatting 
performing a redraw 

a temp GC has been created 
emphasis is on 

para labels may have changed 


First line not requiring to be formatted 
x postion of left of layout for horiz scroll 
current graphics context 


FORM REFERENCE 


Property 


scrimg.wrap 


scrimg.lay 


scrimg.win 


scrimg.anc 


scrimg.crs 


scrimg.oldcrs 


scrimg.txwidth 


scrimg.mrwidth 


scrimg.xleft 


scrimg.xright 


scrimg.lcwidth 


scrimg.lcline 


scrimg.updownx 


scrimg.select 
scrimg.formatting 
scrimg.isredraw 
scrimg.GCcreated 


scrimg.emphasised 


scrimg.plabchange 


scrimg.nopan 


The handle of a background word-wrapping active object, expected to be an 
instance of wrap. This object is created and owned by scrime. 


The handle of an instance (or a subclass) of scruay. This instance is created 
by the creator of scrime and its handle passed as a parameter to the si_init 
or si_set methods. 


A data structure of type scrIMG_wINn containing information on the window 
within which the document content is displayed. The data structure is 
created by the creator of scrimc and its handle passed as a parameter to the 
si_init OF si_set methods. 


The anchor position for a select region, that is, a region of of highlighted 
text, stored as a character offset from the start of the document and as a 
screen line number and x-offset in that line. 


The current position of the text cursor, stored as a character offset from the 
start of the document and as a screen line number and screen x-offset in that 
line. 


A copy of a previous cursor position, described in terms of both a document 
and a screen position, as for scrimg.crs. This property is used by the 
si_move_cursor and si_scroll methods. 


The width, in pixels, of the text area. This is set by the si_set method and 
is calculated as the width of the drawing region minus the combined width 
of the label margin and the line cursor region. 


The sum of the widths, in pixels, of the label margin and the line cursor 
region. This is calculated and set by the si_set method. 


This defines the left hand horizontal pixel position for clipping. 
This defines the right hand horizontal pixel position for clipping. 


In general terms, those parts of a rectangle which extend outside a region 
bounded by scrimg.xleft and scrimg.xright, are clipped. 


The width, in pixels, of the line cursor region. This is set by the si_set 
method and is calculated as the sum of the width of the line cursor character 
plus two (pixels). 


The number of the line on the screen containing the line cursor 


The "latent" horizontal pixel offset of the text cursor. It records the default 
horizontal pixel position to which the cursor is moved during vertical 
scrolling and cursor movement operations. 


For example, when the text cursor is moved up one line, it defines where on 
that line the cursor should be placed. 


This property can be changed by a number of methods. 
Set to Truz if there is currently a select region. 

Set to TRuE if background formatting is in progress. 
Set to TRuE if redrawing is in progress. 

Set to TRuE if a temporary graphics context exists. 


Set to TRuE if the window containing the drawing area has the emphasis. 
This is set and unset by the si_emphasize method. 


Set to TRuE if paragraph labels have (or might have) changed. 


Set to rruE if horizontal scrolling is disabled; while this is set, horizontal 
scrolling is prevented - in particular, during attempts to make the cursor 
visible. 


3 THE DOCUMENT LAYOUT CLASSES 


scrimg.flags This property contains a number of flags which can be a combination of the 
following: 


SCRIMG_FLAGS_PAGEBREAK _If set, at least one pagebreak line has been 
drawn on the screen during the lifetime of the 
SCRIMG Object. Once set, it is never unset. 


SCRIMG_FLAGS_S3_COMPAT If set, the Series 3a is running in Series 3 
compatibility mode. 


scrimg.lfmt The number of the next line on the screen to be formatted when background 
formatting. 
scrimg.lgood After a character has been inserted or deleted, a number of lines may need 


reformatting; this is done in background. This property will contain the 
number of the first following line on the screen that does not require 
reformatting. 


scrimg.xo The horizontal pixel position of the left hand edge of the text relative to the 
window. 


This is set initially by the si_set method to be co-incident with the left 
hand edge of the text area. (i.e the horizontal pixel position of the drawing 
region plus the width of the label margin plus the width of the line cursor 
region). 


As the text is scrolled horizontally, the position of the left hand edge of the 
text moves; this property is changed accordingly to reflect the new position 
of the left hand edge of the text which may or may not be visible. This value 
can be negative. 


This is graphically illustrated in the figure below 
scrimg.ge The current graphics context. 
The following diagram illustrates the meaning of some of the property items discussed above. 


It shows a typical situation where the drawing area contains a label margin, a line cursor region and a text 
area. The dotted lines represent lines of text which are shown as having been scrolled. Text which is 
"outside" the text area is not visible. 


All the measurements depicted are in units of | pixel. 


SCREEN 


DRAWING AREA 


label line cursor| text area 
margin region 


scrimg.xo 


<a scrimg.mrwidth ——> 
—_ <j —— 


scrimg.win.tl.x 


FORM REFERENCE 


SCRIMG methods 
DESTROY Destroy 


VOID destroy (VOID) ; 
Destroy the instance of scrimc. 


If the window containing the drawing area has the emphasis, then the text cursor is removed by calling 
the window server function wEraseTextCursor. The method concludes by supersending a DESTROY 
message. 


SL_INIT Initialise 


VOID si_init (SCRIMG_WIN *win, VOID *lay); 
Initialise scrime ready to view text. 
The method takes two parameters: 


e win points to a data structure of type scrimc_win which contains information on the window 
within which the document content is to be displayed. 


e lay is the handle of an associated instance of the scruay class. 


If the processor is running in compatibility mode, the flag scrrtmc_FLAGS_S3_COMPAT Is set in the property 
scrimg.flags. 


The si_set method is called to copy the content of the window information data structure and the handle 
of the scriay object into the property scrimg.win and scrimg. lay respectively. One or both of the 
parameters win and lay may be nut but, if so, then si_set must have been called previously with valid 
non NULL values for win and lay. 


SL_DISC RD_LAYouT and sL_vIEW messages are sent to the screen layout (scriay) object to prepare the 
layout for the document text so that the start of the document (character position zero) will be on the first 
line (line zero) of the window. 


This method does not draw anything except for the text cursor - the text will normally be drawn by a 
subsequent call to the si_redraw method. 


S|_SET Set view and layout 


INT si_set (SCRIMG_WIN *win, VOID *lay); 
Set the window information and the handle of the scriay object. 
The method takes two parameters: 


e win points to a data structure of type scrimMc_win which contains information on the window 
within which the document content is to be displayed. This can be a nuut value. 


e —_iay is the handle of an associated instance of the scriay class. This can be a nuut value. 
The method waits for any background formatting to complete, before doing anything else. 


If the parameter 1ay is not NULL, its value is copied into the property scrimg.1ay. Similarly, if the 
parameter win is not NULL, the entire content of *win is copied into the property scrimg.win. 


If, at this stage, scrimg.win is not nut then the following settings and calculations are done: 


e The font ID in the current graphics context is set to the default value (ws_rontT_BasgE) and the 
style is set to normal (G_sTy_NORMAL). 


e Ifa line cursor font ID is supplied (i.e. win->1cfont is non-zero), the method calculates the 
width of the line cursor region and sets the value into the property scrimg.1lcwidth. 


e The width of the line cursor region plus the label margin is calculated and set into the property 


scrimg.mrwidth. 
e =6The horizontal pixel position of the text area is calculated and set into the property scrimg.xo. 


e The width of the text area is calculated and set into the property scrimg.txwidth. 


3 THE DOCUMENT LAYOUT CLASSES 


An SL_SET_LINES message is sent to the screen layout object, passing the value of win.nlines so that it 
knows the maximum number of text lines that are to be displayed on the screen. 


SCRIMG_wIn which is included as part of the scrime class definition, is as follows: 


typedef struct 
{ 
UWORD wid; 
P_POINT tl; 
WORD nlines; 
UBYTE lheight; 
UBYTE lascent; 
WORD width; 
WORD margin; 
WORD lcfont; 
UBYTE cwidth; 
UBYTE lcstyle; 
UBYTE lccode; 
UBYTE hscrlx; 
UBYTE hscrlm; 
UBYTE drawplabs; 
} SCRIMG_WIN; 


The win->wid element specifies the window ID (as returned by a call to wcreat eWindow) of the window to 
which drawing is done. This will normally relate to the window object that creates and initialises the 
SCRIMG object. 


The area within this window within which scrime draws is defined by: 
e the coordinates of its top-left hand corner, given by win->t1.x and win->tl.y 
e the total width, in win->width 


e the total height, calculated from the number of lines, win->nlines, multiplied by the line height, 
win->lheight. 


These, and all other dimensions in the scrimc_wtn struct, are specified in pixels. 


The line height will normally be the height of the screen font in which the text is displayed, plus one or 
two pixels of additional space, known as leading. The base line for drawing characters within a line of 
text is defined by win->1ascent, which will normally be equal to the ascent of the screen font plus the 
leading. This is illustrated below. More information on fonts can be found in the section on Text output 
functions in the Window Server Reference manual. 


Line Of Text 


Vv 


(top leading) 


scrimg.win.lascent } 
neighrouions ascent of font 


t baseline 


descent of font y 


scrimg.win.lheight 


(bottom leading) 


In addition to the text region, the drawing area may contain a label margin and a line cursor margin, as 
described earlier in this chapter. 


The width of the label margin, used to display paragraph labels, is specified by win->margin. Labels will 
only be drawn if win->drawplabs 1S TRUE (in this case scriay will need to be supplied with a senseplabel 
call-back method). If win->drawplabs iS FALSE, win->margin may be zero and a senseplabel call-back 
method need not be specified. 


FORM REFERENCE 


A line cursor will be displayed in the line cursor margin if win->1cfont is non-zero. Its value should be 
the font ID of the screen font that contains the line cursor character. The character code of the line cursor 
character itself, is supplied in win->1ccode. The required line cursor style attribute, for example BOLD, is 
specified by win->1cstyle. 


A text cursor will be displayed in the text area if win->cwidth is non-zero. Its value should be the required 
width of the text cursor, normally one or two pixels. 


Automatic horizontal scrolling of text within the text area, provided lines of text are longer than the width 
of the text area, is controlled by win->hscrix and win->hscrim. The value of win->hscrix specifies the 
unit of horizontal scrolling motion (a unit being some number of pixels). The document will scroll, if 
necessary, when the text cursor reaches the right hand edge of the text area or when the text cursor moves 
to within win->hscr1m pixels of the left hand edge of that area. 


A call to si_set, other than one that precedes a call to si_init or the one that is made by si_init itself, 
should be followed by a call to si_doc_changed to force the layout to be rebuilt and the content to be 
redrawn. 


The method returns the width, in pixels, of the text area. 


Note that this method offers a simple way of waiting for the completion of background formatting, by 
calling it with both parameters set to NULL. 


SI_ SENSE Sense window information 


VOID si_sense(SCRIMG_WIN *win); 


Write a copy of scrime's window information data structure, as contained in the property scrimg.win, to 
the location pointed to by the parameter win; this is expected to point to a structure of type scRIMG_wIN 
supplied by the caller of the method. 


SI_EMPHASIZE Set emphasis on or off 


VOID si_emphasize(INT on); 
Turn emphasis on or off. 
The method takes a single parameter; on has the value TRUE or FALSE. 


When the window containing the drawing area has the emphasis, this is indicated by setting the property 
scrimg.emphasised tO TRUE. 


If the parameter on has the value TRuz, the method indicates that the emphasis is on by setting the 
property scrimg.emphasised to TRUE. If the parameter on has the value rasz, the method indicates that 
the emphasis is off by setting the property scrimg.emphasised to FALSE. Repeated calls with the same 
value of on do nothing. 


This method is often called from the wn_emphasis method of an instance of the wrn class (or more likely, 
a subclass of wr). 


Turning the emphasis off causes the text cursor to be removed and the highlight of any selected text to be 
removed. 


Turning the emphasis on causes the text cursor to be drawn and any selected text to be highlighted. 


SI_GET_ SELECT Get select region 


UINT si_get_select (UWORD *ppos) ; 


Write, to *ppos, the document position of the first character (the character nearest to the beginning of the 
document) of the select region. This will be either the anchor position or the cursor position, depending on 
the direction in which the selection was made. 


The method returns the length of the select region. 


If there is no select region, the current cursor position is written to *ppos and the method returns zero. 


3 THE DOCUMENT LAYOUT CLASSES 


SI_PAN Scroll the image horizontally 
VOID si_pan(INT func, INT par); 
Scroll the image horizontally after any background formatting is completed. 


This method has three modes of operation depending on the value of the parameter func. The 
interpretation of the parameter par depends on the mode of operation. 


func can take one of the following values: 


SCRIMG_PAN_SETNOPAN The method either disables or enables horizontal scrolling depending on the 
value of par. If par has the value truz, horizontal scrolling is disabled; a 
value of ratsz enables horizontal scrolling. The value of par is set into the 
property scrimg.nopan 


SCRIMG_PAN_DELTA Scroll the image horizontally by par pixels. par may be negative or positive. 
If par is positive, the image is scrolled to the left by par pixels; if negative, 
the image is scrolled to the right by par pixels. 


SCRIMG_PAN_ABS Scroll the image such that the position par is at the left of the view. The 
scroll is limited to reasonable limits. Scrolling past the right hand end of the 
longest visible line is prevented. 


SI_SCROLL Scroll the image vertically 


INT si_scroll(INT dl); 
Scroll the image vertically by the number of lines specified by the parameter a1. 


The direction of scroll depends on the sign of a1. If positive (i.e. a1>0), the image moves down, bringing 
in new paragraphs from above; if negative (i.e. dl<0), the image moves up, bringing in new paragraphs 
from below. The method should only be called when the absolute value of ai is Jess than the number of 
lines displayed on the screen. 


After any background formatting is complete, a sL_scRoLL message is sent to the scrzay object to scroll 
the screen layout by a1 lines. The s1_scro11 method returns the number of lines actually scrolled and this 
value is used to update: 


e the number of the line on which the cursor is displayed (a component of scrimg.crs) 
e the line number for any previous text cursor (a component of scrimg.oldcrs) 
e the line number of the anchor position for any select region (a component of scrimg.anc) 


The screen display itself is scrolled by the number of lines returned by the s1_scro11 method, i.e. the 
number of lines by which the screen layout was scrolled. 


Note that the amount scrolled is limited by the bounds of the document. 

The method returns the actual number of lines scrolled, positive if scrolled down or negative if scrolled 
up. 

SIL VIEW Show position on given line 
VOID si_view(UINT pos, INT line); 


Draw a view of the document such that, subject to limitations imposed by the bounds of the document, 
document position pos is on screen line number line. 


Any background formatting is allowed to complete first. A st_v1iEw message to the scriay object to 
arrange the screen layout to satisfy this request. 


If the document position is already on the screen, the screen display is scrolled, otherwise it is completely 
re-built. 


FORM REFERENCE 


SI_MOVE_CURSOR Set the cursor position 


INT si_move_cursor(INT select, INT type, UWORD *ppos); 
Set the cursor position. 
Any background formatting is allowed to complete first. 


The movement of the cursor is controlled by the value of the parameter type which can take one of the 
following values: 


SCRIMG_SETPOS The cursor is moved to the document position specified by the value pointed to 
by the parameter ppos. 


If the position is already visible, no scrolling or re-building of the screen 
display is done. 


If the position is "above" the current display, the screen content is scrolled or 
re-built so that the line containing the specified position lies at the top of the 
screen. 


If the position is "below" the current display, the screen content is scrolled or 
re-built so that the line containing the specified position lies at the bottom of 
the screen. 


SCRIMG_LINEDN The cursor is moved down by one line. 


If the resulting line is "below" the current display, the screen content is 
scrolled or re-built so that this line lies at the bottom of the screen. 


The horizontal pixel position of the cursor is set to the latent value as recorded 
iN scrimg.updownx. However, if the cursor was already on the last displayable 
line, it will be positioned at the end of the line. 


SCRIMG_LINEUP The cursor is moved up by one line. 


If the resulting line is "above" the current display, the screen content is 
scrolled or re-built so that this line lies at the top of the screen. 


The horizontal pixel position of the cursor is set to the latent value as recorded 
iN scrimg.updownx. However, if the cursor was already on the first displayable 
line, it will be positioned at the beginning of the line. 


SCRIMG_PAGEDN The cursor is moved down by a number of lines equal to the number of lines 
displayed in the text area minus one. 


If the resulting line is "below" the current display, the screen content is 
scrolled or re-built so that this line lies at the bottom of the screen. 


The horizontal pixel position of the cursor is set to the latent value as recorded 
iN scrimg.updownx. However, if the cursor was already on the last displayable 
line, it will be positioned at the end of the line. 


SCRIMG_PAGEUP The cursor position is moved up by a number of lines equal to the number of 
lines displayed in the text area minus one. 


If the resulting line is "above" the current display, the screen content is 
scrolled or re-built so that this line lies at the top of the screen. 


The horizontal pixel position of the cursor is set to the latent value as recorded 
In scrimg.updownx. However, if the cursor was already on the first displayable 
line, it will be positioned at the beginning of the line. 


SCRIMG_LINBEG The cursor is moved to the beginning of the line on which it is currently 
positioned. The horizontal pixel offset of the text cursor is taken as the new 
"latent" value and is recorded in the property scrimg.updownx. 


SCRIMG_LINEND The cursor is moved to the end of the line on which it is currently positioned. 
The horizontal pixel offset of the text cursor is taken as the new "latent" value 
and is recorded in the property scrimg.updownx. 


3 THE DOCUMENT LAYOUT CLASSES 


The new document position is written to *ppos. 


The select region is modified if the parameter select is TRUE, otherwise any selection is cancelled and the 
method returns Fase. 


If there is a selected region after the movement of the cursor, the method returns TRuE. 


S|_REDRAW Draw to given rectangle 
VOID si_redraw(P_RECT *prect) ; 


Redraw the region specified by the rectangle whose address is given by the parameter prect. The method 
assumes that a temporary or permanent graphics context has already been set up. The graphics context is 
frequently modified by calls to gsetec during drawing. 


The method may be called: 


e from within a redraw performed in response to a window server wM_REDRAW message. Such a 
message may be ignored by a window with a backup bitmap. 


e from code that draws directly to the view. 


If prect is nuuL the whole window is redrawn, otherwise those lines that intersect with the rectangle 
specified by prect are redrawn. If the specified rectangle does not intersect with the window, no 
re-drawing is done. 


Any background formatting is allowed to complete before any re-drawing is attempted. 


While re-drawing is in progress, the property scrimg.isredraw is set to TRUE; this is re-set to FALSE when 
re-drawing is complete. 


On the Series 3, and on other machines when running in Series 3 compatibility mode, prect is ignored, 
and the whole display area is always redrawn, but a value (uu if necessary) should always be supplied 
for prect. 


SI_DOC_RESET Discard screen layout, view and redraw 


VOID si_doc_reset (UINT doclen, UINT pos, INT line); 


Cancel any existing select region and discard any current layout. Rebuild the screen layout as necessary 
and redraw the view subject to the limitations imposed by the bounds of the document. 


The parameter docien should contain the new length of the document (which should include the 
terminating nuu1); this may be zero if the length is unchanged. 


The view is rebuilt such that document position pos is visible on the screen on line number 1ine. The 
value of 1ine may be -1, in which case document position pos should, if possible, be displayed on the 
screen line currently containing the cursor. 


This method is intended to be used to when a new document has replaced the original one; typically, it is 
used after the application has opened or created a new document. 


The method is also used if there has been a sufficiently large change to the document content to justify 
re-building the view from first principles. 


SI_DOC_ CHANGED Discard screen layout and redraw 


VOID si_doc_changed(UINT doclen) ; 


Cancel any existing select region and discard any current layout. Rebuild the screen layout as necessary 
and redraw the view subject to the limitations imposed by the bounds of the document. 


The parameter docien should contain the new length of the document (which should include the 
terminating nuL1); this may be zero if the length is unchanged. 


The view is rebuilt such that whatever character now occupies the current cursor position appears on the 
same screen line as the current cursor. 


FORM REFERENCE 


The method is intended to be used if there has been a sufficiently large change to the document content to 
justify re-building the view from first principles. 


This method is almost identical to si_doc_reset except that it does not allow the document position and 
line number to be changed. 


SI_DELPREP Prepare for a left delete 


VOID si_delprep(SCRLAY_PLX *old); 


Provide useful performance-enhancing information before performing a left delete. This method is 
ususally called prior to calling the si_para_changed method with a w_kEY_DELETE_LEFT character code 
(see later for a description of this method). 


The parameter o1d must point to a scRLAY_PLx type data structure. 


The method writes the document position of the character which is to the left of the current cursor to 
old->pos and writes the corresponding screen position to old->x and old->1ine. If this position is 
off-screen or not on same line as the cursor, a value of -1 is written to old->line. 


SI_PARA_CHANGED Draw paragraph to echo content change 


VOID si_para_changed(INT code, SCRLAY_PLX *old); 


Immediately echo the content change, indicated by the parameter code, to the screen display and then 
reformat and redraw in background. Any selected region is cancelled. 


The change indicated by code may be a left delete of one character (where code has the value 
W_KEY_DELETE_LEFT), a right delete of one character (where code has the value W_KEY_DELETE_RIGHT) or 
the insertion of a single content character, for which code is one of : 


e aprintable character code 
e zero (paragraph end) 

@ W_KEY_TAB 

e '\n' 


The parameter 01d is only relevant when code has the value w_KEY_DELETE_LEFT; it should point to a 
SCRLAY_PLx type data structure and should contain the document position and corresponding screen 
position of the character which is to the left of the current cursor (as returned by the method si_deiprep). 


If code has any value other than w_KEY_DELETE_LEFT, old can be set to NULL. 


This method supplies responsiveness to the most common keyboard operations used when editing a 
document. 


SI_STYLE_CHANGED Redraw to echo a style change 


VOID si_style_changed (INT type); 


Rebuild the screen layout and redraw one or more lines as appropriate, following a style change. The 
current cursor position and any select region are maintained and, in general, the cursor remains on the 
same line of the screen. 


The value of the parameter type specifies the nature of the change and can be one of the following values: 


SCRIMG_STCHNG_DOC A style change has occurred that potentially affects the whole document. The 
screen layout is rebuilt and the whole display redrawn. A typical use would be 
following a change in the base font used for the document 


SCRIMG_STCHNG_PARA __ A style change has occurred in the paragraph containing the cursor or the 
range of paragraphs that contain the select region, and affecting only that 
paragraph or paragraph range. The screen layout is rebuilt, from the start of 
the first paragraph in the range (excluding paragraphs that are entirely 
invisible) and the display is redrawn as appropriate. A typical use would be 
following a change in the margin positions of a single paragraph. 


3 THE DOCUMENT LAYOUT CLASSES 


SCRIMG_STCHNG_LINE A style change has occurred in the line containing the cursor or the range of 
lines that contain a select region. The screen layout is rebuilt, from the 
beginning of the line before that in which the change starts, and the display is 
redrawn as appropriate. A typical use would be following a change in 
emphasis of one or more words. 


Note that on the Series 3 the whole view is redrawn in all cases, regardless of the value of type. 


S|I_FWD_CHANGE _ Redraw for changes beyond cursor position 
VOID si_fwd_change(UINT doclen) ; 
Redraw the screen forward of the current cursor position and record a new document length. 


The parameter docien should contain the new length of the document (which should include the 
terminating nuu1); this may be zero if the length is unchanged. 


Any existing select region is cancelled. 


The existing screen layout is discarded and re-built afresh such that the character originally on the first 
line of the screen and occupying the first position on that line, retains that position. 


All lines from:- 

the line above that which contains the cursor 
to:- 

the last line 


are redrawn; in effect, the top of the screen is frozen while those lines from the cursor downwards are 
redrawn. 


This method may be used following any change to the document content that does not affect the content 
before the current cursor position. 


CHAPTER 4 


THE DOCUMENT PRINTING CLASSES 


The document printing classes are a set of classes which, co-operatively, permit documents to be 
printed, previewed and paginated. While this is true for the Series 3a, previewing is not available on 
the Series 3. 


The PRINTER class is the main interface to an application. It acts as a high level manager, being also a 
repository of useful information such as the printer model number, port characteristics and so on. 


The actual process of printing is delegated to the pacEs active class which, amongst other duties, handles 
pagination, builds the command sequences specific to individual printers and schedules the printing 
process. paces itself uses the services of other Form and o11B classes to achieve this behaviour. 


Information about specific printer models is held in a WDR printer resource file which can be access by 
an instance of the wor class. A PRINTER object always contains a woR component object. 


Precursors 


An understanding of the document printing classes will be helped by a knowledge of: 


e the description of WDR printing and .wdr files in the WDR Printing chapter of the Additional 
System Information manual 


e the Printing chapter of the Object Oriented Programming Guide 
e =the Document Layout Classes chapter of this manual 

e the Formatted Document Content Classes chapter of this manual 
e the OLIB active object class, AcTIVE 

e the OLIB variable array classes, vase and VAFLAT 


e the p_enter and p_leave error handling services 


FORM REFERENCE 


Class diagram 


The following diagram covers the relationships between the classes involved in document printing and are 
discussed in detail in this chapter. The underlined classes are either discussed in another chapter of this 
manual or they refer to OLIB classes in which case they are all discussed in the OLIB Reference manual. 


— se Pee 
scrlay » / active / 7, PEE? 
SS ) 
a — wdr 
c Pay NS ) 
see nn eo 
2 / 
J y i 
7 rscfile / 
AS 
) 
UU oe oe 


Measurement units 


In addition to the standard inches and centimetres, this chapter will often refer to other measurement units 
which are in common use. These are as follows: 


point - defined as 1/72 of an inch; this gives 72 points per inch. 
twip - defined as 1/1440th of an inch; this gives 1440 twips per inch and, therefore, 20 twips 
per point. 


printer units - defined as the minimum distance of travel in both horizontal and vertical directions, 
normally defined in twips. The units are dependent on the printer model. See the 
description of the wor class for more detail. 


PRINTER 


PRINTER 


wdr defbottxt 
a Pp 
port_type 

deftoptxt 


destroy 
pr_init 


pr_store_srchar 


pr_store_file 


pr_set_port_type 
pr_set_model 
pr_port_data 
pr_sense_port 
pr_sense_model 
pr_get_params 
pr_set_hd 


pr_get_hd 
pr_open_wdr 
pr_close_wdr 
pr_open_port 
pr_print 
pr_paginate 
pr_preview_start 
pr_preview 
pr_preview_end 


pr_preview_data 


4 THE DOCUMENT PRINTING CLASSES 


The print manager class provides an interface to an application for printing, paginating and print preview 
operations; it acts as a repository of information required to successfully execute an operation and provides 
the methods for setting and sensing this information. 


Note that print previewing is not available on the Series 3. All references to previewing apply to the 
Series 3a only. 


The class also supplies methods to launch a printing, paginating or previewing operation. 


An instance of the PRINTER class can be used for a single operation and then be destroyed, or it can be 
used for multiple operations. A second printing, paginating or previewing operation may be configured in 
a completely different fashion from the first. 


The printing, previewing or paginating process itself is delegated to an instance of the paczs active class; 
on completion of the process, the paczs class destroys itself. 


The PRINTER class also provides default values for page dimensions and the positioning of header and 
footer text which are set up at initialisation time. This information is required by the paczs class. 
PRINTER, however, provides no methods to change these values; if they are not suitable, then the PRINTER 
class must be subclassed to provide the required behaviour. 


The following configuration parameters can be set and sensed: 
e = The text of headers and footers. 


e The type of port to which printing is to be directed, (i.e. serial or parallel) or whether printing is 
to be directed to a file or to fax. On the Series 3, printing cannot be directed to fax. 


e The characteristics of the serial port. 
e The name of the file, if printing is directed to a file. 


e The printer resource filename (i.e. the WDR resource file name) and the model number of the 
printer to be used for the next printing operation. 


Class definition 


The PRINTER class subclasses root and is defined in the sub-category file printer.cl (with generated header 
file printer.g). 


CLASS printer root 
{ 


REPLACE destroy Free alloc cells 


ADD pr_init Set default values 

ADD pr_store_srchar Store the serial characteristics 

ADD pr_store_file Store the spec of the print file 

ADD pr_set_port_type Set/store printer port type 

ADD pr_set_model Set/store wdr file & model number 

ADD pr_port_data Sense printer port data 

ADD pr_sense_port Sense printer port data of current port type 
ADD pr_sense_model Sense wdr file & model number 

ADD pr_get_params Get address of params struct for read/write 
ADD pr_set_hd Set top or bottom header text 

ADD pr_get_hd Return address of top or bottom header text 
ADD pr_open_wdr Create and init wdr object 

ADD pr_close_wdr Destroy wdr component (to save memory) 

ADD pr_open_port Open print port device 

ADD pr_print Print data source 

ADD pr_paginate Paginate data source 

ADD pr_preview_start Start preview (i.e. allocate resources) 

ADD pr_preview Preview data source 

ADD pr_preview_end End preview (i.e. destory any resources) 
ADD pr_preview_data Return pointer to preview data 


FORM REFERENCE 


CONSTANTS 


INTER_PORT_PARALLEL 
INTER_PORT_SERIAL 
INTER_PORT_FILE 
INTER_PORT_FAX 
INTER_PORT_NOT_SET 


INTER_HDR_TOP 
INTER_HDR_BOT 


INTER_PAGINATE 
INTER_PRINTING 
INTER_PREVIEW 


PRV_SEG_GRANULARITY 


} 


TYPES 
{ 


typedef struct 


{ 

TEXT *model; 
TEXT *hdtxt [2]; 
} PRINTER_ALLOC; 


typedef struct 


{ 
SCRLAY_FONT f; 


awnr oOo 


Bb 


16 paragraphs (256) (power of 2 is ideal) 


WDR filename and model number 
Header text 


Font data for body area text 


UBYTE size_choice; Paper size index (A4 is zero) 
UBYTE wo_control; TRUE to disable widows and orphans control 
UWORD spare[2]; Might be useful in future 


PRINTER_DATA; 


typedef struct 


PAGES_PARAMS p; 
PRINTER_DATA d; 
PRINTER_PARAMS,; 


typedef struct 


UBYTE *pSegName; 
PR_ROOT *pArray; 
UPOINT PrvSize; 


UWORD BitWidth; 
VOID *hPrvDone; 
WORD mPrvDone; 


} PREVIEW_INIT; 


typedef struct 


{ 

HANDLE SegHandle; 
PR_ROOT *pArray; 
UPOINT Size; 


UWORD BitWidth; 
VOID *hPrvDone; 
WORD mPrvDone; 


} PREVIEW_DATA; 


PROPERTY 1 


{ 


PR_WDR *wdr; 
PRINTER_ALLOC a; 


WORD 
TEXT 
TEXT 


PRINTER_PARAMS p; 
PREVIEW_DATA prv; 


} 


Parameters for init of pages object 
Used externally 


used width of bitmap, use this for scaling 
Call-back handle for %done & completion 
Call-back method for %done & completion 


Handle of preview data segment 


Size of bitmap (pixels) 

used width of bitmap, use this for scaling 
Call-back handle for %done & completion 
Call-back method for %done & completion 


Printer driver 
Addresses of allocated cells 


port_type; Port type 
deftoptxt[3]; Default header text (top) 
defbottxt[3]; Default header text (bottom) 


Property 


printer 


printer 


printer 


printer 


printer 


printer. 


printer. 


.wdr 


7a 


-port_type 


-deftoptxt 


-defbottxt 


pry 


4 THE DOCUMENT PRINTING CLASSES 


The handle of the current printer resource object, i.e. the handle of an 
instance of wor. The wor object is created by the pr_open_wdr method. 


A data structure of type PRINTER_ALLOc containing three TExT pointers. Each 

pointer can contain the address of a single cell of allocated storage as 

follows: 

printer.a.model if not NULL, points to an allocated cell containing 
the model number and the filename of the printer 
resource (i.e. the wor name) as a zero terminated 
string. The first byte of the string holds the model 
number as a numeric character while subsequent 
bytes hold the zero terminated filename. 


printer.a.hdtxt[0] if not NULL, points to an allocated cell containing 
the top header text to be used. 


printer.a.hdtxt[1] if not NULL, points to an allocated cell containing 
the bottom header text to be used. 


This contains a value which indicates whether printer output is to be directed 
to the serial port, the parallel port, fax or to a file. 


It can take one of the values: 
PRINTER_PORT_PARALLEL 
PRINTER_PORT_SERIAL 
PRINTER_PORT_FAX 
PRINTER_PORT_FILE 


The default top header text. This property contains the zero terminated 
string "%F" and is the text used if top header text has not been explicitly set 
using the pr_set_hd method. 


The default bottom header text. This property contains the zero terminated 
string "%P" and is the text used if bottom header text has not been explicitly 
set using the pr_set_hd method. 


This is configuration information consisting of items which can be set and 
sensed and items such as page dimensions which cannot be altered. 


Preview parameters. These are set by the pR_PREVIEW_START method and are 
re-set by the pR_PREVIEW_END method. 


Note that the four methods pr_preview_start, pr_preview, pr_preview_end and pr_preview_data and 
the property printer.prv are not available on the Series 3 


Environment variables 


The print manager makes use of a number of environment variables in which to store some of its 
information. When setting configuration information, the environment variables will be created if they do 
not already exist. If, when sensing configuration information, the appropriate variable does not exist, 
default values will be returned. 


The variable names and their meaning are as follows: 


P$D 


P$F 


P$S 
P$M 


- a zero terminated character string containing the type of port; the type is held as a 
numeric character. 


- a zero terminated character string containing the name of the file to which printing 
is to be directed. This file is referred to as the print file. 


the characteristics of the serial port held as a p_srcuar data structure. 


- a zero terminated character string containing the printer model number as a numeric 
character followed by the wor file name (i.e. the printer resource file name). 


FORM REFERENCE 


PRINTER methods 


DESTROY Destroy the print manager 


VOID destroy (VOID) ; 
Destroy the instance of the print manager. 


A copy of the address of the instance of the print manager is normally kept in a spare property of the 
application manager, appman. spare1; this method resets this property to NULL. 


The property printer.a 1S a PRINTER_ALLOoc data structure which contains three data members each of 
which may contain the handle of an allocated cell. If storage has been allocated, it is freed. 


The method supersends a pEstRoy message to complete the destruction process. 


PR_INIT Initialise printer & set default values 


VOID pr_init (VOID); 


Initialise the print manager and set default values for the page dimensions and the positioning of header 
and footer text. 


A copy of the address of this instance of the print manager is set into a spare property of the application 
manager, appman.spare1. This is done for convenience and gives other objects (such as instances of ppr) 
quick and easy access to this instance of PRINTER. 


Default values are also set for the printer port type and both the header and footer text. 


On the Series 3, there is a slight difference to the behaviour of this method. See the Series 3a/Series 3 
notes section at the end of this chapter for detail. 


PR_STORE_SRCHAR Set serial port characteristics 


VOID pr_store_srchar(P_SRCHAR *psc) ; 
Set the characteristics of the serial port. 


The parameter psc points to a data structure of type p_sRcHar which defines the characteristics of the 
serial port. The method copies the entire content of the data structure pointed to by psc into the 
environment variable pss. The environment variable is created if it does not exist. 


The structure p_sRcuar is defined in p_serial.h but is shown below for completeness: 


typedef struct 


UBYTE tbaud; /* transmit Baud rate selector */ 

UBYTE rbaud; /* receive Baud rate selector */ 

UBYTE frame; /* number of data, parity and stop bits */ 

UBYTE parity; /* parity selector */ 

UBYTE hand; /* handshake flags */ 

UBYTE xon; /* XON character */ 

UBYTE xoff; /* XOFF character */ 

UBYTE flags; /* ignore parity errors/dont drive DTR changing chars */ 
ULONG tmask; /* terminator mask */ 


} P_SRCHAR; 


PR_STORE_FILE Set print file specification 


VOID pr_store_file(TEXT *file); 
Set the file specification of the file to which printing is to be directed. This file is often referred to as the 
print file. 


The parameter file points to a character string which contains the (zero terminated) specification of the 
file to which printing is to be directed. The method copies this string into the environment variable psr 
which is created if it does not already exist. 


If printing is directed to a file and the file specification is not set, then m:\p.L1s will be assumed as 
default. 


4 THE DOCUMENT PRINTING CLASSES 


PR_SET PORT_TYPE Set type of printer port 


VOID pr_set_port_type(INT store, INT port_type); 
Set the type of the printer port. 


The value passed in the parameter port_type specifies the type of the printer port. This can be one of the 
following values: 


PRINTER_PORT_PARALLEL 
PRINTER_PORT_SERIAL 
PRINTER_PORT_FILE 
PRINTER_PORT_FAX 


The printer port type is set into either the property printer.port_type or the environment variable psp, 
not in both. If the parameter store contains the value Truz, the port type is set into the environment 
variable otherwise it is set into the property. 


Whichever location is chosen, the printer port type is held as a numeric character. 


PR_SET MODEL Set printer model no. & WDR file name 


VOID pr_set_model (INT store, TEXT *name, INT mnum); 
Set the printer resource file name (i.e. the WDR resource file name) and the printer model number. 


The parameter name should point to a zero terminated string containing the printer resource file name; the 
value in the parameter mnum should contain the printer model number. 


A character string is generated such that the first byte contains the model number as a numeric character; 
the zero terminated printer resource file name occupies the rest of the string. 


A cell of sufficient length is allocated to hold this string and its handle is stored in the property 


printer.a.model. 


If the value of the parameter store is TRUE, the string is also copied into the environment variable psm. 


PR_PORT_DATA Sense printer port information 
INT pr_port_data(TEXT *file, P_SRCHAR *ser, INT UseModel); 
Retrieve information about the printer port. 


The method returns the printer port type and retrieves the serial port characteristics and the name of the 
print file. 


The parameter ser should point to a data structure of type p_srcuar. If the environment variable pss can 
be read, the serial port characteristics are copied from that variable into this p_srcHar data structure; 
otherwise, default values are inserted. The default values are as follows: 


ser->tbaud P_BAUD_9600 
ser->rbaud P_BAUD_9600 
ser->frame P_DATA_8 


ser->parity 0) 


ser—->hand P_OBEY_XOFF | P_OBEY_DSR | P_IGN_CTS 
ser->xoff 0x13 

ser->xon Ox1l 

ser—>flags 0 

ser->tmask 0 


FORM REFERENCE 


For more information on the serial port, see the Serial Port chapter of the I/O Devices Reference manual. 


The parameter file should point to a text buffer. If the environment variable psr exists, the name of the 
print file is copied from that variable into the buffer; otherwise, the default print file name p..1s is copied 
instead. 


The printer port type returned depends on a number of factors and is determined as follows: 


e if the parameter useModel contains the value TRuE and the first three characters of the fully 
parsed printer resource file name (i.e. the WDR resource file name) are "FAX", the method 
returns the printer port type PRINTER_PORT_FAX. 


e if the property printer.port_type contains a valid printer port type, then this value is returned. 
e if the environment variable psp contains a value, this value is returned. 


e if the printer port type cannot be determined by any of the above, a value of 
PRINTER_PORT_PARALLEL is assumed by default. 


The effect of the useMode1 parameter can be neatly summarised: 


e if it has the value ratsz, the printer port information retrieved is that set by the user of the 
PRINTER Object (in an earlier call to the pr_set_port_type method). 


e if it has the value TRuz, it allows the method to return printer port information other than that set 
by the user. The best example of this is where the printer resource file name begins with the three 
characters F A X. In this case, regardless of the value set in the property printer.port_type or 
the environment variable psp, the printer port type returned is PRINTER_PORT_FAX. 


On the Series 3, there is a slight difference to the behaviour of this method. See the Series 3a/Series 3 
notes section at the end of this chapter for detail. 


PR_SENSE PORT Sense current printer port device information 


INT pr_sense_port (TEXT *buf, P_SRCHAR *ser); 
Retrieve information about the current printer port device. 


The method returns the printer port type and retrieves the (zero terminated) name of the current printer 
port device; if the printer port type is PRINTER_PORT_SERIAL, the method retrieves the serial port 
characteristics. 


The parameter buf should point to a buffer into which the zero terminated name of the current printer port 
device will be placed. The name written to *buf depends on the port type as follows: 


PRINTER_PORT_FILE - the name of the file 
PRINTER_PORT_SERIAL - the serial device name 
PRINTER_PORT_PARALLEL - the parallel device name 


On the Series 3 and Series 3a, which only have one port, the serial and parallel device names will always 
be try:a and par:a respectively. 


On machines with more than one port, such as the Workabout, the port letter will be read from the 
relevant environment variable, if it exists: 


e = The serial port letter will be read from the first character of the environment variable pssp, if it 
exists. Thus, if the first character in this environment variable is 'B' the serial device name will 
be set to rry:s. If the environment variable doe not exist, the serial device name defaults to 
TTY:A. 


e The parallel port letter will be read from the first character of the environment variable pspp, if it 
exists. Thus, if the first character in this environment variable is 'C' the parallel device name will 
be set to par:c. If the environment variable doe not exist, the parallel device name defaults to 
PAR:A. 


These environment variables are not created by system code. It is an application's responsibility to create 
them if they are needed and do not already exist. 


The parameter ser should point to a data structure of type p_srcuar. If the printer port type is 
PRINTER_PORT_SERIAL, a copy of the serial port characteristics will be written to *ser. 


4-8 


4 THE DOCUMENT PRINTING CLASSES 


PR_SENSE MODEL Sense printer model no. & WDR file name 


INT pr_sense_model (TEXT *buf); 


Retrieve the fully parsed printer resource file name (i.e. the WDR resource file name) and return the model 
number. 


The parameter buf should point to a buffer into which the method can insert the zero terminated printer 
resource file name. The buffer itself must be capable of holding a fully parsed file name and, therefore, 
must be at least p_rNames1ze bytes long. 


The model number and the printer resource file name are held as a character string in an allocated cell 
pointed to by the property printer.a.modei and/or in the environment variable psm. The model number 
itself is held in the form of a numeric character and precedes the file name in the string. 


This information is retrieved from the property, if it exists, otherwise it is retrieved from the environment 
variable. By default, if the information exists in neither location, a value of 0 is returned for the model 
number and a printer resource file name of Rom: :BJ.wDR 1s written to *buf. 


A check is made to ensure that the printer resource file exists. If the file cannot be found, all of the Loc: : 
drives are searched. If this search is unsuccessful, the rom: : is searched. If, finally, the file has still not 
been found, then the printer resource file name of Rom: :BJ.wDR is assumed together with a model number 
of zero. 


On the Series 3, there is a slight difference to the behaviour of this method. See the Series 3a/Series 3 
notes section at the end of this chapter for detail. 


PR_GET_PARAMS Fetch address of printer parameters 


PRINTER_PARAMS *pr_get_params (VOID); 
Return the address of the pRINTER object property printer.p. 


This property is a data structure of type PRINTER_PARams and contains information required by the pacEs 
object at its initialisation. As discussed earlier, this is printer configuration information, page dimension 
information and so on. 


See the class definition for more detailed information on pRINTER_PARaMs. It may also be useful to refer to 
the paces class definition. 


PR_SET_HD Set top or bottom header text 


VOID pr_set_hd(INT htype, TEXT *str); 
Set either the top or the bottom header text. 


The parameter str should be either nuut or point to a buffer containing the zero terminated text to be set. 
The value of the parameter ht ype indicates whether the text is to be set for the top or the bottom header. 


Both top and bottom header text are held in cells of allocated storage; the handles of both cells are held in 
printer.a.hdtxt[0] and printer.a.hdtxt [1] respectively. 


If ht ype contains the value PRINTER_HDR_TOP, any existing top header text is discarded by freeing the 
existing cell. If str is not NULL, a new cell is allocated large enough to contain the new text and its handle 
is stored in the property printer.a.hdtxt [0]; the text is copied into the new cell from *str. If str is 
NULL, any existing top header text is discarded and printer.a.hdtxt [0] is set to nuLL. The effect will be 
to cause the default top header text, as found in the property printer.deftoptxt, to be used. 


Similarly, if ntype contains the value PRINTER_HDR_BOT, any existing bottom header text is discarded by 
freeing the existing cell. If str is not NULL, a new cell is allocated large enough to contain the new text 
and its handle is stored in the property printer.a.hdtxt [1]; the text is copied into the new cell from 
*str. If str is NULL, any existing bottom header text is discarded and printer.a.hdtxt [1] 1S set to NULL. 
The effect will be to cause the default bottom header text, as found in the property printer.defbottxt, to 
be used. 


FORM REFERENCE 


PR_GET_HD Get address of top or bottom header text 
TEXT *pr_get_hd(INT htype) ; 
Return the current address of either the top or the bottom header text. 


The value of the parameter ht ype determines whether the address returned is that of the top or the bottom 
header text; a value of PRINTER_HDR_ToP causes the address of the top header text to be returned while a 
value of PRINTER_HDR_BOT Causes the address of the bottom header text to be returned. 


If the top header text has been set, the address of the cell containing this text is returned, otherwise the 
address of the default text is returned. This also applies to the bottom header text. 


A note of caution - if the method pr_set_ha 1s called after a call to pr_get_ha, the address of any header 
text may be invalid. 


PR_OPEN_WDR Create WDR object 


PR_WDR *pr_open_wdr (VOID) ; 
Create and initialise a new wor (printer resource) object and return its handle. 


Any existing wor object is destroyed by calling the pr_close_wdr method before attempting to create the 
new one. 


The new wor object is initialised by sending it a woR_INIT message and passing it both the current model 
number and the printer resource file name. The pr_sense_mode1 method is used to determine the current 
model number and the printer resource file name. 


The handle of the new wor object is set into the property printer.war. 


The model number set in the wor object may be changed at any time by sending the object a 
WDR_SET_MODEL message; however, if a different printer resource file name is needed, the existing wor 
object must be destroyed and a new one created, passing it the new file name. 


Note that this method is called by the pr_print and pr_paginate methods. 


PR_CLOSE_WDR Destroy WDR object 


VOID pr_close_wdr (VOID) ; 
Destroy the current printer resource (wor) object, if it exists. 


The wor object is destroyed by sending it a pestroy message. The property printer.wdr containing the 
handle of the object is re-set to NULL. 


PR_OPEN_PORT Open printer port device 


VOID *pr_open_port (VOID); 
Open the printer port device. 


The name of the printer port device, the printer port type and the serial characteristics (if the port type is 
PRINTER_PORT_SERIAL) are retrieved by calling the pr_sense_port method. 


The printer port device is opened by calling the Plib function £_open, passing it the retrieved device name. 
If the port type is PRINTER_PORT_SERIAL then p_iow Is called to set the serial port characteristics. 


The method returns the handle of the opened port (i.e. the address of the channel control block). 


4 THE DOCUMENT PRINTING CLASSES 


PR_PRINT Print data source 


PR_PAGES *pr_print (PAGES_CALLS *pc)j; 


Launch the printing of the current data source and return the handle of the paczs object created to do the 
printing. 


The parameter pc must point to a data structure of type pacrs_catus. The caller of this method must set 
the call-back methods needed to handle read and done messages, into the pacEs_caLLs data structure. 
See the description of the pacgs class and the pacEzay notional mixin class in this chapter for more 
information. 


PAGES_CALLS can be found in the paczs class definition but is shown below for completeness: 


typedef struct 
{ 


VOID *hread; Call-back handle for reading a line 
WORD mread; Call-back method for reading a line 
VOID *hdone; Call-back handle for %done & completion 
WORD mdone; Call-back method for %Sdone & completion 


} PAGES_CALLS; 
If the printer resource (wor) object does not exist, it is created by calling the pr_open_wdr method. 
The method creates a paces object to do the printing and initialises it by sending an ao_InIT message. 


The pacgs object requires information which consists of a copy of PRINTER'S property printer.p.p 
(a PAGES_PaRams data structure), a fully completed paczs_1ntrT data structure and an indication that it is 
to perform a printing operation. 


The information in the paces_1nit data structure includes a copy of the paczs_cauts data structure 
whose address is given in the parameter pc, the handle of the wor object, the addresses of both the top and 
bottom header text and the address of the buffer containing the name of the current data source. 


The pacers object destroys itself on completion of printing or if an error occurs. 


On the Series 3, there is a slight difference to the behaviour of this method. See the Series 3a/Series 3 
notes section at the end of this chapter for detail. 


PR_PAGINATE Paginate data source 


PR_PAGES *pr_paginate(PAGES_ CALLS *pc)j; 


Launch the pagination of the current data source and return the handle of the paces object created to do 
the pagination. 


The parameter pc must point to a data structure of type pacrs_catts. The caller of this method must set 
the call-back methods needed to handle read and done messages, into the pacEs_caLus data structure. 
See the description of the pacgs class and the pacezay notional mixin class in this chapter for more 
information. 


PAGES_CALLs can be found in the paczs class definition (or see the description of pr_print earlier). 
If the printer resource (wor) object does not exist, it is created by calling the pr_open_wdr method. 
The method creates a paczs object to do the pagination and initialises it by sending an ao_INIT message. 


The paces object requires information which consists of a copy of PRINTER'S property printer.p.p 
(a PAGES_PaRAms data structure), a partially completed pacrs_intT data structure and an indication that it 
is to perform a pagination operation. 


The information required in the pacrs_1ntT data structure includes a copy of the paczs_cauts data 
structure and the handle of the wor object. 


The paces object destroys itself on completion of pagination or if an error occurs. 


FORM REFERENCE 


PR_PREVIEW_START Initialise preview 


HANDLE pr_preview_start (PREVIEW_INIT *pInit); 
Perform initialisation for previewing a data source. 


The parameter ptnit should point to a data structure of type PREVIEW_INIT containing the information 
required by preview. This structure, shown below, is defined in the class definition: 


typedef struct 
{ 
UBYTE *pSegName; 
PR_ROOT *pArray; 
UPOINT PrvSize; 


UWORD BitWidth; used width of bitmap, use this for scaling 
VOID *hPrvDone; Call-back handle for %done & completion 
WORD mPrvDone; Call-back method for %Sdone & completion 


} PREVIEW_INIT; 
The members have the following meaning: 


pSegName The address of a buffer containing the name to be given to the external 
data segment. 


pArray The handle of a varnat array object which will be used to hold a 
series of values giving the position of consecutive compressed bitmaps 
within the preview data segment. It is designed to hold entries 
(records) which are the length of a tone 'C' data type and has a 
granularity of 16 entries (records). 


PrvSize The dimensions of the bitmap, in pixels, to which a page will be 
drawn. 


The x component is the value of Bitwidth rounded up so that it 
occupies an integral number of bytes. 


The y component is normally determined by the height of the 
application's window. 


BitWidth The number of horizontal bits needed to draw a single line so that it 
fits into the application's window and the ratio of this value to the 
height of the page measured in pixels will be the same as the ratio of 
the width to the height of the page measured in twips. 


Note that this value will not necessarily be exactly the same as that in 
PrvSize.x above. This item will be used by the prvppr class to 
calculate a rounding factor for its internal calculations 


hPrvDone The handle of the object which will provide the done callback method. 


mP rvDone The method number of the done callback method. For the general 
specification of this method, see the pagelay_mdone method in the 
description of the pacELay mixin class in this chapter. 


The exact method for calculating the values of prvsize and Bitwidth depends on the application. The 
following sequence shows how a typical application might proceed. However, it should only be used as a 
guideline: 


e Determine the space available to display a previewed page; in other words, determine the 
number of horizontal and vertical pixels available and set prvsize.y to the number of vertical 
pixels. 


e Ifin landscape mode, calculate Bitwidth to be the result of: 
page height (in twips) / page width (in twips) * vertical pixels available. 


e If in portait mode, calculate Bitwidth to be the result of: 
page width (in twips) / page height (in twips) * vertical pixels available. 


4 THE DOCUMENT PRINTING CLASSES 


e Check that the resulting value of Bitwidth will fit into the number of horizontal pixels available. 
If it does not fit, re-set Bitwidth to the available number of horizontal pixels and adjust the value 
of PrvSize.y to maintain proportions: 


if in landscape mode, set prvsize.y to: 
page width (in twips) / page height (in twips) * horizontal pixels available. 


if in portrait mode, set prvsize.y to: 
page height (in twips) / page width (in twips) * horizontal pixels available. 


e =6Set prvsize.x to the value of Bitwidth rounded up to a multiple of eight, in other words, ensure 
that the number of bits represented will fit into an integral number of bytes. 


The method creates a dynamic external data segment; the name to be applied to the segment is supplied in 
a buffer pointed to by prnit->pSegName. Recall that an external data segment is one that is not 
constrained to the 64K limit but can extend to 512k, provided sufficient memory is available. 


Although the segment is initially created with a zero length, p_leave is called if the allocation fails. 


The handle of the successfully created external segment is set into the segdandie member of the property 


printer.prv. 


The size of the external segment is adjusted to pRv_SEG_GRANULARITY paragraphs. If the adjustment fails 
(e.g. E_GEN_NoMEMoRyY), the method pr_preview_end is called to free any acquired resources and is 
followed by a call to p_leave. 


All the remaining initialisation information supplied by *ptnit is copied into the property printer.prv. 


It is worth noting that an instance of prvppr (the print preview class) requests the address of the 
printer.prv property during its initialisation by sending a pR_PREVIEW_DATA message to this instance of 
PRINTER. The pr_preview_data method is described later. 


The method returns the handle of the dynamic external data segment. 


PR_PREVIEW Perform preview 


PR_PAGES *pr_preview (PAGES CALLS *pc)j; 


Launch the preview process of the current data source and return the handle of the paczs object created to 
do the previewing. 


The parameter pc must point to a data structure of type pacrs_catts. The caller of this method must set 
the call-back methods needed to handle read and done messages, into the pacEs_caLus data structure. 
See the description of the pacgs class and the pacEzay notional mixin class in this chapter for more 
information. 


PAGES_CALLS can be found in the paczs class definition (or see the description of pr_print earlier). 
If the printer driver (wor) object does not exist, it is created by calling the pr_open_wdr method. 


The method creates a paces object to perform the previewing and initialises it by sending an ao_INIT 
message. 


The paces object requires information which consists of a copy of PRINTER'S property printer.p.p 
(a PAGES_PaRams data structure), a fully completed paczs_1ntT data structure and an indication that it is 
to perform a previewing operation. 


The information in the paczs_1nit data structure includes a copy of the paczs_cauts data structure 
whose address is given in the parameter pc, the handle of the wor object, the addresses of both the top and 
bottom header text and the address of the buffer containing the name of the current data source. 


The pacers object destroys itself on completion of the previewing operation or if an error occurs. 


PR_PREVIEW_END Terminate preview 


VOID pr_preview_end (VOID); 
Terminate preview and free any acquired resources. 


The method frees the allocated external data segment using the Plib function p_sgclose and then 
indicates the end of preview by resetting the whole of property printer.prv to binary zero. 


FORM REFERENCE 


PR_PREVIEW_DATA Return handle of preview data 


PREVIEW_DATA *pr_preview_data (VOID); 
Return the handle of the preview data. 


This method returns the address of the PRINTER object's printer.prv property which contains 
information required by the preview operation. The content of printer.prv is set by the 
pr_preview_start method. 


PAGES 


q pagarr page 
priority todo reset_page 
isactive ephead newdoc 
pcb prhead started 
stat pdr newpage 
in region 
par holding 
last_pos pos 
flags pr 
pheight tabs 
brk_height spacing 
brk_above margins 
brk_pos time 
y date 


ioclen 


destroy ao_init ao_run 


aorinit ao_queue ao_abrun 


ao_cancel 


A paces object handles a request to print, paginate or preview one or more documents on behalf of an 
instance of the PRINTER class and is created when the application sends a PpR_PRINT, PR_PAGINATE OF 
PR_PREVIEW message to the PRINTER object. The pr_print, pr_paginate and pr_preview methods create a 
PAGES object as part of their implementation. 


PaGEs itself is a low priority active object; this allows the printing, previewing or pagination process to be 
done in discrete chunks, giving other active objects (and, therefore, other applications) the opportunity to 
run concurrently. 


In general, knowledge of the document to be printed, in terms of the text itself, the typefaces, fonts 

(i.e. height) and styles to be used, lies within other object(s) in the application. In order to print a 
document, the paczs object must ask the application for the next portion of text to be printed; this is 
normally represented by a data structure of type woR_PRINT, often referred to as a print element. The pacEs 
object must also keep the application informed of the current status of the printing operation. paces 
achieves this by means of callback methods. 


PAGES itself uses the services of an instance of the ppr (printer driver) class to translate a print element 
into a sequence of commands suitable for a specific printer. When performing a preview operation, the 
PpR object represents a specialised printer driver. 


When paginating, pacrs does no printing, instead it uses the print elements to build pagination 
information. 


Page breaks and the printing of headers and footers are done automatically by pacgs. 


Class definition 


4 THE DOCUMENT PRINTING CLASSES 


The paczs class subclasses the OLIB class active and is defined in the sub-category file pages.cl (with 
generated header file pages.g). 


CLASS pages active 


{ 


REPLACE ao_init 
REPLACE ao_run 
REPLACE ao_abrun 
REPLACE ao_queue 


CONSTANTS 


{ 
PAGES_DONE_PAGE 
PAGES_DONE_DOC 
PAGES_DONE_END 
PAGES_DONE_ERROR 


WNrR O 


PAGES_DOC_NEW_PAGE 


PAGES_DOC_RESET_PAGE_NUM 


PAGES_FLAGS_PRINTING 
PAGES_FLAGS_NOTFIRST 
PAGES_FLAGS_ZERODOWN 


PAGES_REGION_BODY 
PAGES_REGION_TOP 
PAGES_REGION_BOTTOM 


PAGES_REGION_LAST_BOTTOM 


PAGES_REGION_END 
PAGES_REGION_VERY_END 
PAGES_REGION_DOC_END 


PAGES_PAGENUM_ARABIC 
PAGES_PAGENUM_ROMAN_U 
PAGES_PAGENUM_ROMAN_L 
PAGES_HEADER_2_COLUMNS 
PAGES_HEADER_3_COLUMNS 
} 


TYPES 


{ 

typedef struct 
{ 
UWORD x; 
UWORD y; 
} UPOINT; 


typedef struct 
{ 
UPOINT t1; 
UWORD width; 
UWORD height; 
} UEXTENT; 


typedef struct 
{ 
WORD event; 
UWORD page; 
PR_VAFLAT *pages; 
} PAGES_DONE; 


typedef struct 
{ 
SCRLAY_FONT f; 
UBYTE align; 
UBYTE first_page; 
} PAGES_HEADER; 


A new doc resets the page number 


(on top of 1st page) 


0x01 A new doc starts a new page 
0x02 
0x01 Printing (or previewing) 
0x02 Discard down when FALSE 
0x04 Discard lst down in todo list if TRUE 
0 
1 
2 
3 
4 
5 
6 


0 
el 
2 
SCRLAY_ALIGN_JUSTIFY+1 
SCRLAY_ALIGN_JUSTIFY+2 


PAGES_DONE_PAGE, _DOC, 


END 


Page number of new page 
Page length array 


Font data 
Header alignment 


TRUE to emit on first page 


FORM REFERENCE 


typedef struct 
{ 
UWORD width; Width of page 
UWORD height; Height of page 
UEXTENT body; Body area 
UWORD hdtop; body.tl.y-hdtop = Y of top of top header 
UWORD hdbot; body.tl.yt+tbody-.height+thdbot=height = Y of top 
of bottom header 
} PAGES_PAGE; 


typedef struct 
{ 


WORD offset; Offset for page number 
WORD last; Last page number for %m 
WORD style; Style for page 


} PAGES_PAGENUM; 


typedef struct 
{ 


PAGES_PAGE pg; Page dimensions with margins 

WORD pdrflags; WDR_PDR_LANDSCAPE, _DRAFT etc 

WORD docflags; PAGES_DOC_NEW_PAGE is set for new page per doc 
UWORD pgbeg; Page number to start printing (lst page is 1) 
UWORD pgend; Last page number to print (inclusive) 
PAGES_HEADER top; Top running header 

PAGES_HEADER bot; Bottom running header 

PAGES_PAGENUM pgnum; Page number for %p 


} PAGES_PARAMS; 


typedef struct 
{ 


VOID *hread; Call-back handle for reading a line 
WORD mread; Call-back method for reading a line 
VOID *hdone; Call-back handle for %done & completion 
WORD mdone; Call-back method for %Sdone & completion 


} PAGES_CALLS; 


typedef struct 
{ 


PR_WDR *wdr; Printer driver 

PAGES_CALLS oc; Call-backs 

TEXT *fname; File name for %f (ZTS) or NULL 
TEXT *toptxt; Top running header ZTS or NULL 
TEXT *bottxt; Bottom running header ZTS or NULL 


} PAGES_INIT; 


PROPERTY 5 


} 
Property 


pages.pagarr 


pages.todo 


{ 

PR_VAFLAT *pagarr; 
PR_VASEG *todo; 
PR_EPFDOC *ephead; 
PR_PRNLAY *prhead; 
PR_PDR *pdr; 
PAGES_INIT in; 
PAGES_PARAMS par; 
WORD last_pos; 
UWORD flags; 

WORD pheight; 

WORD brk_height; 
WORD brk_above; 
UWORD brk_pos; 
WORD y; 

WORD nrec; 

UWORD page; 

UBYTE reset_page; 
UBYTE newdoc; 
UBYTE started; 
UBYTE newpage; 


WORD region; 

WORD holding; 
UWORD pos; 
WDR_PRINT pr; 
SCRLAY_TABS tabs; 


SCRLAY_SPACING spacing; 


4 THE DOCUMENT PRINTING CLASSES 


Page break array being built 
Pending print output 

Text for top/bottom header 

Layout for top/bottom header 

Output printer driver 

Init parameters 

User settable init parameters 

Pos of last page break 

Printing or paginating lst page etc 
Height of processed lines on current page 
Height of last line break 

At last line break 

Document pos at last page break 
Current page y 

Record number in todo list 

Page Number 


Reset page number on next footer if TRUE 
TRUE if there is another doc 

TRUE if printing has really started 

TRUE if pagination decided on a new page 
PAGES_REGION_TOP, BODY or_BOTTOM 

TRUE if holding data in todo list 
Document pos 


Being printed 
Header tab settings 
Header spacing 


SCRLAY_MARGINS margins; Header margins 
TEXT time [LN_TIME_DATE_STR]; 
TEXT date [LN_TIME_TIME_STR-2]; 


UWORD ioclen; 
} 


The handle of an instance of the variat class. The array of uworp elements 


contains pagination information where each entry contains a count of the 
number of characters fitting into a page. The entries are in page order. 


The handle of an instance of the vaszc class. The array of woR_pRiNtT data 
structures contains a queue of print elements to be dealt with. 


Queuing print elements is a convenient way of deferring printing. This is 
important when lines which must be kept together are being processed; in 
these circumstances it is not possible to know in advance whether a page 


pages.ephead 


pages.prhead 


pages.pdr 


break will occur after the lines are printed or whether a page break will need 
to be forced before the first line is printed (with the consequent need to print 
bottom and top header text first). 


N.B. This queue is also referred to as the todo list. 


The handle of an instance of the Eprpoc class, used to encapsulate the text of 
a top or bottom header. 


The handle of an instance of the prniay class, used to encapsulate the layout 
of a top or bottom header. 


The handle of the printer driver object. This is an instance of the ppr class 
and is created by the ao_init method. 


FORM REFERENCE 


pages.in 


pages.par 


pages.last_pos 


pages.flags 


pages.pheight 


pages.brk_height 


Initialisation information, derived from the application, and passed to the 
PAGES Object at initialisation time in a call to its ao_init method; this 
includes: 


e the handle of the printer resource (wor) object 
e the call-back information 


e when printing and previewing, the addresses of buffers containing 
the file name of the current data source, the top header text and the 
bottom header text. 


Initialisation information, set up internally by the pRInTER object, and passed 
to the paczs object at initialisation time in a call to its ac_init method. See 
the description of the ao_init method. 


The document position of the previous page break. This is used during 
pagination; in particular, during the process of generating entries for the 
pages array whose handle is contained in the property pages. pagarr. 


This is a general flag area; the following values can be ored into this property 
in combination: 


PAGES_FLAGS_PRINTING _ If set, paces has been created to perform a printing 
or previewing operation; if not set, paczs has been 
created to perform a paginating operation. 


PAGES_FLAGS_zERODOWN This flag is only set when a page break occurs. 
If set, any spacing above the first line of the next 
page is suppressed (by setting pages.pr.down to 
zero). At the top of a page, any spacing above a 
line is redundant. 


PAGES_FLAGS_NOTFIRST This flag is set after the first line on the first page 
of the first document has been processed. Once set, 
it remains set for the life of the pacEs object. 


Tf not set: 


e any page break before the first page of the 
first document is suppressed. 


e¢ any spacing above the first line of the first 
page of the first document is suppressed 
(by setting pages.pr.down to zero). At the 
top of a page, any spacing above a line is 
redundant. 


This is used during pagination. It is the cumulative height, in printer units, of 
the lines on the current page which have already been processed. In effect, it 
measures the current height of the current page (from the top of the page). 


This is used during pagination. It is a candidate page break position, 
measured in printer units. In effect, it measures the height of the candidate 
page (from the top of the page to the break point). 


The value in this property represents a potential (but legal) page break 
position. It is important when lines of text which must be kept together are 
being processed. Until all of the lines in such a group have been processed, it 
cannot be known in advance whether a page break can occur after the group 
or whether it must be forced before this group. 


In the latter case, this property will become the actual height of the page. 


pages. 


pages 


pages. 


pages 


pages 


pages. 


pages 


pages. 


pages. 


pages. 


brk_above 


-brk_pos 


-nrec 


-page 


reset_page 


-newdoc 


started 


newpage 


region 


4 THE DOCUMENT PRINTING CLASSES 


This is used during pagination. It has a function which is closely related to 
that of the property pages.brk_height discussed above. 


It is the space above the first line element following the candidate page break 
position. The space above a line element is often referred to as the down 
value; this is used to define a gap between consecutive lines such as occurs 
between the last and first lines of consecutive paragraphs. 


Following on from the discussion of pages.brk_height above; where a group 
of lines must be kept together and are forced onto a new page, the down value 
of the first line will be set to zero, to avoid unnecessary blank space appearing 
at the top of the page, when printed. 


The cumulative page height for the new page is adjusted to take this change 
into account. 


The position within the document corresponding to the previous page break. 


The current vertical print position on the current page, measured in printer 
units. The position is measured relative to the top of the page. 


The current record number in the todo list; i.e. the current entry in the array 
of woR_PRINT records, anchored in the property pages.todo. 


The current page number. 


This property can take the value TRUE or FALSE. It is set to TRUE if the page 
number on the next footer is to be reset (to zero). 


This property can take the value TRUE or FALSE. It is set to TRUE if, on 
completion of processing a document, another document is to be processed. 
Set by the ao_run method but the decision is taken by the pacEs done 
callback method. 


This property can take the value TRUE or FALSE. It is set to TRUE if printing 
has started. 


This property can take the value TRUE or FALSE. It is set to TRUE if the 
pagination process has decided to begin a new page. 


This property contains a flag to record the current context; it is set to one of 
the following mutually exclusive values: 


PAGES_REGION_BODY if set, the main body of a document is currently 
being handled. 
PAGES_REGION_TOP if set, the top header text of a document is 


currently being handled. 


PAGES_REGION_BOTTOM if set, the bottom header text of a document is 
currently being handled. 


PAGES_REGION_LAST_BoTTom if set, the last bottom header text of the final 
document is currently being handled. 


PAGES_REGION_DOC_END if set, the current document is exhausted 
PAGES_REGION_END if set, the final document is exhausted 
PAGES_REGION_VERY_END if set, all documents are exhausted and the 


printing process has been terminated. It 
indicates that the paces object is ready to 
destroy itself. 


FORM REFERENCE 


pages. 


pages 


pages 


pages 


pages 


pages 


pages 


pages. 


pages. 


Page dimensions 


holding 


-pos 


.pr 


-tabs 


- Spacing 


-margins 


. time 


date 


ioclen 


This property can take the value TRUE Or FALSE. 


When set to TRuzg, the print element to be processed (in ao_run) is placed on 
the queue implemented by the vasze array object whose handle is in 
pages.todo. 


The property is set to TRUE if a print element must go onto a new line and, at 
the same time, must be kept on the same page as the following print element. 


The current position within the document being handled. 


The current print element. The information is contained in a data structure of 
type WDR_PRINT. 


Tab settings for the top and bottom headers, passed to the header prniay 
layout object when created. 


Spacing information for the top and bottom headers, passed to the header 
PRNLAY layout object when created. 


Margins for the top and bottom headers, passed to the header prnnay layout 
object when created. 


A character string containing the current time (set by ao_init). 
A character string containing the current date (set by ao_init). 


Length of the command buffer sent to the printer (set by ao_queue). 


The following diagram illustrates the meaning of the various members of a pAGES_PaGE structure in 
relation to the components of a typical document. The outer rectangle represents the page while the inner 
rectangles show the positions of the header text, the main body of the document and the footer text 
respectively. 


’ 


hdbot «§————— body.width } ———— 


height 
body.height : 


\ 


=—_€§£—_- with ——_—__—________®® 


4 THE DOCUMENT PRINTING CLASSES 


PAGES methods 


AO_INIT Initialise and queue 
INT ao_init (PAGES_INIT *in, INT printing, PAGES_PARAMS *par) ; 


Initialise the pacrs active object and begin the print/paginate/preview operation by sending an ao_QUEUE 
message. 


The method is called by an instance of the prinTER class as part of the implementation of that class's 
PR_PRINT, PR_PAGINATE and prR_PREVIEW methods. Three parameters, containing the information needed 
to build this instance of pacEs, are required. 


The parameter printing indicates whether the pacss active object represents a printing, pagination or 
preview operation. It can take one of three possible values: 


PRINTER_PRINTING perform a printing operation 
PRINTER_PAGINATE perform a pagination operation 
PRINTER_PREVIEW perform a preview operation 


The parameters in and par contain initialisation information and point to data structures of type 
PAGES_INIT and paGEs_PARams respectively. The two data structures reflect the different origins of the 
information contained within them. 


In general terms, some of the information contained within the pacrs_params data structure is set up 
internally by the pRinTER object itself as default values, whereas the information contained within the 
PAGES_INIT data structure is ultimately derived from the application. 


In some respects, this division is artificial. However, the design does minimise the effort required of an 
application if the defaults are adequate. A more sophisticated application would need to sub-class PRINTER 
and either replace the pr_init method or add new methods to modify these default values. 


The default values supplied by the prinTER object in the parameter par are as follows: 


pg.width PAGE_WIDTH_A4 
pg-height PAGE_LENGTH_A4 
pg.body.tl.x 1800 

pg.body.tl.y 1800 

pg.body.width PAGE_WIDTH_A4 - 3600 
pg.body.height PAGE_LENGTH_A4 - 3600 
pg.hdtop 720 

pg.hdbot 720 

top.f.height 240 

bot.f.height 240 

bot.align SCRLAY_ALIGN_CENTRE 
pgbeg 1 

pgend OxFFFF 


where PAGE_WIDTH_A4 and paGE_LENGTH_aA4 are both defined in pagesize.h and scRALY_ALIGN_CENTRE can 
be found in the scriay class definition (see The Document Layout Classes chapter). All other members of 
this PAGES_PaRams structure and its sub-structures are uninitialised. 


The complete content of «par is copied into the property pages.par. 


FORM REFERENCE 


The information contained in the parameter in is as follows: 


wdr The handle of the printer resource (wor) object. 
c The callback method numbers and the handles of their "owning" objects. 
fname The address of a buffer containing the file name of the source. This 


member is only set if packs is to perform a printing or previewing 
operation. It is uninitialised for a pagination operation. 


toptxt The address of a buffer containing the top header text. This member is 
only set if pacEs is to perform a printing or previewing operation. It is 
uninitialised for a pagination operation. 


bottxt The address of a buffer containing the bottom header text. This member is 
only set if pacEs is to perform a printing or previewing operation. It is 
uninitialised for a pagination operation. 


The complete content of *in is copied into the property pages. in. 


The callback information referred to above, is itself contained within a data structure of type PAGES_CALLS 
and is set up by the application and passed to the PRINTER object before being handed on, in turn, to this 
instance of pacgs. This data structure, while defined in the paces class definition, is shown below: 


typedef struct 
{ 
VOID *hread; 
WORD mread; 
VOID *hdone; 
WORD mdone; 
} PAGES_CALLS; 


As mentioned in the introductory text, packs must have a mechanism for requesting the next print 
element from the application and for keeping the application informed of the current status of the printing 
operation. This is achieved by means of callback methods. 


The creator of the pacrs object must supply the method numbers of two call-back methods together with 
the handles of their corresponding objects. The call-back methods are referred to as the read and the done 
call-back methods, expressions which will be used in this chapter. 


The read call-back method provides the means by which the paczs object can get the next print element 
from the application. The method number is supplied in pages. in.c.mread and the handle of the 
corresponding object is supplied in pages.in.c.hread. 


The done call-back method provides the mechanism by which the application can be told about the status 
of the printing operation; for example, the completion of a page or the completion of a document. This 
allows the application to take appropriate action. The method number is supplied in pages. in.c.mdone 
and the handle of the corresponding object is supplied in pages. in.c.hdone. 


Although the FORM class prniay supplies a read call-back method, in general, the design of the classes 
which supply these two methods is very much application dependent. However, the methods themselves 
must conform to the general specification described in the pacELay notional mixin class in this chapter. In 
practice, pRNLay is subclassed. 


The horizontal and vertical page dimensions held in the pages.par property are converted from twips to 
horizontal and vertical printer units respectively by calling the wdr_twips_to_xy method of the printer 
resource (WDR) object. 


If the paczs active object is intended to perform pagination, the method creates and prepares a vAFLAT 
object in which to build an array of uworp elements to contain the number of characters in each page. The 
handle of the variat object is set into the pages. pagarr property. 


If the pacEs active object is intended to perform either a printing or a preview operation, the method 
fetches the current time and date, using an instance of the OLIB class Trg, and stores their character 
representations in the properties pages.t ime and pages.date respectively. An instance of vaszc is created 
and initialised so that each record in the array will be large enough to contain a print element (i.e. a 
WDR_PRINT Structure); the handle of this object is set into the pages.todo property. Also, the 
PAGES_FLAGS_PRINTING flag is set in the property pages. flags. 


4 THE DOCUMENT PRINTING CLASSES 


For a preview operation, a preview printer driver object (an instance of pRvppR) is created and initialised 
directly by sending it a ppR_1INIT message. It is important to note that the prvppr class is a subclass of ppR 
but does not reside in a separate dyl. The information in the ppR_in1t data structure required by the 
pdr_init method, is extracted from both paczs itself and the associated printer resource (wor) object. 
Note that the member dy1 is set to zero. For more information on previewing, see The Print Preview Class 
chapter in this manual. 


For a printing operation, a WOR_OPEN_PRINT message is sent to the associated printer resource (woR) object 
which, as part of its behaviour, creates a printer driver (ppR) object. In either case, the handle of the 
created printer driver object is set into the pages.pdr property. 


For a printing or a preview operation, a document object (an instance of EPprpoc) and a corresponding 
printer layout object (an instance of prNLay) are created for the top header and their handles stored in the 
properties pages.ephead and pages.prhead respectively. 


The priority of the pacgs active object is set to PRORITY_ACTIVE_comPUTE and the application manager is 
sent an AM_ADD_TASK message to add the active object to the application manager's active object task 
queue. 


The print/paginate/preview operation is started by sending an ao_quzEUE message and the method 
terminates by returning zero. 


On the Series 3, there is a slight difference to the behaviour of, and the interface to, this method. See the 
Series 3a/Series 3 notes section at the end of this chapter for detail. 


AO_RUN Fetch next print element 


INT ao_run(VOID); 


The method is called by the application manager when an I/O operation to the printer has completed or 
the paczs active object has been re-scheduled by a call to its superclass ac_queue method. 


In general terms, this method fetches the next print element to be processed as represented by a data 
structure of type woR_PRINT and further: 


e if printing or previewing, the ao_queue method is called to translate the information in this print 
element into a set of printer specific commands and to start the sequence of I/O operation(s) to 
the printer using the Plib function p_ioc. 


e if paginating, the information in the print element is used in the construction of the page array 
object anchored in pages. pagarr. This is followed by a call to the superclass ao_queue method to 
schedule the next call to this (i.e. the ao_run) method. 


When printing or previewing, there are circumstances where a print element cannot be processed 
immediately but must be placed in a queue, known as a fodo list - an instance of the vasze class. This is 
done to handle what are commonly known as widows and orphans. In a situation where a group of lines 
must be kept together, the position of page breaks cannot be determined until all such lines have been 
fetched in. 


Print elements are commonly fetched for processing by calling the read call-back method. However, in 
handling widows and orphans as mentioned above, a print element may, instead, be fetched from an 
existing todo list; alternatively, a print element may not be processed immediately but will be placed on 
the todo list - depending on the general context. 


When a page break occurs, the method will call the done call-back method with a completion status of 
PAGES_DONE_PAGE; Similarly, when the processing of a document is complete, the done call-back method 
will be called with a completion status of pacEs_DONE_Doc. 


If the pPAGES_REGION_VERY_END flag is set in the property pages. region, all documents will have been 
processed and the printing process itself will have been terminated. The done call-back method is called 
with a completion status of pacEs_DoNE_END. The paczs object destroys itself by sending itself a pzsTRoy 
message. 


FORM REFERENCE 


AO_ABRUN Handle error 


VOID ao_abrun (VOID); 


This method supports appman's architecture for handling p_1leave within the ao_run method. p_leave may 
be called if a write operation has not succeeded. 


The done call-back method is called with a completion status of PAcES_DONE_ERROR to notify the 
application that an error has occurred. This allows the application to take appropriate action. 


The method then destroys this instance of pacrs by sending a pDEsTRoy message. 


AO_ QUEUE Translate the print element and print data 


VOID ao_queue (VOID); 


If paces is performing a paginating operation, the method simply calls the superclass ao_queue method to 
re-schedule a call to ao_run. 


If pacgs is performing a printing or previewing operation, the method sends a ppR_PRINT message to the 
associated ppR object. 


For a printing operation, the pdr_print method translates the current print element into a sequence of 
printer commands. The printer commands are then sent to the printer device by doing a p_Fwritz I/O 
operation to the printer port. If the ppr object produces no printer commands, nothing is sent to the 
printer; instead, the method simply calls the superclass ao_queue method to re-schedule a call to ao_run. 


For a previewing operation, the pdr_print method translates the current print element into a sequence of 
drawing actions to a bitmap. As this does not require any I/O activity, this method (i.e. ao_queue) simply 
follows on by calling the superclass ao_queue method to re-schedule a call to ao_run. 


Before the ppR_PRINT message is sent, either for printing or previewing, some preliminary processing is 
done: 


e if the final document to be printed or previewed is exhausted, the woR_PRINT_END flag is ored 
into the flags field of the print element and the worR_pRiNT_pPacE flag is cleared. This will cause 
the printing/previewing process to terminate. 


e if the current page is not within the range of pages to be printed or previewed (as defined by 
pages.par.pgbeg and pages.par.pgend), the print element is ignored, the ppR_PRINT message is 
not sent and the method simply calls its superclass's ac_queue method to re-schedule a call to 


ao_run. 


e if printing or previewing has not yet started, the woR_PRINT_sTAaRT flag is ored into the flags 
field of the print element. This will cause the printer to be initialised and set up correctly or the 
preview bitmap to be cleared. 


e if page break is to be forced, the current vertical print position is adjusted appropriately. 


e if a line break is to be forced, the line element indent is adjusted appropriately. 


4 THE DOCUMENT PRINTING CLASSES 


WDR 


file 
head 
model 
wid 


wdrname 


destroy 

wdr_init 
wdr_count_models 
wdr_sense_model_name 
wdr_set_model 
wdr_sense_model 
wdr_typeface 
wdr_search_typeface 
wdr_font_height 
wdr_search_height 
wdr_get_width_table 
wdr_sense_width 
wdr_twips_to_xy 


wdr_open_print 


wdr_load_record 


The wor printer resource class, encapsulates the handling of a WDR resource file. 


A WDR resource file contains printer specific information organised as a series of resources. For example, 
for each printer model supported, a resource file exists containing the various command sequences to 
control that printer. 


A wor object also provides methods to supply specific information from a WDR resource file. 


The WDR Printing chapter in the Additional System Information manual gives a full and comprehensive 
description of the structure of WDR resource files. Further useful information on printing can be found in 
the Printing chapter of the Object Oriented Programming Guide. 


A typical WDR file has resources containing the following information: 
e alist of printer models supported 
e the character command sequences to control printer operation 


¢ amap used to translate the printer's character set onto that used by the SIBO computer (based on 
the IBM code page 850) 


e alist of typefaces supported by each model. 
e alist of fonts available in each typeface. 


e a width table for each font, where the widths in the WDR file are stored in difference form 
(see Widths of characters in fonts in the WDR Printing chapter of the Additional System 
Information manual). 


An instance of wor is normally created by a PRINTER object in its pr_open_wdr method. The wor class 
itself supports: 


e The accessing of the contents of a WDR resource file. 


The wor class may be used to read the contents of the WDR file. It does this by using an RScFILE 
class component. The wor class stores the current model and the list of available typefaces in 
memory. Other information is read from the file as and when required to minimise memory 
requirements. 


FORM REFERENCE 


The conversion of measurements from units of twips to horizontal and vertical printer units. 


The WDR resource file includes the minimum horizontal and vertical travel for each printer 
model. These distances are specified in units of twips. The wdr_twips_to_xy method is provided 
to convert horizontal and vertical distances from twips to printer units. 


The creation and initialisation of a suitable printer driver object - usually an instance of either the 
Por Class or a suitable subclass of ppr. 


A suitable printer driver object may be created and initialised using the wdr_open_print method; 
the method returns the handle of the object which is usually an instance of the ppr class or a 
suitable subclass. See the description of the wdr_open_print method for further details. 


An instance of wor can be created which is limited to reading the list of models supported. In this case the 
class does not store the details of the current model thus minimising memory requirements. In this mode 

only the wdr_count_models, wdr_sense_model_name, wdr_sense_width, wdr_set_model and wdr_destroy 
methods are available. 


A loaded font width table contains a sequence of unsigned bytes containing information about the width of 
each character in a font. Two kinds of width table are available: 


a monospace font width table - contains two bytes, the first of which contains zero, and the 
second of which specifies the width of a character. (By definition each character in a monospace 
font has the same width.) The zero in the first byte signifies a monospace font width table. 


a proportional font width table - contains 256 bytes, the first of which contains one; the 
remaining 255 bytes specify the width of the characters whose code ranges from 0x00 to OxFF. 
Thus the fiftieth byte specifies the width of the character whose code is 0x31. 


Note that, on being loaded from the WDR file, width tables are converted from differences to 
absolute character widths. 


Class definition 


The wor class subclasses root and is defined in the sub-category file prdrv.cl (with generated header file 


prdrv.g). 


CLASS wdr root 


{ 


REPLACE destroy 


pPPppprprpprrprrep pp 


D 


D 


D 
D 
D 
D 
D 
D 
D 
D 
D 
D 
D 
D 
D 


wdr_init 
wdr_count_models 
wdr_sense_model_name 
wdr_set_model 
wdr_sense_model 
wdr_typeface 
wdr_search_typeface 
wdr_font_height 
wdr_search_height 
wdr_get_width_table 
wdr_sense_width 
wdr_twips_to_xy 
wdr_open_print 
wdr_load_record 


Init and optionally load model data 

Return the number of models 

Return model name by model number 

Set the current model number 

Sense struct of current model 

Get typeface struct by typeface index 

Get typeface struct and index given typeface 
Font height by typeface index, height index 
Get height index given height 

Width table given typeface, 
Get printed width of buf, 
Convert from twips to printer units 


height and style 
len 


Create a PDR for printer output 
Load specified resource record 


4 THE DOCUMENT PRINTING CLASSES 


CONSTANTS 
{ 
WDR_PRINT_PAGE 0x01 
WDR_PRINT_LINE 0x02 
WDR_PRINT_RIGHT 0x04 
WDR_PRINT_FONT 0x08 
WDR_PRINT_TEXT Ox10 
WDR_PRINT_START 0x20 
WDR_PRINT_END 0x40 
WDR_PRINT_IDLE 0x4000 ! Used by pages 
WDR_PRINT_KEEP 0x8000 ! Used by pages 
WDR_PDR_LANDSCAPE 0x01 
WDR_RSC_HEADER 1 Header resource ID 
WDR_RSC_COMMANDS 2 Commands resource ID 
WDR_DYL_LOAD 0x01 -WDR requires a DYL if set 
WDR_HP_PCL 0x02 printer driver is HP PCL compatible 
WDR_STYLE_NORMAL 0x0000 
WDR_STYLE_UNDERLINE 0x0001 
WDR_STYLE_BOLD 0x0002 
WDR_STYLE_ITALIC 0x0004 
WDR_STYLE_SUPER 0x0008 
WDR_STYLE_SUB 0x0010 
WDR_STYLE_MONOSPACE 0x8000 Reserved for external use 
WDR_STYLE_SANS_SERIF 0x4000 Reserved for external use 
WDR_TYPF_PROPORTIONAL 0x01 
WDR_TYPF_SCALED 0x02 
WDR_TYPF_SERIF 0x04 
WDR_MODEL_LANDSCAPE_AVAILABLE 1 
WDR_MODEL_MINX_IS_DOTS_PER_INCH 4 
WDR_SCALE_DEFAULT_HEIGHT 1000 reference height = 1000 twips = 50 point 
WDR_FONT_NAME_LEN 20 significant characters from font name 
PRINTER_NAME_LEN 24 maximum length of printer name 
PRINT_TYPE_LEN 9 printer type length (filename+'\0') 
PDR_FILE_LEN 9 printer driver filename length 
} 

TYPES 


{ 


typedef struct 


UWOR 


5 i a, oe Se, Me 


D 


height; 
height_max; 
height_delta; 
width_scale; 
width_normal; 
width_italic; 
width_bold; 
width_bold_italic; 
command; 


} WDR_FONT; 


typedef struct 


{ 


Height (or min height for scalable fonts) 

Max height (only relevant for scalable fonts) 
Delta height (only relevant for scalable fonts) 
Multiplier for font width table 

Width for mono, rid for proportional 


Set font command number 


TEXT name [WDR_FONT_NAME_LEN] ; Typeface name 
UWORD typeface; 
UWORD type; 


WORD trans_rid; 
UWORD num_heights; 
WDR_FONT font[1]; 
} WDR_TYPEFACE; 


RTF/Word compatible typeface 
WDR_TYPF_PROPORTIONAL 
WDR_TYPF_SCALED 

rid of translates record 

Number of different typeface heights 
List of different heights 


FORM REFERENCE 


typedef struct 
{ 


UWORD minx; minimum delta x 
(in twips, unless MINX_IS_DPI flag set) 

UWORD miny; minimum delta y in twips 

UWORD skipx; amount printer auto indents 

UWORD skipy; amount printer auto feeds 

UWORD flags; WDR_MODEL_LANDSCAPE_AVAILABLE 
WDR_MODEL_MINX_IS_DOTS_PER_INCH 

UWORD num_typefaces; number of typefaces supported by model 

WDR_TYPEFACE *typeface[1]; list of typeface rids/pointers to typeface data 

WDR_MODEL; 


typedef struct 


UWORD rid; rid of model block 
TEXT name [PRINTER_NAME_ LEN]; model name 
WDR_MODEL_INDEX; 


typedef struct 


TEXT id[6]; file identifier 

UWORD flags; flags (WDR_DYL_LOAD) 

UWORD num_model; number of models described in file 
WDR_MODEL_INDEX model[1]; list of model names/rid's 


} WDR_HEADER; 


typedef struct width_table 


{ 
struct width_table *next; 


UWORD rid; Resource ID width table (used as a key) 
UWORD height; Needed if font is scaled 
UBYTE *table; Address of width table 
} WDR_WIDTH_TABLE; 
typedef struct 
{ 
WORD flags; WDR_PRINT_XXX 
WORD typf; Typeface number for WDR_PRINT_FONT 
WORD fheight; Font height for WDR_PRINT_FONT 
WORD style; Font style for WDR_PRINT_FONT 
WORD down; Line down for WDR_PRINT_LINE 
WORD indent; Line indent for WDR_PRINT_LINE 
WORD height; Line height for WDR_PRINT_LINE 
WORD right; Right movement for WDR_PRINT_RIGHT 
TEXT *buf; Text to print for WDR_PRINT_TEXT 
UWORD blen; Length of data at buf for WDR_PRINT_TEXT 
} WDR_PRINT; 


PROPERTY 1 
{ 
PR_RSCFILE *file; Resource file containing driver data 
WDR_HEADER *head; Header and model index 
WDR_MODEL *model; The current model 
WDR_WIDTH_TABLE *wid; List of font widths 
TEXT wdrname[P_FNAMESIZE]; -WDR File name 
} 
} 
Property 
wdr.file The handle of an instance of the rscriue class which is used to read resources from the 
WDR resource file. 
wdr.head The address of the WDR header resource, a data structure of type woR_HEADER. The 


header resource is fetched from the resource file by the wdr_init method; it achieves 
this by sending an rs_READ message to the RscFILE component object. 


4 THE DOCUMENT PRINTING CLASSES 


wdr.model Information about the current printer model. Amongst other things, it includes the 
number of typefaces available for the current printer model and the resource ID for 
each typeface. 


wdr.wid This is a linked list of woR_wIpDTH_TABLE data structures each of which contains: 
e the resource ID of the font width table. 
e the height of the font (in the case of a scalable font). 
¢ apointer to the loaded font width table itself. 


wdr .wdrname The full file specification of the WDR resource file. 


It is useful to note that the wor_pRinT structure defines the fields of a print element as used by the paces 
and ppr classes and its use is discussed in these classes. The structure is not used by the wor class. 


WDR methods 
DESTROY Destroy 


VOID destroy (VOID); 
Destroy the wor instance. 


The method frees the linked list of woR_w1pTH_TABLE data structures anchored in the property war.wia and 
frees the memory occupied by the font width tables. 


The memory used to contain the header resource whose address is held in the property wdr. head, is freed; 
wdr.head 1S reset to NULL. 


All memory cells containing printer model information as anchored in the property wdr.model, are freed; 
wdr.model itself is reset to NULL. 


The method concludes by supersending a pEstRoy message. 


WDR_INIT Initialise WDR 


VOID wdr_init (TEXT *filename, INT model); 
Initialise the wor instance. 
This method takes two parameters: 
@ filename points to a buffer containing the filename of the WDR resource file. 


© model contains the printer model. See the WDR Printing chapter in the Additional System 
Information manual for more information on the concept of model numbers. 


The method builds a full file specification using the name pointed to by filename; the default path is used 
to supply any missing components. The resulting name is written to the property wdr.wdrname. 


The method creates an instance of the rscrILE class and writes the handle to the property war. file. 
The resulting rscr1Le object is initialised by sending it an Rs_inrT message and passing the full file 
specification of the WDR resource file as an argument. 


The header resource is loaded by sending the rscr1iLe object an Rs_READ message and passing it the 
resource ID of the header. The address of the loaded resource is written to the property wdr.head. The 
header resource contains a list of models supported. A check is made to ensure that the header is valid. 
It contains a five character identification field which should always be "WDROS5". If this is not so, the 
method calls p_1eave with an argument of &_FILE_INVALID. 


The resource for the specific printer model specified by the parameter mode is loaded by sending a 
WDR_SET_MODEL message specifying an argument of mode1. The address of the loaded model resource is 
written to the property wdr.model. 


If the wor instance is only to be used to sense the models supported then mode1 should have the value -1; 
this avoids needless memory allocation by the wdr_set_mode1 method. 


FORM REFERENCE 


WDR_COUNT_MODELS Return the number of models 


INT wdr_count_models (VOID) ; 
Return the number of printer models supported. 


The method simply returns the value of war. head->num_model. 


WDR_SENSE MODEL_NAME Get model name from model no. 


TEXT *wdr_sense_model_name (INT model); 


Returns the address of the area containing the name of the printer model corresponding to a specified 
model number. 


This method takes a single parameter; mode1 contains the number of the printer model whose name is required. 


The method uses the value of mode1 as an index to address the appropriate woR_MODEL_INDEx data 
structure within the header resource; it then simply returns the address of the string containing the model 
name (i.e. &self->wdr.head->model [model] .name[0]). 


Note that the name will contain no more than pRINTER_NAME_LEN characters (defined in prdrv.g). 


WDR_SET MODEL Set the current model 


VOID wdr_set_model (INT model); 


Free allocated memory, load the resource for the printer model specified by the parameter mode1 and load 
the resource for each typeface supported by the specified printer model. 


The method frees the linked list of woR_wIDTH_TABLE data structures anchored in the property war.wia and 
frees the memory occupied by the font width tables. All memory cells containing printer model 
information as anchored in the property wdr.model, are freed; war.mode1 itself is reset to NULL. 


If the parameter mode1 contains the value -1, no model resource information is to be read in and the 
method simply returns. 


If the value of the parameter mode1 1s greater than the number of models supported, the method resets 
model to Zero. 


The method reads the resource for the specified printer model from the WDR resource file by sending a 
RS_READ message to the component rscFILE object, and writes the address of the loaded resource to 


wdr.model 


For each typeface, it loads the corresponding resource and writes the address of the loaded resource to the 
corresponding element of the war .model->typeface array. 


WDR_SENSE MODEL Sense current model data 


WDR_MODEL *wdr_sense_model (VOID) ; 
Sense the data for the current printer model. 


The method simply returns the content of wdr.model, i.e. the address of the wor_mopet data structure 
containing the current printer model information. 


WDR_TYPEFACE Get typeface by index 


WDR_TYPEFACE *wdr_typeface (INT typfix); 
Return the address of a woR_TYPEFACE data structure. 


The method takes a single parameter; t ypfix contains the index of an entry within the array of pointers to 
WDR_TYPEFACE data structures for the current printer model. Each worR_typerace data structure contains 
typface information for the current printer model. 


The method simply uses the index to return the address of the corresponding typeface entry. Formally, it 
returns: 


self—>wdr.model->typeface [typfix] 


4 THE DOCUMENT PRINTING CLASSES 


WDR_SEARCH_TYPEFACE Get typeface by typeface number 


INT wdr_search_typeface (INT typf, WORD *ptypfix,WDR_TYPEFACE **ppdata) ; 


Search for the typeface, in the printer model information, whose typeface number matches the supplied 
value. 


This method takes three parameters: 


e typf contains the typeface number corresponding to the typeface being sought. A typeface 
number uniquely identifies a typeface (Courier, for example) and is compatible with DOS/WORD 
font numbers. Each typeface resource contains a typeface number as part of its identity; see the 
WDR_TYPEFACE Structure. 


@ ptypfix is the address of an area into which this method will write the index of the entry within 
the array of pointers to woR_TYPEFACE data structures containing the typeface with number typrf. 


This parameter can be nux in which case no attempt is made to write the index. 


@ ppdata is the address of an area into which this method will write the address of the 
WDR_TYPEFACE data structure containing the typeface with number typrf. 


This parameter can be nuu in which case no attempt is made to write the address. 


If the specified typeface is not present, the method will attempt to search for a substitute typeface. The 
following table shows how the substitution is done. The left-hand column shows the specified typeface 
(implied by the typeface number) while the right-hand column shows the corresponding base font that is 
substituted. 


Proportional Serif -> Times 

Proportional Sans Serif -> Helvetica 

Mono = Courier (default mono) 
Times, Helvetica —> Courier (default mono) 


Note that if the specified typeface is Times or Helvetica, implying that either (or both) of these base fonts 
is not present, no matching substitute is available and the default monospaced font is used.. For further 
details, see the Printer driver font mapping section od the Word Processor File Format chapter of the 
Additional System Information manual. 


The method returns 
e tRuE if the specified typeface was located or a suitable substitution was made. 


e ra.se if neither the specified typface nor the substitution was found - in this case, the typeface 
index is set to zero which corresponds to the default typeface. 


WDR_FONT_HEIGHT Get font height by typeface & font indexes 


INT wdr_font_height (INT typfix,INT fhix); 


Return the height in twips of the font with a given font (i.e. height) index in a typeface with a given 
typeface index. 


This method takes two parameters: 
@ typfix contains the index of an entry within the array of pointers to woR_TYPEFACE Structures. 


@  £hix contains the index of an entry within the array of woR_ront structures in the typeface 
determined by typfix above. 


For a non-scalable font, the method simply returns the height of the font. Formally this is the value: 


self—>wdr.model.typeface[typfix]->font [fhix] .height 


4-31 


FORM REFERENCE 


For a scalable font, the height is explicitly calculated. fhix is used as a scaling factor. The value returned 
is the result of: 


self—>wdr.model.typeface [typfix]->font[0].-height 
plus 


self—>wdr.model.typeface[typfix]-—>font [0] .height_delta*fhix 


WDR_SEARCH_HEIGHT Get font index given height 


INT wdr_search_height (INT typfix,UWORD *pheight); 
Return the font (i.e. height) index of the font with a specified height (in twips) in a given typeface. 
This method takes two parameters: 
@ typfix contains the index of an entry within the array of pointers to woR_TYPEFACE Structures. 
@ pheight is the address of an area which contains the height of the font (in twips). 


The value returned is the index of an entry within the array of woR_ronT structures in the typeface 
determined by typfix above. 


If a font with the exact desired height is not located, the method returns the index of the tallest of all those 
fonts whose heights are lower than the value in *pheight. In this case, *pheight is overwritten with the 
new height. 


WDR_GET_WIDTH_TABLE Get a requested font width table 


UBYTE *wdr_get_width_table(INT typf,INT height,INT style); 


Return the address of the font width table for the font with a given height in a given typeface in a given 
style. 


The method takes three parameters: 
¢ typf contains the typeface number of the typeface being sought. 
® height specifies the height of the font in twips 


e style specifies the style. The only combination of styles which are used by this method are: 


WDR_STYLE_NORMAL 

WDR_STYLE_ITALIC 

WDR_STYLE_BOLD 

WDR_STYLE_ITALIC | WDR_STYLE_BOLD 


All other styles are ignored. If style contains neither wOR_STYLE_ITALIC nor WDR_STYLE_BOLD in 
any combination, then woR_STYLE_NORMAL is assumed by default. 


The method starts by sending a woR_SEARCH_TYPEFACE message to find the index and the address of the 
WDR_TYPEFACE data structure of the typeface with number typf. 


For monospace fonts, the method simply returns a pointer to the font width table. 


For proportional fonts, the font width table to be selected depends on the style combinations in the 
parameter style. If the selected table has previously been loaded, the method simply returns the required 
address; otherwise, a new (uninitialised) woR_wIDTH_TABLE Structure is allocated and inserted into the 
existing queue so that war .wid points to the new entry and the new entry points to the existing entries. 
The required font width table resource is loaded into the new entry by sending an rs_READ message to the 
RSCFILE component object. 


The remaining fields of a new woR_WIDTH_TABLE entry are filled in as follows:- 
e rid is set to the associated resource ID 
¢ height is set to the font height 


e the first byte of the table itself is set to 1 to distinguish it from a monospace table 


4-32 


4 THE DOCUMENT PRINTING CLASSES 


Notes:- 
If the requested typeface is unavailable, a substitute typeface will be used. 


If a font of the desired height is unavailable, the tallest possible font which is less than the desired font 
will be substituted. 


The method supports scalable proportional fonts but does not support scalable monospace fonts. 


WDR_SENSE WIDTH Get printed width of text 


INT wdr_sense_width(UBYTE *pwid, TEXT *buf,INT len); 

Return the printed width of text, in printer units. 

The method takes three parameters: 
e pwid contains the address of the font width table to be used. 
¢ uf contains the address of a buffer holding the text whose width is to be found. 
¢ en contains the length of the text. 


The method simply adds up the width of each character in the buffer pointed to by buf, using the width 
values defined in the font width table. 


WDR_TWIPS TO XY Convert twips to printer units 


VOID wdr_twips_to_xy(WORD **ppx,WORD **ppy) ; 
Convert twips to printer units. 
The method takes two parameters; 


© px points to a list of addresses, each of which points to a word containing a twips value to be 
converted into horizontal printer units. The list of addresses is terminated by a nuLL. 


¢ ppy points to a list of addresses, each of which points to a word containing a twips value to be 
converted into vertical printer units. The list of addresses is terminated by a nuLL. 


Resulting values are rounded up to the nearest integer which avoids small measurements coming out as 
zero. To get zero, the caller must explicitly enter zero. 


WDR_OPEN_PRINT Create a PDR for printer output 


VOID *wdr_open_print (INT flags,INT page_length,VOID **ppcb) ; 


Create and initialise an instance of the ppr (printer driver) class or a suitable subclass of ppr, returning 
the handle of the instance. 


The method takes three parameters; 


¢ flags specifies the orientation of a page. If woR_ppR_LANDScapPE is set, then landscape orientation 
is required, otherwise portrait orientation is implied. 


@ page_length specifies the height of a page in printer units. 


¢  ppcb is the address of an area into which the handle of a channel to the opened printer port will 
be inserted. 


If the flag woR_DyL_Loap is set in wdr.head->flags, then it is assumed that an instance of a subclass of 
Ppp is to be created and that this subclass is to be found in a separate DYL. A DYL with the same 
filename as the WDR resource file but with an extension of .dy/ is assumed to exist and an attempt is made 
to load and link to it. If this DYL does not exist or cannot be found, the method will terminate with a 
p_leave. An instance of the first class in the DYL is created. 


If the flag woR_DyL_Loap is not set in wdr.head->flags, then an instance of the basic ppr class as defined 
in FORM is created. 


The created object is initialised and printing is started by sending it a ppR_InrT message. See the ppr class 
for a description of the par_init method and the information passed to it. 


FORM REFERENCE 


WDR_LOAD_RECORD Load resource record 


VOID wdr_load_record(INT rid,VOID **pcell); 
Load a resource from the WDR resource file. 
The method takes two parameters; 
¢ rid specifies the resource ID of the resource to be loaded. 


e pceili is the address of an area into which the address of a memory cell containing the loaded 
resource is placed; i.e. the address of the loaded resource is written to *pcell. 


The resource is loaded by sending an rs_READ message to the RScFILE component of wor. 


PDR 


par 
mode 
typfix 
fhix 
style 
lheight 

a 
trans_rid 
outlen 
skipy 


destroy 


pdr_init 


pdr_print 
pdr_add_command 
pdr_destroy 
pdr_start 
pdr_end 
pdr_page 
pdr_text 
pdr_line 
pdr_right 
pdr_font 
pdr_style 


Por is the printer driver class and is that part of document printing that encapsulates the conversion of 
print elements (as defined by the content of a woR_pRinT data structure) into a sequence of printer 
commands. 


The printer commands generated are specific to a particular printer; information about the printer model 
is passed to the ppr object at initialisation time. 


An instance of ppr is normally created by an instance of the printer resource (wor) class but is made a 
component of a pacEs object; in general, there is a degree of dependence on the wor object which is asked 
to provide further information from time to time. ppr can, under some circumstances, be created directly 
by other suitable classes (e.g. PAGES). 


Once created, active objects such as pacers use a PpR object to build a sequence of printer specific 
commands on its behalf ; the pacEs active object then schedules the transmission of the commands to the 
printer. 


Note that if the ppr class is subclassed, the normal usage is to load the subclass from a DYL: see the 
description of the pdr_init method for more detail. 


4-34 


4 THE DOCUMENT PRINTING CLASSES 


A description of the contents of WDR resource files can be found in the WDR Printing and Resource Files 
chapters of the Additional System Information manual. Further useful information on printing can be 
found in the Printing chapter of the Object Oriented Programming Guide. 


Class definition 


The ppr class subclasses root and is defined in the sub-category file prdrv.cl (with generated header file 


prdrv.g). 


CLASS pdr root 


{ 


REPLACE destroy 


D 


pPpppprppprpppr ep ep 


pdr_init Ca 


pdr_print 
pdr_add_command 


pdr_destroy=p_dummy Fo 
pdr_start st 
pdr_end Fi 
pdr_page st 
pdr_text Pr 


pdr_line st 


pdr_right Po 


pdr_font Se 
pdr_style Se 


CONSTANTS 


{ 


Se i> LAS LAS AY © IL © A © ©» © a kw © Dw 6 a av © a 


DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 
DR_CM 


D_RESET 0 
D_FORM_LENGTH 1 
D_PREAMBLE 2 
D_POSTAMBLE 3 
D_UNDERLINE_ON 4 
D_UNDERLINE_OFF 5 
D_BOLD_ON 6 
D_BOLD_OFF 7 
D_ITALIC_ON 8 
D_ITALIC_OFF 9 
D_SUPERSCRIPT_ON 10 
D_SUPERSCRIPT_OFF 11 
D_SUBSCRIPT_ON 12 
D_SUBSCRIPT_OFF 13 
D_NEW_PAGE 14 
D_CARRIAGE_RETURN 15 
D_MOVE_DOWN 16 
D_MOVE_RIGHT_PREFIX 


DR_CM 
DR_CM 


D_MOVE_RIGHT 18 
D_MOVE_RIGHT_SUFFIX 


DR_CM 


D_LANDSCAPE 20 


typedef struct 


{ 


PR_WDR *wdr; 

WORD flags; 

WORD page_length; 
HANDLE dyl; 
WDR_HEADER *head; 
WDR_MODEL *model; 
} PDR_INIT; 
typedef struct 


{ 


UBYTE *commands; 
UBYTE *outbuf; 
UBYTE *trans_res; 
TEXT **tix; 

} PDR_ALLOC; 


lled from WDR 


Called externally by the print active object 
Add command to printer buffer 


r a DYL subclass destroy 
art printing 

nish printing 

art a new page 

int text at current pos 
art a new line 

sition to the right 

t the font 

t the font style 


17 


19 


Ref back to creating wdr 
WDR_PDR_LANDSCAPE 

Page length for setting form size 
Handle of loaded DYL 

Header 

Model 


Command strings 

Print output buffer 

Character set translates resource 
Translates lookup table 


4-35 


FORM REFERENCE 


PROPERTY 


} 


Property 


pdr. 


pdr. 


pdr. 


pdr. 


pdr. 


pdr. 


pdr. 


par 


mode 


typfix 


fhix 


style 


lheight 


a 


{ 


PDR_INIT par; 


UWORD mode; Mode (landscape) 

WORD typfix; Current typeface index 

WORD fhix; Current font height index 

WORD style; Current font style 

WORD lheight; Height of current line 

PDR_ALLOC a; Various allocated cells 

UWORD trans_rid; Resource ID of loaded translates 
WORD outlen; Length of data in output buffer 
UWORD skipy; 


Initialisation data set by the pdr_init method and defined as a data structure of type 
PDR_INIT. This includes items such as pointers to the associated WDR object and the 
current printer model information. 


This property is used to indicate whether printing is to be done in landscape or 
porttrait mode. If the woR_ppR_LANDscapE flag is set, printing is to be done in 
landscape mode; if the property contains nuut then printing is to be done in portrait 
mode. 


The index of an entry within the array of pointers to woR_TYPEFACE structures. The 
WDR_TYPEFACE Structure identified contains information on the current typeface . The 
array is part of the woR_mopEt data structure representing the current printer model. 


The index into the array of woR_FonT structures which corresponds to the current font 
height. The array is part of the woR_TyPEFace data structure representing the current 
typeface. 


The current font style. This can be a combination of a number of individual styles 
represented by an ored combination of the following flags: 


WDR_STYLE_NORMAL 
WDR_STYLE_UNDERLINE 
WDR_STYLE_BOLD 
WDR_STYLE_ITALIC 
WDR_STYLE_SUPER 


See the description of the pdr_style method for more detail. 
The height of the current line in printer units. 


This property is set whenever a print element is handled which has woR_PRINT_LINE 
set in its flags member and is copied from the print element's height member. In 
other words, it is set when a new line is forced. 


This is a data structure of type ppR_ALLoc which contains a number of pointers to 
allocated memory cells. They are grouped together in this structure for convenience. 


The individual members of this structure are important and are discussed below: 


commands This is a pointer to a table of commands supported by the current printer 
model(s). The table starts with a byte count giving the number of 
commands followed by the commands themselves. 


Each command starts with a byte count giving the total length of the 
command. The remaining bytes contain a format string consisting of the 
printer command itself and formatting characters as used by the Plib 
function p_atob. See the Plib Reference manual and the WDR Printing 
chapter of the Additional System Information manual for more detail. 


The table itself is loaded from the WDR resource file during execution 
of the pdr_init method. 


4 THE DOCUMENT PRINTING CLASSES 


outbuf The address of the output buffer in which the sequences of printer 
commands are built. 


trans_res A pointer to a translate table as loaded in from the resource file. 
Translate tables are described in the WDR Printing chapter of the 
Additional System Information manual for more detail. 


tix A pointer to a lookup table for the translate table referenced by 
trans_res. The lookup table is a table of addresses. 


The ASCII value of any character gives the offset into the lookup table 
for that character's entry which, in turn, gives the address of the 
translate table entry for that character. 


In other words : * (pdr.a.tix+ (ASCII value of a char')) points to 
the translate table entry for that character. 


pdr.trans_rid The resource ID of the current translate table. 


pdr.outlen The length of data currently held in the output (i.e. the commands) buffer which is in 
allocated memory pointed by pdr.a.outbuf. 


pdr.skipy This property is set to the printer vertical auto-feed value whenever a page break 
occurs (pdr_page) and the printer is started (pdr_start). It is reset to zero after every 
new line (pdr_line). 


The printer vertical auto-feed value itself is copied from the printer model information 
supplied when this instance of ppr is created (see the ppR_rnitT and the woR_MoDEL 
data structures.) 


This property is used to calculate the amount by which the print head must actually 
move down when a new line is requested and is of particular importance when a page 
break occurs. 


PDR methods 
DESTROY Destroy 


VOID destroy (VOID) ; 
Destroy the ppr instance. 


The destroy method begins by sending ppR_DEsTRoy message. The pdr_dest roy method, as supplied in 
PpR, is a dummy method which can be replaced by a subclass. The intention is that any subclass specific 
destroy tasks are done, and indeed must only be done, within the pdr_destroy method. 


(Do not be confused between the destroy method and the pdr_dest roy method.) 
All memory whose pointers are held in the ppR_anioc data structure in property pdr.a are freed. 


If an external DYL was loaded (indicated by a positive value in pdr.par.dy1), as is often the case when 
ppR 1s subclassed, the DYL whose handle is contained in pdr. par.dy1, is unloaded. 


The method finally supersends a pestroy message. 


This method must not be replaced by subclassers - an attempt to return into the DYL after it has been 
freed will fail. 


PDR_INIT Initialise PDR 


VOID pdr_init (PDR_INIT *par,VOID **ppcb) ; 
Initialise the instance of ppr. 


The parameter par points to a data structure of type ppR_1nrT which contains the information required to 
initialise the instance. The entire content of *par is copied into the property pdr.par. 


4-37 


FORM REFERENCE 


The ppr_1niT structure, shown below, is defined in prdrv.cl: 


typedef struct 
{ 
PR_WDR *wdr; 
WORD flags; 
WORD page_length; 
HANDLE dyl; 
WDR_HEADER *head; 
WDR_MODEL *model; 
} PDR_INIT 


The significance of the members of the ppR_in1T struct is as follows: 


wdr The handle of an instance of an associated wor class. Although the ppr object is created 
by this instance of wor, it does require the services of this wor object. 


flags An ored combination of flags as follows: 
WDR_PDR_LANDSCAPE - if Set, it indicates that landscape orientation is required. 


This is the only flag to be set in this property; subclassers may wish to add additional 
flags. 


page_length The page height in printer units. 


dyl If the ppr class is used directly, this member is nuuu. If the ppr class is subclassed and 
the subclass has been loaded from a DYL, then this member will contain the category 
handle of that DYL. 

head The address of the WDR file header resource. 

model The address of the wor_mopet data structure containing the information on the current 


printer model. 


The method opens a channel to the printer port and writes the handle of the opened channel to *ppcb by 
sending a PR_OPEN_PORT message to the object whose handle is contained in w_am->appman. spare1. This 
is a property of the application manager and is assumed to contain the handle of an instance of the 
PRINTER Class or its equivalent. A FORM printer object always inserts a copy of its own handle into 
w_am-—>appman.sparel during initialisation. 


A WDR_LOAD_RECORD message is sent to the associated wor object requesting it to load the commands 
resource for the current printer from the wor resource file; the address of the loaded resource is written to 


pdr.a.commands 


The method allocates a cell of length 256 bytes and writes its address to pdr.a.outbuf. This area will be 
used to build the sequence of printer commands. The cell will be re-allocated if it eventually proves to be 
too short. 


On the Series 3, there is a slight difference to the behaviour of this method. See the Series 3a/Series 3 
notes section at the end of this chapter for detail. 


PDR_PRINT Translate print command 
INT pdr_print (WDR_PRINT *pr,UBYTE **pbuf) ; 


Translate a print element into a sequence of printer specific commands and return the length of the 
generated commands. 


The print element is a data structure of type woR_PRINT pointed to by the parameter pr. The method takes 
the print element and translates the contents into a sequence of printer specific commands; the commands 
themselves are written to a buffer whose address is contained in the property pdr.a.outbuf and the start 
address of the sequence is written to *pbuf. 


Before starting the translation process, the property pdr. outien (the current length of the data in the 
output buffer) is reset to zero. 


4 THE DOCUMENT PRINTING CLASSES 


The command sequences generated depend on the setting of the f£1ags member of the print element. 
Separate methods exist to handle each possible setting of f1ags. The detailed work is delegated to other 
Ppr methods, each of which builds and adds commands to existing command sequences in the output 
buffer and updates the current length of the buffer as held in the property pdr. outlen. 


The method finally writes the address of the output buffer to *pbur and returns the length of the generated 
command sequences, i.e. the current value of pdr. outlen. This return value is used by the calling instance 
of pacEs to determine how much data to transmit to the printer. A subclass of ppr that wishes to direct 
output to a device other than the printer may replace this method to perform the output and return zero. In 
such a case, the output must have completed before the pdr_print method returns. 


As mentioned earlier, a print element is a data structure of type woR_pRiInt defined in prdrv.cl; this is 
shown below together with an explanation of the individual fields: 


typedef struct 


WORD flags; 
WORD typf; 
WORD fheight; 
WORD style; 
WORD down; 
WORD indent; 
WORD height; 
WORD right; 
TEXT *buf; 
UWORD blen; 
} WDR_PRINT; 


flags This member gives meaning to the print element. It is an oned combination of flags. 


The command sequences generated by pdr.print depend on the combinations set. However, 
they are added to the output buffer in the same order as the flags are described below. 


WDR_PRINT_sTaRT This flag indicates that the printer is to be started. The command 
sequence to do this is generated by sending a ppR_sTarT message. The 
method requires no arguments. 


WDR_PRINT_PAGE This flag indicates that the print element is to go onto a new page; in 
other words, a page break is required. The command sequence to do this 
is generated by sending a ppR_pacE message. The method requires no 
arguments. 


WDR_PRINT_LINE This flag indicates that the print element is to go onto a new line. A 
copy of the line height as found in pr->height is copied into the 
property pdr.1height, as this could prove useful to subclasses. 


The command sequence to force a new line is generated by sending a 
PDR_LINE message. The method requires two arguments which govern 
the initial position of the printhead on the new line - the vertical 
distance through which the print head is to move down and the 
horizontal distance the print head is to move to the right from the 
left-hand margin. 


The first argument is the value of pr->down plus pr->height. 
The second argument is the value of pr->indent. 


WDR_PRINT_FONT This flag indicates that a new font is to be set. The command sequence 
to do this is generated by sending a ppR_FONT message. 


The method requires three arguments - the typeface index, the height of 
the font and the required style. 


The arguments are the values pr->typf, pr->fheight and pr->style 
respectively. 


4-39 


FORM REFERENCE 


typft 


fheight 


style 


WDR_PRINT_RIGHT This flag indicates that the print head must be moved to the right. The 
command sequence to do this is generated by sending a ppR_RIGHT 
message. 


The method requires a single argument which specifies the amount by 
which the print head is to be moved. 


The argument is the value of pr->right. 


Note:- if woR_PRINT_TEXT is also set, then the print head is moved to the 
right before attempting to print any text. 


WDR_PRINT_TEXT This flag indicates that there is text to be printed. The command 
sequence to do this is generated by sending a ppR_TEXT message. 


The method requires two arguments which define the text to be printed - 
the address of a buffer containing the text and the length of the text to 
be printed. 


The first argument is pr->buf. 
The second argument is the value of pr->blen. 


Note:- if woR_PRINT_RIGHT is also set, then the print head is moved to 
the right before starting to print any text. 


WDR_PRINT_END This flag indicates that this print element terminates the print process. 
The command sequence to do this is generated by sending a ppR_END 
message. 


The method requires no arguments. 


The typeface number. It is a number that uniquely identifies the typeface, (Courier, for 
example) and is compatible with DOS/WORD font numbers. Each typeface resource contains 
a typeface number as part of its identity; see the woR_TYPEFACE structure in the wor class 
definition. 


This member is important when the woR_pRINT_FonT flag is set and is used as an argument to 
the pdr_font method. 


The height of the font in twips. 


This member is important when the woR_PRINT_FontT flag is set and is used as an argument to 
the pdr_font method. 


The style to be applied to the font. The style is represented by an ored combination of flags 
each of which represents an individual style as shown below. 


This member is important when the woR_PRINT_FonT flag is set and is used as an argument to 
the pdr_font method. 


WDR_STYLE_NORMAL Plain text. 
WDR_STYLE_UNDERLINE Text is underlined. 
WDR_STYLE_BOLD Text is boldened. 
WDR_STYLE_ITALIC Text is italicised. 
WDR_STYLE_SUPER Text is superscripted. 
WDR_STYLE_SUB Text is subscripted. 


down 


indent 


height 


right 


buf 


blen 


4 THE DOCUMENT PRINTING CLASSES 


The downwards displacement of the print head in printer units. 


When a print element is to go onto a new line, the print head is moved down by this value 
plus the value given in height. This member gives a mechanism for defining the extra 
spacing which is often needed before a line of text is printed (as occurs, for example, before 
the first line of a new paragraph.) 


This member is important when the woR_PRINT_LINE flag is set and is used in the 
construction of an argument to the pdr_line method. 


The right indentation of the print head in printer units. 


This member is important when the wor_PRINT_LINE flag is set and is used as an argument to 
the pdr_line method. 


The height of the line in printer units. 


When a print element is to go onto a new line, the print head is moved down by this value 
plus the value given in down. 


This member is important when the woR_PRINT_LINE flag is set and is used in the 
construction of an argument to the pdr_line method. 


The rightwards displacement of the print head, in printer units, from its current position. 


It defines how far to the right the print head is to move. If the print element also contains text 
to be printed, the print head is moved right before text is printed. 


This member is important when the woR_PRINT_RIGHT flag is set and is used as an argument 
to the pdr_right method. 


The address of a buffer containing text to print. 


This member is important when the woR_PRINT_TExT flag is set and is used as an argument to 
the pdr_text method. 


The length of the text to print. 


This member is important when the wor_PRINT_TExT flag is set and is used as an argument to 
the pdr_text method. 


PDR_ADD_COMMAND Add command to buffer 


VOID pdr_add_command (INT num,WORD *args) ; 


Add a printer command to the output buffer. 


This method takes two parameters: 


num represents the number of the command format string within the commands table. It can take 
one of the ppR_cmp_... values as defined in the sub-category file prdrv.cl. The address of the 
commands table is in pdr.a.commands. 


Recall that, in general, a command format string consists of the command itself (one or more 
characters) followed by formatting control characters which are discussed in the description of 
the Plib function p_atob in the Plib Reference manual. 


args points to a contiguous list of arguments; this parameter will be nu if the printer command 
requires no arguments. 


If no arguments are supplied, the command sequence added to the output buffer is simply the printer 
command as found in the commands table. 


If arguments are supplied, the way the method proceeds depends on the content of the command format 
string as follows: 


If the first character of the command format string is an asterisk ('*'), the first argument pointed 
to by args is assumed to be an integer value containing a repeat count. Any other arguments 
follow the repeat count. 


If the first character is not an asterisk, the method assumes a repeat count of one. 


FORM REFERENCE 


e A single command sequence is constructed, consisting of the printer command and the values in 
the argument list converted according to the formatting control characters. 


e A number of copies of the constructed single command sequence are added to the output buffer as 
defined by the repeat count calculated above. 


A special case occurs where the first character of the command string is an asterisk and the next character 
is NULL (i.e. the character '\o'); again, args will point to an integer value containing a repeat count. In 
this situation, a number of '\o' characters are added to the output buffer as defined by the repeat count. 


The method automatically re-allocates the output buffer if it is not big enough. 


PDR_DESTROY Destroy method, subclassable by DYL 


VOID pdr_destroy (VOID); 
This is a dummy method and does nothing. 


The method is intended for use by subclasses; its use is more fully discussed in the description of the 
destroy method. 


PDR_START Start printing 


VOID pdr_start (VOID); 
Generate the command sequences to initialise and set up the printer and add them to the output buffer. 
The following commands are added to the output buffer by sending a ppR_ADD_comMAND message: 

@ PDR_CMD_RESET instructing the printer to reset itself. 


@ PDR_CMD_FORM_LENGTH to set the form length. This requires a single argument specifying the 
length of the form. The length is specified in units of Jines and the assumption is made that there 
are 6 lines per inch; thus the value passed is the result of the calculation: 


(pdr.par.page_length * pdr.par.model->miny) / 240 
e PDR_CMD_PREAMBLE. 


@ PDR_CMD_LANDSCAPE instructing the printer to operate in landscape mode if and only if, on 
initialisation of this instance of ppr, landscape orientation was requested and the current printer 
model supports landscape orientation (i.e. woR_PDR_LANDSCAPE Is set IN pdr.par.flags and 
WDR_MODEL_LANDSCAPE_AVILABLE iS Set iN pdr.par.model->flags). 


If this command is generated, then the woR_ppR_LANDscapE flag is set into the property pdr. mode. 


The property pdr.typfix containing the index into the array of pointers to woR_TYPEFACE structures, 
corresponding to the current typeface, is initialised to -1. As any sensible index is always non-negative, 
this guarantees that any subsequent call to the par_font method will cause the relevant translate table 
resource to be loaded. 


To complete the start up command sequence, the par_font method is called to ensure that a default font is 
set. The default font has a typeface number of zero, a font height of 240 twips and normal style. It is worth 
noting that 240 twips is the height of a single line based on the assumption that there are 6 lines per inch. 


Finally, the method writes the printer auto-feed value (as found in the printer model information 
pdr.par.model->skipy) into the property pdr.skipy. This ensures that the downward displacement of the 
print head for the first new line is calculated correctly. 


PDR_END Finish printing 
VOID pdr_end(VOID) ; 
Generate the command sequences to terminate printing and add them to the output buffer. 


This method calls the pdr_page method to add a ppR_cmp_NEW_PAGE command to the output buffer and 
then adds a ppR_cMD_POSTAMBLE command directly by calling the pdr_add_command method. 


4 THE DOCUMENT PRINTING CLASSES 


PDR_PAGE Start a new page 


VOID pdr_page (VOID) ; 
Generate the command sequences to start a new page and add them to the output buffer. 


This method adds a ppR_cmp_NEW_PAGE command to the output buffer and then writes the printer 
auto-feed value (as found in the printer model information pdr.par.model->skipy) into the property 
pdr.skipy. This ensures that the downward displacement of the print head for the first new line on the 
new page, is calculated correctly. 


PDR_TEXT Print text at current position 


VOID pdr_text (TEXT *buf, INT len); 
Generate the command sequences to print text at the current position and add them to the output buffer. 


This method takes two parameters; buf points to a buffer containing the text to be printed and 1en 
contains the length of the buffer. 


The method substitutes the following characters into the buffer: 


e all scRLAY_syM_SOFT_HYPHEN and scRLAY_SYM_HARD_HYPHEN Characters are replaced with a '-' 
character. 


e all scrLAY_syM_HARD_sSPACcE characters are replaced with a'' character. 


If a translate table exists, the method translates any characters that need to be translated using both the 
translate table and its associated lookup table (see the description of the property pdr.a.tix and 


pdr.a. trans_res). 


Finally, the method adds the text, including all of the substitutions and translations, to the output buffer. 


PDR_LINE Start a new line 


VOID pdr_line(INT down, INT indent) ; 
Generate the command sequences to start a new line and add them to the output buffer. 


The method takes two parameters; down specifies the vertical distance through which the print head is to 
move; indent specifies the initial position of the print head relative to the left-hand edge of the page. Both 
indent and down are given in printer units. 


The following commands are added to the output buffer by sending a ppR_ADD_CoMMAND message: 
@ PDR_CMD_CARRIAGE_RETURN. 


@ PDR_CMD_MOVE_DowN to move the print head down. This requires a single argument specifying the 
amount of vertical travel. If the parameter down is non-zero and this is the first new line on the 
page, then the argument passed is the value of down Jess the vertical printer auto-feed value. (A 
negative result is reset to zero) 


In the context of this method, the first line on a new page is implied by the value of the property 
pdr.skipy. This is set to the printer auto-feed value at the start of printing and on page breaks; it 
is reset to zero by this method after the PpR_cmD_movE_Dbown command has been added to the 
output buffer. 


If the parameter indent is non-zero, the print head is to be moved horizontally. However, before this is 
done, the printer style is reset to normal, if it is other than normal. The pre-existing style is re-applied 
after the print head has moved. 


Thus, if the parameter indent is non-zero, the following occurs: 


e If the existing printer style is other than normal, a ppR_sTyLE message is sent with an argument 
of woR_STYLE_NoRMAL to add a command sequence to the output buffer to reset the style to 
normal. The existing style, as defined by the content of the property pdr. style is temporarily 
saved. 


FORM REFERENCE 


e A PDR_RIGHT message is sent to add a command sequence to move the print head right. The 
pdr_right method itself requires an argument specifying the amount of horizontal travel. The 
value of the argument passed is the value of indent Jess the horizontal printer auto-feed value (A 
negative result is reset to zero). 


e If necessary, a PDR_STYLE message is sent to add a command sequence to the output buffer in 
order to re-set the style to its pre-existing value. 


PDR_RIGHT Position to the right 


VOID pdr_right (INT right); 


Generate the command sequences to move the print head right from its current position and add them to 
the output buffer. 


The method takes a single parameter; right specifies the horizontal distance through which the print 
head is to move from its current postition and is given in printer units. 


The following commands are added to the output buffer by sending a ppR_aDD_CoMMAND message: 


e PDR_CMD_MOVE_RIGHT_PREFIX. 


e PDR_CMD_MOVE_RIGHT. 


e PDR_CMD_MOVE_RIGHT_SUFFIX. 


ALL three commands require a single argument specifying the amount of horizontal travel; the argument 
passed to all commands is the value of the parameter right. 


The method generates three command sequences to allow for the fact that some printers require a mode 
switch before and after the actual move right command. However, for many printers, this is not necessary 
and both the prefix and suffix commands are effectively null. 


PDR_FONT Set the font 


VOID pdr_font (INT typf,INT height, INT style); 
Generate the command sequences to set the font and add them to the output buffer. 
The method takes three parameters: 


@ typ specifies the typeface number which identifies the typeface, (Courier, for example) and is 
compatible with DOS/WORD font numbers 


¢ height specifies the height of the font in twips 


@ style specifies the style to be applied and is represented by an ored combination of flags (see the 
description of the pdr_style method for the flags and their meanings) 


The method sends a woR_SEARCH_TYPEFACE message to the associated wor object to retrieve the index of 
the entry within the array of pointers to woR_TYPEFACE structures which represents the typeface with 
number typ¢é. This index is referred to as the typeface index. 


The method then sends a woR_SEARCH_HEIGHT message to retrieve the index of the entry within the array 
of woR_FonT structures which most closely represents the font with height height. This index is referred to 
as the font index. 


See the section on wor in this chapter for a full description of the data structures and for more detail on the 
wdr_search_typeface and wdr_search_height methods. 


If both the typeface index and the font index are the same as the current values held in the properties 
pdr.typfix and pdr. fhix respectively, then the method only needs to send a ppR_sTYLE message with an 
argument of style, to add the command sequence to set the style. 


4 THE DOCUMENT PRINTING CLASSES 


If, however, either the typeface index or the font index are different from the current values held in 
pdr.typfix and pdr.fhix: 


e = Either one or both parameters height and style are set into the properties pdr.typfix and 
pdr. fhix, respectively to reflect the changes. These new values are now regarded as the current 
values. 


e If the resource ID of the translate table for the specified typeface is different from the current 
translate table resource ID as defined by the property pdr.trans_ria, then the new translate table 
is loaded by sending a woR_LOAD_RECORD message to the associated wor object and the 
pdr.trans_rid is updated with the new resource ID. The translate lookup table is also re-built. 


e A PpR_STYLE message is sent, with an argument of zero, to add a command sequence to the 
output buffer to set the style to normal. 


e For a non-scalable font, a PpR_ADD_COMMAND message is sent to add the 'set font' command as 
found in the command member of the current woR_Font data structure; formally:- 
self—>pdr.par.model.typeface[pdr.typfix]->font [pdr.fhix] .command 


e For a scalable font, a ppR_ADD_CoMMAND message is sent to add the 'set font’ command as found in 
the command member of the first woR_ront data structure; formally:- 
self—>pdr.par.model.typeface[pdr.typfix]->font [0] .command 


This command requires an argument specifying the font height in points. 


e = Finally, a ppR_styLE message with an argument of style, is sent to add the command sequence 
to set the style. 


PDR_STYLE Set the font style 


VOID pdr_style(INT style); 
Generate the command sequences to set the style and add them to the output buffer. 
The method takes a single parameter; style specifies the style to be applied. 


In practice, style is a combination of individual styles each of which is represented by a flag. The flags, 
which can be ored together, are as follows : 


WDR_STYLE_NORMAL specifies that the style is set to normal - i.e. no underline, no italic etc. 
WDR_STYLE_UNDERLINE specifies that underlining is to be set. 

WDR_STYLE_BOLD specifies that bold is to be set. 

WDR_STYLE_ITALIC specifies that italic is to be set. 

WDR_STYLE_SUPER specifies that superscript is to be set. 

WDR_STYLE_SUB specifies that subscript is to be set. 


The property pdr. style contains the current setting of the style flags. By comparing the current style with 
the required new style, as defined by the content of the parameter style, the method generates a sequence 
of commands to turn individual styles on or off as appropriate. The method uses the services of the 
pdr_add_command method to add the commands to the output buffer. 


For example, to turn underlining off and bold emphasis on, the commands ppR_cMD_UNDERLINE_oON and 
PDR_CMD_BOLD_OFF are generated and added to the output buffer. 


The method concludes by setting the property par. style to the value in the parameter style. 


FORM REFERENCE 


The PAGELAY mixin class 


PAGELAY 


The paceLay mixin class provides the formal specification for the call-back methods that must be 
supported by any class that provides access to the text content of a formatted document. These methods 
may be called by the paczs class. The call-back methods mread and mdone are also referred to as the read 
and the done methods in other parts of this manual. 


For a general discussion on call-back methods and mixin classes, see the Introduction chapter in this 
manual. 


The pacexay class does not appear in the FORM library and an instance of pacrLay will never be created. 
The FORM library supplies the prniay class to build and manipulate the layout of printer text. This class, 
described later in this chapter, provides the s1_print_reada method as the required mreaa or the read 
callback method. However, the FORM library does not supply a class which can provide the necessary 
mdone or done call-back method; this is normally supplied by the application. 


Class diagram 


The following class diagram formally illustrates the relationship between the paczLay mixin class and the 
pacEs Class. This diagram shows both the active class and the pacExay class in order to emphasise the 
multiple inheritance aspect of mixin classes. 


~~ — 
ts 
a sad, re 


pa active / / pagelay / 


Ne se ) 


) es 
Les y 


fs — 
A pages / 
i ) 
cae 
Class definition 
CLASS pagelay root 
{ 
DEFER mread fetch print element 
DEFER mdone report status 


} 
Property 


None. 


PAGELAY call-back methods 
PAGELAY MREAD Get next WDR_PRINT element 


UINT pagelay_mread(INT flag,WDR_PRINT *pr) 
This method is also referred to as the read method in this chapter. 


The printing/previewing/pagination process is normally broken down into a sequence of operations such 
as moving the printing position down, changing the typeface, printing a number of characters and so on. 
Each of these operations can be described by what is known as a print element. 


4 THE DOCUMENT PRINTING CLASSES 


Once created, the pacrs object drives this process by requesting print elements from the application. It is 
the application's responsibility to "know" what it wants to do next. 


For print and preview operations, the pacrs object is responsible for taking a print element and translating 
it into an appropriate sequence of commands suitable for the chosen printer and scheduling any resulting 
I/O operations. 


For pagination operations, the paczs object uses the print elements to build pagination information. 


This method provides the mechanism by which a paces object obtains a print element from an 
application. 


A print element is represented by the information contained in a data structure of type woR_pRInT. While 
this structure is used by the application, the pacrs object and by the printing (epR) object, it is in fact 
defined in the printer resource (wor) class definition. 


PAGES supplies two parameters when calling this method: 
¢ pr isa pointer to a data structure of type woR_PRINT. 


@ £1ag indicates the type of operation for which the instance of paczs has been constructed; if set to 
TRUE, the pacEs object is performing a print or preview operation; if set to raLsE, the PAGES 
object is performing a pagination operation. 


The method must insert the information which describes the next element to be printed, into this data 
structure. While the Printing chapter in the Object Oriented Programming Guide discusses woR_PRINT in 
greater detail, an overview is given below. 


The pr->flags field describes the type of the print element and affects how the element is to be used. A 
number of flags may be set into this field; they are not mutually exclusive and are summarised below. 


WDR_PRINT_START If set, this print element will start the printing process. In effect it causes the 
printer to be reset and appropriately initialised. 


WDR_PRINT_END If set, this print element will terminate the printing process. It tells the pacgs 
object that there is no more data available. 


WDR_PRINT_LINE If set, the current print position is to be moved back to the beginning of the 
line, then down by pr->down printer units, then down again by pr->height 
printer units and finally moved right by pr->indent printer units. 


WDR_PRINT_FONT If set, the font (i.e. the typeface) is to be changed to that specified in 
pr->typf, the height changed to that specified in pr->fheight and the style 
changed to that specified in pr->style. 


WDR_PRINT_TEXT If set, pr->blen bytes of text from the buffer pointed to by pr->buf are to be 
printed. 


WDR_PRINT_KEEP If set, the line containing this print element is to be kept, if possible, on the 
same page as the following print element. 


WDR_PRINT_PAGE If set, this print element is to go onto a new page. In other words, a page 
break will be forced. 


WDR_PRINT_IDLE If set, the pacEs object is to ignore this print element and then suspend itself. 
To resume, the application must send the paces object an explicit ao_QUEUE 
message. 


PAGELAY_MDONE Handle status messages 


INT pagelay_mdone (PAGES_DONE *pdone, PAGES_PARAMS *par); 
This method is also referred to as the done method in this chapter. 


This call-back method, supplied by the application, provides the mechanism by which a paces object can 
keep an application informed of the current status of the printing, previewing or paginating operation. 


The content of the method is application dependent; however, it must take note of the information pacEs 
passes to it. In return, packs may require "feedback" from the method depending on the precise 
circumstances in which it is called. 


FORM REFERENCE 


PAGES passes two parameters to the method: 


e par is a pointer to a data structure of type pAcEs_PARAMs, containing such information as page 
dimensions. See the paces class for more detail on the contents of this structure. 


¢ pdone is a pointer to a data structure of type PAGES_DONE. 
par will contain the handle of the pages.par property of pacEs. 


pdone will contain information relating to the current status; in particular pdone.event indicates the 
status of the printing, previewing or paginating operation and can take one of the following values: 


PAGES_DONE_END Set when printing, previewing or paginating is complete and no further 
documents are to be printed. 


Whether printing or paginating, the pacrs object destroys itself after this 
call-back method returns. 


If pacEs is paginating, the page array will have been built and its handle 
placed in pdone->pages. Responsibility for the page array passes to the 
application which must ensure that it is destroyed before the application 
itself terminates. 


Any value returned by this method is ignored. 


PAGES_DONE_PAGE Set when a page break occurs. paces puts the new page number into 


pdone->page. 
Any value returned by this method is ignored. 
PAGES_DONE_ERROR Set when an error occurs. 

If an error occurs, the PAGES ao_abrun method is called which: 
e does a notify by supersending an ao_aBRUN message 
e calls this call-back method to inform the application 
e sends itself a pesTRoy message 

Any value returned by this method is ignored. 


PAGES_DONE_DOC Set when the printing, previewing or paginating of a document is complete. 
If more copies of the same document or new documents are to be printed 
then the method should return TRug; if no more documents are to be printed 
then the method should return Fratse. 


4 THE DOCUMENT PRINTING CLASSES 


PRNLAY 


paras tbxlen 
first senselen 
nomemory sensebuf 
adjust pos 

scan line 

rd nlines 
fmt below 
doc excess 


slines ngaps 


spadjust ngap 


st used 
ptab 
plabel 


destroy sl_print_read 
l_ init sl_print_pos 
|_set 

|_sense 

| line_ends 

1l_pos_to_xl 

1_xl_to_pos 

|_ begin_read 

l_read 

1 _ format_line 

LsseroLl 

|_ view 

|_discard_layout 

1 _set_lines 

1_para_changed 


An DH HHA HHA AHA HAR ARR HA A 


l_rescale 


The prntay class, in conjunction with its superclass scrLay, provides services to lay out lines and line 
segments for a printer, from a document that is composed of a sequence of paragraphs. 


In effect, pRNLay provides property and structures which model the layout of a document on the printer. 
The methods supplied by this class allow the layout model to be manipulated. 


It is important to note that the behaviour of prntay is, in essence, the same as the document layout class 
scruay. All of scriay's property and behaviour is re-usable by prnnay. 


Only two extra methods are provided by prniay in order to provide the full behaviour. 


An instance of prniay is normally referenced by two other objects: its creator (normally a window class) 
and a pacgs class. paces needs a class to provide it with a read call-back method, a method which can 
supply pacEs with a sequence of print elements; many applications, such as the word-processor, use the 
PRNLAY sl_print_read method as the call-back method; the specification for the pacEs read call-back 
method can be found in the description of the paczLay mixin class in this chapter. 


pacEs, itself, creates an instance of prniay to handle layout for header text. 


This section makes references to data structures (e.g. Tboxes) which are described in the section on the 
scruay Class in The Document Layout Classes chapter of this manual. It is strongly recommended that 
PRNLAY be read in conjunction with scruay. 


Class definition 


The prniay class subclasses the FORM class scruay and is defined in the sub-category file scriay.cl (with 
generated header scrlay.g). The scruay class is documented in The Document Layout Classes chapter in 
this manual. 


FORM REFERENCE 


CLASS prnlay 
{ 


scrlay 


ADD sl_print_read 


ADD sl_print_pos 


TYPES 
{ 


typedef struct 


{ 


Read text for printing 
Set the start position for printing 


SCRLAY_PLABEL s; as for the screen 

UBYTE *wid; the font width table 

UWORD margin; margin for paragraph labels in printer units 
UWORD gutter; gutter between label and para margin 


} PRNLAY_PLABEL; 


PROPERTY 
{ 
WORD tbxlen; Number of bytes to still to read from TBOX 
WORD senselen; Number of bytes to still to read from sensebuf 
TEXT *sensebuf; Address of text being read (justified only) 
UWORD pos; Document position to read 
WORD line; Current line in paragraph 
WORD nlines; Number of lines in paragraph 
WORD below; Carried over from previous paragraph 
WORD excess; Excess width for justified alignment 
WORD ngaps; Number of gaps for justified alignment 
WORD ngap; Number of gaps so far 
WORD used; Excess width used so far 
SCRLAY_TBOX *ptab; Last tab in line or NULL if no tabs 
WORD plabel; Line has a para label if TRUE 


} 
} 


Property 


prnlay.tbxlen 


prnlay.senselen 


prnlay.sensebuf 


prnlay.pos 
prnlay.line 


prnlay.nlines 


This contains the number of characters remaining to be read from the 
current Tbox. See scruay for a definition of scrLay_TBox. This property is 
re-set to zero by the s1_print_pos method. 


This property is only relevant for paragraphs with justified alignment. 


It is used in conjunction with the prniay.sensebuf property and records the 
number of characters remaining to be processed within a block of contiguous 
characters sensed from the document using the sensechars call-back 
method. 


This property is re-set to zero by the si1_print_pos method 
This property is only relevant for paragraphs with justified alignment. 


The handling of a block of contiguous characters, sensed from the document 
using the sensechars call-back method, is slightly different when justified 
alignment is used. Each contiguous section of non-blank characters in the 
block must be printed separately. This allows the gaps to be adjusted (by 
moving the print head) to ensure correct alignment. 


This property records the current position within a block of contiguous 
characters. 


The position within the document where text is to be read from next. 
The current line in the current paragraph. Note that the first line is line zero. 


The total number of lines in the current paragraph 


prnlay. 


prnlay. 


prnlay. 


prnlay. 


prnlay. 


prnlay. 


prnlay. 


below 


excess 


ngaps 


ngap 


used 


ptab 


plabel 


4 THE DOCUMENT PRINTING CLASSES 


This is the space required below the previous paragraph, measured in printer 
units. 


The value is added to the value of the space above the current paragraph to 
calculate the total downward movement of the print head before printing the 
first line of the current paragraph. 


This property is re-set to zero by the s1_print_pos method. 
This property is only relevant for paragraphs with justified alignment. 


It is a measure of the number of pixels by which the characters on a line 
(excluding any trailing whitespace) fall short of the right hand margin. This 
value is used in the calculation of the adjustment to the gaps between 
contiguous non-blank characters, necessary to achieve justified alignment. 


This property is only relevant for paragraphs with justified alignment. 


This is the number of gaps in a line; generally speaking, a gap corresponds 
with a blank character. If there are any left hand used tabs in the line, it is 
the number of gaps after the ast used left hand tab. 


This property is re-set in the sL_PRINT_READ method whenever the first Tbox 
in a line is being handled. 


This property is only relevant for paragraphs with justified alignment. 


It is used in the st_pRINT_READ method to keep a record of how many of the 
gaps in a line have been adjusted, when printing that line. This information 
is used to ensure that the line is aligned correctly. 


This property is re-set in the sL_PRINT_READ method whenever the first Tbox 
in a line is being handled. 


This property is only relevant for paragraphs with justified alignment. 


It is used in the st_PpRINT_READ method to keep a record of how much of the 
excess width in a line has been "used up" by the adjustment of gaps between 
words. 


The address of the final used tab on a line or nutt if the line has no used 
tabs. 


The tab is represented by a Tbox (a scRLAY_TBox structure). 


This property is only relevant if a senseplabel call-back method is supplied 
by the document content object. In this event, paragraph labels are to be 
printed. 


It records the number of printer units the printhead must move after the 
label has been printed, to reach the start of the paragraph margin. 


This property is only relevant to the first line of a paragraph. 


FORM REFERENCE 


PRNLAY methods 


SL_PRINT_READ Read text for printing 


UINT sl_print_read(INT WantData,WDR_PRINT *pr); 


Read a portion of text for printing and build a print element containing information which describes the 
text, the typeface, the font height etc. 


The method takes two parameters: 


@ WantData indicates the type of operation for which this portion of text is being read. If set to 
TRUE, a print or preview operation is in progress; if set to FALSE, a pagination operation is in 
progress. 


¢ pr points to a data structure of type woR_pRINT. This structure represents what is known as a print 
element. The method writes all the necessary information about the portion of text into this data 
structure. Although this structure is defined in the wor class definition, it is used by paces 
methods and ppr methods. See the description of the ppr class and the Printing chapter of the 
Object Oriented Programming Guide. 


It returns the position within the document corresponding to the start of the portion of text represented by 
the print element. 


The method constructs layout for one paragraph at a time and uses this information to construct a series of 
WDR_PRINT print element for successive sections of text. The method only builds one print element at a 
time but is expected to be called repeatedly until all of the document has been processed. Much of the 
property of prnuay (and its superclass scriay) is used to record the "current position" within the 
document and the layout data structures. 


The method will correctly calculate items such as right indentations and the address/length of text to be 
printed; it will also flag line breaks and font changes as required by setting the appropriate 
WDR_PRINT_... flags. The method will also flag a new page when a paragraph is required to start on a 
new page. 


If the senseplabel call-back method has been supplied, worR_pRintT elements will be created to cause a 
label to be printed in the left hand margin of the first line. 


When the end of the document is reached, a woR_PRINT_END flag will be set; this will, ultimately, cause 
printing to terminate. 


SL_PRINT_POS Set start position for printing 
VOID sl_print_pos(UINT pos,UINT doclen); 

Set the start position and the document length for the next call to sL_PRINT_READ. 

The method takes two parameters: 


© pos indicates the start position within the document to be printed. This position should 
correspond to the beginning of a paragraph. 


@ docien contains the length of the document 


The method discards any existing layout by sending an si_p1scarp_LayouT message. If the value passed 
in the parameter doclen is non-zero, this value is recorded as the new document length. If the value is 
zero, the recorded document length remains unchanged. 


4 THE DOCUMENT PRINTING CLASSES 


A number of items of property are re-set. The following list shows which items are re-set and the 
corresponding new values: 


scri 


scr 


scr 


prnl 


prnl 


prnl 


ay.rd.pos the value in pos 


lay.fmt.pos the value in pos 


ay.rd.pp NULL 


ay.tbxlen 0 


lay.senselen 0) 


ay.below 0 


Series 3a/Series 3 notes 


The version of the FORM classes described in this chapter are those which exist on the Series 3a and 
Workabout. On the Series 3, the classes and the relationships between them are essentially the same. 
However, there are some differences which need to be discussed. 


1. 


On the Series 3, the pr_print method opens the printer port device itself (by sending a 
PR_OPEN_PORT message) rather then allowing it to be done by the pdr_init method as occurs on 
the Series 3a. 


The handle to the opened port is passed to the paces object as the second parameter in the call to 
the PAGES ao_init method. Further, the parameter is also used as a flag to indicate whether the 
PAGES Object is to perform a printing or paginating operation (previewing does not exist on the 
Series 3). A nuu value is used to indicate that the pacrs object is to perform a pagination rather 
than a printing operation. The paces ao_init method is prototyped as: 


VOID ao_init (PAGES_INIT *in,VOID *port,PAGES_PARAMS *par); 


On the Series 3a, the handle of the prinTER object is set into the spare1 property of the 
application manager by the pr_init method. On the Series 3, this is not done. Instead, the 
handle can be found in the printer property of HWIM's wseErv active object. 


On the Series 3a, the pRINTER class method pr_port_data takes three parameters, the last of 
which can take the value TRUE or FALSE. On the Series 3, however, this final parameter does not 
exist and has the effect that the method can only return printer port information as set by the user 
of the PRINTER object (by an earlier call to the pr_set_port_type). 


On the Series 3a, the pr_sense_mode1 method searches for a .wdr file of the same name as that 
held in property or the environment variable psm. If the file cannot be found, all the Loc:: drives 
are searched. If the file still cannot be found, the rom is searched and, only if it cannot be found 
here, is the default file Rom: :Bg.woR and model number zero used. 


The search behaviour on the Series 3 differs slightly. Here, if the file cannot be found, drives a:, 
B:, and m: are searched before using the default file Rom: :Bg.woR and model number zero. 


CHAPTER 5 


THE PRINT PREVIEW CLASS 


The Print Preview class, or the prvppR class, to give its correct name, is a subclass of ppr that provides the 
necessary behaviour to build a preview of a document. 


Previewing allows us to see up to four pages (up to two in landscape mode) of a document at time, in 
"miniature", to get an overall view of the layout of the text and to see how it would look when printed. 
The pages are displayed on the screen. 


A great deal of the property and behaviour of prvppr is provided by the base class ppr. However, a 
number of methods are replaced by prvepr, in particular, those dealing with the initialisation and 
"printing" of a document. 


The class does not perform I/O to a real physical printer; instead, requests such as printing text, starting a 
new line and moving the print head are converted into drawing actions on a bitmap and manipulating the 
position within the bitmap where drawing is to be done. 


In effect, each page is drawn to a bitmap and each bitmap is compressed and placed into a data segment. 


This class does not contain behaviour to display the previewed document. The application user interface is 
normally responsible for decompressing the bitmaps and displaying the previewed pages. 


It should be noted that although prvppr is a subclass of por, it is not loaded from a separate DYL. 
This class is not available on the on the Series 3. 


Precursors 


An understanding of the print preview class will be helped by a knowledge of: 
e the p_enter and p_leave error handling services 
e =the Graphics Output chapter of the Window Server Reference 
e = =The Document Printing Classes chapter of this manual 
e the OLIB variable array class, vAFLAT 


Class diagram 


The following diagram covers the relationship between the prvppr class and other classes and is discussed 
in detail in this chapter. The underlined classes are either discussed in another chapter of this manual or 
they refer to OLIB classes in which case they are all discussed in the OLIB Reference manual. 


fine Ne a 
/ pdr) y varoot / 
~ > ) 
eres SEES Ye aS 
/ prvpdr_ Z vafix / 
~ ) ~ Zod) 
A eae 
Z vaflat / 
= ) 
oes 


FORM REFERENCE 


PRVPDR 


par pChWidths 

mode SpaceWidth 

typfix FontYy 

fhix TwipsRound 

style PageHeight 

lheight Scale 

a Round 

trans_rid Pos 

outlen hPrvDone 

skipy mPrvDone 
Bmp 
SegHandle 
SegPos 
SegHeight 
SegSize 
pArray 
pBitRow 
pLastRow 
pRowRec 


destroy pdr_init 


pdr_print 
pdr_destroy 
pdr_start 
pdr_page 
pdr_font 

pdr_end 

parcpage 

pdr_text 

pdr_line 

pdr_right 

pde—feont 

pdr_style 


Class definition 


The prvepr class subclasses the ppr class and is defined in the sub-category file prvpdr.cl (with generated 
header file prvpdr.g). 


CLASS prvpdr pdr 
{ 


REPLACE pdr_init Allocate larger buffer 

REPLACE pdr_print 

REPLACE pdr_destroy To get around bug in pdr class 
REPLACE pdr_start Start printing 


REPLACE pdr_page 
REPLACE pdr_font 


TYPES 

{ 

typedef struct 
{ 
INT Id; ID of bitmap 
HANDLE SegHandle; handle of bitmap segment 
UPOINT Size; 
UWORD ByteWidth; 
UWORD BitWidth; width of used bitmap, use this for scaling 
} PRV_BITMAP; 


typedef 
{ 


struct 


UWORD typeface; 
UWORD height; 
UWORD style; 


typedef 


typedef 


BMP_RASTER_TL tl; 


FONT_DESC; 


struct 


UBYTE Type; 
UBYTE Length; 
BMP_RASTER_TL; 


struct 


UBYTE Data[2]; 


} BMP_RASTER_ROW_REC; 


PROPERTY 
{ 
UBYTE 
UWORD 
UWORD 
UWORD 
UWORD 
UPOINT 
UPOINT 
UPOINT 
VOID 
WORD 


5 THE PRINT PREVIEW CLASS 


*pChWidths; character widths for current font 

SpaceWidth; width of space in current font 

FontyY; pixel height of current font 

TwipsRound; used for rounding in twips conversion 
PageHeight; 

Scale; x and y scales (printer units to bitmap units) 
Round; used to round unit conversions 

Pos; x and y position in current page bitmap 
*hPrvDone; Callback handle for %done & completion 
mPrvDone; Callback method for %Sdone & completion 


PRV_BITMAP Bmp; 


HANDLE 
LONG 
INT 

INT 
PR_ROOT 
UBYTE 
UBYTE 


BMP_RASTER_ROW_REC 


} 
} 


Property 


prvpdr.pChWidths 


prvpdr.SpaceWidth 
prvpdr.Fonty 


prvpdr.TwipsRound 


prvpdr.PageHeight 


SegHandle; segment to save drawing to 

SegPos; current position in segment 
SegHeight; height of bitmap segment (lines) 
SegSize; size of segment (in paragraphs) 
*pArray; varray of page positions in segment 
*pBitRow; current row from bitmap 

*pLastRow; previous row from bitmap 


*pRowRec; 


compressed data from preview segment 


The address of the font width table for the current typeface, font height and 


style. 


The width of the space character in the current font, in printer units 


The height of the current font, in pixels. 


This is a horizontal and vertical correction factor used in the conversion of 
twips to pixels in the vertical direction. 


prvpdr.TwipsRound is the ratio of the number of vertical bits in the bitmap 
(the number of 'lines' in the bitmap) to the height of the page to be displayed in 
twips. 


1.€. prvpdr.Bmp.Size.y / prvpdr.PageHeight. 


The height of a page to be displayed in twips. 


The actual value contained in this property depends on the display mode. In 
landscape mode, this value is set to the width of the page; in portrait mode, this 
value is set to the height of the page. 


FORM REFERENCE 


prvpdr. 


prvpdr. 


prvpdr. 


prvpdr. 


prvpdr. 


prvpdr. 


prvpdr.SegHandle 


prvpdr. 


prvpdr.SegHeight 


Scale 


Round 


Pos 


hPrvDone 


mPrvDone 


Bmp 


SegPos 


This is a horizontal and vertical scaling factor used in the conversion of printer 
units to pixels. 


prvpdr.Scale.x gives the number of horizontal print head movements needed 
to print the full width of the page; prvpdr.scale.y gives the number of vertical 
print head movements needed to print the full height of the page. 


This is a horizontal and vertical correction factor used in the conversion of 
printer units to pixels. 


prvpdr.Round.x is the ratio of the horizontal scaling factor to the number of 
horizontal bits needed to draw a line (prvpdr.Bmp.BitWidth); prvpdr.Round.y 
is the ratio of the vertical scaling factor to the number of vertical bits available 
in the bitmap (prvpdr.Bmp.Size.y). 


The x and y position in the current page bitmap measured in printer units 
The handle of the object providing the done callback method. 


The method number of the done callback method. For the general specification 
of this method, see the prntprv_mdone method in the description of the 
PRNTPRV mixin class in this chapter. 


N.B. The done call-back method here is quite distinct from the paczs done 
call-back method referred to in The Document Printing Classes chapter. 


This is a data structure of type prv_BiTmap and contains information relating to 
the bitmap used for drawing a representation of the page. The individual 
members of this structure are shown below. 


N.B. the size, Bytewidth and Bitwidth are shown in a different order to that 
in the structure. 


Id The ID of the bitmap as returned by a call to the Window Server 
function gcreateBit 


SegHandle The handle of the bitmap segment as returned by the Plib 
function p_sgopen 


BitWidth The number of horizontal bits needed to draw a single line so 
that it fits into the application's window and the ratio of this 
value to the height of the page measured in pixels is the same as 
the ratio of the width to the height of the page measured in twips. 


This value is used to calculate the value of prvpdr. round. x, 
described above. 


ByteWidth | The number of bytes needed to accommodate a single line of the 
bitmap. It is the value of (size.x/s) and assumes that size.x is 
an exact multiple of eight. 


Size The dimensions of the bitmap in pixels. 
The x component is the value of Bitwidth rounded up to an 
exact multiple of 8. 
The y component is normally determined by the height of the 
application's window. 


The handle of an external data segment into which are copied the compressed 
bitmaps containing the drawn representation of each document page. This is 
also referred to as the preview data segment. 


The segment is created by an instance of the prinTER class and the handle is 
passed to this instance of prvppr in a call to the pdr_init initialisation 
method. 


The current position within the preview data segment measured in bytes. 


The height of the bitmap segment. Effectively, this represents the number of 
lines of bits available for drawing. 


5 THE PRINT PREVIEW CLASS 


prvpdr.SegSize The current size of the preview data segment, in paragraphs (i.e. units of 
sixteen bytes). 


prvpdr.pArray The handle of a varLat object. 


The array is used to hold a series of values which give the position of 
consecutive compressed bitmaps within the preview data segment. It is 
designed to hold entries (records) which are the length of a Lone 'C' data type 
and has a granularity of 16 entries (records). 


The instance of var.at is initialised by the application before the creation of 
this instance of prvpr and contains a single entry (record) holding a zero value. 


prvpdr.pBitRow The address of a buffer to contain a copy of the current row from the bitmap. 
The buffer itself is prvpdr.Bmp.ByteWidth bytes long. 


This buffer is used by the pdr_page method during bitmap compression. 


prvpdr.pLastRow The address of a buffer to contain a copy of the previous row from the bitmap. 
The buffer itself is prvpdr.Bmp.ByteWidth bytes long. 


This buffer is used by the pdr_page method during bitmap compression. 


prvpdr.pRowRec The address of a buffer to contain compressed data from the bitmap. The buffer 
itself is (prvpdr.Bmp.ByteWidth plus the length of structure 
BMP_RASTER_ROW_REC) bytes long. 


This buffer is used by the pdr_page method during bitmap compression. 


PRVPDR methods 


PDR_INIT Initialise 


VOID pdr_init (PDR_INIT *pPar) 
Initialise the instance of prvppr. This method replaces the subclass pdr_init method. 


The method takes a single parameter: ppar points to a data structure of type ppR_iniT which contains 
information required to initialise the instance. 


The method starts by copying the entire content of *ppar into the property pdr. par. 


A PR_PREVIEW_DATA message is then sent to the PRINTER object to fetch the address of the pRINTER 
property printer.prv. This is a data structure of type PREVIEW_DaTA and contains information required 
for the preview operation. For more detail on the content of this structure, see the PRINTER class 
pr_preview_start method in The Document Printing Classes. 


Note that the assumption is made that a copy of the handle of the pRInTER object is contained in the 
application manager's spare1 property. A FORM printer object, as part of its initialisation process, 
always inserts a copy of its own handle into the application manager's spare1 property for the 
convenience of a large number of methods within a variety of classes. 


A number of items of property are set by copying corresponding members from the PpREVIEW_DATA 
structure: prvpdr.SegHandle, prvpdr.pArray, prvpdr.hPrvDone, prvpdr.mPrvDone plus the size and 
Bitwidth members of prvpdr.Bmp. The sytewidth member of prvpdr.Bmp is set to the value of 
prvpdr.Bmp.Size.x divided by eight. 


A memory cell, large enough to contain three buffers, is allocated and added to the cleanup list. The 
memory cell is partitioned as follows: 


e the address of the first prvpdr.Bmp.Bytewidth bytes is set into the property prvpdr.pBitRow; this 
buffer is prvpdr.Bmp.Bytewidth bytes long and will contain the current bitmap row. 


e the address of the second prvpdr.Bmp.Bytewidth bytes is set into the property prvpdr.pLastRow; 
this buffer is prvpdr.Bmp.Bytewidth bytes long and will contain the previous bitmap row. 


e the address of the third prvpdr.Bmp.Bytewidth bytes is set into the property prvpdr.pRowRec} 
this buffer is (prvpdr.Bmp.Bytewidth + length of a BMP_RASTER_ROW_REC structure) bytes 
long and will contain the bitmap raster row record. 


FORM REFERENCE 


A bitmap is created in its own memory segment, using the gcreateBit Window Server function, and the 
returned bitmap ID is set into prvpdr.Bmp.1d; the size of the bitmap is determined by the value of 
prvpdr.Bmp.Size. The bitmap memory segment is then opened, using the p_sgopen Plib function, and the 
returned handle to the opened memory segment is set into prvpdr.Bmp.SegHandle. Note that if p_sgopen 
returns an error condition, the bitmap is explicitly freed (using wrree) and p_leave called, passing it the 
error code returned by p_sgopen. 


A PR_GET_PARAMS message Is sent to the PRINTER object to get the address of the printer parameters. The 
printer parameters are held in a pRINTER_PARaMs data structure in PRINTER'S property printer.p. 


The horizontal and vertical scaling factors and rounding values are calculated and set into the properties: 
prvpdr.Scale, prvpdr.Round and prvpdr.TwipsRound. These values will be used to calculate the number 
of bits required to represent items of text in the bitmap representation of the document. Specifically, they 
are used to convert twips and printer units into numbers of pixels. Note that, in calculating these values, 
account is taken of whether the document is in landscape or portrait mode. 


Finally, the memory cell containing the three buffers is removed from the cleanup list. 


PDR_PRINT Interpret print command 
INT pdr_print (WDR_PRINT *pr,UBYTE **ppbuf) 

Interpret a print element and manipulate, or draw, to the bitmap. 

The method takes two parameters: 


¢ pr contains the address of a print element; this is a data structure of type woR_PRINT. See the 
description of the ppr superclass pdr_print method in The Document Printing Classes chapter in 
this manual for more information on the woR_PRINT structure. The Printing chapter of the Object 
Oriented Programming Guide also contains some useful background information. 


¢ ppbuf is not used by this method but is included in the method prototype for compatibility with 
the superclass pdr_print method. When calling this method, the parameter can be nut. 


In general, the method uses the information in the print element to print (1.e. to draw) to the bitmap and to 
manipulate the position within the bitmap where drawing is to be done. A print element will also indicate 
where page breaks occur and the start and end of the printing process. 


The detailed working of this method is driven by the settings of the f£1ags member of the print element. 
flags can contain an ored combination of values. Depending on the individual flags set, the method 
proceeds as follows: 


WDR_PRINT_START The method sends a ppR_sTarT message to this instance of pRvppR to prepare 
the printing process. 


WDR_PRINT_PaGE This flag indicates a page break request and causes the method to send a 
PDR_PAGE message to this instance of pRvppR to copy (and compress) the 
bitmap of the current page to the preview data segment. 


The code is constructed such that if the pdr_page method returns with an 
error, the done callback method is called to inform the application of the 
error and is followed by a call to p_leave specifying the returned error code. 


WDR_PRINT_LINE This flag indicates a line break. 


The sum of the down and height members of the print element indicates the 
amount by which the print position must be moved downwards. 


The value of the indent member of the print element indicates the initial 
print position relative to the left hand edge of the page. 


With this flag set, the vertical print position within the bitmap, as defined by 
the value of prvpdr.Pos.y, is adjusted by the sum of the down and height 
members of the print element; the horizontal print position within the 
bitmap, as defined by the value of prvpdr.Pos.x, is set to the value of the 
indent member of the print element provided that this is greater than zero. A 
zero or negative value of indent causes prvpdr.Pos.x to be set to zero. 


5 THE PRINT PREVIEW CLASS 


WDR_PRINT_FonT This flag indicates a request to set a font and causes the method to send a 
PDR_FONT message to this instance of prvppr to set the typeface, font height 
and style as defined by the typf, fheight and style members of the print 
element respectively. 


The code is constructed such that if the pdr_font method returns with an 
error, the done callback method is called to inform the application of the 
error and is followed by a call to p_leave specifying the returned error code. 


WDR_PRINT_RIGHT This flag indicates a request to move the print position to the right. 


The horizontal print position within the bitmap, as defined by the value of 
prvpdr.Pos.x, is incremented by the value of the right member of the print 
element provided that its value is greater than zero. If the value of right is 
zero or negative, no adjustment is made. 


WDR_PRINT_TExT This flag indicates that there is text to be printed. 


The address of a buffer containing the text to be printed (i.e. drawn ) to the 
bitmap is contained in the buf member of the print element. The length of 
the text to be printed is contained in the 1en member. 


No attempt is made to draw actual scaled characters because the resolution of 
the screen is not sufficiently fine. Instead, filled rectangles are drawn for 
every word of text, scaled according to the size of the word and the font 
height. A temporary graphics context is used for the drawing. 


WDR_PRINT_END The method terminates the printing (i.e. drawing) process by sending a 
PDR_PAGE message to this instance of prvppr to ensure that the bitmap of the 
final page is copied (and compressed) to the preview data segment. 


If the called pdr_page method completes successfully, it (pdr_print) calls 
the done call-back method, passing a value of pacEs_DONE_Doc, to inform the 
application of the event. 


If the called pdr_page method fails with an un-recoverable error, it 
(pdr_page) calls the done call-back method, passing a value of 
PAGES_DONE_ERROR before calling p_leave to propagate the error. 


The method always returns a zero value. 


PDR_DESTROY Destroy 


VOID pdr_destroy (VOID) 
Destroy the instance of pRvppR. 


The memory cell from which the three buffers, allocated in pdr_init, and anchored in the properties 
prvpdr.pBitRow, prvpdr.pLastRow and prvpdr.pRowRec, is freed. 


The bitmap is freed using the window server function wrree and the bitmap memory segment is freed 
using the Plib function p_sgclose. 


PDR_START Start printing (drawing) 


VOID pdr_start (VOID) 

Prepare to start the printing (i.e. drawing) process. 

The method clears the bitmap ready for drawing by doing the following: 
¢ Create a temporary graphics context, specifying the bitmap as the drawable entity. 
e Clear the pixels in the whole bitmap by calling the window server function gcirRect. 
e Free the temporary graphics context. 


The property pdr.typfix is set to -1; this guarantees that a font width table will be loaded in. See the 
pdr_font method. 


FORM REFERENCE 


An internal call is made to code which implements the pdr_font method to set the default typeface, a font 
height of 120 twips and the normal style. This code runs under the protection of p_enter. If an 
un-recoverable error occurs within this code, the done call-back method will be called, passing a value of 
PAGES_DONE_ERROR before calling p_leave to propagate the error. 


PDR_PAGE Start a new page 


INT pdr_page (VOID) 
Copy (and compress) the bitmap of the current page to the preview data segment. 


The preview data segment is the external data segment allocated by the prInTER object and whose address 
is passed to pRvppR during initialisation (see the pdr_init) method. 


The method calls the window server function wF1ush to ensure that all drawing to the bitmap is complete. 


The method then takes the bitmap representing the current page and compresses the data using raster 
graphics compression techniques and copies the compressed data to the preview data segment. 


The bitmap itself is then cleared in exactly the same way as described in the pdr_start method, ready for 
another page to be drawn. 


If a full page is successfully drawn to the bitmap, the method informs the application by calling the done 
call-back method, passing a value of PAGES_DONE_PAGE. 


Note that the code implementing this method runs under the protection of p_enter. If an un-recoverable 
error occurs within this code, the done call-back method will be called, passing a value of 
PAGES_DONE_ERROR before calling p_leave to propagate the error. 


PDR_FONT Set the font 


INT pdr_font (INT typeface, INT height,INT style) 
Set the typeface, font height and style. 
The method takes three parameters: 
e typeface specifies the number of the required typeface. 
e height specifies the height, in twips, of the required font. 


e style specifies the required style and can be an ored combination of: woR_STYLE_NORMAL, 
WDR_STYLE_UNDERLINE, WOR_STYLE_BOLD, WDR_STYLE_ITALIC, WDR_STYLE_SUPER and 
WDR_STYLE_suB. See the description of the pdr_style method of the ppr class in The Document 
Printing Classes chapter of this manual. 


The method sends a woR_SEARCH_TYPEFACE message to the associated wor object to retrieve the typeface 
index. The typeface index is the index of the entry within the array of pointers to woR_TYPEFACE structures 
which represents the typeface with number typf. In effect, it identifies the location of the information on 
the required typeface. 


The method then sends a woR_SEARCH_HEIGHT message to retrieve the font height index. This is the index 
of the entry within the array of woR_ronT structures which most closely represents the font with height 
height. In effect, it identifies the location of the information on the required font. 


See the description of the wor class in The Document Printing Classes chapter of this manual for more 
information on typefaces and fonts and the data structures representing them. 


The font height is converted from twips to pixels and the resulting value set into the property 
prvpdr.Fonty. 


If the required typeface or the required font height or the required style differs from the existing ones (as 
recorded in the subclass property: pdr.typfix, pdr.fhix and pdr.style respectively), then a 
WDR_GET_WIDTH_TABLE Message is sent to get the address of the new font width table. This address is set 
into the property prvpdr.pchWidths; the width of the blank character is set into the property 
prvpdr.SpaceWidth. 


Note that the code implementing this method runs under the protection of p_enter. If an un-recoverable 
error occurs within this code, the done call-back method will be called, passing a value of 
PAGES_DONE_ERROR before calling p_leave to propagate the error. 


5 THE PRINT PREVIEW CLASS 


The PRNTPRV mixin class 


PRNTPRV 


The prntprv mixin class provides the general specification for the call-back method(s) that may be called 
by the prvppr class. The call-back method mdone is also referred to as the done method. For a general 
discussion on call-back methods and mixin classes, see the Introduction chapter in this manual. 


The prntprv class does not appear in the FORM library and an instance of prntprv will never be created. 
The FORM library does not supply a class which can provide the required done call-back method; this is 
normally supplied by the application. 


Class diagram 


The following class diagram formally illustrates the relationship between the prntprv mixin class and the 
PRVPpDR Class. This diagram shows both the ppr class and the prntprv class in order to emphasise the 
multiple inheritance aspect of mixin classes. 


OLE i ES os 
if pdr / C prniprv / 
N“N ) Sy ) 
a 7 Lo 
f — 
yb dr / 
~ ) 
ees 
Class definition 
CLASS prntprv root 
{ 
DEFER mdone report status 


} 
Property 


None. 


PRNTPRV call-back methods 


PRNTPRV_MDONE Handle status messages 


INT prntprv_mdone (INT event); 
This method is also referred to as the done method in this chapter. 


This call-back method, supplied by the application, provides the mechanism by which a prvepr object can 
keep an application informed of the current status of the previewing operation. It is very similar, in some 
respects, to the pacELay done call-back method. However, unlike the paceLay done call-back method, this 
method is only passed the status of the pRvppR object. 


The content of the method is application dependent; however, it should take note of the information 
PRVPDR passes to it. 


PRVPDR passes a single parameter: 


¢ event indicates the status of the previewing operation and can take one of the following values: 


FORM REFERENCE 


PAGES_DONE_PAGE 


PAGES_DONE_ERROR 


PAGES_DONE_DOC 


This is set when a full page has been successfully drawn to the bitmap, the 
bitmap has been compressed and copied to the data segment and the 
bitmap itself has been cleared and other property reset ready to build the 
next page. 


Any value returned by this method is ignored by prvppr. 
This is set when an un-recoverable error occurs. 
Any value returned by this method is ignored by prvepr. 


This is set when the previewing operation is complete. The last page will 
have been successfully drawn to the bitmap and the bitmap itself copied to 
the data segment. 


Any value returned by this method is ignored by prvepr. 


Although this method is prototyped to return an int value, a pRvPDR object makes no use of it. As a useful 
convention, it is suggested that this method return a TrRuE value. 


CHAPTER 6 


THE CALENDAR IMAGE CLASS 


Precursors 
An understanding of the canine class will be helped by a knowledge of: 
e the graphical calendar display in the Series 3a Agenda application. 


Note that on the Series 3a it is more convenient to use the cALWwIN class rather than the caine class. 
See the Calendar Classes chapter of the HWIM Reference manual. 


The canine class simply subclasses Root and uses no other classes as components. 


CALIMG 


rect bwidth 
title_rect filler 
dayNameAbbrev 
deftitle 
startOfWeek title 
thisyear emphasised 


thismth img 
thisday bmid 
ystart 


destroy ci_adjust_date 
ci_init ci_redraw 
ci_set_title ci_sense 
ci_emphasise ci_view 
ci_move_cursor ci_pos_mxy 


ci_goto_date ci_today_changed 


The canine class supports a graphical calendar display as used by the Series 3a Agenda application. The 
calendar display provides a convenient method for the user to either select a date or determine the day of 
the week for a given date. Note that the user is responsible for passing the ID of a suitable window for the 
calendar image. 


The various titles in the calendar are indicated in the following picture: 


month title calendar title 


days of the week title 


FORM REFERENCE 


Note that the borders are not drawn by the cani1mc object and thus must be explicitly drawn by the 
application. 


The calendar supports multiple rows and columns of months as illustrated in the following picture: 


1994 

February March April 
MTWT‘FSS NTWTFSS MNMTWTFSS 

123456 123456 123 
7 8 918111213 7 8 99]111213 45 6 7 8 916 
14151617181926 14151617181926 11121314151617 
21 222324252627? 2122232425262? 18192621 22 2324 
28 28 29 36 31 25 26 27 28 29 36 


On the Series 3a the practical limit to the maximum number of rows is two whilst the limit on the number 
of columns is six. 


Note that the edges of the calendar are notionally mapped onto the preceding and following months. Thus 
in the above example moving the cursor upwards eventually scrolls the display to the preceding month. 


Class definition 


The canine class subclasses root and is defined in the sub-category file calimg.cl (with generated header 
file calimg.g). 


CLASS 


{ 
REPLACE destroy 


calimg root 


ADD ci_init 

ADD ci_set_title 

ADD ci_emphasise 

ADD ci_move_cursor 

ADD ci_goto_date 

ADD ci_adjust_date 

ADD ci_redraw 

ADD ci_sense 

ADD ci_view 

ADD ci_pos_mxy 

ADD ci_today_changed 

CONSTANTS 
{ 
CI_MAX_MONTH 12 
CI_GRIDY TRUE /* get month row */ 
CI_GRIDX FALSE /* get month col */ 
CALIMG_CURSOR_NO_FLASH 0x01 
CALIMG_DOW_EVERY_ROW 0x02 
CALIMG_FONT_DATA_KNOWN 0x04 
CALIMG_LEFT 0x00 /* physically go to day on the left */ 
CALIMG_HOME 0x01 /* goto leftmost day & month of row */ 
CALIMG_PREV_DAY 0x02 /* decrement by day */ 
CALIMG_PREV_MONTH 0x03 /* decrement by month */ 
CALIMG_RIGHT 0x04 /* physically go to day on the right */ 
CALIMG_END 0x05 /* goto most right day & month of row */ 
CALIMG_NEXT_DAY 0x06 /* increment by day */ 
CALIMG_NEXT_MONTH 0x07 /* increment by month */ 
CALIMG_UP 0x08 /* physically go to day above */ 
CALIMG_PAGEUP 0x09 /* goto previous page maintain x,y in month */ 
CALIMG_PREV_WEEK OxOA /* decrement by week */ 
CALIMG_PREV_YEAR 0x0OB /* decrement by year */ 
CALIMG_DOWN 0x0C /* physically go to day below */ 
CALIMG_PAGEDN 0x0D /* goto next page,maintain x,y in month */ 
CALIMG_NEXT_WEEK OxOE /* increment by week */ 
CALIMG_NEXT_YEAR OxOF /* increment by year */ 


6 THE CALENDAR IMAGE CLASS 


CALIMG_GOTO_TODAY 0x10 
CALIMG_WEST 0x01 
CALIMG_EAST 0x02 
CALIMG_NORTH 0x03 
CALIMG_SOUTH 0x04 
CALIMG_ADJ_DAY 0x01 
CALIMG_ADJ_MONTH 0x02 
CALIMG_ADJ_YEAR 0x04 
} 

TYPES 


{ 
typedef struct 
{ 


UBYTE title_ascent; ascent for title 

UBYTE title_lht; line height for title 

UBYTE dow_ascent; ascent for day of week 
UBYTE dow_lht; line height for day of week 
UBYTE mth_ascent; ascent for month 

UBYTE mth_lht; line height for month 

UBYTE day_ascent; ascent for day/date 

UBYTE day_lht; line height for day/date 
UBYTE daygapx; gap between 2 dates 

UBYTE daywidth; 2 numeric width characters ie width for 1 day 
} CI_EXT_FONT; Extended font information 


typedef struct 
{ 


WORD fid; font ID 
UWORD style; font style whether bold,italics,etc 
UWORD leading; leading below text 


} CI_FONT_DATA; 


typedef struct 
{ 


UWORD wid; window ID 

UWORD width; calimg window width 

P_POINT tl; tl.x=left & right gutters; tl.y=top & bottom gutters 
UBYTE mrow; number of rows of months to display 

UBYTE mcol; number of cols of months to display 


UWORD flags; 


CI_FONT_DATA title; font info for main top line title 

CI_FONT_DATA month; font info for month title 

CI_FONT_DATA dow; font info for day of week 

CI_FONT_DATA day; font info for the days itself 

UWORD daygap; CHAR NUMBER to use as horizontal gap between 2 days 
UBYTE mthgapx; no of pixels of horizontal gap between 2 months 
UBYTE hscrlm; granularity for scrolling horizontally by month 
UWORD startm; month number to display as first month, ie tl month 
ULONG days; days field of daysec struct ie days since 1/1/1900 
CI_EXT_FONT font; extended font info, defaults filled in by ci_init() 


} IN_CALIMG; 


typedef struct 
{ 


UBYTE year; Year number since 1900 
UBYTE month; month number 0 to 11 
P_POINT pos; x,y position within a month 
} CI_CURSOR; 


typedef struct 
{ 
WORD year; 
WORD month; 
WORD day; 
}CI_DATE; 


FORM REFERENCE 


PROPERTY 
{ 
P_REC 
P_REC 
CI_CU 
BYTE 
UBYTE 
UBYTE 
UBYTE 
UBYTE 
UBYTE 
UBYTE 
UBYTE 
TEXT 
TEXT 
TEXT 
WORD 


T rect [12]; 
T title_rect; 
RSOR crs; 
day; 
startOfWeek; 
thisyear; 
thismth; 
thisday; 
ystart; 
bwidth; 
filler; 


dayNameAbbrev [7]; 


deftitle[3]; 
*title; 
emphasised; 


region to draw for each month, tl==tl of month title line 
use to print title 
current cursor pos x,y & month & year 


day number in month, 0 to 30, negative days are possible 


as opposed to last year & next year 
as opposed to last month & next month 
TODAY 

year of the tl month on display 
2*char width of bold font for today 


ist letters of days of week, 
default title 


starting at startOfWeek 


keeping track of whether it is already emphasised 


IN_CALIMG img; 


INT bmid; 
} 
} 


Property 


cal 


cal 


cal 


cal 


cal 


cal 


cal 


cal 


cal 


cal 


cal 


cal 


cal 


cal 


img. 


img. 


img. 


img. 


img. 


img 


img. 


img 


img. 


img. 


img. 


img. 


img. 


img. 


rect 


title_rect 


crs 


day 


startOfWeek 


-thisyear 


thismth 


.-thisday 


ystart 


bwidth 


filler 


dayNameAbbrev 


deftitle 


title 


calimg.emphasised 


calimg.img 


calimg.bmid 


6-4 


bitmap ID for all days in a month 


defines the drawing region for each month in the calendar view - used 
internally. 


defines the drawing region for the calendar title - used internally. 


the cursor coordinates in the current month - (0,2) for example defines a cursor 
at the intersection of column one and row three. 


the day number of the current day in the range 0 to 30 where 0 is the first of the 
month. 


the day number (in the range 0 to 6 where 0 is Monday) of the first day of the 
week. This is usually 0 on UK machines. 


the year number for today - where today is determined by a call to p_date - in 
the range 0 to 254 inclusive where 0 is 1900. 


the month number for today in the range 0 to 11 inclusive where 0 is January. 


the day number for today in the range 0 to 30 inclusive where 0 is the first of 
the month. 


the year number of the first month in the calendar view - the first month is in 
the top left corner. 


two times the width of a bold numeric character in the day font - this is the 
width of the day symbol when the day is ‘today’. 


used internally. 


contains the first letter of each day with the first element corresponding to the 
day in calimg.startofWeek. On UK machines the first element usually 
contains 'M’. 


the default format string for the calendar title - i.e. "%Y". 


the format string for the calendar title - nun1 indicates that the format string is 
to be read from calimg.deftitle. 


All occurrences of %Y and %y are replaced with the appropriate year(s). All 
occurrences of %% are replaced with %. All other occurrences of % are 
ignored. 


Thus "A& silly %% example %Y title" generates "A silly % example 1994 
title" in 1994 and "A silly % example 1994-1995 title" in 1994-1995. 


TRUE if the calendar is emphasised, and rause otherwise. 


data passed to the ci_init method: see the description of the ci_init method 
for details of the fields. 


ID of a bitmap - the bitmap is for internal use only. 


6 THE CALENDAR IMAGE CLASS 


CALIMG methods 


DESTROY Destroy the calendar 


VOID destroy (VOID) 

Destroy the caLime instance. 

If calimg.emphasised is TRUE, the method erases the text cursor. 

If calimg.title is non-zero, the method frees the cell with address calimg.title. 


The method then frees the bitmap with ID calimg.bmid and supersends a DESTROY message. 


Cl_INIT Initialise the calendar 
VOID ci_init (IN_CALIMG *init) 

Initialise the instance of caLimc according to the content of the 1n_cauime structure pointed to by init. 
The tn_catince structure is defined as follows: 


typedef struct 
{ 
UWORD wid; 
UWORD width; 
P_POINT tl; 
UBYTE mrow; 
UBYTE mcol; 
UWORD flags; 
CI_FONT_DATA title; 
CI_FONT_DATA month; 
CI_FONT_DATA dow; 
CI_FONT_DATA day; 
UWORD daygap; 
UBYTE mthgapx; 
UBYTE hscrilm; 
UWORD startm; 
ULONG days; 
CI_EXT_FONT font; 
} IN_CALIMG; 


The significance of the members of the 1n_cauine structure is as follows: 


wid specifies the ID of the window which provides the drawing region. 

width specifies the width in pixels of the drawing region. 

ED specifies the gutter dimensions. 
the x member specifies the width in pixels of the left and right gutters and must not be less 
than 3. 
the y member specifies the height in pixels of the top and bottom gutters and must not be less 
than 3. 

mrow specifies the number of rows in the calendar view. 

mcol specifies the number of columns in the calendar view. 

flags an ored combination of flags: see below for the available flags. 

title specifies the font characteristics of the main title. A description of the c1_FonT_INFo 


structure may be found below. 


month specifies the font characteristics of the month title. A description of the c1_FonT_INFo 
structure may be found below. 


dow specifies the font characteristics of the days of the week title. A description of the 
CI_FONT_INFo structure may be found below. 


FORM REFERENCE 


day specifies the font characteristics of the day of the month numbers. A description of the 
CI_FONT_INFo structure may be found below. 


daygap specifies a character, the width of which in the day number font and style, defines the spacing 
between day numbers. 


mthgapx _ specifies the horizontal pixel separation between adjacent months. 


hserlm specifies the default granularity for scrolling horizontally by month: should be divisible by 
the total number of months in the calendar view. 


startm specifies the month number of the first month that appears in the top left corner of the 


calendar. 
days specifies the current date expressed as the number of days elapsed since 1/1/1900. 
font specifies additional font information for the main title, month title, days of the week title and 


the day of the month numbers. This information includes the line heights and line ascents as 
described below. 


The flags member of the c1_1n1T structure may contain an ored combination of the following flags: 


CALIMG_CURSOR_NO_FLASH draw a non-flashing cursor indicating the current day. The default is a 


flashing cursor. 


CALIMG_DOW_EVERY_ROW specifies that the days of the week title is to be included only in the first 


row of months. This flag must be set on the Series 3a when two rows of 
months are required otherwise the calendar view will be too large for the 
screen. 


FONT_DATA_KNOWN indicates that the line heights and ascents are specified in init->font. 


Otherwise the method overwrites font with default values. 


The c1_ExtT_ront structure specifies the line heights and line ascents in the calendar view. It is defined as 


follows: 


typedef 


UBYT 


} Cl 


struct 


title_ascent; 
title_lht; 
dow_ascent; 
dow_lht; 
mth_ascent; 
mth_lht; 
day_ascent; 
day_lht; 
daygapx; 
daywidth; 
_EXT_FONT; 


The significance of the members of the c1_zxT_FonT structure is as follows: 


title_ascent specifies the ascent in pixels of the calendar title. 


title_lht 
dow_ascent 
dow_lht 
mth_ascent 
mth_lht 


day_ascent 


day_lht 
daygapx 


daywidth 


specifies the height in pixels of the calendar title. 

specifies the ascent in pixels of the days of the week title. 
specifies the height in pixels of the days of the week title. 
specifies the ascent in pixels of the month title. 

specifies the height in pixels of the month title. 

specifies the ascent in pixels of a day of the month number. 
specifies the height in pixels of a day of the month number. 
specifies the gap between adjacent days of the month. 


specifies the width of a day of the month number i.e. two times the width of a numeric 
character. 


6 THE CALENDAR IMAGE CLASS 


The c1_Font_inro structure which is used to specify the appearance of all text displayed in the calendar is 
defined as follows: 


typedef struct 
{ 
WORD fid; 
UWORD style; 
UWORD leading; 
} CI_FONT_DATA; 
The significance of the members of the c1_FonT_inFo structure is as follows: 
fid specifies the font ID of the text. 
style specifies the style of the text. 


leading specifies the leading - i.e. vertical spacing - below the text. 


If the total number of months in the calendar as specified by init->mcol*init—>mrow exceeds 
CI_MAx_montH the method calls p_leave with an argument of &_cGEN_ToomaNY. 


The method initialises the property according to the content of the c1_1nrT structure with address init as 
described above. 


If init->hscr1m is greater than the total number of months in the calendar as specified by init- 
>mcol*init->mrow then the method resets init->hscrim to the total number of months in the calendar. 


If init->startm is outside the allowed range of 0 to 11 inclusive, the method resets init->startm to 0. 


If the current month as specified by init->days is not included in the calendar view, the method adjusts 
init->startm appropriately. 


Write *init tO calimg.img. 


Cl_SET_TITLE Set the title 


VOID ci_set_title(TEXT *zts) 

Replace the calendar title with the zero terminated string pointed to by zts. 
The method frees the cell pointed to by calimg.title. 

If zts is NuLL the method writes zero to calimg.title. 


Otherwise the method allocates an appropriately sized cell and copies into the cell the title string pointed 
to by zts. The address of the cell is written to calimg.title. 


Cl_EMPHASISE Emphasise the view 


VOID ci_emphasise(UINT flag) 

Emphasise the calendar if f1ag is TRUE, otherwise de-emphasise the calendar. 

If f1ag is equal to calimg.emphasised the method simply returns as no change is required. 
Otherwise the method records the emphasis state by writing flag to calimg. emphasised. 


If calimg.img.flags does not contain cALIMG_CURSOR_NO_FLASH, and flag iS TRUE the method draws the 
cursor by calling wrextcursor. 


If calimg.img.flags does not contain cALIMG_CURSOR_NO_FLASH, and flag is raLsE the method erases the 
cursor by calling weraseTextCursor. 


FORM REFERENCE 


Cl_MOVE_CURSOR Move the cursor 


VOID ci_move_cursor(INT flag) 


Move the cursor to the position specified by f1ag and redraw the calendar view ensuring that the current 
date is visible. 


The allowed values of £1ag are as follows: 


CALIMG_GOTO_TODAY move the cursor to the date today - as stored by the machine - by sending seif a 
CI_GOTO_DATE message with appropriate arguments. 


CALIMG_LEFT move the cursor to the left one day by sending se1f a cI_Pos_mxy message 
specifying calimg.img.hscrim as the scroll increment. If the resulting cursor 
position is not valid, move the cursor to the last day of the month. 


CALIMG_RIGHT move the cursor to the right one day by sending se1f a cI_Pos_mxy message 
specifying calimg.img.hscrim as the scroll increment. 


If the cursor is either on the last day of the month or in the last column of the 
month the method moves the cursor rightwards into the first column of the next 
month. 


If this is not a valid day, the method then moves the cursor upwards until a 
valid day is found. 


CALIMG_UP move the cursor up one day by directly calling the ci_pos_mxy member function 
specifying mco1 as the scroll increment. 


CALIMG_DOWN move the cursor down one day by directly calling the ci_pos_mxy member 
function specifying mco1 as the scroll increment. 


CALIMG_HOME move the cursor horizontally to the left most day in the calendar view by 
directly calling the ci_pos_mxy member function. 


CALIMG_END move the cursor horizontally to the right most day in the calendar view by 
directly calling the ci_pos_mxy member function. 


CALIMG_PAGEUP move the calendar view and the cursor backwards in time by 
calimg.img.mrow*calimg.img.mcol months by directly calling the ci_pos_mxy 
member function. 


CALIMG_PAGEDN move the calendar view and the cursor forwards in time by 
calimg.img.mrow*calimg.img.mcol months by directly calling the ci_pos_mxy 
member function. 


CALIMG_PREV_DAY move the cursor backwards in time one day by sending self a CI_ADJUST_DATE 
message specifying a scroll increment of calimg.img.hscrim. 


CALIMG_NEXT_DAY move the cursor forwards in time one day by sending self a CI_ADJUST_DATE 
message specifying a scroll increment of calimg.img.hscrim. 


CALIMG_PREV_MONTH move the cursor backwards in time by one month by sending self a 
CI_ADJUST_DATE message specifying a scroll increment of calimg.img.hscrim. 


CALIMG_PREV_YEAR move the cursor backwards in time by one year by sending self a 
CI_ADJUST_DATE message specifying calimg.img.mrow*calimg.img.mcol as the 
scroll increment. 


CALIMG_NEXT_MONTH move the cursor forwards in time by one month by sending self a 
CI_ADJUST_DATE message specifying a scroll increment of calimg.img.hscrim. 


CALIMG_NEXT_YEAR move the cursor forwards in time by one year by sending self a 
CI_ADJUST_DATE message specifying calimg.img.mrow*calimg.img.mcol as the 
scroll increment. 


6 THE CALENDAR IMAGE CLASS 


CALIMG_PREV_WEEK move the cursor backwards in time one week by sending self a 
CI_ADJUST_DATE message specifying a scroll increment of calimg.img.hscrim. 


CALIMG_NEXT_WEEK move the cursor forwards in time one week by sending self a CI_ADJUST_DATE 
message specifying a scroll increment of calimg.img.hscrim. 


Note that both the ci_adjust_date and the ci_pos_mxy methods redraw the calendar view once the cursor 
has been repositioned. 


Cl_GOTO DATE Move the cursor by date 


VOID ci_goto_date(CI_DATE *pdate) 


Move the cursor to the date specified by the c1_pate structure pointed to by pdate and redraw the 
calendar view ensuring that the current date is visible. 


The c1_pate structure is defined as follows: 


typedef struct 
{ 
WORD year; 
WORD month; 
WORD day; 
}CI_DATE; 


The significance of the members of the c1_pate structure is as follows: 


year The candidate year number in the range 0 to 254 inclusive where 0 is the year 1900 - set to zero 
if a negative value is specified. 


month The candidate month number in the range 0 to 11 inclusive where 0 is January - set to the 
nearest limit if the specified value is outside of the allowed range. 


day The candidate day number in the range 0 to 30 inclusive where 0 is the first of the month - set 
to the nearest valid day in the month if the specified value is not a valid day. Note of course that 
the last valid day number may be less than 30. 


The method updates calimg.crs according to the values specified in pdate and then updates the view by 
sending self a CI_vIEW message specifying a scroll increment of calimg.img.hscr1m. 


Cl_ADJUST_DATE Adjust the current date 


VOID ci_adjust_date(CI_DATE *pinc, INT flag, INT hscrl1m) 


Move the cursor forwards or backwards in time as specified by pinc and flag and redraw the calendar 
view ensuring that the current date is visible specifying a scroll increment of hscrim. 


The action is controlled by writing one of the following values to £f1ag: 

CALIMG_ADJ_YEAR adjust the year, the month and the day. 

CALIMG_ADJ_MONTH adjust the month and the day. 

CALIMG_ADJ_DAY adjust the day. 

The year is adjusted by moving the cursor forwards or backwards in time by pinc->year years. 


The month is adjusted by moving the cursor forwards or backwards in time by pinc->month months and if 
the cursor is not on a valid day moving the cursor to the last day of the month. 


The day is adjusted by moving the cursor forwards or backwards in time by pinc->day days. 


Note that if the cursor moves to a year that is out of range the method beeps and then returns without 
modifying the property. The method call thus has no effect. 


The method draws the view by sending self a cI_viEw message specifying a scroll increment of hscrim. 


FORM REFERENCE 


Cl_REDRAW Redraw part of the view 


VOID ci_redraw(P_RECT *prect) 
Redraw calendar months that overlap the rectangle defined by prect. 


If calimg.img. flags contains CALIMG_CURSOR_NO_FLASH, and the current cursor position is visible, draw 
an appropriately sized inverted obloid at the current cursor position. (Otherwise the system takes care of 
drawing the flashing cursor.) 


Cl_SENSE Sense the current date 


VOID ci_sense(ULONG *psense) 


Write the current date to the uLonc pointed to by psense. The current date is expressed as the number of 
days elapsed since 1/1/1900. 


Cl_VIEW Draw the view 


VOID ci_view(INT hscrlm) 
Draw the calendar view ensuring that the current date is visible specifying a scroll increment of hscrim. 


The method sets the first month in the calendar view as specified by calimg.img.startm and 
calimg.ystart and then scrolls the calendar view forwards or backwards in time an integral multiple of 
hscrim months until the current date is included in the calendar view. 


On occasion this will lead to months outside the allowed date range being included. In such cases the 
method sets the first month in the calendar view as specified by calimg.img.startm and 
calimg.crs.year and then repeats the above algorithm. 


The method then draws the calendar view, using the wscrol1Rect routine whenever possible. 


Cl_POS MXY Move the cursor by position 


VOID ci_pos_mxy(CI_CURSOR *pcrs,INT gravity,INT scrl) 


Move the cursor to the year, month and coordinates specified by the c1_cursor structure with address 
pers Specifying a scroll increment of scr1. 


Note that if the coordinates within the month do not correspond to a valid day the method moves the 
cursor according to the value of gravity until a valid day is located. 


The c1r_cursor structure is defined as follows: 
typedef struct 
{ 
UBYTE year; 
UBYTE month; 
P_POINT pos; 
} CI_CURSOR; 
The significance of the members of the c1_cursor structure is as follows: 
year the year number in the range 0 to 254 inclusive where 0 is the year 1900. 
month — the month number in the range 0 to 11 inclusive where 0 is January. 


pos an x,y position within a month: the third day on the second row for example has position (2,1). 


If pcrs->pos.x is less than zero, the method resets pcrs->pos.x to 6, and moves the cursor backwards in 
time one month. 


If pcrs—->pos.x 1s greater than 6, the method resets pcrs->pos.x to 0, and moves the cursor forwards in 
time one month. 


If pcrs->pos.y is less than zero, the method resets pcrs->pos.y to 6, and moves the cursor backwards in 
time calimg.img.mcol months. 


6 THE CALENDAR IMAGE CLASS 


If pcrs->pos.y is greater than 5, the method resets pcrs->pos.y to 0, and moves the cursor forwards in 
time calimg.img.mcol months. 


If as a result of one of the above tests the year exceeds 2154, the method beeps and then returns. 


If the coordinates specified by pcrs->pos do not correspond to a valid day in the current month, the 
method moves the cursor in the manner indicated by gravity until a valid day is located. The allowed 
values for gravity are as follows: 


CALIMG_NORTH move the cursor upwards in the calendar until a valid day is located. 


CALIMG_WEST if the cursor is in the bottom row of the current month, the bottom row contains no 
valid days and the cursor lies to the right of the last day of the month, move the cursor 
to the last day of the current month. 


otherwise if the cursor is in the bottom row of the current month and the bottom row 
contains no valid days move the cursor to the first day in the last valid row of the 
current month i.e. to coordinates (0,4), or (0,3) if (0,4) is not valid. 


otherwise move the cursor leftwards in the calendar view until a valid day is located. 
CALIMG_SOUTH move the cursor downwards in the calendar view until a valid day is located. 


CALIMG_EAST if the current position is in a bottom row of a month which contains no valid days, 
move the cursor to the last valid day of the month. 


otherwise move the cursor rightwards in the calendar view until a valid day is located. 


The method draws the view by sending self a cI_vIEw message specifying a scroll increment of scri. 


Cl_TODAY_CHANGED Update today's date 


VOID ci_today_changed (VOID) 
Update today's date and redraw the calendar as required. 


The method obtains the actual date by calling the p_date PLIB routine and then writes the year number to 
calimg.thisyear, writes the month number to calimg.thismth and writes the day number to 
calimg.thisday. 


The method redraws the calendar view as required to ensure that today's date is correctly highlighted. 


CHAPTER 7 


THE POLYTEXT CLASSES 


The Polytext classes are a set of classes for displaying text in a variety of window server fonts and styles. 
In addition, the classes also implement their own styles; for example, text can be displayed with an 
overstrike, a horizontal line through the text to implement "crossing out". 


Text may be wrapped into a number of lines where the line boundaries are defined by the application. 


FORM supplies three classes. The ptroot class is an abstract class which must be subclassed to provide a 
usable Polytext class. pTRooT contains a number of deferred methods which must be supplied by a 
subclass. 


PTSEG and PTFLAT subclass pTRooT and supply the required deferred methods. ptRoot itself can be seen as 
supplying the basic or common methods and properties needed to implement a fully functioning Polytext 
class. 


A number of terms and concepts are used in the description of these classes and it will be useful to give 
them here. 


A phrase describes a segment of text. It is a combination of the text itself and information which qualifies 
it, such as the length of text, the window server font to be applied; it is represented by a data structure of 
type PT_pHRASE. Note that a phrase can contain a maximum of PT_MAX_PHRASE_LEN characters. This and 
other symbols and structures can be found in the Polytext class definition in polytext.cl. 


Phrases are collected into a buffer in the order in which they would be displayed. pTRoot makes no 
assumptions about the way a buffer is implemented; this decision is left to a subclass. pTsEG implements a 
buffer as an instance of a vaxvar array while ptFrLat simply allocates a single cell and adds phrases in 
sequence into this cell. 


A line-table is built when text is wrapped into a number of lines with each line having a definite length. 
The table is a list of byte values containing the number of text characters within each line. The number of 
bytes in the table is, therefore, the same as the number of lines. 


The line-table, itself, is normally placed at the beginning of the buffer. The mechanism by which the 
line-table is inserted depends on the way the buffer is implemented. In ptszc, the first entry in the vaxvaR 
array is reserved for the table while in ptrat, the table together with a preceding byte containing the 
number of bytes in the table, is inserted directly at the start of the buffer causing any existing records to be 
shifted and the buffer to be re-allocated, if necessary. 


The Polytext classes are used as part of implementation of the Series 3a Agenda built-in application. 


Note that the classes themselves are only defined and implemented in the version of FORM as exists on 
the Series 3a. 


Precursors 


An understanding of the Polytext classes will be helped by a knowledge of: 
e =the p_enter and p_leave error handling services 
e the OLIB variable array class vaxvaR 


e the Window Server functions: gSetGc, gPrintBoxText, gClrRect and gFontInfo 


FORM REFERENCE 


Class diagram 


The following diagram covers the relationships between the Polytext classes which are discussed in detail 
in this chapter. The underlined classes are either discussed in another chapter of this manual or they refer 
to OLIB classes in which case they are all described in the OLIB Reference manual. 


“— 
— 


f — 
y Ptroot / 


* =3 
ia 
fee. Oe ae ee 
d piseg / C ptflat / 
es a ay 
Ne Ni 


“~~ 
— 


y vaxvar / 
~ ) 


Le 


— 


PTROOT 


PTROOT 


nphrases wwidth 
nchars imargin 


nlines ascent 


pt_add_phrase pt_init 
pt_wrap pt_reset 
pt_display_line pt_append 


pt_set_fonts pt_put_lintab 


pt_mod_by_num pt_pbuf 
pt_mod_by_attrib 

pt_find 

pt_inquire 


Class definition 


The prroot class subclasses root and is defined in the sub-category file polytext.cl (with generated header 
file polytext.g). 


CLASS polytext root 
{ 
DEFER pt_init 


DEFER pt_reset Reset entire polytext as just initialized 
DEFER pt_append for "internal" use — by ptroot only 

DEFER pt_put_lintab for "internal" use - by ptroot only 

DEFER pt_pbuf for "internal" use - by ptroot only 

ADD pt_add_phrase Add a phrase to end of polytext 

ADD pt_wrap re-wrap text based on changed conditions 
ADD pt_display_line Draw single line of polytext 

ADD pt_set_fonts set/reset all fonts per PT_FONT_SPEC array 
ADD pt_mod_by_num i.e. modify phrase descriptor by phrasenum 
ADD pt_mod_by_attrib i.e. modify descriptor if attribute matches 
ADD pt_find Return phrase number of next matching phrase 
ADD pt_inquire Return screen position of phrase 


CONSTANT 
{ 
PEF 
PIF 


PIF 


Ss 


ND_DEFAULT 
ND_BACKWARDS 
ND_CAN_STAY 


PT_STY_DEFAULT 


PT_s1 
PT_s1 
PT_S 
PT_S 
PT_S 


[TY_BREAK_AT_START 
[TY_BREAK_AT_END 

TY_OSTRIKE_ 
TY_OSTRIKE_ 
[TY_OVERSTRI 


XLEFT 
XRIGHT 
KE 


PT_MAX_PHRASE_LEN 


PT_DESCR_MOD_FONT 
PT_DESCR_MOD_WS_STYLE 
PT_DESCR_MOD_PT_STYLE 
PT_DESCR_MOD_ATTRIB 
PT_DESCR_MOD_TLEN 


} 


TYPES 
{ 


typedef struct 


type 


UWORD 
UBYTE 


def 


NT 


NT 
NT 


font_id; 
attrib; 


PT_FONT_SPEC; 


struct 


line; 

offset; 
width; 
PT_PHRASE_INFO; 


typedef struct 


UWORD 
UBYTE 
UBYTE 
UBYTE 
UBYTE 


font_id; 
ws_style; 
pt_style; 
attrib; 
tlen; 


} PT_PHRASE_DESCR; 


typedef struct 


PROPERTY 
{ 
UINT 
UINT 
UINT 
UINT 
UINT 
UINT 
} 


{ 


7 THE POLYTEXT CLASSES 


0x0000 Exec O_PT_FIND method in default mode 
0x0001 Execute O_PT_FIND method "descending" 
0x0002 Exec O_PT_FIND including start phrase 

0x00 Default polytext phrase style 

0x01 Start of phrase is acceptable wrap pt 

0x02 End of phrase is acceptable wrap point 

0x20 Extend overstrike to left 

0x40 Extend overstrike to right 

0x80 Overstrike displayed text 

236 Max text bytes in one phrase 
0x0001 Modify font in phrase descriptor 
0x0002 Modify style in phrase descriptor 
0x0004 Modify style in phrase descriptor 
0x0008 Modify attrib (by phrase number only) 
0x0010 Modify text length (not implemented) 


font ID for corresponding ptxt phrase 
polytext phrase attribute 
polytext font specifier. 


Line number in which phrase starts 

Pixel offset to start of phrase 

Pixel width of the phrase 

Information returned by O_PT_INQUIRE method 


Font for this segment 
Window server style 
Polytext display style 

To be specified by caller 
Length of text in segment 
Phrase descriptor 


PT_PHRASE_DESCR descr; 
TEXT txt[1]; 
} PT_PHRASE; 


nphrases; 


nchars; 


nlines; 
wwidth; 
lmargin; 


ascent; 


Start of formatted text string. 


Phrase (descriptor plus text) 


Number of phrases in polytext 

Total number of chars in entire polytext 
(bytes) in line-length table 
Width used for last wrap 

Left margin for text display 

Ascent for text display 


Number of lines 


FORM REFERENCE 


Property 

pt root .nphrases The total number of phrases represented by this instance. 

ptroot .nchars The total number of characters represented by this instance. 

ptroot.nlines This property is of interest when the text represented by this instance has 
been wrapped; it is the number of lines into which the text has been 
wrapped. 

ptroot .wwidth The maximum width of a line, in pixels, available for displaying text. This 
property is important when text is being wrapped. This value excludes the 
width of the left-hand margin, if any. 

ptroot.lmargin The width of the left-hand margin, in pixels. Text is wrapped so that it fits 
between the left-hand margin and the right-hand margin. The right-hand 
margin is ptroot .wwdith pixels from the left-hand margin. 

ptroot.ascent Ascent for text display. This is the distance between the base line of the text 


and the top of the rectangle or "box" within which the segment of text is 
drawn and is specified by the application. For more information on this 
concept, see the description of the gprintBoxText function in the Graphics 
Output chapter of the Window Server Reference. 


PTROOT methods 
PT ADD PHRASE Add phrase to buffer 


INT pt_add_phrase (PT_PHRASE_DESCR *pd, TEXT *txt); 
Add a phrase to the buffer. 
The method takes two parameters: 


¢ pd points to a data structure of type pT_PHRASE_DESCR which contains information describing this 
phrase, for example, the length of the text and the ID of the font to be applied. 


e txt holds the address of a buffer containing the text of the phrase to be added. 


The method takes the text and the phrase description supplied in the parameters and builds a Rc_vaxvar 
type data structure representing the data to be added to the buffer. The rc_vaxvar structure is defined in 
the ors class vaxvar but is shown below: 


typedef struct 
{ 
UWORD len; 
UBYTE *buf; 
} RC_VAXVAR 


The method constructs a pT_pHRasE record, fully describing the phrase, and sets the address of this record 
into the member buf. 


The member 1en contains the length of the data represented by this pt_pHrRass record. 


The length of text in a single phrase is limited to pt_max_PHRASE_LEN characters. Thus, if more than 
PT_MAX_PHRASE_LEN characters are passed to this method, then a number of pt_purasz records will be 
created. In practice, no more than two records can ever be created. 


New ptT_PuRASE records are added to the buffer by sending one pt_puT_APPEND message per record. The 

pt_put_append method is a deferred method and must be supplied by a subclass. The implementation of 
this method depends on the way the buffer itself is implemented, as discussed in the introduction to this 

chapter. The ptriat and ptszc sub-classes supply a suitable method. 


As new phrases are added to the buffer, the method updates the properties ptroot .nchars and 
ptroot .nphrases, the total number of characters and the total number of phrases respectively. 


The method always returns zero. 


7 THE POLYTEXT CLASSES 


PT_WRAP Wrap the text 


INT pt_wrap(INT maxwidth, INT margin, UWORD wrapflag); 
Wrap the text represented by this instance and return the number of lines generated. 
The method takes three parameters: 


@ maxwidth is a value which gives the maximum length of each line in pixels. This value includes 
the length of the left hand margin (if any). 


@ margin is a value which gives the width of the left hand margin in pixels. 
@ wrapflag is a value which can take the value TRUE Or FALSE. 


The method wraps the text represented by this instance by reading through all phrases held in the buffer 
(by sending a series of ptT_pBuF messages) and fitting the text into lines whose pixel width is given by the 
value of maxwidth - margin. The result of the wrapping process is a line-table as described in the 
introduction to this chapter. The method returns the number of lines generated. 


Note that pt_pburf is a deferred method and must be supplied by a subclass. The implementation of this 
method depends on the way the buffer itself is implemented as discussed in the introduction to this 
chapter. The ptriat and prsec sub-classes supply a suitable method. 


If wrapflag 1s TRUE, the method will wrap the text into as many lines as necessary. 


If, however, wrapflag 1S FALSE, an attempt is made to fit the text into a single line; if necessary the text is 
clipped to fit into the available width. In this case, the method always returns a value of one. 


As new lines are added to the line-table, the method updates the property pt root .nlines, the number of 
lines into which the text has been wrapped. 


Once the line-table is complete, a pT_puT_LINTAB message is sent to add the line-table to the buffer. 
pt_put_lintab is a deferred method and must be supplied by a subclass. The implementation of this 
method depends on the way the buffer itself is implemented, as discussed in the introduction to this 
chapter. The ptriat and ptszc sub-classes supply a suitable method. 


PT DISPLAY LINE Draw a line of text 


VOID pt_display_line(P_RECT *prect,INT ascent,UINT displine) ; 


Draw a single line of text to the screen 
The method takes three parameters: 


¢ prect points to data structure of type p_REct and describes a rectangle within which the line of 
text is to be drawn. 


@ ascent is as used by the window server function gPrintBoxText. It measures the required 
distance between the base line of the text and the top of the rectangle within which the text is to 
be drawn. 


@ displine is the number of the line to be drawn and is used as an index into the line-table. This 
assumes that the text has previously been wrapped. 


If no phrases exist or the number of the line to be displayed is invalid, the pixels within the specified 
rectangle are cleared and the method returns. 


The phrases corresponding to the line to be displayed are fetched in turn from the buffer using the 
pt_pbuf deferred method. For each phrase fetched, the window server function gsetcc is called to switch 
the graphics context font and style to that specified by the phrase. The method assumes that a temporary 
graphics context has already been created by the application. The window server function gPrintBoxText 
is used to display the text within each phrase. 


If a phrase has the Polytext style pT_sty_OVERSTRIKE Set, a horizontal "line", two pixels deep, is drawn 
through the text. The "line" itself is drawn by clearing the top line of pixels and by setting the bottom line 
of pixels. 


FORM REFERENCE 


PT SET FONTS Set font ID 


VOID pt_set_fonts(UINT count, PT_FONT_SPEC *pfspec0O); 
Set the font ID for phrases in the buffer. 
The method takes two parameters: 
® pfspecd iS a pointer to an array of ptT_FonT_spec data structures. 


¢ count contains the number of entries in the array of pT_ronT_sprc data structures whose address 
is passed in the parameter pfspeco. 


As can be seen in the prroot class definition, each element in the array of pt_ront_spec data structures 
consists of a member (attrib) containing a set of Polytext attributes and a member (font_id) containing 
a font ID. 


The method scans through all the phrases in the buffer; for each phrase, all elements in the pT_ronT_sPEC 
array are examined. Where the Polytext attributes of the phrase match an element's attributes, the font ID 
in the phrase is replaced by that in the pt_rontT_sPzEc element and scanning then continues with the next 
phrase in the buffer. 


Note that the attributes of the phrase will match the pt_ront_spec element's attributes, if a logical AND of 
the two sets results in a TRUE value. 


As a result of this method, some or all of the phrases in the buffer will have new font IDs. It is also 
possible that none of the phrases will be changed. 


PT_MOD_BY_NUM Set font ID and style by phrase 


VOID pt_mod_by_num(UINT phrasenum, PT_PHRASE_DESCR *pdescr,UWORD flags); 
Set the font ID and graphic styles for a specific phrase. 
The method takes three parameters: 


@ phrasenum is an index which identifies the exact phrase within the buffer. A value of one refers 
to the first phrase while a value of two refers to the second and so on. 


@ pdescr points to a data structure of type pT_PHRASE_DEScR and contains the font-id, window 
server style, polytext style and attribute to be set into the phrase. 


lags contains a set of bit values which can be ored together; it indicates which item(s) in the 
phrase descriptor is(are) to be set. The possible values are as follows: 


e 
im) 


PT_DESCR_MOD_FONT 


PT_DESCR_MOD_WS_STYLE 


PT_DESCR_MOD_PT_STYLE 


PT_DESCR_MOD_ATTRIB 


If phrasenum contains an invalid value (i.e. zero or a value greater than the total number of phrases in the 
buffer), the method does nothing and simply returns. 


The address of the specific phrase within the buffer is found by sending a pt_pBur message and passing 
phrasenum as an argument. Recall that pt_pbur is a deferred method and must be supplied by a subclass. 
The implementation of this method depends on the way the buffer itself is implemented as discussed in 
the introduction to this chapter. The ptriat and prssc sub-classes supply a suitable method. 


7 THE POLYTEXT CLASSES 


Depending on the setting of the f1ags parameter, corresponding members referenced by the pdescr 
parameter replace the equivalent members in the phrase descriptor as follows: 


PT_DESCR_MOD_FONT causes the phrase’s font_ia member to be replaced by 
pdescr->font_id. 


PT_DESCR_MOD_WS_STYLE causes the phrase's ws_style member to be replaced by 
pdescr-—>ws_style. 


PT_DESCR_MOD_PT_STYLE causes the phrase's pt_style member to be replaced by 
pdescr->pt_style. 


PT_DESCR_MOD_ATTRIB causes the the phrase's attrib member to be replaced by 
pdescr->attrib. 


PT MOD BY_ ATTRIB Set font ID and style by attribute 


VOID pt_mod_by_attrib( PT_PHRASE_DESCR *pdescr,UWORD flags) ; 
Set the font ID and graphic styles for phrases within the buffer. 
The method takes two parameters: 


@ pdescr points to a data structure of type pT_PHRASE_DESCR and contains the font-id, window 
server style and polytext style to be set into the phrase(s). It also contains the attributes to be used 
to find matching phrases. 


e 
mu) 


lags contains a set of bit values which can be ored together; it indicates which item(s) in the 
phrase descriptor is(are) to be set. The possible values are as follows: 


PT_DESCR_MOD_FONT 


PT_DESCR_MOD_WS_STYLE 


PT_DESCR_MOD_PT_STYLE 


The method scans through all the phrases in the buffer by sending successive pt_pBur messages. Where 
the Polytext attributes of the phrase match the attributes referenced by the pdescr parameter, 
corresponding members referenced by the pdescr parameter replace the equivalent members in the phrase 
descriptor, depending on the setting of the f1ags parameter as follows: 


PT_DESCR_MOD_FONT causes the phrase's font_ia member to be replaced by 
pdescr->font_id. 


PT_DESCR_MOD_WS_STYLE causes the phrase's ws_style member to be replaced by 
pdescr-—>ws_style. 


PT_DESCR_MOD_PT_STYLE causes the phrase's pt_style member to be replaced by 
pdescr->pt_style. 


Note that the attributes of the phrase will match the attributes referenced by pdescr, if a logical AND of 
the two sets results in a TRUE value. 


PT_FIND Find phrase by attribute 


INT pt_find(UINT phrase0,UWORD flags,UWORD attrib); 
Find the next phrase whose attributes match a given set and return its index. 
The method takes three parameters: 
¢ phraseo Is the index of the phrase within the buffer where the search is to begin. 
@ flags contains indicators which determine: 
1. whether or not the search process is to include the phrase represented by phraseo. 
2. the direction of search, i.e. forwards or backwards. 


¢ attrib contains the attributes to be matched with the phrase attributes. 


FORM REFERENCE 


The method scans each phrase in the buffer, beginning with the phrase whose index (or relative position 
within the buffer) is given by phraseo, until the Polytext attributes of the phrase match the attributes given 
by the attrib parameter. 


The index of the resulting phrase is returned. If no matching phrase can be found, a value of -1 is returned 
instead. 


Note that if pT_rIND_BACKWARDS is set in the flags parameter, the search is done backwards from the 
phrase indicated by phraseo. Further, if pt_r1np_can_stay is set, the search includes the phrase indicated 
by phraseo; otherwise, it is excluded. 


PT_INQUIRE Find information about a phrase 
INT pt_inguire(INT phrasenum, PT_PHRASE_INFO *pinfo); 
Fetch information about a given phrase. 
The method takes two parameters: 
@ phrasenum is the index of the phrase, i.e. the relative position of the phrase within the buffer. 
¢ pinfo points to a PT_PHRASE_INFo data structure to be filled in by the method. 


If no phrases exist or the parameter phrasenum contains an invalid value (i.e. zero or a value greater than 
the total number of phrases in the buffer), then a value of -1 is returned. 


The method sends pt_ppur messages to fetch the line-table and the given phrase and, using this 
information, fills in the pr_pHRASE_1NFo data structure. 


The pt_PHRASE_INFo data structure has three members described as follows: 
line The number of the line within which the given phrase will be displayed. 
offset The offset, in pixels, of the start of the given phrase from the beginning of the line. 
width | The width, in pixels, of the given phrase. 


On successful completion, the method returns zero. 


PTROOT deferred methods 
PT_INIT Initialise 


INT pt_init (UINT granularity) 
A deferred method for initialising the instance. 


The method should handle a single parameter specifying the granularity of the buffer. The way this value 
is used will depend on the way the buffer is implemented. In very general terms, the size of a buffer 
should always be some multiple of the granularity. 


The method is not used in this class 


PT_RESET Reset 
VOID pt_reset (VOID) 
A deferred method for resetting the instance back to its initialised state. 


The method is not used in this class. 


7 THE POLYTEXT CLASSES 


PT_APPEND Append a record 


VOID pt_append(RC_VAXVAR *pdescr) 
A deferred method for adding phrases to the buffer 


The method should handle a single parameter. This is a pointer to a data structure of type Rc_vAXvAR 
containing the address of the phrase to be added to the buffer and the total length of this phrase (a 
PT_PHRASE data structure). 


The way this parameter is used will depend on the way the buffer is implemented. 


The method is used in this class by the pt_add_phrase method. 


PT_PUT_LINTAB Store line-length table 


VOID pt_put_lintab(UBYTE *plinetable) 
A deferred method for inserting the line-table into the buffer. 
The method should handle a single parameter which is a pointer to the line-table itself. 


The ptroot methods assume that the line-table is always located at the beginning of the buffer and regards 
it as being phrase zero; in other words, the address of the line-table can be found by sending a pt_pBuF 
message with an argument of zero. 


The method is used by the pt_wrap method. 


PT_PBUF Get address of phrase 


PT_PHRASE *pt_pbuf (UINT recnum) 
A deferred method for obtaining the address of a phrase in the buffer. 


The method should handle a single parameter. This is the index of the phrase; in other words, it is the 
relative position of the phrase within the buffer. A value of one refers to the first phrase while a value of 
two refers to the second phrase and so on. Note, however, that a value of zero refers to the line-table. 


The method is used by the following methods: pt_wrap, pt_display_line, pt_set_fonts, 
pt_mod_by_num, pt_mod_by attrib, pt_find, and pt_inquire. 


PTFLAT 


PTROOT 


nphrases buffer 


nchars bufsize 


nlines granularity 


wwidth nextoff 
imargin 


ascent 


pt_add_phrase destroy 
pt_wrap pt_init 
pt_display_line pt_reset 
pt_set_fonts pt_append 
pt_mod_by_num pt_put_lintab 
pt_mod_by_attrib pt_pbuf 
pt_find 

pt_inquire 


FORM REFERENCE 


PTFLAT 1s a subclass of pTRoot. It implements the buffer as a single memory cell. Phrases are simply 
appended to the end of the cell as they are received. The line-table is inserted at the beginning of the cell. 


If the cell proves too small to contain extra phrases, it is simply re-allocated. Extra property is provided by 
this subclass to control access to this cell and is detailed in the property section below. 


All methods deferred by ptroot are supplied here. 


Class definition 


The ptriat class subclasses prroot and is defined in the sub-category file polytext.cl (with generated 
header file polytext.g). 


CLASS ptflat ptroot 
{ 
REPLACE destroy 
REPLACE pt_init 
REPLACE pt_reset 


REPLACE pt_append for "internal" use — by ptroot only 
REPLACE pt_put_lintab for "internal" use - by ptroot only 
REPLACE pt_pbuf for "internal" use - by ptroot only 
PROPERTY 


{ 
UBYTE *buffer; 
UWORD bufsize; 
UWORD granularity; 
UWORD nextoff; 
} 

} 


Property 

ptflat.buffer The address of the allocated cell containing the buffer. 

ptflat.bufsize The size, in bytes, of the allocated cell containing the buffer. 

ptflat.granularity The granularity of the buffer in bytes. 
The cell in which the buffer resides is always allocated in exact multiples of 
the granularity. If necessary, the size of the buffer is always rounded up to 
the next multiple of the granularity. 

ptflat.nextoff The offset, from the beginning of the cell, to the next available position 


within the buffer. 


PTFLAT methods 
DESTROY Destroy the instance 


VOID destroy (VOID) 
Destroy this instance of pTFLaT. 


The method frees the allocated cell which contains the buffer and then supersends a pEsTRoy message. 


PT_INIT Initialise 


INT pt_init(UINT granularity) 
Initialise this instance of PTFLAT. 


The method takes a single parameter; granularity specifies the granularity of the buffer. The buffer is 
contained within a cell which is always allocated in multiples of this value. 


The method takes the value of this parameter and sets it into the property pt flat.granularity. 


7 THE POLYTEXT CLASSES 


A minimum buffer is constructed by allocating a cell of size pt flat .granularity; its address is set into 
the property pt flat .buffer and its current size set into the property pt flat .bufsize. The buffer will be 
expanded (i.e. re-allocated), as necessary by other ptrLat methods. 


In this subclass, the first byte of the buffer is used to contain the number of bytes allocated to the 
line-table; the line-table itself, will always follow this single byte and will precede the sequence of 
phrases. As part of the initialisation process, the first byte is set to zero, indicating that there is no 
line-table. The property pt flat .nextoff, containing the offset of the next free byte in the buffer, is 
initialised to one. 


p_leave Is called if there is insufficient memory to allocate the minimal buffer, otherwise the method 
returns zero. 


N.B. the property ptroot.nlines will always contain the current number of lines into which the text is 
wrapped and will, therefore, give the current number of entries used in the line-table. This will not 
necessarily be the same as the value in the first byte of the buffer. 


In general, the value of ptroot .nlines will always be less than or equal to the value in the first byte of 
the buffer. 


PT RESET Reset 


VOID pt_reset (VOID) 
Reset the instance back to its initialised state. 


The method effectively resets a number of pt root properties, re-allocates the buffer to its minimal size 
and initialises it in the same way as described in the pt_init method. In effect, the method "empties" the 
PTFLAT Object of all text and deletes any existing line-table. 


The properties which are reset to zero are: ptroot .nphrases, ptroot.nchars, ptroot.nlines and 
ptroot.wwidth. 


PT_APPEND Append a phrase 


VOID pt_append(RC_VAXVAR *pdescr) 
Append a phrase to the buffer. 


The method takes a single parameter; pdescr points to a data structure of type Rc_vaxvar. The members 
of this structure, 1en and buf, contain the length of the phrase and a pointer to the phrase content (a 
PT_PHRASE data structure) respectively. The Rc_vaxvar structure can be found in the OLIB vaxvar class 
definition. 


The phrase data is appended to the end of the buffer. If necessary, the buffer is re-allocated to 
accommodate the new data and the pt flat .nextoff property is updated to point to the next free byte. 


PT_PUT_LINTAB Store line-length table 


VOID pt_put_lintab(UBYTE *plinetable) 
Store the line-table in the buffer. 
The method takes a single parameter; plinetable contains the address of the line-table to be stored. 


The method inserts the line-table into the buffer so that it starts at the second byte; any existing line-table 
will be overwritten. If necessary, the buffer is re-allocated and any existing phrases moved to make room 
for the new table. If the space reserved for the line-table is increased, the first byte in the buffer will be 
updated to reflect the new size. 


FORM REFERENCE 


PT_PBUF Get address of phrase 


PT_PHRASE *pt_pbuf (UINT recnum) 
Fetch the address of the specified phrase within the buffer. 


The method takes a single parameter; recnum contains the index of the phrase whose address is required. 
In other words, it is the relative position within the buffer of the required phrase. 


If recnum is zero, the address of the line-table is returned; otherwise, the method returns the address of the 
required phrase. A recnum value of one causes the address of the first phrase to be returned, a value of two 
causes the address of the second phrase to be returned, and so on. 


Note, this method does not check that the value of recnum lies within sensible limits. If the value is greater 
than the number of phrases currently held in the buffer, an invalid address will be returned with 
unpredictable consequences. 


PTSEG 


PTROOT 


nphrases 
nchars 
nlines 
wwidth 
imargin 


ascent 


pt_add_phrase pt_init 
pt_wrap pt_reset 
pt_display_line pt_append 
pt_set_fonts pt_put_lintab 
pt_mod_by_num pt_pbuf 


pt_mod_by_attrib 
pt_find 
pt_inquire 


PTSEG is a subclass of pTRooT. It implements the buffer as an indexed array of variable length records, 
where each record is stored in its own heap cell. This is achieved by using an instance of the OLIB class 
vaxvar, where each entry in the array contains data relating to a single phrase. 


The use of a vaxvar object allows efficient random access to phrases and is suitable for a "medium" 
number of phrases or for a large number of phrases where the maximum number is known. 


The first entry (i.e. entry number 0) in the vaxvar array is always reserved for the line-table, while 
subsequent entries are used for the phrases themselves. 


All methods deferred by ptroot are supplied here. 


7 THE POLYTEXT CLASSES 


Class definition 


The prtssc class subclasses pTRoot and is defined in the sub-category file polytext.cl (with generated 
header file polytext.g). 


CLASS ptseg ptroot 
{ 
REPLACE pt_init 
REPLACE pt_reset 


REPLACE pt_append for "internal" use — by ptroot only 
REPLACE pt_put_lintab for "internal" use - by ptroot only 
REPLACE pt_pbuf for "internal" use —- by ptroot only 
PROPERTY 1 


{ 
PR_VAXVAR *phrases; 


} 
} 


Property 


ptseg.phrases The handle of an instance of a vaxvar class. The array is used to store 
phrase data. The first entry in the array is always reserved for the line-table. 


PTSEG methods 
PT_INIT Initialise 


INT pt_init (UINT granularity) 
Initialise this instance of ptszEc. 


The method takes a single parameter; granularity specifies the granularity of the vaxvar object which 
implements the buffer. 


The method creates an instance of vaxvar and sets the handle into the property ptseg. phrases. The 
vaxvar buffer object is initialised (with a granularity as specified in the parameter) by sending it a 
VA_INIT Message. 


A VA_APPEND message is then sent to the vaxvar buffer object to add a minimum sized entry (a single zero 
filled byte) to the array; this will be the first entry in the array and is reserved for the line-table. 


The method always returns zero. 


PT RESET Reset 


VOID pt_reset (VOID) 
Reset the instance back to its initialised state. 


The method effectively resets a number of ptroot properties and sends a va_RESET message to the vAxvaR 
buffer object to delete all entries from the array. 


A VA_APPEND message is then sent to add a minimum sized entry (a single zero filled byte) to the array; 
this will be the first entry in the array and is reserved for the line-table. 


In effect, the method "empties" the ptszc object of all text and deletes any existing line-table. 


The properties which are reset to zero are: ptroot .nphrases, ptroot.nchars, ptroot.nlines and 
ptroot.wwidth. 


FORM REFERENCE 


PT_APPEND Append a phrase 


VOID pt_append(RC_VAXVAR *pdescr) 
Append a phrase to the buffer. 


The method takes a single parameter; pdescr points to a data structure of type rc_vaxvar. The members 
of this structure, 1en and buf, contain the length of the phrase and a pointer to the phrase content (a 
PT_PHRASE data structure) respectively. The Rc_vaxvar structure can be found in the OLIB vaxvar class 
definition. 


The method simply sends a va_apPEND message to the vaxvar buffer object, passing pdescr as a 
parameter, to add a new entry containing the phrase data. 


PT PUT_LINTAB Store line-length table 
VOID pt_put_lintab(UBYTE *plinetable) 

Store the line-table in the buffer. 

The method takes a single parameter; plinetable contains the address of the line-table to be stored. 


The line-table is always inserted as the first entry in the vaxvar array which will have been reserved at 
initialisation time (by the pt_init method). 


The method builds a rc_vaxvar record descriptor; the buf member is set to point to the line-table while 
the 1en member is set to the length of the line-table (the value of pt root .nlines). 


The first entry in the array is replaced by the new line-table by sending a va_REPLACE message to the 
vaxvar buffer object, specifying record number zero and passing it the address of the record descriptor. 


PT_PBUF Get address of phrase 


PT_PHRASE *pt_pbuf (UINT recno) 
Fetch the address of the specified phrase within the buffer. 


The method takes a single parameter; recno contains the index of the phrase whose address is required. In 
other words, it is the relative position within the buffer of the required phrase. 


The method sends a va_pBur message to the vaxvar buffer object, specifying the record number recno; if 
recno is zero, the address of the line-table is returned - otherwise, the method returns the address of the 
required phrase. A recno value of one causes the address of the first phrase to be returned, a value of two 
causes the address of the second phrase to be returned, and so on. 


Note, this method will panic if the value of recno is greater than the number of phrases currently held in 
the buffer 


INDEX 


AO_ABRUN 
PAGES class method, 4-24 
AO_INIT 
PAGES class method, 4-21 
WRAP class method, 3-14 
AO_QUEUE 
PAGES class method, 4-24 
WRAP class method, 3-15 
AO_RUN 
PAGES class method, 4-23 
WRAP class method, 3-15 
buffer 
polytext classes, 7-1 
calendar image 
classes, 6-1 
CALIMG class 
CI_ADJUST_DATE method, 6-9 
CI_EMPHASISE method, 6-7 
CI_GOTO_DATE method, 6-9 
CI_LMOVE_CURSOR method, 6-8 
CI_POS_MXY method, 6-10 
CI_LREDRAW method, 6-10 
CI_SENSE method, 6-10 
CI_SET_TITLE method, 6-7 
CI_TODAY_CHANGED method, 6-11 
CI_VIEW method, 6-10 
CL_INIT method, 6-5 
DESTROY method, 6-5 
methods, 6-5 
oop, 6-1 
call back 
methods FORM library, 1-5 
CI_ADJUST_DATE 
CALIMG class method, 6-9 
CI_EMPHASISE 
CALIMG class method, 6-7 
CI_GOTO_DATE 
CALIMG class method, 6-9 
CI_LMOVE_CURSOR 
CALIMG class method, 6-8 
CI_POS_MXY 
CALIMG class method, 6-10 
CI_LREDRAW 
CALIMG class method, 6-10 
CI_SENSE 
CALIMG class method, 6-10 


CI_SET_TITLE 
CALIMG class method, 6-7 
CI_TODAY_CHANGED 
CALIMG class method, 6-11 
CI_VIEW 
CALIMG class method, 6-10 
CL_INIT 
CALIMG class method, 6-5 
class 
CALIMG, 6-1 
EPDOC document filter, 2-6 
EPDOC, 2-5 
EPDOC pagination property, 2-6 
EPFDOC, 2-14 
FORMDOC, 2-2 
mixin, 1-5 
PAGELAY, 4-46 
PAGES, 4-14 
PDR, 4-34 
PRINTER environment variables, 4-5 
printer layout SCRLAY, 3-2 
PRINTER, 4-2 
PRNLAY, 4-49 
PRNTPRV, 5-9 
PRVPDR, 5-2 
PTFLAT, 7-9 
PTROOT, 7-2 
PTSEG, 7-12 
screen layout SCRLAY, 3-2 
SCRIMG, 3-15 
SCRLAY data structure, 3-7 
SCRLAY font width tables, 3-8 
SCRLAY, 3-2 
SCRLAY screen diagram, 3-19 
SCRLAY special characters, 3-7 
SCRLAY text line diagram, 3-21 
WDR, 4-25 
WRAP, 3-14 
class diagrams 
FORM hierarchy, 1-3 
FORM library, 1-3 
classes 
FORM library overview, 1-1 
FORM using, 1-1 
mixin, 1-5 
DESTROY 
CALIMG class method, 6-5 
PDR class method, 4-37 
PRINTER class method, 4-6 
PTFLAT class method, 7-10 
SCRIMG class method, 3-19 
SCRLAY class method, 3-10 
WDR class method, 4-29 
document filter 
EPDOC class, 2-6 
document formating 
FORM library, 1-1 
document layout 
classes, 3-1 


ADDITIONAL SYSTEM INFORMATION 


document printing 

classes, 4-1 
DYL 

FORM library introduction, 1-1 
environment variables 

print manager, 4-5 
EP_BACK_ CHARS 

EPDOC class method, 2-9 
EP_CLEAR 

EPDOC class method, 2-11 
EP_COMPRESS 

EPDOC class method, 2-11 
EP_DELETE 

EPDOC class method, 2-11 
EP_EXTRACT 

EPDOC class method, 2-10 
EP_INIT 

EPDOC class method, 2-8 
EP_INSERT 

EPDOC class method, 2-10 
EP_SENSE_CHARS 

EPDOC class method, 2-8 
EP_SENSE_LEN 

EPDOC class method, 2-8 
EPDOC class 

document filter, 2-6 

EP_BACK_CHARS method, 2-9 

EP_CLEAR method, 2-11 

EP_COMPRESS method, 2-11 

EP_DELETE method, 2-11 

EP_EXTRACT method, 2-10 

EP_INIT method, 2-8 

EP_INSERT method, 2-10 

EP_SENSE_CHARS method, 2-8 

EP_SENSE_LEN method, 2-8 

EPDOC_ENQ_PAGE method, 2-12 

EPDOC_GOTO_PAGE method, 2-12 

EPDOC_PARA_START call back method, 

2-13 

EPDOC_POS_FILTER method, 2-12 

EPDOC_SENSE_CHARS call back method, 

2-13 

EPDOC_SET_FILTER method, 2-12 

EPDOC_SET_PAGES method, 2-11 

methods call-back, 2-13 

methods, 2-8 

oop, 2-5 

pagination property, 2-6 
EPDOC_ENQ_ PAGE 

EPDOC class method, 2-12 
EPDOC_GOTO_PAGE 

EPDOC class method, 2-12 
EPDOC_PARA_START 

EPDOC class method call back, 2-13 
EPDOC_POS_FILTER 

EPDOC class method, 2-12 
EPDOC_SENSE_CHARS 

EPDOC class method call back, 2-13 
EPDOC_SET_FILTER 

EPDOC class method, 2-12 


ii 


EPDOC_SET_PAGES 
EPDOC class method, 2-11 
EPFDOC class 
EPFDOC_PARA_START call back method, 
2-15 
EPFDOC_SENSE_CHARS call back method, 
2-15 
methods call-back, 2-15 
oop, 2-14 
EPFDOC_PARA_START 
EPFDOC class method call back, 2-15 
EPFDOC_SENSE_CHARS 
EPFDOC class method call back, 2-15 
error handling 
FORM library, 1-4 
FORM library panics, 1-4 
FORM 
call back methods, 1-5 
class diagrams, 1-3 
class hierarchy, 1-3 
error handling, 1-4 
error numbers panics, 1-4 
library introduction, 1-1 
long function parameters, 1-3 
FORM class 
methods Series 3 notes, 4-53 
FORM classes 
using, 1-1 
FORM library 
function prototypes, 1-2 
form.dyl 
ROM, 1-1 
formatted document content 
classes, 2-1 
formatted text 
classes, 3-1 
formatting 
document FORM library, 1-1 
printing FORM library, 1-1 
FORMDOC class 
FORMDOC_ENQ_PAGE method, 2-5 
FORMDOC_PARA_START method, 2-3 
FORMDOC_SENSE_CHARS method, 2-3 
FORMDOC_SENSE_PDATA method, 2-4 
FORMDOC_SENSE_PLABEL method, 2-4 
methods, 2-3 
oop, 2-2 
FORMDOC_ENQ_PAGE 
FORMDOC class method, 2-5 
FORMDOC_PARA_START 
FORMDOC class method, 2-3 
FORMDOC_SENSE_CHARS 
FORMDOC class method, 2-3 
FORMDOC_SENSE_PDATA 
FORMDOC class method, 2-4 
FORMDOC_SENSE_PLABEL 
FORMDOC class method, 2-4 
library 
FORM DYL introduction, 1-1 
form.dyl ROM, 1-1 


line-table 
polytext classes, 7-1 
long parameters 
FORM functions, 1-3 
FORM library functions, 1-3 
measurement units 
points, 1-2 
printer units, 1-2 
twips, 1-2 
method function 
FORM long parameters, 1-3 
FORM prototypes, 1-2 
methods 
CALIMG class, 6-5 
call back FORM library, 1-5 
EPDOC class call-back, 2-13 
EPDOC class, 2-8 
EPFDOC class call-back, 2-15 
FORM class Series 3 notes, 4-53 
FORMDOC class, 2-3 
PAGELAY class call back, 4-46 
PAGES class, 4-21 
PDR class, 4-37 
PRINTER class, 4-6 
PRNLAY class, 4-52 
PRVPDR class, 5-5 
PTFLAT class, 7-10 
PTROOT class deferred, 7-8 
PTROOT class, 7-4 
PTSEG class, 7-13 
SCRIMG class, 3-19 
SCRLAY class, 3-8 
WDR class, 4-29 
WRAP class, 3-14 
mixin classes 
oop, 1-5 
oop 
calendar classes, 6-1 
CALIMG class, 6-1 
CALIMG class methods, 6-5 
document layout classes, 3-1 
document printing classes, 4-1 
EPDOC class, 2-5 
EPDOC class call-back methods, 2-13 
EPDOC class methods, 2-8 
EPDOC document filter class, 2-6 
EPDOC pagination property class, 2-6 
EPFDOC class, 2-14 
EPFDOC class call-back methods, 2-15 
FORM class methods Series 3 notes, 4-53 
formatted document content classes, 2-1 
formatted text classes, 3-1 
FORMDOC class, 2-2 
FORMDOC class methods, 2-3 
PAGELAY class, 4-46 
PAGELAY class call back methods, 4-46 
PAGES class, 4-14 
PAGES class methods, 4-21 
PDR class, 4-34 
PDR class methods, 4-37 


INDEX 


polytext classes, 7-1 
print preview classes, 5-1 
PRINT PREVIEW classes, 5-1 
PRINTER class, 4-2 
PRINTER class diagram, 4-2 
PRINTER class methods, 4-6 
PRINTER environment variables, 4-5 
printer layout SCRLAY class, 3-2 
PRINTER measurement units, 4-2 
PRNLAY class, 4-49 
PRNLAY class methods, 4-52 
PRNTPRYV class, 5-9 
PRVPDR class, 5-2 
PRVPDR class methods, 5-5 
PTFLAT class, 7-9 
PTFLAT class methods, 7-10 
PTROOT class, 7-2 
PTROOT class deferred methods, 7-8 
PTROOT class methods, 7-4 
PTSEG class, 7-12 
PTSEG class methods, 7-13 
screen layout SCRLAY class, 3-2 
SCRIMG class, 3-15 
SCRIMG class methods, 3-19 
SCRLAY class, 3-2 
SCRLAY class methods, 3-8 
SCRLAY data structures class, 3-7 
SCRLAY font width tables class, 3-8 
SCRLAY screen diagram, 3-19 
SCRLAY special characters class, 3-7 
SCRLAY text line diagram, 3-21 
text formatting classes, 3-1 
WDR class, 4-25 
WDR class methods, 4-29 
WRAP class, 3-14 
WRAP class methods, 3-14 
page dimensions 
diagram, 4-20 
PAGELAY class 
methods call back, 4-46 
oop, 4-46 
PAGELAY_MDONE method, 4-47 
PAGELAY_MREAD method, 4-46 
PAGELA Y_MDONE 
PAGELAY class method, 4-47 
PAGELAY_MREAD 
PAGELAY class method, 4-46 
PAGES class 
AO_ABRUN method, 4-24 
AO_INIT method, 4-21 
AO_QUEUE method, 4-24 
AO_RUN method, 4-23 
methods, 4-21 
oop, 4-14 
pagination 
EPDOC class property, 2-6 
panics 
FORM error numbers, 1-4 
parallel port 
letter types, 4-8 


iii 


ADDITIONAL SYSTEM INFORMATION 


PDR class 
DESTROY method, 4-37 
methods, 4-37 
oop, 4-34 


PDR_ADD_COMMAND method, 4-41 


PDR_DESTROY method, 4-42 

PDR_END method, 4-42 

PDR_FONT method, 4-44 

PDR_INIT method, 4-37 

PDR_LINE method, 4-43 

PDR_PAGE method, 4-43 

PDR_PRINT method, 4-38 

PDR_RIGHT method, 4-44 

PDR_START method, 4-42 

PDR_STYLE method, 4-45 

PDR_TEXT method, 4-43 
PDR_ADD_COMMAND 

PDR class method, 4-41 
PDR_DESTROY 

PDR class method, 4-42 

PRVPDR class method, 5-7 
PDR_END 

PDR class method, 4-42 
PDR_FONT 

PDR class method, 4-44 

PRVPDR class method, 5-8 
PDR_INIT 

PDR class method, 4-37 

PRVPDR class method, 5-5 
PDR_LINE 

PDR class method, 4-43 
PDR_PAGE 

PDR class method, 4-43 

PRVPDR class method, 5-8 
PDR_PRINT 

PDR class method, 4-38 

PRVPDR class method, 5-6 
PDR_RIGHT 

PDR class method, 4-44 
PDR_START 

PDR class method, 4-42 

PRVPDR class method, 5-7 
PDR_STYLE 

PDR class method, 4-45 
PDR_TEXT 

PDR class method, 4-43 
phrase 

polytext classes, 7-1 
points 

printer measurement units, 1-2 
polytext class 

buffer, 7-1 

line-table, 7-1 

phrase, 7-1 
polytext classes 

oop, 7-1 
port parallel 

letter types, 4-8 
port serial 

letter types, 4-8 


iv 


port type 

printer, 4-8 
PR_CLOSE_WDR 

PRINTER class method, 4-10 
PR_GET_HD 

PRINTER class method, 4-10 
PR_GET_PARAMS 

PRINTER class method, 4-9 
PR_INIT 

PRINTER class method, 4-6 
PR_OPEN_PORT 

PRINTER class method, 4-10 
PR_OPEN_WDR 

PRINTER class method, 4-10 
PR_PAGINATE 

PRINTER class method, 4-11 
PR_PORT_DATA 

PRINTER class method, 4-7 
PR_PREVIEW 

PRINTER class method, 4-13 
PR_PREVIEW_DATA 

PRINTER class method, 4-14 
PR_PREVIEW_END 

PRINTER class method, 4-13 
PR_PREVIEW_START 

PRINTER class method, 4-12 
PR_PRINT 

PRINTER class method, 4-11 
PR_SENSE_MODEL 

PRINTER class method, 4-9 
PR_SENSE_PORT 

PRINTER class method, 4-8 
PR_SET_HD 

PRINTER class method, 4-9 
PR_SET_ MODEL 

PRINTER class method, 4-7 
PR_SET_PORT_TYPE 

PRINTER class method, 4-7 
PR_STORE_FILE 

PRINTER class method, 4-6 
PR_STORE_SRCHAR 

PRINTER class method, 4-6 
print manager 

environment variables, 4-5 
print preview 

classes, 5-1 
PRINT PREVIEW class 

oop, 5-1 
PRINTER class 

DESTROY method, 4-6 

diagram, 4-2 

document printing, 4-1 

environmet variables, 4-5 

measurement units, 4-2 

methods, 4-6 

oop, 4-2 

PR_CLOSE_WDR method, 4-10 

PR_GET_HD method, 4-10 

PR_GET_PARAMS method, 4-9 

PR_INIT method, 4-6 


PR_OPEN_PORT method, 4-10 
PR_OPEN_WDR method, 4-10 
PR_PAGINATE method, 4-11 
PR_PORT_DATA method, 4-7 
PR_PREVIEW method, 4-13 
PR_PREVIEW_DATA method, 4-14 
PR_PREVIEW_END method, 4-13 
PR_PREVIEW_START method, 4-12 
PR_PRINT method, 4-11 
PR_SENSE_MODEL method, 4-9 
PR_SENSE_PORT method, 4-8 
PR_SET_HD method, 4-9 
PR_SET_MODEL method, 4-7 
PR_SET_PORT_TYPE method, 4-7 
PR_STORE_FILE method, 4-6 
PR_STORE_SRCHAR method, 4-6 
text printing, 4-1 
printer layout 
SCRLAY class, 3-2 
printer model 
get type, 4-9 
printer port 
device types, 4-8 
printing 
formating FORM library, 1-1 
page dimensions diagram, 4-20 
PRINTING 
PREVIEW class, 5-1 
PRNLAY class 
methods, 4-52 
oop, 4-49 
SL_PRINT_POS method, 4-52 
SL_PRINT_READ method, 4-52 
PRNTPRYV class 
oop, 5-9 
PRNTPRV_MDONE method, 5-9 
PRNTPRV_MDONE 
PRNTPRV class method, 5-9 
PRVPDR class 
methods, 5-5 
oop, 5-2 
PDR_DESTROY method, 5-7 
PDR_FONT method, 5-8 
PDR_INIT method, 5-5 
PDR_PAGE method, 5-8 
PDR_PRINT method, 5-6 
PDR_START method, 5-7 
PT_ADD_PHRASE 
PTROOT class method, 7-4 
PT_APPEND 
PTFLAT class method, 7-11 
PTROOT class method deferred, 7-8 
PTSEG class method, 7-13 
PT_DISPLAY_LINE 
PTROOT class method, 7-5 
PT_FIND 
PTROOT class method, 7-7 
PT_INIT 
PTFLAT class method, 7-10 
PTROOT class method deferred, 7-8 


INDEX 


PTSEG class method, 7-13 
PT_INQUIRE 

PTROOT class method, 7-8 
PT_MOD_BY_ATTRIB 

PTROOT class method, 7-7 
PT_MOD_BY_NUM 

PTROOT class method, 7-6 
PT_PBUF 

PTFLAT class method, 7-11 

PTROOT class method deferred, 7-9 

PTSEG class method, 7-14 
PT_PUT_LINTAB 

PTFLAT class method, 7-11 

PTROOT class method deferred, 7-9 

PTSEG class method, 7-13 
PT_RESET 

PTFLAT class method, 7-11 

PTROOT class method deferred, 7-8 

PTSEG class method, 7-13 
PT_SET_FONTS 

PTROOT class method, 7-5 
PT_WRAP 

PTROOT class method, 7-4 
PTFLAT class 

DESTROY method, 7-10 

methods, 7-10 

oop, 7-9 

PT_APPEND method, 7-11 

PT_INIT method, 7-10 

PT_PBUF method, 7-11 

PT_PUT_LINTAB method, 7-11 

PT_RESET method, 7-11 
PTROOT class 

methods deferred, 7-8 

methods, 7-4 

oop, 7-2 

PT_ADD_PHRASE method, 7-4 

PT_APPEND deferred method, 7-8 

PT_DISPLAY_LINE method, 7-5 

PT_FIND method, 7-7 

PT_INIT deferred method, 7-8 

PT_INQUIRE method, 7-8 

PT_MOD_BY_ATTRIB method, 7-7 

PT_MOD_BY_NUM method, 7-6 

PT_PBUF deferred method, 7-9 

PT_PUT_LINTAB deferred method, 7-9 

PT_RESET deferred method, 7-8 

PT_SET_FONTS method, 7-5 

PT_WRAP method, 7-4 
PTSEG class 

methods, 7-13 

oop, 7-12 

PT_APPEND method, 7-13 

PT_INIT method, 7-13 

PT_PBUF method, 7-14 

PT_PUT_LINTAB method, 7-13 

PT_RESET method, 7-13 
resource files 

WDR printing, 4-25 


ADDITIONAL SYSTEM INFORMATION 


ROM 
form.dyl, 1-1 

screen layout 
SCRLAY class, 3-2 

SCRIMG class 
DESTROY method, 3-19 
methods, 3-19 
oop, 3-15 
SI_LDELPREP method, 3-26 
SI_DOC_CHANGED method, 3-25 
SI_DOC_RESET method, 3-25 
SI_LEMPHASIZE method, 3-22 
SI_LFWD_CHANGE method, 3-27 
SI_GET_SELECT method, 3-22 
SLINIT method, 3-20 
SI_MOVE_CURSOR method, 3-23 
SI_PAN method, 3-22 


SI_LPARA_CHANGED method, 3-26 


SI_LREDRAW method, 3-25 
SI_SCROLL method, 3-23 
SI_SENSE method, 3-22 
SI_SET method, 3-20 


SI_STYLE_CHANGED method, 3-26 


SI_VIEW method, 3-23 
SCRLAY class 

data structures, 3-7 

DESTROY method, 3-10 

document layout, 3-1 

font width tables, 3-8 

methods, 3-8 

oop, 3-2 

screen diagram, 3-19 

SL_BEGIN_READ method, 3-11 


SL_DISCARD_LAYOUT method, 3-13 


SL_FORMAT_LINE method, 3-12 
SL_INIT method, 3-8 
SL_LINE_ENDS method, 3-11 


SL_PARA_CHANGED method, 3-13 


SL_POS_TO_XL method, 3-10 
SL_READ method, 3-12 
SL_RESCALE method, 3-13 
SL_SCROLL method, 3-12 
SL_SENSE method, 3-10 
SL_SET method, 3-9 
SL_SET_LINES method, 3-13 
SL_VIEW method, 3-12 
SL_XL_TO_POS method, 3-11 
special characters, 3-7 
text layout, 3-1 
text line diagram, 3-21 
serial port 
letter types, 4-8 
Series 3 
FORM class notes, 4-53 
SI_DELPREP 
SCRIMG class method, 3-26 
SI_DOC_CHANGED 
SCRIMG class method, 3-25 
SI_DOC_RESET 
SCRIMG class method, 3-25 


SI_LEMPHASIZE 

SCRIMG class method, 3-22 
SILFWD_CHANGE 

SCRIMG class method, 3-27 
SI_GET_SELECT 

SCRIMG class method, 3-22 
SLINIT 

SCRIMG class method, 3-20 
SI_MOVE_CURSOR 

SCRIMG class method, 3-23 
SI_PAN 

SCRIMG class method, 3-22 
SIPARA_CHANGED 

SCRIMG class method, 3-26 
SIREDRAW 

SCRIMG class method, 3-25 
SILSCROLL 

SCRIMG class method, 3-23 
SI_SENSE 

SCRIMG class method, 3-22 
SLSET 

SCRIMG class method, 3-20 
SILSTYLE_CHANGED 

SCRIMG class method, 3-26 
SIL VIEW 

SCRIMG class method, 3-23 
SL_BEGIN_READ 

SCRLAY class method, 3-11 
SL_DISCARD_LAYOUT 

SCRLAY class method, 3-13 
SL_FORMAT_LINE 

SCRLAY class method, 3-12 
SL_INIT 

SCRLAY class method, 3-8 
SL_LINE_ENDS 

SCRLAY class method, 3-11 
SL_PARA_CHANGED 

SCRLAY class method, 3-13 
SL_POS_TO_XL 

SCRLAY class method, 3-10 
SL_PRINT_POS 

PRNLAY class method, 4-52 
SL_PRINT_READ 

PRNLAY class method, 4-52 
SL_READ 

SCRLAY class method, 3-12 
SL_RESCALE 

SCRLAY class method, 3-13 
SL_SCROLL 

SCRLAY class method, 3-12 
SL_SENSE 

SCRLAY class method, 3-10 
SL_SET 

SCRLAY class method, 3-9 
SL_SET_LINES 

SCRLAY class method, 3-13 
SL_VIEW 

SCRLAY class method, 3-12 
SL_XL_TO_POS 

SCRLAY class method, 3-11 


text display 
polytext classes, 7-1 
text formatting 
classes, 3-1 
twips 
printer measurement units, 1-2 
WDR 
resource files printing, 4-25 
WDR class 
DESTROY method, 4-29 
methods, 4-29 
oop, 4-25 
WDR_COUNT_MODELS method, 4-30 
WDR_FONT_HEIGHT method, 4-31 
WDR_GET_WIDTH_TABLE method, 4-32 
WDR_INIT method, 4-29 
WDR_LOAD_RECORD method, 4-34 
WDR_OPEN_PRINT method, 4-33 
WDR_SEARCH_HEIGHT method, 4-32 
WDR_SEARCH_TYPEFACE method, 4-31 
WDR_SENSE_MODEL method, 4-30 
WDR_SENSE_MODEL_NAME method, 
4-30 
WDR_SENSE_WIDTH method, 4-33 
WDR_SET_MODEL method, 4-30 
WDR_TWIPS_TO_XY method, 4-33 
WDR_TYPEFACE method, 4-30 
WDR_COUNT_MODELS 
WDR class method, 4-30 
WDR_FONT_HEIGHT 
WDR class method, 4-31 


INDEX 


WDR_GET_WIDTH_TABLE 

WDR class method, 4-32 
WDR_INIT 

WDR class method, 4-29 
WDR_LOAD_RECORD 

WDR class method, 4-34 
WDR_OPEN_ PRINT 

WDR class method, 4-33 
WDR_SEARCH_HEIGHT 

WDR class method, 4-32 
WDR_SEARCH_TYPEFACE 

WDR class method, 4-31 
WDR_SENSE_MODEL 

WDR class method, 4-30 
WDR_SENSE_MODEL_NAME 

WDR class method, 4-30 
WDR_SENSE_WIDTH 

WDR class method, 4-33 
WDR_SET_MODEL 

WDR class method, 4-30 
WDR_TWIPS_TO_XY 

WDR class method, 4-33 
WDR_TYPEFACE 

WDR class method, 4-30 
WRAP class 

AO_INIT method, 3-14 

AO_QUEUE method, 3-15 

AO_RUN method, 3-15 

methods, 3-14 

oop, 3-14 


