views.pas 204 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693
  1. {********[ SOURCE FILE OF GRAPHICAL FREE VISION ]**********}
  2. { }
  3. { System independent GRAPHICAL clone of VIEWS.PAS }
  4. { }
  5. { Interface Copyright (c) 1992 Borland International }
  6. { }
  7. { Copyright (c) 1996, 1997, 1998, 1999 by Leon de Boer }
  8. { [email protected] - primary e-mail address }
  9. { [email protected] - backup e-mail address }
  10. { }
  11. {****************[ THIS CODE IS FREEWARE ]*****************}
  12. { }
  13. { This sourcecode is released for the purpose to }
  14. { promote the pascal language on all platforms. You may }
  15. { redistribute it and/or modify with the following }
  16. { DISCLAIMER. }
  17. { }
  18. { This SOURCE CODE is distributed "AS IS" WITHOUT }
  19. { WARRANTIES AS TO PERFORMANCE OF MERCHANTABILITY OR }
  20. { ANY OTHER WARRANTIES WHETHER EXPRESSED OR IMPLIED. }
  21. { }
  22. {*****************[ SUPPORTED PLATFORMS ]******************}
  23. { }
  24. { Only Free Pascal Compiler supported }
  25. { }
  26. {**********************************************************}
  27. UNIT Views;
  28. {$CODEPAGE cp437}
  29. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  30. INTERFACE
  31. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  32. {====Include file to sort compiler platform out =====================}
  33. {$I platform.inc}
  34. {====================================================================}
  35. {==== Compiler directives ===========================================}
  36. {$X+} { Extended syntax is ok }
  37. {$R-} { Disable range checking }
  38. {$S-} { Disable Stack Checking }
  39. {$I-} { Disable IO Checking }
  40. {$Q-} { Disable Overflow Checking }
  41. {$V-} { Turn off strict VAR strings }
  42. {====================================================================}
  43. USES
  44. {$IFDEF OS_WINDOWS} { WIN/NT CODE }
  45. Windows, { Standard unit }
  46. {$ENDIF}
  47. {$IFDEF OS_OS2} { OS2 CODE }
  48. Os2Def, DosCalls, PmWin,
  49. {$ENDIF}
  50. Objects, FVCommon, Drivers, fvconsts; { GFV standard units }
  51. {***************************************************************************}
  52. { PUBLIC CONSTANTS }
  53. {***************************************************************************}
  54. {---------------------------------------------------------------------------}
  55. { TView STATE MASKS }
  56. {---------------------------------------------------------------------------}
  57. CONST
  58. sfVisible = $0001; { View visible mask }
  59. sfCursorVis = $0002; { Cursor visible }
  60. sfCursorIns = $0004; { Cursor insert mode }
  61. sfShadow = $0008; { View has shadow }
  62. sfActive = $0010; { View is active }
  63. sfSelected = $0020; { View is selected }
  64. sfFocused = $0040; { View is focused }
  65. sfDragging = $0080; { View is dragging }
  66. sfDisabled = $0100; { View is disabled }
  67. sfModal = $0200; { View is modal }
  68. sfDefault = $0400; { View is default }
  69. sfExposed = $0800; { View is exposed }
  70. sfIconised = $1000; { View is iconised }
  71. {---------------------------------------------------------------------------}
  72. { TView OPTION MASKS }
  73. {---------------------------------------------------------------------------}
  74. CONST
  75. ofSelectable = $0001; { View selectable }
  76. ofTopSelect = $0002; { Top selectable }
  77. ofFirstClick = $0004; { First click react }
  78. ofFramed = $0008; { View is framed }
  79. ofPreProcess = $0010; { Pre processes }
  80. ofPostProcess = $0020; { Post processes }
  81. ofBuffered = $0040; { View is buffered }
  82. ofTileable = $0080; { View is tileable }
  83. ofCenterX = $0100; { View centred on x }
  84. ofCenterY = $0200; { View centred on y }
  85. ofCentered = $0300; { View x,y centred }
  86. ofValidate = $0400; { View validates }
  87. ofVersion = $3000; { View TV version }
  88. ofVersion10 = $0000; { TV version 1 view }
  89. ofVersion20 = $1000; { TV version 2 view }
  90. {---------------------------------------------------------------------------}
  91. { TView GROW MODE MASKS }
  92. {---------------------------------------------------------------------------}
  93. CONST
  94. gfGrowLoX = $01; { Left side grow }
  95. gfGrowLoY = $02; { Top side grow }
  96. gfGrowHiX = $04; { Right side grow }
  97. gfGrowHiY = $08; { Bottom side grow }
  98. gfGrowAll = $0F; { Grow on all sides }
  99. gfGrowRel = $10; { Grow relative }
  100. {---------------------------------------------------------------------------}
  101. { TView DRAG MODE MASKS }
  102. {---------------------------------------------------------------------------}
  103. CONST
  104. dmDragMove = $01; { Move view }
  105. dmDragGrow = $02; { Grow view }
  106. dmLimitLoX = $10; { Limit left side }
  107. dmLimitLoY = $20; { Limit top side }
  108. dmLimitHiX = $40; { Limit right side }
  109. dmLimitHiY = $80; { Limit bottom side }
  110. dmLimitAll = $F0; { Limit all sides }
  111. {---------------------------------------------------------------------------}
  112. { >> NEW << TAB OPTION MASKS }
  113. {---------------------------------------------------------------------------}
  114. CONST
  115. tmTab = $01; { Tab move mask }
  116. tmShiftTab = $02; { Shift+tab move mask }
  117. tmEnter = $04; { Enter move mask }
  118. tmLeft = $08; { Left arrow move mask }
  119. tmRight = $10; { Right arrow move mask }
  120. tmUp = $20; { Up arrow move mask }
  121. tmDown = $40; { Down arrow move mask }
  122. {---------------------------------------------------------------------------}
  123. { >> NEW << VIEW DRAW MASKS }
  124. {---------------------------------------------------------------------------}
  125. CONST
  126. vdBackGnd = $01; { Draw backgound }
  127. vdInner = $02; { Draw inner detail }
  128. vdCursor = $04; { Draw cursor }
  129. vdBorder = $08; { Draw view border }
  130. vdFocus = $10; { Draw focus state }
  131. vdNoChild = $20; { Draw no children }
  132. vdShadow = $40;
  133. vdAll = vdBackGnd + vdInner + vdCursor + vdBorder + vdFocus + vdShadow;
  134. {---------------------------------------------------------------------------}
  135. { TView HELP CONTEXTS }
  136. {---------------------------------------------------------------------------}
  137. CONST
  138. hcNoContext = 0; { No view context }
  139. hcDragging = 1; { No drag context }
  140. {---------------------------------------------------------------------------}
  141. { TWindow FLAG MASKS }
  142. {---------------------------------------------------------------------------}
  143. CONST
  144. wfMove = $01; { Window can move }
  145. wfGrow = $02; { Window can grow }
  146. wfClose = $04; { Window can close }
  147. wfZoom = $08; { Window can zoom }
  148. {---------------------------------------------------------------------------}
  149. { TWindow PALETTES }
  150. {---------------------------------------------------------------------------}
  151. CONST
  152. wpBlueWindow = 0; { Blue palette }
  153. wpCyanWindow = 1; { Cyan palette }
  154. wpGrayWindow = 2; { Gray palette }
  155. {---------------------------------------------------------------------------}
  156. { COLOUR PALETTES }
  157. {---------------------------------------------------------------------------}
  158. CONST
  159. CFrame = #1#1#2#2#3; { Frame palette }
  160. CScrollBar = #4#5#5; { Scrollbar palette }
  161. CScroller = #6#7; { Scroller palette }
  162. CListViewer = #26#26#27#28#29; { Listviewer palette }
  163. CBlueWindow = #8#9#10#11#12#13#14#15; { Blue window palette }
  164. CCyanWindow = #16#17#18#19#20#21#22#23; { Cyan window palette }
  165. CGrayWindow = #24#25#26#27#28#29#30#31; { Grey window palette }
  166. {---------------------------------------------------------------------------}
  167. { TScrollBar PART CODES }
  168. {---------------------------------------------------------------------------}
  169. CONST
  170. sbLeftArrow = 0; { Left arrow part }
  171. sbRightArrow = 1; { Right arrow part }
  172. sbPageLeft = 2; { Page left part }
  173. sbPageRight = 3; { Page right part }
  174. sbUpArrow = 4; { Up arrow part }
  175. sbDownArrow = 5; { Down arrow part }
  176. sbPageUp = 6; { Page up part }
  177. sbPageDown = 7; { Page down part }
  178. sbIndicator = 8; { Indicator part }
  179. {---------------------------------------------------------------------------}
  180. { TScrollBar OPTIONS FOR TWindow.StandardScrollBar }
  181. {---------------------------------------------------------------------------}
  182. CONST
  183. sbHorizontal = $0000; { Horz scrollbar }
  184. sbVertical = $0001; { Vert scrollbar }
  185. sbHandleKeyboard = $0002; { Handle keyboard }
  186. {---------------------------------------------------------------------------}
  187. { STANDARD COMMAND CODES }
  188. {---------------------------------------------------------------------------}
  189. CONST
  190. cmValid = 0; { Valid command }
  191. cmQuit = 1; { Quit command }
  192. cmError = 2; { Error command }
  193. cmMenu = 3; { Menu command }
  194. cmClose = 4; { Close command }
  195. cmZoom = 5; { Zoom command }
  196. cmResize = 6; { Resize command }
  197. cmNext = 7; { Next view command }
  198. cmPrev = 8; { Prev view command }
  199. cmHelp = 9; { Help command }
  200. cmOK = 10; { Okay command }
  201. cmCancel = 11; { Cancel command }
  202. cmYes = 12; { Yes command }
  203. cmNo = 13; { No command }
  204. cmDefault = 14; { Default command }
  205. cmCut = 20; { Clipboard cut cmd }
  206. cmCopy = 21; { Clipboard copy cmd }
  207. cmPaste = 22; { Clipboard paste cmd }
  208. cmUndo = 23; { Clipboard undo cmd }
  209. cmClear = 24; { Clipboard clear cmd }
  210. cmTile = 25; { Tile subviews cmd }
  211. cmCascade = 26; { Cascade subviews cmd }
  212. cmReceivedFocus = 50; { Received focus }
  213. cmReleasedFocus = 51; { Released focus }
  214. cmCommandSetChanged = 52; { Commands changed }
  215. cmScrollBarChanged = 53; { Scrollbar changed }
  216. cmScrollBarClicked = 54; { Scrollbar clicked on }
  217. cmSelectWindowNum = 55; { Select window }
  218. cmListItemSelected = 56; { Listview item select }
  219. cmNotify = 27;
  220. cmIdCommunicate = 28; { Communicate via id }
  221. cmIdSelect = 29; { Select via id }
  222. {---------------------------------------------------------------------------}
  223. { TWindow NUMBER CONSTANTS }
  224. {---------------------------------------------------------------------------}
  225. CONST
  226. wnNoNumber = 0; { Window has no num }
  227. MaxViewWidth = 255; { Max view width }
  228. {***************************************************************************}
  229. { PUBLIC TYPE DEFINITIONS }
  230. {***************************************************************************}
  231. {---------------------------------------------------------------------------}
  232. { TWindow Title string }
  233. {---------------------------------------------------------------------------}
  234. TYPE
  235. TTitleStr = String[80]; { Window title string }
  236. {---------------------------------------------------------------------------}
  237. { COMMAND SET RECORD }
  238. {---------------------------------------------------------------------------}
  239. TYPE
  240. TCommandSet = SET OF Byte; { Command set record }
  241. PCommandSet = ^TCommandSet; { Ptr to command set }
  242. {---------------------------------------------------------------------------}
  243. { PALETTE RECORD }
  244. {---------------------------------------------------------------------------}
  245. TYPE
  246. TPalette = String; { Palette record }
  247. PPalette = ^TPalette; { Pointer to palette }
  248. {---------------------------------------------------------------------------}
  249. { TDrawBuffer RECORD }
  250. {---------------------------------------------------------------------------}
  251. TYPE
  252. TDrawBuffer = Array [0..MaxViewWidth - 1] Of Word; { Draw buffer record }
  253. PDrawBuffer = ^TDrawBuffer; { Ptr to draw buffer }
  254. {---------------------------------------------------------------------------}
  255. { TVideoBuffer RECORD }
  256. {---------------------------------------------------------------------------}
  257. TYPE
  258. TVideoBuf = ARRAY [0..3999] of Word; { Video buffer }
  259. PVideoBuf = ^TVideoBuf; { Pointer to buffer }
  260. {---------------------------------------------------------------------------}
  261. { TComplexArea RECORD }
  262. {---------------------------------------------------------------------------}
  263. TYPE
  264. PComplexArea = ^TComplexArea; { Complex area }
  265. TComplexArea =
  266. {$ifndef FPC_REQUIRES_PROPER_ALIGNMENT}
  267. PACKED
  268. {$endif FPC_REQUIRES_PROPER_ALIGNMENT}
  269. RECORD
  270. X1, Y1 : Sw_Integer; { Top left corner }
  271. X2, Y2 : Sw_Integer; { Lower right corner }
  272. NextArea: PComplexArea; { Next area pointer }
  273. END;
  274. {***************************************************************************}
  275. { PUBLIC OBJECT DEFINITIONS }
  276. {***************************************************************************}
  277. TYPE
  278. PGroup = ^TGroup; { Pointer to group }
  279. {---------------------------------------------------------------------------}
  280. { TView OBJECT - ANCESTOR VIEW OBJECT }
  281. {---------------------------------------------------------------------------}
  282. PView = ^TView;
  283. TView = OBJECT (TObject)
  284. GrowMode : Byte; { View grow mode }
  285. DragMode : Byte; { View drag mode }
  286. TabMask : Byte; { Tab move masks }
  287. ColourOfs: Sw_Integer; { View palette offset }
  288. HelpCtx : Word; { View help context }
  289. State : Word; { View state masks }
  290. Options : Word; { View options masks }
  291. EventMask: Word; { View event masks }
  292. Origin : TPoint; { View origin }
  293. Size : TPoint; { View size }
  294. Cursor : TPoint; { Cursor position }
  295. Next : PView; { Next peerview }
  296. Owner : PGroup; { Owner group }
  297. HoldLimit: PComplexArea; { Hold limit values }
  298. RevCol : Boolean;
  299. BackgroundChar : Char;
  300. CONSTRUCTOR Init (Var Bounds: TRect);
  301. CONSTRUCTOR Load (Var S: TStream);
  302. DESTRUCTOR Done; Virtual;
  303. FUNCTION Prev: PView;
  304. FUNCTION Execute: Word; Virtual;
  305. FUNCTION Focus: Boolean;
  306. FUNCTION DataSize: Sw_Word; Virtual;
  307. FUNCTION TopView: PView;
  308. FUNCTION PrevView: PView;
  309. FUNCTION NextView: PView;
  310. FUNCTION GetHelpCtx: Word; Virtual;
  311. FUNCTION EventAvail: Boolean;
  312. FUNCTION GetPalette: PPalette; Virtual;
  313. function MapColor (color:byte):byte;
  314. FUNCTION GetColor (Color: Word): Word;
  315. FUNCTION Valid (Command: Word): Boolean; Virtual;
  316. FUNCTION GetState (AState: Word): Boolean;
  317. FUNCTION TextWidth (const Txt: String): Sw_Integer;
  318. FUNCTION CTextWidth (const Txt: String): Sw_Integer;
  319. FUNCTION MouseInView (Point: TPoint): Boolean;
  320. FUNCTION CommandEnabled (Command: Word): Boolean;
  321. FUNCTION OverLapsArea (X1, Y1, X2, Y2: Sw_Integer): Boolean;
  322. FUNCTION MouseEvent (Var Event: TEvent; Mask: Word): Boolean;
  323. PROCEDURE Hide;
  324. PROCEDURE Show;
  325. PROCEDURE Draw; Virtual;
  326. PROCEDURE ResetCursor; Virtual;
  327. PROCEDURE Select;
  328. PROCEDURE Awaken; Virtual;
  329. PROCEDURE DrawView;
  330. PROCEDURE MakeFirst;
  331. PROCEDURE DrawCursor; Virtual;
  332. PROCEDURE HideCursor;
  333. PROCEDURE ShowCursor;
  334. PROCEDURE BlockCursor;
  335. PROCEDURE NormalCursor;
  336. PROCEDURE FocusFromTop; Virtual;
  337. PROCEDURE MoveTo (X, Y: Sw_Integer);
  338. PROCEDURE GrowTo (X, Y: Sw_Integer);
  339. PROCEDURE EndModal (Command: Word); Virtual;
  340. PROCEDURE SetCursor (X, Y: Sw_Integer);
  341. PROCEDURE PutInFrontOf (Target: PView);
  342. PROCEDURE SetCommands (Commands: TCommandSet);
  343. PROCEDURE EnableCommands (Commands: TCommandSet);
  344. PROCEDURE DisableCommands (Commands: TCommandSet);
  345. PROCEDURE SetState (AState: Word; Enable: Boolean); Virtual;
  346. PROCEDURE SetCmdState (Commands: TCommandSet; Enable: Boolean);
  347. PROCEDURE GetData (Var Rec); Virtual;
  348. PROCEDURE SetData (Var Rec); Virtual;
  349. PROCEDURE Store (Var S: TStream);
  350. PROCEDURE Locate (Var Bounds: TRect);
  351. PROCEDURE KeyEvent (Var Event: TEvent);
  352. PROCEDURE GetEvent (Var Event: TEvent); Virtual;
  353. PROCEDURE PutEvent (Var Event: TEvent); Virtual;
  354. PROCEDURE GetExtent (Var Extent: TRect);
  355. PROCEDURE GetBounds (Var Bounds: TRect);
  356. PROCEDURE SetBounds (Var Bounds: TRect);
  357. PROCEDURE GetClipRect (Var Clip: TRect);
  358. PROCEDURE ClearEvent (Var Event: TEvent);
  359. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  360. PROCEDURE ChangeBounds (Var Bounds: TRect); Virtual;
  361. PROCEDURE SizeLimits (Var Min, Max: TPoint); Virtual;
  362. PROCEDURE GetCommands (Var Commands: TCommandSet);
  363. PROCEDURE GetPeerViewPtr (Var S: TStream; Var P);
  364. PROCEDURE PutPeerViewPtr (Var S: TStream; P: PView);
  365. PROCEDURE CalcBounds (Var Bounds: TRect; Delta: TPoint); Virtual;
  366. FUNCTION Exposed: Boolean; { This needs help!!!!! }
  367. PROCEDURE WriteBuf (X, Y, W, H: Sw_Integer; Var Buf);
  368. PROCEDURE WriteLine (X, Y, W, H: Sw_Integer; Var Buf);
  369. PROCEDURE MakeLocal (Source: TPoint; Var Dest: TPoint);
  370. PROCEDURE MakeGlobal (Source: TPoint; Var Dest: TPoint);
  371. PROCEDURE WriteStr (X, Y: Sw_Integer; Str: String; Color: Byte);
  372. PROCEDURE WriteChar (X, Y: Sw_Integer; C: Char; Color: Byte;
  373. Count: Sw_Integer);
  374. PROCEDURE DragView (Event: TEvent; Mode: Byte; Var Limits: TRect;
  375. MinSize, MaxSize: TPoint);
  376. private
  377. procedure CursorChanged;
  378. procedure DrawHide(LastView: PView);
  379. procedure DrawShow(LastView: PView);
  380. procedure DrawUnderRect(var R: TRect; LastView: PView);
  381. procedure DrawUnderView(DoShadow: Boolean; LastView: PView);
  382. procedure do_WriteView(x1,x2,y:Sw_Integer; var Buf);
  383. procedure do_WriteViewRec1(x1,x2:Sw_integer; p:PView; shadowCounter:Sw_integer);
  384. procedure do_WriteViewRec2(x1,x2:Sw_integer; p:PView; shadowCounter:Sw_integer);
  385. function do_ExposedRec1(x1,x2:Sw_integer; p:PView):boolean;
  386. function do_ExposedRec2(x1,x2:Sw_integer; p:PView):boolean;
  387. END;
  388. SelectMode = (NormalSelect, EnterSelect, LeaveSelect);
  389. {---------------------------------------------------------------------------}
  390. { TGroup OBJECT - GROUP OBJECT ANCESTOR }
  391. {---------------------------------------------------------------------------}
  392. TGroup = OBJECT (TView)
  393. Phase : (phFocused, phPreProcess, phPostProcess);
  394. EndState: Word; { Modal result }
  395. Current : PView; { Selected subview }
  396. Last : PView; { 1st view inserted }
  397. Buffer : PVideoBuf; { Speed up buffer }
  398. CONSTRUCTOR Init (Var Bounds: TRect);
  399. CONSTRUCTOR Load (Var S: TStream);
  400. DESTRUCTOR Done; Virtual;
  401. FUNCTION First: PView;
  402. FUNCTION Execute: Word; Virtual;
  403. FUNCTION GetHelpCtx: Word; Virtual;
  404. FUNCTION DataSize: Sw_Word; Virtual;
  405. FUNCTION ExecView (P: PView): Word; Virtual;
  406. FUNCTION FirstThat (P: Pointer): PView;
  407. FUNCTION Valid (Command: Word): Boolean; Virtual;
  408. FUNCTION FocusNext (Forwards: Boolean): Boolean;
  409. PROCEDURE Draw; Virtual;
  410. PROCEDURE Lock;
  411. PROCEDURE UnLock;
  412. PROCEDURE ResetCursor; Virtual;
  413. PROCEDURE Awaken; Virtual;
  414. PROCEDURE ReDraw;
  415. PROCEDURE SelectDefaultView;
  416. PROCEDURE Insert (P: PView);
  417. PROCEDURE Delete (P: PView);
  418. PROCEDURE ForEach (P: Pointer);
  419. { ForEach can't be virtual because it generates SIGSEGV }
  420. PROCEDURE EndModal (Command: Word); Virtual;
  421. PROCEDURE SelectNext (Forwards: Boolean);
  422. PROCEDURE InsertBefore (P, Target: PView);
  423. PROCEDURE SetState (AState: Word; Enable: Boolean); Virtual;
  424. PROCEDURE GetData (Var Rec); Virtual;
  425. PROCEDURE SetData (Var Rec); Virtual;
  426. PROCEDURE Store (Var S: TStream);
  427. PROCEDURE EventError (Var Event: TEvent); Virtual;
  428. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  429. PROCEDURE ChangeBounds (Var Bounds: TRect); Virtual;
  430. PROCEDURE GetSubViewPtr (Var S: TStream; Var P);
  431. PROCEDURE PutSubViewPtr (Var S: TStream; P: PView);
  432. function ClipChilds: boolean; virtual;
  433. procedure BeforeInsert(P: PView); virtual;
  434. procedure AfterInsert(P: PView); virtual;
  435. procedure BeforeDelete(P: PView); virtual;
  436. procedure AfterDelete(P: PView); virtual;
  437. PRIVATE
  438. LockFlag: Byte;
  439. Clip : TRect;
  440. FUNCTION IndexOf (P: PView): Sw_Integer;
  441. FUNCTION FindNext (Forwards: Boolean): PView;
  442. FUNCTION FirstMatch (AState: Word; AOptions: Word): PView;
  443. PROCEDURE ResetCurrent;
  444. PROCEDURE RemoveView (P: PView);
  445. PROCEDURE InsertView (P, Target: PView);
  446. PROCEDURE SetCurrent (P: PView; Mode: SelectMode);
  447. procedure DrawSubViews(P, Bottom: PView);
  448. END;
  449. {---------------------------------------------------------------------------}
  450. { TFrame OBJECT - FRAME VIEW OBJECT }
  451. {---------------------------------------------------------------------------}
  452. TYPE
  453. TFrame = OBJECT (TView)
  454. CONSTRUCTOR Init (Var Bounds: TRect);
  455. FUNCTION GetPalette: PPalette; Virtual;
  456. procedure Draw; virtual;
  457. procedure HandleEvent(var Event: TEvent); virtual;
  458. procedure SetState(AState: Word; Enable: Boolean); virtual;
  459. private
  460. FrameMode: Word;
  461. procedure FrameLine(var FrameBuf; Y, N: Sw_Integer; Color: Byte);
  462. END;
  463. PFrame = ^TFrame;
  464. {---------------------------------------------------------------------------}
  465. { TScrollBar OBJECT - SCROLL BAR OBJECT }
  466. {---------------------------------------------------------------------------}
  467. TYPE
  468. TScrollChars = Array [0..4] of Char;
  469. TScrollBar = OBJECT (TView)
  470. Value : Sw_Integer; { Scrollbar value }
  471. Min : Sw_Integer; { Scrollbar minimum }
  472. Max : Sw_Integer; { Scrollbar maximum }
  473. PgStep: Sw_Integer; { One page step }
  474. ArStep: Sw_Integer; { One range step }
  475. Id : Sw_Integer; { Scrollbar ID }
  476. CONSTRUCTOR Init (Var Bounds: TRect);
  477. CONSTRUCTOR Load (Var S: TStream);
  478. FUNCTION GetPalette: PPalette; Virtual;
  479. FUNCTION ScrollStep (Part: Sw_Integer): Sw_Integer; Virtual;
  480. PROCEDURE Draw; Virtual;
  481. PROCEDURE ScrollDraw; Virtual;
  482. PROCEDURE SetValue (AValue: Sw_Integer);
  483. PROCEDURE SetRange (AMin, AMax: Sw_Integer);
  484. PROCEDURE SetStep (APgStep, AArStep: Sw_Integer);
  485. PROCEDURE SetParams (AValue, AMin, AMax, APgStep, AArStep: Sw_Integer);
  486. PROCEDURE Store (Var S: TStream);
  487. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  488. PRIVATE
  489. Chars: TScrollChars; { Scrollbar chars }
  490. FUNCTION GetPos: Sw_Integer;
  491. FUNCTION GetSize: Sw_Integer;
  492. PROCEDURE DrawPos (Pos: Sw_Integer);
  493. END;
  494. PScrollBar = ^TScrollBar;
  495. {---------------------------------------------------------------------------}
  496. { TScroller OBJECT - SCROLLING VIEW ANCESTOR }
  497. {---------------------------------------------------------------------------}
  498. TYPE
  499. TScroller = OBJECT (TView)
  500. Delta : TPoint;
  501. Limit : TPoint;
  502. HScrollBar: PScrollBar; { Horz scroll bar }
  503. VScrollBar: PScrollBar; { Vert scroll bar }
  504. CONSTRUCTOR Init (Var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar);
  505. CONSTRUCTOR Load (Var S: TStream);
  506. FUNCTION GetPalette: PPalette; Virtual;
  507. PROCEDURE ScrollDraw; Virtual;
  508. PROCEDURE SetLimit (X, Y: Sw_Integer);
  509. PROCEDURE ScrollTo (X, Y: Sw_Integer);
  510. PROCEDURE SetState (AState: Word; Enable: Boolean); Virtual;
  511. PROCEDURE Store (Var S: TStream);
  512. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  513. PROCEDURE ChangeBounds (Var Bounds: TRect); Virtual;
  514. PRIVATE
  515. DrawFlag: Boolean;
  516. DrawLock: Byte;
  517. PROCEDURE CheckDraw;
  518. END;
  519. PScroller = ^TScroller;
  520. {---------------------------------------------------------------------------}
  521. { TListViewer OBJECT - LIST VIEWER OBJECT }
  522. {---------------------------------------------------------------------------}
  523. TYPE
  524. TListViewer = OBJECT (TView)
  525. NumCols : Sw_Integer; { Number of columns }
  526. TopItem : Sw_Integer; { Top most item }
  527. Focused : Sw_Integer; { Focused item }
  528. Range : Sw_Integer; { Range of listview }
  529. HScrollBar: PScrollBar; { Horz scrollbar }
  530. VScrollBar: PScrollBar; { Vert scrollbar }
  531. CONSTRUCTOR Init (Var Bounds: TRect; ANumCols: Sw_Word; AHScrollBar,
  532. AVScrollBar: PScrollBar);
  533. CONSTRUCTOR Load (Var S: TStream);
  534. FUNCTION GetPalette: PPalette; Virtual;
  535. FUNCTION IsSelected (Item: Sw_Integer): Boolean; Virtual;
  536. FUNCTION GetText (Item: Sw_Integer; MaxLen: Sw_Integer): String; Virtual;
  537. PROCEDURE Draw; Virtual;
  538. PROCEDURE FocusItem (Item: Sw_Integer); Virtual;
  539. PROCEDURE SetTopItem (Item: Sw_Integer);
  540. PROCEDURE SetRange (ARange: Sw_Integer);
  541. PROCEDURE SelectItem (Item: Sw_Integer); Virtual;
  542. PROCEDURE SetState (AState: Word; Enable: Boolean); Virtual;
  543. PROCEDURE Store (Var S: TStream);
  544. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  545. PROCEDURE ChangeBounds (Var Bounds: TRect); Virtual;
  546. PROCEDURE FocusItemNum (Item: Sw_Integer); Virtual;
  547. END;
  548. PListViewer = ^TListViewer;
  549. {---------------------------------------------------------------------------}
  550. { TWindow OBJECT - WINDOW OBJECT ANCESTOR }
  551. {---------------------------------------------------------------------------}
  552. TYPE
  553. TWindow = OBJECT (TGroup)
  554. Flags : Byte; { Window flags }
  555. Number : Sw_Integer; { Window number }
  556. Palette : Sw_Integer; { Window palette }
  557. ZoomRect: TRect; { Zoom rectangle }
  558. Frame : PFrame; { Frame view object }
  559. Title : PString; { Title string }
  560. CONSTRUCTOR Init (Var Bounds: TRect; ATitle: TTitleStr; ANumber: Sw_Integer);
  561. CONSTRUCTOR Load (Var S: TStream);
  562. DESTRUCTOR Done; Virtual;
  563. FUNCTION GetPalette: PPalette; Virtual;
  564. FUNCTION GetTitle (MaxSize: Sw_Integer): TTitleStr; Virtual;
  565. FUNCTION StandardScrollBar (AOptions: Word): PScrollBar;
  566. PROCEDURE Zoom; Virtual;
  567. PROCEDURE Close; Virtual;
  568. PROCEDURE InitFrame; Virtual;
  569. PROCEDURE SetState (AState: Word; Enable: Boolean); Virtual;
  570. PROCEDURE Store (Var S: TStream);
  571. PROCEDURE HandleEvent (Var Event: TEvent); Virtual;
  572. PROCEDURE SizeLimits (Var Min, Max: TPoint); Virtual;
  573. END;
  574. PWindow = ^TWindow;
  575. {***************************************************************************}
  576. { INTERFACE ROUTINES }
  577. {***************************************************************************}
  578. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  579. { WINDOW MESSAGE ROUTINES }
  580. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  581. {-Message------------------------------------------------------------
  582. Message sets up an event record and calls Receiver^.HandleEvent to
  583. handle the event. Message returns nil if Receiver is nil, or if
  584. the event is not handled successfully.
  585. 12Sep97 LdB
  586. ---------------------------------------------------------------------}
  587. FUNCTION Message (Receiver: PView; What, Command: Word;
  588. InfoPtr: Pointer): Pointer;
  589. {-NewMessage---------------------------------------------------------
  590. NewMessage sets up an event record including the new fields and calls
  591. Receiver^.HandleEvent to handle the event. Message returns nil if
  592. Receiver is nil, or if the event is not handled successfully.
  593. 19Sep97 LdB
  594. ---------------------------------------------------------------------}
  595. FUNCTION NewMessage (P: PView; What, Command: Word; Id: Sw_Integer; Data: Real;
  596. InfoPtr: Pointer): Pointer;
  597. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  598. { VIEW OBJECT REGISTRATION ROUTINES }
  599. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  600. {-RegisterViews------------------------------------------------------
  601. This registers all the view type objects used in this unit.
  602. 11Aug99 LdB
  603. ---------------------------------------------------------------------}
  604. PROCEDURE RegisterViews;
  605. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  606. { NEW VIEW ROUTINES }
  607. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  608. {-CreateIdScrollBar--------------------------------------------------
  609. Creates and scrollbar object of the given size and direction and sets
  610. the scrollbar id number.
  611. 22Sep97 LdB
  612. ---------------------------------------------------------------------}
  613. FUNCTION CreateIdScrollBar (X, Y, Size, Id: Sw_Integer; Horz: Boolean): PScrollBar;
  614. {***************************************************************************}
  615. { INITIALIZED PUBLIC VARIABLES }
  616. {***************************************************************************}
  617. {---------------------------------------------------------------------------}
  618. { INITIALIZED DOS/DPMI/WIN/NT/OS2 VARIABLES }
  619. {---------------------------------------------------------------------------}
  620. CONST
  621. UseNativeClasses: Boolean = True; { Native class modes }
  622. CommandSetChanged: Boolean = False; { Command change flag }
  623. ShowMarkers: Boolean = False; { Show marker state }
  624. ErrorAttr: Byte = $CF; { Error colours }
  625. PositionalEvents: Word = evMouse; { Positional defined }
  626. FocusedEvents: Word = evKeyboard + evCommand; { Focus defined }
  627. MinWinSize: TPoint = (X: 16; Y: 6); { Minimum window size }
  628. ShadowSize: TPoint = (X: 2; Y: 1); { Shadow sizes }
  629. ShadowAttr: Byte = $08; { Shadow attribute }
  630. { Characters used for drawing selected and default items in }
  631. { monochrome color sets }
  632. SpecialChars: Array [0..5] Of Char = (#175, #174, #26, #27, ' ', ' ');
  633. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  634. { STREAM REGISTRATION RECORDS }
  635. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  636. {---------------------------------------------------------------------------}
  637. { TView STREAM REGISTRATION }
  638. {---------------------------------------------------------------------------}
  639. CONST
  640. RView: TStreamRec = (
  641. ObjType: idView; { Register id = 1 }
  642. VmtLink: TypeOf(TView); { Alt style VMT link }
  643. Load: @TView.Load; { Object load method }
  644. Store: @TView.Store { Object store method }
  645. );
  646. {---------------------------------------------------------------------------}
  647. { TFrame STREAM REGISTRATION }
  648. {---------------------------------------------------------------------------}
  649. CONST
  650. RFrame: TStreamRec = (
  651. ObjType: idFrame; { Register id = 2 }
  652. VmtLink: TypeOf(TFrame); { Alt style VMT link }
  653. Load: @TFrame.Load; { Frame load method }
  654. Store: @TFrame.Store { Frame store method }
  655. );
  656. {---------------------------------------------------------------------------}
  657. { TScrollBar STREAM REGISTRATION }
  658. {---------------------------------------------------------------------------}
  659. CONST
  660. RScrollBar: TStreamRec = (
  661. ObjType: idScrollBar; { Register id = 3 }
  662. VmtLink: TypeOf(TScrollBar); { Alt style VMT link }
  663. Load: @TScrollBar.Load; { Object load method }
  664. Store: @TScrollBar.Store { Object store method }
  665. );
  666. {---------------------------------------------------------------------------}
  667. { TScroller STREAM REGISTRATION }
  668. {---------------------------------------------------------------------------}
  669. CONST
  670. RScroller: TStreamRec = (
  671. ObjType: idScroller; { Register id = 4 }
  672. VmtLink: TypeOf(TScroller); { Alt style VMT link }
  673. Load: @TScroller.Load; { Object load method }
  674. Store: @TScroller.Store { Object store method }
  675. );
  676. {---------------------------------------------------------------------------}
  677. { TListViewer STREAM REGISTRATION }
  678. {---------------------------------------------------------------------------}
  679. CONST
  680. RListViewer: TStreamRec = (
  681. ObjType: idListViewer; { Register id = 5 }
  682. VmtLink: TypeOf(TListViewer); { Alt style VMT link }
  683. Load: @TListViewer.Load; { Object load method }
  684. Store: @TLIstViewer.Store { Object store method }
  685. );
  686. {---------------------------------------------------------------------------}
  687. { TGroup STREAM REGISTRATION }
  688. {---------------------------------------------------------------------------}
  689. CONST
  690. RGroup: TStreamRec = (
  691. ObjType: idGroup; { Register id = 6 }
  692. VmtLink: TypeOf(TGroup); { Alt style VMT link }
  693. Load: @TGroup.Load; { Object load method }
  694. Store: @TGroup.Store { Object store method }
  695. );
  696. {---------------------------------------------------------------------------}
  697. { TWindow STREAM REGISTRATION }
  698. {---------------------------------------------------------------------------}
  699. CONST
  700. RWindow: TStreamRec = (
  701. ObjType: idWindow; { Register id = 7 }
  702. VmtLink: TypeOf(TWindow); { Alt style VMT link }
  703. Load: @TWindow.Load; { Object load method }
  704. Store: @TWindow.Store { Object store method }
  705. );
  706. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  707. IMPLEMENTATION
  708. {<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}
  709. USES
  710. Video;
  711. {***************************************************************************}
  712. { PRIVATE TYPE DEFINITIONS }
  713. {***************************************************************************}
  714. {---------------------------------------------------------------------------}
  715. { TFixupList DEFINITION }
  716. {---------------------------------------------------------------------------}
  717. TYPE
  718. TFixupList = ARRAY [1..4096] Of Pointer; { Fix up ptr array }
  719. PFixupList = ^TFixupList; { Ptr to fix up list }
  720. {***************************************************************************}
  721. { PRIVATE INITIALIZED VARIABLES }
  722. {***************************************************************************}
  723. {---------------------------------------------------------------------------}
  724. { INITIALIZED DOS/DPMI/WIN/NT/OS2 PRIVATE VARIABLES }
  725. {---------------------------------------------------------------------------}
  726. CONST
  727. TheTopView : PView = Nil; { Top focused view }
  728. LimitsLocked: PView = Nil; { View locking limits }
  729. OwnerGroup : PGroup = Nil; { Used for loading }
  730. FixupList : PFixupList = Nil; { Used for loading }
  731. CurCommandSet: TCommandSet = ([0..255] -
  732. [cmZoom, cmClose, cmResize, cmNext, cmPrev]); { All active but these }
  733. vdInSetCursor = $80; { AVOID RECURSION IN SetCursor }
  734. { Flags for TFrame }
  735. fmCloseClicked = $01;
  736. fmZoomClicked = $02;
  737. type
  738. TstatVar2 = record
  739. target : PView;
  740. offset,y : integer;
  741. end;
  742. var
  743. staticVar1 : PDrawBuffer;
  744. staticVar2 : TstatVar2;
  745. {***************************************************************************}
  746. { PRIVATE INTERNAL ROUTINES }
  747. {***************************************************************************}
  748. function posidx(const substr,s : string;idx:sw_integer):sw_integer;
  749. var
  750. i,j : sw_integer;
  751. e : boolean;
  752. begin
  753. i:=idx;
  754. j:=0;
  755. e:=(length(SubStr)>0);
  756. while e and (i<=Length(s)-Length(SubStr)) do
  757. begin
  758. if (SubStr[1]=s[i]) and (Substr=Copy(s,i,Length(SubStr))) then
  759. begin
  760. j:=i;
  761. e:=false;
  762. end;
  763. inc(i);
  764. end;
  765. PosIdx:=j;
  766. end;
  767. {$ifdef UNIX}
  768. const
  769. MouseUsesVideoBuf = true;
  770. {$else not UNIX}
  771. const
  772. MouseUsesVideoBuf = false;
  773. {$endif not UNIX}
  774. procedure DrawScreenBuf(force:boolean);
  775. begin
  776. if (GetLockScreenCount=0) then
  777. begin
  778. { If MouseUsesVideoBuf then
  779. begin
  780. LockScreenUpdate;
  781. HideMouse;
  782. ShowMouse;
  783. UnlockScreenUpdate;
  784. end
  785. else
  786. HideMouse;}
  787. UpdateScreen(force);
  788. { If not MouseUsesVideoBuf then
  789. ShowMouse;}
  790. end;
  791. end;
  792. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  793. { VIEW PORT CONTROL ROUTINES }
  794. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  795. TYPE
  796. ViewPortType = RECORD
  797. X1, Y1, X2, Y2: Integer; { Corners of viewport }
  798. Clip : Boolean; { Clip status }
  799. END;
  800. var
  801. ViewPort : ViewPortType;
  802. {---------------------------------------------------------------------------}
  803. { GetViewSettings -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB }
  804. {---------------------------------------------------------------------------}
  805. PROCEDURE GetViewSettings (Var CurrentViewPort: ViewPortType);
  806. BEGIN
  807. CurrentViewPort := ViewPort; { Textmode viewport }
  808. END;
  809. {---------------------------------------------------------------------------}
  810. { SetViewPort -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05Dec2000 LdB }
  811. {---------------------------------------------------------------------------}
  812. PROCEDURE SetViewPort (X1, Y1, X2, Y2: Integer; Clip: Boolean);
  813. BEGIN
  814. If (X1 < 0) Then X1 := 0; { X1 negative fix }
  815. If (X1 >ScreenWidth) Then
  816. X1 := ScreenWidth; { X1 off screen fix }
  817. If (Y1 < 0) Then Y1 := 0; { Y1 negative fix }
  818. If (Y1 > ScreenHeight) Then
  819. Y1 := ScreenHeight; { Y1 off screen fix }
  820. If (X2 < 0) Then X2 := 0; { X2 negative fix }
  821. If (X2 > ScreenWidth) Then
  822. X2 := ScreenWidth; { X2 off screen fix }
  823. If (Y2 < 0) Then Y2 := 0; { Y2 negative fix }
  824. If (Y2 > ScreenHeight) Then
  825. Y2 := ScreenHeight; { Y2 off screen fix }
  826. ViewPort.X1 := X1; { Set X1 port value }
  827. ViewPort.Y1 := Y1; { Set Y1 port value }
  828. ViewPort.X2 := X2; { Set X2 port value }
  829. ViewPort.Y2 := Y2; { Set Y2 port value }
  830. ViewPort.Clip := Clip; { Set port clip value }
  831. { $ifdef DEBUG
  832. If WriteDebugInfo then
  833. Writeln(stderr,'New ViewPort(',X1,',',Y1,',',X2,',',Y2,')');
  834. $endif DEBUG}
  835. END;
  836. {***************************************************************************}
  837. { OBJECT METHODS }
  838. {***************************************************************************}
  839. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  840. { TView OBJECT METHODS }
  841. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  842. {--TView--------------------------------------------------------------------}
  843. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20Jun96 LdB }
  844. {---------------------------------------------------------------------------}
  845. CONSTRUCTOR TView.Init (Var Bounds: TRect);
  846. BEGIN
  847. Inherited Init; { Call ancestor }
  848. DragMode := dmLimitLoY; { Default drag mode }
  849. HelpCtx := hcNoContext; { Clear help context }
  850. State := sfVisible; { Default state }
  851. EventMask := evMouseDown + evKeyDown + evCommand; { Default event masks }
  852. BackgroundChar := ' ';
  853. SetBounds(Bounds); { Set view bounds }
  854. END;
  855. {--TView--------------------------------------------------------------------}
  856. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 06May98 LdB }
  857. {---------------------------------------------------------------------------}
  858. { This load method will read old original TV data from a stream but the }
  859. { new options and tabmasks are not set so some NEW functionality is not }
  860. { supported but it should work as per original TV code. }
  861. {---------------------------------------------------------------------------}
  862. CONSTRUCTOR TView.Load (Var S: TStream);
  863. VAR i: Integer;
  864. BEGIN
  865. Inherited Init; { Call ancestor }
  866. S.Read(i, SizeOf(i)); Origin.X:=i; { Read origin x value }
  867. S.Read(i, SizeOf(i)); Origin.Y:=i; { Read origin y value }
  868. S.Read(i, SizeOf(i)); Size.X:=i; { Read view x size }
  869. S.Read(i, SizeOf(i)); Size.Y:=i; { Read view y size }
  870. S.Read(i, SizeOf(i)); Cursor.X:=i; { Read cursor x size }
  871. S.Read(i, SizeOf(i)); Cursor.Y:=i; { Read cursor y size }
  872. S.Read(GrowMode, SizeOf(GrowMode)); { Read growmode flags }
  873. S.Read(DragMode, SizeOf(DragMode)); { Read dragmode flags }
  874. S.Read(HelpCtx, SizeOf(HelpCtx)); { Read help context }
  875. S.Read(State, SizeOf(State)); { Read state masks }
  876. S.Read(Options, SizeOf(Options)); { Read options masks }
  877. S.Read(Eventmask, SizeOf(Eventmask)); { Read event masks }
  878. END;
  879. {--TView--------------------------------------------------------------------}
  880. { Done -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Nov99 LdB }
  881. {---------------------------------------------------------------------------}
  882. DESTRUCTOR TView.Done;
  883. VAR P: PComplexArea;
  884. BEGIN
  885. Hide; { Hide the view }
  886. If (Owner <> Nil) Then Owner^.Delete(@Self); { Delete from owner }
  887. While (HoldLimit <> Nil) Do Begin { Free limit memory }
  888. P := HoldLimit^.NextArea; { Hold next pointer }
  889. FreeMem(HoldLimit, SizeOf(TComplexArea)); { Release memory }
  890. HoldLimit := P; { Shuffle to next }
  891. End;
  892. END;
  893. {--TView--------------------------------------------------------------------}
  894. { Prev -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  895. {---------------------------------------------------------------------------}
  896. FUNCTION TView.Prev: PView;
  897. VAR NP : PView;
  898. BEGIN
  899. Prev := @Self;
  900. NP := Next;
  901. While (NP <> Nil) AND (NP <> @Self) Do
  902. Begin
  903. Prev := NP; { Locate next view }
  904. NP := NP^.Next;
  905. End;
  906. END;
  907. {--TView--------------------------------------------------------------------}
  908. { Execute -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  909. {---------------------------------------------------------------------------}
  910. FUNCTION TView.Execute: Word;
  911. BEGIN
  912. Execute := cmCancel; { Return cancel }
  913. END;
  914. {--TView--------------------------------------------------------------------}
  915. { Focus -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05May98 LdB }
  916. {---------------------------------------------------------------------------}
  917. FUNCTION TView.Focus: Boolean;
  918. VAR Res: Boolean;
  919. BEGIN
  920. Res := True; { Preset result }
  921. If (State AND (sfSelected + sfModal)=0) Then Begin { Not modal/selected }
  922. If (Owner <> Nil) Then Begin { View has an owner }
  923. Res := Owner^.Focus; { Return focus state }
  924. If Res Then { Owner has focus }
  925. If ((Owner^.Current = Nil) OR { No current view }
  926. (Owner^.Current^.Options AND ofValidate = 0) { Non validating view }
  927. OR (Owner^.Current^.Valid(cmReleasedFocus))) { Okay to drop focus }
  928. Then Select Else Res := False; { Then select us }
  929. End;
  930. End;
  931. Focus := Res; { Return focus result }
  932. END;
  933. {--TView--------------------------------------------------------------------}
  934. { DataSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  935. {---------------------------------------------------------------------------}
  936. FUNCTION TView.DataSize: Sw_Word;
  937. BEGIN
  938. DataSize := 0; { Transfer size }
  939. END;
  940. {--TView--------------------------------------------------------------------}
  941. { TopView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  942. {---------------------------------------------------------------------------}
  943. FUNCTION TView.TopView: PView;
  944. VAR P: PView;
  945. BEGIN
  946. If (TheTopView = Nil) Then Begin { Check topmost view }
  947. P := @Self; { Start with us }
  948. While (P <> Nil) AND (P^.State AND sfModal = 0) { Check if modal }
  949. Do P := P^.Owner; { Search each owner }
  950. TopView := P; { Return result }
  951. End Else TopView := TheTopView; { Return topview }
  952. END;
  953. {--TView--------------------------------------------------------------------}
  954. { PrevView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  955. {---------------------------------------------------------------------------}
  956. FUNCTION TView.PrevView: PView;
  957. BEGIN
  958. If (@Self = Owner^.First) Then PrevView := Nil { We are first view }
  959. Else PrevView := Prev; { Return our prior }
  960. END;
  961. {--TView--------------------------------------------------------------------}
  962. { NextView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  963. {---------------------------------------------------------------------------}
  964. FUNCTION TView.NextView: PView;
  965. BEGIN
  966. If (@Self = Owner^.Last) Then NextView := Nil { This is last view }
  967. Else NextView := Next; { Return our next }
  968. END;
  969. {--TView--------------------------------------------------------------------}
  970. { GetHelpCtx -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  971. {---------------------------------------------------------------------------}
  972. FUNCTION TView.GetHelpCtx: Word;
  973. BEGIN
  974. If (State AND sfDragging <> 0) Then { Dragging state check }
  975. GetHelpCtx := hcDragging Else { Return dragging }
  976. GetHelpCtx := HelpCtx; { Return help context }
  977. END;
  978. {--TView--------------------------------------------------------------------}
  979. { EventAvail -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  980. {---------------------------------------------------------------------------}
  981. FUNCTION TView.EventAvail: Boolean;
  982. VAR Event: TEvent;
  983. BEGIN
  984. GetEvent(Event); { Get next event }
  985. If (Event.What <> evNothing) Then PutEvent(Event); { Put it back }
  986. EventAvail := (Event.What <> evNothing); { Return result }
  987. END;
  988. {--TView--------------------------------------------------------------------}
  989. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  990. {---------------------------------------------------------------------------}
  991. FUNCTION TView.GetPalette: PPalette;
  992. BEGIN
  993. GetPalette := Nil; { Return nil ptr }
  994. END;
  995. {--TView--------------------------------------------------------------------}
  996. { MapColor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Jul99 LdB }
  997. {---------------------------------------------------------------------------}
  998. function TView.MapColor(color:byte):byte;
  999. var
  1000. cur : PView;
  1001. p : PPalette;
  1002. begin
  1003. if color=0 then
  1004. MapColor:=errorAttr
  1005. else
  1006. begin
  1007. cur:=@Self;
  1008. repeat
  1009. p:=cur^.GetPalette;
  1010. if (p<>Nil) then
  1011. if ord(p^[0])<>0 then
  1012. begin
  1013. if color>ord(p^[0]) then
  1014. begin
  1015. MapColor:=errorAttr;
  1016. Exit;
  1017. end;
  1018. color:=ord(p^[color]);
  1019. if color=0 then
  1020. begin
  1021. MapColor:=errorAttr;
  1022. Exit;
  1023. end;
  1024. end;
  1025. cur:=cur^.Owner;
  1026. until (cur=Nil);
  1027. MapColor:=color;
  1028. end;
  1029. end;
  1030. {--TView--------------------------------------------------------------------}
  1031. { GetColor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Jul99 LdB }
  1032. {---------------------------------------------------------------------------}
  1033. FUNCTION TView.GetColor (Color: Word): Word;
  1034. VAR Col: Byte; W: Word; P: PPalette; Q: PView;
  1035. BEGIN
  1036. W := 0; { Clear colour Sw_Word }
  1037. If (Hi(Color) > 0) Then Begin { High colour req }
  1038. Col := Hi(Color) + ColourOfs; { Initial offset }
  1039. Q := @Self; { Pointer to self }
  1040. Repeat
  1041. P := Q^.GetPalette; { Get our palette }
  1042. If (P <> Nil) Then Begin { Palette is valid }
  1043. If (Col <= Length(P^)) Then
  1044. Col := Ord(P^[Col]) Else { Return colour }
  1045. Col := ErrorAttr; { Error attribute }
  1046. End;
  1047. Q := Q^.Owner; { Move up to owner }
  1048. Until (Q = Nil); { Until no owner }
  1049. W := Col SHL 8; { Translate colour }
  1050. End;
  1051. If (Lo(Color) > 0) Then Begin
  1052. Col := Lo(Color) + ColourOfs; { Initial offset }
  1053. Q := @Self; { Pointer to self }
  1054. Repeat
  1055. P := Q^.GetPalette; { Get our palette }
  1056. If (P <> Nil) Then Begin { Palette is valid }
  1057. If (Col <= Length(P^)) Then
  1058. Col := Ord(P^[Col]) Else { Return colour }
  1059. Col := ErrorAttr; { Error attribute }
  1060. End;
  1061. Q := Q^.Owner; { Move up to owner }
  1062. Until (Q = Nil); { Until no owner }
  1063. End Else Col := ErrorAttr; { No colour found }
  1064. GetColor := W OR Col; { Return color }
  1065. END;
  1066. {--TView--------------------------------------------------------------------}
  1067. { Valid -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1068. {---------------------------------------------------------------------------}
  1069. FUNCTION TView.Valid (Command: Word): Boolean;
  1070. BEGIN
  1071. Valid := True; { Simply return true }
  1072. END;
  1073. {--TView--------------------------------------------------------------------}
  1074. { GetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1075. {---------------------------------------------------------------------------}
  1076. FUNCTION TView.GetState (AState: Word): Boolean;
  1077. BEGIN
  1078. GetState := State AND AState = AState; { Check states equal }
  1079. END;
  1080. {--TView--------------------------------------------------------------------}
  1081. { TextWidth -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 25Nov99 LdB }
  1082. {---------------------------------------------------------------------------}
  1083. FUNCTION TView.TextWidth (const Txt: String): Sw_Integer;
  1084. BEGIN
  1085. TextWidth := Length(Txt); { Calc text length }
  1086. END;
  1087. FUNCTION TView.CTextWidth (const Txt: String): Sw_Integer;
  1088. VAR I: Sw_Integer; S: String;
  1089. BEGIN
  1090. S := Txt; { Transfer text }
  1091. Repeat
  1092. I := Pos('~', S); { Check for tilde }
  1093. If (I <> 0) Then System.Delete(S, I, 1); { Remove the tilde }
  1094. Until (I = 0); { Remove all tildes }
  1095. CTextWidth := Length(S); { Calc text length }
  1096. END;
  1097. {--TView--------------------------------------------------------------------}
  1098. { MouseInView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1099. {---------------------------------------------------------------------------}
  1100. FUNCTION TView.MouseInView (Point: TPoint): Boolean;
  1101. BEGIN
  1102. MakeLocal(Point,Point);
  1103. MouseInView := (Point.X >= 0) and
  1104. (Point.Y >= 0) and
  1105. (Point.X < Size.X) and
  1106. (Point.Y < Size.Y);
  1107. END;
  1108. {--TView--------------------------------------------------------------------}
  1109. { CommandEnabled -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1110. {---------------------------------------------------------------------------}
  1111. FUNCTION TView.CommandEnabled(Command: Word): Boolean;
  1112. BEGIN
  1113. CommandEnabled := (Command > 255) OR
  1114. (Command IN CurCommandSet); { Check command }
  1115. END;
  1116. {--TView--------------------------------------------------------------------}
  1117. { OverLapsArea -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Sep97 LdB }
  1118. {---------------------------------------------------------------------------}
  1119. FUNCTION TView.OverlapsArea (X1, Y1, X2, Y2: Sw_Integer): Boolean;
  1120. BEGIN
  1121. OverLapsArea := False; { Preset false }
  1122. If (Origin.X > X2) Then Exit; { Area to the left }
  1123. If ((Origin.X + Size.X) < X1) Then Exit; { Area to the right }
  1124. If (Origin.Y > Y2) Then Exit; { Area is above }
  1125. If ((Origin.Y + Size.Y) < Y1) Then Exit; { Area is below }
  1126. OverLapsArea := True; { Return true }
  1127. END;
  1128. {--TView--------------------------------------------------------------------}
  1129. { MouseEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1130. {---------------------------------------------------------------------------}
  1131. FUNCTION TView.MouseEvent (Var Event: TEvent; Mask: Word): Boolean;
  1132. BEGIN
  1133. Repeat
  1134. GetEvent(Event); { Get next event }
  1135. Until (Event.What AND (Mask OR evMouseUp) <> 0); { Wait till valid }
  1136. MouseEvent := Event.What <> evMouseUp; { Return result }
  1137. END;
  1138. {--TView--------------------------------------------------------------------}
  1139. { Hide -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1140. {---------------------------------------------------------------------------}
  1141. PROCEDURE TView.Hide;
  1142. BEGIN
  1143. If (State AND sfVisible <> 0) Then { View is visible }
  1144. SetState(sfVisible, False); { Hide the view }
  1145. END;
  1146. {--TView--------------------------------------------------------------------}
  1147. { Show -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1148. {---------------------------------------------------------------------------}
  1149. PROCEDURE TView.Show;
  1150. BEGIN
  1151. If (State AND sfVisible = 0) Then { View not visible }
  1152. SetState(sfVisible, True); { Show the view }
  1153. END;
  1154. {--TView--------------------------------------------------------------------}
  1155. { Draw -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Sep97 LdB }
  1156. {---------------------------------------------------------------------------}
  1157. PROCEDURE TView.Draw;
  1158. VAR B : TDrawBuffer;
  1159. BEGIN
  1160. MoveChar(B, ' ', GetColor(1), Size.X);
  1161. WriteLine(0, 0, Size.X, Size.Y, B);
  1162. END;
  1163. procedure TView.ResetCursor;
  1164. const
  1165. sfV_CV_F:word = sfVisible + sfCursorVis + sfFocused;
  1166. var
  1167. p,p2 : PView;
  1168. G : PGroup;
  1169. cur : TPoint;
  1170. function Check0:boolean;
  1171. var
  1172. res : byte;
  1173. begin
  1174. res:=0;
  1175. while res=0 do
  1176. begin
  1177. p:=p^.next;
  1178. if p=p2 then
  1179. begin
  1180. p:=P^.owner;
  1181. res:=1
  1182. end
  1183. else
  1184. if ((p^.state and sfVisible)<>0) and
  1185. (cur.x>=p^.origin.x) and
  1186. (cur.x<p^.size.x+p^.origin.x) and
  1187. (cur.y>=p^.origin.y) and
  1188. (cur.y<p^.size.y+p^.origin.y) then
  1189. res:=2;
  1190. end;
  1191. Check0:=res=2;
  1192. end;
  1193. begin
  1194. if ((state and sfV_CV_F) = sfV_CV_F) then
  1195. begin
  1196. p:=@Self;
  1197. cur:=cursor;
  1198. while true do
  1199. begin
  1200. if (cur.x<0) or (cur.x>=p^.size.x) or
  1201. (cur.y<0) or (cur.y>=p^.size.y) then
  1202. break;
  1203. inc(cur.X,p^.origin.X);
  1204. inc(cur.Y,p^.origin.Y);
  1205. p2:=p;
  1206. G:=p^.owner;
  1207. if G=Nil then { top view }
  1208. begin
  1209. Video.SetCursorPos(cur.x,cur.y);
  1210. if (state and sfCursorIns)<>0 then
  1211. Video.SetCursorType(crBlock)
  1212. else
  1213. Video.SetCursorType(crUnderline);
  1214. exit;
  1215. end;
  1216. if (G^.state and sfVisible)=0 then
  1217. break;
  1218. p:=G^.Last;
  1219. if Check0 then
  1220. break;
  1221. end; { while }
  1222. end; { if }
  1223. Video.SetCursorType(crHidden);
  1224. end;
  1225. {--TView--------------------------------------------------------------------}
  1226. { Select -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 05May98 LdB }
  1227. {---------------------------------------------------------------------------}
  1228. PROCEDURE TView.Select;
  1229. BEGIN
  1230. If (Options AND ofSelectable <> 0) Then { View is selectable }
  1231. If (Options AND ofTopSelect <> 0) Then MakeFirst { Top selectable }
  1232. Else If (Owner <> Nil) Then { Valid owner }
  1233. Owner^.SetCurrent(@Self, NormalSelect); { Make owners current }
  1234. END;
  1235. {--TView--------------------------------------------------------------------}
  1236. { Awaken -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1237. {---------------------------------------------------------------------------}
  1238. PROCEDURE TView.Awaken;
  1239. BEGIN { Abstract method }
  1240. END;
  1241. {--TView--------------------------------------------------------------------}
  1242. { MakeFirst -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Sep99 LdB }
  1243. {---------------------------------------------------------------------------}
  1244. PROCEDURE TView.MakeFirst;
  1245. BEGIN
  1246. If (Owner <> Nil) Then Begin { Must have owner }
  1247. PutInFrontOf(Owner^.First); { Float to the top }
  1248. End;
  1249. END;
  1250. {--TView--------------------------------------------------------------------}
  1251. { DrawCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Sep97 LdB }
  1252. {---------------------------------------------------------------------------}
  1253. PROCEDURE TView.DrawCursor;
  1254. BEGIN { Abstract method }
  1255. if State and sfFocused <> 0 then
  1256. ResetCursor;
  1257. END;
  1258. procedure TView.DrawHide(LastView: PView);
  1259. begin
  1260. TView.DrawCursor;
  1261. DrawUnderView(State and sfShadow <> 0, LastView);
  1262. end;
  1263. procedure TView.DrawShow(LastView: PView);
  1264. begin
  1265. DrawView;
  1266. if State and sfShadow <> 0 then
  1267. DrawUnderView(True, LastView);
  1268. end;
  1269. procedure TView.DrawUnderRect(var R: TRect; LastView: PView);
  1270. begin
  1271. Owner^.Clip.Intersect(R);
  1272. Owner^.DrawSubViews(NextView, LastView);
  1273. Owner^.GetExtent(Owner^.Clip);
  1274. end;
  1275. procedure TView.DrawUnderView(DoShadow: Boolean; LastView: PView);
  1276. var
  1277. R: TRect;
  1278. begin
  1279. GetBounds(R);
  1280. if DoShadow then
  1281. begin
  1282. inc(R.B.X,ShadowSize.X);
  1283. inc(R.B.Y,ShadowSize.Y);
  1284. end;
  1285. DrawUnderRect(R, LastView);
  1286. end;
  1287. procedure TView.DrawView;
  1288. begin
  1289. if Exposed then
  1290. begin
  1291. LockScreenUpdate; { don't update the screen yet }
  1292. Draw;
  1293. UnLockScreenUpdate;
  1294. DrawScreenBuf(false);
  1295. TView.DrawCursor;
  1296. end;
  1297. end;
  1298. {--TView--------------------------------------------------------------------}
  1299. { HideCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1300. {---------------------------------------------------------------------------}
  1301. PROCEDURE TView.HideCursor;
  1302. BEGIN
  1303. SetState(sfCursorVis , False); { Hide the cursor }
  1304. END;
  1305. {--TView--------------------------------------------------------------------}
  1306. { ShowCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1307. {---------------------------------------------------------------------------}
  1308. PROCEDURE TView.ShowCursor;
  1309. BEGIN
  1310. SetState(sfCursorVis , True); { Show the cursor }
  1311. END;
  1312. {--TView--------------------------------------------------------------------}
  1313. { BlockCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1314. {---------------------------------------------------------------------------}
  1315. PROCEDURE TView.BlockCursor;
  1316. BEGIN
  1317. SetState(sfCursorIns, True); { Set insert mode }
  1318. END;
  1319. {--TView--------------------------------------------------------------------}
  1320. { NormalCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1321. {---------------------------------------------------------------------------}
  1322. PROCEDURE TView.NormalCursor;
  1323. BEGIN
  1324. SetState(sfCursorIns, False); { Clear insert mode }
  1325. END;
  1326. {--TView--------------------------------------------------------------------}
  1327. { FocusFromTop -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 11Aug99 LdB }
  1328. {---------------------------------------------------------------------------}
  1329. PROCEDURE TView.FocusFromTop;
  1330. BEGIN
  1331. If (Owner <> Nil) AND
  1332. (Owner^.State AND sfSelected = 0)
  1333. Then Owner^.Select;
  1334. If (State AND sfFocused = 0) Then Focus;
  1335. If (State AND sfSelected = 0) Then Select;
  1336. END;
  1337. {--TView--------------------------------------------------------------------}
  1338. { MoveTo -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1339. {---------------------------------------------------------------------------}
  1340. PROCEDURE TView.MoveTo (X, Y: Sw_Integer);
  1341. VAR R: TRect;
  1342. BEGIN
  1343. R.Assign(X, Y, X + Size.X, Y + Size.Y); { Assign area }
  1344. Locate(R); { Locate the view }
  1345. END;
  1346. {--TView--------------------------------------------------------------------}
  1347. { GrowTo -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1348. {---------------------------------------------------------------------------}
  1349. PROCEDURE TView.GrowTo (X, Y: Sw_Integer);
  1350. VAR R: TRect;
  1351. BEGIN
  1352. R.Assign(Origin.X, Origin.Y, Origin.X + X,
  1353. Origin.Y + Y); { Assign area }
  1354. Locate(R); { Locate the view }
  1355. END;
  1356. {--TView--------------------------------------------------------------------}
  1357. { EndModal -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1358. {---------------------------------------------------------------------------}
  1359. PROCEDURE TView.EndModal (Command: Word);
  1360. VAR P: PView;
  1361. BEGIN
  1362. P := TopView; { Get top view }
  1363. If (P <> Nil) Then P^.EndModal(Command); { End modal operation }
  1364. END;
  1365. {--TView--------------------------------------------------------------------}
  1366. { SetCursor -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1367. {---------------------------------------------------------------------------}
  1368. PROCEDURE TView.SetCursor (X, Y: Sw_Integer);
  1369. BEGIN
  1370. if (Cursor.X<>X) or (Cursor.Y<>Y) then
  1371. begin
  1372. Cursor.X := X;
  1373. Cursor.Y := Y;
  1374. CursorChanged;
  1375. end;
  1376. TView.DrawCursor;
  1377. END;
  1378. procedure TView.CursorChanged;
  1379. begin
  1380. Message(Owner,evBroadcast,cmCursorChanged,@Self);
  1381. end;
  1382. {--TView--------------------------------------------------------------------}
  1383. { PutInFrontOf -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Sep99 LdB }
  1384. {---------------------------------------------------------------------------}
  1385. PROCEDURE TView.PutInFrontOf (Target: PView);
  1386. VAR P, LastView: PView;
  1387. BEGIN
  1388. If (Owner <> Nil) AND (Target <> @Self) AND
  1389. (Target <> NextView) AND ((Target = Nil) OR
  1390. (Target^.Owner = Owner)) Then { Check validity }
  1391. If (State AND sfVisible = 0) Then Begin { View not visible }
  1392. Owner^.RemoveView(@Self); { Remove from list }
  1393. Owner^.InsertView(@Self, Target); { Insert into list }
  1394. End Else Begin
  1395. LastView := NextView; { Hold next view }
  1396. If (LastView <> Nil) Then Begin { Lastview is valid }
  1397. P := Target; { P is target }
  1398. While (P <> Nil) AND (P <> LastView)
  1399. Do P := P^.NextView; { Find our next view }
  1400. If (P = Nil) Then LastView := Target; { Lastview is target }
  1401. End;
  1402. State := State AND NOT sfVisible; { Temp stop drawing }
  1403. If (LastView = Target) Then
  1404. DrawHide(LastView);
  1405. Owner^.Lock;
  1406. Owner^.RemoveView(@Self); { Remove from list }
  1407. Owner^.InsertView(@Self, Target); { Insert into list }
  1408. State := State OR sfVisible; { Allow drawing again }
  1409. If (LastView <> Target) Then
  1410. DrawShow(LastView);
  1411. If (Options AND ofSelectable <> 0) Then { View is selectable }
  1412. begin
  1413. Owner^.ResetCurrent; { Reset current }
  1414. Owner^.ResetCursor;
  1415. end;
  1416. Owner^.Unlock;
  1417. End;
  1418. END;
  1419. {--TView--------------------------------------------------------------------}
  1420. { SetCommands -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1421. {---------------------------------------------------------------------------}
  1422. PROCEDURE TView.SetCommands (Commands: TCommandSet);
  1423. BEGIN
  1424. CommandSetChanged := CommandSetChanged OR
  1425. (CurCommandSet <> Commands); { Set change flag }
  1426. CurCommandSet := Commands; { Set command set }
  1427. END;
  1428. {--TView--------------------------------------------------------------------}
  1429. { EnableCommands -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1430. {---------------------------------------------------------------------------}
  1431. PROCEDURE TView.EnableCommands (Commands: TCommandSet);
  1432. BEGIN
  1433. CommandSetChanged := CommandSetChanged OR
  1434. (CurCommandSet * Commands <> Commands); { Set changed flag }
  1435. CurCommandSet := CurCommandSet + Commands; { Update command set }
  1436. END;
  1437. {--TView--------------------------------------------------------------------}
  1438. { DisableCommands -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1439. {---------------------------------------------------------------------------}
  1440. PROCEDURE TView.DisableCommands (Commands: TCommandSet);
  1441. BEGIN
  1442. CommandSetChanged := CommandSetChanged OR
  1443. (CurCommandSet * Commands <> []); { Set changed flag }
  1444. CurCommandSet := CurCommandSet - Commands; { Update command set }
  1445. END;
  1446. {--TView--------------------------------------------------------------------}
  1447. { SetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep99 LdB }
  1448. {---------------------------------------------------------------------------}
  1449. PROCEDURE TView.SetState (AState: Word; Enable: Boolean);
  1450. var
  1451. Command: Word;
  1452. OState : Word;
  1453. begin
  1454. OState:=State;
  1455. if Enable then
  1456. State := State or AState
  1457. else
  1458. State := State and not AState;
  1459. if Owner <> nil then
  1460. case AState of
  1461. sfVisible:
  1462. begin
  1463. if Owner^.State and sfExposed <> 0 then
  1464. SetState(sfExposed, Enable);
  1465. if Enable then
  1466. DrawShow(nil)
  1467. else
  1468. DrawHide(nil);
  1469. if Options and ofSelectable <> 0 then
  1470. Owner^.ResetCurrent;
  1471. end;
  1472. sfCursorVis,
  1473. sfCursorIns:
  1474. TView.DrawCursor;
  1475. sfShadow:
  1476. DrawUnderView(True, nil);
  1477. sfFocused:
  1478. begin
  1479. ResetCursor;
  1480. if Enable then
  1481. Command := cmReceivedFocus
  1482. else
  1483. Command := cmReleasedFocus;
  1484. Message(Owner, evBroadcast, Command, @Self);
  1485. end;
  1486. end;
  1487. if ((OState xor State) and (sfCursorVis+sfCursorIns+sfFocused))<>0 then
  1488. CursorChanged;
  1489. end;
  1490. {--TView--------------------------------------------------------------------}
  1491. { SetCmdState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1492. {---------------------------------------------------------------------------}
  1493. PROCEDURE TView.SetCmdState (Commands: TCommandSet; Enable: Boolean);
  1494. BEGIN
  1495. If Enable Then EnableCommands(Commands) { Enable commands }
  1496. Else DisableCommands(Commands); { Disable commands }
  1497. END;
  1498. {--TView--------------------------------------------------------------------}
  1499. { GetData -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1500. {---------------------------------------------------------------------------}
  1501. PROCEDURE TView.GetData (Var Rec);
  1502. BEGIN { Abstract method }
  1503. END;
  1504. {--TView--------------------------------------------------------------------}
  1505. { SetData -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1506. {---------------------------------------------------------------------------}
  1507. PROCEDURE TView.SetData (Var Rec);
  1508. BEGIN { Abstract method }
  1509. END;
  1510. {--TView--------------------------------------------------------------------}
  1511. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 06May98 LdB }
  1512. {---------------------------------------------------------------------------}
  1513. PROCEDURE TView.Store (Var S: TStream);
  1514. VAR SaveState: Word;
  1515. i: integer;
  1516. BEGIN
  1517. SaveState := State; { Hold current state }
  1518. State := State AND NOT (sfActive OR sfSelected OR
  1519. sfFocused OR sfExposed); { Clear flags }
  1520. i:=Origin.X;S.Write(i, SizeOf(i)); { Write view x origin }
  1521. i:=Origin.Y;S.Write(i, SizeOf(i)); { Write view y origin }
  1522. i:=Size.X;S.Write(i, SizeOf(i)); { Write view x size }
  1523. i:=Size.Y;S.Write(i, SizeOf(i)); { Write view y size }
  1524. i:=Cursor.X;S.Write(i, SizeOf(i)); { Write cursor x size }
  1525. i:=Cursor.Y;S.Write(i, SizeOf(i)); { Write cursor y size }
  1526. S.Write(GrowMode, SizeOf(GrowMode)); { Write growmode flags }
  1527. S.Write(DragMode, SizeOf(DragMode)); { Write dragmode flags }
  1528. S.Write(HelpCtx, SizeOf(HelpCtx)); { Write help context }
  1529. S.Write(State, SizeOf(State)); { Write state masks }
  1530. S.Write(Options, SizeOf(Options)); { Write options masks }
  1531. S.Write(Eventmask, SizeOf(Eventmask)); { Write event masks }
  1532. State := SaveState; { Reset state masks }
  1533. END;
  1534. {--TView--------------------------------------------------------------------}
  1535. { Locate -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 24Sep99 LdB }
  1536. {---------------------------------------------------------------------------}
  1537. PROCEDURE TView.Locate (Var Bounds: TRect);
  1538. VAR
  1539. Min, Max: TPoint; R: TRect;
  1540. FUNCTION Range(Val, Min, Max: Sw_Integer): Sw_Integer;
  1541. BEGIN
  1542. If (Val < Min) Then Range := Min Else { Value to small }
  1543. If (Val > Max) Then Range := Max Else { Value to large }
  1544. Range := Val; { Value is okay }
  1545. END;
  1546. BEGIN
  1547. SizeLimits(Min, Max); { Get size limits }
  1548. Bounds.B.X := Bounds.A.X + Range(Bounds.B.X -
  1549. Bounds.A.X, Min.X, Max.X); { X bound limit }
  1550. Bounds.B.Y := Bounds.A.Y + Range(Bounds.B.Y
  1551. - Bounds.A.Y, Min.Y, Max.Y); { Y bound limit }
  1552. GetBounds(R); { Current bounds }
  1553. If NOT Bounds.Equals(R) Then Begin { Size has changed }
  1554. ChangeBounds(Bounds); { Change bounds }
  1555. If (State AND sfVisible <> 0) AND { View is visible }
  1556. (State AND sfExposed <> 0) AND (Owner <> Nil) { Check view exposed }
  1557. Then
  1558. begin
  1559. if State and sfShadow <> 0 then
  1560. begin
  1561. R.Union(Bounds);
  1562. Inc(R.B.X, ShadowSize.X);
  1563. Inc(R.B.Y, ShadowSize.Y);
  1564. end;
  1565. DrawUnderRect(R, nil);
  1566. end;
  1567. End;
  1568. END;
  1569. {--TView--------------------------------------------------------------------}
  1570. { KeyEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1571. {---------------------------------------------------------------------------}
  1572. PROCEDURE TView.KeyEvent (Var Event: TEvent);
  1573. BEGIN
  1574. Repeat
  1575. GetEvent(Event); { Get next event }
  1576. Until (Event.What = evKeyDown); { Wait till keydown }
  1577. END;
  1578. {--TView--------------------------------------------------------------------}
  1579. { GetEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1580. {---------------------------------------------------------------------------}
  1581. PROCEDURE TView.GetEvent (Var Event: TEvent);
  1582. BEGIN
  1583. If (Owner <> Nil) Then Owner^.GetEvent(Event); { Event from owner }
  1584. END;
  1585. {--TView--------------------------------------------------------------------}
  1586. { PutEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1587. {---------------------------------------------------------------------------}
  1588. PROCEDURE TView.PutEvent (Var Event: TEvent);
  1589. BEGIN
  1590. If (Owner <> Nil) Then Owner^.PutEvent(Event); { Put in owner }
  1591. END;
  1592. {--TView--------------------------------------------------------------------}
  1593. { GetExtent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1594. {---------------------------------------------------------------------------}
  1595. PROCEDURE TView.GetExtent (Var Extent: TRect);
  1596. BEGIN
  1597. Extent.A.X := 0; { Zero x field }
  1598. Extent.A.Y := 0; { Zero y field }
  1599. Extent.B.X := Size.X; { Return x size }
  1600. Extent.B.Y := Size.Y; { Return y size }
  1601. END;
  1602. {--TView--------------------------------------------------------------------}
  1603. { GetBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1604. {---------------------------------------------------------------------------}
  1605. PROCEDURE TView.GetBounds (Var Bounds: TRect);
  1606. BEGIN
  1607. Bounds.A := Origin; { Get first corner }
  1608. Bounds.B.X := Origin.X + Size.X; { Calc corner x value }
  1609. Bounds.B.Y := Origin.Y + Size.Y; { Calc corner y value }
  1610. END;
  1611. {--TView--------------------------------------------------------------------}
  1612. { SetBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 24Sep99 LdB }
  1613. {---------------------------------------------------------------------------}
  1614. procedure TView.SetBounds(var Bounds: TRect);
  1615. begin
  1616. Origin := Bounds.A; { Get first corner }
  1617. Size := Bounds.B; { Get second corner }
  1618. Dec(Size.X,Origin.X);
  1619. Dec(Size.Y,Origin.Y);
  1620. end;
  1621. {--TView--------------------------------------------------------------------}
  1622. { GetClipRect -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1623. {---------------------------------------------------------------------------}
  1624. PROCEDURE TView.GetClipRect (Var Clip: TRect);
  1625. BEGIN
  1626. GetBounds(Clip); { Get current bounds }
  1627. If (Owner <> Nil) Then Clip.Intersect(Owner^.Clip);{ Intersect with owner }
  1628. Clip.Move(-Origin.X, -Origin.Y); { Sub owner origin }
  1629. END;
  1630. {--TView--------------------------------------------------------------------}
  1631. { ClearEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1632. {---------------------------------------------------------------------------}
  1633. PROCEDURE TView.ClearEvent (Var Event: TEvent);
  1634. BEGIN
  1635. Event.What := evNothing; { Clear the event }
  1636. Event.InfoPtr := @Self; { Set us as handler }
  1637. END;
  1638. {--TView--------------------------------------------------------------------}
  1639. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1640. {---------------------------------------------------------------------------}
  1641. PROCEDURE TView.HandleEvent (Var Event: TEvent);
  1642. BEGIN
  1643. If (Event.What = evMouseDown) Then { Mouse down event }
  1644. If (State AND (sfSelected OR sfDisabled) = 0) { Not selected/disabled }
  1645. AND (Options AND ofSelectable <> 0) Then { View is selectable }
  1646. If (Focus = False) OR { Not view with focus }
  1647. (Options AND ofFirstClick = 0) { Not 1st click select }
  1648. Then ClearEvent(Event); { Handle the event }
  1649. END;
  1650. {--TView--------------------------------------------------------------------}
  1651. { ChangeBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1652. {---------------------------------------------------------------------------}
  1653. PROCEDURE TView.ChangeBounds (Var Bounds: TRect);
  1654. BEGIN
  1655. SetBounds(Bounds); { Set new bounds }
  1656. DrawView; { Draw the view }
  1657. END;
  1658. {--TView--------------------------------------------------------------------}
  1659. { SizeLimits -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1660. {---------------------------------------------------------------------------}
  1661. PROCEDURE TView.SizeLimits (Var Min, Max: TPoint);
  1662. BEGIN
  1663. Min.X := 0; { Zero x minimum }
  1664. Min.Y := 0; { Zero y minimum }
  1665. If (Owner <> Nil) and(Owner^.ClipChilds) Then
  1666. Max := Owner^.Size
  1667. else { Max owner size }
  1668. Begin
  1669. Max.X := high(sw_integer); { Max possible x size }
  1670. Max.Y := high(sw_integer); { Max possible y size }
  1671. End;
  1672. END;
  1673. {--TView--------------------------------------------------------------------}
  1674. { GetCommands -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1675. {---------------------------------------------------------------------------}
  1676. PROCEDURE TView.GetCommands (Var Commands: TCommandSet);
  1677. BEGIN
  1678. Commands := CurCommandSet; { Return command set }
  1679. END;
  1680. {--TView--------------------------------------------------------------------}
  1681. { GetPeerViewPtr -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1682. {---------------------------------------------------------------------------}
  1683. PROCEDURE TView.GetPeerViewPtr (Var S: TStream; Var P);
  1684. VAR Index: Integer;
  1685. BEGIN
  1686. Index := 0; { Zero index value }
  1687. S.Read(Index, SizeOf(Index)); { Read view index }
  1688. If (Index = 0) OR (OwnerGroup = Nil) Then { Check for peer views }
  1689. Pointer(P) := Nil Else Begin { Return nil }
  1690. Pointer(P) := FixupList^[Index]; { New view ptr }
  1691. FixupList^[Index] := @P; { Patch this pointer }
  1692. End;
  1693. END;
  1694. {--TView--------------------------------------------------------------------}
  1695. { PutPeerViewPtr -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1696. {---------------------------------------------------------------------------}
  1697. PROCEDURE TView.PutPeerViewPtr (Var S: TStream; P: PView);
  1698. VAR Index: Integer;
  1699. BEGIN
  1700. If (P = Nil) OR (OwnerGroup = Nil) Then Index := 0 { Return zero index }
  1701. Else Index := OwnerGroup^.IndexOf(P); { Return view index }
  1702. S.Write(Index, SizeOf(Index)); { Write the index }
  1703. END;
  1704. {--TView--------------------------------------------------------------------}
  1705. { CalcBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1706. {---------------------------------------------------------------------------}
  1707. PROCEDURE TView.CalcBounds (Var Bounds: Objects.TRect; Delta: TPoint);
  1708. VAR S, D: Sw_Integer; Min, Max: TPoint;
  1709. FUNCTION Range (Val, Min, Max: Sw_Integer): Sw_Integer;
  1710. BEGIN
  1711. If (Val < Min) Then Range := Min Else { Value below min }
  1712. If (Val > Max) Then Range := Max Else { Value above max }
  1713. Range := Val; { Accept value }
  1714. END;
  1715. PROCEDURE GrowI (Var I: Sw_Integer);
  1716. BEGIN
  1717. If (GrowMode AND gfGrowRel = 0) Then Inc(I, D)
  1718. Else I := (I * S + (S - D) SHR 1) DIV (S - D); { Calc grow value }
  1719. END;
  1720. BEGIN
  1721. GetBounds(Bounds); { Get bounds }
  1722. If (GrowMode = 0) Then Exit; { No grow flags exits }
  1723. S := Owner^.Size.X; { Set initial size }
  1724. D := Delta.X; { Set initial delta }
  1725. If (GrowMode AND gfGrowLoX <> 0) Then
  1726. GrowI(Bounds.A.X); { Grow left side }
  1727. If (GrowMode AND gfGrowHiX <> 0) Then
  1728. GrowI(Bounds.B.X); { Grow right side }
  1729. If (Bounds.B.X - Bounds.A.X > MaxViewWidth) Then
  1730. Bounds.B.X := Bounds.A.X + MaxViewWidth; { Check values }
  1731. S := Owner^.Size.Y; D := Delta.Y; { set initial values }
  1732. If (GrowMode AND gfGrowLoY <> 0) Then
  1733. GrowI(Bounds.A.Y); { Grow top side }
  1734. If (GrowMode AND gfGrowHiY <> 0) Then
  1735. GrowI(Bounds.B.Y); { grow lower side }
  1736. SizeLimits(Min, Max); { Check sizes }
  1737. Bounds.B.X := Bounds.A.X + Range(Bounds.B.X -
  1738. Bounds.A.X, Min.X, Max.X); { Set right side }
  1739. Bounds.B.Y := Bounds.A.Y + Range(Bounds.B.Y -
  1740. Bounds.A.Y, Min.Y, Max.Y); { Set lower side }
  1741. END;
  1742. {***************************************************************************}
  1743. { TView OBJECT PRIVATE METHODS }
  1744. {***************************************************************************}
  1745. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  1746. { TGroup OBJECT METHODS }
  1747. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  1748. {--TGroup-------------------------------------------------------------------}
  1749. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Jul99 LdB }
  1750. {---------------------------------------------------------------------------}
  1751. CONSTRUCTOR TGroup.Init (Var Bounds: TRect);
  1752. BEGIN
  1753. Inherited Init(Bounds); { Call ancestor }
  1754. Options := Options OR (ofSelectable + ofBuffered); { Set options }
  1755. GetExtent(Clip); { Get clip extents }
  1756. EventMask := $FFFF; { See all events }
  1757. END;
  1758. {--TGroup-------------------------------------------------------------------}
  1759. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1760. {---------------------------------------------------------------------------}
  1761. CONSTRUCTOR TGroup.Load (Var S: TStream);
  1762. VAR I: Sw_Word;
  1763. Count: Word;
  1764. P, Q: ^Pointer; V: PView; OwnerSave: PGroup;
  1765. FixupSave: PFixupList;
  1766. BEGIN
  1767. Inherited Load(S); { Call ancestor }
  1768. GetExtent(Clip); { Get view extents }
  1769. OwnerSave := OwnerGroup; { Save current group }
  1770. OwnerGroup := @Self; { We are current group }
  1771. FixupSave := FixupList; { Save current list }
  1772. Count := 0; { Zero count value }
  1773. S.Read(Count, SizeOf(Count)); { Read entry count }
  1774. If (MaxAvail >= Count*SizeOf(Pointer)) Then Begin { Memory available }
  1775. GetMem(FixupList, Count*SizeOf(Pointer)); { List size needed }
  1776. FillChar(FixUpList^, Count*SizeOf(Pointer), #0); { Zero all entries }
  1777. For I := 1 To Count Do Begin
  1778. V := PView(S.Get); { Get view off stream }
  1779. If (V <> Nil) Then InsertView(V, Nil); { Insert valid views }
  1780. End;
  1781. V := Last; { Start on last view }
  1782. For I := 1 To Count Do Begin
  1783. V := V^.Next; { Fetch next view }
  1784. P := FixupList^[I]; { Transfer pointer }
  1785. While (P <> Nil) Do Begin { If valid view }
  1786. Q := P; { Copy pointer }
  1787. P := P^; { Fetch pointer }
  1788. Q^ := V; { Transfer view ptr }
  1789. End;
  1790. End;
  1791. FreeMem(FixupList, Count*SizeOf(Pointer)); { Release fixup list }
  1792. End;
  1793. OwnerGroup := OwnerSave; { Reload current group }
  1794. FixupList := FixupSave; { Reload current list }
  1795. GetSubViewPtr(S, V); { Load any subviews }
  1796. SetCurrent(V, NormalSelect); { Select current view }
  1797. If (OwnerGroup = Nil) Then Awaken; { If topview activate }
  1798. END;
  1799. {--TGroup-------------------------------------------------------------------}
  1800. { Done -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1801. {---------------------------------------------------------------------------}
  1802. DESTRUCTOR TGroup.Done;
  1803. VAR P, T: PView;
  1804. BEGIN
  1805. Hide; { Hide the view }
  1806. P := Last; { Start on last }
  1807. If (P <> Nil) Then Begin { Subviews exist }
  1808. Repeat
  1809. P^.Hide; { Hide each view }
  1810. P := P^.Prev; { Prior view }
  1811. Until (P = Last); { Loop complete }
  1812. Repeat
  1813. T := P^.Prev; { Hold prior pointer }
  1814. Dispose(P, Done); { Dispose subview }
  1815. P := T; { Transfer pointer }
  1816. Until (Last = Nil); { Loop complete }
  1817. End;
  1818. Inherited Done; { Call ancestor }
  1819. END;
  1820. {--TGroup-------------------------------------------------------------------}
  1821. { First -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1822. {---------------------------------------------------------------------------}
  1823. FUNCTION TGroup.First: PView;
  1824. BEGIN
  1825. If (Last = Nil) Then First := Nil { No first view }
  1826. Else First := Last^.Next; { Return first view }
  1827. END;
  1828. {--TGroup-------------------------------------------------------------------}
  1829. { Execute -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1830. {---------------------------------------------------------------------------}
  1831. FUNCTION TGroup.Execute: Word;
  1832. VAR Event: TEvent;
  1833. BEGIN
  1834. Repeat
  1835. EndState := 0; { Clear end state }
  1836. Repeat
  1837. GetEvent(Event); { Get next event }
  1838. HandleEvent(Event); { Handle the event }
  1839. If (Event.What <> evNothing) Then
  1840. EventError(Event); { Event not handled }
  1841. Until (EndState <> 0); { Until command set }
  1842. Until Valid(EndState); { Repeat until valid }
  1843. Execute := EndState; { Return result }
  1844. EndState := 0; { Clear end state }
  1845. END;
  1846. {--TGroup-------------------------------------------------------------------}
  1847. { GetHelpCtx -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1848. {---------------------------------------------------------------------------}
  1849. FUNCTION TGroup.GetHelpCtx: Word;
  1850. VAR H: Word;
  1851. BEGIN
  1852. H := hcNoContext; { Preset no context }
  1853. If (Current <> Nil) Then H := Current^.GetHelpCtx; { Current context }
  1854. If (H=hcNoContext) Then H := Inherited GetHelpCtx; { Call ancestor }
  1855. GetHelpCtx := H; { Return result }
  1856. END;
  1857. {--TGroup-------------------------------------------------------------------}
  1858. { DataSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Jul98 LdB }
  1859. {---------------------------------------------------------------------------}
  1860. FUNCTION TGroup.DataSize: Sw_Word;
  1861. VAR Total: Word; P: PView;
  1862. BEGIN
  1863. Total := 0; { Zero totals count }
  1864. P := Last; { Start on last view }
  1865. If (P <> Nil) Then Begin { Subviews exist }
  1866. Repeat
  1867. P := P^.Next; { Move to next view }
  1868. Total := Total + P^.DataSize; { Add view size }
  1869. Until (P = Last); { Until last view }
  1870. End;
  1871. DataSize := Total; { Return data size }
  1872. END;
  1873. {--TGroup-------------------------------------------------------------------}
  1874. { ExecView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Jul99 LdB }
  1875. {---------------------------------------------------------------------------}
  1876. FUNCTION TGroup.ExecView (P: PView): Word;
  1877. VAR SaveOptions: Word; SaveTopView, SaveCurrent: PView; SaveOwner: PGroup;
  1878. SaveCommands: TCommandSet;
  1879. BEGIN
  1880. If (P<>Nil) Then Begin
  1881. SaveOptions := P^.Options; { Hold options }
  1882. SaveOwner := P^.Owner; { Hold owner }
  1883. SaveTopView := TheTopView; { Save topmost view }
  1884. SaveCurrent := Current; { Save current view }
  1885. GetCommands(SaveCommands); { Save commands }
  1886. TheTopView := P; { Set top view }
  1887. P^.Options := P^.Options AND NOT ofSelectable; { Not selectable }
  1888. P^.SetState(sfModal, True); { Make modal }
  1889. SetCurrent(P, EnterSelect); { Select next }
  1890. If (SaveOwner = Nil) Then Insert(P); { Insert view }
  1891. ExecView := P^.Execute; { Execute view }
  1892. If (SaveOwner = Nil) Then Delete(P); { Remove view }
  1893. SetCurrent(SaveCurrent, LeaveSelect); { Unselect current }
  1894. P^.SetState(sfModal, False); { Clear modal state }
  1895. P^.Options := SaveOptions; { Restore options }
  1896. TheTopView := SaveTopView; { Restore topview }
  1897. SetCommands(SaveCommands); { Restore commands }
  1898. End Else ExecView := cmCancel; { Return cancel }
  1899. END;
  1900. { ********************************* REMARK ******************************** }
  1901. { This call really is very COMPILER SPECIFIC and really can't be done }
  1902. { effectively any other way but assembler code as SELF & FRAMES need }
  1903. { to be put down in exact order and OPTIMIZERS make a mess of it. }
  1904. { ******************************** END REMARK *** Leon de Boer, 17Jul99 *** }
  1905. {--TGroup-------------------------------------------------------------------}
  1906. { FirstThat -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Jul99 LdB }
  1907. {---------------------------------------------------------------------------}
  1908. FUNCTION TGroup.FirstThat (P: Pointer): PView;
  1909. VAR
  1910. Tp : PView;
  1911. BEGIN
  1912. If (Last<>Nil) Then
  1913. Begin
  1914. Tp := Last; { Set temporary ptr }
  1915. Repeat
  1916. Tp := Tp^.Next; { Get next view }
  1917. IF Byte(Longint(CallPointerMethodLocal(P,
  1918. { On most systems, locals are accessed relative to base pointer,
  1919. but for MIPS cpu, they are accessed relative to stack pointer.
  1920. This needs adaptation for so low level routines,
  1921. like MethodPointerLocal and related objects unit functions. }
  1922. {$ifndef FPC_LOCALS_ARE_STACK_REG_RELATIVE}
  1923. get_caller_frame(get_frame,get_pc_addr)
  1924. {$else}
  1925. get_frame
  1926. {$endif}
  1927. ,@self,Tp)))<>0 THEN
  1928. Begin { Test each view }
  1929. FirstThat := Tp; { View returned true }
  1930. Exit; { Now exit }
  1931. End;
  1932. Until (Tp=Last); { Until last }
  1933. FirstThat := Nil; { None passed test }
  1934. End
  1935. Else
  1936. FirstThat := Nil; { Return nil }
  1937. END;
  1938. {--TGroup-------------------------------------------------------------------}
  1939. { Valid -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1940. {---------------------------------------------------------------------------}
  1941. FUNCTION TGroup.Valid (Command: Word): Boolean;
  1942. FUNCTION IsInvalid (P: PView): Boolean;
  1943. BEGIN
  1944. IsInvalid := NOT P^.Valid(Command); { Check if valid }
  1945. END;
  1946. BEGIN
  1947. Valid := True; { Preset valid }
  1948. If (Command = cmReleasedFocus) Then Begin { Release focus cmd }
  1949. If (Current <> Nil) AND { Current view exists }
  1950. (Current^.Options AND ofValidate <> 0) Then { Validating view }
  1951. Valid := Current^.Valid(Command); { Validate command }
  1952. End Else Valid := FirstThat(@IsInvalid) = Nil; { Check first valid }
  1953. END;
  1954. {--TGroup-------------------------------------------------------------------}
  1955. { FocusNext -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  1956. {---------------------------------------------------------------------------}
  1957. FUNCTION TGroup.FocusNext (Forwards: Boolean): Boolean;
  1958. VAR P: PView;
  1959. BEGIN
  1960. P := FindNext(Forwards); { Find next view }
  1961. FocusNext := True; { Preset true }
  1962. If (P <> Nil) Then FocusNext := P^.Focus; { Check next focus }
  1963. END;
  1964. procedure TGroup.DrawSubViews(P, Bottom: PView);
  1965. begin
  1966. if P <> nil then
  1967. while P <> Bottom do
  1968. begin
  1969. P^.DrawView;
  1970. P := P^.NextView;
  1971. end;
  1972. end;
  1973. {--TGroup-------------------------------------------------------------------}
  1974. { ReDraw -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 2Jun06 DM }
  1975. {---------------------------------------------------------------------------}
  1976. procedure TGroup.Redraw;
  1977. begin
  1978. {Lock to prevent screen update.}
  1979. lockscreenupdate;
  1980. DrawSubViews(First, nil);
  1981. unlockscreenupdate;
  1982. {Draw all views at once, forced update.}
  1983. drawscreenbuf(true);
  1984. end;
  1985. PROCEDURE TGroup.ResetCursor;
  1986. BEGIN
  1987. if (Current<>nil) then
  1988. Current^.ResetCursor;
  1989. END;
  1990. {--TGroup-------------------------------------------------------------------}
  1991. { Awaken -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  1992. {---------------------------------------------------------------------------}
  1993. PROCEDURE TGroup.Awaken;
  1994. PROCEDURE DoAwaken (P: PView);
  1995. BEGIN
  1996. If (P <> Nil) Then P^.Awaken; { Awaken view }
  1997. END;
  1998. BEGIN
  1999. ForEach(@DoAwaken); { Awaken each view }
  2000. END;
  2001. {--TGroup-------------------------------------------------------------------}
  2002. { Draw -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Sep97 LdB }
  2003. {---------------------------------------------------------------------------}
  2004. PROCEDURE TGroup.Draw;
  2005. BEGIN
  2006. If Buffer=Nil then
  2007. DrawSubViews(First, nil)
  2008. else
  2009. WriteBuf(0,0,Size.X,Size.Y,Buffer);
  2010. END;
  2011. {--TGroup-------------------------------------------------------------------}
  2012. { SelectDefaultView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22Oct99 LdB }
  2013. {---------------------------------------------------------------------------}
  2014. PROCEDURE TGroup.SelectDefaultView;
  2015. VAR P: PView;
  2016. BEGIN
  2017. P := Last; { Start at last }
  2018. While (P <> Nil) Do Begin
  2019. If P^.GetState(sfDefault) Then Begin { Search 1st default }
  2020. P^.Select; { Select default view }
  2021. P := Nil; { Force kick out }
  2022. End Else P := P^.PrevView; { Prior subview }
  2023. End;
  2024. END;
  2025. function TGroup.ClipChilds: boolean;
  2026. begin
  2027. ClipChilds:=true;
  2028. end;
  2029. procedure TGroup.BeforeInsert(P: PView);
  2030. begin
  2031. { abstract }
  2032. end;
  2033. procedure TGroup.AfterInsert(P: PView);
  2034. begin
  2035. { abstract }
  2036. end;
  2037. procedure TGroup.BeforeDelete(P: PView);
  2038. begin
  2039. { abstract }
  2040. end;
  2041. procedure TGroup.AfterDelete(P: PView);
  2042. begin
  2043. { abstract }
  2044. end;
  2045. {--TGroup-------------------------------------------------------------------}
  2046. { Insert -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Sep99 LdB }
  2047. {---------------------------------------------------------------------------}
  2048. PROCEDURE TGroup.Insert (P: PView);
  2049. BEGIN
  2050. BeforeInsert(P);
  2051. InsertBefore(P, First);
  2052. AfterInsert(P);
  2053. END;
  2054. {--TGroup-------------------------------------------------------------------}
  2055. { Delete -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2056. {---------------------------------------------------------------------------}
  2057. PROCEDURE TGroup.Delete (P: PView);
  2058. VAR SaveState: Word;
  2059. BEGIN
  2060. BeforeDelete(P);
  2061. SaveState := P^.State; { Save state }
  2062. P^.Hide; { Hide the view }
  2063. RemoveView(P); { Remove the view }
  2064. P^.Owner := Nil; { Clear owner ptr }
  2065. P^.Next := Nil; { Clear next ptr }
  2066. if SaveState and sfVisible <> 0 then
  2067. P^.Show;
  2068. AfterDelete(P);
  2069. END;
  2070. { ********************************* REMARK ******************************** }
  2071. { This call really is very COMPILER SPECIFIC and really can't be done }
  2072. { effectively any other way but assembler code as SELF & FRAMES need }
  2073. { to be put down in exact order and OPTIMIZERS make a mess of it. }
  2074. { ******************************** END REMARK *** Leon de Boer, 17Jul99 *** }
  2075. {--TGroup-------------------------------------------------------------------}
  2076. { ForEach -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 17Jul99 LdB }
  2077. {---------------------------------------------------------------------------}
  2078. PROCEDURE TGroup.ForEach (P: Pointer);
  2079. VAR
  2080. Tp,Hp,L0 : PView;
  2081. { Vars Hp and L0 are necessary to hold original pointers in case }
  2082. { when some view closes himself as a result of broadcast message ! }
  2083. BEGIN
  2084. If (Last<>Nil) Then
  2085. Begin
  2086. Tp:=Last;
  2087. Hp:=Tp^.Next;
  2088. L0:=Last; { Set temporary ptr }
  2089. Repeat
  2090. Tp:=Hp;
  2091. if tp=nil then
  2092. exit;
  2093. Hp:=Tp^.Next; { Get next view }
  2094. CallPointerMethodLocal(P,
  2095. { On most systems, locals are accessed relative to base pointer,
  2096. but for MIPS cpu, they are accessed relative to stack pointer.
  2097. This needs adaptation for so low level routines,
  2098. like MethodPointerLocal and related objects unit functions. }
  2099. {$ifndef FPC_LOCALS_ARE_STACK_REG_RELATIVE}
  2100. get_caller_frame(get_frame,get_pc_addr)
  2101. {$else}
  2102. get_frame
  2103. {$endif}
  2104. ,@self,Tp);
  2105. Until (Tp=L0); { Until last }
  2106. End;
  2107. END;
  2108. {--TGroup-------------------------------------------------------------------}
  2109. { EndModal -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2110. {---------------------------------------------------------------------------}
  2111. PROCEDURE TGroup.EndModal (Command: Word);
  2112. BEGIN
  2113. If (State AND sfModal <> 0) Then { This view is modal }
  2114. EndState := Command Else { Set endstate }
  2115. Inherited EndModal(Command); { Call ancestor }
  2116. END;
  2117. {--TGroup-------------------------------------------------------------------}
  2118. { SelectNext -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  2119. {---------------------------------------------------------------------------}
  2120. PROCEDURE TGroup.SelectNext (Forwards: Boolean);
  2121. VAR P: PView;
  2122. BEGIN
  2123. P := FindNext(Forwards); { Find next view }
  2124. If (P <> Nil) Then P^.Select; { Select view }
  2125. END;
  2126. {--TGroup-------------------------------------------------------------------}
  2127. { InsertBefore -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Sep99 LdB }
  2128. {---------------------------------------------------------------------------}
  2129. PROCEDURE TGroup.InsertBefore (P, Target: PView);
  2130. VAR SaveState : Word;
  2131. BEGIN
  2132. If (P <> Nil) AND (P^.Owner = Nil) AND { View valid }
  2133. ((Target = Nil) OR (Target^.Owner = @Self)) { Target valid }
  2134. Then Begin
  2135. If (P^.Options AND ofCenterX <> 0) Then { Centre on x axis }
  2136. P^.Origin.X := (Size.X - P^.Size.X) div 2;
  2137. If (P^.Options AND ofCenterY <> 0) Then { Centre on y axis }
  2138. P^.Origin.Y := (Size.Y - P^.Size.Y) div 2;
  2139. SaveState := P^.State; { Save view state }
  2140. P^.Hide; { Make sure hidden }
  2141. InsertView(P, Target); { Insert into list }
  2142. If (SaveState AND sfVisible <> 0) Then P^.Show; { Show the view }
  2143. If (State AND sfActive <> 0) Then { Was active before }
  2144. P^.SetState(sfActive , True); { Make active again }
  2145. End;
  2146. END;
  2147. {--TGroup-------------------------------------------------------------------}
  2148. { SetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2149. {---------------------------------------------------------------------------}
  2150. PROCEDURE TGroup.SetState (AState: Word; Enable: Boolean);
  2151. PROCEDURE DoSetState (P: PView);
  2152. BEGIN
  2153. If (P <> Nil) Then P^.SetState(AState, Enable); { Set subview state }
  2154. END;
  2155. PROCEDURE DoExpose (P: PView);
  2156. BEGIN
  2157. If (P <> Nil) Then Begin
  2158. If (P^.State AND sfVisible <> 0) Then { Check view visible }
  2159. P^.SetState(sfExposed, Enable); { Set exposed flag }
  2160. End;
  2161. END;
  2162. BEGIN
  2163. Inherited SetState(AState, Enable); { Call ancestor }
  2164. Case AState Of
  2165. sfActive, sfDragging: Begin
  2166. Lock; { Lock the view }
  2167. ForEach(@DoSetState); { Set each subview }
  2168. UnLock; { Unlock the view }
  2169. End;
  2170. sfFocused: Begin
  2171. If (Current <> Nil) Then
  2172. Current^.SetState(sfFocused, Enable); { Focus current view }
  2173. End;
  2174. sfExposed: Begin
  2175. ForEach(@DoExpose); { Expose each subview }
  2176. End;
  2177. End;
  2178. END;
  2179. {--TGroup-------------------------------------------------------------------}
  2180. { GetData -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Mar98 LdB }
  2181. {---------------------------------------------------------------------------}
  2182. PROCEDURE TGroup.GetData (Var Rec);
  2183. VAR Total: Sw_Word; P: PView;
  2184. BEGIN
  2185. Total := 0; { Clear total }
  2186. P := Last; { Start at last }
  2187. While (P <> Nil) Do Begin { Subviews exist }
  2188. P^.GetData(TByteArray(Rec)[Total]); { Get data }
  2189. Inc(Total, P^.DataSize); { Increase total }
  2190. P := P^.PrevView; { Previous view }
  2191. End;
  2192. END;
  2193. {--TGroup-------------------------------------------------------------------}
  2194. { SetData -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 29Mar98 LdB }
  2195. {---------------------------------------------------------------------------}
  2196. PROCEDURE TGroup.SetData (Var Rec);
  2197. VAR Total: Sw_Word; P: PView;
  2198. BEGIN
  2199. Total := 0; { Clear total }
  2200. P := Last; { Start at last }
  2201. While (P <> Nil) Do Begin { Subviews exist }
  2202. P^.SetData(TByteArray(Rec)[Total]); { Get data }
  2203. Inc(Total, P^.DataSize); { Increase total }
  2204. P := P^.PrevView; { Previous view }
  2205. End;
  2206. END;
  2207. {--TGroup-------------------------------------------------------------------}
  2208. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Mar98 LdB }
  2209. {---------------------------------------------------------------------------}
  2210. PROCEDURE TGroup.Store (Var S: TStream);
  2211. VAR Count: Word; OwnerSave: PGroup;
  2212. PROCEDURE DoPut (P: PView);
  2213. BEGIN
  2214. S.Put(P); { Put view on stream }
  2215. END;
  2216. BEGIN
  2217. TView.Store(S); { Call view store }
  2218. OwnerSave := OwnerGroup; { Save ownergroup }
  2219. OwnerGroup := @Self; { Set as owner group }
  2220. Count := IndexOf(Last); { Subview count }
  2221. S.Write(Count, SizeOf(Count)); { Write the count }
  2222. ForEach(@DoPut); { Put each in stream }
  2223. PutSubViewPtr(S, Current); { Current on stream }
  2224. OwnerGroup := OwnerSave; { Restore ownergroup }
  2225. END;
  2226. {--TGroup-------------------------------------------------------------------}
  2227. { EventError -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2228. {---------------------------------------------------------------------------}
  2229. PROCEDURE TGroup.EventError (Var Event: TEvent);
  2230. BEGIN
  2231. If (Owner <> Nil) Then Owner^.EventError(Event); { Event error }
  2232. END;
  2233. {--TGroup-------------------------------------------------------------------}
  2234. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2235. {---------------------------------------------------------------------------}
  2236. PROCEDURE TGroup.HandleEvent (Var Event: TEvent);
  2237. FUNCTION ContainsMouse (P: PView): Boolean;
  2238. BEGIN
  2239. ContainsMouse := (P^.State AND sfVisible <> 0) { Is view visible }
  2240. AND P^.MouseInView(Event.Where); { Is point in view }
  2241. END;
  2242. PROCEDURE DoHandleEvent (P: PView);
  2243. BEGIN
  2244. If (P = Nil) OR ((P^.State AND sfDisabled <> 0) AND
  2245. (Event.What AND(PositionalEvents OR FocusedEvents) <>0 ))
  2246. Then Exit; { Invalid/disabled }
  2247. Case Phase Of
  2248. phPreProcess: If (P^.Options AND ofPreProcess = 0)
  2249. Then Exit; { Not pre processing }
  2250. phPostProcess: If (P^.Options AND ofPostProcess = 0)
  2251. Then Exit; { Not post processing }
  2252. End;
  2253. If (Event.What AND P^.EventMask <> 0) Then { View handles event }
  2254. P^.HandleEvent(Event); { Pass to view }
  2255. END;
  2256. BEGIN
  2257. Inherited HandleEvent(Event); { Call ancestor }
  2258. If (Event.What = evNothing) Then Exit; { No valid event exit }
  2259. If (Event.What AND FocusedEvents <> 0) Then Begin { Focused event }
  2260. Phase := phPreProcess; { Set pre process }
  2261. ForEach(@DoHandleEvent); { Pass to each view }
  2262. Phase := phFocused; { Set focused }
  2263. DoHandleEvent(Current); { Pass to current }
  2264. Phase := phPostProcess; { Set post process }
  2265. ForEach(@DoHandleEvent); { Pass to each }
  2266. End Else Begin
  2267. Phase := phFocused; { Set focused }
  2268. If (Event.What AND PositionalEvents <> 0) Then { Positional event }
  2269. DoHandleEvent(FirstThat(@ContainsMouse)) { Pass to first }
  2270. Else ForEach(@DoHandleEvent); { Pass to all }
  2271. End;
  2272. END;
  2273. {--TGroup-------------------------------------------------------------------}
  2274. { ChangeBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  2275. {---------------------------------------------------------------------------}
  2276. PROCEDURE TGroup.ChangeBounds (Var Bounds: TRect);
  2277. VAR D: TPoint;
  2278. PROCEDURE DoCalcChange (P: PView);
  2279. VAR R: TRect;
  2280. BEGIN
  2281. P^.CalcBounds(R, D); { Calc view bounds }
  2282. P^.ChangeBounds(R); { Change view bounds }
  2283. END;
  2284. BEGIN
  2285. D.X := Bounds.B.X - Bounds.A.X - Size.X; { Delta x value }
  2286. D.Y := Bounds.B.Y - Bounds.A.Y - Size.Y; { Delta y value }
  2287. If ((D.X=0) AND (D.Y=0)) Then Begin
  2288. SetBounds(Bounds); { Set new bounds }
  2289. { Force redraw }
  2290. ReDraw; { Draw the view }
  2291. End Else Begin
  2292. SetBounds(Bounds); { Set new bounds }
  2293. GetExtent(Clip); { Get new clip extents }
  2294. Lock; { Lock drawing }
  2295. ForEach(@DoCalcChange); { Change each view }
  2296. UnLock; { Unlock drawing }
  2297. End;
  2298. END;
  2299. {--TGroup-------------------------------------------------------------------}
  2300. { GetSubViewPtr -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20May98 LdB }
  2301. {---------------------------------------------------------------------------}
  2302. PROCEDURE TGroup.GetSubViewPtr (Var S: TStream; Var P);
  2303. VAR Index, I: Sw_Word; Q: PView;
  2304. BEGIN
  2305. Index := 0; { Zero index value }
  2306. S.Read(Index, SizeOf(Index)); { Read view index }
  2307. If (Index > 0) Then Begin { Valid index }
  2308. Q := Last; { Start on last }
  2309. For I := 1 To Index Do Q := Q^.Next; { Loop for count }
  2310. Pointer(P) := Q; { Return the view }
  2311. End Else Pointer(P) := Nil; { Return nil }
  2312. END;
  2313. {--TGroup-------------------------------------------------------------------}
  2314. { PutSubViewPtr -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 20May98 LdB }
  2315. {---------------------------------------------------------------------------}
  2316. PROCEDURE TGroup.PutSubViewPtr (Var S: TStream; P: PView);
  2317. VAR Index: Sw_Word;
  2318. BEGIN
  2319. If (P = Nil) Then Index := 0 Else { Nil view, Index = 0 }
  2320. Index := IndexOf(P); { Calc view index }
  2321. S.Write(Index, SizeOf(Index)); { Write the index }
  2322. END;
  2323. {***************************************************************************}
  2324. { TGroup OBJECT PRIVATE METHODS }
  2325. {***************************************************************************}
  2326. {--TGroup-------------------------------------------------------------------}
  2327. { IndexOf -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2328. {---------------------------------------------------------------------------}
  2329. FUNCTION TGroup.IndexOf (P: PView): Sw_Integer;
  2330. VAR I: Sw_Integer; Q: PView;
  2331. BEGIN
  2332. Q := Last; { Start on last view }
  2333. If (Q <> Nil) Then Begin { Subviews exist }
  2334. I := 1; { Preset value }
  2335. While (Q <> P) AND (Q^.Next <> Last) Do Begin
  2336. Q := Q^.Next; { Load next view }
  2337. Inc(I); { Increment count }
  2338. End;
  2339. If (Q <> P) Then IndexOf := 0 Else IndexOf := I; { Return index }
  2340. End Else IndexOf := 0; { Return zero }
  2341. END;
  2342. {--TGroup-------------------------------------------------------------------}
  2343. { FindNext -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep99 LdB }
  2344. {---------------------------------------------------------------------------}
  2345. FUNCTION TGroup.FindNext (Forwards: Boolean): PView;
  2346. VAR P: PView;
  2347. BEGIN
  2348. FindNext := Nil; { Preset nil return }
  2349. If (Current <> Nil) Then Begin { Has current view }
  2350. P := Current; { Start on current }
  2351. Repeat
  2352. If Forwards Then P := P^.Next { Get next view }
  2353. Else P := P^.Prev; { Get prev view }
  2354. Until ((P^.State AND (sfVisible+sfDisabled) = sfVisible) AND
  2355. (P^.Options AND ofSelectable <> 0)) OR { Tab selectable }
  2356. (P = Current); { Not singular select }
  2357. If (P <> Current) Then FindNext := P; { Return result }
  2358. End;
  2359. END;
  2360. {--TGroup-------------------------------------------------------------------}
  2361. { FirstMatch -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2362. {---------------------------------------------------------------------------}
  2363. FUNCTION TGroup.FirstMatch (AState: Word; AOptions: Word): PView;
  2364. FUNCTION Matches (P: PView): Boolean;
  2365. BEGIN
  2366. Matches := (P^.State AND AState = AState) AND
  2367. (P^.Options AND AOptions = AOptions); { Return match state }
  2368. END;
  2369. BEGIN
  2370. FirstMatch := FirstThat(@Matches); { Return first match }
  2371. END;
  2372. {--TGroup-------------------------------------------------------------------}
  2373. { ResetCurrent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2374. {---------------------------------------------------------------------------}
  2375. PROCEDURE TGroup.ResetCurrent;
  2376. BEGIN
  2377. SetCurrent(FirstMatch(sfVisible, ofSelectable),
  2378. NormalSelect); { Reset current view }
  2379. END;
  2380. {--TGroup-------------------------------------------------------------------}
  2381. { RemoveView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2382. {---------------------------------------------------------------------------}
  2383. PROCEDURE TGroup.RemoveView (P: PView);
  2384. VAR Q: PView;
  2385. BEGIN
  2386. If (P <> Nil) AND (Last <> Nil) Then Begin { Check view is valid }
  2387. Q := Last; { Start on last view }
  2388. While (Q^.Next <> P) AND (Q^.Next <> Last) Do
  2389. Q := Q^.Next; { Find prior view }
  2390. If (Q^.Next = P) Then Begin { View found }
  2391. If (Q^.Next <> Q) Then Begin { Not only view }
  2392. Q^.Next := P^.Next; { Rechain views }
  2393. If (P = Last) Then Last := P^.Next; { Fix if last removed }
  2394. End Else Last := Nil; { Only view }
  2395. End;
  2396. End;
  2397. END;
  2398. {--TGroup-------------------------------------------------------------------}
  2399. { InsertView -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  2400. {---------------------------------------------------------------------------}
  2401. PROCEDURE TGroup.InsertView (P, Target: PView);
  2402. BEGIN
  2403. If (P <> Nil) Then Begin { Check view is valid }
  2404. P^.Owner := @Self; { Views owner is us }
  2405. If (Target <> Nil) Then Begin { Valid target }
  2406. Target := Target^.Prev; { 1st part of chain }
  2407. P^.Next := Target^.Next; { 2nd part of chain }
  2408. Target^.Next := P; { Chain completed }
  2409. End Else Begin
  2410. If (Last <> Nil) Then Begin { Not first view }
  2411. P^.Next := Last^.Next; { 1st part of chain }
  2412. Last^.Next := P; { Completed chain }
  2413. End Else P^.Next := P; { 1st chain to self }
  2414. Last := P; { P is now last }
  2415. End;
  2416. End;
  2417. END;
  2418. {--TGroup-------------------------------------------------------------------}
  2419. { SetCurrent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep99 LdB }
  2420. {---------------------------------------------------------------------------}
  2421. PROCEDURE TGroup.SetCurrent (P: PView; Mode: SelectMode);
  2422. PROCEDURE SelectView (P: PView; Enable: Boolean);
  2423. BEGIN
  2424. If (P <> Nil) Then { View is valid }
  2425. P^.SetState(sfSelected, Enable); { Select the view }
  2426. END;
  2427. PROCEDURE FocusView (P: PView; Enable: Boolean);
  2428. BEGIN
  2429. If (State AND sfFocused <> 0) AND (P <> Nil) { Check not focused }
  2430. Then P^.SetState(sfFocused, Enable); { Focus the view }
  2431. END;
  2432. BEGIN
  2433. If (Current<>P) Then Begin { Not already current }
  2434. Lock; { Stop drawing }
  2435. FocusView(Current, False); { Defocus current }
  2436. If (Mode <> EnterSelect) Then
  2437. SelectView(Current, False); { Deselect current }
  2438. If (Mode<>LeaveSelect) Then SelectView(P, True); { Select view P }
  2439. FocusView(P, True); { Focus view P }
  2440. Current := P; { Set as current view }
  2441. UnLock; { Redraw now }
  2442. End;
  2443. END;
  2444. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  2445. { TFrame OBJECT METHODS }
  2446. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  2447. {--TFrame-------------------------------------------------------------------}
  2448. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  2449. {---------------------------------------------------------------------------}
  2450. CONSTRUCTOR TFrame.Init (Var Bounds: TRect);
  2451. BEGIN
  2452. Inherited Init(Bounds); { Call ancestor }
  2453. GrowMode := gfGrowHiX + gfGrowHiY; { Set grow modes }
  2454. EventMask := EventMask OR evBroadcast; { See broadcasts }
  2455. END;
  2456. procedure TFrame.FrameLine(var FrameBuf; Y, N: Sw_Integer; Color: Byte);
  2457. const
  2458. InitFrame: array[0..17] of Byte =
  2459. ($06, $0A, $0C, $05, $00, $05, $03, $0A, $09,
  2460. $16, $1A, $1C, $15, $00, $15, $13, $1A, $19);
  2461. FrameChars_437: array[0..31] of Char =
  2462. ' À ³Úà ÙÄÁ¿´ÂÅ È ºÉÇ ¼ÍÏ»¶ÑÎ';
  2463. FrameChars_850: array[0..31] of Char =
  2464. ' À ³Úà ÙÄÁ¿´ÂÅ È ºÉº ¼ÍÍ»ºÍÎ';
  2465. var
  2466. FrameMask : array[0..MaxViewWidth-1] of Byte;
  2467. ColorMask : word;
  2468. i,j,k : {Sw_ lo and hi are used !! }integer;
  2469. CurrView : PView;
  2470. p : Pchar;
  2471. begin
  2472. FrameMask[0]:=InitFrame[n];
  2473. FillChar(FrameMask[1],Size.X-2,InitFrame[n+1]);
  2474. FrameMask[Size.X-1]:=InitFrame[n+2];
  2475. CurrView:=Owner^.Last^.Next;
  2476. while (CurrView<>PView(@Self)) do
  2477. begin
  2478. if ((CurrView^.Options and ofFramed)<>0) and
  2479. ((CurrView^.State and sfVisible)<>0) then
  2480. begin
  2481. i:=Y-CurrView^.Origin.Y;
  2482. if (i<0) then
  2483. begin
  2484. inc(i);
  2485. if i=0 then
  2486. i:=$0a06
  2487. else
  2488. i:=0;
  2489. end
  2490. else
  2491. begin
  2492. if i<CurrView^.Size.Y then
  2493. i:=$0005
  2494. else
  2495. if i=CurrView^.Size.Y then
  2496. i:=$0a03
  2497. else
  2498. i:=0;
  2499. end;
  2500. if (i<>0) then
  2501. begin
  2502. j:=CurrView^.Origin.X;
  2503. k:=CurrView^.Size.X+j;
  2504. if j<1 then
  2505. j:=1;
  2506. if k>Size.X then
  2507. k:=Size.X;
  2508. if (k>j) then
  2509. begin
  2510. FrameMask[j-1]:=FrameMask[j-1] or lo(i);
  2511. i:=(lo(i) xor hi(i)) or (i and $ff00);
  2512. FrameMask[k]:=FrameMask[k] or lo(i);
  2513. if hi(i)<>0 then
  2514. begin
  2515. dec(k,j);
  2516. repeat
  2517. FrameMask[j]:=FrameMask[j] or hi(i);
  2518. inc(j);
  2519. dec(k);
  2520. until k=0;
  2521. end;
  2522. end;
  2523. end;
  2524. end;
  2525. CurrView:=CurrView^.Next;
  2526. end;
  2527. ColorMask:=Color shl 8;
  2528. p:=framechars_437;
  2529. {$ifdef unix}
  2530. {Codepage variables are currently Unix only.}
  2531. if internal_codepage<>cp437 then
  2532. p:=framechars_850;
  2533. {$endif}
  2534. for i:=0 to Size.X-1 do
  2535. TVideoBuf(FrameBuf)[i]:=ord(p[FrameMask[i]]) or ColorMask;
  2536. end;
  2537. procedure TFrame.Draw;
  2538. const
  2539. LargeC:array[boolean] of char=('^',#24);
  2540. RestoreC:array[boolean] of char=('|',#18);
  2541. ClickC:array[boolean] of char=('*',#15);
  2542. var
  2543. CFrame, CTitle: Word;
  2544. F, I, L, Width: Sw_Integer;
  2545. B: TDrawBuffer;
  2546. Title: TTitleStr;
  2547. Min, Max: TPoint;
  2548. begin
  2549. if State and sfDragging <> 0 then
  2550. begin
  2551. CFrame := $0505;
  2552. CTitle := $0005;
  2553. F := 0;
  2554. end
  2555. else if State and sfActive = 0 then
  2556. begin
  2557. CFrame := $0101;
  2558. CTitle := $0002;
  2559. F := 0;
  2560. end
  2561. else
  2562. begin
  2563. CFrame := $0503;
  2564. CTitle := $0004;
  2565. F := 9;
  2566. end;
  2567. CFrame := GetColor(CFrame);
  2568. CTitle := GetColor(CTitle);
  2569. Width := Size.X;
  2570. L := Width - 10;
  2571. if PWindow(Owner)^.Flags and (wfClose+wfZoom) <> 0 then
  2572. Dec(L,6);
  2573. FrameLine(B, 0, F, Byte(CFrame));
  2574. if (PWindow(Owner)^.Number <> wnNoNumber) and
  2575. (PWindow(Owner)^.Number < 10) then
  2576. begin
  2577. Dec(L,4);
  2578. if PWindow(Owner)^.Flags and wfZoom <> 0 then
  2579. I := 7
  2580. else
  2581. I := 3;
  2582. WordRec(B[Width - I]).Lo := PWindow(Owner)^.Number + $30;
  2583. end;
  2584. if Owner <> nil then
  2585. Title := PWindow(Owner)^.GetTitle(L)
  2586. else
  2587. Title := '';
  2588. if Title <> '' then
  2589. begin
  2590. L := Length(Title);
  2591. if L > Width - 10 then
  2592. L := Width - 10;
  2593. if L < 0 then
  2594. L := 0;
  2595. I := (Width - L) shr 1;
  2596. MoveChar(B[I - 1], ' ', CTitle, 1);
  2597. MoveBuf(B[I], Title[1], CTitle, L);
  2598. MoveChar(B[I + L], ' ', CTitle, 1);
  2599. end;
  2600. if State and sfActive <> 0 then
  2601. begin
  2602. if PWindow(Owner)^.Flags and wfClose <> 0 then
  2603. if FrameMode and fmCloseClicked = 0 then
  2604. MoveCStr(B[2], '[~þ~]', CFrame)
  2605. else
  2606. MoveCStr(B[2], '[~'+ClickC[LowAscii]+'~]', CFrame);
  2607. if PWindow(Owner)^.Flags and wfZoom <> 0 then
  2608. begin
  2609. MoveCStr(B[Width - 5], '[~'+LargeC[LowAscii]+'~]', CFrame);
  2610. Owner^.SizeLimits(Min, Max);
  2611. if FrameMode and fmZoomClicked <> 0 then
  2612. WordRec(B[Width - 4]).Lo := ord(ClickC[LowAscii])
  2613. else
  2614. if (Owner^.Size.X=Max.X) and (Owner^.Size.Y=Max.Y) then
  2615. WordRec(B[Width - 4]).Lo := ord(RestoreC[LowAscii]);
  2616. end;
  2617. end;
  2618. WriteLine(0, 0, Size.X, 1, B);
  2619. for I := 1 to Size.Y - 2 do
  2620. begin
  2621. FrameLine(B, I, F + 3, Byte(CFrame));
  2622. WriteLine(0, I, Size.X, 1, B);
  2623. end;
  2624. FrameLine(B, Size.Y - 1, F + 6, Byte(CFrame));
  2625. if State and sfActive <> 0 then
  2626. if PWindow(Owner)^.Flags and wfGrow <> 0 then
  2627. MoveCStr(B[Width - 2], '~ÄÙ~', CFrame);
  2628. WriteLine(0, Size.Y - 1, Size.X, 1, B);
  2629. end;
  2630. {--TFrame-------------------------------------------------------------------}
  2631. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  2632. {---------------------------------------------------------------------------}
  2633. FUNCTION TFrame.GetPalette: PPalette;
  2634. CONST P: String[Length(CFrame)] = CFrame; { Always normal string }
  2635. BEGIN
  2636. GetPalette := PPalette(@P); { Return palette }
  2637. END;
  2638. procedure TFrame.HandleEvent(var Event: TEvent);
  2639. var
  2640. Mouse: TPoint;
  2641. procedure DragWindow(Mode: Byte);
  2642. var
  2643. Limits: TRect;
  2644. Min, Max: TPoint;
  2645. begin
  2646. Owner^.Owner^.GetExtent(Limits);
  2647. Owner^.SizeLimits(Min, Max);
  2648. Owner^.DragView(Event, Owner^.DragMode or Mode, Limits, Min, Max);
  2649. ClearEvent(Event);
  2650. end;
  2651. begin
  2652. TView.HandleEvent(Event);
  2653. if Event.What = evMouseDown then
  2654. begin
  2655. MakeLocal(Event.Where, Mouse);
  2656. if Mouse.Y = 0 then
  2657. begin
  2658. if (PWindow(Owner)^.Flags and wfClose <> 0) and
  2659. (State and sfActive <> 0) and (Mouse.X >= 2) and (Mouse.X <= 4) then
  2660. begin
  2661. {Close button clicked.}
  2662. repeat
  2663. MakeLocal(Event.Where, Mouse);
  2664. if (Mouse.X >= 2) and (Mouse.X <= 4) and (Mouse.Y = 0) then
  2665. FrameMode := fmCloseClicked
  2666. else FrameMode := 0;
  2667. DrawView;
  2668. until not MouseEvent(Event, evMouseMove + evMouseAuto);
  2669. FrameMode := 0;
  2670. if (Mouse.X >= 2) and (Mouse.X <= 4) and (Mouse.Y = 0) then
  2671. begin
  2672. Event.What := evCommand;
  2673. Event.Command := cmClose;
  2674. Event.InfoPtr := Owner;
  2675. PutEvent(Event);
  2676. end;
  2677. ClearEvent(Event);
  2678. DrawView;
  2679. end else
  2680. if (PWindow(Owner)^.Flags and wfZoom <> 0) and
  2681. (State and sfActive <> 0) and (Event.Double or
  2682. (Mouse.X >= Size.X - 5) and
  2683. (Mouse.X <= Size.X - 3)) then
  2684. begin
  2685. {Zoom button clicked.}
  2686. if not Event.Double then
  2687. repeat
  2688. MakeLocal(Event.Where, Mouse);
  2689. if (Mouse.X >= Size.X - 5) and (Mouse.X <= Size.X - 3) and
  2690. (Mouse.Y = 0) then
  2691. FrameMode := fmZoomClicked
  2692. else FrameMode := 0;
  2693. DrawView;
  2694. until not MouseEvent(Event, evMouseMove + evMouseAuto);
  2695. FrameMode := 0;
  2696. if ((Mouse.X >= Size.X - 5) and (Mouse.X <= Size.X - 3) and
  2697. (Mouse.Y = 0)) or Event.Double then
  2698. begin
  2699. Event.What := evCommand;
  2700. Event.Command := cmZoom;
  2701. Event.InfoPtr := Owner;
  2702. PutEvent(Event);
  2703. end;
  2704. ClearEvent(Event);
  2705. DrawView;
  2706. end else
  2707. if PWindow(Owner)^.Flags and wfMove <> 0 then
  2708. DragWindow(dmDragMove);
  2709. end else
  2710. if (State and sfActive <> 0) and (Mouse.X >= Size.X - 2) and
  2711. (Mouse.Y >= Size.Y - 1) then
  2712. if PWindow(Owner)^.Flags and wfGrow <> 0 then
  2713. DragWindow(dmDragGrow);
  2714. end;
  2715. end;
  2716. procedure TFrame.SetState(AState: Word; Enable: Boolean);
  2717. begin
  2718. TView.SetState(AState, Enable);
  2719. if AState and (sfActive + sfDragging) <> 0 then
  2720. DrawView;
  2721. end;
  2722. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  2723. { TScrollBar OBJECT METHODS }
  2724. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  2725. {--TScrollBar---------------------------------------------------------------}
  2726. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  2727. {---------------------------------------------------------------------------}
  2728. CONSTRUCTOR TScrollBar.Init (Var Bounds: TRect);
  2729. const
  2730. VChars: array[boolean] of TScrollChars =
  2731. (('^','V', #177, #254, #178),(#30, #31, #177, #254, #178));
  2732. HChars: array[boolean] of TScrollChars =
  2733. (('<','>', #177, #254, #178),(#17, #16, #177, #254, #178));
  2734. BEGIN
  2735. Inherited Init(Bounds); { Call ancestor }
  2736. PgStep := 1; { Page step size = 1 }
  2737. ArStep := 1; { Arrow step sizes = 1 }
  2738. If (Size.X = 1) Then Begin { Vertical scrollbar }
  2739. GrowMode := gfGrowLoX + gfGrowHiX + gfGrowHiY; { Grow vertically }
  2740. Chars := VChars[LowAscii]; { Vertical chars }
  2741. End Else Begin { Horizontal scrollbar }
  2742. GrowMode := gfGrowLoY + gfGrowHiX + gfGrowHiY; { Grow horizontal }
  2743. Chars := HChars[LowAscii]; { Horizontal chars }
  2744. End;
  2745. END;
  2746. {--TScrollBar---------------------------------------------------------------}
  2747. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  2748. {---------------------------------------------------------------------------}
  2749. { This load method will read old original TV data from a stream with the }
  2750. { scrollbar id set to zero. }
  2751. {---------------------------------------------------------------------------}
  2752. CONSTRUCTOR TScrollBar.Load (Var S: TStream);
  2753. VAR i: Integer;
  2754. BEGIN
  2755. Inherited Load(S); { Call ancestor }
  2756. S.Read(i, SizeOf(i)); Value:=i; { Read current value }
  2757. S.Read(i, SizeOf(i)); Min:=i; { Read min value }
  2758. S.Read(i, SizeOf(i)); Max:=i; { Read max value }
  2759. S.Read(i, SizeOf(i)); PgStep:=i; { Read page step size }
  2760. S.Read(i, SizeOf(i)); ArStep:=i; { Read arrow step size }
  2761. S.Read(Chars, SizeOf(Chars)); { Read scroll chars }
  2762. END;
  2763. {--TScrollBar---------------------------------------------------------------}
  2764. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  2765. {---------------------------------------------------------------------------}
  2766. FUNCTION TScrollBar.GetPalette: PPalette;
  2767. CONST P: String[Length(CScrollBar)] = CScrollBar; { Always normal string }
  2768. BEGIN
  2769. GetPalette := PPalette(@P); { Return palette }
  2770. END;
  2771. {--TScrollBar---------------------------------------------------------------}
  2772. { ScrollStep -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  2773. {---------------------------------------------------------------------------}
  2774. FUNCTION TScrollBar.ScrollStep (Part: Sw_Integer): Sw_Integer;
  2775. VAR Step: Sw_Integer;
  2776. BEGIN
  2777. If (Part AND $0002 = 0) Then Step := ArStep { Range step size }
  2778. Else Step := PgStep; { Page step size }
  2779. If (Part AND $0001 = 0) Then ScrollStep := -Step { Upwards move }
  2780. Else ScrollStep := Step; { Downwards move }
  2781. END;
  2782. {--TScrollBar---------------------------------------------------------------}
  2783. { ScrollDraw -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  2784. {---------------------------------------------------------------------------}
  2785. PROCEDURE TScrollBar.ScrollDraw;
  2786. VAR P: PView;
  2787. BEGIN
  2788. If (Id <> 0) Then Begin
  2789. P := TopView; { Get topmost view }
  2790. NewMessage(P, evCommand, cmIdCommunicate, Id,
  2791. Value, @Self); { New Id style message }
  2792. End;
  2793. NewMessage(Owner, evBroadcast, cmScrollBarChanged,
  2794. Id, Value, @Self); { Old TV style message }
  2795. END;
  2796. {--TScrollBar---------------------------------------------------------------}
  2797. { SetValue -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 19May98 LdB }
  2798. {---------------------------------------------------------------------------}
  2799. PROCEDURE TScrollBar.SetValue (AValue: Sw_Integer);
  2800. BEGIN
  2801. SetParams(AValue, Min, Max, PgStep, ArStep); { Set value }
  2802. END;
  2803. {--TScrollBar---------------------------------------------------------------}
  2804. { SetRange -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 19May98 LdB }
  2805. {---------------------------------------------------------------------------}
  2806. PROCEDURE TScrollBar.SetRange (AMin, AMax: Sw_Integer);
  2807. BEGIN
  2808. SetParams(Value, AMin, AMax, PgStep, ArStep); { Set range }
  2809. END;
  2810. {--TScrollBar---------------------------------------------------------------}
  2811. { SetStep -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 19May98 LdB }
  2812. {---------------------------------------------------------------------------}
  2813. PROCEDURE TScrollBar.SetStep (APgStep, AArStep: Sw_Integer);
  2814. BEGIN
  2815. SetParams(Value, Min, Max, APgStep, AArStep); { Set step sizes }
  2816. END;
  2817. {--TScrollBar---------------------------------------------------------------}
  2818. { SetParams -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 21Jul99 LdB }
  2819. {---------------------------------------------------------------------------}
  2820. PROCEDURE TScrollBar.SetParams (AValue, AMin, AMax, APgStep, AArStep: Sw_Integer);
  2821. var
  2822. OldValue : Sw_Integer;
  2823. BEGIN
  2824. If (AMax < AMin) Then AMax := AMin; { Max below min fix up }
  2825. If (AValue < AMin) Then AValue := AMin; { Value below min fix }
  2826. If (AValue > AMax) Then AValue := AMax; { Value above max fix }
  2827. OldValue:=Value;
  2828. If (Value <> AValue) OR (Min <> AMin) OR
  2829. (Max <> AMax) Then Begin { Something changed }
  2830. Min := AMin; { Set new minimum }
  2831. Max := AMax; { Set new maximum }
  2832. Value := AValue; { Set new value }
  2833. DrawView;
  2834. if OldValue <> AValue then
  2835. ScrollDraw;
  2836. End;
  2837. PgStep := APgStep; { Hold page step }
  2838. ArStep := AArStep; { Hold arrow step }
  2839. END;
  2840. {--TScrollBar---------------------------------------------------------------}
  2841. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  2842. {---------------------------------------------------------------------------}
  2843. { You can save data to the stream compatable with the old original TV by }
  2844. { temporarily turning off the ofGrafVersion making the call to this store }
  2845. { routine and resetting the ofGrafVersion flag after the call. }
  2846. {---------------------------------------------------------------------------}
  2847. PROCEDURE TScrollBar.Store (Var S: TStream);
  2848. VAR i: Integer;
  2849. BEGIN
  2850. TView.Store(S); { TView.Store called }
  2851. i:=Value;S.Write(i, SizeOf(i)); { Write current value }
  2852. i:=Min;S.Write(i, SizeOf(i)); { Write min value }
  2853. i:=Max;S.Write(i, SizeOf(i)); { Write max value }
  2854. i:=PgStep;S.Write(i, SizeOf(i)); { Write page step size }
  2855. i:=ArStep;S.Write(i, SizeOf(i)); { Write arrow step size }
  2856. S.Write(Chars, SizeOf(Chars)); { Write scroll chars }
  2857. END;
  2858. {--TScrollBar---------------------------------------------------------------}
  2859. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 22May98 LdB }
  2860. {---------------------------------------------------------------------------}
  2861. PROCEDURE TScrollBar.HandleEvent (Var Event: TEvent);
  2862. VAR Tracking: Boolean; I, P, S, ClickPart, Iv: Sw_Integer;
  2863. Mouse: TPoint; Extent: TRect;
  2864. FUNCTION GetPartCode: Sw_Integer;
  2865. VAR Mark, Part : Sw_Integer;
  2866. BEGIN
  2867. Part := -1; { Preset failure }
  2868. If Extent.Contains(Mouse) Then Begin { Contains mouse }
  2869. If (Size.X = 1) Then Begin { Vertical scrollbar }
  2870. Mark := Mouse.Y; { Calc position }
  2871. End Else Begin { Horizontal bar }
  2872. Mark := Mouse.X; { Calc position }
  2873. End;
  2874. If (Mark >= P) AND (Mark < P+1) Then { Within thumbnail }
  2875. Part := sbIndicator; { Indicator part }
  2876. If (Part <> sbIndicator) Then Begin { Not indicator part }
  2877. If (Mark < 1) Then Part := sbLeftArrow Else { Left arrow part }
  2878. If (Mark < P) Then Part := sbPageLeft Else { Page left part }
  2879. If (Mark < S-1) Then Part := sbPageRight Else { Page right part }
  2880. Part := sbRightArrow; { Right arrow part }
  2881. If (Size.X = 1) Then Inc(Part, 4); { Correct for vertical }
  2882. End;
  2883. End;
  2884. GetPartCode := Part; { Return part code }
  2885. END;
  2886. PROCEDURE Clicked;
  2887. BEGIN
  2888. NewMessage(Owner, evBroadcast, cmScrollBarClicked,
  2889. Id, Value, @Self); { Old TV style message }
  2890. END;
  2891. BEGIN
  2892. Inherited HandleEvent(Event); { Call ancestor }
  2893. Case Event.What Of
  2894. evNothing: Exit; { Speed up exit }
  2895. evCommand: Begin { Command event }
  2896. If (Event.Command = cmIdCommunicate) AND { Id communication }
  2897. (Event.Id = Id) AND (Event.InfoPtr <> @Self) { Targeted to us }
  2898. Then Begin
  2899. SetValue(Round(Event.Data)); { Set scrollbar value }
  2900. ClearEvent(Event); { Event was handled }
  2901. End;
  2902. End;
  2903. evKeyDown:
  2904. If (State AND sfVisible <> 0) Then Begin { Scrollbar visible }
  2905. ClickPart := sbIndicator; { Preset result }
  2906. If (Size.Y = 1) Then { Horizontal bar }
  2907. Case CtrlToArrow(Event.KeyCode) Of
  2908. kbLeft: ClickPart := sbLeftArrow; { Left one item }
  2909. kbRight: ClickPart := sbRightArrow; { Right one item }
  2910. kbCtrlLeft: ClickPart := sbPageLeft; { One page left }
  2911. kbCtrlRight: ClickPart := sbPageRight; { One page right }
  2912. kbHome: I := Min; { Move to start }
  2913. kbEnd: I := Max; { Move to end }
  2914. Else Exit; { Not a valid key }
  2915. End
  2916. Else { Vertical bar }
  2917. Case CtrlToArrow(Event.KeyCode) Of
  2918. kbUp: ClickPart := sbUpArrow; { One item up }
  2919. kbDown: ClickPart := sbDownArrow; { On item down }
  2920. kbPgUp: ClickPart := sbPageUp; { One page up }
  2921. kbPgDn: ClickPart := sbPageDown; { One page down }
  2922. kbCtrlPgUp: I := Min; { Move to top }
  2923. kbCtrlPgDn: I := Max; { Move to bottom }
  2924. Else Exit; { Not a valid key }
  2925. End;
  2926. Clicked; { Send out message }
  2927. If (ClickPart <> sbIndicator) Then
  2928. I := Value + ScrollStep(ClickPart); { Calculate position }
  2929. SetValue(I); { Set new item }
  2930. ClearEvent(Event); { Event now handled }
  2931. End;
  2932. evMouseDown: Begin { Mouse press event }
  2933. Clicked; { Scrollbar clicked }
  2934. MakeLocal(Event.Where, Mouse); { Localize mouse }
  2935. Extent.A.X := 0; { Zero x extent value }
  2936. Extent.A.Y := 0; { Zero y extent value }
  2937. Extent.B.X := Size.X; { Set extent x value }
  2938. Extent.B.Y := Size.Y; { set extent y value }
  2939. P := GetPos; { Current position }
  2940. S := GetSize; { Initial size }
  2941. ClickPart := GetPartCode; { Get part code }
  2942. If (ClickPart <> sbIndicator) Then Begin { Not thumb nail }
  2943. Repeat
  2944. MakeLocal(Event.Where, Mouse); { Localize mouse }
  2945. If GetPartCode = ClickPart Then
  2946. SetValue(Value+ScrollStep(ClickPart)); { Same part repeat }
  2947. Until NOT MouseEvent(Event, evMouseAuto); { Until auto done }
  2948. Clicked; { Scrollbar clicked }
  2949. End Else Begin { Thumb nail move }
  2950. Iv := Value; { Initial value }
  2951. Repeat
  2952. MakeLocal(Event.Where, Mouse); { Localize mouse }
  2953. Tracking := Extent.Contains(Mouse); { Check contains }
  2954. If Tracking Then Begin { Tracking mouse }
  2955. If (Size.X=1) Then
  2956. I := Mouse.Y Else { Calc vert position }
  2957. I := Mouse.X; { Calc horz position }
  2958. If (I < 0) Then I := 0; { Check underflow }
  2959. If (I > S) Then I := S; { Check overflow }
  2960. End Else I := GetPos; { Get position }
  2961. If (I <> P) Then Begin
  2962. SetValue(LongInt((LongInt(I)*(Max-Min))
  2963. +(S SHR 1)) DIV S + Min); { Set new value }
  2964. P := I; { Hold new position }
  2965. End;
  2966. Until NOT MouseEvent(Event, evMouseMove); { Until not moving }
  2967. If Tracking AND (S > 0) Then { Tracking mouse }
  2968. SetValue(LongInt((LongInt(P)*(Max-Min))+
  2969. (S SHR 1)) DIV S + Min); { Set new value }
  2970. If (Iv <> Value) Then Clicked; { Scroll has moved }
  2971. End;
  2972. ClearEvent(Event); { Clear the event }
  2973. End;
  2974. End;
  2975. END;
  2976. {***************************************************************************}
  2977. { TScrollBar OBJECT PRIVATE METHODS }
  2978. {***************************************************************************}
  2979. {--TScrollBar---------------------------------------------------------------}
  2980. { GetPos -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23May98 LdB }
  2981. {---------------------------------------------------------------------------}
  2982. FUNCTION TScrollBar.GetPos: Sw_Integer;
  2983. VAR R: Sw_Integer;
  2984. BEGIN
  2985. R := Max - Min; { Get full range }
  2986. If (R = 0) Then GetPos := 1 Else { Return zero }
  2987. GetPos := LongInt((LongInt(Value-Min) * (GetSize -3))
  2988. + (R SHR 1)) DIV R + 1; { Calc position }
  2989. END;
  2990. {--TScrollBar---------------------------------------------------------------}
  2991. { GetSize -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23May98 LdB }
  2992. {---------------------------------------------------------------------------}
  2993. FUNCTION TScrollBar.GetSize: Sw_Integer;
  2994. VAR S: Sw_Integer;
  2995. BEGIN
  2996. If Size.X = 1 Then
  2997. S:= Size.Y
  2998. else
  2999. S:= Size.X;
  3000. If (S < 3) Then S := 3; { Fix minimum size }
  3001. GetSize := S; { Return size }
  3002. END;
  3003. {--TScrollBar---------------------------------------------------------------}
  3004. { Draw -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB }
  3005. {---------------------------------------------------------------------------}
  3006. PROCEDURE TScrollBar.Draw;
  3007. BEGIN
  3008. DrawPos(GetPos); { Draw position }
  3009. END;
  3010. procedure TScrollBar.DrawPos(Pos: Sw_Integer);
  3011. var
  3012. S: Sw_Integer;
  3013. B: TDrawBuffer;
  3014. begin
  3015. S := GetSize - 1;
  3016. MoveChar(B[0], Chars[0], GetColor(2), 1);
  3017. if Max = Min then
  3018. MoveChar(B[1], Chars[4], GetColor(1), S - 1)
  3019. else
  3020. begin
  3021. MoveChar(B[1], Chars[2], GetColor(1), S - 1);
  3022. MoveChar(B[Pos], Chars[3], GetColor(3), 1);
  3023. end;
  3024. MoveChar(B[S], Chars[1], GetColor(2), 1);
  3025. WriteBuf(0, 0, Size.X, Size.Y, B);
  3026. end;
  3027. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  3028. { TScroller OBJECT METHODS }
  3029. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  3030. {--TScroller----------------------------------------------------------------}
  3031. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  3032. {---------------------------------------------------------------------------}
  3033. CONSTRUCTOR TScroller.Init (Var Bounds: TRect; AHScrollBar, AVScrollBar: PScrollBar);
  3034. BEGIN
  3035. Inherited Init(Bounds); { Call ancestor }
  3036. Options := Options OR ofSelectable; { View is selectable }
  3037. EventMask := EventMask OR evBroadcast; { See broadcasts }
  3038. HScrollBar := AHScrollBar; { Hold horz scrollbar }
  3039. VScrollBar := AVScrollBar; { Hold vert scrollbar }
  3040. END;
  3041. {--TScroller----------------------------------------------------------------}
  3042. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  3043. {---------------------------------------------------------------------------}
  3044. { This load method will read old original TV data from a stream as well }
  3045. { as the new graphical scroller views. }
  3046. {---------------------------------------------------------------------------}
  3047. CONSTRUCTOR TScroller.Load (Var S: TStream);
  3048. VAR i: Integer;
  3049. BEGIN
  3050. Inherited Load(S); { Call ancestor }
  3051. GetPeerViewPtr(S, HScrollBar); { Load horz scrollbar }
  3052. GetPeerViewPtr(S, VScrollBar); { Load vert scrollbar }
  3053. S.Read(i, SizeOf(i)); Delta.X:=i; { Read delta x value }
  3054. S.Read(i, SizeOf(i)); Delta.Y:=i; { Read delta y value }
  3055. S.Read(i, SizeOf(i)); Limit.X:=i; { Read limit x value }
  3056. S.Read(i, SizeOf(i)); Limit.Y:=i; { Read limit y value }
  3057. END;
  3058. {--TScroller----------------------------------------------------------------}
  3059. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  3060. {---------------------------------------------------------------------------}
  3061. FUNCTION TScroller.GetPalette: PPalette;
  3062. CONST P: String[Length(CScroller)] = CScroller; { Always normal string }
  3063. BEGIN
  3064. GetPalette := PPalette(@P); { Scroller palette }
  3065. END;
  3066. {--TScroller----------------------------------------------------------------}
  3067. { ScrollTo -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  3068. {---------------------------------------------------------------------------}
  3069. PROCEDURE TScroller.ScrollTo (X, Y: Sw_Integer);
  3070. BEGIN
  3071. Inc(DrawLock); { Set draw lock }
  3072. If (HScrollBar<>Nil) Then HScrollBar^.SetValue(X); { Set horz scrollbar }
  3073. If (VScrollBar<>Nil) Then VScrollBar^.SetValue(Y); { Set vert scrollbar }
  3074. Dec(DrawLock); { Release draw lock }
  3075. CheckDraw; { Check need to draw }
  3076. END;
  3077. {--TScroller----------------------------------------------------------------}
  3078. { SetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  3079. {---------------------------------------------------------------------------}
  3080. PROCEDURE TScroller.SetState (AState: Word; Enable: Boolean);
  3081. PROCEDURE ShowSBar (SBar: PScrollBar);
  3082. BEGIN
  3083. If (SBar <> Nil) Then { Scroll bar valid }
  3084. If GetState(sfActive + sfSelected) Then { Check state masks }
  3085. SBar^.Show Else SBar^.Hide; { Draw appropriately }
  3086. END;
  3087. BEGIN
  3088. Inherited SetState(AState, Enable); { Call ancestor }
  3089. If (AState AND (sfActive + sfSelected) <> 0) { Active/select change }
  3090. Then Begin
  3091. ShowSBar(HScrollBar); { Redraw horz scrollbar }
  3092. ShowSBar(VScrollBar); { Redraw vert scrollbar }
  3093. End;
  3094. END;
  3095. {--TScroller----------------------------------------------------------------}
  3096. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  3097. {---------------------------------------------------------------------------}
  3098. { The scroller is saved to the stream compatable with the old TV object. }
  3099. {---------------------------------------------------------------------------}
  3100. PROCEDURE TScroller.Store (Var S: TStream);
  3101. VAR i: Integer;
  3102. BEGIN
  3103. TView.Store(S); { Call TView explicitly }
  3104. PutPeerViewPtr(S, HScrollBar); { Store horz bar }
  3105. PutPeerViewPtr(S, VScrollBar); { Store vert bar }
  3106. i:=Delta.X;S.Write(i, SizeOf(i)); { Write delta x value }
  3107. i:=Delta.Y;S.Write(i, SizeOf(i)); { Write delta y value }
  3108. i:=Limit.X;S.Write(i, SizeOf(i)); { Write limit x value }
  3109. i:=Limit.Y;S.Write(i, SizeOf(i)); { Write limit y value }
  3110. END;
  3111. {--TScroller----------------------------------------------------------------}
  3112. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  3113. {---------------------------------------------------------------------------}
  3114. PROCEDURE TScroller.HandleEvent (Var Event: TEvent);
  3115. BEGIN
  3116. Inherited HandleEvent(Event); { Call ancestor }
  3117. If (Event.What = evBroadcast) AND
  3118. (Event.Command = cmScrollBarChanged) AND { Scroll bar change }
  3119. ((Event.InfoPtr = HScrollBar) OR { Our scrollbar? }
  3120. (Event.InfoPtr = VScrollBar)) Then ScrollDraw; { Redraw scroller }
  3121. END;
  3122. {--TScroller----------------------------------------------------------------}
  3123. { ChangeBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  3124. {---------------------------------------------------------------------------}
  3125. PROCEDURE TScroller.ChangeBounds (Var Bounds: TRect);
  3126. BEGIN
  3127. SetBounds(Bounds); { Set new bounds }
  3128. Inc(DrawLock); { Set draw lock }
  3129. SetLimit(Limit.X, Limit.Y); { Adjust limits }
  3130. Dec(DrawLock); { Release draw lock }
  3131. DrawFlag := False; { Clear draw flag }
  3132. DrawView; { Redraw now }
  3133. END;
  3134. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  3135. { TListViewer OBJECT METHODS }
  3136. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  3137. CONST TvListViewerName = 'LISTBOX'; { Native name }
  3138. {--TListViewer--------------------------------------------------------------}
  3139. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May98 LdB }
  3140. {---------------------------------------------------------------------------}
  3141. CONSTRUCTOR TListViewer.Init (Var Bounds: TRect; ANumCols: Sw_Word; AHScrollBar,
  3142. AVScrollBar: PScrollBar);
  3143. VAR ArStep, PgStep: Sw_Integer;
  3144. BEGIN
  3145. Inherited Init(Bounds); { Call ancestor }
  3146. Options := Options OR (ofFirstClick+ofSelectable); { Set options }
  3147. EventMask := EventMask OR evBroadcast; { Set event mask }
  3148. NumCols := ANumCols; { Hold column number }
  3149. If (AVScrollBar <> Nil) Then Begin { Chk vert scrollbar }
  3150. If (NumCols = 1) Then Begin { Only one column }
  3151. PgStep := Size.Y -1; { Set page size }
  3152. ArStep := 1; { Set step size }
  3153. End Else Begin { Multiple columns }
  3154. PgStep := Size.Y * NumCols; { Set page size }
  3155. ArStep := Size.Y; { Set step size }
  3156. End;
  3157. AVScrollBar^.SetStep(PgStep, ArStep); { Set scroll values }
  3158. End;
  3159. If (AHScrollBar <> Nil) Then
  3160. AHScrollBar^.SetStep(Size.X DIV NumCols, 1); { Set step size }
  3161. HScrollBar := AHScrollBar; { Horz scrollbar held }
  3162. VScrollBar := AVScrollBar; { Vert scrollbar held }
  3163. END;
  3164. {--TListViewer--------------------------------------------------------------}
  3165. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May98 LdB }
  3166. {---------------------------------------------------------------------------}
  3167. CONSTRUCTOR TListViewer.Load (Var S: TStream);
  3168. VAR w: Word;
  3169. BEGIN
  3170. Inherited Load(S); { Call ancestor }
  3171. GetPeerViewPtr(S, HScrollBar); { Get horz scrollbar }
  3172. GetPeerViewPtr(S, VScrollBar); { Get vert scrollbar }
  3173. S.Read(w, SizeOf(w)); NumCols:=w; { Read column number }
  3174. S.Read(w, SizeOf(w)); TopItem:=w; { Read top most item }
  3175. S.Read(w, SizeOf(w)); Focused:=w; { Read focused item }
  3176. S.Read(w, SizeOf(w)); Range:=w; { Read listview range }
  3177. END;
  3178. {--TListViewer--------------------------------------------------------------}
  3179. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May98 LdB }
  3180. {---------------------------------------------------------------------------}
  3181. FUNCTION TListViewer.GetPalette: PPalette;
  3182. CONST P: String[Length(CListViewer)] = CListViewer; { Always normal string }
  3183. BEGIN
  3184. GetPalette := PPalette(@P); { Return palette }
  3185. END;
  3186. {--TListViewer--------------------------------------------------------------}
  3187. { IsSelected -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May98 LdB }
  3188. {---------------------------------------------------------------------------}
  3189. FUNCTION TListViewer.IsSelected (Item: Sw_Integer): Boolean;
  3190. BEGIN
  3191. If (Item = Focused) Then IsSelected := True Else
  3192. IsSelected := False; { Selected item }
  3193. END;
  3194. {--TListViewer--------------------------------------------------------------}
  3195. { GetText -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May98 LdB }
  3196. {---------------------------------------------------------------------------}
  3197. FUNCTION TListViewer.GetText (Item: Sw_Integer; MaxLen: Sw_Integer): String;
  3198. BEGIN { Abstract method }
  3199. GetText := ''; { Return empty }
  3200. END;
  3201. {--TListViewer--------------------------------------------------------------}
  3202. { DrawBackGround -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB }
  3203. {---------------------------------------------------------------------------}
  3204. PROCEDURE TListViewer.Draw;
  3205. VAR I, J, ColWidth, Item, Indent, CurCol: Sw_Integer;
  3206. Color: Word; SCOff: Byte;
  3207. Text: String; B: TDrawBuffer;
  3208. BEGIN
  3209. ColWidth := Size.X DIV NumCols + 1; { Calc column width }
  3210. If (HScrollBar = Nil) Then Indent := 0 Else { Set indent to zero }
  3211. Indent := HScrollBar^.Value; { Fetch any indent }
  3212. For I := 0 To Size.Y - 1 Do Begin { For each line }
  3213. For J := 0 To NumCols-1 Do Begin { For each column }
  3214. Item := J*Size.Y + I + TopItem; { Process this item }
  3215. CurCol := J*ColWidth; { Current column }
  3216. If (State AND (sfSelected + sfActive) =
  3217. (sfSelected + sfActive)) AND (Focused = Item) { Focused item }
  3218. AND (Range > 0) Then Begin
  3219. Color := GetColor(3); { Focused colour }
  3220. SetCursor(CurCol+1,I); { Set the cursor }
  3221. SCOff := 0; { Zero colour offset }
  3222. End Else If (Item < Range) AND IsSelected(Item){ Selected item }
  3223. Then Begin
  3224. Color := GetColor(4); { Selected color }
  3225. SCOff := 2; { Colour offset=2 }
  3226. End Else Begin
  3227. Color := GetColor(2); { Normal Color }
  3228. SCOff := 4; { Colour offset=4 }
  3229. End;
  3230. MoveChar(B[CurCol], ' ', Color, ColWidth); { Clear buffer }
  3231. If (Item < Range) Then Begin { Within text range }
  3232. Text := GetText(Item, ColWidth + Indent); { Fetch text }
  3233. Text := Copy(Text, Indent, ColWidth); { Select right bit }
  3234. MoveStr(B[CurCol+1], Text, Color); { Transfer to buffer }
  3235. If ShowMarkers Then Begin
  3236. WordRec(B[CurCol]).Lo := Byte(
  3237. SpecialChars[SCOff]); { Set marker character }
  3238. WordRec(B[CurCol+ColWidth-2]).Lo := Byte(
  3239. SpecialChars[SCOff+1]); { Set marker character }
  3240. End;
  3241. End;
  3242. MoveChar(B[CurCol+ColWidth-1], #179,
  3243. GetColor(5), 1); { Put centre line marker }
  3244. End;
  3245. WriteLine(0, I, Size.X, 1, B); { Write line to screen }
  3246. End;
  3247. END;
  3248. {--TListViewer--------------------------------------------------------------}
  3249. { FocusItem -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  3250. {---------------------------------------------------------------------------}
  3251. PROCEDURE TListViewer.FocusItem (Item: Sw_Integer);
  3252. BEGIN
  3253. Focused := Item; { Set focus to item }
  3254. If (VScrollBar <> Nil) Then
  3255. VScrollBar^.SetValue(Item); { Scrollbar to value }
  3256. If (Item < TopItem) Then { Item above top item }
  3257. If (NumCols = 1) Then TopItem := Item { Set top item }
  3258. Else TopItem := Item - Item MOD Size.Y { Set top item }
  3259. Else If (Item >= TopItem + (Size.Y*NumCols)) Then { Item below bottom }
  3260. If (NumCols = 1) Then TopItem := Item-Size.Y+1 { Set new top item }
  3261. Else TopItem := Item - Item MOD Size.Y -
  3262. (Size.Y*(NumCols-1)); { Set new top item }
  3263. END;
  3264. {--TListViewer--------------------------------------------------------------}
  3265. { SetTopItem -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 06Aug99 LdB }
  3266. {---------------------------------------------------------------------------}
  3267. PROCEDURE TListViewer.SetTopItem (Item: Sw_Integer);
  3268. BEGIN
  3269. TopItem := Item; { Set the top item }
  3270. END;
  3271. {--TListViewer--------------------------------------------------------------}
  3272. { SetRange -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  3273. {---------------------------------------------------------------------------}
  3274. PROCEDURE TListViewer.SetRange (ARange: Sw_Integer);
  3275. BEGIN
  3276. Range := ARange; { Set new range }
  3277. If (VScrollBar <> Nil) Then Begin { Vertical scrollbar }
  3278. If (Focused > ARange) Then Focused := 0; { Clear focused }
  3279. VScrollBar^.SetParams(Focused, 0, ARange - 1,
  3280. VScrollBar^.PgStep, VScrollBar^.ArStep); { Set parameters }
  3281. End;
  3282. END;
  3283. {--TListViewer--------------------------------------------------------------}
  3284. { SelectItem -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  3285. {---------------------------------------------------------------------------}
  3286. PROCEDURE TListViewer.SelectItem (Item: Sw_Integer);
  3287. BEGIN
  3288. Message(Owner, evBroadcast, cmListItemSelected,
  3289. @Self); { Send message }
  3290. END;
  3291. {--TListViewer--------------------------------------------------------------}
  3292. { SetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB }
  3293. {---------------------------------------------------------------------------}
  3294. PROCEDURE TListViewer.SetState (AState: Word; Enable: Boolean);
  3295. PROCEDURE ShowSBar(SBar: PScrollBar);
  3296. BEGIN
  3297. If (SBar <> Nil) Then { Valid scrollbar }
  3298. If GetState(sfActive) AND GetState(sfVisible) { Check states }
  3299. Then SBar^.Show Else SBar^.Hide; { Show or hide }
  3300. END;
  3301. BEGIN
  3302. Inherited SetState(AState, Enable); { Call ancestor }
  3303. If (AState AND (sfSelected + sfActive + sfVisible) <> 0)
  3304. Then Begin { Check states }
  3305. DrawView; { Draw the view }
  3306. ShowSBar(HScrollBar); { Show horz scrollbar }
  3307. ShowSBar(VScrollBar); { Show vert scrollbar }
  3308. End;
  3309. END;
  3310. {--TListViewer--------------------------------------------------------------}
  3311. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  3312. {---------------------------------------------------------------------------}
  3313. PROCEDURE TListViewer.Store (Var S: TStream);
  3314. VAR w: Word;
  3315. BEGIN
  3316. TView.Store(S); { Call TView explicitly }
  3317. PutPeerViewPtr(S, HScrollBar); { Put horz scrollbar }
  3318. PutPeerViewPtr(S, VScrollBar); { Put vert scrollbar }
  3319. w:=NumCols;S.Write(w, SizeOf(w)); { Write column number }
  3320. w:=TopItem;S.Write(w, SizeOf(w)); { Write top most item }
  3321. w:=Focused;S.Write(w, SizeOf(w)); { Write focused item }
  3322. w:=Range;S.Write(w, SizeOf(w)); { Write listview range }
  3323. END;
  3324. {--TListViewer--------------------------------------------------------------}
  3325. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 27Oct99 LdB }
  3326. {---------------------------------------------------------------------------}
  3327. PROCEDURE TListViewer.HandleEvent (Var Event: TEvent);
  3328. CONST MouseAutosToSkip = 4;
  3329. VAR Oi, Ni: Sw_Integer; Ct, Cw: Word; Mouse: TPoint;
  3330. PROCEDURE MoveFocus (Req: Sw_Integer);
  3331. BEGIN
  3332. FocusItemNum(Req); { Focus req item }
  3333. DrawView; { Redraw focus box }
  3334. END;
  3335. BEGIN
  3336. Inherited HandleEvent(Event); { Call ancestor }
  3337. Case Event.What Of
  3338. evNothing: Exit; { Speed up exit }
  3339. evKeyDown: Begin { Key down event }
  3340. If (Event.CharCode = ' ') AND (Focused < Range){ Spacebar select }
  3341. Then Begin
  3342. SelectItem(Focused); { Select focused item }
  3343. Ni := Focused; { Hold new item }
  3344. End Else Case CtrlToArrow(Event.KeyCode) Of
  3345. kbUp: Ni := Focused - 1; { One item up }
  3346. kbDown: Ni := Focused + 1; { One item down }
  3347. kbRight: If (NumCols > 1) Then
  3348. Ni := Focused + Size.Y Else Exit; { One column right }
  3349. kbLeft: If (NumCols > 1) Then
  3350. Ni := Focused - Size.Y Else Exit; { One column left }
  3351. kbPgDn: Ni := Focused + Size.Y * NumCols; { One page down }
  3352. kbPgUp: Ni := Focused - Size.Y * NumCols; { One page up }
  3353. kbHome: Ni := TopItem; { Move to top }
  3354. kbEnd: Ni := TopItem + (Size.Y*NumCols)-1; { Move to bottom }
  3355. kbCtrlPgDn: Ni := Range - 1; { Move to last item }
  3356. kbCtrlPgUp: Ni := 0; { Move to first item }
  3357. Else Exit;
  3358. End;
  3359. MoveFocus(Ni); { Move the focus }
  3360. ClearEvent(Event); { Event was handled }
  3361. End;
  3362. evBroadcast: Begin { Broadcast event }
  3363. If (Options AND ofSelectable <> 0) Then { View is selectable }
  3364. If (Event.Command = cmScrollBarClicked) AND { Scrollbar click }
  3365. ((Event.InfoPtr = HScrollBar) OR
  3366. (Event.InfoPtr = VScrollBar)) Then Select { Scrollbar selects us }
  3367. Else If (Event.Command = cmScrollBarChanged) { Scrollbar changed }
  3368. Then Begin
  3369. If (VScrollBar = Event.InfoPtr) Then Begin
  3370. MoveFocus(VScrollBar^.Value); { Focus us to item }
  3371. End Else If (HScrollBar = Event.InfoPtr)
  3372. Then DrawView; { Redraw the view }
  3373. End;
  3374. End;
  3375. evMouseDown: Begin { Mouse down event }
  3376. Cw := Size.X DIV NumCols + 1; { Column width }
  3377. Oi := Focused; { Hold focused item }
  3378. MakeLocal(Event.Where, Mouse); { Localize mouse }
  3379. If MouseInView(Event.Where) Then Ni := Mouse.Y
  3380. + (Size.Y*(Mouse.X DIV Cw))+TopItem { Calc item to focus }
  3381. Else Ni := Oi; { Focus old item }
  3382. Ct := 0; { Clear count value }
  3383. Repeat
  3384. If (Ni <> Oi) Then Begin { Item is different }
  3385. MoveFocus(Ni); { Move the focus }
  3386. Oi := Focused; { Hold as focused item }
  3387. End;
  3388. MakeLocal(Event.Where, Mouse); { Localize mouse }
  3389. If NOT MouseInView(Event.Where) Then Begin
  3390. If (Event.What = evMouseAuto) Then Inc(Ct);{ Inc auto count }
  3391. If (Ct = MouseAutosToSkip) Then Begin
  3392. Ct := 0; { Reset count }
  3393. If (NumCols = 1) Then Begin { Only one column }
  3394. If (Mouse.Y < 0) Then Ni := Focused-1; { Move up one item }
  3395. If (Mouse.Y >= Size.Y) Then
  3396. Ni := Focused+1; { Move down one item }
  3397. End Else Begin { Multiple columns }
  3398. If (Mouse.X < 0) Then { Mouse x below zero }
  3399. Ni := Focused-Size.Y; { Move down 1 column }
  3400. If (Mouse.X >= Size.X) Then { Mouse x above width }
  3401. Ni := Focused+Size.Y; { Move up 1 column }
  3402. If (Mouse.Y < 0) Then { Mouse y below zero }
  3403. Ni := Focused-Focused MOD Size.Y; { Move up one item }
  3404. If (Mouse.Y > Size.Y) Then { Mouse y above height }
  3405. Ni := Focused-Focused MOD
  3406. Size.Y+Size.Y-1; { Move down one item }
  3407. End;
  3408. End;
  3409. End Else Ni := Mouse.Y + (Size.Y*(Mouse.X
  3410. DIV Cw))+TopItem; { New item to focus }
  3411. Until NOT MouseEvent(Event, evMouseMove +
  3412. evMouseAuto); { Mouse stopped }
  3413. If (Oi <> Ni) Then MoveFocus(Ni); { Focus moved again }
  3414. If (Event.Double AND (Range > Focused)) Then
  3415. SelectItem(Focused); { Select the item }
  3416. ClearEvent(Event); { Event was handled }
  3417. End;
  3418. End;
  3419. END;
  3420. {--TListViewer--------------------------------------------------------------}
  3421. { ChangeBounds -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  3422. {---------------------------------------------------------------------------}
  3423. PROCEDURE TListViewer.ChangeBounds (Var Bounds: TRect);
  3424. BEGIN
  3425. Inherited ChangeBounds(Bounds); { Call ancestor }
  3426. If (HScrollBar <> Nil) Then { Valid horz scrollbar }
  3427. HScrollBar^.SetStep(Size.X DIV NumCols,
  3428. HScrollBar^.ArStep); { Update horz bar }
  3429. If (VScrollBar <> Nil) Then { Valid vert scrollbar }
  3430. VScrollBar^.SetStep(Size.Y * NumCols,
  3431. VScrollBar^.ArStep); { Update vert bar }
  3432. END;
  3433. {***************************************************************************}
  3434. { TListViewer OBJECT PRIVATE METHODS }
  3435. {***************************************************************************}
  3436. {--TListViewer--------------------------------------------------------------}
  3437. { FocusItemNum -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 26Jul99 LdB }
  3438. {---------------------------------------------------------------------------}
  3439. PROCEDURE TListViewer.FocusItemNum (Item: Sw_Integer);
  3440. BEGIN
  3441. If (Item < 0) Then Item := 0 Else { Restrain underflow }
  3442. If (Item >= Range) AND (Range > 0) Then
  3443. Item := Range-1; { Restrain overflow }
  3444. If (Range <> 0) Then FocusItem(Item); { Set focus value }
  3445. END;
  3446. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  3447. { TWindow OBJECT METHODS }
  3448. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  3449. {--TWindow------------------------------------------------------------------}
  3450. { Init -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  3451. {---------------------------------------------------------------------------}
  3452. CONSTRUCTOR TWindow.Init (Var Bounds: TRect; ATitle: TTitleStr; ANumber: Sw_Integer);
  3453. BEGIN
  3454. Inherited Init(Bounds); { Call ancestor }
  3455. State := State OR sfShadow; { View is shadowed }
  3456. Options := Options OR (ofSelectable+ofTopSelect); { Select options set }
  3457. GrowMode := gfGrowAll + gfGrowRel; { Set growmodes }
  3458. Flags := wfMove + wfGrow + wfClose + wfZoom; { Set flags }
  3459. Title := NewStr(ATitle); { Hold title }
  3460. Number := ANumber; { Hold number }
  3461. Palette := wpBlueWindow; { Default palette }
  3462. InitFrame; { Initialize frame }
  3463. If (Frame <> Nil) Then Insert(Frame); { Insert any frame }
  3464. GetBounds(ZoomRect); { Default zoom rect }
  3465. END;
  3466. {--TWindow------------------------------------------------------------------}
  3467. { Load -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  3468. {---------------------------------------------------------------------------}
  3469. { This load method will read old original TV data from a stream however }
  3470. { although a frame view is read for compatability it is disposed of. }
  3471. {---------------------------------------------------------------------------}
  3472. CONSTRUCTOR TWindow.Load (Var S: TStream);
  3473. VAR I: Integer;
  3474. BEGIN
  3475. Inherited Load(S); { Call ancestor }
  3476. S.Read(Flags, SizeOf(Flags)); { Read window flags }
  3477. S.Read(i, SizeOf(i)); Number:=i; { Read window number }
  3478. S.Read(i, SizeOf(i)); Palette:=i; { Read window palette }
  3479. S.Read(i, SizeOf(i)); ZoomRect.A.X:=i; { Read zoom area x1 }
  3480. S.Read(i, SizeOf(i)); ZoomRect.A.Y:=i; { Read zoom area y1 }
  3481. S.Read(i, SizeOf(i)); ZoomRect.B.X:=i; { Read zoom area x2 }
  3482. S.Read(i, SizeOf(i)); ZoomRect.B.Y:=i; { Read zoom area y2 }
  3483. GetSubViewPtr(S, Frame); { Now read frame object }
  3484. Title := S.ReadStr; { Read title }
  3485. END;
  3486. {--TWindow------------------------------------------------------------------}
  3487. { Done -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3488. {---------------------------------------------------------------------------}
  3489. DESTRUCTOR TWindow.Done;
  3490. BEGIN
  3491. Inherited Done; { Call ancestor }
  3492. If (Title <> Nil) Then DisposeStr(Title); { Dispose title }
  3493. END;
  3494. {--TWindow------------------------------------------------------------------}
  3495. { GetPalette -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3496. {---------------------------------------------------------------------------}
  3497. FUNCTION TWindow.GetPalette: PPalette;
  3498. CONST P: ARRAY [wpBlueWindow..wpGrayWindow] Of String[Length(CBlueWindow)] =
  3499. (CBlueWindow, CCyanWindow, CGrayWindow); { Always normal string }
  3500. BEGIN
  3501. GetPalette := PPalette(@P[Palette]); { Return palette }
  3502. END;
  3503. {--TWindow------------------------------------------------------------------}
  3504. { GetTitle -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3505. { Modified 31may2002 PM (No number included anymore) }
  3506. {---------------------------------------------------------------------------}
  3507. FUNCTION TWindow.GetTitle (MaxSize: Sw_Integer): TTitleStr;
  3508. VAR S: String;
  3509. BEGIN
  3510. If (Title <> Nil) Then S:=Title^
  3511. Else S := '';
  3512. if Length(S)>MaxSize then
  3513. GetTitle:=Copy(S,1,MaxSize)
  3514. else
  3515. GetTitle:=S;
  3516. END;
  3517. {--TWindow------------------------------------------------------------------}
  3518. { StandardScrollBar -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  3519. {---------------------------------------------------------------------------}
  3520. FUNCTION TWindow.StandardScrollBar (AOptions: Word): PScrollBar;
  3521. VAR R: TRect; S: PScrollBar;
  3522. BEGIN
  3523. GetExtent(R); { View extents }
  3524. If (AOptions AND sbVertical = 0) Then
  3525. R.Assign(R.A.X+2, R.B.Y-1, R.B.X-2, R.B.Y) { Horizontal scrollbar }
  3526. Else R.Assign(R.B.X-1, R.A.Y+1, R.B.X, R.B.Y-1); { Vertical scrollbar }
  3527. S := New(PScrollBar, Init(R)); { Create scrollbar }
  3528. Insert(S); { Insert scrollbar }
  3529. If (AOptions AND sbHandleKeyboard <> 0) Then
  3530. S^.Options := S^.Options or ofPostProcess; { Post process }
  3531. StandardScrollBar := S; { Return scrollbar }
  3532. END;
  3533. {--TWindow------------------------------------------------------------------}
  3534. { Zoom -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep97 LdB }
  3535. {---------------------------------------------------------------------------}
  3536. PROCEDURE TWindow.Zoom;
  3537. VAR R: TRect; Max, Min: TPoint;
  3538. BEGIN
  3539. SizeLimits(Min, Max); { Return size limits }
  3540. If ((Size.X <> Max.X) OR (Size.Y <> Max.Y)) { Larger size possible }
  3541. Then Begin
  3542. GetBounds(ZoomRect); { Get zoom bounds }
  3543. R.A.X := 0; { Zero x origin }
  3544. R.A.Y := 0; { Zero y origin }
  3545. R.B := Max; { Bounds to max size }
  3546. Locate(R); { Locate the view }
  3547. End Else Locate(ZoomRect); { Move to zoom rect }
  3548. END;
  3549. {--TWindow------------------------------------------------------------------}
  3550. { Close -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 23Sep97 LdB }
  3551. {---------------------------------------------------------------------------}
  3552. PROCEDURE TWindow.Close;
  3553. BEGIN
  3554. If Valid(cmClose) Then Free; { Dispose of self }
  3555. END;
  3556. {--TWindow------------------------------------------------------------------}
  3557. { InitFrame -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Jul99 LdB }
  3558. {---------------------------------------------------------------------------}
  3559. PROCEDURE TWindow.InitFrame;
  3560. VAR
  3561. R: TRect;
  3562. BEGIN
  3563. GetExtent(R);
  3564. Frame := New(PFrame, Init(R));
  3565. END;
  3566. {--TWindow------------------------------------------------------------------}
  3567. { SetState -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Mar98 LdB }
  3568. {---------------------------------------------------------------------------}
  3569. PROCEDURE TWindow.SetState (AState: Word; Enable: Boolean);
  3570. VAR WindowCommands: TCommandSet;
  3571. BEGIN
  3572. Inherited SetState(AState, Enable); { Call ancestor }
  3573. If (AState = sfSelected) Then
  3574. SetState(sfActive, Enable); { Set active state }
  3575. If (AState = sfSelected) OR ((AState = sfExposed)
  3576. AND (State AND sfSelected <> 0)) Then Begin { View is selected }
  3577. WindowCommands := [cmNext, cmPrev]; { Set window commands }
  3578. If (Flags AND (wfGrow + wfMove) <> 0) Then
  3579. WindowCommands := WindowCommands + [cmResize]; { Add resize command }
  3580. If (Flags AND wfClose <> 0) Then
  3581. WindowCommands := WindowCommands + [cmClose]; { Add close command }
  3582. If (Flags AND wfZoom <> 0) Then
  3583. WindowCommands := WindowCommands + [cmZoom]; { Add zoom command }
  3584. If Enable Then EnableCommands(WindowCommands) { Enable commands }
  3585. Else DisableCommands(WindowCommands); { Disable commands }
  3586. End;
  3587. END;
  3588. {--TWindow------------------------------------------------------------------}
  3589. { Store -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 30Mar98 LdB }
  3590. {---------------------------------------------------------------------------}
  3591. { You can save data to the stream compatable with the old original TV by }
  3592. { temporarily turning off the ofGrafVersion making the call to this store }
  3593. { routine and resetting the ofGrafVersion flag after the call. }
  3594. {---------------------------------------------------------------------------}
  3595. PROCEDURE TWindow.Store (Var S: TStream);
  3596. VAR i: Integer;
  3597. BEGIN
  3598. TGroup.Store(S); { Call group store }
  3599. S.Write(Flags, SizeOf(Flags)); { Write window flags }
  3600. i:=Number;S.Write(i, SizeOf(i)); { Write window number }
  3601. i:=Palette;S.Write(i, SizeOf(i)); { Write window palette }
  3602. i:=ZoomRect.A.X;S.Write(i, SizeOf(i)); { Write zoom area x1 }
  3603. i:=ZoomRect.A.Y;S.Write(i, SizeOf(i)); { Write zoom area y1 }
  3604. i:=ZoomRect.B.X;S.Write(i, SizeOf(i)); { Write zoom area x2 }
  3605. i:=ZoomRect.B.Y;S.Write(i, SizeOf(i)); { Write zoom area y2 }
  3606. PutSubViewPtr(S, Frame); { Write any frame }
  3607. S.WriteStr(Title); { Write title string }
  3608. END;
  3609. {--TWindow------------------------------------------------------------------}
  3610. { HandleEvent -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 11Aug99 LdB }
  3611. {---------------------------------------------------------------------------}
  3612. PROCEDURE TWindow.HandleEvent (Var Event: TEvent);
  3613. VAR
  3614. Min, Max: TPoint; Limits: TRect;
  3615. PROCEDURE DragWindow (Mode: Byte);
  3616. VAR Limits: TRect; Min, Max: TPoint;
  3617. BEGIN
  3618. Owner^.GetExtent(Limits); { Get owner extents }
  3619. SizeLimits(Min, Max); { Restrict size }
  3620. DragView(Event, DragMode OR Mode, Limits, Min,
  3621. Max); { Drag the view }
  3622. ClearEvent(Event); { Clear the event }
  3623. END;
  3624. BEGIN
  3625. Inherited HandleEvent(Event); { Call ancestor }
  3626. Case Event.What Of
  3627. evNothing: Exit; { Speeds up exit }
  3628. evCommand: { COMMAND EVENT }
  3629. Case Event.Command Of { Command type case }
  3630. cmResize: { RESIZE COMMAND }
  3631. If (Flags AND (wfMove + wfGrow) <> 0) { Window can resize }
  3632. AND (Owner <> Nil) Then Begin { Valid owner }
  3633. Owner^.GetExtent(Limits); { Owners extents }
  3634. SizeLimits(Min, Max); { Check size limits }
  3635. DragView(Event, DragMode OR (Flags AND
  3636. (wfMove + wfGrow)), Limits, Min, Max); { Drag the view }
  3637. ClearEvent(Event); { Clear the event }
  3638. End;
  3639. cmClose: { CLOSE COMMAND }
  3640. If (Flags AND wfClose <> 0) AND { Close flag set }
  3641. ((Event.InfoPtr = Nil) OR { None specific close }
  3642. (Event.InfoPtr = @Self)) Then Begin { Close to us }
  3643. ClearEvent(Event); { Clear the event }
  3644. If (State AND sfModal = 0) Then Close { Non modal so close }
  3645. Else Begin { Modal window }
  3646. Event.What := evCommand; { Command event }
  3647. Event.Command := cmCancel; { Cancel command }
  3648. PutEvent(Event); { Place on queue }
  3649. ClearEvent(Event); { Clear the event }
  3650. End;
  3651. End;
  3652. cmZoom: { ZOOM COMMAND }
  3653. If (Flags AND wfZoom <> 0) AND { Zoom flag set }
  3654. ((Event.InfoPtr = Nil) OR { No specific zoom }
  3655. (Event.InfoPtr = @Self)) Then Begin
  3656. Zoom; { Zoom our window }
  3657. ClearEvent(Event); { Clear the event }
  3658. End;
  3659. End;
  3660. evBroadcast: { BROADCAST EVENT }
  3661. If (Event.Command = cmSelectWindowNum) AND
  3662. (Event.InfoInt = Number) AND { Select our number }
  3663. (Options AND ofSelectable <> 0) Then Begin { Is view selectable }
  3664. Select; { Select our view }
  3665. ClearEvent(Event); { Clear the event }
  3666. End;
  3667. evKeyDown: Begin { KEYDOWN EVENT }
  3668. Case Event.KeyCode Of
  3669. kbTab: Begin { TAB KEY }
  3670. FocusNext(False); { Select next view }
  3671. ClearEvent(Event); { Clear the event }
  3672. End;
  3673. kbShiftTab: Begin { SHIFT TAB KEY }
  3674. FocusNext(True); { Select prior view }
  3675. ClearEvent(Event); { Clear the event }
  3676. End;
  3677. End;
  3678. End;
  3679. End; { Event.What case end }
  3680. END;
  3681. {--TWindow------------------------------------------------------------------}
  3682. { SizeLimits -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 15Sep97 LdB }
  3683. {---------------------------------------------------------------------------}
  3684. PROCEDURE TWindow.SizeLimits (Var Min, Max: TPoint);
  3685. BEGIN
  3686. Inherited SizeLimits(Min, Max); { View size limits }
  3687. Min.X := MinWinSize.X; { Set min x size }
  3688. Min.Y := MinWinSize.Y; { Set min y size }
  3689. END;
  3690. {--TView--------------------------------------------------------------------}
  3691. { Exposed -> Platforms DOS/DPMI/WIN/OS2 - Checked 17Sep97 LdB }
  3692. {---------------------------------------------------------------------------}
  3693. function TView.do_ExposedRec1(x1,x2:sw_integer; p:PView):boolean;
  3694. var
  3695. G : PGroup;
  3696. dy,dx : sw_integer;
  3697. begin
  3698. while true do
  3699. begin
  3700. p:=p^.Next;
  3701. G:=p^.Owner;
  3702. if p=staticVar2.target then
  3703. begin
  3704. do_exposedRec1:=do_exposedRec2(x1,x2,G);
  3705. Exit;
  3706. end;
  3707. dy:=p^.origin.y;
  3708. dx:=p^.origin.x;
  3709. if ((p^.state and sfVisible)<>0) and (staticVar2.y>=dy) then
  3710. begin
  3711. if staticVar2.y<dy+p^.size.y then
  3712. begin
  3713. if x1<dx then
  3714. begin
  3715. if x2<=dx then
  3716. continue;
  3717. if x2>dx+p^.size.x then
  3718. begin
  3719. if do_exposedRec1(x1,dx,p) then
  3720. begin
  3721. do_exposedRec1:=True;
  3722. Exit;
  3723. end;
  3724. x1:=dx+p^.size.x;
  3725. end
  3726. else
  3727. x2:=dx;
  3728. end
  3729. else
  3730. begin
  3731. if x1<dx+p^.size.x then
  3732. x1:=dx+p^.size.x;
  3733. if x1>=x2 then
  3734. begin
  3735. do_exposedRec1:=False;
  3736. Exit;
  3737. end;
  3738. end;
  3739. end;
  3740. end;
  3741. end;
  3742. end;
  3743. function TView.do_ExposedRec2(x1,x2:Sw_integer; p:PView):boolean;
  3744. var
  3745. G : PGroup;
  3746. savedStat : TStatVar2;
  3747. begin
  3748. if (p^.state and sfVisible)=0 then
  3749. do_ExposedRec2:=false
  3750. else
  3751. begin
  3752. G:=p^.Owner;
  3753. if (G=Nil) or (G^.Buffer<>Nil) then
  3754. do_ExposedRec2:=true
  3755. else
  3756. begin
  3757. savedStat:=staticVar2;
  3758. inc(staticVar2.y,p^.origin.y);
  3759. inc(x1,p^.origin.x);
  3760. inc(x2,p^.origin.x);
  3761. staticVar2.target:=p;
  3762. if (staticVar2.y<G^.clip.a.y) or (staticVar2.y>=G^.clip.b.y) then
  3763. do_ExposedRec2:=false
  3764. else
  3765. begin
  3766. if (x1<G^.clip.a.x) then
  3767. x1:=G^.clip.a.x;
  3768. if (x2>G^.clip.b.x) then
  3769. x2:=G^.clip.b.x;
  3770. if (x1>=x2) then
  3771. do_ExposedRec2:=false
  3772. else
  3773. do_ExposedRec2:=do_exposedRec1(x1,x2,G^.Last);
  3774. end;
  3775. staticVar2 := savedStat;
  3776. end;
  3777. end;
  3778. end;
  3779. function TView.Exposed: Boolean;
  3780. var
  3781. OK : boolean;
  3782. y : sw_integer;
  3783. begin
  3784. if ((State and sfExposed)<>0) and (Size.X>0) and (Size.Y>0) then
  3785. begin
  3786. OK:=false;
  3787. y:=0;
  3788. while (y<Size.Y) and (not OK) do
  3789. begin
  3790. staticVar2.y:=y;
  3791. OK:=do_ExposedRec2(0,Size.X,@Self);
  3792. inc(y);
  3793. end;
  3794. Exposed:=OK;
  3795. end
  3796. else
  3797. Exposed:=False
  3798. end;
  3799. {--TView--------------------------------------------------------------------}
  3800. { MakeLocal -> Platforms DOS/DPMI/WIN/OS2 - Checked 12Sep97 LdB }
  3801. {---------------------------------------------------------------------------}
  3802. PROCEDURE TView.MakeLocal (Source: TPoint; Var Dest: TPoint);
  3803. var
  3804. cur : PView;
  3805. begin
  3806. cur:=@Self;
  3807. Dest:=Source;
  3808. repeat
  3809. dec(Dest.X,cur^.Origin.X);
  3810. if dest.x<0 then
  3811. break;
  3812. dec(Dest.Y,cur^.Origin.Y);
  3813. if dest.y<0 then
  3814. break;
  3815. cur:=cur^.Owner;
  3816. until cur=nil;
  3817. end;
  3818. {--TView--------------------------------------------------------------------}
  3819. { MakeGlobal -> Platforms DOS/DPMI/WIN/OS2 - Checked 12Sep97 LdB }
  3820. {---------------------------------------------------------------------------}
  3821. PROCEDURE TView.MakeGlobal (Source: TPoint; Var Dest: TPoint);
  3822. var
  3823. cur : PView;
  3824. begin
  3825. cur:=@Self;
  3826. Dest:=Source;
  3827. repeat
  3828. inc(Dest.X,cur^.Origin.X);
  3829. inc(Dest.Y,cur^.Origin.Y);
  3830. cur:=cur^.Owner;
  3831. until cur=nil;
  3832. end;
  3833. procedure TView.do_writeViewRec1(x1,x2:Sw_integer; p:PView; shadowCounter:Sw_integer);
  3834. var
  3835. G : PGroup;
  3836. c : Word;
  3837. BufPos,
  3838. SrcPos,
  3839. l,dx : Sw_integer;
  3840. begin
  3841. repeat
  3842. p:=p^.Next;
  3843. if (p=staticVar2.target) then
  3844. begin
  3845. G:=p^.Owner;
  3846. if (G^.buffer<>Nil) then
  3847. begin
  3848. BufPos:=G^.size.x * staticVar2.y + x1;
  3849. SrcPos:=x1 - staticVar2.offset;
  3850. l:=x2-x1;
  3851. if (shadowCounter=0) then
  3852. move(staticVar1^[SrcPos],PVideoBuf(G^.buffer)^[BufPos],l shl 1)
  3853. else
  3854. begin { paint with shadowAttr }
  3855. while (l>0) do
  3856. begin
  3857. c:=staticVar1^[SrcPos];
  3858. WordRec(c).hi:=shadowAttr;
  3859. PVideoBuf(G^.buffer)^[BufPos]:=c;
  3860. inc(BufPos);
  3861. inc(SrcPos);
  3862. dec(l);
  3863. end;
  3864. end;
  3865. end;
  3866. if G^.lockFlag=0 then
  3867. do_writeViewRec2(x1,x2,G,shadowCounter);
  3868. exit;
  3869. end; { p=staticVar2.target }
  3870. if ((p^.state and sfVisible)<>0) and (staticVar2.y>=p^.Origin.Y) then
  3871. begin
  3872. if staticVar2.y<p^.Origin.Y+p^.size.Y then
  3873. begin
  3874. if x1<p^.origin.x then
  3875. begin
  3876. if x2<=p^.origin.x then
  3877. continue;
  3878. do_writeViewRec1(x1,p^.origin.x,p,shadowCounter);
  3879. x1:=p^.origin.x;
  3880. end;
  3881. dx:=p^.origin.x+p^.size.x;
  3882. if (x2<=dx) then
  3883. exit;
  3884. if (x1<dx) then
  3885. x1:=dx;
  3886. inc(dx,shadowSize.x);
  3887. if ((p^.state and sfShadow)<>0) and (staticVar2.y>=p^.origin.y+shadowSize.y) then
  3888. if (x1>dx) then
  3889. continue
  3890. else
  3891. begin
  3892. inc(shadowCounter);
  3893. if (x2<=dx) then
  3894. continue
  3895. else
  3896. begin
  3897. do_writeViewRec1(x1,dx,p,shadowCounter);
  3898. x1:=dx;
  3899. dec(shadowCounter);
  3900. continue;
  3901. end;
  3902. end
  3903. else
  3904. continue;
  3905. end;
  3906. if ((p^.state and sfShadow)<>0) and (staticVar2.y<p^.origin.y+p^.size.y+shadowSize.y) then
  3907. begin
  3908. dx:=p^.origin.x+shadowSize.x;
  3909. if x1<dx then
  3910. begin
  3911. if x2<=dx then
  3912. continue;
  3913. do_writeViewRec1(x1,dx,p,shadowCounter);
  3914. x1:=dx;
  3915. end;
  3916. inc(dx,p^.size.x);
  3917. if x1>=dx then
  3918. continue;
  3919. inc(shadowCounter);
  3920. if x2<=dx then
  3921. continue
  3922. else
  3923. begin
  3924. do_writeViewRec1(x1,dx,p,shadowCounter);
  3925. x1:=dx;
  3926. dec(shadowCounter);
  3927. end;
  3928. end;
  3929. end;
  3930. until false;
  3931. end;
  3932. procedure TView.do_writeViewRec2(x1,x2:Sw_integer; p:PView; shadowCounter:Sw_integer);
  3933. var
  3934. savedStatics : TstatVar2;
  3935. dx : Sw_integer;
  3936. G : PGroup;
  3937. begin
  3938. G:=P^.Owner;
  3939. if ((p^.State and sfVisible) <> 0) and (G<>Nil) then
  3940. begin
  3941. savedStatics:=staticVar2;
  3942. inc(staticVar2.y,p^.Origin.Y);
  3943. dx:=p^.Origin.X;
  3944. inc(x1,dx);
  3945. inc(x2,dx);
  3946. inc(staticVar2.offset,dx);
  3947. staticVar2.target:=p;
  3948. if (staticVar2.y >= G^.clip.a.y) and (staticVar2.y < G^.clip.b.y) then
  3949. begin
  3950. if (x1<g^.clip.a.x) then
  3951. x1 := g^.clip.a.x;
  3952. if (x2>g^.clip.b.x) then
  3953. x2 := g^.clip.b.x;
  3954. if x1<x2 then
  3955. do_writeViewRec1(x1,x2,G^.Last,shadowCounter);
  3956. end;
  3957. staticVar2 := savedStatics;
  3958. end;
  3959. end;
  3960. procedure TView.do_WriteView(x1,x2,y:Sw_integer; var Buf);
  3961. begin
  3962. if (y>=0) and (y<Size.Y) then
  3963. begin
  3964. if x1<0 then
  3965. x1:=0;
  3966. if x2>Size.X then
  3967. x2:=Size.X;
  3968. if x1<x2 then
  3969. begin
  3970. staticVar2.offset:=x1;
  3971. staticVar2.y:=y;
  3972. staticVar1:=@Buf;
  3973. do_writeViewRec2( x1, x2, @Self, 0 );
  3974. end;
  3975. end;
  3976. end;
  3977. procedure TView.WriteBuf(X, Y, W, H: Sw_Integer; var Buf);
  3978. var
  3979. i : Sw_integer;
  3980. begin
  3981. if h>0 then
  3982. for i:= 0 to h-1 do
  3983. do_writeView(X,X+W,Y+i,TVideoBuf(Buf)[W*i]);
  3984. end;
  3985. procedure TView.WriteChar(X,Y:Sw_Integer; C:Char; Color:Byte; Count:Sw_Integer);
  3986. var
  3987. B : TDrawBuffer;
  3988. myChar : word;
  3989. i : Sw_integer;
  3990. begin
  3991. myChar:=MapColor(Color);
  3992. myChar:=(myChar shl 8) + ord(C);
  3993. if Count>0 then
  3994. begin
  3995. if Count>maxViewWidth then
  3996. Count:=maxViewWidth;
  3997. for i:=0 to Count-1 do
  3998. B[i]:=myChar;
  3999. do_writeView(X,X+Count,Y,B);
  4000. end;
  4001. DrawScreenBuf(false);
  4002. end;
  4003. procedure TView.WriteLine(X, Y, W, H: Sw_Integer; var Buf);
  4004. var
  4005. i:Sw_integer;
  4006. begin
  4007. if h>0 then
  4008. for i:=0 to h-1 do
  4009. do_writeView(x,x+w,y+i,buf);
  4010. DrawScreenBuf(false);
  4011. end;
  4012. procedure TView.WriteStr(X, Y: Sw_Integer; Str: String; Color: Byte);
  4013. var
  4014. l,i : Sw_word;
  4015. B : TDrawBuffer;
  4016. myColor : word;
  4017. begin
  4018. l:=length(Str);
  4019. if l>0 then
  4020. begin
  4021. if l>maxViewWidth then
  4022. l:=maxViewWidth;
  4023. MyColor:=MapColor(Color);
  4024. MyColor:=MyColor shl 8;
  4025. for i:=0 to l-1 do
  4026. B[i]:=MyColor+ord(Str[i+1]);
  4027. do_writeView(x,x+l,y,b);
  4028. end;
  4029. DrawScreenBuf(false);
  4030. end;
  4031. procedure TView.DragView(Event: TEvent; Mode: Byte;
  4032. var Limits: TRect; MinSize, MaxSize: TPoint);
  4033. var
  4034. P, S: TPoint;
  4035. SaveBounds: TRect;
  4036. procedure MoveGrow(P, S: TPoint);
  4037. var
  4038. R: TRect;
  4039. begin
  4040. S.X := Min(Max(S.X, MinSize.X), MaxSize.X);
  4041. S.Y := Min(Max(S.Y, MinSize.Y), MaxSize.Y);
  4042. P.X := Min(Max(P.X, Limits.A.X - S.X + 1), Limits.B.X - 1);
  4043. P.Y := Min(Max(P.Y, Limits.A.Y - S.Y + 1), Limits.B.Y - 1);
  4044. if Mode and dmLimitLoX <> 0 then P.X := Max(P.X, Limits.A.X);
  4045. if Mode and dmLimitLoY <> 0 then P.Y := Max(P.Y, Limits.A.Y);
  4046. if Mode and dmLimitHiX <> 0 then P.X := Min(P.X, Limits.B.X - S.X);
  4047. if Mode and dmLimitHiY <> 0 then P.Y := Min(P.Y, Limits.B.Y - S.Y);
  4048. R.Assign(P.X, P.Y, P.X + S.X, P.Y + S.Y);
  4049. Locate(R);
  4050. end;
  4051. procedure Change(DX, DY: Sw_Integer);
  4052. begin
  4053. if (Mode and dmDragMove <> 0) and (Event.KeyShift{GetShiftState} and $03 = 0) then
  4054. begin
  4055. Inc(P.X, DX);
  4056. Inc(P.Y, DY);
  4057. end else
  4058. if (Mode and dmDragGrow <> 0) and (Event.KeyShift{GetShiftState} and $03 <> 0) then
  4059. begin
  4060. Inc(S.X, DX);
  4061. Inc(S.Y, DY);
  4062. end;
  4063. end;
  4064. procedure Update(X, Y: Sw_Integer);
  4065. begin
  4066. if Mode and dmDragMove <> 0 then
  4067. begin
  4068. P.X := X;
  4069. P.Y := Y;
  4070. end;
  4071. end;
  4072. begin
  4073. SetState(sfDragging, True);
  4074. if Event.What = evMouseDown then
  4075. begin
  4076. if Mode and dmDragMove <> 0 then
  4077. begin
  4078. P.X := Origin.X - Event.Where.X;
  4079. P.Y := Origin.Y - Event.Where.Y;
  4080. repeat
  4081. Inc(Event.Where.X, P.X);
  4082. Inc(Event.Where.Y, P.Y);
  4083. MoveGrow(Event.Where, Size);
  4084. until not MouseEvent(Event, evMouseMove);
  4085. {We need to process the mouse-up event, since not all terminals
  4086. send drag events.}
  4087. Inc(Event.Where.X, P.X);
  4088. Inc(Event.Where.Y, P.Y);
  4089. MoveGrow(Event.Where, Size);
  4090. end else
  4091. begin
  4092. P.X := Size.X - Event.Where.X;
  4093. P.Y := Size.Y - Event.Where.Y;
  4094. repeat
  4095. Inc(Event.Where.X, P.X);
  4096. Inc(Event.Where.Y, P.Y);
  4097. MoveGrow(Origin, Event.Where);
  4098. until not MouseEvent(Event, evMouseMove);
  4099. {We need to process the mouse-up event, since not all terminals
  4100. send drag events.}
  4101. Inc(Event.Where.X, P.X);
  4102. Inc(Event.Where.Y, P.Y);
  4103. MoveGrow(Origin, Event.Where);
  4104. end;
  4105. end else
  4106. begin
  4107. GetBounds(SaveBounds);
  4108. repeat
  4109. P := Origin;
  4110. S := Size;
  4111. KeyEvent(Event);
  4112. case Event.KeyCode and $FF00 of
  4113. kbLeft: Change(-1, 0);
  4114. kbRight: Change(1, 0);
  4115. kbUp: Change(0, -1);
  4116. kbDown: Change(0, 1);
  4117. kbCtrlLeft: Change(-8, 0);
  4118. kbCtrlRight: Change(8, 0);
  4119. kbHome: Update(Limits.A.X, P.Y);
  4120. kbEnd: Update(Limits.B.X - S.X, P.Y);
  4121. kbPgUp: Update(P.X, Limits.A.Y);
  4122. kbPgDn: Update(P.X, Limits.B.Y - S.Y);
  4123. end;
  4124. MoveGrow(P, S);
  4125. until (Event.KeyCode = kbEnter) or (Event.KeyCode = kbEsc);
  4126. if Event.KeyCode = kbEsc then
  4127. Locate(SaveBounds);
  4128. end;
  4129. SetState(sfDragging, False);
  4130. end;
  4131. {***************************************************************************}
  4132. { TScroller OBJECT METHODS }
  4133. {***************************************************************************}
  4134. PROCEDURE TScroller.ScrollDraw;
  4135. VAR D: TPoint;
  4136. BEGIN
  4137. If (HScrollBar<>Nil) Then D.X := HScrollBar^.Value
  4138. Else D.X := 0; { Horz scroll value }
  4139. If (VScrollBar<>Nil) Then D.Y := VScrollBar^.Value
  4140. Else D.Y := 0; { Vert scroll value }
  4141. If (D.X<>Delta.X) OR (D.Y<>Delta.Y) Then Begin { View has moved }
  4142. SetCursor(Cursor.X+Delta.X-D.X,
  4143. Cursor.Y+Delta.Y-D.Y); { Move the cursor }
  4144. Delta := D; { Set new delta }
  4145. If (DrawLock<>0) Then DrawFlag := True { Draw will need draw }
  4146. Else DrawView; { Redraw the view }
  4147. End;
  4148. END;
  4149. PROCEDURE TScroller.SetLimit (X, Y: Sw_Integer);
  4150. VAR PState: Word;
  4151. BEGIN
  4152. Limit.X := X; { Hold x limit }
  4153. Limit.Y := Y; { Hold y limit }
  4154. Inc(DrawLock); { Set draw lock }
  4155. If (HScrollBar<>Nil) Then Begin
  4156. PState := HScrollBar^.State; { Hold bar state }
  4157. HScrollBar^.State := PState AND NOT sfVisible; { Temp not visible }
  4158. HScrollBar^.SetParams(HScrollBar^.Value, 0,
  4159. X-Size.X, Size.X-1, HScrollBar^.ArStep); { Set horz scrollbar }
  4160. HScrollBar^.State := PState; { Restore bar state }
  4161. End;
  4162. If (VScrollBar<>Nil) Then Begin
  4163. PState := VScrollBar^.State; { Hold bar state }
  4164. VScrollBar^.State := PState AND NOT sfVisible; { Temp not visible }
  4165. VScrollBar^.SetParams(VScrollBar^.Value, 0,
  4166. Y-Size.Y, Size.Y-1, VScrollBar^.ArStep); { Set vert scrollbar }
  4167. VScrollBar^.State := PState; { Restore bar state }
  4168. End;
  4169. Dec(DrawLock); { Release draw lock }
  4170. CheckDraw; { Check need to draw }
  4171. END;
  4172. {***************************************************************************}
  4173. { TScroller OBJECT PRIVATE METHODS }
  4174. {***************************************************************************}
  4175. PROCEDURE TScroller.CheckDraw;
  4176. BEGIN
  4177. If (DrawLock = 0) AND DrawFlag Then Begin { Clear & draw needed }
  4178. DrawFlag := False; { Clear draw flag }
  4179. DrawView; { Draw now }
  4180. End;
  4181. END;
  4182. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4183. { TGroup OBJECT METHODS }
  4184. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4185. {--TGroup-------------------------------------------------------------------}
  4186. { Lock -> Platforms DOS/DPMI/WIN/OS2 - Checked 23Sep97 LdB }
  4187. {---------------------------------------------------------------------------}
  4188. {$ifndef NoLock}
  4189. {$define UseLock}
  4190. {$endif ndef NoLock}
  4191. PROCEDURE TGroup.Lock;
  4192. BEGIN
  4193. {$ifdef UseLock}
  4194. {If (Buffer <> Nil) OR (LockFlag <> 0)
  4195. Then} Inc(LockFlag); { Increment count }
  4196. {$endif UseLock}
  4197. END;
  4198. {--TGroup-------------------------------------------------------------------}
  4199. { UnLock -> Platforms DOS/DPMI/WIN/OS2 - Checked 23Sep97 LdB }
  4200. {---------------------------------------------------------------------------}
  4201. PROCEDURE TGroup.Unlock;
  4202. BEGIN
  4203. {$ifdef UseLock}
  4204. If (LockFlag <> 0) Then Begin
  4205. Dec(LockFlag); { Decrement count }
  4206. If (LockFlag = 0) Then DrawView; { Lock release draw }
  4207. End;
  4208. {$endif UseLock}
  4209. END;
  4210. {***************************************************************************}
  4211. { INTERFACE ROUTINES }
  4212. {***************************************************************************}
  4213. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4214. { WINDOW MESSAGE ROUTINES }
  4215. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4216. {---------------------------------------------------------------------------}
  4217. { Message -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 12Sep97 LdB }
  4218. {---------------------------------------------------------------------------}
  4219. FUNCTION Message (Receiver: PView; What, Command: Word;
  4220. InfoPtr: Pointer): Pointer;
  4221. VAR Event: TEvent;
  4222. BEGIN
  4223. Message := Nil; { Preset nil }
  4224. If (Receiver <> Nil) Then Begin { Valid receiver }
  4225. Event.What := What; { Set what }
  4226. Event.Command := Command; { Set command }
  4227. Event.Id := 0; { Zero id field }
  4228. Event.Data := 0; { Zero data field }
  4229. Event.InfoPtr := InfoPtr; { Set info ptr }
  4230. Receiver^.HandleEvent(Event); { Pass to handler }
  4231. If (Event.What = evNothing) Then
  4232. Message := Event.InfoPtr; { Return handler }
  4233. End;
  4234. END;
  4235. {---------------------------------------------------------------------------}
  4236. { NewMessage -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 19Sep97 LdB }
  4237. {---------------------------------------------------------------------------}
  4238. FUNCTION NewMessage (P: PView; What, Command: Word; Id: Sw_Integer;
  4239. Data: Real; InfoPtr: Pointer): Pointer;
  4240. VAR Event: TEvent;
  4241. BEGIN
  4242. NewMessage := Nil; { Preset failure }
  4243. If (P <> Nil) Then Begin
  4244. Event.What := What; { Set what }
  4245. Event.Command := Command; { Set event command }
  4246. Event.Id := Id; { Set up Id }
  4247. Event.Data := Data; { Set up data }
  4248. Event.InfoPtr := InfoPtr; { Set up event ptr }
  4249. P^.HandleEvent(Event); { Send to view }
  4250. If (Event.What = evNothing) Then
  4251. NewMessage := Event.InfoPtr; { Return handler }
  4252. End;
  4253. END;
  4254. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4255. { NEW VIEW ROUTINES }
  4256. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4257. {---------------------------------------------------------------------------}
  4258. { CreateIdScrollBar -> Platforms DOS/DPMI/WIN/NT/OS2 - Checked 22May97 LdB }
  4259. {---------------------------------------------------------------------------}
  4260. FUNCTION CreateIdScrollBar (X, Y, Size, Id: Sw_Integer; Horz: Boolean): PScrollBar;
  4261. VAR R: TRect; P: PScrollBar;
  4262. BEGIN
  4263. If Horz Then R.Assign(X, Y, X+Size, Y+1) Else { Horizontal bar }
  4264. R.Assign(X, Y, X+1, Y+Size); { Vertical bar }
  4265. P := New(PScrollBar, Init(R)); { Create scrollbar }
  4266. If (P <> Nil) Then Begin
  4267. P^.Id := Id; { Set scrollbar id }
  4268. P^.Options := P^.Options OR ofPostProcess; { Set post processing }
  4269. End;
  4270. CreateIdScrollBar := P; { Return scrollbar }
  4271. END;
  4272. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4273. { OBJECT REGISTRATION PROCEDURES }
  4274. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  4275. {---------------------------------------------------------------------------}
  4276. { RegisterViews -> Platforms DOS/DPMI/WIN/NT/OS2 - Updated 28May97 LdB }
  4277. {---------------------------------------------------------------------------}
  4278. PROCEDURE RegisterViews;
  4279. BEGIN
  4280. RegisterType(RView); { Register views }
  4281. RegisterType(RFrame); { Register frame }
  4282. RegisterType(RScrollBar); { Register scrollbar }
  4283. RegisterType(RScroller); { Register scroller }
  4284. RegisterType(RListViewer); { Register listview }
  4285. RegisterType(RGroup); { Register group }
  4286. RegisterType(RWindow); { Register window }
  4287. END;
  4288. END.